ZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL0NvbG9yUGlja2VybW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9Db2xvclBpY2tlcm1vZHVsZS5jCmluZGV4IDUxZDdjMzcuLjY4OGM0NjggMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL0NvbG9yUGlja2VybW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvQ29sb3JQaWNrZXJtb2R1bGUuYwpAQCAtNywxNSArNywxNSBAQAogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAogYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCi1zdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEp1c3QgdmFuIFJvc3N1bSBub3QgYmUgCi11c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEp1c3QgdmFuIFJvc3N1bSBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgogCi1KVVNUIFZBTiBST1NTVU0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIAotSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyAKLUVWRU5UIFNIQUxMIEpVU1QgVkFOIFJPU1NVTSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiAKLUNPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgCi1VU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgCitKVVNUIFZBTiBST1NTVU0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCitJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCitFVkVOVCBTSEFMTCBKVVNUIFZBTiBST1NTVU0gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YKK1VTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KIApAQCAtMzcsMTcgKzM3LDE3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogY3BfR2V0Q29sb3IoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVJHQkNvbG9yIGluQ29sb3IsIG91dENvbG9yOwotCUJvb2xlYW4gb2s7Ci0JUG9pbnQgd2hlcmUgPSB7MCwgMH07Ci0JU3RyMjU1IHByb21wdDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyYiLCBQeU1hY19HZXRTdHIyNTUsIHByb21wdCwgUWRSR0JfQ29udmVydCwgJmluQ29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlvayA9IEdldENvbG9yKHdoZXJlLCBwcm9tcHQsICZpbkNvbG9yLCAmb3V0Q29sb3IpOwotCQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmgiLCBRZFJHQl9OZXcsICZvdXRDb2xvciwgb2spOworICAgIFJHQkNvbG9yIGluQ29sb3IsIG91dENvbG9yOworICAgIEJvb2xlYW4gb2s7CisgICAgUG9pbnQgd2hlcmUgPSB7MCwgMH07CisgICAgU3RyMjU1IHByb21wdDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJiIsIFB5TWFjX0dldFN0cjI1NSwgcHJvbXB0LCBRZFJHQl9Db252ZXJ0LCAmaW5Db2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgb2sgPSBHZXRDb2xvcih3aGVyZSwgcHJvbXB0LCAmaW5Db2xvciwgJm91dENvbG9yKTsKKworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmgiLCBRZFJHQl9OZXcsICZvdXRDb2xvciwgb2spOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKQEAgLTU1LDM2ICs1NSwzNiBAQAogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIGNwX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldENvbG9yIiwJKFB5Q0Z1bmN0aW9uKWNwX0dldENvbG9yLAlNRVRIX1ZBUkFSR1MsCWNwX0dldENvbG9yX19kb2NfX30sCisgICAgeyJHZXRDb2xvciIsICAgICAgICAoUHlDRnVuY3Rpb24pY3BfR2V0Q29sb3IsICAgICAgIE1FVEhfVkFSQVJHUywgICBjcF9HZXRDb2xvcl9fZG9jX199LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsCSAJCShQeUNGdW5jdGlvbilOVUxMLCAJCQkwLCAJCQkJTlVMTH0JCS8qIHNlbnRpbmVsICovCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogCiAvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAoKm11c3QqIGJlIGNhbGxlZCBpbml0Q29sb3JQaWNrZXIpICovCiAKLXN0YXRpYyBjaGFyIGNwX21vZHVsZV9kb2N1bWVudGF0aW9uW10gPSAKK3N0YXRpYyBjaGFyIGNwX21vZHVsZV9kb2N1bWVudGF0aW9uW10gPQogIiIKIDsKIAogdm9pZCBpbml0Q29sb3JQaWNrZXIodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQkKLQlpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIENvbG9yUGlja2VyIG1vZHVsZSBpcyByZW1vdmVkLiIsIDEpIDwgMCkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJDb2xvclBpY2tlciIsIGNwX21ldGhvZHMsCi0JCWNwX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIENvbG9yUGlja2VyIG1vZHVsZSBpcyByZW1vdmVkLiIsIDEpIDwgMCkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlIGhlcmUgKi8KLQkKLQkvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLwotCQotCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBtb2R1bGUgQ29sb3JQaWNrZXIiKTsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoIkNvbG9yUGlja2VyIiwgY3BfbWV0aG9kcywKKyAgICAgICAgY3BfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOworCisgICAgLyogQWRkIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlIGhlcmUgKi8KKworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBDaGVjayBmb3IgZXJyb3JzICovCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIENvbG9yUGlja2VyIik7CiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL01hY09TLmMgYi9NYWMvTW9kdWxlcy9NYWNPUy5jCmluZGV4IDE5ZGViNDQuLjI4ZGU0ZjUgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL01hY09TLmMKKysrIGIvTWFjL01vZHVsZXMvTWFjT1MuYwpAQCAtNCwxMCArNCwxMCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCiAKLVBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKLWRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKLWJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgogc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaAogQ2VudHJ1bSBvciBDV0kgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgpAQCAtMzQsNyArMzQsNyBAQAogCiAKICNpZm5kZWYgSEFWRV9PU1gxMDVfU0RLCi10eXBlZGVmIFNJbnQxNglGU0lPUmVmTnVtOwordHlwZWRlZiBTSW50MTYgIEZTSU9SZWZOdW07CiAjZW5kaWYKIAogc3RhdGljIFB5T2JqZWN0ICpNYWNPU19FcnJvcjsgLyogRXhjZXB0aW9uIE1hY09TLkVycm9yICovCkBAIC00Niw5ICs0Niw5IEBACiAvKiBEZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgb2YgdHlwZSBSZXNvdXJjZSBmb3JrICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRlNJT1JlZk51bSBmUmVmTnVtOwotCWludCBpc2Nsb3NlZDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRlNJT1JlZk51bSBmUmVmTnVtOworICAgIGludCBpc2Nsb3NlZDsKIH0gcmZvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmZ0eXBlOwpAQCAtNjAsMTY2ICs2MCwxNjYgQEAKIHN0YXRpYyB2b2lkCiBkb19jbG9zZShyZm9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+aXNjbG9zZWQgKSByZXR1cm47Ci0JKHZvaWQpRlNDbG9zZUZvcmsoc2VsZi0+ZlJlZk51bSk7Ci0Jc2VsZi0+aXNjbG9zZWQgPSAxOworICAgIGlmIChzZWxmLT5pc2Nsb3NlZCApIHJldHVybjsKKyAgICAodm9pZClGU0Nsb3NlRm9yayhzZWxmLT5mUmVmTnVtKTsKKyAgICBzZWxmLT5pc2Nsb3NlZCA9IDE7CiB9CiAKLXN0YXRpYyBjaGFyIHJmX3JlYWRfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIHJmX3JlYWRfX2RvY19fW10gPQogIlJlYWQgZGF0YSBmcm9tIHJlc291cmNlIGZvcmsiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiByZl9yZWFkKHJmb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlsb25nIG47Ci0JUHlPYmplY3QgKnY7Ci0JT1NFcnIgZXJyOwotCUJ5dGVDb3VudCBuMjsKLQkKLQlpZiAoc2VsZi0+aXNjbG9zZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCQotCXYgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbik7Ci0JaWYgKHYgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JCQotCWVyciA9IEZTUmVhZEZvcmsoc2VsZi0+ZlJlZk51bSwgZnNBdE1hcmssIDAsIG4sIFB5U3RyaW5nX0FzU3RyaW5nKHYpLCAmbjIpOwotCWlmIChlcnIgJiYgZXJyICE9IGVvZkVycikgewotCQlQeU1hY19FcnJvcihlcnIpOwotCQlQeV9ERUNSRUYodik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlfUHlTdHJpbmdfUmVzaXplKCZ2LCBuMik7Ci0JcmV0dXJuIHY7CisgICAgbG9uZyBuOworICAgIFB5T2JqZWN0ICp2OworICAgIE9TRXJyIGVycjsKKyAgICBCeXRlQ291bnQgbjI7CisKKyAgICBpZiAoc2VsZi0+aXNjbG9zZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHYgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbik7CisgICAgaWYgKHYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBlcnIgPSBGU1JlYWRGb3JrKHNlbGYtPmZSZWZOdW0sIGZzQXRNYXJrLCAwLCBuLCBQeVN0cmluZ19Bc1N0cmluZyh2KSwgJm4yKTsKKyAgICBpZiAoZXJyICYmIGVyciAhPSBlb2ZFcnIpIHsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgX1B5U3RyaW5nX1Jlc2l6ZSgmdiwgbjIpOworICAgIHJldHVybiB2OwogfQogCiAKLXN0YXRpYyBjaGFyIHJmX3dyaXRlX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciByZl93cml0ZV9fZG9jX19bXSA9CiAiV3JpdGUgdG8gcmVzb3VyY2UgZm9yayIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJmX3dyaXRlKHJmb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljaGFyICpidWZmZXI7Ci0JbG9uZyBzaXplOwotCU9TRXJyIGVycjsKLQkKLQlpZiAoc2VsZi0+aXNjbG9zZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyMiLCAmYnVmZmVyLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IEZTV3JpdGVGb3JrKHNlbGYtPmZSZWZOdW0sIGZzQXRNYXJrLCAwLCBzaXplLCBidWZmZXIsIE5VTEwpOwotCWlmIChlcnIpIHsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBjaGFyICpidWZmZXI7CisgICAgbG9uZyBzaXplOworICAgIE9TRXJyIGVycjsKKworICAgIGlmIChzZWxmLT5pc2Nsb3NlZCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIyIsICZidWZmZXIsICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gRlNXcml0ZUZvcmsoc2VsZi0+ZlJlZk51bSwgZnNBdE1hcmssIDAsIHNpemUsIGJ1ZmZlciwgTlVMTCk7CisgICAgaWYgKGVycikgeworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIHJmX3NlZWtfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIHJmX3NlZWtfX2RvY19fW10gPQogIlNldCBmaWxlIHBvc2l0aW9uIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmZfc2VlayhyZm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBhbW91bnQ7Ci0JaW50IHdoZW5jZSA9IFNFRUtfU0VUOwotCWludCBtb2RlOwotCU9TRXJyIGVycjsKLQkKLQlpZiAoc2VsZi0+aXNjbG9zZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibHxpIiwgJmFtb3VudCwgJndoZW5jZSkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCXN3aXRjaCAod2hlbmNlKSB7Ci0JY2FzZSBTRUVLX0NVUjoKLQkJbW9kZSA9IGZzRnJvbU1hcms7Ci0JCWJyZWFrOwotCWNhc2UgU0VFS19FTkQ6Ci0JCW1vZGUgPSBmc0Zyb21MRU9GOwotCQlicmVhazsKLQljYXNlIFNFRUtfU0VUOgotCQltb2RlID0gZnNGcm9tU3RhcnQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVB5RXJyX0JhZEFyZ3VtZW50KCk7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBsb25nIGFtb3VudDsKKyAgICBpbnQgd2hlbmNlID0gU0VFS19TRVQ7CisgICAgaW50IG1vZGU7CisgICAgT1NFcnIgZXJyOwogCi0JZXJyID0gRlNTZXRGb3JrUG9zaXRpb24oc2VsZi0+ZlJlZk51bSwgbW9kZSwgYW1vdW50KTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5TWFjX0Vycm9yKGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKHNlbGYtPmlzY2xvc2VkKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiT3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImx8aSIsICZhbW91bnQsICZ3aGVuY2UpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN3aXRjaCAod2hlbmNlKSB7CisgICAgY2FzZSBTRUVLX0NVUjoKKyAgICAgICAgbW9kZSA9IGZzRnJvbU1hcms7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VFS19FTkQ6CisgICAgICAgIG1vZGUgPSBmc0Zyb21MRU9GOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFRUtfU0VUOgorICAgICAgICBtb2RlID0gZnNGcm9tU3RhcnQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGVyciA9IEZTU2V0Rm9ya1Bvc2l0aW9uKHNlbGYtPmZSZWZOdW0sIG1vZGUsIGFtb3VudCk7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIHJmX3RlbGxfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIHJmX3RlbGxfX2RvY19fW10gPQogIkdldCBmaWxlIHBvc2l0aW9uIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogcmZfdGVsbChyZm9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JbG9uZyBsb25nIHdoZXJlOwotCU9TRXJyIGVycjsKLQkKLQlpZiAoc2VsZi0+aXNjbG9zZWQpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOworICAgIGxvbmcgbG9uZyB3aGVyZTsKKyAgICBPU0VyciBlcnI7CiAKLQllcnIgPSBGU0dldEZvcmtQb3NpdGlvbihzZWxmLT5mUmVmTnVtLCAmd2hlcmUpOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHdoZXJlKTsKKyAgICBpZiAoc2VsZi0+aXNjbG9zZWQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJPcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZXJyID0gRlNHZXRGb3JrUG9zaXRpb24oc2VsZi0+ZlJlZk51bSwgJndoZXJlKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyh3aGVyZSk7CiB9CiAKLXN0YXRpYyBjaGFyIHJmX2Nsb3NlX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciByZl9jbG9zZV9fZG9jX19bXSA9CiAiQ2xvc2UgcmVzb3VyY2UgZm9yayIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIHJmX2Nsb3NlKHJmb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlkb19jbG9zZShzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZG9fY2xvc2Uoc2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgcmZfbWV0aG9kc1tdID0gewotIHsicmVhZCIsCShQeUNGdW5jdGlvbilyZl9yZWFkLAkxLAlyZl9yZWFkX19kb2NfX30sCi0geyJ3cml0ZSIsCShQeUNGdW5jdGlvbilyZl93cml0ZSwJMSwJcmZfd3JpdGVfX2RvY19ffSwKLSB7InNlZWsiLAkoUHlDRnVuY3Rpb24pcmZfc2VlaywJMSwJcmZfc2Vla19fZG9jX199LAotIHsidGVsbCIsCShQeUNGdW5jdGlvbilyZl90ZWxsLAkxLAlyZl90ZWxsX19kb2NfX30sCi0geyJjbG9zZSIsCShQeUNGdW5jdGlvbilyZl9jbG9zZSwJMSwJcmZfY2xvc2VfX2RvY19ffSwKLSAKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworIHsicmVhZCIsICAgICAgIChQeUNGdW5jdGlvbilyZl9yZWFkLCAgIDEsICAgICAgcmZfcmVhZF9fZG9jX199LAorIHsid3JpdGUiLCAgICAgIChQeUNGdW5jdGlvbilyZl93cml0ZSwgIDEsICAgICAgcmZfd3JpdGVfX2RvY19ffSwKKyB7InNlZWsiLCAgICAgICAoUHlDRnVuY3Rpb24pcmZfc2VlaywgICAxLCAgICAgIHJmX3NlZWtfX2RvY19ffSwKKyB7InRlbGwiLCAgICAgICAoUHlDRnVuY3Rpb24pcmZfdGVsbCwgICAxLCAgICAgIHJmX3RlbGxfX2RvY19ffSwKKyB7ImNsb3NlIiwgICAgICAoUHlDRnVuY3Rpb24pcmZfY2xvc2UsICAxLCAgICAgIHJmX2Nsb3NlX19kb2NfX30sCisKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogLyogLS0tLS0tLS0tLSAqLwpAQCAtMjI4LDU2ICsyMjgsNTYgQEAKIHN0YXRpYyByZm9iamVjdCAqCiBuZXdyZm9iamVjdCh2b2lkKQogewotCXJmb2JqZWN0ICpzZWxmOwotCQotCXNlbGYgPSBQeU9iamVjdF9ORVcocmZvYmplY3QsICZSZnR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPmlzY2xvc2VkID0gMTsKLQlyZXR1cm4gc2VsZjsKKyAgICByZm9iamVjdCAqc2VsZjsKKworICAgIHNlbGYgPSBQeU9iamVjdF9ORVcocmZvYmplY3QsICZSZnR5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPmlzY2xvc2VkID0gMTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogCiBzdGF0aWMgdm9pZAogcmZfZGVhbGxvYyhyZm9iamVjdCAqc2VsZikKIHsKLQlkb19jbG9zZShzZWxmKTsKLQlQeU9iamVjdF9ERUwoc2VsZik7CisgICAgZG9fY2xvc2Uoc2VsZik7CisgICAgUHlPYmplY3RfREVMKHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogcmZfZ2V0YXR0cihyZm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChyZl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChyZl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAotc3RhdGljIGNoYXIgUmZ0eXBlX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBSZnR5cGVfX2RvY19fW10gPQogIlJlc291cmNlIGZvcmsgZmlsZSBvYmplY3QiCiA7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUmZ0eXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0JMCwJCQkJLypvYl9zaXplKi8KLQkiTWFjT1MuUmVzb3VyY2VGb3JrIiwJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKHJmb2JqZWN0KSwJCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpcmZfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpcmZfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJNYWNPUy5SZXNvdXJjZUZvcmsiLCAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKHJmb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcilyZl9kZWFsbG9jLCAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAocHJpbnRmdW5jKTAsICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKXJmX2dldGF0dHIsICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgICAgIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpMCwgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogCi0JLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KLQkwTCwwTCwwTCwwTCwKLQlSZnR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCisgICAgLyogU3BhY2UgZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KKyAgICAwTCwwTCwwTCwwTCwKKyAgICBSZnR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCiB9OwogCiAKQEAgLTI5Miw3MSArMjkyLDcxIEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1NfR2V0Q3JlYXRvckFuZFR5cGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVB5T2JqZWN0ICpjcmVhdG9yLCAqdHlwZSwgKnJlczsKLQlPU0VyciBlcnI7Ci0JRlNSZWYgcmVmOwotCUZTQ2F0YWxvZ0luZm8JY2F0YWxvZ2luZm87Ci0JRmlsZUluZm8qIGZpbmZvOworICAgIFB5T2JqZWN0ICpjcmVhdG9yLCAqdHlwZSwgKnJlczsKKyAgICBPU0VyciBlcnI7CisgICAgRlNSZWYgcmVmOworICAgIEZTQ2F0YWxvZ0luZm8gICAgICAgY2F0YWxvZ2luZm87CisgICAgRmlsZUluZm8qIGZpbmZvOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldEZTUmVmLCAmcmVmKSkgeworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRGU1JlZiwgJnJlZikpIHsKICNpZm5kZWYgX19MUDY0X18KLQkJLyogVGhpcyBmdW5jdGlvbiBpcyBkb2N1bWVudGVkIHRvIHRha2UgYW4gRlNTcGVjIGFzIHdlbGwsCi0JCSAqIHdoaWNoIG9ubHkgd29ya3MgaW4gMzItYml0IG1vZGUuCi0JCSAqLwotCQlQeUVycl9DbGVhcigpOwotCQlGU1NwZWMgZnNzOwotCQlGSW5mbyBpbmZvOworICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRvY3VtZW50ZWQgdG8gdGFrZSBhbiBGU1NwZWMgYXMgd2VsbCwKKyAgICAgICAgICogd2hpY2ggb25seSB3b3JrcyBpbiAzMi1iaXQgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIEZTU3BlYyBmc3M7CisgICAgICAgIEZJbmZvIGluZm87CiAKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldEZTU3BlYywgJmZzcykpCi0JCQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldEZTU3BlYywgJmZzcykpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlpZiAoKGVyciA9IEZTcEdldEZJbmZvKCZmc3MsICZpbmZvKSkgIT0gbm9FcnIpIHsKLQkJCXJldHVybiBQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGVycik7Ci0JCX0KKyAgICAgICAgaWYgKChlcnIgPSBGU3BHZXRGSW5mbygmZnNzLCAmaW5mbykpICE9IG5vRXJyKSB7CisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOworICAgICAgICB9CiAKLQkJaW5mby5mZENyZWF0b3IgPSBudG9obChpbmZvLmZkQ3JlYXRvcik7Ci0JCWluZm8uZmRUeXBlID0gbnRvaGwoaW5mby5mZFR5cGUpOworICAgICAgICBpbmZvLmZkQ3JlYXRvciA9IG50b2hsKGluZm8uZmRDcmVhdG9yKTsKKyAgICAgICAgaW5mby5mZFR5cGUgPSBudG9obChpbmZvLmZkVHlwZSk7CiAKLQkJY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQkJCShjaGFyICopJmluZm8uZmRDcmVhdG9yLCA0KTsKLQkJdHlwZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJmluZm8uZmRUeXBlLCA0KTsKLQkJcmVzID0gUHlfQnVpbGRWYWx1ZSgiT08iLCBjcmVhdG9yLCB0eXBlKTsKLQkJUHlfREVDUkVGKGNyZWF0b3IpOwotCQlQeV9ERUNSRUYodHlwZSk7Ci0JCXJldHVybiByZXM7Ci0jZWxzZQkvKiBfX0xQNjRfXyAqLwotCQlyZXR1cm4gTlVMTDsKLSNlbmRpZgkvKiBfX0xQNjRfXyAqLwotCX0KKyAgICAgICAgY3JlYXRvciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmaW5mby5mZENyZWF0b3IsIDQpOworICAgICAgICB0eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmaW5mby5mZFR5cGUsIDQpOworICAgICAgICByZXMgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIGNyZWF0b3IsIHR5cGUpOworICAgICAgICBQeV9ERUNSRUYoY3JlYXRvcik7CisgICAgICAgIFB5X0RFQ1JFRih0eXBlKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyNlbHNlICAgLyogX19MUDY0X18gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYgIC8qIF9fTFA2NF9fICovCisgICAgfQogCi0JZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmcmVmLCAKLQkJCWtGU0NhdEluZm9GaW5kZXJJbmZvfGtGU0NhdEluZm9Ob2RlRmxhZ3MsICZjYXRhbG9naW5mbywgCi0JCQlOVUxMLCBOVUxMLCBOVUxMKTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJnJlZiwKKyAgICAgICAgICAgICAgICAgICAga0ZTQ2F0SW5mb0ZpbmRlckluZm98a0ZTQ2F0SW5mb05vZGVGbGFncywgJmNhdGFsb2dpbmZvLAorICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JaWYgKChjYXRhbG9naW5mby5ub2RlRmxhZ3MgJiBrRlNOb2RlSXNEaXJlY3RvcnlNYXNrKSAhPSAwKSB7Ci0JCS8qIERpcmVjdG9yeTogZG9lc24ndCBoYXZlIHR5cGUvY3JlYXRvciBpbmZvLgotCQkgKgotCQkgKiBUaGUgc3BlY2lmaWMgZXJyb3IgY29kZSBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0JCSAqIGVhcmxpZXIgdmVyc2lvbnMuCi0JCSAqLwotCQlQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGZuZkVycik7Ci0JCXJldHVybiBOVUxMOworICAgIGlmICgoY2F0YWxvZ2luZm8ubm9kZUZsYWdzICYga0ZTTm9kZUlzRGlyZWN0b3J5TWFzaykgIT0gMCkgeworICAgICAgICAvKiBEaXJlY3Rvcnk6IGRvZXNuJ3QgaGF2ZSB0eXBlL2NyZWF0b3IgaW5mby4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIHNwZWNpZmljIGVycm9yIGNvZGUgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aAorICAgICAgICAgKiBlYXJsaWVyIHZlcnNpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBmbmZFcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKIAotCX0gCi0JZmluZm8gPSAoRmlsZUluZm8qKSYoY2F0YWxvZ2luZm8uZmluZGVySW5mbyk7Ci0JZmluZm8tPmZpbGVDcmVhdG9yID0gbnRvaGwoZmluZm8tPmZpbGVDcmVhdG9yKTsKLQlmaW5mby0+ZmlsZVR5cGUgPSBudG9obChmaW5mby0+ZmlsZVR5cGUpOwotCWNyZWF0b3IgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciopJihmaW5mby0+ZmlsZUNyZWF0b3IpLCA0KTsKLQl0eXBlID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKSYoZmluZm8tPmZpbGVUeXBlKSwgNCk7CisgICAgfQorICAgIGZpbmZvID0gKEZpbGVJbmZvKikmKGNhdGFsb2dpbmZvLmZpbmRlckluZm8pOworICAgIGZpbmZvLT5maWxlQ3JlYXRvciA9IG50b2hsKGZpbmZvLT5maWxlQ3JlYXRvcik7CisgICAgZmluZm8tPmZpbGVUeXBlID0gbnRvaGwoZmluZm8tPmZpbGVUeXBlKTsKKyAgICBjcmVhdG9yID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIqKSYoZmluZm8tPmZpbGVDcmVhdG9yKSwgNCk7CisgICAgdHlwZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyKikmKGZpbmZvLT5maWxlVHlwZSksIDQpOwogCi0JcmVzID0gUHlfQnVpbGRWYWx1ZSgiT08iLCBjcmVhdG9yLCB0eXBlKTsKLQlQeV9ERUNSRUYoY3JlYXRvcik7Ci0JUHlfREVDUkVGKHR5cGUpOwotCXJldHVybiByZXM7CisgICAgcmVzID0gUHlfQnVpbGRWYWx1ZSgiT08iLCBjcmVhdG9yLCB0eXBlKTsKKyAgICBQeV9ERUNSRUYoY3JlYXRvcik7CisgICAgUHlfREVDUkVGKHR5cGUpOworICAgIHJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBjaGFyIHNldGNydHBfZG9jW10gPSAiU2V0IE1hY09TIDQtY2hhciBjcmVhdG9yIGFuZCB0eXBlIGZvciBhIGZpbGUiOwpAQCAtMzY0LDY4ICszNjQsNjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19TZXRDcmVhdG9yQW5kVHlwZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JUmVzVHlwZSBjcmVhdG9yLCB0eXBlOwotCUZTUmVmIHJlZjsKLQlGaWxlSW5mbyogZmluZm87Ci0JT1NFcnIgZXJyOwotCUZTQ2F0YWxvZ0luZm8JY2F0YWxvZ2luZm87CisgICAgUmVzVHlwZSBjcmVhdG9yLCB0eXBlOworICAgIEZTUmVmIHJlZjsKKyAgICBGaWxlSW5mbyogZmluZm87CisgICAgT1NFcnIgZXJyOworICAgIEZTQ2F0YWxvZ0luZm8gICAgICAgY2F0YWxvZ2luZm87CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCi0JCQlQeU1hY19HZXRGU1JlZiwgJnJlZiwgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZSkpIHsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVmLCBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLCBQeU1hY19HZXRPU1R5cGUsICZ0eXBlKSkgewogI2lmbmRlZiBfX0xQNjRfXwotCQkvKiBUcnkgdG8gaGFuZGxlIEZTU3BlYyBhcmd1bWVudHMsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0JCUZTU3BlYyBmc3M7Ci0JCUZJbmZvIGluZm87CisgICAgICAgIC8qIFRyeSB0byBoYW5kbGUgRlNTcGVjIGFyZ3VtZW50cywgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyAgICAgICAgRlNTcGVjIGZzczsKKyAgICAgICAgRkluZm8gaW5mbzsKIAotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJiIsCi0JCQlQeU1hY19HZXRGU1NwZWMsICZmc3MsIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsIFB5TWFjX0dldE9TVHlwZSwgJnR5cGUpKQotCQkJcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZSkpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAotCQlpZiAoKGVyciA9IEZTcEdldEZJbmZvKCZmc3MsICZpbmZvKSkgIT0gbm9FcnIpCi0JCQlyZXR1cm4gUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOworICAgICAgICBpZiAoKGVyciA9IEZTcEdldEZJbmZvKCZmc3MsICZpbmZvKSkgIT0gbm9FcnIpCisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOwogCi0JCWluZm8uZmRDcmVhdG9yID0gY3JlYXRvcjsKLQkJaW5mby5mZFR5cGUgPSB0eXBlOworICAgICAgICBpbmZvLmZkQ3JlYXRvciA9IGNyZWF0b3I7CisgICAgICAgIGluZm8uZmRUeXBlID0gdHlwZTsKIAotCQlpZiAoKGVyciA9IEZTcFNldEZJbmZvKCZmc3MsICZpbmZvKSkgIT0gbm9FcnIpCi0JCQlyZXR1cm4gUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOwotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOworICAgICAgICBpZiAoKGVyciA9IEZTcFNldEZJbmZvKCZmc3MsICZpbmZvKSkgIT0gbm9FcnIpCisgICAgICAgICAgICByZXR1cm4gUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOwogI2Vsc2UgLyogX19MUDY0X18gKi8KLQkJcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0JfQotCQotCWVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJnJlZiwgCi0JCQlrRlNDYXRJbmZvRmluZGVySW5mb3xrRlNDYXRJbmZvTm9kZUZsYWdzLCAmY2F0YWxvZ2luZm8sIAotCQkJTlVMTCwgTlVMTCwgTlVMTCk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeUVycl9NYWMoTWFjT1NfRXJyb3IsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICB9CiAKLQlpZiAoKGNhdGFsb2dpbmZvLm5vZGVGbGFncyAmIGtGU05vZGVJc0RpcmVjdG9yeU1hc2spICE9IDApIHsKLQkJLyogRGlyZWN0b3J5OiBkb2Vzbid0IGhhdmUgdHlwZS9jcmVhdG9yIGluZm8uCi0JCSAqCi0JCSAqIFRoZSBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgKLQkJICogZWFybGllciB2ZXJzaW9ucy4KLQkJICovCi0JCVB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKLQkJcmV0dXJuIE5VTEw7CisgICAgZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmcmVmLAorICAgICAgICAgICAgICAgICAgICBrRlNDYXRJbmZvRmluZGVySW5mb3xrRlNDYXRJbmZvTm9kZUZsYWdzLCAmY2F0YWxvZ2luZm8sCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLQl9IAotCWZpbmZvID0gKEZpbGVJbmZvKikmKGNhdGFsb2dpbmZvLmZpbmRlckluZm8pOwotCWZpbmZvLT5maWxlQ3JlYXRvciA9IGNyZWF0b3I7Ci0JZmluZm8tPmZpbGVUeXBlID0gdHlwZTsKKyAgICBpZiAoKGNhdGFsb2dpbmZvLm5vZGVGbGFncyAmIGtGU05vZGVJc0RpcmVjdG9yeU1hc2spICE9IDApIHsKKyAgICAgICAgLyogRGlyZWN0b3J5OiBkb2Vzbid0IGhhdmUgdHlwZS9jcmVhdG9yIGluZm8uCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBzcGVjaWZpYyBlcnJvciBjb2RlIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgICAgICogZWFybGllciB2ZXJzaW9ucy4KKyAgICAgICAgICovCisgICAgICAgIFB5RXJyX01hYyhNYWNPU19FcnJvciwgZm5mRXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQllcnIgPSBGU1NldENhdGFsb2dJbmZvKCZyZWYsIGtGU0NhdEluZm9GaW5kZXJJbmZvLCAmY2F0YWxvZ2luZm8pOwotCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBmbmZFcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgfQorICAgIGZpbmZvID0gKEZpbGVJbmZvKikmKGNhdGFsb2dpbmZvLmZpbmRlckluZm8pOworICAgIGZpbmZvLT5maWxlQ3JlYXRvciA9IGNyZWF0b3I7CisgICAgZmluZm8tPmZpbGVUeXBlID0gdHlwZTsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBlcnIgPSBGU1NldENhdGFsb2dJbmZvKCZyZWYsIGtGU0NhdEluZm9GaW5kZXJJbmZvLCAmY2F0YWxvZ2luZm8pOworICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgUHlFcnJfTWFjKE1hY09TX0Vycm9yLCBmbmZFcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIApAQCAtNDM0LDY1ICs0MzQsNjUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19HZXRFcnJvclN0cmluZyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JaW50IGVycjsKLQljaGFyIGJ1ZlsyNTZdOwotCUhhbmRsZSBoOwotCWNoYXIgKnN0cjsKLQlzdGF0aWMgaW50IGVycm9yc19sb2FkZWQ7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmVycikpCi0JCXJldHVybiBOVUxMOworICAgIGludCBlcnI7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBIYW5kbGUgaDsKKyAgICBjaGFyICpzdHI7CisgICAgc3RhdGljIGludCBlcnJvcnNfbG9hZGVkOwogCi0JaCA9IEdldFJlc291cmNlKCdFc3RyJywgZXJyKTsKLQlpZiAoIWggJiYgIWVycm9yc19sb2FkZWQpIHsKLQkJLyoKLQkJKiogQXR0ZW1wdCB0byBvcGVuIHRoZSByZXNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0JCSoqIEVzdHIgcmVzb3VyY2VzLiBXZSBpZ25vcmUgYWxsIGVycm9ycy4gV2UgYWxzbyB0cnkKLQkJKiogdGhpcyBvbmx5IG9uY2UuCi0JCSovCi0JCVB5T2JqZWN0ICptLCAqcnY7Ci0JCWVycm9yc19sb2FkZWQgPSAxOwotCQkKLQkJbSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2soIm1hY3Jlc291cmNlIik7Ci0JCWlmICghbSkgewotCQkJaWYgKFB5X1ZlcmJvc2VGbGFnKQotCQkJCVB5RXJyX1ByaW50KCk7Ci0JCQlQeUVycl9DbGVhcigpOwotCQl9Ci0JCWVsc2UgewotCQkJcnYgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG0sICJvcGVuX2Vycm9yX3Jlc291cmNlIiwgIiIpOwotCQkJaWYgKCFydikgewotCQkJCWlmIChQeV9WZXJib3NlRmxhZykKLQkJCQkJUHlFcnJfUHJpbnQoKTsKLQkJCQlQeUVycl9DbGVhcigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHlfREVDUkVGKHJ2KTsKLQkJCQkvKiBBbmQgdHJ5IGFnYWluLi4uICovCi0JCQkJaCA9IEdldFJlc291cmNlKCdFc3RyJywgZXJyKTsKLQkJCX0KLQkJCVB5X0RFQ1JFRihtKTsKLQkJfQotCX0KLQkvKgotCSoqIFdoZXRoZXIgdGhlIGNvZGUgYWJvdmUgc3VjY2VlZGVkIG9yIG5vdCwgd2Ugd29uJ3QgdHJ5Ci0JKiogYWdhaW4uCi0JKi8KLQllcnJvcnNfbG9hZGVkID0gMTsKLQkJCi0JaWYgKGgpIHsKLQkJSExvY2soaCk7Ci0JCXN0ciA9IChjaGFyICopKmg7Ci0JCW1lbWNweShidWYsIHN0cisxLCAodW5zaWduZWQgY2hhcilzdHJbMF0pOwotCQlidWZbKHVuc2lnbmVkIGNoYXIpc3RyWzBdXSA9ICdcMCc7Ci0JCUhVbmxvY2soaCk7Ci0JCVJlbGVhc2VSZXNvdXJjZShoKTsKLQl9Ci0JZWxzZSB7Ci0JCVB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIk1hYyBPUyBlcnJvciBjb2RlICVkIiwgZXJyKTsKLQl9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiwgJmVycikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoInMiLCBidWYpOworICAgIGggPSBHZXRSZXNvdXJjZSgnRXN0cicsIGVycik7CisgICAgaWYgKCFoICYmICFlcnJvcnNfbG9hZGVkKSB7CisgICAgICAgIC8qCisgICAgICAgICoqIEF0dGVtcHQgdG8gb3BlbiB0aGUgcmVzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZQorICAgICAgICAqKiBFc3RyIHJlc291cmNlcy4gV2UgaWdub3JlIGFsbCBlcnJvcnMuIFdlIGFsc28gdHJ5CisgICAgICAgICoqIHRoaXMgb25seSBvbmNlLgorICAgICAgICAqLworICAgICAgICBQeU9iamVjdCAqbSwgKnJ2OworICAgICAgICBlcnJvcnNfbG9hZGVkID0gMTsKKworICAgICAgICBtID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaygibWFjcmVzb3VyY2UiKTsKKyAgICAgICAgaWYgKCFtKSB7CisgICAgICAgICAgICBpZiAoUHlfVmVyYm9zZUZsYWcpCisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBydiA9IFB5T2JqZWN0X0NhbGxNZXRob2QobSwgIm9wZW5fZXJyb3JfcmVzb3VyY2UiLCAiIik7CisgICAgICAgICAgICBpZiAoIXJ2KSB7CisgICAgICAgICAgICAgICAgaWYgKFB5X1ZlcmJvc2VGbGFnKQorICAgICAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIC8qIEFuZCB0cnkgYWdhaW4uLi4gKi8KKyAgICAgICAgICAgICAgICBoID0gR2V0UmVzb3VyY2UoJ0VzdHInLCBlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKG0pOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgKiogV2hldGhlciB0aGUgY29kZSBhYm92ZSBzdWNjZWVkZWQgb3Igbm90LCB3ZSB3b24ndCB0cnkKKyAgICAqKiBhZ2Fpbi4KKyAgICAqLworICAgIGVycm9yc19sb2FkZWQgPSAxOworCisgICAgaWYgKGgpIHsKKyAgICAgICAgSExvY2soaCk7CisgICAgICAgIHN0ciA9IChjaGFyICopKmg7CisgICAgICAgIG1lbWNweShidWYsIHN0cisxLCAodW5zaWduZWQgY2hhcilzdHJbMF0pOworICAgICAgICBidWZbKHVuc2lnbmVkIGNoYXIpc3RyWzBdXSA9ICdcMCc7CisgICAgICAgIEhVbmxvY2soaCk7CisgICAgICAgIFJlbGVhc2VSZXNvdXJjZShoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIk1hYyBPUyBlcnJvciBjb2RlICVkIiwgZXJyKTsKKyAgICB9CisKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgicyIsIGJ1Zik7CiB9CiAKIApAQCAtNTAzLDQyICs1MDMsNDIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19zcGxhc2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCByZXNpZCA9IC0xOwotCXN0YXRpYyBEaWFsb2dQdHIgY3VyZGlhbG9nID0gTlVMTDsKLQlEaWFsb2dQdHIgb2xkZGlhbG9nOwotCVdpbmRvd1JlZiB0aGVXaW5kb3c7Ci0JQ0dyYWZQdHIgdGhlUG9ydDsKKyAgICBpbnQgcmVzaWQgPSAtMTsKKyAgICBzdGF0aWMgRGlhbG9nUHRyIGN1cmRpYWxvZyA9IE5VTEw7CisgICAgRGlhbG9nUHRyIG9sZGRpYWxvZzsKKyAgICBXaW5kb3dSZWYgdGhlV2luZG93OworICAgIENHcmFmUHRyIHRoZVBvcnQ7CiAjaWYgMAotCXNob3J0IHhwb3MsIHlwb3MsIHdpZHRoLCBoZWlnaHQsIHN3aWR0aCwgc2hlaWdodDsKKyAgICBzaG9ydCB4cG9zLCB5cG9zLCB3aWR0aCwgaGVpZ2h0LCBzd2lkdGgsIHNoZWlnaHQ7CiAjZW5kaWYKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpIiwgJnJlc2lkKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jb2xkZGlhbG9nID0gY3VyZGlhbG9nOwotCWN1cmRpYWxvZyA9IE5VTEw7CiAKLQlpZiAoIHJlc2lkICE9IC0xICkgewotCQljdXJkaWFsb2cgPSBHZXROZXdEaWFsb2cocmVzaWQsIE5VTEwsIChXaW5kb3dQdHIpLTEpOwotCQlpZiAoIGN1cmRpYWxvZyApIHsKLQkJCXRoZVdpbmRvdyA9IEdldERpYWxvZ1dpbmRvdyhjdXJkaWFsb2cpOwotCQkJdGhlUG9ydCA9IEdldFdpbmRvd1BvcnQodGhlV2luZG93KTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpIiwgJnJlc2lkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb2xkZGlhbG9nID0gY3VyZGlhbG9nOworICAgIGN1cmRpYWxvZyA9IE5VTEw7CisKKyAgICBpZiAoIHJlc2lkICE9IC0xICkgeworICAgICAgICBjdXJkaWFsb2cgPSBHZXROZXdEaWFsb2cocmVzaWQsIE5VTEwsIChXaW5kb3dQdHIpLTEpOworICAgICAgICBpZiAoIGN1cmRpYWxvZyApIHsKKyAgICAgICAgICAgIHRoZVdpbmRvdyA9IEdldERpYWxvZ1dpbmRvdyhjdXJkaWFsb2cpOworICAgICAgICAgICAgdGhlUG9ydCA9IEdldFdpbmRvd1BvcnQodGhlV2luZG93KTsKICNpZiAwCi0JCQl3aWR0aCA9IHRoZVBvcnQtPnBvcnRSZWN0LnJpZ2h0IC0gdGhlUG9ydC0+cG9ydFJlY3QubGVmdDsKLQkJCWhlaWdodCA9IHRoZVBvcnQtPnBvcnRSZWN0LmJvdHRvbSAtIHRoZVBvcnQtPnBvcnRSZWN0LnRvcDsKLQkJCXN3aWR0aCA9IHFkLnNjcmVlbkJpdHMuYm91bmRzLnJpZ2h0IC0gcWQuc2NyZWVuQml0cy5ib3VuZHMubGVmdDsKLQkJCXNoZWlnaHQgPSBxZC5zY3JlZW5CaXRzLmJvdW5kcy5ib3R0b20gLSBxZC5zY3JlZW5CaXRzLmJvdW5kcy50b3AgLSBMTUdldE1CYXJIZWlnaHQoKTsKLQkJCXhwb3MgPSAoc3dpZHRoLXdpZHRoKS8yOwotCQkJeXBvcyA9IChzaGVpZ2h0LWhlaWdodCkvNSArIExNR2V0TUJhckhlaWdodCgpOwotCQkJTW92ZVdpbmRvdyh0aGVXaW5kb3csIHhwb3MsIHlwb3MsIDApOwotCQkJU2hvd1dpbmRvdyh0aGVXaW5kb3cpOworICAgICAgICAgICAgd2lkdGggPSB0aGVQb3J0LT5wb3J0UmVjdC5yaWdodCAtIHRoZVBvcnQtPnBvcnRSZWN0LmxlZnQ7CisgICAgICAgICAgICBoZWlnaHQgPSB0aGVQb3J0LT5wb3J0UmVjdC5ib3R0b20gLSB0aGVQb3J0LT5wb3J0UmVjdC50b3A7CisgICAgICAgICAgICBzd2lkdGggPSBxZC5zY3JlZW5CaXRzLmJvdW5kcy5yaWdodCAtIHFkLnNjcmVlbkJpdHMuYm91bmRzLmxlZnQ7CisgICAgICAgICAgICBzaGVpZ2h0ID0gcWQuc2NyZWVuQml0cy5ib3VuZHMuYm90dG9tIC0gcWQuc2NyZWVuQml0cy5ib3VuZHMudG9wIC0gTE1HZXRNQmFySGVpZ2h0KCk7CisgICAgICAgICAgICB4cG9zID0gKHN3aWR0aC13aWR0aCkvMjsKKyAgICAgICAgICAgIHlwb3MgPSAoc2hlaWdodC1oZWlnaHQpLzUgKyBMTUdldE1CYXJIZWlnaHQoKTsKKyAgICAgICAgICAgIE1vdmVXaW5kb3codGhlV2luZG93LCB4cG9zLCB5cG9zLCAwKTsKKyAgICAgICAgICAgIFNob3dXaW5kb3codGhlV2luZG93KTsKICNlbmRpZgotCQkJRHJhd0RpYWxvZyhjdXJkaWFsb2cpOwotCQl9Ci0JfQotCWlmIChvbGRkaWFsb2cpCi0JCURpc3Bvc2VEaWFsb2cob2xkZGlhbG9nKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgICAgICAgICBEcmF3RGlhbG9nKGN1cmRpYWxvZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG9sZGRpYWxvZykKKyAgICAgICAgRGlzcG9zZURpYWxvZyhvbGRkaWFsb2cpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgRGVidWdTdHJfZG9jW10gPSAiU3dpdGNoIHRvIGxvdy1sZXZlbCBkZWJ1Z2dlciB3aXRoIGEgbWVzc2FnZSI7CkBAIC01NDYsMTUgKzU0NiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIE1hY09TX0RlYnVnU3RyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlTdHIyNTUgbWVzc2FnZTsKLQlQeU9iamVjdCAqb2JqZWN0ID0gMDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfE8iLCBQeU1hY19HZXRTdHIyNTUsIG1lc3NhZ2UsICZvYmplY3QpKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlEZWJ1Z1N0cihtZXNzYWdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgU3RyMjU1IG1lc3NhZ2U7CisgICAgUHlPYmplY3QgKm9iamVjdCA9IDA7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfE8iLCBQeU1hY19HZXRTdHIyNTUsIG1lc3NhZ2UsICZvYmplY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIERlYnVnU3RyKG1lc3NhZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCkBAIC01NjMsNTkgKzU2Myw1OSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIE1hY09TX1N5c0JlZXAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWludCBkdXJhdGlvbiA9IDY7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCVN5c0JlZXAoZHVyYXRpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpbnQgZHVyYXRpb24gPSA2OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aSIsICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN5c0JlZXAoZHVyYXRpb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLXN0YXRpYyBjaGFyIFdNQXZhaWxhYmxlX2RvY1tdID0gCi0JIlRydWUgaWYgdGhpcyBwcm9jZXNzIGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBkaXNwbGF5LiIKLQkiV2lsbCBmb3JlZ3JvdW5kIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgZmlyc3QgY2FsbCBhcyBhIHNpZGUtZWZmZWN0LiIKLQk7CitzdGF0aWMgY2hhciBXTUF2YWlsYWJsZV9kb2NbXSA9CisgICAgIlRydWUgaWYgdGhpcyBwcm9jZXNzIGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBkaXNwbGF5LiIKKyAgICAiV2lsbCBmb3JlZ3JvdW5kIHRoZSBhcHBsaWNhdGlvbiBvbiB0aGUgZmlyc3QgY2FsbCBhcyBhIHNpZGUtZWZmZWN0LiIKKyAgICA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19XTUF2YWlsYWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0Jc3RhdGljIFB5T2JqZWN0ICpydiA9IE5VTEw7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFydikgewotCQlQcm9jZXNzU2VyaWFsTnVtYmVyIHBzbjsKLQkJCi0JCS8qCi0JCSoqIFRoaXMgaXMgYSBmYWlybHkgaW5ub2N1b3VzIGNhbGwgdG8gbWFrZSBpZiB3ZSBkb24ndCBoYXZlIGEgd2luZG93Ci0JCSoqIG1hbmFnZXIsIG9yIGlmIHdlIGhhdmUgbm8gcGVybWlzc2lvbiB0byB0YWxrIHRvIGl0LiBJdCB3aWxsIHByaW50Ci0JCSoqIGEgbWVzc2FnZSBvbiBzdGRlcnIsIGJ1dCBhdCBsZWFzdCBpdCB3b24ndCBhYm9ydCB0aGUgcHJvY2Vzcy4KLQkJKiogSXQgYXBwZWFycyB0aGUgZnVuY3Rpb24gY2FjaGVzIHRoZSByZXN1bHQgaXRzZWxmLCBhbmQgaXQncyBjaGVhcCwgc28KLQkJKiogbm8gbmVlZCBmb3IgdXMgdG8gY2FjaGUuCi0JCSovCisgICAgc3RhdGljIFB5T2JqZWN0ICpydiA9IE5VTEw7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIXJ2KSB7CisgICAgICAgIFByb2Nlc3NTZXJpYWxOdW1iZXIgcHNuOworCisgICAgICAgIC8qCisgICAgICAgICoqIFRoaXMgaXMgYSBmYWlybHkgaW5ub2N1b3VzIGNhbGwgdG8gbWFrZSBpZiB3ZSBkb24ndCBoYXZlIGEgd2luZG93CisgICAgICAgICoqIG1hbmFnZXIsIG9yIGlmIHdlIGhhdmUgbm8gcGVybWlzc2lvbiB0byB0YWxrIHRvIGl0LiBJdCB3aWxsIHByaW50CisgICAgICAgICoqIGEgbWVzc2FnZSBvbiBzdGRlcnIsIGJ1dCBhdCBsZWFzdCBpdCB3b24ndCBhYm9ydCB0aGUgcHJvY2Vzcy4KKyAgICAgICAgKiogSXQgYXBwZWFycyB0aGUgZnVuY3Rpb24gY2FjaGVzIHRoZSByZXN1bHQgaXRzZWxmLCBhbmQgaXQncyBjaGVhcCwgc28KKyAgICAgICAgKiogbm8gbmVlZCBmb3IgdXMgdG8gY2FjaGUuCisgICAgICAgICovCiAjaWZkZWYga0NHTnVsbERpcmVjdERpc3BsYXkKLQkJLyogT24gMTAuMSBDR01haW5EaXNwbGF5SUQoKSBpc24ndCBhdmFpbGFibGUsIGFuZAotCQkqKiBrQ0dOdWxsRGlyZWN0RGlzcGxheSBpc24ndCBkZWZpbmVkLgotCQkqLwotCQlpZiAoQ0dNYWluRGlzcGxheUlEKCkgPT0gMCkgewotCQkJcnYgPSBQeV9GYWxzZTsKLQkJfSBlbHNlIHsKKyAgICAgICAgLyogT24gMTAuMSBDR01haW5EaXNwbGF5SUQoKSBpc24ndCBhdmFpbGFibGUsIGFuZAorICAgICAgICAqKiBrQ0dOdWxsRGlyZWN0RGlzcGxheSBpc24ndCBkZWZpbmVkLgorICAgICAgICAqLworICAgICAgICBpZiAoQ0dNYWluRGlzcGxheUlEKCkgPT0gMCkgeworICAgICAgICAgICAgcnYgPSBQeV9GYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKICNlbHNlCi0JCXsKKyAgICAgICAgewogI2VuZGlmCi0JCQlpZiAoR2V0Q3VycmVudFByb2Nlc3MoJnBzbikgPCAwIHx8Ci0JCQkJU2V0RnJvbnRQcm9jZXNzKCZwc24pIDwgMCkgewotCQkJCXJ2ID0gUHlfRmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXJ2ID0gUHlfVHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQlQeV9JTkNSRUYocnYpOwotCXJldHVybiBydjsKKyAgICAgICAgICAgIGlmIChHZXRDdXJyZW50UHJvY2VzcygmcHNuKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBTZXRGcm9udFByb2Nlc3MoJnBzbikgPCAwKSB7CisgICAgICAgICAgICAgICAgcnYgPSBQeV9GYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnYgPSBQeV9UcnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFB5X0lOQ1JFRihydik7CisgICAgcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgY2hhciBHZXRUaWNrc19kb2NbXSA9ICJSZXR1cm4gbnVtYmVyIG9mIHRpY2tzIHNpbmNlIGJvb3R1cCI7CkBAIC02MjMsNyArNjIzLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBNYWNPU19HZXRUaWNrcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCAoaW50KVRpY2tDb3VudCgpKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpVGlja0NvdW50KCkpOwogfQogCiBzdGF0aWMgY2hhciBvcGVucmZfZG9jW10gPSAiT3BlbiByZXNvdXJjZSBmb3JrIG9mIGEgZmlsZSI7CkBAIC02MzEsMTAwICs2MzEsMTAwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogTWFjT1Nfb3BlbnJmKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU0VyciBlcnI7Ci0JY2hhciAqbW9kZSA9ICJyIjsKLQlGU1JlZiByZWY7Ci0JU0ludDggcGVybWlzc2lvbiA9IGZzUmRQZXJtOwotCXJmb2JqZWN0ICpmcDsKLQlIRlNVbmlTdHIyNTUgbmFtZTsKLQkJCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxzIiwgUHlNYWNfR2V0RlNSZWYsICZyZWYsICZtb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0Jd2hpbGUgKCptb2RlKSB7Ci0JCXN3aXRjaCAoKm1vZGUrKykgewotCQljYXNlICcqJzogYnJlYWs7Ci0JCWNhc2UgJ3InOiBwZXJtaXNzaW9uID0gZnNSZFBlcm07IGJyZWFrOwotCQljYXNlICd3JzogcGVybWlzc2lvbiA9IGZzV3JQZXJtOyBicmVhazsKLQkJY2FzZSAnYic6IGJyZWFrOwotCQlkZWZhdWx0OgotCQkJUHlFcnJfQmFkQXJndW1lbnQoKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQorICAgIE9TRXJyIGVycjsKKyAgICBjaGFyICptb2RlID0gInIiOworICAgIEZTUmVmIHJlZjsKKyAgICBTSW50OCBwZXJtaXNzaW9uID0gZnNSZFBlcm07CisgICAgcmZvYmplY3QgKmZwOworICAgIEhGU1VuaVN0cjI1NSBuYW1lOwogCi0JZXJyID0gRlNHZXRSZXNvdXJjZUZvcmtOYW1lKCZuYW1lKTsKLQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCVB5TWFjX0Vycm9yKGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQkKLQlpZiAoIChmcCA9IG5ld3Jmb2JqZWN0KCkpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mfHMiLCBQeU1hY19HZXRGU1JlZiwgJnJlZiwgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3aGlsZSAoKm1vZGUpIHsKKyAgICAgICAgc3dpdGNoICgqbW9kZSsrKSB7CisgICAgICAgIGNhc2UgJyonOiBicmVhazsKKyAgICAgICAgY2FzZSAncic6IHBlcm1pc3Npb24gPSBmc1JkUGVybTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ3cnOiBwZXJtaXNzaW9uID0gZnNXclBlcm07IGJyZWFrOworICAgICAgICBjYXNlICdiJzogYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CiAKLQkKLQllcnIgPSBGU09wZW5Gb3JrKCZyZWYsIG5hbWUubGVuZ3RoLCBuYW1lLnVuaWNvZGUsIHBlcm1pc3Npb24sICZmcC0+ZlJlZk51bSk7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQlQeV9ERUNSRUYoZnApOwotCQlQeU1hY19FcnJvcihlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZnAtPmlzY2xvc2VkID0gMDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopZnA7CisgICAgZXJyID0gRlNHZXRSZXNvdXJjZUZvcmtOYW1lKCZuYW1lKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICggKGZwID0gbmV3cmZvYmplY3QoKSkgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBOVUxMOworCisKKyAgICBlcnIgPSBGU09wZW5Gb3JrKCZyZWYsIG5hbWUubGVuZ3RoLCBuYW1lLnVuaWNvZGUsIHBlcm1pc3Npb24sICZmcC0+ZlJlZk51bSk7CisgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICBQeV9ERUNSRUYoZnApOworICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZnAtPmlzY2xvc2VkID0gMDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopZnA7CiB9CiAKIAogCiBzdGF0aWMgUHlNZXRob2REZWYgTWFjT1NfTWV0aG9kc1tdID0gewotCXsiR2V0Q3JlYXRvckFuZFR5cGUiLAkJTWFjT1NfR2V0Q3JlYXRvckFuZFR5cGUsIDEsCWdldGNydHBfZG9jfSwKLQl7IlNldENyZWF0b3JBbmRUeXBlIiwJCU1hY09TX1NldENyZWF0b3JBbmRUeXBlLCAxLAlzZXRjcnRwX2RvY30sCi0JeyJHZXRFcnJvclN0cmluZyIsCQlNYWNPU19HZXRFcnJvclN0cmluZywJMSwJZ2V0ZXJyX2RvY30sCi0JeyJvcGVucmYiLAkJCU1hY09TX29wZW5yZiwgCQkxLCAJb3BlbnJmX2RvY30sCisgICAgeyJHZXRDcmVhdG9yQW5kVHlwZSIsICAgICAgICAgICAgICAgTWFjT1NfR2V0Q3JlYXRvckFuZFR5cGUsIDEsICAgICBnZXRjcnRwX2RvY30sCisgICAgeyJTZXRDcmVhdG9yQW5kVHlwZSIsICAgICAgICAgICAgICAgTWFjT1NfU2V0Q3JlYXRvckFuZFR5cGUsIDEsICAgICBzZXRjcnRwX2RvY30sCisgICAgeyJHZXRFcnJvclN0cmluZyIsICAgICAgICAgICAgICAgICAgTWFjT1NfR2V0RXJyb3JTdHJpbmcsICAgMSwgICAgICBnZXRlcnJfZG9jfSwKKyAgICB7Im9wZW5yZiIsICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNPU19vcGVucmYsICAgICAgICAgICAxLCAgICAgIG9wZW5yZl9kb2N9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsic3BsYXNoIiwJCQlNYWNPU19zcGxhc2gsCQkxLCAJc3BsYXNoX2RvY30sCi0JeyJEZWJ1Z1N0ciIsCQkJTWFjT1NfRGVidWdTdHIsCQkxLAlEZWJ1Z1N0cl9kb2N9LAotCXsiU3lzQmVlcCIsCQkJTWFjT1NfU3lzQmVlcCwJCTEsCVN5c0JlZXBfZG9jfSwKKyAgICB7InNwbGFzaCIsICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNPU19zcGxhc2gsICAgICAgICAgICAxLCAgICAgIHNwbGFzaF9kb2N9LAorICAgIHsiRGVidWdTdHIiLCAgICAgICAgICAgICAgICAgICAgICAgIE1hY09TX0RlYnVnU3RyLCAgICAgICAgIDEsICAgICAgRGVidWdTdHJfZG9jfSwKKyAgICB7IlN5c0JlZXAiLCAgICAgICAgICAgICAgICAgICAgICAgICBNYWNPU19TeXNCZWVwLCAgICAgICAgICAxLCAgICAgIFN5c0JlZXBfZG9jfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXsiR2V0VGlja3MiLAkJCU1hY09TX0dldFRpY2tzLAkJMSwJR2V0VGlja3NfZG9jfSwKLQl7IldNQXZhaWxhYmxlIiwJCQlNYWNPU19XTUF2YWlsYWJsZSwJCTEsCVdNQXZhaWxhYmxlX2RvY30sCi0Je05VTEwsCQkJCU5VTEx9CQkgLyogU2VudGluZWwgKi8KKyAgICB7IkdldFRpY2tzIiwgICAgICAgICAgICAgICAgICAgICAgICBNYWNPU19HZXRUaWNrcywgICAgICAgICAxLCAgICAgIEdldFRpY2tzX2RvY30sCisgICAgeyJXTUF2YWlsYWJsZSIsICAgICAgICAgICAgICAgICAgICAgTWFjT1NfV01BdmFpbGFibGUsICAgICAgICAgICAgICAxLCAgICAgIFdNQXZhaWxhYmxlX2RvY30sCisgICAge05VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgICAvKiBTZW50aW5lbCAqLwogfTsKIAogCiB2b2lkCiBpbml0TWFjT1Modm9pZCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7Ci0JCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBNYWNPUyBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSkKLQkJcmV0dXJuOwotCQotCW0gPSBQeV9Jbml0TW9kdWxlKCJNYWNPUyIsIE1hY09TX01ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCQotCS8qIEluaXRpYWxpemUgTWFjT1MuRXJyb3IgZXhjZXB0aW9uICovCi0JTWFjT1NfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChNYWNPU19FcnJvciA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1hY09TX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JUmZ0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JUHlfSU5DUkVGKCZSZnR5cGUpOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmVzb3VyY2VGb3JrVHlwZSIsIChQeU9iamVjdCAqKSZSZnR5cGUpICE9IDApCi0JCXJldHVybjsKLQkvKgotCSoqIFRoaXMgaXMgYSBoYWNrOiB0aGUgZm9sbG93aW5nIGNvbnN0YW50IGFkZGVkIHRvIHRoZSBpZCgpIG9mIGEgc3RyaW5nCi0JKiogb2JqZWN0IGdpdmVzIHlvdSB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YS4gVW5mb3J0dW5hdGVseSwgaXQgaXMgbmVlZGVkIGZvcgotCSoqIHNvbWUgb2YgdGhlIGltYWdlIGFuZCBzb3VuZCBwcm9jZXNzaW5nIGludGVyZmFjZXMgb24gdGhlIG1hYzotKAotCSovCi0JewotCQlQeVN0cmluZ09iamVjdCAqcCA9IDA7Ci0JCWxvbmcgb2ZmID0gKGxvbmcpJihwLT5vYl9zdmFsWzBdKTsKLQkJCi0JCWlmKCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAic3RyaW5nX2lkX3RvX2J1ZmZlciIsIFB5X0J1aWxkVmFsdWUoImkiLCBvZmYpKSAhPSAwKQotCQkJcmV0dXJuOwotCX0KKyAgICBQeU9iamVjdCAqbSwgKmQ7CisKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIE1hY09TIG1vZHVsZSBpcyByZW1vdmVkLiIsIDEpKQorICAgICAgICByZXR1cm47CisKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiTWFjT1MiLCBNYWNPU19NZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKworICAgIC8qIEluaXRpYWxpemUgTWFjT1MuRXJyb3IgZXhjZXB0aW9uICovCisgICAgTWFjT1NfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNYWNPU19FcnJvciA9PSBOVUxMIHx8IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1hY09TX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgUmZ0eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZSZnR5cGUpOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiUmVzb3VyY2VGb3JrVHlwZSIsIChQeU9iamVjdCAqKSZSZnR5cGUpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICAvKgorICAgICoqIFRoaXMgaXMgYSBoYWNrOiB0aGUgZm9sbG93aW5nIGNvbnN0YW50IGFkZGVkIHRvIHRoZSBpZCgpIG9mIGEgc3RyaW5nCisgICAgKiogb2JqZWN0IGdpdmVzIHlvdSB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YS4gVW5mb3J0dW5hdGVseSwgaXQgaXMgbmVlZGVkIGZvcgorICAgICoqIHNvbWUgb2YgdGhlIGltYWdlIGFuZCBzb3VuZCBwcm9jZXNzaW5nIGludGVyZmFjZXMgb24gdGhlIG1hYzotKAorICAgICovCisgICAgeworICAgICAgICBQeVN0cmluZ09iamVjdCAqcCA9IDA7CisgICAgICAgIGxvbmcgb2ZmID0gKGxvbmcpJihwLT5vYl9zdmFsWzBdKTsKKworICAgICAgICBpZiggUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgInN0cmluZ19pZF90b19idWZmZXIiLCBQeV9CdWlsZFZhbHVlKCJpIiwgb2ZmKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CiAjZGVmaW5lIFBZX1JVTlRJTUVNT0RFTCAibWFjaG8iCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJydW50aW1lbW9kZWwiLCAKLQkJCQlQeV9CdWlsZFZhbHVlKCJzIiwgUFlfUlVOVElNRU1PREVMKSkgIT0gMCkKLQkJcmV0dXJuOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAicnVudGltZW1vZGVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJzIiwgUFlfUlVOVElNRU1PREVMKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogI2lmIGRlZmluZWQoV0lUSF9ORVhUX0ZSQU1FV09SSykKICNkZWZpbmUgUFlfTElOS01PREVMICJmcmFtZXdvcmsiCiAjZWxpZiBkZWZpbmVkKFB5X0VOQUJMRV9TSEFSRUQpCkBAIC03MzIsOCArNzMyLDggQEAKICNlbHNlCiAjZGVmaW5lIFBZX0xJTktNT0RFTCAic3RhdGljIgogI2VuZGlmCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJsaW5rbW9kZWwiLCAKLQkJCQlQeV9CdWlsZFZhbHVlKCJzIiwgUFlfTElOS01PREVMKSkgIT0gMCkKLQkJcmV0dXJuOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAibGlua21vZGVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9CdWlsZFZhbHVlKCJzIiwgUFlfTElOS01PREVMKSkgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogCiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9OYXYuYyBiL01hYy9Nb2R1bGVzL05hdi5jCmluZGV4IGY3YjE5YjkuLjcxMThkNDMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL05hdi5jCisrKyBiL01hYy9Nb2R1bGVzL05hdi5jCkBAIC00NCwxNzIgKzQ0LDE3MiBAQAogLyogQ2FsbGJhY2sgZnVuY3Rpb25zICovCiBzdGF0aWMgcGFzY2FsIHZvaWQKIG15X2V2ZW50UHJvYyhOYXZFdmVudENhbGxiYWNrTWVzc2FnZSBjYWxsQmFja1NlbGVjdG9yLAotCQkJIE5hdkNCUmVjUHRyIGNhbGxCYWNrUGFybXMsCi0JCQkgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQorICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkNCUmVjUHRyIGNhbGxCYWNrUGFybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQogewotCVB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKLQlQeU9iamVjdCAqcHlmdW5jOwotCVB5T2JqZWN0ICpydjsKLQkKLQlpZiAoIWRpY3QpIHJldHVybjsKLQlpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiZXZlbnRQcm9jIikpID09IE5VTEwgKSB7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCBweWZ1bmMgPT0gUHlfTm9uZSApIHsKLQkJcmV0dXJuOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJscyMiLCAobG9uZyljYWxsQmFja1NlbGVjdG9yLAotCQkJKHZvaWQgKiljYWxsQmFja1Bhcm1zLCBzaXplb2YoTmF2Q0JSZWMpKTsKLQlpZiAoIHJ2ICkKLQkJUHlfREVDUkVGKHJ2KTsKLQllbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIGV2ZW50UHJvYyBjYWxsYmFja1xuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQorICAgIFB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKKyAgICBQeU9iamVjdCAqcHlmdW5jOworICAgIFB5T2JqZWN0ICpydjsKKworICAgIGlmICghZGljdCkgcmV0dXJuOworICAgIGlmICggKHB5ZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGRpY3QsICJldmVudFByb2MiKSkgPT0gTlVMTCApIHsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIHB5ZnVuYyA9PSBQeV9Ob25lICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJ2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHB5ZnVuYywgImxzIyIsIChsb25nKWNhbGxCYWNrU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2FsbEJhY2tQYXJtcywgc2l6ZW9mKE5hdkNCUmVjKSk7CisgICAgaWYgKCBydiApCisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBldmVudFByb2MgY2FsbGJhY2tcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0KIH0KIAogc3RhdGljIHBhc2NhbCBCb29sZWFuCiBteV9wcmV2aWV3UHJvYyhOYXZDQlJlY1B0ciBjYWxsQmFja1Bhcm1zLAotCQkJICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2Q2FsbEJhY2tVc2VyRGF0YSBjYWxsYmFja1VEKQogewotCVB5T2JqZWN0ICpkaWN0ID0gKFB5T2JqZWN0ICopY2FsbGJhY2tVRDsKLQlQeU9iamVjdCAqcHlmdW5jOwotCVB5T2JqZWN0ICpydjsKLQlCb29sZWFuIGNfcnYgPSBmYWxzZTsKLQkKLQlpZiAoIWRpY3QpIHJldHVybiBmYWxzZTsKLQlpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAicHJldmlld1Byb2MiKSkgPT0gTlVMTCApIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJzIyIsICh2b2lkICopY2FsbEJhY2tQYXJtcywgc2l6ZW9mKE5hdkNCUmVjKSk7Ci0JaWYgKCBydiApIHsKLQkJY19ydiA9IFB5T2JqZWN0X0lzVHJ1ZShydik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfSBlbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIHByZXZpZXdQcm9jIGNhbGxiYWNrXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQl9Ci0JcmV0dXJuIGNfcnY7CisgICAgUHlPYmplY3QgKmRpY3QgPSAoUHlPYmplY3QgKiljYWxsYmFja1VEOworICAgIFB5T2JqZWN0ICpweWZ1bmM7CisgICAgUHlPYmplY3QgKnJ2OworICAgIEJvb2xlYW4gY19ydiA9IGZhbHNlOworCisgICAgaWYgKCFkaWN0KSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgInByZXZpZXdQcm9jIikpID09IE5VTEwgKSB7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcnYgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24ocHlmdW5jLCAicyMiLCAodm9pZCAqKWNhbGxCYWNrUGFybXMsIHNpemVvZihOYXZDQlJlYykpOworICAgIGlmICggcnYgKSB7CisgICAgICAgIGNfcnYgPSBQeU9iamVjdF9Jc1RydWUocnYpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJOYXY6IGV4Y2VwdGlvbiBpbiBwcmV2aWV3UHJvYyBjYWxsYmFja1xuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIHJldHVybiBjX3J2OwogfQogCiBzdGF0aWMgcGFzY2FsIEJvb2xlYW4KIG15X2ZpbHRlclByb2MoQUVEZXNjICp0aGVJdGVtLCB2b2lkICppbmZvLAotCQkJICBOYXZDYWxsQmFja1VzZXJEYXRhIGNhbGxiYWNrVUQsCi0JCQkgIE5hdkZpbHRlck1vZGVzIGZpbHRlck1vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdkNhbGxCYWNrVXNlckRhdGEgY2FsbGJhY2tVRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2RmlsdGVyTW9kZXMgZmlsdGVyTW9kZSkKIHsKLQlQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7Ci0JUHlPYmplY3QgKnB5ZnVuYzsKLQlQeU9iamVjdCAqcnY7Ci0JQm9vbGVhbiBjX3J2ID0gZmFsc2U7Ci0JCi0JaWYgKCFkaWN0KSByZXR1cm4gZmFsc2U7Ci0JaWYgKCAocHlmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoZGljdCwgImZpbHRlclByb2MiKSkgPT0gTlVMTCApIHsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlydiA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweWZ1bmMsICJPJnMjaCIsCi0JCUFFRGVzY19OZXdCb3Jyb3dlZCwgdGhlSXRlbSwgaW5mbywgc2l6ZW9mKE5hdkZpbGVPckZvbGRlckluZm8pLCAoc2hvcnQpZmlsdGVyTW9kZSk7Ci0JaWYgKCBydiApIHsKLQkJY19ydiA9IFB5T2JqZWN0X0lzVHJ1ZShydik7Ci0JCVB5X0RFQ1JFRihydik7Ci0JfSBlbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIk5hdjogZXhjZXB0aW9uIGluIGZpbHRlclByb2MgY2FsbGJhY2tcbiIpOwotCQlQeUVycl9QcmludCgpOwotCX0KLQlyZXR1cm4gY19ydjsKKyAgICBQeU9iamVjdCAqZGljdCA9IChQeU9iamVjdCAqKWNhbGxiYWNrVUQ7CisgICAgUHlPYmplY3QgKnB5ZnVuYzsKKyAgICBQeU9iamVjdCAqcnY7CisgICAgQm9vbGVhbiBjX3J2ID0gZmFsc2U7CisKKyAgICBpZiAoIWRpY3QpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIChweWZ1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhkaWN0LCAiZmlsdGVyUHJvYyIpKSA9PSBOVUxMICkgeworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJ2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHB5ZnVuYywgIk8mcyNoIiwKKyAgICAgICAgQUVEZXNjX05ld0JvcnJvd2VkLCB0aGVJdGVtLCBpbmZvLCBzaXplb2YoTmF2RmlsZU9yRm9sZGVySW5mbyksIChzaG9ydClmaWx0ZXJNb2RlKTsKKyAgICBpZiAoIHJ2ICkgeworICAgICAgICBjX3J2ID0gUHlPYmplY3RfSXNUcnVlKHJ2KTsKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICB9IGVsc2UgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiTmF2OiBleGNlcHRpb24gaW4gZmlsdGVyUHJvYyBjYWxsYmFja1xuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIHJldHVybiBjX3J2OwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGludAogZmlsbGRpYWxvZ29wdGlvbnMoUHlPYmplY3QgKmQsCi0JCUFFRGVzYyAqKmRlZmF1bHRMb2NhdGlvblAsCi0JCU5hdkRpYWxvZ09wdGlvbnMgKm9wdCwKLQkJTmF2RXZlbnRVUFAgKmV2ZW50UHJvY1AsCi0JCU5hdlByZXZpZXdVUFAgKnByZXZpZXdQcm9jUCwKLQkJTmF2T2JqZWN0RmlsdGVyVVBQICpmaWx0ZXJQcm9jUCwKLQkJTmF2VHlwZUxpc3RIYW5kbGUgKnR5cGVMaXN0UCwKLQkJT1NUeXBlICpmaWxlVHlwZVAsCi0JCU9TVHlwZSAqZmlsZUNyZWF0b3JQKQorICAgICAgICAgICAgICAgIEFFRGVzYyAqKmRlZmF1bHRMb2NhdGlvblAsCisgICAgICAgICAgICAgICAgTmF2RGlhbG9nT3B0aW9ucyAqb3B0LAorICAgICAgICAgICAgICAgIE5hdkV2ZW50VVBQICpldmVudFByb2NQLAorICAgICAgICAgICAgICAgIE5hdlByZXZpZXdVUFAgKnByZXZpZXdQcm9jUCwKKyAgICAgICAgICAgICAgICBOYXZPYmplY3RGaWx0ZXJVUFAgKmZpbHRlclByb2NQLAorICAgICAgICAgICAgICAgIE5hdlR5cGVMaXN0SGFuZGxlICp0eXBlTGlzdFAsCisgICAgICAgICAgICAgICAgT1NUeXBlICpmaWxlVHlwZVAsCisgICAgICAgICAgICAgICAgT1NUeXBlICpmaWxlQ3JlYXRvclApCiB7Ci0JUHlfc3NpemVfdCBwb3MgPSAwOwotCVB5T2JqZWN0ICprZXksICp2YWx1ZTsKLQljaGFyICprZXlzdHI7Ci0JQUVEZXNjICpkZWZhdWx0TG9jYXRpb25fc3RvcmFnZTsKLQkKLQlOYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucyhvcHQpOworICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgY2hhciAqa2V5c3RyOworICAgIEFFRGVzYyAqZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2U7CiAKLQl3aGlsZSAoIFB5RGljdF9OZXh0KGQsICZwb3MsICZrZXksICZ2YWx1ZSkgKSB7Ci0JCWlmICggIWtleSB8fCAhdmFsdWUgfHwgIVB5U3RyaW5nX0NoZWNrKGtleSkgKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoRXJyb3JPYmplY3QsICJEaWFsb2dPcHRpb24gaGFzIG5vbi1zdHJpbmcga2V5Iik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlrZXlzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhrZXkpOwotCQlpZiggc3RyY21wKGtleXN0ciwgImRlZmF1bHRMb2NhdGlvbiIpID09IDAgKSB7Ci0JCQlpZiAoIChkZWZhdWx0TG9jYXRpb25fc3RvcmFnZSA9IFB5TWVtX05FVyhBRURlc2MsIDEpKSA9PSBOVUxMICkgewotCQkJCVB5RXJyX05vTWVtb3J5KCk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgQUVEZXNjX0NvbnZlcnQsIGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlKSApIHsKLQkJCQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2UpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJKmRlZmF1bHRMb2NhdGlvblAgPSBkZWZhdWx0TG9jYXRpb25fc3RvcmFnZTsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAidmVyc2lvbiIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIkgiLCAmb3B0LT52ZXJzaW9uKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImRpYWxvZ09wdGlvbkZsYWdzIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiayIsICZvcHQtPmRpYWxvZ09wdGlvbkZsYWdzKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImxvY2F0aW9uIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRQb2ludCwgJm9wdC0+bG9jYXRpb24pICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAiY2xpZW50TmFtZSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5jbGllbnROYW1lKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgIndpbmRvd1RpdGxlIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPndpbmRvd1RpdGxlKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImFjdGlvbkJ1dHRvbkxhYmVsIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPmFjdGlvbkJ1dHRvbkxhYmVsKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImNhbmNlbEJ1dHRvbkxhYmVsIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPmNhbmNlbEJ1dHRvbkxhYmVsKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInNhdmVkRmlsZU5hbWUiKSA9PSAwICkgewotCQkJaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+c2F2ZWRGaWxlTmFtZSkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJtZXNzYWdlIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPm1lc3NhZ2UpICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAicHJlZmVyZW5jZUtleSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmb3B0LT5wcmVmZXJlbmNlS2V5KSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInBvcHVwRXh0ZW5zaW9uIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgJm9wdC0+cG9wdXBFeHRlbnNpb24pICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBldmVudFByb2NQICYmIHN0cmNtcChrZXlzdHIsICJldmVudFByb2MiKSA9PSAwICkgewotCQkJKmV2ZW50UHJvY1AgPSBteV9ldmVudFByb2NVUFA7Ci0JCX0gZWxzZSBpZiggcHJldmlld1Byb2NQICYmIHN0cmNtcChrZXlzdHIsICJwcmV2aWV3UHJvYyIpID09IDAgKSB7Ci0JCQkqcHJldmlld1Byb2NQID0gbXlfcHJldmlld1Byb2NVUFA7Ci0JCX0gZWxzZSBpZiggZmlsdGVyUHJvY1AgJiYgc3RyY21wKGtleXN0ciwgImZpbHRlclByb2MiKSA9PSAwICkgewotCQkJKmZpbHRlclByb2NQID0gbXlfZmlsdGVyUHJvY1VQUDsKLQkJfSBlbHNlIGlmKCB0eXBlTGlzdFAgJiYgc3RyY21wKGtleXN0ciwgInR5cGVMaXN0IikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgdHlwZUxpc3RQKSApCi0JCQkJcmV0dXJuIDA7Ci0JCX0gZWxzZSBpZiggZmlsZVR5cGVQICYmIHN0cmNtcChrZXlzdHIsICJmaWxlVHlwZSIpID09IDAgKSB7Ci0JCQlpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCBmaWxlVHlwZVApICkKLQkJCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmKCBmaWxlQ3JlYXRvclAgJiYgc3RyY21wKGtleXN0ciwgImZpbGVDcmVhdG9yIikgPT0gMCApIHsKLQkJCWlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsIGZpbGVDcmVhdG9yUCkgKQotCQkJCXJldHVybiAwOwotCQl9IGVsc2UgewotCQkJUHlFcnJfRm9ybWF0KEVycm9yT2JqZWN0LCAiVW5rbm93biBEaWFsb2dPcHRpb24ga2V5OiAlcyIsIGtleXN0cik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gMTsKKyAgICBOYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucyhvcHQpOworCisgICAgd2hpbGUgKCBQeURpY3RfTmV4dChkLCAmcG9zLCAma2V5LCAmdmFsdWUpICkgeworICAgICAgICBpZiAoICFrZXkgfHwgIXZhbHVlIHx8ICFQeVN0cmluZ19DaGVjayhrZXkpICkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yT2JqZWN0LCAiRGlhbG9nT3B0aW9uIGhhcyBub24tc3RyaW5nIGtleSIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAga2V5c3RyID0gUHlTdHJpbmdfQXNTdHJpbmcoa2V5KTsKKyAgICAgICAgaWYoIHN0cmNtcChrZXlzdHIsICJkZWZhdWx0TG9jYXRpb24iKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAoZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2UgPSBQeU1lbV9ORVcoQUVEZXNjLCAxKSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIEFFRGVzY19Db252ZXJ0LCBkZWZhdWx0TG9jYXRpb25fc3RvcmFnZSkgKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbl9zdG9yYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkZWZhdWx0TG9jYXRpb25QID0gZGVmYXVsdExvY2F0aW9uX3N0b3JhZ2U7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInZlcnNpb24iKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJIIiwgJm9wdC0+dmVyc2lvbikgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJkaWFsb2dPcHRpb25GbGFncyIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgImsiLCAmb3B0LT5kaWFsb2dPcHRpb25GbGFncykgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJsb2NhdGlvbiIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICZvcHQtPmxvY2F0aW9uKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgImNsaWVudE5hbWUiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwgJm9wdC0+Y2xpZW50TmFtZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJ3aW5kb3dUaXRsZSIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT53aW5kb3dUaXRsZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJhY3Rpb25CdXR0b25MYWJlbCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5hY3Rpb25CdXR0b25MYWJlbCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJjYW5jZWxCdXR0b25MYWJlbCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5jYW5jZWxCdXR0b25MYWJlbCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJzYXZlZEZpbGVOYW1lIikgPT0gMCApIHsKKyAgICAgICAgICAgIGlmICggIVB5QXJnX1BhcnNlKHZhbHVlLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsICZvcHQtPnNhdmVkRmlsZU5hbWUpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmKCBzdHJjbXAoa2V5c3RyLCAibWVzc2FnZSIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCAmb3B0LT5tZXNzYWdlKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggc3RyY21wKGtleXN0ciwgInByZWZlcmVuY2VLZXkiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJm9wdC0+cHJlZmVyZW5jZUtleSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIHN0cmNtcChrZXlzdHIsICJwb3B1cEV4dGVuc2lvbiIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZvcHQtPnBvcHVwRXh0ZW5zaW9uKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggZXZlbnRQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAiZXZlbnRQcm9jIikgPT0gMCApIHsKKyAgICAgICAgICAgICpldmVudFByb2NQID0gbXlfZXZlbnRQcm9jVVBQOworICAgICAgICB9IGVsc2UgaWYoIHByZXZpZXdQcm9jUCAmJiBzdHJjbXAoa2V5c3RyLCAicHJldmlld1Byb2MiKSA9PSAwICkgeworICAgICAgICAgICAgKnByZXZpZXdQcm9jUCA9IG15X3ByZXZpZXdQcm9jVVBQOworICAgICAgICB9IGVsc2UgaWYoIGZpbHRlclByb2NQICYmIHN0cmNtcChrZXlzdHIsICJmaWx0ZXJQcm9jIikgPT0gMCApIHsKKyAgICAgICAgICAgICpmaWx0ZXJQcm9jUCA9IG15X2ZpbHRlclByb2NVUFA7CisgICAgICAgIH0gZWxzZSBpZiggdHlwZUxpc3RQICYmIHN0cmNtcChrZXlzdHIsICJ0eXBlTGlzdCIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUmVzT2JqX0NvbnZlcnQsIHR5cGVMaXN0UCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYoIGZpbGVUeXBlUCAmJiBzdHJjbXAoa2V5c3RyLCAiZmlsZVR5cGUiKSA9PSAwICkgeworICAgICAgICAgICAgaWYgKCAhUHlBcmdfUGFyc2UodmFsdWUsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgZmlsZVR5cGVQKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiggZmlsZUNyZWF0b3JQICYmIHN0cmNtcChrZXlzdHIsICJmaWxlQ3JlYXRvciIpID09IDAgKSB7CisgICAgICAgICAgICBpZiAoICFQeUFyZ19QYXJzZSh2YWx1ZSwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCBmaWxlQ3JlYXRvclApICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChFcnJvck9iamVjdCwgIlVua25vd24gRGlhbG9nT3B0aW9uIGtleTogJXMiLCBrZXlzdHIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMTcsOCArMjE3LDggQEAKIC8qIERlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBvZiB0eXBlIE5hdlJlcGx5UmVjb3JkICovCiAKIHR5cGVkZWYgc3RydWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTmF2UmVwbHlSZWNvcmQgaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBOYXZSZXBseVJlY29yZCBpdHNlbGY7CiB9IG5hdnJyb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IE5hdnJydHlwZTsKQEAgLTIzNCwxOCArMjM0LDE4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdlRyYW5zbGF0ZUZpbGUobmF2cnJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdlRyYW5zbGF0aW9uT3B0aW9ucyBob3dUb1RyYW5zbGF0ZTsKLQlPU0VyciBlcnI7CisgICAgTmF2VHJhbnNsYXRpb25PcHRpb25zIGhvd1RvVHJhbnNsYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZob3dUb1RyYW5zbGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdlRyYW5zbGF0ZUZpbGUoJnNlbGYtPml0c2VsZiwgaG93VG9UcmFuc2xhdGUpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmhvd1RvVHJhbnNsYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2VHJhbnNsYXRlRmlsZSgmc2VsZi0+aXRzZWxmLCBob3dUb1RyYW5zbGF0ZSk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkNvbXBsZXRlU2F2ZV9fZG9jX19bXSA9CkBAIC0yNTUsMjYgKzI1NSwyNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZDb21wbGV0ZVNhdmUobmF2cnJvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdlRyYW5zbGF0aW9uT3B0aW9ucyBob3dUb1RyYW5zbGF0ZTsKLQlPU0VyciBlcnI7CisgICAgTmF2VHJhbnNsYXRpb25PcHRpb25zIGhvd1RvVHJhbnNsYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiayIsICZob3dUb1RyYW5zbGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkNvbXBsZXRlU2F2ZSgmc2VsZi0+aXRzZWxmLCBob3dUb1RyYW5zbGF0ZSk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImsiLCAmaG93VG9UcmFuc2xhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZDb21wbGV0ZVNhdmUoJnNlbGYtPml0c2VsZiwgaG93VG9UcmFuc2xhdGUpOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBuYXZycl9tZXRob2RzW10gPSB7Ci0geyJOYXZUcmFuc2xhdGVGaWxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZUcmFuc2xhdGVGaWxlLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZUcmFuc2xhdGVGaWxlX19kb2NfX30sCi0geyJOYXZDb21wbGV0ZVNhdmUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNvbXBsZXRlU2F2ZSwJTUVUSF9WQVJBUkdTLAluYXZfTmF2Q29tcGxldGVTYXZlX19kb2NfX30sCi0JCi0Je05VTEwsCQlOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7Ik5hdlRyYW5zbGF0ZUZpbGUiLCAgIChQeUNGdW5jdGlvbiluYXZfTmF2VHJhbnNsYXRlRmlsZSwgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlRyYW5zbGF0ZUZpbGVfX2RvY19ffSwKKyB7Ik5hdkNvbXBsZXRlU2F2ZSIsICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q29tcGxldGVTYXZlLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkNvbXBsZXRlU2F2ZV9fZG9jX199LAorCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0gKi8KQEAgLTI4MywxNjEgKzI4MywxNjEgQEAKIHN0YXRpYyBuYXZycm9iamVjdCAqCiBuZXduYXZycm9iamVjdChOYXZSZXBseVJlY29yZCAqaXRzZWxmKQogewotCW5hdnJyb2JqZWN0ICpzZWxmOwotCQotCXNlbGYgPSBQeU9iamVjdF9ORVcobmF2cnJvYmplY3QsICZOYXZycnR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCXNlbGYtPml0c2VsZiA9ICppdHNlbGY7Ci0JcmV0dXJuIHNlbGY7CisgICAgbmF2cnJvYmplY3QgKnNlbGY7CisKKyAgICBzZWxmID0gUHlPYmplY3RfTkVXKG5hdnJyb2JqZWN0LCAmTmF2cnJ0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzZWxmLT5pdHNlbGYgPSAqaXRzZWxmOworICAgIHJldHVybiBzZWxmOwogfQogCiAKIHN0YXRpYyB2b2lkCiBuYXZycl9kZWFsbG9jKG5hdnJyb2JqZWN0ICpzZWxmKQogewotCU5hdkRpc3Bvc2VSZXBseSgmc2VsZi0+aXRzZWxmKTsKLQlQeU9iamVjdF9ERUwoc2VsZik7CisgICAgTmF2RGlzcG9zZVJlcGx5KCZzZWxmLT5pdHNlbGYpOworICAgIFB5T2JqZWN0X0RFTChzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdnJyX2dldGF0dHIobmF2cnJvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JRlNSZWYgZnNyOwotCUZTU3BlYyBmc3M7Ci0JCi0JaWYoIHN0cmNtcChuYW1lLCAiX19tZW1iZXJzX18iKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoCi0JCQkJInNzc3Nzc3Nzc3MiLCAKLQkJCQkidmVyc2lvbiIsICJ2YWxpZFJlY29yZCIsICJyZXBsYWNpbmciLAotCQkJImlzU3RhdGlvbmVyeSIsICJ0cmFuc2xhdGlvbk5lZWRlZCIsIAotCQkJInNlbGVjdGlvbiIsIAotCQkJInNlbGVjdGlvbl9mc3IiLAotCQkJImZpbGVUcmFuc2xhdGlvbiIsICJrZXlTY3JpcHQiLCAic2F2ZUZpbGVOYW1lIik7CisgICAgRlNSZWYgZnNyOworICAgIEZTU3BlYyBmc3M7CiAKLQlpZiggc3RyY21wKG5hbWUsICJ2ZXJzaW9uIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+aXRzZWxmLnZlcnNpb24pOwotCWlmKCBzdHJjbXAobmFtZSwgInZhbGlkUmVjb3JkIikgPT0gMCApCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLnZhbGlkUmVjb3JkKTsKLQlpZiggc3RyY21wKG5hbWUsICJyZXBsYWNpbmciKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYucmVwbGFjaW5nKTsKLQlpZiggc3RyY21wKG5hbWUsICJpc1N0YXRpb25lcnkiKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYuaXNTdGF0aW9uZXJ5KTsKLQlpZiggc3RyY21wKG5hbWUsICJ0cmFuc2xhdGlvbk5lZWRlZCIpID09IDAgKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXNlbGYtPml0c2VsZi50cmFuc2xhdGlvbk5lZWRlZCk7Ci0JaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uIikgPT0gMCApIHsKLQkJU0ludDMyIGk7Ci0JCWxvbmcgY291bnQ7Ci0JCU9TRXJyIGVycjsKLQkJUHlPYmplY3QgKnJ2LCAqcnZpdGVtOwotCQlBRURlc2MgZGVzYzsKLQkJCi0JCWlmICgoZXJyPUFFQ291bnRJdGVtcygmc2VsZi0+aXRzZWxmLnNlbGVjdGlvbiwgJmNvdW50KSkpIHsKLQkJCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWlmICggKHJ2PVB5TGlzdF9OZXcoY291bnQpKSA9PSBOVUxMICkKLQkJCXJldHVybiBOVUxMOwotCQlmb3IoaT0wOyBpPGNvdW50OyBpKyspIHsKLQkJCWRlc2MuZGF0YUhhbmRsZSA9IE5VTEw7Ci0JCQlpZiAoKGVycj1BRUdldE50aERlc2MoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sIGkrMSwgdHlwZUZTUywgTlVMTCwgJmRlc2MpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKChlcnI9QUVHZXREZXNjRGF0YSgmZGVzYywgJmZzcywgc2l6ZW9mKEZTU3BlYykpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJcnZpdGVtID0gUHlNYWNfQnVpbGRGU1NwZWMoJmZzcyk7Ci0JCQlQeUxpc3RfU2V0SXRlbShydiwgaSwgcnZpdGVtKTsKLQkJCUFFRGlzcG9zZURlc2MoJmRlc2MpOwotCQl9Ci0JCXJldHVybiBydjsKLQl9Ci0JaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uX2ZzciIpID09IDAgKSB7Ci0JCVNJbnQzMiBpOwotCQlsb25nIGNvdW50OwotCQlPU0VyciBlcnI7Ci0JCVB5T2JqZWN0ICpydiwgKnJ2aXRlbTsKLQkJQUVEZXNjIGRlc2M7Ci0JCQotCQlpZiAoKGVycj1BRUNvdW50SXRlbXMoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sICZjb3VudCkpKSB7Ci0JCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQlpZiAoIChydj1QeUxpc3RfTmV3KGNvdW50KSkgPT0gTlVMTCApCi0JCQlyZXR1cm4gTlVMTDsKLQkJZm9yKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0JCQlkZXNjLmRhdGFIYW5kbGUgPSBOVUxMOwotCQkJaWYgKChlcnI9QUVHZXROdGhEZXNjKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCBpKzEsIHR5cGVGU1JlZiwgTlVMTCwgJmRlc2MpKSkgewotCQkJCVB5X0RFQ1JFRihydik7Ci0JCQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQotCQkJaWYgKChlcnI9QUVHZXREZXNjRGF0YSgmZGVzYywgJmZzciwgc2l6ZW9mKEZTUmVmKSkpKSB7Ci0JCQkJUHlfREVDUkVGKHJ2KTsKLQkJCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCQkJcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCQlydml0ZW0gPSBQeU1hY19CdWlsZEZTUmVmKCZmc3IpOwotCQkJUHlMaXN0X1NldEl0ZW0ocnYsIGksIHJ2aXRlbSk7Ci0JCQlBRURpc3Bvc2VEZXNjKCZkZXNjKTsKLQkJfQotCQlyZXR1cm4gcnY7Ci0JfQotCWlmKCBzdHJjbXAobmFtZSwgImZpbGVUcmFuc2xhdGlvbiIpID09IDAgKQotCQlyZXR1cm4gUmVzT2JqX05ldygoSGFuZGxlKXNlbGYtPml0c2VsZi5maWxlVHJhbnNsYXRpb24pOwotCWlmKCBzdHJjbXAobmFtZSwgImtleVNjcmlwdCIpID09IDAgKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIChzaG9ydClzZWxmLT5pdHNlbGYua2V5U2NyaXB0KTsKLQlpZiggc3RyY21wKG5hbWUsICJzYXZlRmlsZU5hbWUiKSA9PSAwICkKLQkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBzZWxmLT5pdHNlbGYuc2F2ZUZpbGVOYW1lKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJfX21lbWJlcnNfXyIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJzc3Nzc3Nzc3NzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIiwgInZhbGlkUmVjb3JkIiwgInJlcGxhY2luZyIsCisgICAgICAgICAgICAiaXNTdGF0aW9uZXJ5IiwgInRyYW5zbGF0aW9uTmVlZGVkIiwKKyAgICAgICAgICAgICJzZWxlY3Rpb24iLAorICAgICAgICAgICAgInNlbGVjdGlvbl9mc3IiLAorICAgICAgICAgICAgImZpbGVUcmFuc2xhdGlvbiIsICJrZXlTY3JpcHQiLCAic2F2ZUZpbGVOYW1lIik7CisKKyAgICBpZiggc3RyY21wKG5hbWUsICJ2ZXJzaW9uIikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+aXRzZWxmLnZlcnNpb24pOworICAgIGlmKCBzdHJjbXAobmFtZSwgInZhbGlkUmVjb3JkIikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpc2VsZi0+aXRzZWxmLnZhbGlkUmVjb3JkKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJyZXBsYWNpbmciKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYucmVwbGFjaW5nKTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJpc1N0YXRpb25lcnkiKSA9PSAwICkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylzZWxmLT5pdHNlbGYuaXNTdGF0aW9uZXJ5KTsKKyAgICBpZiggc3RyY21wKG5hbWUsICJ0cmFuc2xhdGlvbk5lZWRlZCIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXNlbGYtPml0c2VsZi50cmFuc2xhdGlvbk5lZWRlZCk7CisgICAgaWYoIHN0cmNtcChuYW1lLCAic2VsZWN0aW9uIikgPT0gMCApIHsKKyAgICAgICAgU0ludDMyIGk7CisgICAgICAgIGxvbmcgY291bnQ7CisgICAgICAgIE9TRXJyIGVycjsKKyAgICAgICAgUHlPYmplY3QgKnJ2LCAqcnZpdGVtOworICAgICAgICBBRURlc2MgZGVzYzsKKworICAgICAgICBpZiAoKGVycj1BRUNvdW50SXRlbXMoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sICZjb3VudCkpKSB7CisgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChydj1QeUxpc3RfTmV3KGNvdW50KSkgPT0gTlVMTCApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yKGk9MDsgaTxjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBkZXNjLmRhdGFIYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaWYgKChlcnI9QUVHZXROdGhEZXNjKCZzZWxmLT5pdHNlbGYuc2VsZWN0aW9uLCBpKzEsIHR5cGVGU1MsIE5VTEwsICZkZXNjKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZXJyPUFFR2V0RGVzY0RhdGEoJmRlc2MsICZmc3MsIHNpemVvZihGU1NwZWMpKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ2aXRlbSA9IFB5TWFjX0J1aWxkRlNTcGVjKCZmc3MpOworICAgICAgICAgICAgUHlMaXN0X1NldEl0ZW0ocnYsIGksIHJ2aXRlbSk7CisgICAgICAgICAgICBBRURpc3Bvc2VEZXNjKCZkZXNjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcnY7CisgICAgfQorICAgIGlmKCBzdHJjbXAobmFtZSwgInNlbGVjdGlvbl9mc3IiKSA9PSAwICkgeworICAgICAgICBTSW50MzIgaTsKKyAgICAgICAgbG9uZyBjb3VudDsKKyAgICAgICAgT1NFcnIgZXJyOworICAgICAgICBQeU9iamVjdCAqcnYsICpydml0ZW07CisgICAgICAgIEFFRGVzYyBkZXNjOworCisgICAgICAgIGlmICgoZXJyPUFFQ291bnRJdGVtcygmc2VsZi0+aXRzZWxmLnNlbGVjdGlvbiwgJmNvdW50KSkpIHsKKyAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggKHJ2PVB5TGlzdF9OZXcoY291bnQpKSA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBmb3IoaT0wOyBpPGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGRlc2MuZGF0YUhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoKGVycj1BRUdldE50aERlc2MoJnNlbGYtPml0c2VsZi5zZWxlY3Rpb24sIGkrMSwgdHlwZUZTUmVmLCBOVUxMLCAmZGVzYykpKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGVycj1BRUdldERlc2NEYXRhKCZkZXNjLCAmZnNyLCBzaXplb2YoRlNSZWYpKSkpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJ2aXRlbSA9IFB5TWFjX0J1aWxkRlNSZWYoJmZzcik7CisgICAgICAgICAgICBQeUxpc3RfU2V0SXRlbShydiwgaSwgcnZpdGVtKTsKKyAgICAgICAgICAgIEFFRGlzcG9zZURlc2MoJmRlc2MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKKyAgICB9CisgICAgaWYoIHN0cmNtcChuYW1lLCAiZmlsZVRyYW5zbGF0aW9uIikgPT0gMCApCisgICAgICAgIHJldHVybiBSZXNPYmpfTmV3KChIYW5kbGUpc2VsZi0+aXRzZWxmLmZpbGVUcmFuc2xhdGlvbik7CisgICAgaWYoIHN0cmNtcChuYW1lLCAia2V5U2NyaXB0IikgPT0gMCApCisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKHNob3J0KXNlbGYtPml0c2VsZi5rZXlTY3JpcHQpOworICAgIGlmKCBzdHJjbXAobmFtZSwgInNhdmVGaWxlTmFtZSIpID09IDAgKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlN0cmluZ1JlZk9ial9OZXcsIHNlbGYtPml0c2VsZi5zYXZlRmlsZU5hbWUpOwogCiAKLQlyZXR1cm4gUHlfRmluZE1ldGhvZChuYXZycl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKKyAgICByZXR1cm4gUHlfRmluZE1ldGhvZChuYXZycl9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAogc3RhdGljIGludAogbmF2cnJfc2V0YXR0cihuYXZycm9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7Ci0JLyogU2V0IGF0dHJpYnV0ZSAnbmFtZScgdG8gdmFsdWUgJ3YnLiB2PT1OVUxMIG1lYW5zIGRlbGV0ZSAqLwotCQotCS8qIFhYWFggQWRkIHlvdXIgb3duIHNldGF0dHIgY29kZSBoZXJlICovCi0JcmV0dXJuIC0xOworICAgIC8qIFNldCBhdHRyaWJ1dGUgJ25hbWUnIHRvIHZhbHVlICd2Jy4gdj09TlVMTCBtZWFucyBkZWxldGUgKi8KKworICAgIC8qIFhYWFggQWRkIHlvdXIgb3duIHNldGF0dHIgY29kZSBoZXJlICovCisgICAgcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgY2hhciBOYXZycnR5cGVfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIE5hdnJydHlwZV9fZG9jX19bXSA9CiAiUmVjb3JkIGNvbnRhaW5pbmcgcmVzdWx0IG9mIGEgTmF2IGZpbGUgc2VsZWN0aW9uIGNhbGwuIFVzZSBkaXIoKSBmb3IgbWVtYmVyIG5hbWVzLiIKIDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBOYXZycnR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJOYXYuTmF2UmVwbHlSZWNvcmQiLAkJCS8qdHBfbmFtZSovCi0Jc2l6ZW9mKG5hdnJyb2JqZWN0KSwJCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpbmF2cnJfZGVhbGxvYywJLyp0cF9kZWFsbG9jKi8KLQkocHJpbnRmdW5jKTAsCQkvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpbmF2cnJfZ2V0YXR0ciwJLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpbmF2cnJfc2V0YXR0ciwJLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykwLAkJLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfcmVwciovCi0JMCwJCQkvKnRwX2FzX251bWJlciovCi0JMCwJCS8qdHBfYXNfc2VxdWVuY2UqLwotCTAsCQkvKnRwX2FzX21hcHBpbmcqLwotCShoYXNoZnVuYykwLAkJLyp0cF9oYXNoKi8KLQkodGVybmFyeWZ1bmMpMCwJCS8qdHBfY2FsbCovCi0JKHJlcHJmdW5jKTAsCQkvKnRwX3N0ciovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworICAgICJOYXYuTmF2UmVwbHlSZWNvcmQiLCAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YobmF2cnJvYmplY3QpLCAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKW5hdnJyX2RlYWxsb2MsICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYyluYXZycl9nZXRhdHRyLCAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKW5hdnJyX3NldGF0dHIsICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykwLCAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpMCwgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIChoYXNoZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAKLQkvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLwotCTBMLDBMLDBMLDBMLAotCU5hdnJydHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIDBMLDBMLDBMLDBMLAorICAgIE5hdnJydHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KIH07CiAKIC8qIEVuZCBvZiBjb2RlIGZvciBOYXZSZXBseVJlY29yZCBvYmplY3RzICovCi0JCQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgY2hhciBuYXZfTmF2R2V0RmlsZV9fZG9jX19bXSA9CkBAIC00NDcsMzIgKzQ0NywzMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZHZXRGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZQcmV2aWV3VVBQIHByZXZpZXdQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JTmF2VHlwZUxpc3RIYW5kbGUgdHlwZUxpc3QgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBOYXZQcmV2aWV3VVBQIHByZXZpZXdQcm9jID0gTlVMTDsKKyAgICBOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7CisgICAgTmF2VHlwZUxpc3RIYW5kbGUgdHlwZUxpc3QgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgJnByZXZpZXdQcm9jLCAmZmlsdGVyUHJvYywgJnR5cGVMaXN0LCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2R2V0RmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCi0JCQlldmVudFByb2MsIHByZXZpZXdQcm9jLCBmaWx0ZXJQcm9jLCB0eXBlTGlzdCwgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCAmcHJldmlld1Byb2MsICZmaWx0ZXJQcm9jLCAmdHlwZUxpc3QsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZHZXRGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRQcm9jLCBwcmV2aWV3UHJvYywgZmlsdGVyUHJvYywgdHlwZUxpc3QsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2UHV0RmlsZV9fZG9jX19bXSA9CkBAIC00ODIsMzEgKzQ4MiwzMSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIG5hdl9OYXZQdXRGaWxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBBRURlc2MgICAgICAqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKKyAgICBOYXZSZXBseVJlY29yZCByZXBseTsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgT1NUeXBlIGZpbGVDcmVhdG9yOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCAmZGVmYXVsdExvY2F0aW9uLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgJmZpbGVUeXBlLCAmZmlsZUNyZWF0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZQdXRGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsZVR5cGUsIGZpbGVDcmVhdG9yLCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsICZmaWxlVHlwZSwgJmZpbGVDcmVhdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2UHV0RmlsZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsZVR5cGUsIGZpbGVDcmVhdG9yLCAodm9pZCAqKWRpY3QpOworICAgIFB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkFza1NhdmVDaGFuZ2VzX19kb2NfX1tdID0KQEAgLTUxNywyNyArNTE3LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkFza1NhdmVDaGFuZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZBc2tTYXZlQ2hhbmdlc0FjdGlvbiBhY3Rpb247Ci0JTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkFza1NhdmVDaGFuZ2VzQWN0aW9uIGFjdGlvbjsKKyAgICBOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmFjdGlvbikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPISIsICZhY3Rpb24sICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2QXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsIGFjdGlvbiwgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJrIiwgJmFjdGlvbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPISIsICZhY3Rpb24sICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2QXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsIGFjdGlvbiwgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXNfX2RvY19fW10gPQpAQCAtNTQ3LDI2ICs1NDcsMjYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOwotCU5hdkFza1NhdmVDaGFuZ2VzUmVzdWx0IHJlcGx5OwotCU5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE9TRXJyIGVycjsKIAotCWlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKLQkJCXJldHVybiBOVUxMOwotCQlkaWN0ID0ga3c7Ci0JfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCWVyciA9IE5hdkN1c3RvbUFza1NhdmVDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCAmcmVwbHksIGV2ZW50UHJvYywgKHZvaWQgKilkaWN0KTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsIE5VTEwsICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZXJyID0gTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMoJmRpYWxvZ09wdGlvbnMsICZyZXBseSwgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOworICAgIGlmICggZXJyICkgeworICAgICAgICBQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKXJlcGx5KTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzX19kb2NfX1tdID0KQEAgLTU3NiwyNiArNTc2LDI2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZBc2tTYXZlQ2hhbmdlc1Jlc3VsdCByZXBseTsKLQlOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7CisgICAgTmF2QXNrU2F2ZUNoYW5nZXNSZXN1bHQgcmVwbHk7CisgICAgTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgTlVMTCwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZBc2tEaXNjYXJkQ2hhbmdlcygmZGlhbG9nT3B0aW9ucywgJnJlcGx5LCBldmVudFByb2MsICh2b2lkICopZGljdCk7Ci0JaWYgKCBlcnIgKSB7Ci0JCVB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcmVwbHkpOworICAgIGlmICgga3cgJiYgUHlPYmplY3RfSXNUcnVlKGt3KSApIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI7ZWl0aGVyIGtleXdvcmQgYXJndW1lbnRzIG9yIGRpY3Rpb25hcnkgZXhwZWN0ZWQiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBkaWN0ID0ga3c7CisgICAgfSBlbHNlIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyEiLCAmUHlEaWN0X1R5cGUsICZkaWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFmaWxsZGlhbG9nb3B0aW9ucyhkaWN0LCBOVUxMLCAmZGlhbG9nT3B0aW9ucywgJmV2ZW50UHJvYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkFza0Rpc2NhcmRDaGFuZ2VzKCZkaWFsb2dPcHRpb25zLCAmcmVwbHksIGV2ZW50UHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VGaWxlX19kb2NfX1tdID0KQEAgLTYwNSwzMiArNjA1LDMyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogbmF2X05hdkNob29zZUZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7Ci0JUHlPYmplY3QgKmRpY3Q7Ci0JQUVEZXNjCSpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOwotCU5hdlJlcGx5UmVjb3JkIHJlcGx5OwotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOwotCU5hdlByZXZpZXdVUFAgcHJldmlld1Byb2MgPSBOVUxMOwotCU5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKLQlOYXZUeXBlTGlzdEhhbmRsZSB0eXBlTGlzdCA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdlByZXZpZXdVUFAgcHJldmlld1Byb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBOYXZUeXBlTGlzdEhhbmRsZSB0eXBlTGlzdCA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCAmcHJldmlld1Byb2MsICZmaWx0ZXJQcm9jLCAmdHlwZUxpc3QsIE5VTEwsIE5VTEwpKQotCQlyZXR1cm4gTlVMTDsKLQllcnIgPSBOYXZDaG9vc2VGaWxlKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgcHJldmlld1Byb2MsIGZpbHRlclByb2MsIHR5cGVMaXN0LCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsICZwcmV2aWV3UHJvYywgJmZpbHRlclByb2MsICZ0eXBlTGlzdCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZUZpbGUoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICBldmVudFByb2MsIHByZXZpZXdQcm9jLCBmaWx0ZXJQcm9jLCB0eXBlTGlzdCwgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VGb2xkZXJfX2RvY19fW10gPQpAQCAtNjQwLDMwICs2NDAsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlRm9sZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlRm9sZGVyKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZUZvbGRlcihkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VWb2x1bWVfX2RvY19fW10gPQpAQCAtNjczLDMwICs2NzMsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlVm9sdW1lKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlVm9sdW1lKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZVZvbHVtZShkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZDaG9vc2VPYmplY3RfX2RvY19fW10gPQpAQCAtNzA2LDMwICs3MDYsMzAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2Q2hvb3NlT2JqZWN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlOYXZPYmplY3RGaWx0ZXJVUFAgZmlsdGVyUHJvYyA9IE5VTEw7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpkaWN0OworICAgIEFFRGVzYyAgICAgICpkZWZhdWx0TG9jYXRpb24gPSBOVUxMOworICAgIE5hdlJlcGx5UmVjb3JkIHJlcGx5OworICAgIE5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKKyAgICBOYXZFdmVudFVQUCBldmVudFByb2MgPSBOVUxMOworICAgIE5hdk9iamVjdEZpbHRlclVQUCBmaWx0ZXJQcm9jID0gTlVMTDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCi0JCQlyZXR1cm4gTlVMTDsKLQkJZGljdCA9IGt3OwotCX0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCi0JCXJldHVybiBOVUxMOwotCWlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsICZmaWx0ZXJQcm9jLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2Q2hvb3NlT2JqZWN0KGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywKLQkJCWV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKLQlQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKLQlpZiAoIGVyciApIHsKLQkJUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CisgICAgaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGRpY3QgPSBrdzsKKyAgICB9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCAmZmlsdGVyUHJvYywgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGVyciA9IE5hdkNob29zZU9iamVjdChkZWZhdWx0TG9jYXRpb24sICZyZXBseSwgJmRpYWxvZ09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50UHJvYywgZmlsdGVyUHJvYywgKHZvaWQgKilkaWN0KTsKKyAgICBQeU1lbV9ERUwoZGVmYXVsdExvY2F0aW9uKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld25hdnJyb2JqZWN0KCZyZXBseSk7CiB9CiAKIHN0YXRpYyBjaGFyIG5hdl9OYXZOZXdGb2xkZXJfX2RvY19fW10gPQpAQCAtNzM5LDI4ICs3MzksMjggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2TmV3Rm9sZGVyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotCVB5T2JqZWN0ICpkaWN0OwotCUFFRGVzYwkqZGVmYXVsdExvY2F0aW9uID0gTlVMTDsKLQlOYXZSZXBseVJlY29yZCByZXBseTsKLQlOYXZEaWFsb2dPcHRpb25zIGRpYWxvZ09wdGlvbnM7Ci0JTmF2RXZlbnRVUFAgZXZlbnRQcm9jID0gTlVMTDsKLQlPU0VyciBlcnI7CisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgQUVEZXNjICAgICAgKmRlZmF1bHRMb2NhdGlvbiA9IE5VTEw7CisgICAgTmF2UmVwbHlSZWNvcmQgcmVwbHk7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE5hdkV2ZW50VVBQIGV2ZW50UHJvYyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCBrdyAmJiBQeU9iamVjdF9Jc1RydWUoa3cpICkgewotCQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjtlaXRoZXIga2V5d29yZCBhcmd1bWVudHMgb3IgZGljdGlvbmFyeSBleHBlY3RlZCIpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWRpY3QgPSBrdzsKLQl9IGVsc2UgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPISIsICZQeURpY3RfVHlwZSwgJmRpY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIWZpbGxkaWFsb2dvcHRpb25zKGRpY3QsICZkZWZhdWx0TG9jYXRpb24sICZkaWFsb2dPcHRpb25zLCAmZXZlbnRQcm9jLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZXJyID0gTmF2TmV3Rm9sZGVyKGRlZmF1bHRMb2NhdGlvbiwgJnJlcGx5LCAmZGlhbG9nT3B0aW9ucywgZXZlbnRQcm9jLCAodm9pZCAqKWRpY3QpOwotCVB5TWVtX0RFTChkZWZhdWx0TG9jYXRpb24pOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKFB5T2JqZWN0ICopbmV3bmF2cnJvYmplY3QoJnJlcGx5KTsKKyAgICBpZiAoIGt3ICYmIFB5T2JqZWN0X0lzVHJ1ZShrdykgKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiO2VpdGhlciBrZXl3b3JkIGFyZ3VtZW50cyBvciBkaWN0aW9uYXJ5IGV4cGVjdGVkIikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZGljdCA9IGt3OworICAgIH0gZWxzZSBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hIiwgJlB5RGljdF9UeXBlLCAmZGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghZmlsbGRpYWxvZ29wdGlvbnMoZGljdCwgJmRlZmF1bHRMb2NhdGlvbiwgJmRpYWxvZ09wdGlvbnMsICZldmVudFByb2MsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBOYXZOZXdGb2xkZXIoZGVmYXVsdExvY2F0aW9uLCAmcmVwbHksICZkaWFsb2dPcHRpb25zLCBldmVudFByb2MsICh2b2lkICopZGljdCk7CisgICAgUHlNZW1fREVMKGRlZmF1bHRMb2NhdGlvbik7CisgICAgaWYgKCBlcnIgKSB7CisgICAgICAgIFB5RXJyX01hYyhFcnJvck9iamVjdCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKiluZXduYXZycm9iamVjdCgmcmVwbHkpOwogfQogCiAjaWYgMApAQCAtNzc0LDEwICs3NzQsMTAgQEAKIG5hdl9OYXZDdXN0b21Db250cm9sKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAjZW5kaWYKIApAQCAtNzg4LDExICs3ODgsMTEgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2U2VydmljZXNDYW5SdW4oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUJvb2xlYW4gcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnYgPSBOYXZTZXJ2aWNlc0NhblJ1bigpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOworICAgIEJvb2xlYW4gcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBOYXZTZXJ2aWNlc0NhblJ1bigpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2U2VydmljZXNBdmFpbGFibGVfX2RvY19fW10gPQpAQCAtODAyLDEyICs4MDIsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2U2VydmljZXNBdmFpbGFibGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCUJvb2xlYW4gcnY7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcnYgPSBOYXZTZXJ2aWNlc0F2YWlsYWJsZSgpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOworICAgIEJvb2xlYW4gcnY7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IE5hdlNlcnZpY2VzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydik7CiB9CiAvKiBYWCAqLwogc3RhdGljIGNoYXIgbmF2X05hdkxvYWRfX2RvY19fW10gPQpAQCAtODE4LDExICs4MTgsMTEgQEAKIG5hdl9OYXZMb2FkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU5hdkxvYWQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTmF2TG9hZCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgbmF2X05hdlVubG9hZF9fZG9jX19bXSA9CkBAIC04MzMsMTEgKzgzMywxMSBAQAogbmF2X05hdlVubG9hZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlOYXZVbmxvYWQoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTmF2VW5sb2FkKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2TGlicmFyeVZlcnNpb25fX2RvY19fW10gPQpAQCAtODQ3LDEyICs4NDcsMTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2TGlicmFyeVZlcnNpb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCVVJbnQzMiBydjsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlydiA9IE5hdkxpYnJhcnlWZXJzaW9uKCk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylydik7CisgICAgVUludDMyIHJ2OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBOYXZMaWJyYXJ5VmVyc2lvbigpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpcnYpOwogfQogCiBzdGF0aWMgY2hhciBuYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnNfX2RvY19fW10gPQpAQCAtODYyLDU5ICs4NjIsNTkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBuYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU5hdkRpYWxvZ09wdGlvbnMgZGlhbG9nT3B0aW9uczsKLQlPU0VyciBlcnI7Ci0JCi0JZXJyID0gTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMoJmRpYWxvZ09wdGlvbnMpOwotCWlmICggZXJyICkgewotCQlQeUVycl9NYWMoRXJyb3JPYmplY3QsIGVycik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgKLQkJCSJ7czpoLHM6bCxzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJn0iLAotCQkidmVyc2lvbiIsIGRpYWxvZ09wdGlvbnMudmVyc2lvbiwKLQkJImRpYWxvZ09wdGlvbkZsYWdzIiwgZGlhbG9nT3B0aW9ucy5kaWFsb2dPcHRpb25GbGFncywKLQkJImxvY2F0aW9uIiwgUHlNYWNfQnVpbGRQb2ludCwgZGlhbG9nT3B0aW9ucy5sb2NhdGlvbiwKLQkJImNsaWVudE5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuY2xpZW50TmFtZSwKLQkJIndpbmRvd1RpdGxlIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLndpbmRvd1RpdGxlLAotCQkiYWN0aW9uQnV0dG9uTGFiZWwiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuYWN0aW9uQnV0dG9uTGFiZWwsCi0JCSJjYW5jZWxCdXR0b25MYWJlbCIsIFB5TWFjX0J1aWxkU3RyMjU1LCAmZGlhbG9nT3B0aW9ucy5jYW5jZWxCdXR0b25MYWJlbCwKLQkJInNhdmVkRmlsZU5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuc2F2ZWRGaWxlTmFtZSwKLQkJIm1lc3NhZ2UiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMubWVzc2FnZSwKLQkJInByZWZlcmVuY2VLZXkiLCBQeU1hY19CdWlsZE9TVHlwZSwgZGlhbG9nT3B0aW9ucy5wcmVmZXJlbmNlS2V5Ci0JCSwicG9wdXBFeHRlbnNpb24iLCBPcHRSZXNPYmpfTmV3LCBkaWFsb2dPcHRpb25zLnBvcHVwRXh0ZW5zaW9uCi0JCSk7CisgICAgTmF2RGlhbG9nT3B0aW9ucyBkaWFsb2dPcHRpb25zOworICAgIE9TRXJyIGVycjsKKworICAgIGVyciA9IE5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zKCZkaWFsb2dPcHRpb25zKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlFcnJfTWFjKEVycm9yT2JqZWN0LCBlcnIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICJ7czpoLHM6bCxzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJixzOk8mLHM6TyYsczpPJn0iLAorICAgICAgICAidmVyc2lvbiIsIGRpYWxvZ09wdGlvbnMudmVyc2lvbiwKKyAgICAgICAgImRpYWxvZ09wdGlvbkZsYWdzIiwgZGlhbG9nT3B0aW9ucy5kaWFsb2dPcHRpb25GbGFncywKKyAgICAgICAgImxvY2F0aW9uIiwgUHlNYWNfQnVpbGRQb2ludCwgZGlhbG9nT3B0aW9ucy5sb2NhdGlvbiwKKyAgICAgICAgImNsaWVudE5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuY2xpZW50TmFtZSwKKyAgICAgICAgIndpbmRvd1RpdGxlIiwgUHlNYWNfQnVpbGRTdHIyNTUsICZkaWFsb2dPcHRpb25zLndpbmRvd1RpdGxlLAorICAgICAgICAiYWN0aW9uQnV0dG9uTGFiZWwiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuYWN0aW9uQnV0dG9uTGFiZWwsCisgICAgICAgICJjYW5jZWxCdXR0b25MYWJlbCIsIFB5TWFjX0J1aWxkU3RyMjU1LCAmZGlhbG9nT3B0aW9ucy5jYW5jZWxCdXR0b25MYWJlbCwKKyAgICAgICAgInNhdmVkRmlsZU5hbWUiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMuc2F2ZWRGaWxlTmFtZSwKKyAgICAgICAgIm1lc3NhZ2UiLCBQeU1hY19CdWlsZFN0cjI1NSwgJmRpYWxvZ09wdGlvbnMubWVzc2FnZSwKKyAgICAgICAgInByZWZlcmVuY2VLZXkiLCBQeU1hY19CdWlsZE9TVHlwZSwgZGlhbG9nT3B0aW9ucy5wcmVmZXJlbmNlS2V5CisgICAgICAgICwicG9wdXBFeHRlbnNpb24iLCBPcHRSZXNPYmpfTmV3LCBkaWFsb2dPcHRpb25zLnBvcHVwRXh0ZW5zaW9uCisgICAgICAgICk7CiB9CiAKIC8qIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBuYXZfbWV0aG9kc1tdID0gewotCXsiTmF2R2V0RmlsZSIsCShQeUNGdW5jdGlvbiluYXZfTmF2R2V0RmlsZSwJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZHZXRGaWxlX19kb2NfX30sCi0geyJOYXZQdXRGaWxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZQdXRGaWxlLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdlB1dEZpbGVfX2RvY19ffSwKLSB7Ik5hdkFza1NhdmVDaGFuZ2VzIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZBc2tTYXZlQ2hhbmdlcywJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZBc2tTYXZlQ2hhbmdlc19fZG9jX199LAotIHsiTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzLAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzX19kb2NfX30sCi0geyJOYXZBc2tEaXNjYXJkQ2hhbmdlcyIsCShQeUNGdW5jdGlvbiluYXZfTmF2QXNrRGlzY2FyZENoYW5nZXMsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2QXNrRGlzY2FyZENoYW5nZXNfX2RvY19ffSwKLSB7Ik5hdkNob29zZUZpbGUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNob29zZUZpbGUsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2Q2hvb3NlRmlsZV9fZG9jX199LAotIHsiTmF2Q2hvb3NlRm9sZGVyIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VGb2xkZXIsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2Q2hvb3NlRm9sZGVyX19kb2NfX30sCi0geyJOYXZDaG9vc2VWb2x1bWUiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkNob29zZVZvbHVtZSwJTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCW5hdl9OYXZDaG9vc2VWb2x1bWVfX2RvY19ffSwKLSB7Ik5hdkNob29zZU9iamVjdCIsCShQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlT2JqZWN0LAlNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywJbmF2X05hdkNob29zZU9iamVjdF9fZG9jX199LAotIHsiTmF2TmV3Rm9sZGVyIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZOZXdGb2xkZXIsCU1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAluYXZfTmF2TmV3Rm9sZGVyX19kb2NfX30sCisgICAgeyJOYXZHZXRGaWxlIiwgICAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkdldEZpbGUsICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkdldEZpbGVfX2RvY19ffSwKKyB7Ik5hdlB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pbmF2X05hdlB1dEZpbGUsICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdlB1dEZpbGVfX2RvY19ffSwKKyB7Ik5hdkFza1NhdmVDaGFuZ2VzIiwgIChQeUNGdW5jdGlvbiluYXZfTmF2QXNrU2F2ZUNoYW5nZXMsICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZBc2tTYXZlQ2hhbmdlc19fZG9jX199LAorIHsiTmF2Q3VzdG9tQXNrU2F2ZUNoYW5nZXMiLCAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUFza1NhdmVDaGFuZ2VzLCAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZDdXN0b21Bc2tTYXZlQ2hhbmdlc19fZG9jX199LAorIHsiTmF2QXNrRGlzY2FyZENoYW5nZXMiLCAgICAgICAoUHlDRnVuY3Rpb24pbmF2X05hdkFza0Rpc2NhcmRDaGFuZ2VzLCAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2QXNrRGlzY2FyZENoYW5nZXNfX2RvY19ffSwKKyB7Ik5hdkNob29zZUZpbGUiLCAgICAgIChQeUNGdW5jdGlvbiluYXZfTmF2Q2hvb3NlRmlsZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsICAgICBuYXZfTmF2Q2hvb3NlRmlsZV9fZG9jX199LAorIHsiTmF2Q2hvb3NlRm9sZGVyIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VGb2xkZXIsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZUZvbGRlcl9fZG9jX199LAorIHsiTmF2Q2hvb3NlVm9sdW1lIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VWb2x1bWUsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZVZvbHVtZV9fZG9jX199LAorIHsiTmF2Q2hvb3NlT2JqZWN0IiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDaG9vc2VPYmplY3QsICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCAgICAgbmF2X05hdkNob29zZU9iamVjdF9fZG9jX199LAorIHsiTmF2TmV3Rm9sZGVyIiwgICAgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZOZXdGb2xkZXIsICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgICAgIG5hdl9OYXZOZXdGb2xkZXJfX2RvY19ffSwKICNpZiAwCi0geyJOYXZDdXN0b21Db250cm9sIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZDdXN0b21Db250cm9sLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZDdXN0b21Db250cm9sX19kb2NfX30sCisgeyJOYXZDdXN0b21Db250cm9sIiwgICAoUHlDRnVuY3Rpb24pbmF2X05hdkN1c3RvbUNvbnRyb2wsICAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZDdXN0b21Db250cm9sX19kb2NfX30sCiAjZW5kaWYKLSB7Ik5hdlNlcnZpY2VzQ2FuUnVuIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZTZXJ2aWNlc0NhblJ1biwJTUVUSF9WQVJBUkdTLAluYXZfTmF2U2VydmljZXNDYW5SdW5fX2RvY19ffSwKLSB7Ik5hdlNlcnZpY2VzQXZhaWxhYmxlIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZTZXJ2aWNlc0F2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAluYXZfTmF2U2VydmljZXNBdmFpbGFibGVfX2RvY19ffSwKLSB7Ik5hdkxvYWQiLAkoUHlDRnVuY3Rpb24pbmF2X05hdkxvYWQsCU1FVEhfVkFSQVJHUywJbmF2X05hdkxvYWRfX2RvY19ffSwKLSB7Ik5hdlVubG9hZCIsCShQeUNGdW5jdGlvbiluYXZfTmF2VW5sb2FkLAlNRVRIX1ZBUkFSR1MsCW5hdl9OYXZVbmxvYWRfX2RvY19ffSwKLSB7Ik5hdkxpYnJhcnlWZXJzaW9uIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZMaWJyYXJ5VmVyc2lvbiwJTUVUSF9WQVJBUkdTLAluYXZfTmF2TGlicmFyeVZlcnNpb25fX2RvY19ffSwKLSB7Ik5hdkdldERlZmF1bHREaWFsb2dPcHRpb25zIiwJKFB5Q0Z1bmN0aW9uKW5hdl9OYXZHZXREZWZhdWx0RGlhbG9nT3B0aW9ucywJTUVUSF9WQVJBUkdTLAluYXZfTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnNfX2RvY19ffSwKLQl7TlVMTCwJIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfQkJLyogc2VudGluZWwgKi8KKyB7Ik5hdlNlcnZpY2VzQ2FuUnVuIiwgIChQeUNGdW5jdGlvbiluYXZfTmF2U2VydmljZXNDYW5SdW4sICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlNlcnZpY2VzQ2FuUnVuX19kb2NfX30sCisgeyJOYXZTZXJ2aWNlc0F2YWlsYWJsZSIsICAgICAgIChQeUNGdW5jdGlvbiluYXZfTmF2U2VydmljZXNBdmFpbGFibGUsICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdlNlcnZpY2VzQXZhaWxhYmxlX19kb2NfX30sCisgeyJOYXZMb2FkIiwgICAgKFB5Q0Z1bmN0aW9uKW5hdl9OYXZMb2FkLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkxvYWRfX2RvY19ffSwKKyB7Ik5hdlVubG9hZCIsICAoUHlDRnVuY3Rpb24pbmF2X05hdlVubG9hZCwgICAgIE1FVEhfVkFSQVJHUywgICBuYXZfTmF2VW5sb2FkX19kb2NfX30sCisgeyJOYXZMaWJyYXJ5VmVyc2lvbiIsICAoUHlDRnVuY3Rpb24pbmF2X05hdkxpYnJhcnlWZXJzaW9uLCAgICAgTUVUSF9WQVJBUkdTLCAgIG5hdl9OYXZMaWJyYXJ5VmVyc2lvbl9fZG9jX199LAorIHsiTmF2R2V0RGVmYXVsdERpYWxvZ09wdGlvbnMiLCAoUHlDRnVuY3Rpb24pbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zLCAgICBNRVRIX1ZBUkFSR1MsICAgbmF2X05hdkdldERlZmF1bHREaWFsb2dPcHRpb25zX19kb2NfX30sCisgICAge05VTEwsICAgICAgIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfSAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICgqbXVzdCogYmUgY2FsbGVkIGluaXROYXYpICovCiAKLXN0YXRpYyBjaGFyIE5hdl9tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0gCitzdGF0aWMgY2hhciBOYXZfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9CiAiSW50ZXJmYWNlIHRvIE5hdmlnYXRpb24gU2VydmljZXNcbiIKICJNb3N0IGNhbGxzIGFjY2VwdCBhIE5hdkRpYWxvZ09wdGlvbnMgZGljdGlvbmFyeSBvciBrZXl3b3JkcyB3aXRoIHRoZSBzYW1lIG5hbWVzLCBwYXNzIHt9XG4iCiAiaWYgeW91IHdhbnQgdGhlIGRlZmF1bHQgb3B0aW9ucy5cbiIKQEAgLTkzMCwzOSArOTMwLDM5IEBACiB2b2lkCiBpbml0TmF2KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm0sICpkOwotCQotCWlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCB0aGUgTmF2IG1vZHVsZSBpcyByZW1vdmVkLiIsIDEpKQotCQlyZXR1cm47CisgICAgUHlPYmplY3QgKm0sICpkOworCisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBOYXYgbW9kdWxlIGlzIHJlbW92ZWQuIiwgMSkpCisgICAgICAgIHJldHVybjsKIAogI2lmZGVmIF9fTFA2NF9fCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTmF2aWdhdGlvbiBTZXJ2aWNlcyBub3QgYXZhaWxhYmxlIGluIDY0LWJpdCBtb2RlIik7Ci0JcmV0dXJuOworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbXBvcnRFcnJvciwgIk5hdmlnYXRpb24gU2VydmljZXMgbm90IGF2YWlsYWJsZSBpbiA2NC1iaXQgbW9kZSIpOworICAgIHJldHVybjsKIAotI2Vsc2UJLyogIV9fTFA2NF9fICovCisjZWxzZSAgIC8qICFfX0xQNjRfXyAqLwogCi0JLyogVGVzdCB0aGF0IHdlIGhhdmUgTmF2U2VydmljZXMgKi8KLQlpZiAoICFOYXZTZXJ2aWNlc0F2YWlsYWJsZSgpICkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsICJOYXZpZ2F0aW9uIFNlcnZpY2VzIG5vdCBhdmFpbGFibGUiKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KLQltID0gUHlfSW5pdE1vZHVsZTQoIk5hdiIsIG5hdl9tZXRob2RzLAotCQlOYXZfbW9kdWxlX2RvY3VtZW50YXRpb24sCi0JCShQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOworICAgIC8qIFRlc3QgdGhhdCB3ZSBoYXZlIE5hdlNlcnZpY2VzICovCisgICAgaWYgKCAhTmF2U2VydmljZXNBdmFpbGFibGUoKSApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiTmF2aWdhdGlvbiBTZXJ2aWNlcyBub3QgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGU0KCJOYXYiLCBuYXZfbWV0aG9kcywKKyAgICAgICAgTmF2X21vZHVsZV9kb2N1bWVudGF0aW9uLAorICAgICAgICAoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKIAotCS8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRXJyb3JPYmplY3QgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJOYXYuZXJyb3IiKTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiZXJyb3IiLCBFcnJvck9iamVjdCk7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBFcnJvck9iamVjdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIk5hdi5lcnJvciIpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKIAotCS8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCi0JCi0JLyogU2V0IFVQUHMgKi8KLQlteV9ldmVudFByb2NVUFAgPSBOZXdOYXZFdmVudFVQUChteV9ldmVudFByb2MpOwotCW15X3ByZXZpZXdQcm9jVVBQID0gTmV3TmF2UHJldmlld1VQUChteV9wcmV2aWV3UHJvYyk7Ci0JbXlfZmlsdGVyUHJvY1VQUCA9IE5ld05hdk9iamVjdEZpbHRlclVQUChteV9maWx0ZXJQcm9jKTsKKyAgICAvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLworCisgICAgLyogU2V0IFVQUHMgKi8KKyAgICBteV9ldmVudFByb2NVUFAgPSBOZXdOYXZFdmVudFVQUChteV9ldmVudFByb2MpOworICAgIG15X3ByZXZpZXdQcm9jVVBQID0gTmV3TmF2UHJldmlld1VQUChteV9wcmV2aWV3UHJvYyk7CisgICAgbXlfZmlsdGVyUHJvY1VQUCA9IE5ld05hdk9iamVjdEZpbHRlclVQUChteV9maWx0ZXJQcm9jKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQkKKwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9PU0FUZXJtaW5vbG9neS5jIGIvTWFjL01vZHVsZXMvT1NBVGVybWlub2xvZ3kuYwppbmRleCBhN2JlY2Y3Li4yMTE0ZDA3IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9PU0FUZXJtaW5vbG9neS5jCisrKyBiL01hYy9Nb2R1bGVzL09TQVRlcm1pbm9sb2d5LmMKQEAgLTE4LDg1ICsxOCw4NSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5T1NBX0dldEFwcFRlcm1pbm9sb2d5KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKLQlBRURlc2MgdGhlRGVzYyA9IHswLDB9OwotCUZTU3BlYyBmc3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgZGVmYXVsdENvbXBvbmVudCA9IE5VTEw7Ci0JU0ludDE2IGRlZmF1bHRUZXJtaW5vbG9neSA9IDA7Ci0JQm9vbGVhbiBkaWRMYXVuY2ggPSAwOwotCU9TQUVycm9yIGVycjsKLQlsb25nIG1vZGVGbGFncyA9IDA7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnxpIiwgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLCAmbW9kZUZsYWdzKSkKLQkJIHJldHVybiBOVUxMOwotCQotCS8qCi0JKiogTm90ZSB0aGF0IHdlIGhhdmUgdG8gdXNlIHRoZSBBcHBsZVNjcmlwdCBjb21wb25lbnQgaGVyZS4gV2hvIGtub3dzIHdoeQotCSoqIE9TQUdldEFwcFRlcm1pbm9sb2d5IHNob3VsZCByZXF1aXJlIGEgc2NyaXB0aW5nIGNvbXBvbmVudCBpbiB0aGUKLQkqKiBmaXJzdCBwbGFjZSwgYnV0IGl0IGRvZXMuIE5vdGU6IGRvZXNuJ3Qgd29yayB3aXRoIHRoZSBnZW5lcmljIHNjcmlwdGluZwotCSoqIGNvbXBvbmVudCwgd2hpY2ggaXMgdW5mb3J0dW5hdGUgYXMgdGhlIEFTIGNvbXBvbmVudCBpcyBjdXJyZW50bHkgdmVyeQotCSoqIHNsb3cgKH4xIHNlYz8pIHRvIGxvYWQsIGJ1dCB3ZSBqdXN0IGhhdmUgdG8gbGl2ZSB3aXRoIHRoaXMuCi0JKi8KLQlkZWZhdWx0Q29tcG9uZW50ID0gT3BlbkRlZmF1bHRDb21wb25lbnQgKGtPU0FDb21wb25lbnRUeXBlLCAnYXNjcicpOwotCWVyciA9IEdldENvbXBvbmVudEluc3RhbmNlRXJyb3IgKGRlZmF1bHRDb21wb25lbnQpOwotCWlmIChlcnIpIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCWVyciA9IE9TQUdldEFwcFRlcm1pbm9sb2d5ICgKLSAgICAJZGVmYXVsdENvbXBvbmVudCwgCi0gICAgCWtPU0FNb2RlTnVsbCwKLSAgICAJJmZzcywgCi0gICAgCWRlZmF1bHRUZXJtaW5vbG9neSwgCi0gICAgCSZkaWRMYXVuY2gsIAotICAgIAkmdGhlRGVzYwotCSk7Ci0JaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maSIsIEFFRGVzY19OZXcsICZ0aGVEZXNjLCBkaWRMYXVuY2gpOworICAgIEFFRGVzYyB0aGVEZXNjID0gezAsMH07CisgICAgRlNTcGVjIGZzczsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBkZWZhdWx0Q29tcG9uZW50ID0gTlVMTDsKKyAgICBTSW50MTYgZGVmYXVsdFRlcm1pbm9sb2d5ID0gMDsKKyAgICBCb29sZWFuIGRpZExhdW5jaCA9IDA7CisgICAgT1NBRXJyb3IgZXJyOworICAgIGxvbmcgbW9kZUZsYWdzID0gMDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ8aSIsIFB5TWFjX0dldEZTU3BlYywgJmZzcywgJm1vZGVGbGFncykpCisgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKgorICAgICoqIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVzZSB0aGUgQXBwbGVTY3JpcHQgY29tcG9uZW50IGhlcmUuIFdobyBrbm93cyB3aHkKKyAgICAqKiBPU0FHZXRBcHBUZXJtaW5vbG9neSBzaG91bGQgcmVxdWlyZSBhIHNjcmlwdGluZyBjb21wb25lbnQgaW4gdGhlCisgICAgKiogZmlyc3QgcGxhY2UsIGJ1dCBpdCBkb2VzLiBOb3RlOiBkb2Vzbid0IHdvcmsgd2l0aCB0aGUgZ2VuZXJpYyBzY3JpcHRpbmcKKyAgICAqKiBjb21wb25lbnQsIHdoaWNoIGlzIHVuZm9ydHVuYXRlIGFzIHRoZSBBUyBjb21wb25lbnQgaXMgY3VycmVudGx5IHZlcnkKKyAgICAqKiBzbG93ICh+MSBzZWM/KSB0byBsb2FkLCBidXQgd2UganVzdCBoYXZlIHRvIGxpdmUgd2l0aCB0aGlzLgorICAgICovCisgICAgZGVmYXVsdENvbXBvbmVudCA9IE9wZW5EZWZhdWx0Q29tcG9uZW50IChrT1NBQ29tcG9uZW50VHlwZSwgJ2FzY3InKTsKKyAgICBlcnIgPSBHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIChkZWZhdWx0Q29tcG9uZW50KTsKKyAgICBpZiAoZXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBlcnIgPSBPU0FHZXRBcHBUZXJtaW5vbG9neSAoCisgICAgZGVmYXVsdENvbXBvbmVudCwKKyAgICBrT1NBTW9kZU51bGwsCisgICAgJmZzcywKKyAgICBkZWZhdWx0VGVybWlub2xvZ3ksCisgICAgJmRpZExhdW5jaCwKKyAgICAmdGhlRGVzYworICAgICk7CisgICAgaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8maSIsIEFFRGVzY19OZXcsICZ0aGVEZXNjLCBkaWRMYXVuY2gpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogUHlPU0FfR2V0U3lzVGVybWlub2xvZ3koUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotCUFFRGVzYyB0aGVEZXNjID0gezAsMH07Ci0JQ29tcG9uZW50SW5zdGFuY2UgZGVmYXVsdENvbXBvbmVudCA9IE5VTEw7Ci0JU0ludDE2IGRlZmF1bHRUZXJtaW5vbG9neSA9IDA7Ci0JT1NBRXJyb3IgZXJyOwotCQotCS8qIEFjY2VwdCBhbnkgYXJncyBmb3Igc2FrZSBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlbiBpZ25vcmUgdGhlbS4gKi8KKyAgICBBRURlc2MgdGhlRGVzYyA9IHswLDB9OworICAgIENvbXBvbmVudEluc3RhbmNlIGRlZmF1bHRDb21wb25lbnQgPSBOVUxMOworICAgIFNJbnQxNiBkZWZhdWx0VGVybWlub2xvZ3kgPSAwOworICAgIE9TQUVycm9yIGVycjsKIAotCWRlZmF1bHRDb21wb25lbnQgPSBPcGVuRGVmYXVsdENvbXBvbmVudCAoa09TQUNvbXBvbmVudFR5cGUsICdhc2NyJyk7Ci0JZXJyID0gR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciAoZGVmYXVsdENvbXBvbmVudCk7Ci0JaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JZXJyID0gT1NBR2V0U3lzVGVybWlub2xvZ3kgKAotICAgIAlkZWZhdWx0Q29tcG9uZW50LCAKLSAgICAJa09TQU1vZGVOdWxsLAotICAgIAlkZWZhdWx0VGVybWlub2xvZ3ksIAotICAgIAkmdGhlRGVzYwotCSk7Ci0JaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQUVEZXNjX05ldywgJnRoZURlc2MpOworICAgIC8qIEFjY2VwdCBhbnkgYXJncyBmb3Igc2FrZSBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlbiBpZ25vcmUgdGhlbS4gKi8KKworICAgIGRlZmF1bHRDb21wb25lbnQgPSBPcGVuRGVmYXVsdENvbXBvbmVudCAoa09TQUNvbXBvbmVudFR5cGUsICdhc2NyJyk7CisgICAgZXJyID0gR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciAoZGVmYXVsdENvbXBvbmVudCk7CisgICAgaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgZXJyID0gT1NBR2V0U3lzVGVybWlub2xvZ3kgKAorICAgIGRlZmF1bHRDb21wb25lbnQsCisgICAga09TQU1vZGVOdWxsLAorICAgIGRlZmF1bHRUZXJtaW5vbG9neSwKKyAgICAmdGhlRGVzYworICAgICk7CisgICAgaWYgKGVycikgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQUVEZXNjX05ldywgJnRoZURlc2MpOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0vKiAKKy8qCiAgKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgT1NBVGVybWlub2xvZ3lfbWV0aG9kc1tdID0KIHsKICNpZm5kZWYgX19MUDY0X18KLSAgCXsiR2V0QXBwVGVybWlub2xvZ3kiLCAKLQkJKFB5Q0Z1bmN0aW9uKSBQeU9TQV9HZXRBcHBUZXJtaW5vbG9neSwKLQkJTUVUSF9WQVJBUkdTLAotCQkiR2V0IGFuIGFwcGxpY2F0aW9uJ3MgdGVybWlub2xvZ3kuIEdldEFwcFRlcm1pbm9sb2d5KHBhdGgpIC0tPiBBRURlc2MifSwKLSAgCXsiR2V0U3lzVGVybWlub2xvZ3kiLCAKLQkJKFB5Q0Z1bmN0aW9uKSBQeU9TQV9HZXRTeXNUZXJtaW5vbG9neSwKLQkJTUVUSF9WQVJBUkdTLAotCQkiR2V0IHRoZSBBcHBsZVNjcmlwdCBsYW5ndWFnZSdzIHRlcm1pbm9sb2d5LiBHZXRTeXNUZXJtaW5vbG9neSgpIC0tPiBBRURlc2MifSwKKyAgICB7IkdldEFwcFRlcm1pbm9sb2d5IiwKKyAgICAgICAgKFB5Q0Z1bmN0aW9uKSBQeU9TQV9HZXRBcHBUZXJtaW5vbG9neSwKKyAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICAiR2V0IGFuIGFwcGxpY2F0aW9uJ3MgdGVybWlub2xvZ3kuIEdldEFwcFRlcm1pbm9sb2d5KHBhdGgpIC0tPiBBRURlc2MifSwKKyAgICB7IkdldFN5c1Rlcm1pbm9sb2d5IiwKKyAgICAgICAgKFB5Q0Z1bmN0aW9uKSBQeU9TQV9HZXRTeXNUZXJtaW5vbG9neSwKKyAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICAiR2V0IHRoZSBBcHBsZVNjcmlwdCBsYW5ndWFnZSdzIHRlcm1pbm9sb2d5LiBHZXRTeXNUZXJtaW5vbG9neSgpIC0tPiBBRURlc2MifSwKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQl7TlVMTCwgKFB5Q0Z1bmN0aW9uKSBOVUxMLCAwLCBOVUxMfQorICAgIHtOVUxMLCAoUHlDRnVuY3Rpb24pIE5VTEwsIDAsIE5VTEx9CiB9OwogCiB2b2lkCiBpbml0T1NBVGVybWlub2xvZ3kodm9pZCkKIHsKLQlpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIE9TQVRlcm1pbm9sb2d5IG1vZHVsZSBpcyByZW1vdmVkLiIsIDEpIDwgMCkKLQkJcmV0dXJuOwotCVB5X0luaXRNb2R1bGUoIk9TQVRlcm1pbm9sb2d5IiwgT1NBVGVybWlub2xvZ3lfbWV0aG9kcyk7CisgICAgaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBPU0FUZXJtaW5vbG9neSBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeV9Jbml0TW9kdWxlKCJPU0FUZXJtaW5vbG9neSIsIE9TQVRlcm1pbm9sb2d5X21ldGhvZHMpOwogfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvX3NjcHJveHkuYyBiL01hYy9Nb2R1bGVzL19zY3Byb3h5LmMKaW5kZXggOWY0YzFhNC4uZGQ1YTI5MyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvX3NjcHJveHkuYworKysgYi9NYWMvTW9kdWxlcy9fc2Nwcm94eS5jCkBAIC01LDE2MiArNSwxNjIgQEAKICNpbmNsdWRlIDxQeXRob24uaD4KICNpbmNsdWRlIDxTeXN0ZW1Db25maWd1cmF0aW9uL1N5c3RlbUNvbmZpZ3VyYXRpb24uaD4KIAotc3RhdGljIGludDMyX3QgCitzdGF0aWMgaW50MzJfdAogY2ZudW1fdG9faW50MzIoQ0ZOdW1iZXJSZWYgbnVtKQogewotCWludDMyX3QgcmVzdWx0OworICAgIGludDMyX3QgcmVzdWx0OwogCi0JQ0ZOdW1iZXJHZXRWYWx1ZShudW0sIGtDRk51bWJlclNJbnQzMlR5cGUsICZyZXN1bHQpOwotCXJldHVybiByZXN1bHQ7CisgICAgQ0ZOdW1iZXJHZXRWYWx1ZShudW0sIGtDRk51bWJlclNJbnQzMlR5cGUsICZyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKIGNmc3RyaW5nX3RvX3B5c3RyaW5nKENGU3RyaW5nUmVmIHJlZikKIHsKLQljb25zdCBjaGFyKiBzOyAKKyAgICBjb25zdCBjaGFyKiBzOwogCi0JcyA9IENGU3RyaW5nR2V0Q1N0cmluZ1B0cihyZWYsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7Ci0JaWYgKHMpIHsKLQkJcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7CisgICAgcyA9IENGU3RyaW5nR2V0Q1N0cmluZ1B0cihyZWYsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7CisgICAgaWYgKHMpIHsKKyAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcocyk7CiAKLQl9IGVsc2UgewotCQlDRkluZGV4IGxlbiA9IENGU3RyaW5nR2V0TGVuZ3RoKHJlZik7Ci0JCUJvb2xlYW4gb2s7Ci0JCVB5T2JqZWN0KiByZXN1bHQ7Ci0JCXJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbio0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBDRkluZGV4IGxlbiA9IENGU3RyaW5nR2V0TGVuZ3RoKHJlZik7CisgICAgICAgIEJvb2xlYW4gb2s7CisgICAgICAgIFB5T2JqZWN0KiByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbio0KTsKIAotCQlvayA9IENGU3RyaW5nR2V0Q1N0cmluZyhyZWYsIAotCQkJCVB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpLAotCQkJCVB5U3RyaW5nX0dFVF9TSVpFKHJlc3VsdCksCi0JCQkJa0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKLQkJaWYgKCFvaykgewotCQkJUHlfREVDUkVGKHJlc3VsdCk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCV9QeVN0cmluZ19SZXNpemUoJnJlc3VsdCwgCi0JCQkJc3RybGVuKFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CisgICAgICAgIG9rID0gQ0ZTdHJpbmdHZXRDU3RyaW5nKHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfR0VUX1NJWkUocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7CisgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfUHlTdHJpbmdfUmVzaXplKCZyZXN1bHQsCisgICAgICAgICAgICAgICAgc3RybGVuKFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0KgogZ2V0X3Byb3h5X3NldHRpbmdzKFB5T2JqZWN0KiBtb2QgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpKQogewotCUNGRGljdGlvbmFyeVJlZiBwcm94eURpY3QgPSBOVUxMOwotCUNGTnVtYmVyUmVmIGFOdW0gPSBOVUxMOwotCUNGQXJyYXlSZWYgYW5BcnJheSA9IE5VTEw7Ci0JUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7Ci0JUHlPYmplY3QqIHY7Ci0JaW50IHI7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCA9IE5VTEw7CisgICAgQ0ZOdW1iZXJSZWYgYU51bSA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBhbkFycmF5ID0gTlVMTDsKKyAgICBQeU9iamVjdCogcmVzdWx0ID0gTlVMTDsKKyAgICBQeU9iamVjdCogdjsKKyAgICBpbnQgcjsKIAotCXByb3h5RGljdCA9IFNDRHluYW1pY1N0b3JlQ29weVByb3hpZXMoTlVMTCk7Ci0JaWYgKCFwcm94eURpY3QpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9CisgICAgcHJveHlEaWN0ID0gU0NEeW5hbWljU3RvcmVDb3B5UHJveGllcyhOVUxMKTsKKyAgICBpZiAoIXByb3h5RGljdCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KIAotCXJlc3VsdCA9IFB5RGljdF9OZXcoKTsKLQlpZiAocmVzdWx0ID09IE5VTEwpIGdvdG8gZXJyb3I7CisgICAgcmVzdWx0ID0gUHlEaWN0X05ldygpOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCWlmICgma1NDUHJvcE5ldFByb3hpZXNFeGNsdWRlU2ltcGxlSG9zdG5hbWVzICE9IE5VTEwpIHsKLQkJYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgCi0JCQlrU0NQcm9wTmV0UHJveGllc0V4Y2x1ZGVTaW1wbGVIb3N0bmFtZXMpOwotCQlpZiAoYU51bSA9PSBOVUxMKSB7Ci0JCQl2ID0gUHlCb29sX0Zyb21Mb25nKDEpOwotCQl9IGVsc2UgewotCQkJdiA9IFB5Qm9vbF9Gcm9tTG9uZyhjZm51bV90b19pbnQzMihhTnVtKSk7Ci0JCX0KLQl9ICBlbHNlIHsKLQkJdiA9IFB5Qm9vbF9Gcm9tTG9uZygxKTsKLQl9CisgICAgaWYgKCZrU0NQcm9wTmV0UHJveGllc0V4Y2x1ZGVTaW1wbGVIb3N0bmFtZXMgIT0gTlVMTCkgeworICAgICAgICBhTnVtID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LAorICAgICAgICAgICAga1NDUHJvcE5ldFByb3hpZXNFeGNsdWRlU2ltcGxlSG9zdG5hbWVzKTsKKyAgICAgICAgaWYgKGFOdW0gPT0gTlVMTCkgeworICAgICAgICAgICAgdiA9IFB5Qm9vbF9Gcm9tTG9uZygxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHYgPSBQeUJvb2xfRnJvbUxvbmcoY2ZudW1fdG9faW50MzIoYU51bSkpOworICAgICAgICB9CisgICAgfSAgZWxzZSB7CisgICAgICAgIHYgPSBQeUJvb2xfRnJvbUxvbmcoMSk7CisgICAgfQogCi0JaWYgKHYgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICBpZiAodiA9PSBOVUxMKSBnb3RvIGVycm9yOwogCi0JciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwgImV4Y2x1ZGVfc2ltcGxlIiwgdik7Ci0JUHlfREVDUkVGKHYpOyB2ID0gTlVMTDsKLQlpZiAociA9PSAtMSkgZ290byBlcnJvcjsKKyAgICByID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LCAiZXhjbHVkZV9zaW1wbGUiLCB2KTsKKyAgICBQeV9ERUNSRUYodik7IHYgPSBOVUxMOworICAgIGlmIChyID09IC0xKSBnb3RvIGVycm9yOwogCi0JYW5BcnJheSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgCi0JCQlrU0NQcm9wTmV0UHJveGllc0V4Y2VwdGlvbnNMaXN0KTsKLQlpZiAoYW5BcnJheSAhPSBOVUxMKSB7Ci0JCUNGSW5kZXggbGVuID0gQ0ZBcnJheUdldENvdW50KGFuQXJyYXkpOwotCQlDRkluZGV4IGk7Ci0JCXYgPSBQeVR1cGxlX05ldyhsZW4pOwotCQlpZiAodiA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgIGFuQXJyYXkgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsCisgICAgICAgICAgICAgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzRXhjZXB0aW9uc0xpc3QpOworICAgIGlmIChhbkFycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgQ0ZJbmRleCBsZW4gPSBDRkFycmF5R2V0Q291bnQoYW5BcnJheSk7CisgICAgICAgIENGSW5kZXggaTsKKyAgICAgICAgdiA9IFB5VHVwbGVfTmV3KGxlbik7CisgICAgICAgIGlmICh2ID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKLQkJciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwgImV4Y2VwdGlvbnMiLCB2KTsKLQkJUHlfREVDUkVGKHYpOwotCQlpZiAociA9PSAtMSkgZ290byBlcnJvcjsKKyAgICAgICAgciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwgImV4Y2VwdGlvbnMiLCB2KTsKKyAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICBpZiAociA9PSAtMSkgZ290byBlcnJvcjsKIAotCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCUNGU3RyaW5nUmVmIGFTdHJpbmcgPSBOVUxMOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIENGU3RyaW5nUmVmIGFTdHJpbmcgPSBOVUxMOwogCi0JCQlhU3RyaW5nID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleChhbkFycmF5LCBpKTsKLQkJCWlmIChhU3RyaW5nID09IE5VTEwpIHsKLQkJCQlQeVR1cGxlX1NldEl0ZW0odiwgaSwgUHlfTm9uZSk7Ci0JCQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQkJfSBlbHNlIHsKLQkJCQlQeU9iamVjdCogdCA9IGNmc3RyaW5nX3RvX3B5c3RyaW5nKGFTdHJpbmcpOwotCQkJCWlmICghdCkgewotCQkJCQlQeVR1cGxlX1NldEl0ZW0odiwgaSwgUHlfTm9uZSk7Ci0JCQkJCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJCQl9IGVsc2UgewotCQkJCQlQeVR1cGxlX1NldEl0ZW0odiwgaSwgdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgYVN0cmluZyA9IENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoYW5BcnJheSwgaSk7CisgICAgICAgICAgICBpZiAoYVN0cmluZyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIGksIFB5X05vbmUpOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlPYmplY3QqIHQgPSBjZnN0cmluZ190b19weXN0cmluZyhhU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAoIXQpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIGksIFB5X05vbmUpOworICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCUNGUmVsZWFzZShwcm94eURpY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgQ0ZSZWxlYXNlKHByb3h5RGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIAogZXJyb3I6Ci0JaWYgKHByb3h5RGljdCkgIENGUmVsZWFzZShwcm94eURpY3QpOwotCVB5X1hERUNSRUYocmVzdWx0KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBpZiAocHJveHlEaWN0KSAgQ0ZSZWxlYXNlKHByb3h5RGljdCk7CisgICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIHJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50CiBzZXRfcHJveHkoUHlPYmplY3QqIHByb3hpZXMsIGNoYXIqIHByb3RvLCBDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0LAotCQlDRlN0cmluZ1JlZiBlbmFibGVkS2V5LCAKLQkJQ0ZTdHJpbmdSZWYgaG9zdEtleSwgQ0ZTdHJpbmdSZWYgcG9ydEtleSkKKyAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBlbmFibGVkS2V5LAorICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIGhvc3RLZXksIENGU3RyaW5nUmVmIHBvcnRLZXkpCiB7Ci0JQ0ZOdW1iZXJSZWYgYU51bTsKKyAgICBDRk51bWJlclJlZiBhTnVtOwogCi0JYU51bSA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgZW5hYmxlZEtleSk7Ci0JaWYgKGFOdW0gJiYgY2ZudW1fdG9faW50MzIoYU51bSkpIHsKLQkJQ0ZTdHJpbmdSZWYgaG9zdFN0cmluZzsKKyAgICBhTnVtID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LCBlbmFibGVkS2V5KTsKKyAgICBpZiAoYU51bSAmJiBjZm51bV90b19pbnQzMihhTnVtKSkgeworICAgICAgICBDRlN0cmluZ1JlZiBob3N0U3RyaW5nOwogCi0JCWhvc3RTdHJpbmcgPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIGhvc3RLZXkpOwotCQlhTnVtID0gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocHJveHlEaWN0LCBwb3J0S2V5KTsKKyAgICAgICAgaG9zdFN0cmluZyA9IENGRGljdGlvbmFyeUdldFZhbHVlKHByb3h5RGljdCwgaG9zdEtleSk7CisgICAgICAgIGFOdW0gPSBDRkRpY3Rpb25hcnlHZXRWYWx1ZShwcm94eURpY3QsIHBvcnRLZXkpOwogCi0JCWlmIChob3N0U3RyaW5nKSB7Ci0JCQlpbnQgcjsKLQkJCVB5T2JqZWN0KiBoID0gY2ZzdHJpbmdfdG9fcHlzdHJpbmcoaG9zdFN0cmluZyk7Ci0JCQlQeU9iamVjdCogdjsKLQkJCWlmIChoKSB7Ci0JCQkJaWYgKGFOdW0pIHsKLQkJCQkJaW50MzJfdCBwb3J0ID0gY2ZudW1fdG9faW50MzIoYU51bSk7Ci0JCQkJCXYgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJodHRwOi8vJXM6JWxkIiwKLQkJCQkJCVB5U3RyaW5nX0FTX1NUUklORyhoKSwKLQkJCQkJCShsb25nKXBvcnQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXYgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJodHRwOi8vJXMiLAotCQkJCQkJUHlTdHJpbmdfQVNfU1RSSU5HKGgpKTsKLQkJCQl9Ci0JCQkJUHlfREVDUkVGKGgpOwotCQkJCWlmICghdikgcmV0dXJuIC0xOwotCQkJCXIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhwcm94aWVzLCBwcm90bywKLQkJCQkJdik7Ci0JCQkJUHlfREVDUkVGKHYpOwotCQkJCXJldHVybiByOwotCQkJfQotCQl9CisgICAgICAgIGlmIChob3N0U3RyaW5nKSB7CisgICAgICAgICAgICBpbnQgcjsKKyAgICAgICAgICAgIFB5T2JqZWN0KiBoID0gY2ZzdHJpbmdfdG9fcHlzdHJpbmcoaG9zdFN0cmluZyk7CisgICAgICAgICAgICBQeU9iamVjdCogdjsKKyAgICAgICAgICAgIGlmIChoKSB7CisgICAgICAgICAgICAgICAgaWYgKGFOdW0pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3J0ID0gY2ZudW1fdG9faW50MzIoYU51bSk7CisgICAgICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJodHRwOi8vJXM6JWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKXBvcnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBQeVN0cmluZ19Gcm9tRm9ybWF0KCJodHRwOi8vJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGgpOworICAgICAgICAgICAgICAgIGlmICghdikgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHIgPSBQeURpY3RfU2V0SXRlbVN0cmluZyhwcm94aWVzLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgdik7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQl9Ci0JcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAKQEAgLTE2OCw2NCArMTY4LDY0IEBACiBzdGF0aWMgUHlPYmplY3QqCiBnZXRfcHJveGllcyhQeU9iamVjdCogbW9kIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKSkKIHsKLQlQeU9iamVjdCogcmVzdWx0ID0gTlVMTDsKLQlpbnQgcjsKLQlDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0ID0gTlVMTDsKKyAgICBQeU9iamVjdCogcmVzdWx0ID0gTlVMTDsKKyAgICBpbnQgcjsKKyAgICBDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0ID0gTlVMTDsKIAotCXByb3h5RGljdCA9IFNDRHluYW1pY1N0b3JlQ29weVByb3hpZXMoTlVMTCk7Ci0JaWYgKHByb3h5RGljdCA9PSBOVUxMKSB7Ci0JCXJldHVybiBQeURpY3RfTmV3KCk7Ci0JfQorICAgIHByb3h5RGljdCA9IFNDRHluYW1pY1N0b3JlQ29weVByb3hpZXMoTlVMTCk7CisgICAgaWYgKHByb3h5RGljdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeURpY3RfTmV3KCk7CisgICAgfQogCi0JcmVzdWx0ID0gUHlEaWN0X05ldygpOwotCWlmIChyZXN1bHQgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICByZXN1bHQgPSBQeURpY3RfTmV3KCk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSBnb3RvIGVycm9yOwogCi0JciA9IHNldF9wcm94eShyZXN1bHQsICJodHRwIiwgcHJveHlEaWN0LAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBFbmFibGUsCi0JCWtTQ1Byb3BOZXRQcm94aWVzSFRUUFByb3h5LAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBQb3J0KTsKLQlpZiAociA9PSAtMSkgZ290byBlcnJvcjsKLQlyID0gc2V0X3Byb3h5KHJlc3VsdCwgImh0dHBzIiwgcHJveHlEaWN0LAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBTRW5hYmxlLAotCQlrU0NQcm9wTmV0UHJveGllc0hUVFBTUHJveHksCi0JCWtTQ1Byb3BOZXRQcm94aWVzSFRUUFNQb3J0KTsKLQlpZiAociA9PSAtMSkgZ290byBlcnJvcjsKLQlyID0gc2V0X3Byb3h5KHJlc3VsdCwgImZ0cCIsIHByb3h5RGljdCwKLQkJa1NDUHJvcE5ldFByb3hpZXNGVFBFbmFibGUsCi0JCWtTQ1Byb3BOZXRQcm94aWVzRlRQUHJveHksCi0JCWtTQ1Byb3BOZXRQcm94aWVzRlRQUG9ydCk7Ci0JaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7Ci0JciA9IHNldF9wcm94eShyZXN1bHQsICJnb3BoZXIiLCBwcm94eURpY3QsCi0JCWtTQ1Byb3BOZXRQcm94aWVzR29waGVyRW5hYmxlLAotCQlrU0NQcm9wTmV0UHJveGllc0dvcGhlclByb3h5LAotCQlrU0NQcm9wTmV0UHJveGllc0dvcGhlclBvcnQpOwotCWlmIChyID09IC0xKSBnb3RvIGVycm9yOworICAgIHIgPSBzZXRfcHJveHkocmVzdWx0LCAiaHR0cCIsIHByb3h5RGljdCwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQRW5hYmxlLAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0hUVFBQcm94eSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQUG9ydCk7CisgICAgaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CisgICAgciA9IHNldF9wcm94eShyZXN1bHQsICJodHRwcyIsIHByb3h5RGljdCwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQU0VuYWJsZSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNIVFRQU1Byb3h5LAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0hUVFBTUG9ydCk7CisgICAgaWYgKHIgPT0gLTEpIGdvdG8gZXJyb3I7CisgICAgciA9IHNldF9wcm94eShyZXN1bHQsICJmdHAiLCBwcm94eURpY3QsCisgICAgICAgIGtTQ1Byb3BOZXRQcm94aWVzRlRQRW5hYmxlLAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0ZUUFByb3h5LAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0ZUUFBvcnQpOworICAgIGlmIChyID09IC0xKSBnb3RvIGVycm9yOworICAgIHIgPSBzZXRfcHJveHkocmVzdWx0LCAiZ29waGVyIiwgcHJveHlEaWN0LAorICAgICAgICBrU0NQcm9wTmV0UHJveGllc0dvcGhlckVuYWJsZSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNHb3BoZXJQcm94eSwKKyAgICAgICAga1NDUHJvcE5ldFByb3hpZXNHb3BoZXJQb3J0KTsKKyAgICBpZiAociA9PSAtMSkgZ290byBlcnJvcjsKIAotCUNGUmVsZWFzZShwcm94eURpY3QpOwotCXJldHVybiByZXN1bHQ7CisgICAgQ0ZSZWxlYXNlKHByb3h5RGljdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKIGVycm9yOgotCWlmIChwcm94eURpY3QpICBDRlJlbGVhc2UocHJveHlEaWN0KTsKLQlQeV9YREVDUkVGKHJlc3VsdCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgaWYgKHByb3h5RGljdCkgIENGUmVsZWFzZShwcm94eURpY3QpOworICAgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZF9tZXRob2RzW10gPSB7Ci0JewotCQkiX2dldF9wcm94eV9zZXR0aW5ncyIsCi0JCShQeUNGdW5jdGlvbilnZXRfcHJveHlfc2V0dGluZ3MsCi0JCU1FVEhfTk9BUkdTLAotCQlOVUxMLAotCX0sCi0JewotCQkiX2dldF9wcm94aWVzIiwKLQkJKFB5Q0Z1bmN0aW9uKWdldF9wcm94aWVzLAotCQlNRVRIX05PQVJHUywKLQkJTlVMTCwKLQl9LAotCXsgMCwgMCwgMCwgMCB9CisgICAgeworICAgICAgICAiX2dldF9wcm94eV9zZXR0aW5ncyIsCisgICAgICAgIChQeUNGdW5jdGlvbilnZXRfcHJveHlfc2V0dGluZ3MsCisgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICAgICBOVUxMLAorICAgIH0sCisgICAgeworICAgICAgICAiX2dldF9wcm94aWVzIiwKKyAgICAgICAgKFB5Q0Z1bmN0aW9uKWdldF9wcm94aWVzLAorICAgICAgICBNRVRIX05PQVJHUywKKyAgICAgICAgTlVMTCwKKyAgICB9LAorICAgIHsgMCwgMCwgMCwgMCB9CiB9OwogCiB2b2lkIGluaXRfc2Nwcm94eSh2b2lkKQogewotCSh2b2lkKVB5X0luaXRNb2R1bGU0KCJfc2Nwcm94eSIsIG1vZF9tZXRob2RzLCBOVUxMLCBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOworICAgICh2b2lkKVB5X0luaXRNb2R1bGU0KCJfc2Nwcm94eSIsIG1vZF9tZXRob2RzLCBOVUxMLCBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwogfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9hZS9fQUVtb2R1bGUuYwppbmRleCAwOTEwNWE1Li4yMWEyZDQwIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9hZS9fQUVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9hZS9fQUVtb2R1bGUuYwpAQCAtMTMsOSArMTMsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzgsOSArMzgsOSBAQAogCiBzdGF0aWMgcGFzY2FsIEJvb2xlYW4gQUVJZGxlUHJvYyhFdmVudFJlY29yZCAqdGhlRXZlbnQsIGxvbmcgKnNsZWVwVGltZSwgUmduSGFuZGxlICptb3VzZVJnbikKIHsKLSAgICAgICAgaWYgKCBQeU9TX0ludGVycnVwdE9jY3VycmVkKCkgKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQoKSApCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOwogfQogCiBBRUlkbGVVUFAgdXBwX0FFSWRsZVByb2M7CkBAIC01NCw4MDcgKzU0LDgwNyBAQAogI2RlZmluZSBBRURlc2NfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQUVEZXNjX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkFFRGVzY19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQUVEZXNjT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQUVEZXNjIG9iX2l0c2VsZjsKLQlpbnQgb2Jfb3duZWQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEFFRGVzYyBvYl9pdHNlbGY7CisgICAgaW50IG9iX293bmVkOwogfSBBRURlc2NPYmplY3Q7CiAKIFB5T2JqZWN0ICpBRURlc2NfTmV3KEFFRGVzYyAqaXRzZWxmKQogewotCUFFRGVzY09iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoQUVEZXNjT2JqZWN0LCAmQUVEZXNjX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKLQlpdC0+b2Jfb3duZWQgPSAxOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBBRURlc2NPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEFFRGVzY09iamVjdCwgJkFFRGVzY19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7CisgICAgaXQtPm9iX293bmVkID0gMTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBBRURlc2NfQ29udmVydChQeU9iamVjdCAqdiwgQUVEZXNjICpwX2l0c2VsZikKIHsKLQlpZiAoIUFFRGVzY19DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJBRURlc2MgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQUVEZXNjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUFFRGVzY19DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJBRURlc2MgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQUVEZXNjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQUVEZXNjX2RlYWxsb2MoQUVEZXNjT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9vd25lZCkgQUVEaXNwb3NlRGVzYygmc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9vd25lZCkgQUVEaXNwb3NlRGVzYygmc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUNvZXJjZURlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURlc2NUeXBlIHRvVHlwZTsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIERlc2NUeXBlIHRvVHlwZTsKKyAgICBBRURlc2MgcmVzdWx0OwogI2lmbmRlZiBBRUNvZXJjZURlc2MKLQlQeU1hY19QUkVDSEVDSyhBRUNvZXJjZURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFQ29lcmNlRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRvVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUNvZXJjZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICB0b1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0b1R5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVDb2VyY2VEZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUR1cGxpY2F0ZURlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRGVzYyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVEdXBsaWNhdGVEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVEdXBsaWNhdGVEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUR1cGxpY2F0ZURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUR1cGxpY2F0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUR1cGxpY2F0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFQ291bnRJdGVtcyhBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyB0aGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIHRoZUNvdW50OwogI2lmbmRlZiBBRUNvdW50SXRlbXMKLQlQeU1hY19QUkVDSEVDSyhBRUNvdW50SXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFQ291bnRJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFQ291bnRJdGVtcygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZ0aGVDb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVDb3VudEl0ZW1zKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUHV0UHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRVB1dFB0cgotCVB5TWFjX1BSRUNIRUNLKEFFUHV0UHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVB1dFB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRVB1dFB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgIHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVQdXRQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVB1dERlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5kZXg7Ci0JQUVEZXNjIHRoZUFFRGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluZGV4OworICAgIEFFRGVzYyB0aGVBRURlc2M7CiAjaWZuZGVmIEFFUHV0RGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFUHV0RGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVQdXREZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZ0aGVBRURlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVQdXREZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQUVEZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUHV0RGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgJnRoZUFFRGVzYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFR2V0TnRoUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JRGVzY1R5cGUgdHlwZUNvZGU7Ci0JY2hhciAqZGF0YVB0cl9fb3V0X187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOwogI2lmbmRlZiBBRUdldE50aFB0cgotCVB5TWFjX1BSRUNIRUNLKEFFR2V0TnRoUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldE50aFB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCi0JewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGRhdGFQdHJfX2Vycm9yX187Ci0JfQotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFR2V0TnRoUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIGRhdGFQdHJfX2xlbl9fLCAmZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOwotCWZyZWUoZGF0YVB0cl9fb3V0X18pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGRhdGFQdHJfX291dF9fID0gbWFsbG9jKGRhdGFQdHJfX2luX2xlbl9fKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZGF0YVB0cl9fZXJyb3JfXzsKKyAgICB9CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVHZXROdGhQdHIoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgZGF0YVB0cl9fbGVuX18sICZkYXRhUHRyX19sZW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7CisgICAgZnJlZShkYXRhUHRyX19vdXRfXyk7CiAgZGF0YVB0cl9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldE50aERlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5kZXg7Ci0JRGVzY1R5cGUgZGVzaXJlZFR5cGU7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5kZXg7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBBRURlc2MgcmVzdWx0OwogI2lmbmRlZiBBRUdldE50aERlc2MKLQlQeU1hY19QUkVDSEVDSyhBRUdldE50aERlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0TnRoRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFR2V0TnRoRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFR2V0TnRoRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTaXplT2ZOdGhJdGVtKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluZGV4OwotCURlc2NUeXBlIHR5cGVDb2RlOwotCVNpemUgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBTaXplIGRhdGFTaXplOwogI2lmbmRlZiBBRVNpemVPZk50aEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhBRVNpemVPZk50aEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mTnRoSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU2l6ZU9mTnRoSXRlbSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVNpemVPZk50aEl0ZW0oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRURlbGV0ZUl0ZW0oQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgQUVEZWxldGVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soQUVEZWxldGVJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRURlbGV0ZUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRURlbGV0ZUl0ZW0oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRURlbGV0ZUl0ZW0oJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUHV0UGFyYW1QdHIoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JRGVzY1R5cGUgdHlwZUNvZGU7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CiAjaWZuZGVmIEFFUHV0UGFyYW1QdHIKLQlQeU1hY19QUkVDSEVDSyhBRVB1dFBhcmFtUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVB1dFBhcmFtUHRyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRVB1dFBhcmFtUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19pbl9fLCBkYXRhUHRyX19sZW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFUHV0UGFyYW1QdHIoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVQdXRQYXJhbURlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JQUVEZXNjIHRoZUFFRGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIEFFRGVzYyB0aGVBRURlc2M7CiAjaWZuZGVmIEFFUHV0UGFyYW1EZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVQdXRQYXJhbURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHV0UGFyYW1EZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQUVEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUHV0UGFyYW1EZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVBRURlc2MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQUVEZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUHV0UGFyYW1EZXNjKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVBRURlc2MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldFBhcmFtUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX291dF9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgY2hhciAqZGF0YVB0cl9fb3V0X187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CiAjaWZuZGVmIEFFR2V0UGFyYW1QdHIKLQlQeU1hY19QUkVDSEVDSyhBRUdldFBhcmFtUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldFBhcmFtUHRyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCi0JewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGRhdGFQdHJfX2Vycm9yX187Ci0JfQotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFR2V0UGFyYW1QdHIoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgZGF0YVB0cl9fbGVuX18sICZkYXRhUHRyX19sZW5fXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCAoaW50KWRhdGFQdHJfX2xlbl9fKTsKLQlmcmVlKGRhdGFQdHJfX291dF9fKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZGF0YVB0cl9fb3V0X18gPSBtYWxsb2MoZGF0YVB0cl9faW5fbGVuX18pKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgZ290byBkYXRhUHRyX19lcnJvcl9fOworICAgIH0KKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRUdldFBhcmFtUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIGRhdGFQdHJfX2xlbl9fLCAmZGF0YVB0cl9fbGVuX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7CisgICAgZnJlZShkYXRhUHRyX19vdXRfXyk7CiAgZGF0YVB0cl9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldFBhcmFtRGVzYyhBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVHZXRQYXJhbURlc2MKLQlQeU1hY19QUkVDSEVDSyhBRUdldFBhcmFtRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXRQYXJhbURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVHZXRQYXJhbURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldFBhcmFtRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVNpemVPZlBhcmFtKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCVNpemUgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBTaXplIGRhdGFTaXplOwogI2lmbmRlZiBBRVNpemVPZlBhcmFtCi0JUHlNYWNfUFJFQ0hFQ0soQUVTaXplT2ZQYXJhbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVTaXplT2ZQYXJhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVNpemVPZlBhcmFtKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTaXplT2ZQYXJhbSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRURlbGV0ZVBhcmFtKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CiAjaWZuZGVmIEFFRGVsZXRlUGFyYW0KLQlQeU1hY19QUkVDSEVDSyhBRURlbGV0ZVBhcmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRURlbGV0ZVBhcmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFRGVsZXRlUGFyYW0oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRURlbGV0ZVBhcmFtKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFR2V0QXR0cmlidXRlUHRyKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCURlc2NUeXBlIHR5cGVDb2RlOwotCWNoYXIgKmRhdGFQdHJfX291dF9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCB0aGVBRUtleXdvcmQ7CisgICAgRGVzY1R5cGUgZGVzaXJlZFR5cGU7CisgICAgRGVzY1R5cGUgdHlwZUNvZGU7CisgICAgY2hhciAqZGF0YVB0cl9fb3V0X187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CiAjaWZuZGVmIEFFR2V0QXR0cmlidXRlUHRyCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRBdHRyaWJ1dGVQdHIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0QXR0cmlidXRlUHRyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCi0JewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGRhdGFQdHJfX2Vycm9yX187Ci0JfQotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFFR2V0QXR0cmlidXRlUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCBkYXRhUHRyX19sZW5fXywgJmRhdGFQdHJfX2xlbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOwotCWZyZWUoZGF0YVB0cl9fb3V0X18pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFR2V0QXR0cmlidXRlUHRyKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX291dF9fLCBkYXRhUHRyX19sZW5fXywgJmRhdGFQdHJfX2xlbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXRBdHRyaWJ1dGVEZXNjKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgdGhlQUVLZXl3b3JkOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFRGVzYyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIHRoZUFFS2V5d29yZDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBBRURlc2MgcmVzdWx0OwogI2lmbmRlZiBBRUdldEF0dHJpYnV0ZURlc2MKLQlQeU1hY19QUkVDSEVDSyhBRUdldEF0dHJpYnV0ZURlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0QXR0cmlidXRlRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldEF0dHJpYnV0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldEF0dHJpYnV0ZURlc2MoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTaXplT2ZBdHRyaWJ1dGUoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JRGVzY1R5cGUgdHlwZUNvZGU7Ci0JU2l6ZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIFNpemUgZGF0YVNpemU7CiAjaWZuZGVmIEFFU2l6ZU9mQXR0cmlidXRlCi0JUHlNYWNfUFJFQ0hFQ0soQUVTaXplT2ZBdHRyaWJ1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2l6ZU9mQXR0cmlidXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVLZXl3b3JkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU2l6ZU9mQXR0cmlidXRlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTaXplT2ZBdHRyaWJ1dGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVQdXRBdHRyaWJ1dGVQdHIoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JRGVzY1R5cGUgdHlwZUNvZGU7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CiAjaWZuZGVmIEFFUHV0QXR0cmlidXRlUHRyCi0JUHlNYWNfUFJFQ0hFQ0soQUVQdXRBdHRyaWJ1dGVQdHIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHV0QXR0cmlidXRlUHRyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRVB1dEF0dHJpYnV0ZVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBBRVB1dEF0dHJpYnV0ZVB0cigmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVLZXl3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVB1dEF0dHJpYnV0ZURlc2MoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCB0aGVBRUtleXdvcmQ7Ci0JQUVEZXNjIHRoZUFFRGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgdGhlQUVLZXl3b3JkOworICAgIEFFRGVzYyB0aGVBRURlc2M7CiAjaWZuZGVmIEFFUHV0QXR0cmlidXRlRGVzYwotCVB5TWFjX1BSRUNIRUNLKEFFUHV0QXR0cmlidXRlRGVzYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVQdXRBdHRyaWJ1dGVEZXNjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQUVEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUHV0QXR0cmlidXRlRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVBRURlc2MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUtleXdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQUVEZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUHV0QXR0cmlidXRlRGVzYygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFS2V5d29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVBRURlc2MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRUdldERlc2NEYXRhU2l6ZShBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNpemUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTaXplIF9ydjsKICNpZm5kZWYgQUVHZXREZXNjRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhBRUdldERlc2NEYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVHZXREZXNjRGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFFR2V0RGVzY0RhdGFTaXplKCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQUVHZXREZXNjRGF0YVNpemUoJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFRGVzY19BRVNlbmQoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFwcGxlRXZlbnQgcmVwbHk7Ci0JQUVTZW5kTW9kZSBzZW5kTW9kZTsKLQlBRVNlbmRQcmlvcml0eSBzZW5kUHJpb3JpdHk7Ci0JbG9uZyB0aW1lT3V0SW5UaWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBcHBsZUV2ZW50IHJlcGx5OworICAgIEFFU2VuZE1vZGUgc2VuZE1vZGU7CisgICAgQUVTZW5kUHJpb3JpdHkgc2VuZFByaW9yaXR5OworICAgIGxvbmcgdGltZU91dEluVGlja3M7CiAjaWZuZGVmIEFFU2VuZAotCVB5TWFjX1BSRUNIRUNLKEFFU2VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVTZW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZW5kTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbmRQcmlvcml0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVPdXRJblRpY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU2VuZCgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICZyZXBseSwKLQkgICAgICAgICAgICAgIHNlbmRNb2RlLAotCSAgICAgICAgICAgICAgc2VuZFByaW9yaXR5LAotCSAgICAgICAgICAgICAgdGltZU91dEluVGlja3MsCi0JICAgICAgICAgICAgICB1cHBfQUVJZGxlUHJvYywKLQkgICAgICAgICAgICAgIChBRUZpbHRlclVQUCkwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlcGx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VuZE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZW5kUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lT3V0SW5UaWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVNlbmQoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAmcmVwbHksCisgICAgICAgICAgICAgICAgICBzZW5kTW9kZSwKKyAgICAgICAgICAgICAgICAgIHNlbmRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgIHRpbWVPdXRJblRpY2tzLAorICAgICAgICAgICAgICAgICAgdXBwX0FFSWRsZVByb2MsCisgICAgICAgICAgICAgICAgICAoQUVGaWx0ZXJVUFApMCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXBseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUmVzZXRUaW1lcihBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEFFUmVzZXRUaW1lcgotCVB5TWFjX1BSRUNIRUNLKEFFUmVzZXRUaW1lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVSZXNldFRpbWVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVSZXNldFRpbWVyKCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFUmVzZXRUaW1lcigmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFU3VzcGVuZFRoZUN1cnJlbnRFdmVudChBRURlc2NPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50KCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX0FFUmVzdW1lVGhlQ3VycmVudEV2ZW50KEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBcHBsZUV2ZW50IHJlcGx5OwotCUFFRXZlbnRIYW5kbGVyVVBQIGRpc3BhdGNoZXJfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOwotCVB5T2JqZWN0ICpkaXNwYXRjaGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFwcGxlRXZlbnQgcmVwbHk7CisgICAgQUVFdmVudEhhbmRsZXJVUFAgZGlzcGF0Y2hlcl9fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7CisgICAgUHlPYmplY3QgKmRpc3BhdGNoZXI7CiAjaWZuZGVmIEFFUmVzdW1lVGhlQ3VycmVudEV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soQUVSZXN1bWVUaGVDdXJyZW50RXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVzdW1lVGhlQ3VycmVudEV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmcmVwbHksCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXNwYXRjaGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUmVzdW1lVGhlQ3VycmVudEV2ZW50KCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXJfX3Byb2NfXywgCi0JCQkJICAgICAgIChTUmVmQ29uKWRpc3BhdGNoZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihkaXNwYXRjaGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2hlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVJlc3VtZVRoZUN1cnJlbnRFdmVudCgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyX19wcm9jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTUmVmQ29uKWRpc3BhdGNoZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIFB5X0lOQ1JFRihkaXNwYXRjaGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVHZXRUaGVDdXJyZW50RXZlbnQoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRUdldFRoZUN1cnJlbnRFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFR2V0VGhlQ3VycmVudEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldFRoZUN1cnJlbnRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFR2V0VGhlQ3VycmVudEV2ZW50KCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFR2V0VGhlQ3VycmVudEV2ZW50KCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVTZXRUaGVDdXJyZW50RXZlbnQoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRVNldFRoZUN1cnJlbnRFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFU2V0VGhlQ3VycmVudEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVNldFRoZUN1cnJlbnRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFU2V0VGhlQ3VycmVudEV2ZW50KCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFU2V0VGhlQ3VycmVudEV2ZW50KCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQUVSZXNvbHZlKEFFRGVzY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBjYWxsYmFja0ZsYWdzOwotCUFFRGVzYyB0aGVUb2tlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBjYWxsYmFja0ZsYWdzOworICAgIEFFRGVzYyB0aGVUb2tlbjsKICNpZm5kZWYgQUVSZXNvbHZlCi0JUHlNYWNfUFJFQ0hFQ0soQUVSZXNvbHZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRVJlc29sdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFja0ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUmVzb2x2ZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGNhbGxiYWNrRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAmdGhlVG9rZW4pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmdGhlVG9rZW4pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2tGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVJlc29sdmUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgJnRoZVRva2VuKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZVRva2VuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfQXV0b0Rpc3Bvc2UoQUVEZXNjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgb25vZmYsIG9sZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCW9sZCA9IF9zZWxmLT5vYl9vd25lZDsKLQlfc2VsZi0+b2Jfb3duZWQgPSBvbm9mZjsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsIG9sZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaW50IG9ub2ZmLCBvbGQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG9sZCA9IF9zZWxmLT5vYl9vd25lZDsKKyAgICBfc2VsZi0+b2Jfb3duZWQgPSBvbm9mZjsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsIG9sZCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEFFRGVzY19tZXRob2RzW10gPSB7Ci0JeyJBRUNvZXJjZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFQ29lcmNlRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdG9UeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRUR1cGxpY2F0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFRHVwbGljYXRlRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRUNvdW50SXRlbXMiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFQ291bnRJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyB0aGVDb3VudCkiKX0sCi0JeyJBRVB1dFB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQdHIsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKLQl7IkFFUHV0RGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXREZXNjLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAotCXsiQUVHZXROdGhQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0TnRoUHRyLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAotCXsiQUVHZXROdGhEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldE50aERlc2MsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRVNpemVPZk50aEl0ZW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mTnRoSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBTaXplIGRhdGFTaXplKSIpfSwKLQl7IkFFRGVsZXRlSXRlbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVEZWxldGVJdGVtLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4KSAtPiBOb25lIil9LAotCXsiQUVQdXRQYXJhbVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQYXJhbVB0ciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiBOb25lIil9LAotCXsiQUVQdXRQYXJhbURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUHV0UGFyYW1EZXNjLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAotCXsiQUVHZXRQYXJhbVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRQYXJhbVB0ciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkFFR2V0UGFyYW1EZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldFBhcmFtRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKLQl7IkFFU2l6ZU9mUGFyYW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2l6ZU9mUGFyYW0sIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCi0JeyJBRURlbGV0ZVBhcmFtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRURlbGV0ZVBhcmFtLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkKSAtPiBOb25lIil9LAotCXsiQUVHZXRBdHRyaWJ1dGVQdHIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0QXR0cmlidXRlUHRyLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAotCXsiQUVHZXRBdHRyaWJ1dGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldEF0dHJpYnV0ZURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCi0JeyJBRVNpemVPZkF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTaXplT2ZBdHRyaWJ1dGUsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgU2l6ZSBkYXRhU2l6ZSkiKX0sCi0JeyJBRVB1dEF0dHJpYnV0ZVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRBdHRyaWJ1dGVQdHIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gTm9uZSIpfSwKLQl7IkFFUHV0QXR0cmlidXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRBdHRyaWJ1dGVEZXNjLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgdGhlQUVEZXNjKSAtPiBOb25lIil9LAotCXsiQUVHZXREZXNjRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0RGVzY0RhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTaXplIF9ydikiKX0sCi0JeyJBRVNlbmQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVTZW5kTW9kZSBzZW5kTW9kZSwgQUVTZW5kUHJpb3JpdHkgc2VuZFByaW9yaXR5LCBsb25nIHRpbWVPdXRJblRpY2tzKSAtPiAoQXBwbGVFdmVudCByZXBseSkiKX0sCi0JeyJBRVJlc2V0VGltZXIiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUmVzZXRUaW1lciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQUVTdXNwZW5kVGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFUmVzdW1lVGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc3VtZVRoZUN1cnJlbnRFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCByZXBseSwgRXZlbnRIYW5kbGVyIGRpc3BhdGNoZXIpIC0+IE5vbmUiKX0sCi0JeyJBRUdldFRoZUN1cnJlbnRFdmVudCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRUaGVDdXJyZW50RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFU2V0VGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNldFRoZUN1cnJlbnRFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQUVSZXNvbHZlIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVJlc29sdmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNhbGxiYWNrRmxhZ3MpIC0+IChBRURlc2MgdGhlVG9rZW4pIil9LAotCXsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0F1dG9EaXNwb3NlLCAxLAotCSBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgQUVEaXNwb3NlRGVzYyB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkFFQ29lcmNlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVDb2VyY2VEZXNjLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSB0b1R5cGUpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7IkFFRHVwbGljYXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVEdXBsaWNhdGVEZXNjLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7IkFFQ291bnRJdGVtcyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVDb3VudEl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIHRoZUNvdW50KSIpfSwKKyAgICB7IkFFUHV0UHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVB1dFB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiBOb25lIil9LAorICAgIHsiQUVQdXREZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVB1dERlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIEFFRGVzYyB0aGVBRURlc2MpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldE50aFB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXROdGhQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBCdWZmZXIgZGF0YVB0cikgLT4gKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikiKX0sCisgICAgeyJBRUdldE50aERlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0TnRoRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7IkFFU2l6ZU9mTnRoSXRlbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTaXplT2ZOdGhJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluZGV4KSAtPiAoRGVzY1R5cGUgdHlwZUNvZGUsIFNpemUgZGF0YVNpemUpIil9LAorICAgIHsiQUVEZWxldGVJdGVtIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRURlbGV0ZUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJBRVB1dFBhcmFtUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVB1dFBhcmFtUHRyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IE5vbmUiKX0sCisgICAgeyJBRVB1dFBhcmFtRGVzYyIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVQdXRQYXJhbURlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIEFFRGVzYyB0aGVBRURlc2MpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldFBhcmFtUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldFBhcmFtUHRyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiQUVHZXRQYXJhbURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0UGFyYW1EZXNjLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgdGhlQUVLZXl3b3JkLCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHQpIil9LAorICAgIHsiQUVTaXplT2ZQYXJhbSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTaXplT2ZQYXJhbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCkgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBTaXplIGRhdGFTaXplKSIpfSwKKyAgICB7IkFFRGVsZXRlUGFyYW0iLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFRGVsZXRlUGFyYW0sIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldEF0dHJpYnV0ZVB0ciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXRBdHRyaWJ1dGVQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBCdWZmZXIgZGF0YVB0cikgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikiKX0sCisgICAgeyJBRUdldEF0dHJpYnV0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFR2V0QXR0cmlidXRlRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7IkFFU2l6ZU9mQXR0cmlidXRlIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVNpemVPZkF0dHJpYnV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCkgLT4gKERlc2NUeXBlIHR5cGVDb2RlLCBTaXplIGRhdGFTaXplKSIpfSwKKyAgICB7IkFFUHV0QXR0cmlidXRlUHRyIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVB1dEF0dHJpYnV0ZVB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIHRoZUFFS2V5d29yZCwgRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiBOb25lIil9LAorICAgIHsiQUVQdXRBdHRyaWJ1dGVEZXNjIiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRVB1dEF0dHJpYnV0ZURlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCB0aGVBRUtleXdvcmQsIEFFRGVzYyB0aGVBRURlc2MpIC0+IE5vbmUiKX0sCisgICAgeyJBRUdldERlc2NEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVHZXREZXNjRGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNpemUgX3J2KSIpfSwKKyAgICB7IkFFU2VuZCIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVTZW5kLCAxLAorICAgICBQeURvY19TVFIoIihBRVNlbmRNb2RlIHNlbmRNb2RlLCBBRVNlbmRQcmlvcml0eSBzZW5kUHJpb3JpdHksIGxvbmcgdGltZU91dEluVGlja3MpIC0+IChBcHBsZUV2ZW50IHJlcGx5KSIpfSwKKyAgICB7IkFFUmVzZXRUaW1lciIsIChQeUNGdW5jdGlvbilBRURlc2NfQUVSZXNldFRpbWVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBRVN1c3BlbmRUaGVDdXJyZW50RXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU3VzcGVuZFRoZUN1cnJlbnRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVSZXN1bWVUaGVDdXJyZW50RXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUmVzdW1lVGhlQ3VycmVudEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihBcHBsZUV2ZW50IHJlcGx5LCBFdmVudEhhbmRsZXIgZGlzcGF0Y2hlcikgLT4gTm9uZSIpfSwKKyAgICB7IkFFR2V0VGhlQ3VycmVudEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFRGVzY19BRUdldFRoZUN1cnJlbnRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQUVTZXRUaGVDdXJyZW50RXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFU2V0VGhlQ3VycmVudEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBRVJlc29sdmUiLCAoUHlDRnVuY3Rpb24pQUVEZXNjX0FFUmVzb2x2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY2FsbGJhY2tGbGFncykgLT4gKEFFRGVzYyB0aGVUb2tlbikiKX0sCisgICAgeyJBdXRvRGlzcG9zZSIsIChQeUNGdW5jdGlvbilBRURlc2NfQXV0b0Rpc3Bvc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCktPmludC4gQXV0b21hdGljYWxseSBBRURpc3Bvc2VEZXNjIHRoZSBvYmplY3Qgb24gUHl0aG9uIG9iamVjdCBjbGVhbnVwIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpBRURlc2NfZ2V0X3R5cGUoQUVEZXNjT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeU1hY19CdWlsZE9TVHlwZShzZWxmLT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUpOworICAgIHJldHVybiBQeU1hY19CdWlsZE9TVHlwZShzZWxmLT5vYl9pdHNlbGYuZGVzY3JpcHRvclR5cGUpOwogfQogCiAjZGVmaW5lIEFFRGVzY19zZXRfdHlwZSBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX2dldF9kYXRhKEFFRGVzY09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlQeU9iamVjdCAqcmVzOwotCVNpemUgc2l6ZTsKLQljaGFyICpwdHI7Ci0JT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpyZXM7CisgICAgU2l6ZSBzaXplOworICAgIGNoYXIgKnB0cjsKKyAgICBPU0VyciBlcnI7CiAKLQlzaXplID0gQUVHZXREZXNjRGF0YVNpemUoJnNlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKCAocmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSkpID09IE5VTEwgKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoIChwdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCAoZXJyPUFFR2V0RGVzY0RhdGEoJnNlbGYtPm9iX2l0c2VsZiwgcHRyLCBzaXplKSkgPCAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIHJlczsKKyAgICBzaXplID0gQUVHZXREZXNjRGF0YVNpemUoJnNlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKCAocmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSkpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIChwdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCAoZXJyPUFFR2V0RGVzY0RhdGEoJnNlbGYtPm9iX2l0c2VsZiwgcHRyLCBzaXplKSkgPCAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIHJlczsKIH0KIAogI2RlZmluZSBBRURlc2Nfc2V0X2RhdGEgTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgQUVEZXNjX2dldHNldGxpc3RbXSA9IHsKLQl7InR5cGUiLCAoZ2V0dGVyKUFFRGVzY19nZXRfdHlwZSwgKHNldHRlcilBRURlc2Nfc2V0X3R5cGUsICJUeXBlIG9mIHRoaXMgQUVEZXNjIn0sCi0JeyJkYXRhIiwgKGdldHRlcilBRURlc2NfZ2V0X2RhdGEsIChzZXR0ZXIpQUVEZXNjX3NldF9kYXRhLCAiVGhlIHJhdyBkYXRhIGluIHRoaXMgQUVEZXNjIn0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsidHlwZSIsIChnZXR0ZXIpQUVEZXNjX2dldF90eXBlLCAoc2V0dGVyKUFFRGVzY19zZXRfdHlwZSwgIlR5cGUgb2YgdGhpcyBBRURlc2MifSwKKyAgICB7ImRhdGEiLCAoZ2V0dGVyKUFFRGVzY19nZXRfZGF0YSwgKHNldHRlcilBRURlc2Nfc2V0X2RhdGEsICJUaGUgcmF3IGRhdGEgaW4gdGhpcyBBRURlc2MifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTg2OSw2MSArODY5LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlBRURlc2MgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBBRURlc2MgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQUVEZXNjX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQUVEZXNjT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEFFRGVzY19Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEFFRGVzY09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBBRURlc2NfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQUVEZXNjX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0FFLkFFRGVzYyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEFFRGVzY09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEFFRGVzY19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBBRURlc2NfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEFFRGVzY19yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQUVEZXNjX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUFFRGVzY19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlBRURlc2NfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQUVEZXNjX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlBRURlc2NfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQUVEZXNjX3RwX25ldywgLyogdHBfbmV3ICovCi0JQUVEZXNjX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQUUuQUVEZXNjIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQUVEZXNjT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQUVEZXNjX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEFFRGVzY19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQUVEZXNjX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBBRURlc2NfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQUVEZXNjX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEFFRGVzY19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBBRURlc2NfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEFFRGVzY190cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBBRURlc2NfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBBRURlc2NfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBBRURlc2MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC05MzEsNDU1ICs5MzEsNDU1IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVDb2VyY2VQdHIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGVzY1R5cGUgdHlwZUNvZGU7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlEZXNjVHlwZSB0b1R5cGU7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEZXNjVHlwZSB0eXBlQ29kZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIERlc2NUeXBlIHRvVHlwZTsKKyAgICBBRURlc2MgcmVzdWx0OwogI2lmbmRlZiBBRUNvZXJjZVB0cgotCVB5TWFjX1BSRUNIRUNLKEFFQ29lcmNlUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNvZXJjZVB0cik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdG9UeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVDb2VyY2VQdHIodHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICB0b1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0eXBlQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdG9UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVDb2VyY2VQdHIodHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICB0b1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUNyZWF0ZURlc2MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGVzY1R5cGUgdHlwZUNvZGU7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlBRURlc2MgcmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgQUVEZXNjIHJlc3VsdDsKICNpZm5kZWYgQUVDcmVhdGVEZXNjCi0JUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVEZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNyZWF0ZURlc2MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVDcmVhdGVEZXNjKHR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVDcmVhdGVEZXNjKHR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVDcmVhdGVMaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWNoYXIgKmZhY3RvcmluZ1B0cl9faW5fXzsKLQlsb25nIGZhY3RvcmluZ1B0cl9fbGVuX187Ci0JaW50IGZhY3RvcmluZ1B0cl9faW5fbGVuX187Ci0JQm9vbGVhbiBpc1JlY29yZDsKLQlBRURlc2NMaXN0IHJlc3VsdExpc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgY2hhciAqZmFjdG9yaW5nUHRyX19pbl9fOworICAgIGxvbmcgZmFjdG9yaW5nUHRyX19sZW5fXzsKKyAgICBpbnQgZmFjdG9yaW5nUHRyX19pbl9sZW5fXzsKKyAgICBCb29sZWFuIGlzUmVjb3JkOworICAgIEFFRGVzY0xpc3QgcmVzdWx0TGlzdDsKICNpZm5kZWYgQUVDcmVhdGVMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNyZWF0ZUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZhY3RvcmluZ1B0cl9faW5fXywgJmZhY3RvcmluZ1B0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZpc1JlY29yZCkpCi0JCXJldHVybiBOVUxMOwotCWZhY3RvcmluZ1B0cl9fbGVuX18gPSBmYWN0b3JpbmdQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBBRUNyZWF0ZUxpc3QoZmFjdG9yaW5nUHRyX19pbl9fLCBmYWN0b3JpbmdQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgaXNSZWNvcmQsCi0JICAgICAgICAgICAgICAgICAgICAmcmVzdWx0TGlzdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRMaXN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjdG9yaW5nUHRyX19pbl9fLCAmZmFjdG9yaW5nUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZmFjdG9yaW5nUHRyX19sZW5fXyA9IGZhY3RvcmluZ1B0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFFQ3JlYXRlTGlzdChmYWN0b3JpbmdQdHJfX2luX18sIGZhY3RvcmluZ1B0cl9fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICBpc1JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRMaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdExpc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFQ3JlYXRlQXBwbGVFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOwotCUFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7Ci0JQUVBZGRyZXNzRGVzYyB0YXJnZXQ7Ci0JQUVSZXR1cm5JRCByZXR1cm5JRDsKLQlBRVRyYW5zYWN0aW9uSUQgdHJhbnNhY3Rpb25JRDsKLQlBcHBsZUV2ZW50IHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOworICAgIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CisgICAgQUVBZGRyZXNzRGVzYyB0YXJnZXQ7CisgICAgQUVSZXR1cm5JRCByZXR1cm5JRDsKKyAgICBBRVRyYW5zYWN0aW9uSUQgdHJhbnNhY3Rpb25JRDsKKyAgICBBcHBsZUV2ZW50IHJlc3VsdDsKICNpZm5kZWYgQUVDcmVhdGVBcHBsZUV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soQUVDcmVhdGVBcHBsZUV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUNyZWF0ZUFwcGxlRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXR1cm5JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zYWN0aW9uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVDcmVhdGVBcHBsZUV2ZW50KHRoZUFFRXZlbnRDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR1cm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zYWN0aW9uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVDcmVhdGVBcHBsZUV2ZW50KHRoZUFFRXZlbnRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVSZXBsYWNlRGVzY0RhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRGVzY1R5cGUgdHlwZUNvZGU7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlBRURlc2MgdGhlQUVEZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIERlc2NUeXBlIHR5cGVDb2RlOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgbG9uZyBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgQUVEZXNjIHRoZUFFRGVzYzsKICNpZm5kZWYgQUVSZXBsYWNlRGVzY0RhdGEKLQlQeU1hY19QUkVDSEVDSyhBRVJlcGxhY2VEZXNjRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVSZXBsYWNlRGVzY0RhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlfZXJyID0gQUVSZXBsYWNlRGVzY0RhdGEodHlwZUNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZUFFRGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnR5cGVDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fXywgJmRhdGFQdHJfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gQUVSZXBsYWNlRGVzY0RhdGEodHlwZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQUVEZXNjKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZUFFRGVzYyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVQcm9jZXNzQXBwbGVFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlFdmVudFJlY29yZCB0aGVFdmVudFJlY29yZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudFJlY29yZDsKICNpZm5kZWYgQUVQcm9jZXNzQXBwbGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKEFFUHJvY2Vzc0FwcGxlRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUHJvY2Vzc0FwcGxlRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50UmVjb3JkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUHJvY2Vzc0FwcGxlRXZlbnQoJnRoZUV2ZW50UmVjb3JkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnRSZWNvcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVQcm9jZXNzQXBwbGVFdmVudCgmdGhlRXZlbnRSZWNvcmQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFR2V0SW50ZXJhY3Rpb25BbGxvd2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFSW50ZXJhY3RBbGxvd2VkIGxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFSW50ZXJhY3RBbGxvd2VkIGxldmVsOwogI2lmbmRlZiBBRUdldEludGVyYWN0aW9uQWxsb3dlZAotCVB5TWFjX1BSRUNIRUNLKEFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUdldEludGVyYWN0aW9uQWxsb3dlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkKCZsZXZlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQoJmxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWw7CiAjaWZuZGVmIEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkCi0JUHlNYWNfUFJFQ0hFQ0soQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQobGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVTZXRJbnRlcmFjdGlvbkFsbG93ZWQobGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFSW50ZXJhY3RXaXRoVXNlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIHRpbWVPdXRJblRpY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgdGltZU91dEluVGlja3M7CiAjaWZuZGVmIEFFSW50ZXJhY3RXaXRoVXNlcgotCVB5TWFjX1BSRUNIRUNLKEFFSW50ZXJhY3RXaXRoVXNlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVJbnRlcmFjdFdpdGhVc2VyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZU91dEluVGlja3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVJbnRlcmFjdFdpdGhVc2VyKHRpbWVPdXRJblRpY2tzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgKE5NUmVjUHRyKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfQUVJZGxlUHJvYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lT3V0SW5UaWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUludGVyYWN0V2l0aFVzZXIodGltZU91dEluVGlja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTk1SZWNQdHIpMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9BRUlkbGVQcm9jKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUluc3RhbGxFdmVudEhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzczsKLQlBRUV2ZW50SUQgdGhlQUVFdmVudElEOwotCUFFRXZlbnRIYW5kbGVyVVBQIGhhbmRsZXJfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOwotCVB5T2JqZWN0ICpoYW5kbGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3M7CisgICAgQUVFdmVudElEIHRoZUFFRXZlbnRJRDsKKyAgICBBRUV2ZW50SGFuZGxlclVQUCBoYW5kbGVyX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsKKyAgICBQeU9iamVjdCAqaGFuZGxlcjsKICNpZm5kZWYgQUVJbnN0YWxsRXZlbnRIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soQUVJbnN0YWxsRXZlbnRIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUluc3RhbGxFdmVudEhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8iLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVJbnN0YWxsRXZlbnRIYW5kbGVyKHRoZUFFRXZlbnRDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfX3Byb2NfXywgKFNSZWZDb24paGFuZGxlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihoYW5kbGVyKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8KLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlQUVFdmVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUluc3RhbGxFdmVudEhhbmRsZXIodGhlQUVFdmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQUVFdmVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl9fcHJvY19fLCAoU1JlZkNvbiloYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgUHlfSU5DUkVGKGhhbmRsZXIpOyAvKiBYWFggbGVhaywgYnV0IG5lZWRlZCAqLworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFUmVtb3ZlRXZlbnRIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3M7Ci0JQUVFdmVudElEIHRoZUFFRXZlbnRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOworICAgIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CiAjaWZuZGVmIEFFUmVtb3ZlRXZlbnRIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soQUVSZW1vdmVFdmVudEhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVtb3ZlRXZlbnRIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRVJlbW92ZUV2ZW50SGFuZGxlcih0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRVJlbW92ZUV2ZW50SGFuZGxlcih0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFR2V0RXZlbnRIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3M7Ci0JQUVFdmVudElEIHRoZUFFRXZlbnRJRDsKLQlBRUV2ZW50SGFuZGxlclVQUCBoYW5kbGVyX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsKLQlQeU9iamVjdCAqaGFuZGxlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzOworICAgIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQ7CisgICAgQUVFdmVudEhhbmRsZXJVUFAgaGFuZGxlcl9fcHJvY19fID0gdXBwX0dlbmVyaWNFdmVudEhhbmRsZXI7CisgICAgUHlPYmplY3QgKmhhbmRsZXI7CiAjaWZuZGVmIEFFR2V0RXZlbnRIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soQUVHZXRFdmVudEhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFR2V0RXZlbnRIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRUdldEV2ZW50SGFuZGxlcih0aGVBRUV2ZW50Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZXJfX3Byb2NfXywgKFNSZWZDb24gKikmaGFuZGxlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyIsCi0JICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcik7Ci0JUHlfSU5DUkVGKGhhbmRsZXIpOyAvKiBYWFggbGVhaywgYnV0IG5lZWRlZCAqLwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZUFFRXZlbnRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUdldEV2ZW50SGFuZGxlcih0aGVBRUV2ZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUFFRXZlbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZXJfX3Byb2NfXywgKFNSZWZDb24gKikmaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcik7CisgICAgUHlfSU5DUkVGKGhhbmRsZXIpOyAvKiBYWFggbGVhaywgYnV0IG5lZWRlZCAqLworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFSW5zdGFsbFNwZWNpYWxIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFS2V5d29yZCBmdW5jdGlvbkNsYXNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFS2V5d29yZCBmdW5jdGlvbkNsYXNzOwogI2lmbmRlZiBBRUluc3RhbGxTcGVjaWFsSGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFSW5zdGFsbFNwZWNpYWxIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRUluc3RhbGxTcGVjaWFsSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZ1bmN0aW9uQ2xhc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIoZnVuY3Rpb25DbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZnVuY3Rpb25DbGFzcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBRUluc3RhbGxTcGVjaWFsSGFuZGxlcihmdW5jdGlvbkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVSZW1vdmVTcGVjaWFsSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBRUtleXdvcmQgZnVuY3Rpb25DbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRUtleXdvcmQgZnVuY3Rpb25DbGFzczsKICNpZm5kZWYgQUVSZW1vdmVTcGVjaWFsSGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmdW5jdGlvbkNsYXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFUmVtb3ZlU3BlY2lhbEhhbmRsZXIoZnVuY3Rpb25DbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZ1bmN0aW9uQ2xhc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVSZW1vdmVTcGVjaWFsSGFuZGxlcihmdW5jdGlvbkNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFFX0FFTWFuYWdlckluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVLZXl3b3JkIGtleVdvcmQ7Ci0JbG9uZyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVLZXl3b3JkIGtleVdvcmQ7CisgICAgbG9uZyByZXN1bHQ7CiAjaWZuZGVmIEFFTWFuYWdlckluZm8KLQlQeU1hY19QUkVDSEVDSyhBRU1hbmFnZXJJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBRU1hbmFnZXJJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2V5V29yZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRU1hbmFnZXJJbmZvKGtleVdvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmtleVdvcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVNYW5hZ2VySW5mbyhrZXlXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVPYmplY3RJbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBRU9iamVjdEluaXQKLQlQeU1hY19QUkVDSEVDSyhBRU9iamVjdEluaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFT2JqZWN0SW5pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFFT2JqZWN0SW5pdCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVPYmplY3RJbml0KCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQUVfQUVEaXNwb3NlVG9rZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVEZXNjIHRoZVRva2VuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFFRGVzYyB0aGVUb2tlbjsKICNpZm5kZWYgQUVEaXNwb3NlVG9rZW4KLQlQeU1hY19QUkVDSEVDSyhBRURpc3Bvc2VUb2tlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQUVEaXNwb3NlVG9rZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBRURpc3Bvc2VUb2tlbigmdGhlVG9rZW4pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmdGhlVG9rZW4pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUVEaXNwb3NlVG9rZW4oJnRoZVRva2VuKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRoZVRva2VuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBRV9BRUNhbGxPYmplY3RBY2Nlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEZXNjVHlwZSBkZXNpcmVkQ2xhc3M7Ci0JQUVEZXNjIGNvbnRhaW5lclRva2VuOwotCURlc2NUeXBlIGNvbnRhaW5lckNsYXNzOwotCURlc2NUeXBlIGtleUZvcm07Ci0JQUVEZXNjIGtleURhdGE7Ci0JQUVEZXNjIHRva2VuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIERlc2NUeXBlIGRlc2lyZWRDbGFzczsKKyAgICBBRURlc2MgY29udGFpbmVyVG9rZW47CisgICAgRGVzY1R5cGUgY29udGFpbmVyQ2xhc3M7CisgICAgRGVzY1R5cGUga2V5Rm9ybTsKKyAgICBBRURlc2Mga2V5RGF0YTsKKyAgICBBRURlc2MgdG9rZW47CiAjaWZuZGVmIEFFQ2FsbE9iamVjdEFjY2Vzc29yCi0JUHlNYWNfUFJFQ0hFQ0soQUVDYWxsT2JqZWN0QWNjZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEFFQ2FsbE9iamVjdEFjY2Vzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmY29udGFpbmVyVG9rZW4sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbnRhaW5lckNsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZrZXlGb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmtleURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUVDYWxsT2JqZWN0QWNjZXNzb3IoZGVzaXJlZENsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyVG9rZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lckNsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlGb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5RGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRva2VuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnRva2VuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmNvbnRhaW5lclRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb250YWluZXJDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2V5Rm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZrZXlEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFFQ2FsbE9iamVjdEFjY2Vzc29yKGRlc2lyZWRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lclRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Rm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b2tlbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZ0b2tlbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBBRV9tZXRob2RzW10gPSB7Ci0JeyJBRUNvZXJjZVB0ciIsIChQeUNGdW5jdGlvbilBRV9BRUNvZXJjZVB0ciwgMSwKLQkgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyLCBEZXNjVHlwZSB0b1R5cGUpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKLQl7IkFFQ3JlYXRlRGVzYyIsIChQeUNGdW5jdGlvbilBRV9BRUNyZWF0ZURlc2MsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiQUVDcmVhdGVMaXN0IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ3JlYXRlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZhY3RvcmluZ1B0ciwgQm9vbGVhbiBpc1JlY29yZCkgLT4gKEFFRGVzY0xpc3QgcmVzdWx0TGlzdCkiKX0sCi0JeyJBRUNyZWF0ZUFwcGxlRXZlbnQiLCAoUHlDRnVuY3Rpb24pQUVfQUVDcmVhdGVBcHBsZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIihBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzLCBBRUV2ZW50SUQgdGhlQUVFdmVudElELCBBRUFkZHJlc3NEZXNjIHRhcmdldCwgQUVSZXR1cm5JRCByZXR1cm5JRCwgQUVUcmFuc2FjdGlvbklEIHRyYW5zYWN0aW9uSUQpIC0+IChBcHBsZUV2ZW50IHJlc3VsdCkiKX0sCi0JeyJBRVJlcGxhY2VEZXNjRGF0YSIsIChQeUNGdW5jdGlvbilBRV9BRVJlcGxhY2VEZXNjRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoRGVzY1R5cGUgdHlwZUNvZGUsIEJ1ZmZlciBkYXRhUHRyKSAtPiAoQUVEZXNjIHRoZUFFRGVzYykiKX0sCi0JeyJBRVByb2Nlc3NBcHBsZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFUHJvY2Vzc0FwcGxlRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIHRoZUV2ZW50UmVjb3JkKSAtPiBOb25lIil9LAotCXsiQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQiLCAoUHlDRnVuY3Rpb24pQUVfQUVHZXRJbnRlcmFjdGlvbkFsbG93ZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFSW50ZXJhY3RBbGxvd2VkIGxldmVsKSIpfSwKLQl7IkFFU2V0SW50ZXJhY3Rpb25BbGxvd2VkIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFU2V0SW50ZXJhY3Rpb25BbGxvd2VkLCAxLAotCSBQeURvY19TVFIoIihBRUludGVyYWN0QWxsb3dlZCBsZXZlbCkgLT4gTm9uZSIpfSwKLQl7IkFFSW50ZXJhY3RXaXRoVXNlciIsIChQeUNGdW5jdGlvbilBRV9BRUludGVyYWN0V2l0aFVzZXIsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgdGltZU91dEluVGlja3MpIC0+IE5vbmUiKX0sCi0JeyJBRUluc3RhbGxFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnN0YWxsRXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzLCBBRUV2ZW50SUQgdGhlQUVFdmVudElELCBFdmVudEhhbmRsZXIgaGFuZGxlcikgLT4gTm9uZSIpfSwKLQl7IkFFUmVtb3ZlRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFUmVtb3ZlRXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzLCBBRUV2ZW50SUQgdGhlQUVFdmVudElEKSAtPiBOb25lIil9LAotCXsiQUVHZXRFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVHZXRFdmVudEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKEFFRXZlbnRDbGFzcyB0aGVBRUV2ZW50Q2xhc3MsIEFFRXZlbnRJRCB0aGVBRUV2ZW50SUQpIC0+IChFdmVudEhhbmRsZXIgaGFuZGxlcikiKX0sCi0JeyJBRUluc3RhbGxTcGVjaWFsSGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRUluc3RhbGxTcGVjaWFsSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIGZ1bmN0aW9uQ2xhc3MpIC0+IE5vbmUiKX0sCi0JeyJBRVJlbW92ZVNwZWNpYWxIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFUmVtb3ZlU3BlY2lhbEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKEFFS2V5d29yZCBmdW5jdGlvbkNsYXNzKSAtPiBOb25lIil9LAotCXsiQUVNYW5hZ2VySW5mbyIsIChQeUNGdW5jdGlvbilBRV9BRU1hbmFnZXJJbmZvLCAxLAotCSBQeURvY19TVFIoIihBRUtleXdvcmQga2V5V29yZCkgLT4gKGxvbmcgcmVzdWx0KSIpfSwKLQl7IkFFT2JqZWN0SW5pdCIsIChQeUNGdW5jdGlvbilBRV9BRU9iamVjdEluaXQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFFRGlzcG9zZVRva2VuIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFRGlzcG9zZVRva2VuLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBRURlc2MgdGhlVG9rZW4pIil9LAotCXsiQUVDYWxsT2JqZWN0QWNjZXNzb3IiLCAoUHlDRnVuY3Rpb24pQUVfQUVDYWxsT2JqZWN0QWNjZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKERlc2NUeXBlIGRlc2lyZWRDbGFzcywgQUVEZXNjIGNvbnRhaW5lclRva2VuLCBEZXNjVHlwZSBjb250YWluZXJDbGFzcywgRGVzY1R5cGUga2V5Rm9ybSwgQUVEZXNjIGtleURhdGEpIC0+IChBRURlc2MgdG9rZW4pIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQUVDb2VyY2VQdHIiLCAoUHlDRnVuY3Rpb24pQUVfQUVDb2VyY2VQdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0ciwgRGVzY1R5cGUgdG9UeXBlKSAtPiAoQUVEZXNjIHJlc3VsdCkiKX0sCisgICAgeyJBRUNyZWF0ZURlc2MiLCAoUHlDRnVuY3Rpb24pQUVfQUVDcmVhdGVEZXNjLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSB0eXBlQ29kZSwgQnVmZmVyIGRhdGFQdHIpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7IkFFQ3JlYXRlTGlzdCIsIChQeUNGdW5jdGlvbilBRV9BRUNyZWF0ZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBmYWN0b3JpbmdQdHIsIEJvb2xlYW4gaXNSZWNvcmQpIC0+IChBRURlc2NMaXN0IHJlc3VsdExpc3QpIil9LAorICAgIHsiQUVDcmVhdGVBcHBsZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ3JlYXRlQXBwbGVFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCwgQUVBZGRyZXNzRGVzYyB0YXJnZXQsIEFFUmV0dXJuSUQgcmV0dXJuSUQsIEFFVHJhbnNhY3Rpb25JRCB0cmFuc2FjdGlvbklEKSAtPiAoQXBwbGVFdmVudCByZXN1bHQpIil9LAorICAgIHsiQUVSZXBsYWNlRGVzY0RhdGEiLCAoUHlDRnVuY3Rpb24pQUVfQUVSZXBsYWNlRGVzY0RhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKERlc2NUeXBlIHR5cGVDb2RlLCBCdWZmZXIgZGF0YVB0cikgLT4gKEFFRGVzYyB0aGVBRURlc2MpIil9LAorICAgIHsiQUVQcm9jZXNzQXBwbGVFdmVudCIsIChQeUNGdW5jdGlvbilBRV9BRVByb2Nlc3NBcHBsZUV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCB0aGVFdmVudFJlY29yZCkgLT4gTm9uZSIpfSwKKyAgICB7IkFFR2V0SW50ZXJhY3Rpb25BbGxvd2VkIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFR2V0SW50ZXJhY3Rpb25BbGxvd2VkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBRUludGVyYWN0QWxsb3dlZCBsZXZlbCkiKX0sCisgICAgeyJBRVNldEludGVyYWN0aW9uQWxsb3dlZCIsIChQeUNGdW5jdGlvbilBRV9BRVNldEludGVyYWN0aW9uQWxsb3dlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVJbnRlcmFjdEFsbG93ZWQgbGV2ZWwpIC0+IE5vbmUiKX0sCisgICAgeyJBRUludGVyYWN0V2l0aFVzZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnRlcmFjdFdpdGhVc2VyLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHRpbWVPdXRJblRpY2tzKSAtPiBOb25lIil9LAorICAgIHsiQUVJbnN0YWxsRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFSW5zdGFsbEV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCwgRXZlbnRIYW5kbGVyIGhhbmRsZXIpIC0+IE5vbmUiKX0sCisgICAgeyJBRVJlbW92ZUV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRVJlbW92ZUV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVFdmVudENsYXNzIHRoZUFFRXZlbnRDbGFzcywgQUVFdmVudElEIHRoZUFFRXZlbnRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkFFR2V0RXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFR2V0RXZlbnRIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihBRUV2ZW50Q2xhc3MgdGhlQUVFdmVudENsYXNzLCBBRUV2ZW50SUQgdGhlQUVFdmVudElEKSAtPiAoRXZlbnRIYW5kbGVyIGhhbmRsZXIpIil9LAorICAgIHsiQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pQUVfQUVJbnN0YWxsU3BlY2lhbEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFS2V5d29yZCBmdW5jdGlvbkNsYXNzKSAtPiBOb25lIil9LAorICAgIHsiQUVSZW1vdmVTcGVjaWFsSGFuZGxlciIsIChQeUNGdW5jdGlvbilBRV9BRVJlbW92ZVNwZWNpYWxIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihBRUtleXdvcmQgZnVuY3Rpb25DbGFzcykgLT4gTm9uZSIpfSwKKyAgICB7IkFFTWFuYWdlckluZm8iLCAoUHlDRnVuY3Rpb24pQUVfQUVNYW5hZ2VySW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVLZXl3b3JkIGtleVdvcmQpIC0+IChsb25nIHJlc3VsdCkiKX0sCisgICAgeyJBRU9iamVjdEluaXQiLCAoUHlDRnVuY3Rpb24pQUVfQUVPYmplY3RJbml0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBRURpc3Bvc2VUb2tlbiIsIChQeUNGdW5jdGlvbilBRV9BRURpc3Bvc2VUb2tlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHRoZVRva2VuKSIpfSwKKyAgICB7IkFFQ2FsbE9iamVjdEFjY2Vzc29yIiwgKFB5Q0Z1bmN0aW9uKUFFX0FFQ2FsbE9iamVjdEFjY2Vzc29yLCAxLAorICAgICBQeURvY19TVFIoIihEZXNjVHlwZSBkZXNpcmVkQ2xhc3MsIEFFRGVzYyBjb250YWluZXJUb2tlbiwgRGVzY1R5cGUgY29udGFpbmVyQ2xhc3MsIERlc2NUeXBlIGtleUZvcm0sIEFFRGVzYyBrZXlEYXRhKSAtPiAoQUVEZXNjIHRva2VuKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTM4Nyw3MiArMTM4Nyw3MiBAQAogc3RhdGljIHBhc2NhbCBPU0VycgogR2VuZXJpY0V2ZW50SGFuZGxlcihjb25zdCBBcHBsZUV2ZW50ICpyZXF1ZXN0LCBBcHBsZUV2ZW50ICpyZXBseSwgcmVmY29udHlwZSByZWZjb24pCiB7Ci0gICAgICAgIFB5T2JqZWN0ICpoYW5kbGVyID0gKFB5T2JqZWN0ICopcmVmY29uOwotICAgICAgICBBRURlc2NPYmplY3QgKnJlcXVlc3RPYmplY3QsICpyZXBseU9iamVjdDsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7Ci0gICAgICAgIGlmICgocmVxdWVzdE9iamVjdCA9IChBRURlc2NPYmplY3QgKilBRURlc2NfTmV3KChBcHBsZUV2ZW50ICopcmVxdWVzdCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChyZXBseU9iamVjdCA9IChBRURlc2NPYmplY3QgKilBRURlc2NfTmV3KHJlcGx5KSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXF1ZXN0T2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChhcmdzID0gUHlfQnVpbGRWYWx1ZSgiT08iLCByZXF1ZXN0T2JqZWN0LCByZXBseU9iamVjdCkpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVxdWVzdE9iamVjdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcGx5T2JqZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoaGFuZGxlciwgYXJncyk7Ci0gICAgICAgIHJlcXVlc3RPYmplY3QtPm9iX2l0c2VsZi5kZXNjcmlwdG9yVHlwZSA9ICdudWxsJzsKLSAgICAgICAgcmVxdWVzdE9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOwotICAgICAgICByZXBseU9iamVjdC0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlID0gJ251bGwnOwotICAgICAgICByZXBseU9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmIChyZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gQUUgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiBub0VycjsKKyAgICBQeU9iamVjdCAqaGFuZGxlciA9IChQeU9iamVjdCAqKXJlZmNvbjsKKyAgICBBRURlc2NPYmplY3QgKnJlcXVlc3RPYmplY3QsICpyZXBseU9iamVjdDsKKyAgICBQeU9iamVjdCAqYXJncywgKnJlczsKKyAgICBpZiAoKHJlcXVlc3RPYmplY3QgPSAoQUVEZXNjT2JqZWN0ICopQUVEZXNjX05ldygoQXBwbGVFdmVudCAqKXJlcXVlc3QpKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChyZXBseU9iamVjdCA9IChBRURlc2NPYmplY3QgKilBRURlc2NfTmV3KHJlcGx5KSkgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYocmVxdWVzdE9iamVjdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChhcmdzID0gUHlfQnVpbGRWYWx1ZSgiT08iLCByZXF1ZXN0T2JqZWN0LCByZXBseU9iamVjdCkpID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHJlcXVlc3RPYmplY3QpOworICAgICAgICBQeV9ERUNSRUYocmVwbHlPYmplY3QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGhhbmRsZXIsIGFyZ3MpOworICAgIHJlcXVlc3RPYmplY3QtPm9iX2l0c2VsZi5kZXNjcmlwdG9yVHlwZSA9ICdudWxsJzsKKyAgICByZXF1ZXN0T2JqZWN0LT5vYl9pdHNlbGYuZGF0YUhhbmRsZSA9IE5VTEw7CisgICAgcmVwbHlPYmplY3QtPm9iX2l0c2VsZi5kZXNjcmlwdG9yVHlwZSA9ICdudWxsJzsKKyAgICByZXBseU9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBBRSBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gbm9FcnI7CiB9CiAKIFB5T2JqZWN0ICpBRURlc2NfTmV3Qm9ycm93ZWQoQUVEZXNjICppdHNlbGYpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqaXQ7CiAKLSAgICAgICAgaXQgPSBBRURlc2NfTmV3KGl0c2VsZik7Ci0gICAgICAgIGlmIChpdCkKLSAgICAgICAgICAgICAgICAoKEFFRGVzY09iamVjdCAqKWl0KS0+b2Jfb3duZWQgPSAwOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgaXQgPSBBRURlc2NfTmV3KGl0c2VsZik7CisgICAgaWYgKGl0KQorICAgICAgICAoKEFFRGVzY09iamVjdCAqKWl0KS0+b2Jfb3duZWQgPSAwOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogCiAKIHZvaWQgaW5pdF9BRSh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCi0gICAgICAgIHVwcF9BRUlkbGVQcm9jID0gTmV3QUVJZGxlVVBQKEFFSWRsZVByb2MpOwotICAgICAgICB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlciA9IE5ld0FFRXZlbnRIYW5kbGVyVVBQKEdlbmVyaWNFdmVudEhhbmRsZXIpOwotICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ldyk7Ci0gICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEFFRGVzYyAqLCBBRURlc2NfTmV3Qm9ycm93ZWQpOwotICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQUVEZXNjLCBBRURlc2NfQ29udmVydCk7CisgICAgdXBwX0FFSWRsZVByb2MgPSBOZXdBRUlkbGVVUFAoQUVJZGxlUHJvYyk7CisgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIgPSBOZXdBRUV2ZW50SGFuZGxlclVQUChHZW5lcmljRXZlbnRIYW5kbGVyKTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXdCb3Jyb3dlZCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEFFRGVzYywgQUVEZXNjX0NvbnZlcnQpOwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9BRSIsIEFFX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUFFX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoQUVfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBBRV9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUFFRGVzY19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQUVEZXNjX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQUVEZXNjX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQUVEZXNjIiwgKFB5T2JqZWN0ICopJkFFRGVzY19UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkFFRGVzY19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFFRGVzY1R5cGUiLCAoUHlPYmplY3QgKikmQUVEZXNjX1R5cGUpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQUUiLCBBRV9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBBRV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEFFX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQUVfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBBRURlc2NfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkFFRGVzY19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkFFRGVzY19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFFRGVzYyIsIChQeU9iamVjdCAqKSZBRURlc2NfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZBRURlc2NfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBRURlc2NUeXBlIiwgKFB5T2JqZWN0ICopJkFFRGVzY19UeXBlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PSBFbmQgbW9kdWxlIF9BRSA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9haC9fQUhtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2FoL19BSG1vZHVsZS5jCmluZGV4IDE2MGE4NDUuLjczYWI0MzcgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2FoL19BSG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2FoL19BSG1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMjIsMTAzICsyMiwxMDMgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSFNlYXJjaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBib29rbmFtZTsKLQlDRlN0cmluZ1JlZiBxdWVyeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmJvb2tuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcXVlcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQUhTZWFyY2goYm9va25hbWUsCi0JICAgICAgICAgICAgICAgIHF1ZXJ5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBib29rbmFtZTsKKyAgICBDRlN0cmluZ1JlZiBxdWVyeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcXVlcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUhTZWFyY2goYm9va25hbWUsCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBaF9BSEdvdG9NYWluVE9DKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUFIVE9DVHlwZSB0b2N0eXBlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdG9jdHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBSEdvdG9NYWluVE9DKHRvY3R5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEFIVE9DVHlwZSB0b2N0eXBlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9jdHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBSEdvdG9NYWluVE9DKHRvY3R5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFoX0FIR290b1BhZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgYm9va25hbWU7Ci0JQ0ZTdHJpbmdSZWYgcGF0aDsKLQlDRlN0cmluZ1JlZiBhbmNob3I7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmJvb2tuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFuY2hvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBSEdvdG9QYWdlKGJvb2tuYW1lLAotCSAgICAgICAgICAgICAgICAgIHBhdGgsCi0JICAgICAgICAgICAgICAgICAgYW5jaG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBib29rbmFtZTsKKyAgICBDRlN0cmluZ1JlZiBwYXRoOworICAgIENGU3RyaW5nUmVmIGFuY2hvcjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYm9va25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYW5jaG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFIR290b1BhZ2UoYm9va25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBhbmNob3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFoX0FITG9va3VwQW5jaG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGJvb2tuYW1lOwotCUNGU3RyaW5nUmVmIGFuY2hvcjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmJvb2tuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYW5jaG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFITG9va3VwQW5jaG9yKGJvb2tuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBhbmNob3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGJvb2tuYW1lOworICAgIENGU3RyaW5nUmVmIGFuY2hvcjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYW5jaG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFITG9va3VwQW5jaG9yKGJvb2tuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFoX0FIUmVnaXN0ZXJIZWxwQm9vayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBhcHBCdW5kbGVSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmFwcEJ1bmRsZVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBSFJlZ2lzdGVySGVscEJvb2soJmFwcEJ1bmRsZVJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgYXBwQnVuZGxlUmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZhcHBCdW5kbGVSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQUhSZWdpc3RlckhlbHBCb29rKCZhcHBCdW5kbGVSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQWhfbWV0aG9kc1tdID0gewotCXsiQUhTZWFyY2giLCAoUHlDRnVuY3Rpb24pQWhfQUhTZWFyY2gsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGJvb2tuYW1lLCBDRlN0cmluZ1JlZiBxdWVyeSkgLT4gTm9uZSIpfSwKLQl7IkFIR290b01haW5UT0MiLCAoUHlDRnVuY3Rpb24pQWhfQUhHb3RvTWFpblRPQywgMSwKLQkgUHlEb2NfU1RSKCIoQUhUT0NUeXBlIHRvY3R5cGUpIC0+IE5vbmUiKX0sCi0JeyJBSEdvdG9QYWdlIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIR290b1BhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGJvb2tuYW1lLCBDRlN0cmluZ1JlZiBwYXRoLCBDRlN0cmluZ1JlZiBhbmNob3IpIC0+IE5vbmUiKX0sCi0JeyJBSExvb2t1cEFuY2hvciIsIChQeUNGdW5jdGlvbilBaF9BSExvb2t1cEFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYm9va25hbWUsIENGU3RyaW5nUmVmIGFuY2hvcikgLT4gTm9uZSIpfSwKLQl7IkFIUmVnaXN0ZXJIZWxwQm9vayIsIChQeUNGdW5jdGlvbilBaF9BSFJlZ2lzdGVySGVscEJvb2ssIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGFwcEJ1bmRsZVJlZikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkFIU2VhcmNoIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIU2VhcmNoLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgcXVlcnkpIC0+IE5vbmUiKX0sCisgICAgeyJBSEdvdG9NYWluVE9DIiwgKFB5Q0Z1bmN0aW9uKUFoX0FIR290b01haW5UT0MsIDEsCisgICAgIFB5RG9jX1NUUigiKEFIVE9DVHlwZSB0b2N0eXBlKSAtPiBOb25lIil9LAorICAgIHsiQUhHb3RvUGFnZSIsIChQeUNGdW5jdGlvbilBaF9BSEdvdG9QYWdlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBib29rbmFtZSwgQ0ZTdHJpbmdSZWYgcGF0aCwgQ0ZTdHJpbmdSZWYgYW5jaG9yKSAtPiBOb25lIil9LAorICAgIHsiQUhMb29rdXBBbmNob3IiLCAoUHlDRnVuY3Rpb24pQWhfQUhMb29rdXBBbmNob3IsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGJvb2tuYW1lLCBDRlN0cmluZ1JlZiBhbmNob3IpIC0+IE5vbmUiKX0sCisgICAgeyJBSFJlZ2lzdGVySGVscEJvb2siLCAoUHlDRnVuY3Rpb24pQWhfQUhSZWdpc3RlckhlbHBCb29rLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBhcHBCdW5kbGVSZWYpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTEyNiwxOCArMTI2LDE4IEBACiAKIHZvaWQgaW5pdF9BSCh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9BSCIsIEFoX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUFoX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoQWhfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBBaF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQUgiLCBBaF9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBBaF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEFoX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQWhfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PSBFbmQgbW9kdWxlIF9BSCA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9hcHAvX0FwcG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvYXBwL19BcHBtb2R1bGUuYwppbmRleCA1MmQxN2Y1Li5jNzkxODA3IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9hcHAvX0FwcG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2FwcC9fQXBwbW9kdWxlLmMKQEAgLTQsMTYgKzQsMTYgQEAKICNpbmNsdWRlICJQeXRob24uaCIKIAogI2lmbmRlZiBfX0xQNjRfXwotCS8qIENhcmJvbiBHVUkgc3R1ZmYsIG5vdCBhdmFpbGFibGUgaW4gNjQtYml0IG1vZGUgKi8KKyAgICAvKiBDYXJib24gR1VJIHN0dWZmLCBub3QgYXZhaWxhYmxlIGluIDY0LWJpdCBtb2RlICovCiAKIAogI2luY2x1ZGUgInB5bWFjdG9vbGJveC5oIgogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMjIsNyArMjIsNyBAQAogCiBzdGF0aWMgaW50IFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydChQeU9iamVjdCAqdiwgVGhlbWVCdXR0b25EcmF3SW5mbyAqcF9pdHNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGlISCkiLCAmcF9pdHNlbGYtPnN0YXRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPmFkb3JubWVudCk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaUhIKSIsICZwX2l0c2VsZi0+c3RhdGUsICZwX2l0c2VsZi0+dmFsdWUsICZwX2l0c2VsZi0+YWRvcm5tZW50KTsKIH0KIAogCkBAIC0zNSw3NSArMzUsNzUgQEAKICNkZWZpbmUgVGhlbWVEcmF3aW5nU3RhdGVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVGhlbWVEcmF3aW5nU3RhdGUgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUaGVtZURyYXdpbmdTdGF0ZSBvYl9pdHNlbGY7CiB9IFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0OwogCiBQeU9iamVjdCAqVGhlbWVEcmF3aW5nU3RhdGVPYmpfTmV3KFRoZW1lRHJhd2luZ1N0YXRlIGl0c2VsZikKIHsKLQlUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QsICZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0LCAmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVGhlbWVEcmF3aW5nU3RhdGVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVGhlbWVEcmF3aW5nU3RhdGUgKnBfaXRzZWxmKQogewotCWlmICghVGhlbWVEcmF3aW5nU3RhdGVPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVGhlbWVEcmF3aW5nU3RhdGUgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghVGhlbWVEcmF3aW5nU3RhdGVPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVGhlbWVEcmF3aW5nU3RhdGUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBUaGVtZURyYXdpbmdTdGF0ZU9ial9kZWFsbG9jKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaGVtZURyYXdpbmdTdGF0ZU9ial9TZXRUaGVtZURyYXdpbmdTdGF0ZShUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX3J2OwotCUJvb2xlYW4gaW5EaXNwb3NlTm93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfcnY7CisgICAgQm9vbGVhbiBpbkRpc3Bvc2VOb3c7CiAjaWZuZGVmIFNldFRoZW1lRHJhd2luZ1N0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVEcmF3aW5nU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lRHJhd2luZ1N0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EaXNwb3NlTm93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU2V0VGhlbWVEcmF3aW5nU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRpc3Bvc2VOb3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EaXNwb3NlTm93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU2V0VGhlbWVEcmF3aW5nU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRpc3Bvc2VOb3cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRoZW1lRHJhd2luZ1N0YXRlT2JqX0Rpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZShUaGVtZURyYXdpbmdTdGF0ZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfcnY7CiAjaWZuZGVmIERpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFRoZW1lRHJhd2luZ1N0YXRlT2JqX21ldGhvZHNbXSA9IHsKLQl7IlNldFRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKVRoZW1lRHJhd2luZ1N0YXRlT2JqX1NldFRoZW1lRHJhd2luZ1N0YXRlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluRGlzcG9zZU5vdykgLT4gKE9TU3RhdHVzIF9ydikiKX0sCi0JeyJEaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pVGhlbWVEcmF3aW5nU3RhdGVPYmpfRGlzcG9zZVRoZW1lRHJhd2luZ1N0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChPU1N0YXR1cyBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiU2V0VGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pVGhlbWVEcmF3aW5nU3RhdGVPYmpfU2V0VGhlbWVEcmF3aW5nU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5EaXNwb3NlTm93KSAtPiAoT1NTdGF0dXMgX3J2KSIpfSwKKyAgICB7IkRpc3Bvc2VUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilUaGVtZURyYXdpbmdTdGF0ZU9ial9EaXNwb3NlVGhlbWVEcmF3aW5nU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE9TU3RhdHVzIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFRoZW1lRHJhd2luZ1N0YXRlT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTIwLDYxICsxMjAsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVGhlbWVEcmF3aW5nU3RhdGUgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBUaGVtZURyYXdpbmdTdGF0ZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUaGVtZURyYXdpbmdTdGF0ZU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRoZW1lRHJhd2luZ1N0YXRlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRoZW1lRHJhd2luZ1N0YXRlT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVGhlbWVEcmF3aW5nU3RhdGVPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQXBwLlRoZW1lRHJhd2luZ1N0YXRlIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVGhlbWVEcmF3aW5nU3RhdGVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRoZW1lRHJhd2luZ1N0YXRlT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRoZW1lRHJhd2luZ1N0YXRlT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVRoZW1lRHJhd2luZ1N0YXRlT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRoZW1lRHJhd2luZ1N0YXRlT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRoZW1lRHJhd2luZ1N0YXRlT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQXBwLlRoZW1lRHJhd2luZ1N0YXRlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoVGhlbWVEcmF3aW5nU3RhdGVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBUaGVtZURyYXdpbmdTdGF0ZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgVGhlbWVEcmF3aW5nU3RhdGVPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFRoZW1lRHJhd2luZ1N0YXRlT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFRoZW1lRHJhd2luZ1N0YXRlT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFRoZW1lRHJhd2luZ1N0YXRlT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFRoZW1lRHJhd2luZ1N0YXRlT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgVGhlbWVEcmF3aW5nU3RhdGUgLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTgyLDE2MjIgKzE4MiwxNjIyIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1JlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50Ci0JUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWdpc3RlckFwcGVhcmFuY2VDbGllbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9VbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQKLQlQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfU2V0VGhlbWVQZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVCcnVzaCBpbkJydXNoOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQnJ1c2ggaW5CcnVzaDsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgU2V0VGhlbWVQZW4KLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVBlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVQZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lUGVuKGluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lUGVuKGluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lQmFja2dyb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUJydXNoIGluQnJ1c2g7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVCcnVzaCBpbkJydXNoOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOwogI2lmbmRlZiBTZXRUaGVtZUJhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhTZXRUaGVtZUJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lQmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5CcnVzaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VGhlbWVCYWNrZ3JvdW5kKGluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VGhlbWVCYWNrZ3JvdW5kKGluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfU2V0VGhlbWVUZXh0Q29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVUZXh0Q29sb3IgaW5Db2xvcjsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluSXNDb2xvckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZVRleHRDb2xvciBpbkNvbG9yOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOwogI2lmbmRlZiBTZXRUaGVtZVRleHRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lVGV4dENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZVRleHRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VGhlbWVUZXh0Q29sb3IoaW5Db2xvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VGhlbWVUZXh0Q29sb3IoaW5Db2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlUaGVtZUJydXNoIGluQnJ1c2g7Ci0JQm9vbGVhbiBpblVwZGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgVGhlbWVCcnVzaCBpbkJydXNoOworICAgIEJvb2xlYW4gaW5VcGRhdGU7CiAjaWZuZGVmIFNldFRoZW1lV2luZG93QmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lV2luZG93QmFja2dyb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5CcnVzaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVXBkYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lV2luZG93QmFja2dyb3VuZChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblVwZGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5VcGRhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CcnVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVXBkYXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lV2luZG93SGVhZGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lV2luZG93SGVhZGVyCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lV2luZG93SGVhZGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVXaW5kb3dIZWFkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lV2luZG93SGVhZGVyKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVXaW5kb3dIZWFkZXIoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVQbGFjYXJkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lUGxhY2FyZAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVBsYWNhcmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVBsYWNhcmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lUGxhY2FyZCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVBsYWNhcmQoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lRWRpdFRleHRGcmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZUVkaXRUZXh0RnJhbWUKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVFZGl0VGV4dEZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVFZGl0VGV4dEZyYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZUVkaXRUZXh0RnJhbWUoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVFZGl0VGV4dEZyYW1lKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZUxpc3RCb3hGcmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZUxpc3RCb3hGcmFtZQotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUxpc3RCb3hGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lTGlzdEJveEZyYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZUxpc3RCb3hGcmFtZSgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lTGlzdEJveEZyYW1lKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lRm9jdXNSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCUJvb2xlYW4gaW5IYXNGb2N1czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBCb29sZWFuIGluSGFzRm9jdXM7CiAjaWZuZGVmIERyYXdUaGVtZUZvY3VzUmVjdAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUZvY3VzUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lRm9jdXNSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhhc0ZvY3VzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZUZvY3VzUmVjdCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IYXNGb2N1cyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGFzRm9jdXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lRm9jdXNSZWN0KCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhhc0ZvY3VzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lUHJpbWFyeUdyb3VwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lUHJpbWFyeUdyb3VwCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lUHJpbWFyeUdyb3VwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQcmltYXJ5R3JvdXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lUHJpbWFyeUdyb3VwKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVQcmltYXJ5R3JvdXAoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVTZWNvbmRhcnlHcm91cChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVNlY29uZGFyeUdyb3VwCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU2Vjb25kYXJ5R3JvdXApOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNlY29uZGFyeUdyb3VwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVNlY29uZGFyeUdyb3VwKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVNlY29uZGFyeUdyb3VwKCZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVTZXBhcmF0b3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVTZXBhcmF0b3IKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTZXBhcmF0b3IpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNlcGFyYXRvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTZXBhcmF0b3IoJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVNlcGFyYXRvcigmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluUmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lKCZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lTW9kZWxlc3NEaWFsb2dGcmFtZSgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVHZW5lcmljV2VsbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluUmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCUJvb2xlYW4gaW5GaWxsQ2VudGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgQm9vbGVhbiBpbkZpbGxDZW50ZXI7CiAjaWZuZGVmIERyYXdUaGVtZUdlbmVyaWNXZWxsCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lR2VuZXJpY1dlbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUdlbmVyaWNXZWxsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmlsbENlbnRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVHZW5lcmljV2VsbCgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpbGxDZW50ZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmlsbENlbnRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVHZW5lcmljV2VsbCgmaW5SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpbGxDZW50ZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVGb2N1c1JlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGluSGFzRm9jdXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBpbkhhc0ZvY3VzOwogI2lmbmRlZiBEcmF3VGhlbWVGb2N1c1JlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUZvY3VzUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVGb2N1c1JlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSGFzRm9jdXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lRm9jdXNSZWdpb24oKFJnbkhhbmRsZSkwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhhc0ZvY3VzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSGFzRm9jdXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lRm9jdXNSZWdpb24oKFJnbkhhbmRsZSkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhhc0ZvY3VzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfSXNUaGVtZUluQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgSXNUaGVtZUluQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhJc1RoZW1lSW5Db2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNUaGVtZUluQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzVGhlbWVJbkNvbG9yKGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNUaGVtZUluQ29sb3IoaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZUFjY2VudENvbG9ycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDVGFiSGFuZGxlIG91dENvbG9yczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDVGFiSGFuZGxlIG91dENvbG9yczsKICNpZm5kZWYgR2V0VGhlbWVBY2NlbnRDb2xvcnMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUFjY2VudENvbG9ycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVBY2NlbnRDb2xvcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZUFjY2VudENvbG9ycygmb3V0Q29sb3JzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0Q29sb3JzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lQWNjZW50Q29sb3JzKCZvdXRDb2xvcnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXRDb2xvcnMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluQm91bmRzOwotCVRoZW1lTWVudUJhclN0YXRlIGluU3RhdGU7Ci0JVUludDMyIGluQXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluQm91bmRzOworICAgIFRoZW1lTWVudUJhclN0YXRlIGluU3RhdGU7CisgICAgVUludDMyIGluQXR0cmlidXRlczsKICNpZm5kZWYgRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQoJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZW51QmFySGVpZ2h0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNJbnQxNiBvdXRIZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IG91dEhlaWdodDsKICNpZm5kZWYgR2V0VGhlbWVNZW51QmFySGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51QmFySGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVCYXJIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVCYXJIZWlnaHQoJm91dEhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lTWVudUJhckhlaWdodCgmb3V0SGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVNZW51QmFja2dyb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluTWVudVJlY3Q7Ci0JVGhlbWVNZW51VHlwZSBpbk1lbnVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5NZW51UmVjdDsKKyAgICBUaGVtZU1lbnVUeXBlIGluTWVudVR5cGU7CiAjaWZuZGVmIERyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lTWVudUJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbk1lbnVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NZW51VHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVNZW51QmFja2dyb3VuZCgmaW5NZW51UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5NZW51VHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluTWVudVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1lbnVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kKCZpbk1lbnVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lbnVUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluTWVudVJlY3Q7Ci0JVGhlbWVNZW51VHlwZSBtZW51VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluTWVudVJlY3Q7CisgICAgVGhlbWVNZW51VHlwZSBtZW51VHlwZTsKICNpZm5kZWYgR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluTWVudVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51VHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uKCZpbk1lbnVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluTWVudVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51VHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZU1lbnVCYWNrZ3JvdW5kUmVnaW9uKCZpbk1lbnVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpMCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0RyYXdUaGVtZU1lbnVTZXBhcmF0b3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbkl0ZW1SZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5JdGVtUmVjdDsKICNpZm5kZWYgRHJhd1RoZW1lTWVudVNlcGFyYXRvcgotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVTZXBhcmF0b3IpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZU1lbnVTZXBhcmF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5JdGVtUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVNZW51U2VwYXJhdG9yKCZpbkl0ZW1SZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkl0ZW1SZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZU1lbnVTZXBhcmF0b3IoJmluSXRlbVJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IG91dEhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgb3V0SGVpZ2h0OwogI2lmbmRlZiBHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCgmb3V0SGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0KCZvdXRIZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhlaWdodCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lTWVudUl0ZW1FeHRyYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZU1lbnVJdGVtVHlwZSBpbkl0ZW1UeXBlOwotCVNJbnQxNiBvdXRIZWlnaHQ7Ci0JU0ludDE2IG91dFdpZHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lTWVudUl0ZW1UeXBlIGluSXRlbVR5cGU7CisgICAgU0ludDE2IG91dEhlaWdodDsKKyAgICBTSW50MTYgb3V0V2lkdGg7CiAjaWZuZGVmIEdldFRoZW1lTWVudUl0ZW1FeHRyYQotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWVudUl0ZW1FeHRyYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVNZW51SXRlbUV4dHJhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZU1lbnVJdGVtRXh0cmEoaW5JdGVtVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2lkdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0V2lkdGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZU1lbnVJdGVtRXh0cmEoaW5JdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2lkdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0V2lkdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZU1lbnVUaXRsZUV4dHJhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNJbnQxNiBvdXRXaWR0aDsKLQlCb29sZWFuIGluSXNTcXVpc2hlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgb3V0V2lkdGg7CisgICAgQm9vbGVhbiBpbklzU3F1aXNoZWQ7CiAjaWZuZGVmIEdldFRoZW1lTWVudVRpdGxlRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVUaXRsZUV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1lbnVUaXRsZUV4dHJhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Jc1NxdWlzaGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lTWVudVRpdGxlRXh0cmEoJm91dFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNTcXVpc2hlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0V2lkdGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc1NxdWlzaGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lTWVudVRpdGxlRXh0cmEoJm91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNTcXVpc2hlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0V2lkdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVUYWJQYW5lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5SZWN0OwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpblJlY3Q7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lVGFiUGFuZQotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRhYlBhbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVRhYlBhbmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lVGFiUGFuZSgmaW5SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVRhYlBhbmUoJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVUYWJSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblJlY3Q7Ci0JVGhlbWVUYWJTdHlsZSBpblN0eWxlOwotCVRoZW1lVGFiRGlyZWN0aW9uIGluRGlyZWN0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5SZWN0OworICAgIFRoZW1lVGFiU3R5bGUgaW5TdHlsZTsKKyAgICBUaGVtZVRhYkRpcmVjdGlvbiBpbkRpcmVjdGlvbjsKICNpZm5kZWYgR2V0VGhlbWVUYWJSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVRhYlJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUYWJSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZISCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EaXJlY3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVUYWJSZWdpb24oJmluUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZISCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EaXJlY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVUYWJSZWdpb24oJmluUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpMCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1NldFRoZW1lQ3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lQ3Vyc29yIGluQ3Vyc29yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQ3Vyc29yIGluQ3Vyc29yOwogI2lmbmRlZiBTZXRUaGVtZUN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKFNldFRoZW1lQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaGVtZUN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ3Vyc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRoZW1lQ3Vyc29yKGluQ3Vyc29yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ3Vyc29yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lQ3Vyc29yKGluQ3Vyc29yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfU2V0QW5pbWF0ZWRUaGVtZUN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUN1cnNvciBpbkN1cnNvcjsKLQlVSW50MzIgaW5BbmltYXRpb25TdGVwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQ3Vyc29yIGluQ3Vyc29yOworICAgIFVJbnQzMiBpbkFuaW1hdGlvblN0ZXA7CiAjaWZuZGVmIFNldEFuaW1hdGVkVGhlbWVDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRBbmltYXRlZFRoZW1lQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRBbmltYXRlZFRoZW1lQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ3Vyc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BbmltYXRpb25TdGVwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEFuaW1hdGVkVGhlbWVDdXJzb3IoaW5DdXJzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BbmltYXRpb25TdGVwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkN1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQW5pbWF0aW9uU3RlcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRBbmltYXRlZFRoZW1lQ3Vyc29yKGluQ3Vyc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQW5pbWF0aW9uU3RlcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUgb3V0U3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlIG91dFN0eWxlOwogI2lmbmRlZiBHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSgmb3V0U3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSgmb3V0U3R5bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFN0eWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSBvdXRTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZVNjcm9sbEJhckFycm93U3R5bGUgb3V0U3R5bGU7CiAjaWZuZGVmIEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlKCZvdXRTdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlKCZvdXRTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZUNoZWNrQm94U3R5bGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVDaGVja0JveFN0eWxlIG91dFN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lQ2hlY2tCb3hTdHlsZSBvdXRTdHlsZTsKICNpZm5kZWYgR2V0VGhlbWVDaGVja0JveFN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVDaGVja0JveFN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUNoZWNrQm94U3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZUNoZWNrQm94U3R5bGUoJm91dFN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUNoZWNrQm94U3R5bGUoJm91dFN0eWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1VzZVRoZW1lRm9udChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlTY3JpcHRDb2RlIGluU2NyaXB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFNjcmlwdENvZGUgaW5TY3JpcHQ7CiAjaWZuZGVmIFVzZVRoZW1lRm9udAotCVB5TWFjX1BSRUNIRUNLKFVzZVRoZW1lRm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXNlVGhlbWVGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JpcHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXNlVGhlbWVGb250KGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgaW5TY3JpcHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JpcHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXNlVGhlbWVGb250KGluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgaW5TY3JpcHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVUZXh0Qm94KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluU3RyaW5nOwotCVRoZW1lRm9udElEIGluRm9udElEOwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7Ci0JQm9vbGVhbiBpbldyYXBUb1dpZHRoOwotCVJlY3QgaW5Cb3VuZGluZ0JveDsKLQlTSW50MTYgaW5KdXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgQm9vbGVhbiBpbldyYXBUb1dpZHRoOworICAgIFJlY3QgaW5Cb3VuZGluZ0JveDsKKyAgICBTSW50MTYgaW5KdXN0OwogI2lmbmRlZiBEcmF3VGhlbWVUZXh0Qm94Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lVGV4dEJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lVGV4dEJveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsYk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV3JhcFRvV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kaW5nQm94LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5KdXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVRleHRCb3goaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbldyYXBUb1dpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kaW5nQm94LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluSnVzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsYk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV3JhcFRvV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kaW5nQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5KdXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVRleHRCb3goaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldyYXBUb1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kaW5nQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSnVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfVHJ1bmNhdGVUaGVtZVRleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZNdXRhYmxlU3RyaW5nUmVmIGluU3RyaW5nOwotCVRoZW1lRm9udElEIGluRm9udElEOwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7Ci0JU0ludDE2IGluUGl4ZWxXaWR0aExpbWl0OwotCVRydW5jQ29kZSBpblRydW5jV2hlcmU7Ci0JQm9vbGVhbiBvdXRUcnVuY2F0ZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmIGluU3RyaW5nOworICAgIFRoZW1lRm9udElEIGluRm9udElEOworICAgIFRoZW1lRHJhd1N0YXRlIGluU3RhdGU7CisgICAgU0ludDE2IGluUGl4ZWxXaWR0aExpbWl0OworICAgIFRydW5jQ29kZSBpblRydW5jV2hlcmU7CisgICAgQm9vbGVhbiBvdXRUcnVuY2F0ZWQ7CiAjaWZuZGVmIFRydW5jYXRlVGhlbWVUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soVHJ1bmNhdGVUaGVtZVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRydW5jYXRlVGhlbWVUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGxoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblBpeGVsV2lkdGhMaW1pdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVHJ1bmNXaGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcnVuY2F0ZVRoZW1lVGV4dChpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluUGl4ZWxXaWR0aExpbWl0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblRydW5jV2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcnVuY2F0ZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFRydW5jYXRlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIbGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGl4ZWxXaWR0aExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UcnVuY1doZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRydW5jYXRlVGhlbWVUZXh0KGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QaXhlbFdpZHRoTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVHJ1bmNXaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRydW5jYXRlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJ1bmNhdGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVUZXh0RGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKLQlUaGVtZUZvbnRJRCBpbkZvbnRJRDsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCUJvb2xlYW4gaW5XcmFwVG9XaWR0aDsKLQlQb2ludCBpb0JvdW5kczsKLQlTSW50MTYgb3V0QmFzZWxpbmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgVGhlbWVGb250SUQgaW5Gb250SUQ7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBCb29sZWFuIGluV3JhcFRvV2lkdGg7CisgICAgUG9pbnQgaW9Cb3VuZHM7CisgICAgU0ludDE2IG91dEJhc2VsaW5lOwogI2lmbmRlZiBHZXRUaGVtZVRleHREaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0RGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0RGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XcmFwVG9XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpb0JvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVRleHREaW1lbnNpb25zKGluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwVG9XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJhc2VsaW5lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGlvQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEJhc2VsaW5lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhsYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XcmFwVG9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpb0JvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZVRleHREaW1lbnNpb25zKGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XcmFwVG9XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJhc2VsaW5lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGlvQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJhc2VsaW5lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lRm9udElEIGluRm9udElEOwotCVRoZW1lRHJhd1N0YXRlIGluU3RhdGU7Ci0JUmVjdCBvdXRPdXRzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVGb250SUQgaW5Gb250SUQ7CisgICAgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZTsKKyAgICBSZWN0IG91dE91dHNldDsKICNpZm5kZWYgR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lVGV4dFNoYWRvd091dHNldChpbkZvbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0T3V0c2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0T3V0c2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0KGluRm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRPdXRzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRPdXRzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBib3VuZHM7Ci0JVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOwotCVRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7Ci0JQm9vbGVhbiBpc0hvcml6OwotCVJlY3QgdHJhY2tCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBib3VuZHM7CisgICAgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlOworICAgIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGU7CisgICAgQm9vbGVhbiBpc0hvcml6OworICAgIFJlY3QgdHJhY2tCb3VuZHM7CiAjaWZuZGVmIERyYXdUaGVtZVNjcm9sbEJhckFycm93cwotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNjcm9sbEJhckFycm93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXopKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzKCZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrQm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdHJhY2tCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzKCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrQm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdHJhY2tCb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZVNjcm9sbEJhclRyYWNrUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKLQlUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGU7Ci0JVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZTsKLQlCb29sZWFuIGlzSG9yaXo7Ci0JUmVjdCB0cmFja0JvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGU7CisgICAgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZTsKKyAgICBCb29sZWFuIGlzSG9yaXo7CisgICAgUmVjdCB0cmFja0JvdW5kczsKICNpZm5kZWYgR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVNjcm9sbEJhclRyYWNrUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVzc1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNIb3JpeikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZVNjcm9sbEJhclRyYWNrUmVjdCgmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3NTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrQm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdHJhY2tCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZVN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc3NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzSG9yaXopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QoJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHNjcm9sbEJhckJvdW5kczsKLQlUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGU7Ci0JVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZTsKLQlCb29sZWFuIGlzSG9yaXo7Ci0JUG9pbnQgcHRIaXQ7Ci0JUmVjdCB0cmFja0JvdW5kczsKLQlDb250cm9sUGFydENvZGUgcGFydGNvZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3Qgc2Nyb2xsQmFyQm91bmRzOworICAgIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZTsKKyAgICBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlOworICAgIEJvb2xlYW4gaXNIb3JpejsKKyAgICBQb2ludCBwdEhpdDsKKyAgICBSZWN0IHRyYWNrQm91bmRzOworICAgIENvbnRyb2xQYXJ0Q29kZSBwYXJ0Y29kZTsKICNpZm5kZWYgSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzCi0JUHlNYWNfUFJFQ0hFQ0soSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaXRUZXN0VGhlbWVTY3JvbGxCYXJBcnJvd3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiYmJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzY3JvbGxCYXJCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVTdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXNzU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0hvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0SGl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzKCZzY3JvbGxCYXJCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzc1N0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0hvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdEhpdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydGNvZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdHJhY2tCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgcGFydGNvZGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc2Nyb2xsQmFyQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVzc1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdEhpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cygmc2Nyb2xsQmFyQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRIaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRjb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRyYWNrQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRjb2RlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZVdpbmRvd1R5cGUgZmxhdm9yOwotCVJlY3QgaW5Db250UmVjdDsKLQlUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKLQlUaGVtZVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZVdpbmRvd1R5cGUgZmxhdm9yOworICAgIFJlY3QgaW5Db250UmVjdDsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBUaGVtZVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKICNpZm5kZWYgRHJhd1RoZW1lU2Nyb2xsQmFyRGVsaW1pdGVycwotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSE8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Db250UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzKGZsYXZvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJITyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkNvbnRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMoZmxhdm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVCdXR0b24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbkJvdW5kczsKLQlVSW50MTYgaW5LaW5kOwotCVRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvOwotCVRoZW1lQnV0dG9uRHJhd0luZm8gaW5QcmV2SW5mbzsKLQlVSW50MzIgaW5Vc2VyRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluQm91bmRzOworICAgIFVJbnQxNiBpbktpbmQ7CisgICAgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm87CisgICAgVGhlbWVCdXR0b25EcmF3SW5mbyBpblByZXZJbmZvOworICAgIFVJbnQzMiBpblVzZXJEYXRhOwogI2lmbmRlZiBEcmF3VGhlbWVCdXR0b24KLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVCdXR0b24pOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZUJ1dHRvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5OZXdJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpblByZXZJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Vc2VyRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVCdXR0b24oJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmluTmV3SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICZpblByZXZJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICBpblVzZXJEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5OZXdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvX0NvbnZlcnQsICZpblByZXZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Vc2VyRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVCdXR0b24oJmluQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmV3SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblByZXZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpblVzZXJEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVCdXR0b25SZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbkJvdW5kczsKLQlVSW50MTYgaW5LaW5kOwotCVRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5Cb3VuZHM7CisgICAgVUludDE2IGluS2luZDsKKyAgICBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbzsKICNpZm5kZWYgR2V0VGhlbWVCdXR0b25SZWdpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUJ1dHRvblJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25SZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluTmV3SW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZUJ1dHRvblJlZ2lvbigmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmV3SW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJnbkhhbmRsZSkwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5OZXdJbmZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lQnV0dG9uUmVnaW9uKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OZXdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmduSGFuZGxlKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbkJvdW5kczsKLQlVSW50MTYgaW5LaW5kOwotCVRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbzsKLQlSZWN0IG91dEJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGluQm91bmRzOworICAgIFVJbnQxNiBpbktpbmQ7CisgICAgVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvOworICAgIFJlY3Qgb3V0Qm91bmRzOwogI2lmbmRlZiBHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5EcmF3SW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMoJmluQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5LaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRHJhd0luZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Qm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0Qm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlbWVCdXR0b25EcmF3SW5mb19Db252ZXJ0LCAmaW5EcmF3SW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMoJmluQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRHJhd0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Qm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0Qm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgaW5Cb3VuZHM7Ci0JVUludDE2IGluS2luZDsKLQlUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm87Ci0JUmVjdCBvdXRCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbkJvdW5kczsKKyAgICBVSW50MTYgaW5LaW5kOworICAgIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbzsKKyAgICBSZWN0IG91dEJvdW5kczsKICNpZm5kZWYgR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUJ1dHRvbkJhY2tncm91bmRCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluRHJhd0luZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzKCZpbkJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydCwgJmluRHJhd0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzKCZpbkJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX1BsYXlUaGVtZVNvdW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lU291bmRLaW5kIGtpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVTb3VuZEtpbmQga2luZDsKICNpZm5kZWYgUGxheVRoZW1lU291bmQKLQlQeU1hY19QUkVDSEVDSyhQbGF5VGhlbWVTb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxheVRoZW1lU291bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZraW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBsYXlUaGVtZVNvdW5kKGtpbmQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAma2luZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQbGF5VGhlbWVTb3VuZChraW5kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfQmVnaW5UaGVtZURyYWdTb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZURyYWdTb3VuZEtpbmQga2luZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZURyYWdTb3VuZEtpbmQga2luZDsKICNpZm5kZWYgQmVnaW5UaGVtZURyYWdTb3VuZAotCVB5TWFjX1BSRUNIRUNLKEJlZ2luVGhlbWVEcmFnU291bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEJlZ2luVGhlbWVEcmFnU291bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZraW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJlZ2luVGhlbWVEcmFnU291bmQoa2luZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZraW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEJlZ2luVGhlbWVEcmFnU291bmQoa2luZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0VuZFRoZW1lRHJhZ1NvdW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBFbmRUaGVtZURyYWdTb3VuZAotCVB5TWFjX1BSRUNIRUNLKEVuZFRoZW1lRHJhZ1NvdW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmRUaGVtZURyYWdTb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEVuZFRoZW1lRHJhZ1NvdW5kKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmRUaGVtZURyYWdTb3VuZCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVUaWNrTWFyayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKLQlUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKICNpZm5kZWYgRHJhd1RoZW1lVGlja01hcmsKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVUaWNrTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lVGlja01hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVRpY2tNYXJrKCZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lVGlja01hcmsoJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVDaGFzaW5nQXJyb3dzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgYm91bmRzOwotCVVJbnQzMiBpbmRleDsKLQlUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKLQlVSW50MzIgZXJhc2VEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgYm91bmRzOworICAgIFVJbnQzMiBpbmRleDsKKyAgICBUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBVSW50MzIgZXJhc2VEYXRhOwogI2lmbmRlZiBEcmF3VGhlbWVDaGFzaW5nQXJyb3dzCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lQ2hhc2luZ0Fycm93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1RoZW1lQ2hhc2luZ0Fycm93cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXJhc2VEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZUNoYXNpbmdBcnJvd3MoJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlRGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyYXNlRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVDaGFzaW5nQXJyb3dzKCZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZURhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9EcmF3VGhlbWVQb3B1cEFycm93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgYm91bmRzOwotCVRoZW1lQXJyb3dPcmllbnRhdGlvbiBvcmllbnRhdGlvbjsKLQlUaGVtZVBvcHVwQXJyb3dTaXplIHNpemU7Ci0JVGhlbWVEcmF3U3RhdGUgc3RhdGU7Ci0JVUludDMyIGVyYXNlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBUaGVtZUFycm93T3JpZW50YXRpb24gb3JpZW50YXRpb247CisgICAgVGhlbWVQb3B1cEFycm93U2l6ZSBzaXplOworICAgIFRoZW1lRHJhd1N0YXRlIHN0YXRlOworICAgIFVJbnQzMiBlcmFzZURhdGE7CiAjaWZuZGVmIERyYXdUaGVtZVBvcHVwQXJyb3cKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQb3B1cEFycm93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVQb3B1cEFycm93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSEhsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZvcmllbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVyYXNlRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVQb3B1cEFycm93KCZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyYXNlRGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZISGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJhc2VEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERyYXdUaGVtZVBvcHVwQXJyb3coJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2VEYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgb3JpZ2luOwotCVRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uOwotCUJvb2xlYW4gaXNTbWFsbDsKLQlUaGVtZURyYXdTdGF0ZSBzdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBvcmlnaW47CisgICAgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247CisgICAgQm9vbGVhbiBpc1NtYWxsOworICAgIFRoZW1lRHJhd1N0YXRlIHN0YXRlOwogI2lmbmRlZiBEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveAotCVB5TWFjX1BSRUNIRUNLKERyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhibCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3Jvd0RpcmVjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveChvcmlnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3dEaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3Jvd0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzU21hbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveChvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3dEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBvcmlnaW47Ci0JVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247Ci0JQm9vbGVhbiBpc1NtYWxsOwotCVRoZW1lRHJhd1N0YXRlIHN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBvaW50IG9yaWdpbjsKKyAgICBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbjsKKyAgICBCb29sZWFuIGlzU21hbGw7CisgICAgVGhlbWVEcmF3U3RhdGUgc3RhdGU7CiAjaWZuZGVmIERyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gKLQlQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGhlbWVTdGFuZGFsb25lTm9Hcm93Qm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvcmlnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZncm93RGlyZWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNTbWFsbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gob3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3dEaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTbWFsbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3dEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveChvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvd0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NtYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVTdGFuZGFsb25lR3Jvd0JveEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBvcmlnaW47Ci0JVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb247Ci0JQm9vbGVhbiBpc1NtYWxsOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBvaW50IG9yaWdpbjsKKyAgICBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbjsKKyAgICBCb29sZWFuIGlzU21hbGw7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIEdldFRoZW1lU3RhbmRhbG9uZUdyb3dCb3hCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJm9yaWdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyb3dEaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpc1NtYWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lU3RhbmRhbG9uZUdyb3dCb3hCb3VuZHMob3JpZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3dEaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTbWFsbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncm93RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNTbWFsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzKG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm93RGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU21hbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX05vcm1hbGl6ZVRoZW1lRHJhd2luZ1N0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKE5vcm1hbGl6ZVRoZW1lRHJhd2luZ1N0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5vcm1hbGl6ZVRoZW1lRHJhd2luZ1N0YXRlKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9HZXRUaGVtZURyYXdpbmdTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZURyYXdpbmdTdGF0ZSBvdXRTdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZURyYXdpbmdTdGF0ZSBvdXRTdGF0ZTsKICNpZm5kZWYgR2V0VGhlbWVEcmF3aW5nU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZURyYXdpbmdTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVEcmF3aW5nU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZURyYXdpbmdTdGF0ZSgmb3V0U3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUaGVtZURyYXdpbmdTdGF0ZU9ial9OZXcsIG91dFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lRHJhd2luZ1N0YXRlKCZvdXRTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRoZW1lRHJhd2luZ1N0YXRlT2JqX05ldywgb3V0U3RhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkFwcF9BcHBseVRoZW1lQmFja2dyb3VuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUaGVtZUJhY2tncm91bmRLaW5kIGluS2luZDsKLQlSZWN0IGJvdW5kczsKLQlUaGVtZURyYXdTdGF0ZSBpblN0YXRlOwotCVNJbnQxNiBpbkRlcHRoOwotCUJvb2xlYW4gaW5Db2xvckRldjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZUJhY2tncm91bmRLaW5kIGluS2luZDsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBUaGVtZURyYXdTdGF0ZSBpblN0YXRlOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Db2xvckRldjsKICNpZm5kZWYgQXBwbHlUaGVtZUJhY2tncm91bmQKLQlQeU1hY19QUkVDSEVDSyhBcHBseVRoZW1lQmFja2dyb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQXBwbHlUaGVtZUJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBcHBseVRoZW1lQmFja2dyb3VuZChpbktpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29sb3JEZXYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmxoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbktpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29sb3JEZXYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQXBwbHlUaGVtZUJhY2tncm91bmQoaW5LaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlCb29sZWFuIGlzQWN0aXZlOwotCVNJbnQxNiBkZXB0aDsKLQlCb29sZWFuIGlzQ29sb3JEZXY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBCb29sZWFuIGlzQWN0aXZlOworICAgIFNJbnQxNiBkZXB0aDsKKyAgICBCb29sZWFuIGlzQ29sb3JEZXY7CiAjaWZuZGVmIFNldFRoZW1lVGV4dENvbG9yRm9yV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRoZW1lVGV4dENvbG9yRm9yV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0FjdGl2ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNDb2xvckRldikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb2xvckRldik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0NvbG9yRGV2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFRoZW1lVGV4dENvbG9yRm9yV2luZG93KHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbG9yRGV2KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JT1NUeXBlIGZpbGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CiAjaWZuZGVmIElzVmFsaWRBcHBlYXJhbmNlRmlsZVR5cGUKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkQXBwZWFyYW5jZUZpbGVUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1ZhbGlkQXBwZWFyYW5jZUZpbGVUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1ZhbGlkQXBwZWFyYW5jZUZpbGVUeXBlKGZpbGVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZShmaWxlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lQnJ1c2hBc0NvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lQnJ1c2ggaW5CcnVzaDsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluQ29sb3JEZXY7Ci0JUkdCQ29sb3Igb3V0Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVGhlbWVCcnVzaCBpbkJydXNoOworICAgIFNJbnQxNiBpbkRlcHRoOworICAgIEJvb2xlYW4gaW5Db2xvckRldjsKKyAgICBSR0JDb2xvciBvdXRDb2xvcjsKICNpZm5kZWYgR2V0VGhlbWVCcnVzaEFzQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRUaGVtZUJydXNoQXNDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGhlbWVCcnVzaEFzQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRUaGVtZUJydXNoQXNDb2xvcihpbkJydXNoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29sb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvdXRDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnJ1c2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvckRldikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUaGVtZUJydXNoQXNDb2xvcihpbkJydXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbG9yRGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29sb3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvdXRDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQXBwX0dldFRoZW1lVGV4dENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRoZW1lVGV4dENvbG9yIGluQ29sb3I7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbkNvbG9yRGV2OwotCVJHQkNvbG9yIG91dENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRoZW1lVGV4dENvbG9yIGluQ29sb3I7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbkNvbG9yRGV2OworICAgIFJHQkNvbG9yIG91dENvbG9yOwogI2lmbmRlZiBHZXRUaGVtZVRleHRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lVGV4dENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZVRleHRDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbG9yRGV2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lVGV4dENvbG9yKGluQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29sb3JEZXYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb2xvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm91dENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbG9yRGV2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRoZW1lVGV4dENvbG9yKGluQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29sb3JEZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm91dENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBcHBfR2V0VGhlbWVNZXRyaWMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVGhlbWVNZXRyaWMgaW5NZXRyaWM7Ci0JU0ludDMyIG91dE1ldHJpYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUaGVtZU1ldHJpYyBpbk1ldHJpYzsKKyAgICBTSW50MzIgb3V0TWV0cmljOwogI2lmbmRlZiBHZXRUaGVtZU1ldHJpYwotCVB5TWFjX1BSRUNIRUNLKEdldFRoZW1lTWV0cmljKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaGVtZU1ldHJpYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWV0cmljKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRoZW1lTWV0cmljKGluTWV0cmljLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0TWV0cmljKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNZXRyaWMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NZXRyaWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VGhlbWVNZXRyaWMoaW5NZXRyaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZXRyaWMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1ldHJpYyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBBcHBfbWV0aG9kc1tdID0gewotCXsiUmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50IiwgKFB5Q0Z1bmN0aW9uKUFwcF9SZWdpc3RlckFwcGVhcmFuY2VDbGllbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlVucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50IiwgKFB5Q0Z1bmN0aW9uKUFwcF9VbnJlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0VGhlbWVQZW4iLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lUGVuLCAxLAotCSBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVCYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lVGV4dENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVRleHRDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVUZXh0Q29sb3IgaW5Db2xvciwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAotCXsiU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVdpbmRvd0JhY2tncm91bmQsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgVGhlbWVCcnVzaCBpbkJydXNoLCBCb29sZWFuIGluVXBkYXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lV2luZG93SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVXaW5kb3dIZWFkZXIsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVdpbmRvd0xpc3RWaWV3SGVhZGVyLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVBsYWNhcmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVBsYWNhcmQsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lRWRpdFRleHRGcmFtZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lRWRpdFRleHRGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVMaXN0Qm94RnJhbWUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUxpc3RCb3hGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVGb2N1c1JlY3QiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUZvY3VzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIEJvb2xlYW4gaW5IYXNGb2N1cykgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVByaW1hcnlHcm91cCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUHJpbWFyeUdyb3VwLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVNlY29uZGFyeUdyb3VwIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTZWNvbmRhcnlHcm91cCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVTZXBhcmF0b3IiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVNlcGFyYXRvciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVNb2RlbGVzc0RpYWxvZ0ZyYW1lLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUdlbmVyaWNXZWxsIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVHZW5lcmljV2VsbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIEJvb2xlYW4gaW5GaWxsQ2VudGVyKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lRm9jdXNSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUZvY3VzUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluSGFzRm9jdXMpIC0+IE5vbmUiKX0sCi0JeyJJc1RoZW1lSW5Db2xvciIsIChQeUNGdW5jdGlvbilBcHBfSXNUaGVtZUluQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFRoZW1lQWNjZW50Q29sb3JzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUFjY2VudENvbG9ycywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ1RhYkhhbmRsZSBvdXRDb2xvcnMpIil9LAotCXsiRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVCYXJCYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBUaGVtZU1lbnVCYXJTdGF0ZSBpblN0YXRlLCBVSW50MzIgaW5BdHRyaWJ1dGVzKSAtPiBOb25lIil9LAotCXsiR2V0VGhlbWVNZW51QmFySGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVCYXJIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRIZWlnaHQpIil9LAotCXsiRHJhd1RoZW1lTWVudUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVCYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluTWVudVJlY3QsIFRoZW1lTWVudVR5cGUgaW5NZW51VHlwZSkgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudUJhY2tncm91bmRSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5NZW51UmVjdCwgVGhlbWVNZW51VHlwZSBtZW51VHlwZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZU1lbnVTZXBhcmF0b3IiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1lbnVTZXBhcmF0b3IsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5JdGVtUmVjdCkgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lTWVudVNlcGFyYXRvckhlaWdodCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0SGVpZ2h0KSIpfSwKLQl7IkdldFRoZW1lTWVudUl0ZW1FeHRyYSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51SXRlbUV4dHJhLCAxLAotCSBQeURvY19TVFIoIihUaGVtZU1lbnVJdGVtVHlwZSBpbkl0ZW1UeXBlKSAtPiAoU0ludDE2IG91dEhlaWdodCwgU0ludDE2IG91dFdpZHRoKSIpfSwKLQl7IkdldFRoZW1lTWVudVRpdGxlRXh0cmEiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudVRpdGxlRXh0cmEsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5Jc1NxdWlzaGVkKSAtPiAoU0ludDE2IG91dFdpZHRoKSIpfSwKLQl7IkRyYXdUaGVtZVRhYlBhbmUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRhYlBhbmUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAotCXsiR2V0VGhlbWVUYWJSZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGFiUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVUYWJTdHlsZSBpblN0eWxlLCBUaGVtZVRhYkRpcmVjdGlvbiBpbkRpcmVjdGlvbikgLT4gTm9uZSIpfSwKLQl7IlNldFRoZW1lQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZUN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVDdXJzb3IgaW5DdXJzb3IpIC0+IE5vbmUiKX0sCi0JeyJTZXRBbmltYXRlZFRoZW1lQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRBbmltYXRlZFRoZW1lQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihUaGVtZUN1cnNvciBpbkN1cnNvciwgVUludDMyIGluQW5pbWF0aW9uU3RlcCkgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUgb3V0U3R5bGUpIil9LAotCXsiR2V0VGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSBvdXRTdHlsZSkiKX0sCi0JeyJHZXRUaGVtZUNoZWNrQm94U3R5bGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQ2hlY2tCb3hTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVDaGVja0JveFN0eWxlIG91dFN0eWxlKSIpfSwKLQl7IlVzZVRoZW1lRm9udCIsIChQeUNGdW5jdGlvbilBcHBfVXNlVGhlbWVGb250LCAxLAotCSBQeURvY19TVFIoIihUaGVtZUZvbnRJRCBpbkZvbnRJRCwgU2NyaXB0Q29kZSBpblNjcmlwdCkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVRleHRCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVRleHRCb3gsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbldyYXBUb1dpZHRoLCBSZWN0IGluQm91bmRpbmdCb3gsIFNJbnQxNiBpbkp1c3QpIC0+IE5vbmUiKX0sCi0JeyJUcnVuY2F0ZVRoZW1lVGV4dCIsIChQeUNGdW5jdGlvbilBcHBfVHJ1bmNhdGVUaGVtZVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKENGTXV0YWJsZVN0cmluZ1JlZiBpblN0cmluZywgVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIFNJbnQxNiBpblBpeGVsV2lkdGhMaW1pdCwgVHJ1bmNDb2RlIGluVHJ1bmNXaGVyZSkgLT4gKEJvb2xlYW4gb3V0VHJ1bmNhdGVkKSIpfSwKLQl7IkdldFRoZW1lVGV4dERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGV4dERpbWVuc2lvbnMsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbldyYXBUb1dpZHRoLCBQb2ludCBpb0JvdW5kcykgLT4gKFBvaW50IGlvQm91bmRzLCBTSW50MTYgb3V0QmFzZWxpbmUpIil9LAotCXsiR2V0VGhlbWVUZXh0U2hhZG93T3V0c2V0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiAoUmVjdCBvdXRPdXRzZXQpIil9LAotCXsiRHJhd1RoZW1lU2Nyb2xsQmFyQXJyb3dzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGUsIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGUsIEJvb2xlYW4gaXNIb3JpeikgLT4gKFJlY3QgdHJhY2tCb3VuZHMpIil9LAotCXsiR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU2Nyb2xsQmFyVHJhY2tSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXopIC0+IChSZWN0IHRyYWNrQm91bmRzKSIpfSwKLQl7IkhpdFRlc3RUaGVtZVNjcm9sbEJhckFycm93cyIsIChQeUNGdW5jdGlvbilBcHBfSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHNjcm9sbEJhckJvdW5kcywgVGhlbWVUcmFja0VuYWJsZVN0YXRlIGVuYWJsZVN0YXRlLCBUaGVtZVRyYWNrUHJlc3NTdGF0ZSBwcmVzc1N0YXRlLCBCb29sZWFuIGlzSG9yaXosIFBvaW50IHB0SGl0KSAtPiAoQm9vbGVhbiBfcnYsIFJlY3QgdHJhY2tCb3VuZHMsIENvbnRyb2xQYXJ0Q29kZSBwYXJ0Y29kZSkiKX0sCi0JeyJEcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTY3JvbGxCYXJEZWxpbWl0ZXJzLCAxLAotCSBQeURvY19TVFIoIihUaGVtZVdpbmRvd1R5cGUgZmxhdm9yLCBSZWN0IGluQ29udFJlY3QsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBUaGVtZVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUJ1dHRvbiIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lQnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbywgVGhlbWVCdXR0b25EcmF3SW5mbyBpblByZXZJbmZvLCBVSW50MzIgaW5Vc2VyRGF0YSkgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lQnV0dG9uUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvblJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbk5ld0luZm8pIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZUJ1dHRvbkNvbnRlbnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvKSAtPiAoUmVjdCBvdXRCb3VuZHMpIil9LAotCXsiR2V0VGhlbWVCdXR0b25CYWNrZ3JvdW5kQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZUJ1dHRvbkJhY2tncm91bmRCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5EcmF3SW5mbykgLT4gKFJlY3Qgb3V0Qm91bmRzKSIpfSwKLQl7IlBsYXlUaGVtZVNvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9QbGF5VGhlbWVTb3VuZCwgMSwKLQkgUHlEb2NfU1RSKCIoVGhlbWVTb3VuZEtpbmQga2luZCkgLT4gTm9uZSIpfSwKLQl7IkJlZ2luVGhlbWVEcmFnU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0JlZ2luVGhlbWVEcmFnU291bmQsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lRHJhZ1NvdW5kS2luZCBraW5kKSAtPiBOb25lIil9LAotCXsiRW5kVGhlbWVEcmFnU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0VuZFRoZW1lRHJhZ1NvdW5kLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEcmF3VGhlbWVUaWNrTWFyayIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lVGlja01hcmssIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZUNoYXNpbmdBcnJvd3MiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUNoYXNpbmdBcnJvd3MsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBVSW50MzIgaW5kZXgsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBVSW50MzIgZXJhc2VEYXRhKSAtPiBOb25lIil9LAotCXsiRHJhd1RoZW1lUG9wdXBBcnJvdyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUG9wdXBBcnJvdywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lQXJyb3dPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgVGhlbWVQb3B1cEFycm93U2l6ZSBzaXplLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSwgVUludDMyIGVyYXNlRGF0YSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVTdGFuZGFsb25lR3Jvd0JveCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgb3JpZ2luLCBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbiwgQm9vbGVhbiBpc1NtYWxsLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVOb0dyb3dCb3gsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IG9yaWdpbiwgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb24sIEJvb2xlYW4gaXNTbWFsbCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVN0YW5kYWxvbmVHcm93Qm94Qm91bmRzLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBvcmlnaW4sIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uLCBCb29sZWFuIGlzU21hbGwpIC0+IChSZWN0IGJvdW5kcykiKX0sCi0JeyJOb3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSIsIChQeUNGdW5jdGlvbilBcHBfTm9ybWFsaXplVGhlbWVEcmF3aW5nU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldFRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZURyYXdpbmdTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVEcmF3aW5nU3RhdGUgb3V0U3RhdGUpIil9LAotCXsiQXBwbHlUaGVtZUJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX0FwcGx5VGhlbWVCYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihUaGVtZUJhY2tncm91bmRLaW5kIGluS2luZCwgUmVjdCBib3VuZHMsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IE5vbmUiKX0sCi0JeyJTZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVUZXh0Q29sb3JGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIEJvb2xlYW4gaXNBY3RpdmUsIFNJbnQxNiBkZXB0aCwgQm9vbGVhbiBpc0NvbG9yRGV2KSAtPiBOb25lIil9LAotCXsiSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilBcHBfSXNWYWxpZEFwcGVhcmFuY2VGaWxlVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0VGhlbWVCcnVzaEFzQ29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnJ1c2hBc0NvbG9yLCAxLAotCSBQeURvY19TVFIoIihUaGVtZUJydXNoIGluQnJ1c2gsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IChSR0JDb2xvciBvdXRDb2xvcikiKX0sCi0JeyJHZXRUaGVtZVRleHRDb2xvciIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUZXh0Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lVGV4dENvbG9yIGluQ29sb3IsIFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluQ29sb3JEZXYpIC0+IChSR0JDb2xvciBvdXRDb2xvcikiKX0sCi0JeyJHZXRUaGVtZU1ldHJpYyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZXRyaWMsIDEsCi0JIFB5RG9jX1NUUigiKFRoZW1lTWV0cmljIGluTWV0cmljKSAtPiAoU0ludDMyIG91dE1ldHJpYykiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJSZWdpc3RlckFwcGVhcmFuY2VDbGllbnQiLCAoUHlDRnVuY3Rpb24pQXBwX1JlZ2lzdGVyQXBwZWFyYW5jZUNsaWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVW5yZWdpc3RlckFwcGVhcmFuY2VDbGllbnQiLCAoUHlDRnVuY3Rpb24pQXBwX1VucmVnaXN0ZXJBcHBlYXJhbmNlQ2xpZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRUaGVtZVBlbiIsIChQeUNGdW5jdGlvbilBcHBfU2V0VGhlbWVQZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lQnJ1c2ggaW5CcnVzaCwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZUJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lQnJ1c2ggaW5CcnVzaCwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVUZXh0Q29sb3IiLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lVGV4dENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZVRleHRDb2xvciBpbkNvbG9yLCBTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRUaGVtZVdpbmRvd0JhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lV2luZG93QmFja2dyb3VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBUaGVtZUJydXNoIGluQnJ1c2gsIEJvb2xlYW4gaW5VcGRhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVXaW5kb3dIZWFkZXIiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVdpbmRvd0hlYWRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVXaW5kb3dMaXN0Vmlld0hlYWRlciIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lV2luZG93TGlzdFZpZXdIZWFkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lUGxhY2FyZCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lUGxhY2FyZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVFZGl0VGV4dEZyYW1lIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVFZGl0VGV4dEZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUxpc3RCb3hGcmFtZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lTGlzdEJveEZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZUZvY3VzUmVjdCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lRm9jdXNSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgQm9vbGVhbiBpbkhhc0ZvY3VzKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lUHJpbWFyeUdyb3VwIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVQcmltYXJ5R3JvdXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lU2Vjb25kYXJ5R3JvdXAiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVNlY29uZGFyeUdyb3VwLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVNlcGFyYXRvciIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU2VwYXJhdG9yLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZU1vZGVsZXNzRGlhbG9nRnJhbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lR2VuZXJpY1dlbGwiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZUdlbmVyaWNXZWxsLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluUmVjdCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgQm9vbGVhbiBpbkZpbGxDZW50ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVGb2N1c1JlZ2lvbiIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lRm9jdXNSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5IYXNGb2N1cykgLT4gTm9uZSIpfSwKKyAgICB7IklzVGhlbWVJbkNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9Jc1RoZW1lSW5Db2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0VGhlbWVBY2NlbnRDb2xvcnMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQWNjZW50Q29sb3JzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDVGFiSGFuZGxlIG91dENvbG9ycykiKX0sCisgICAgeyJEcmF3VGhlbWVNZW51QmFyQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lTWVudUJhckJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFRoZW1lTWVudUJhclN0YXRlIGluU3RhdGUsIFVJbnQzMiBpbkF0dHJpYnV0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaGVtZU1lbnVCYXJIZWlnaHQiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lTWVudUJhckhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEhlaWdodCkiKX0sCisgICAgeyJEcmF3VGhlbWVNZW51QmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lTWVudUJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5NZW51UmVjdCwgVGhlbWVNZW51VHlwZSBpbk1lbnVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbiIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51QmFja2dyb3VuZFJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbk1lbnVSZWN0LCBUaGVtZU1lbnVUeXBlIG1lbnVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lTWVudVNlcGFyYXRvciIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lTWVudVNlcGFyYXRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkl0ZW1SZWN0KSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVNZW51U2VwYXJhdG9ySGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVTZXBhcmF0b3JIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRIZWlnaHQpIil9LAorICAgIHsiR2V0VGhlbWVNZW51SXRlbUV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1lbnVJdGVtRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lTWVudUl0ZW1UeXBlIGluSXRlbVR5cGUpIC0+IChTSW50MTYgb3V0SGVpZ2h0LCBTSW50MTYgb3V0V2lkdGgpIil9LAorICAgIHsiR2V0VGhlbWVNZW51VGl0bGVFeHRyYSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVNZW51VGl0bGVFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbklzU3F1aXNoZWQpIC0+IChTSW50MTYgb3V0V2lkdGgpIil9LAorICAgIHsiRHJhd1RoZW1lVGFiUGFuZSIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lVGFiUGFuZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblJlY3QsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaGVtZVRhYlJlZ2lvbiIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUYWJSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5SZWN0LCBUaGVtZVRhYlN0eWxlIGluU3R5bGUsIFRoZW1lVGFiRGlyZWN0aW9uIGluRGlyZWN0aW9uKSAtPiBOb25lIil9LAorICAgIHsiU2V0VGhlbWVDdXJzb3IiLCAoUHlDRnVuY3Rpb24pQXBwX1NldFRoZW1lQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZUN1cnNvciBpbkN1cnNvcikgLT4gTm9uZSIpfSwKKyAgICB7IlNldEFuaW1hdGVkVGhlbWVDdXJzb3IiLCAoUHlDRnVuY3Rpb24pQXBwX1NldEFuaW1hdGVkVGhlbWVDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lQ3Vyc29yIGluQ3Vyc29yLCBVSW50MzIgaW5BbmltYXRpb25TdGVwKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVTY3JvbGxCYXJUaHVtYlN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVNjcm9sbEJhclRodW1iU3R5bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZSBvdXRTdHlsZSkiKX0sCisgICAgeyJHZXRUaGVtZVNjcm9sbEJhckFycm93U3R5bGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU2Nyb2xsQmFyQXJyb3dTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlIG91dFN0eWxlKSIpfSwKKyAgICB7IkdldFRoZW1lQ2hlY2tCb3hTdHlsZSIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVDaGVja0JveFN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaGVtZUNoZWNrQm94U3R5bGUgb3V0U3R5bGUpIil9LAorICAgIHsiVXNlVGhlbWVGb250IiwgKFB5Q0Z1bmN0aW9uKUFwcF9Vc2VUaGVtZUZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lRm9udElEIGluRm9udElELCBTY3JpcHRDb2RlIGluU2NyaXB0KSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lVGV4dEJveCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lVGV4dEJveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBCb29sZWFuIGluV3JhcFRvV2lkdGgsIFJlY3QgaW5Cb3VuZGluZ0JveCwgU0ludDE2IGluSnVzdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRydW5jYXRlVGhlbWVUZXh0IiwgKFB5Q0Z1bmN0aW9uKUFwcF9UcnVuY2F0ZVRoZW1lVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZNdXRhYmxlU3RyaW5nUmVmIGluU3RyaW5nLCBUaGVtZUZvbnRJRCBpbkZvbnRJRCwgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgU0ludDE2IGluUGl4ZWxXaWR0aExpbWl0LCBUcnVuY0NvZGUgaW5UcnVuY1doZXJlKSAtPiAoQm9vbGVhbiBvdXRUcnVuY2F0ZWQpIil9LAorICAgIHsiR2V0VGhlbWVUZXh0RGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVUZXh0RGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIFRoZW1lRm9udElEIGluRm9udElELCBUaGVtZURyYXdTdGF0ZSBpblN0YXRlLCBCb29sZWFuIGluV3JhcFRvV2lkdGgsIFBvaW50IGlvQm91bmRzKSAtPiAoUG9pbnQgaW9Cb3VuZHMsIFNJbnQxNiBvdXRCYXNlbGluZSkiKX0sCisgICAgeyJHZXRUaGVtZVRleHRTaGFkb3dPdXRzZXQiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lVGV4dFNoYWRvd091dHNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVGb250SUQgaW5Gb250SUQsIFRoZW1lRHJhd1N0YXRlIGluU3RhdGUpIC0+IChSZWN0IG91dE91dHNldCkiKX0sCisgICAgeyJEcmF3VGhlbWVTY3JvbGxCYXJBcnJvd3MiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVNjcm9sbEJhckFycm93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lVHJhY2tFbmFibGVTdGF0ZSBlbmFibGVTdGF0ZSwgVGhlbWVUcmFja1ByZXNzU3RhdGUgcHJlc3NTdGF0ZSwgQm9vbGVhbiBpc0hvcml6KSAtPiAoUmVjdCB0cmFja0JvdW5kcykiKX0sCisgICAgeyJHZXRUaGVtZVNjcm9sbEJhclRyYWNrUmVjdCIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVTY3JvbGxCYXJUcmFja1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzLCBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGUsIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGUsIEJvb2xlYW4gaXNIb3JpeikgLT4gKFJlY3QgdHJhY2tCb3VuZHMpIil9LAorICAgIHsiSGl0VGVzdFRoZW1lU2Nyb2xsQmFyQXJyb3dzIiwgKFB5Q0Z1bmN0aW9uKUFwcF9IaXRUZXN0VGhlbWVTY3JvbGxCYXJBcnJvd3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgc2Nyb2xsQmFyQm91bmRzLCBUaGVtZVRyYWNrRW5hYmxlU3RhdGUgZW5hYmxlU3RhdGUsIFRoZW1lVHJhY2tQcmVzc1N0YXRlIHByZXNzU3RhdGUsIEJvb2xlYW4gaXNIb3JpeiwgUG9pbnQgcHRIaXQpIC0+IChCb29sZWFuIF9ydiwgUmVjdCB0cmFja0JvdW5kcywgQ29udHJvbFBhcnRDb2RlIHBhcnRjb2RlKSIpfSwKKyAgICB7IkRyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMiLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVNjcm9sbEJhckRlbGltaXRlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lV2luZG93VHlwZSBmbGF2b3IsIFJlY3QgaW5Db250UmVjdCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUsIFRoZW1lV2luZG93QXR0cmlidXRlcyBhdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lQnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVCdXR0b24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaW5Cb3VuZHMsIFVJbnQxNiBpbktpbmQsIFRoZW1lQnV0dG9uRHJhd0luZm8gaW5OZXdJbmZvLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluUHJldkluZm8sIFVJbnQzMiBpblVzZXJEYXRhKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVCdXR0b25SZWdpb24iLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnV0dG9uUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluTmV3SW5mbykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lQnV0dG9uQ29udGVudEJvdW5kcyIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVCdXR0b25Db250ZW50Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluQm91bmRzLCBVSW50MTYgaW5LaW5kLCBUaGVtZUJ1dHRvbkRyYXdJbmZvIGluRHJhd0luZm8pIC0+IChSZWN0IG91dEJvdW5kcykiKX0sCisgICAgeyJHZXRUaGVtZUJ1dHRvbkJhY2tncm91bmRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lQnV0dG9uQmFja2dyb3VuZEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kcywgVUludDE2IGluS2luZCwgVGhlbWVCdXR0b25EcmF3SW5mbyBpbkRyYXdJbmZvKSAtPiAoUmVjdCBvdXRCb3VuZHMpIil9LAorICAgIHsiUGxheVRoZW1lU291bmQiLCAoUHlDRnVuY3Rpb24pQXBwX1BsYXlUaGVtZVNvdW5kLCAxLAorICAgICBQeURvY19TVFIoIihUaGVtZVNvdW5kS2luZCBraW5kKSAtPiBOb25lIil9LAorICAgIHsiQmVnaW5UaGVtZURyYWdTb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfQmVnaW5UaGVtZURyYWdTb3VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVEcmFnU291bmRLaW5kIGtpbmQpIC0+IE5vbmUiKX0sCisgICAgeyJFbmRUaGVtZURyYWdTb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfRW5kVGhlbWVEcmFnU291bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdUaGVtZVRpY2tNYXJrIiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVUaWNrTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFRoZW1lRHJhd1N0YXRlIHN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lQ2hhc2luZ0Fycm93cyIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lQ2hhc2luZ0Fycm93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMsIFVJbnQzMiBpbmRleCwgVGhlbWVEcmF3U3RhdGUgc3RhdGUsIFVJbnQzMiBlcmFzZURhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3VGhlbWVQb3B1cEFycm93IiwgKFB5Q0Z1bmN0aW9uKUFwcF9EcmF3VGhlbWVQb3B1cEFycm93LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcywgVGhlbWVBcnJvd09yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBUaGVtZVBvcHVwQXJyb3dTaXplIHNpemUsIFRoZW1lRHJhd1N0YXRlIHN0YXRlLCBVSW50MzIgZXJhc2VEYXRhKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lU3RhbmRhbG9uZUdyb3dCb3giLCAoUHlDRnVuY3Rpb24pQXBwX0RyYXdUaGVtZVN0YW5kYWxvbmVHcm93Qm94LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBvcmlnaW4sIFRoZW1lR3Jvd0RpcmVjdGlvbiBncm93RGlyZWN0aW9uLCBCb29sZWFuIGlzU21hbGwsIFRoZW1lRHJhd1N0YXRlIHN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveCIsIChQeUNGdW5jdGlvbilBcHBfRHJhd1RoZW1lU3RhbmRhbG9uZU5vR3Jvd0JveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgb3JpZ2luLCBUaGVtZUdyb3dEaXJlY3Rpb24gZ3Jvd0RpcmVjdGlvbiwgQm9vbGVhbiBpc1NtYWxsLCBUaGVtZURyYXdTdGF0ZSBzdGF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRoZW1lU3RhbmRhbG9uZUdyb3dCb3hCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lU3RhbmRhbG9uZUdyb3dCb3hCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IG9yaWdpbiwgVGhlbWVHcm93RGlyZWN0aW9uIGdyb3dEaXJlY3Rpb24sIEJvb2xlYW4gaXNTbWFsbCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7Ik5vcm1hbGl6ZVRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9Ob3JtYWxpemVUaGVtZURyYXdpbmdTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlDRnVuY3Rpb24pQXBwX0dldFRoZW1lRHJhd2luZ1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaGVtZURyYXdpbmdTdGF0ZSBvdXRTdGF0ZSkiKX0sCisgICAgeyJBcHBseVRoZW1lQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilBcHBfQXBwbHlUaGVtZUJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lQmFja2dyb3VuZEtpbmQgaW5LaW5kLCBSZWN0IGJvdW5kcywgVGhlbWVEcmF3U3RhdGUgaW5TdGF0ZSwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Db2xvckRldikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRoZW1lVGV4dENvbG9yRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUFwcF9TZXRUaGVtZVRleHRDb2xvckZvcldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgQm9vbGVhbiBpc0FjdGl2ZSwgU0ludDE2IGRlcHRoLCBCb29sZWFuIGlzQ29sb3JEZXYpIC0+IE5vbmUiKX0sCisgICAgeyJJc1ZhbGlkQXBwZWFyYW5jZUZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKUFwcF9Jc1ZhbGlkQXBwZWFyYW5jZUZpbGVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRUaGVtZUJydXNoQXNDb2xvciIsIChQeUNGdW5jdGlvbilBcHBfR2V0VGhlbWVCcnVzaEFzQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFRoZW1lQnJ1c2ggaW5CcnVzaCwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Db2xvckRldikgLT4gKFJHQkNvbG9yIG91dENvbG9yKSIpfSwKKyAgICB7IkdldFRoZW1lVGV4dENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZVRleHRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVUZXh0Q29sb3IgaW5Db2xvciwgU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Db2xvckRldikgLT4gKFJHQkNvbG9yIG91dENvbG9yKSIpfSwKKyAgICB7IkdldFRoZW1lTWV0cmljIiwgKFB5Q0Z1bmN0aW9uKUFwcF9HZXRUaGVtZU1ldHJpYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGhlbWVNZXRyaWMgaW5NZXRyaWMpIC0+IChTSW50MzIgb3V0TWV0cmljKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIAotI2Vsc2UgIAkvKiBfX0xQNjRfXyAqLworI2Vsc2UgICAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgQXBwX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwpAQCAtMTgwNSwyNiArMTgwNSwyNiBAQAogCiB2b2lkIGluaXRfQXBwKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQXBwIiwgQXBwX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQXBwIiwgQXBwX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUFwcF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEFwcF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEFwcF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCVRoZW1lRHJhd2luZ1N0YXRlX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVGhlbWVEcmF3aW5nU3RhdGUiLCAoUHlPYmplY3QgKikmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRoZW1lRHJhd2luZ1N0YXRlVHlwZSIsIChQeU9iamVjdCAqKSZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBBcHBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChBcHBfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBBcHBfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBUaGVtZURyYXdpbmdTdGF0ZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZUaGVtZURyYXdpbmdTdGF0ZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRoZW1lRHJhd2luZ1N0YXRlIiwgKFB5T2JqZWN0ICopJlRoZW1lRHJhd2luZ1N0YXRlX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaGVtZURyYXdpbmdTdGF0ZVR5cGUiLCAoUHlPYmplY3QgKikmVGhlbWVEcmF3aW5nU3RhdGVfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYXV0b0dJTC5jIGIvTWFjL01vZHVsZXMvYXV0b0dJTC5jCmluZGV4IGFmMmU2OTkuLjNiYzE1OTMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2F1dG9HSUwuYworKysgYi9NYWMvTW9kdWxlcy9hdXRvR0lMLmMKQEAgLTE2LDkzICsxNiw5MyBAQAogCiAKIHN0YXRpYyB2b2lkIGF1dG9HSUxDYWxsYmFjayhDRlJ1bkxvb3BPYnNlcnZlclJlZiBvYnNlcnZlciwKLQkJCSAgICBDRlJ1bkxvb3BBY3Rpdml0eSBhY3Rpdml0eSwKLQkJCSAgICB2b2lkICppbmZvKSB7Ci0JUHlUaHJlYWRTdGF0ZSAqKnBfdHN0YXRlID0gKFB5VGhyZWFkU3RhdGUgKiopaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJ1bkxvb3BBY3Rpdml0eSBhY3Rpdml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbmZvKSB7CisgICAgUHlUaHJlYWRTdGF0ZSAqKnBfdHN0YXRlID0gKFB5VGhyZWFkU3RhdGUgKiopaW5mbzsKIAotCXN3aXRjaCAoYWN0aXZpdHkpIHsKLQljYXNlIGtDRlJ1bkxvb3BCZWZvcmVXYWl0aW5nOgotCQkvKiBnb2luZyB0byBzbGVlcCwgcmVsZWFzZSBHSUwgKi8KKyAgICBzd2l0Y2ggKGFjdGl2aXR5KSB7CisgICAgY2FzZSBrQ0ZSdW5Mb29wQmVmb3JlV2FpdGluZzoKKyAgICAgICAgLyogZ29pbmcgdG8gc2xlZXAsIHJlbGVhc2UgR0lMICovCiAjaWZkZWYgQVVUT0dJTF9ERUJVRwotCQlmcHJpbnRmKHN0ZGVyciwgImdvaW5nIHRvIHNsZWVwLCByZWxlYXNlIEdJTFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ29pbmcgdG8gc2xlZXAsIHJlbGVhc2UgR0lMXG4iKTsKICNlbmRpZgotCQkqcF90c3RhdGUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOwotCQlicmVhazsKLQljYXNlIGtDRlJ1bkxvb3BBZnRlcldhaXRpbmc6Ci0JCS8qIHdha2luZyB1cCwgYWNxdWlyZSBHSUwgKi8KKyAgICAgICAgKnBfdHN0YXRlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZSdW5Mb29wQWZ0ZXJXYWl0aW5nOgorICAgICAgICAvKiB3YWtpbmcgdXAsIGFjcXVpcmUgR0lMICovCiAjaWZkZWYgQVVUT0dJTF9ERUJVRwotCQlmcHJpbnRmKHN0ZGVyciwgIndha2luZyB1cCwgYWNxdWlyZSBHSUxcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIndha2luZyB1cCwgYWNxdWlyZSBHSUxcbiIpOwogI2VuZGlmCi0JCVB5RXZhbF9SZXN0b3JlVGhyZWFkKCpwX3RzdGF0ZSk7Ci0JCSpwX3RzdGF0ZSA9IE5VTEw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoKnBfdHN0YXRlKTsKKyAgICAgICAgKnBfdHN0YXRlID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBpbmZvUmVsZWFzZShjb25zdCB2b2lkICppbmZvKSB7Ci0JLyogWFhYIFRoaXMgc2hvdWxkIGdldCBjYWxsZWQgd2hlbiB0aGUgcnVuIGxvb3AgaXMgZGVhbGxvY2F0ZWQsCi0JICAgYnV0IHRoaXMgZG9lc24ndCBzZWVtIHRvIGhhcHBlbi4gU28gZm9yIG5vdzogbGVhay4gKi8KLQlQeU1lbV9GcmVlKCh2b2lkICopaW5mbyk7CisgICAgLyogWFhYIFRoaXMgc2hvdWxkIGdldCBjYWxsZWQgd2hlbiB0aGUgcnVuIGxvb3AgaXMgZGVhbGxvY2F0ZWQsCisgICAgICAgYnV0IHRoaXMgZG9lc24ndCBzZWVtIHRvIGhhcHBlbi4gU28gZm9yIG5vdzogbGVhay4gKi8KKyAgICBQeU1lbV9GcmVlKCh2b2lkICopaW5mbyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBhdXRvR0lMX2luc3RhbGxBdXRvR0lMKFB5T2JqZWN0ICpzZWxmKQogewotCVB5T2JqZWN0ICp0c3RhdGVfZGljdCA9IFB5VGhyZWFkU3RhdGVfR2V0RGljdCgpOwotCVB5T2JqZWN0ICp2OwotCUNGUnVuTG9vcFJlZiBybDsKLQlQeVRocmVhZFN0YXRlICoqcF90c3RhdGU7ICAvKiBmb3IgdXNlIGluIHRoZSBpbmZvIGZpZWxkICovCi0JQ0ZSdW5Mb29wT2JzZXJ2ZXJDb250ZXh0IGNvbnRleHQgPSB7MCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTH07Ci0JQ0ZSdW5Mb29wT2JzZXJ2ZXJSZWYgb2JzZXJ2ZXI7CisgICAgUHlPYmplY3QgKnRzdGF0ZV9kaWN0ID0gUHlUaHJlYWRTdGF0ZV9HZXREaWN0KCk7CisgICAgUHlPYmplY3QgKnY7CisgICAgQ0ZSdW5Mb29wUmVmIHJsOworICAgIFB5VGhyZWFkU3RhdGUgKipwX3RzdGF0ZTsgIC8qIGZvciB1c2UgaW4gdGhlIGluZm8gZmllbGQgKi8KKyAgICBDRlJ1bkxvb3BPYnNlcnZlckNvbnRleHQgY29udGV4dCA9IHswLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfTsKKyAgICBDRlJ1bkxvb3BPYnNlcnZlclJlZiBvYnNlcnZlcjsKIAotCWlmICh0c3RhdGVfZGljdCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQl2ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHN0YXRlX2RpY3QsICJhdXRvR0lMLkluc3RhbGxlZEF1dG9HSUwiKTsKLQlpZiAodiAhPSBOVUxMKSB7Ci0JCS8qIHdlJ3ZlIGFscmVhZHkgaW5zdGFsbGVkIGEgY2FsbGJhY2sgZm9yIHRoaXMgdGhyZWFkICovCi0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQorICAgIGlmICh0c3RhdGVfZGljdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB2ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcodHN0YXRlX2RpY3QsICJhdXRvR0lMLkluc3RhbGxlZEF1dG9HSUwiKTsKKyAgICBpZiAodiAhPSBOVUxMKSB7CisgICAgICAgIC8qIHdlJ3ZlIGFscmVhZHkgaW5zdGFsbGVkIGEgY2FsbGJhY2sgZm9yIHRoaXMgdGhyZWFkICovCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQogCi0JcmwgPSBDRlJ1bkxvb3BHZXRDdXJyZW50KCk7Ci0JaWYgKHJsID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKEF1dG9HSUxFcnJvciwKLQkJCQkiY2FuJ3QgZ2V0IHJ1biBsb29wIGZvciBjdXJyZW50IHRocmVhZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisgICAgcmwgPSBDRlJ1bkxvb3BHZXRDdXJyZW50KCk7CisgICAgaWYgKHJsID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEF1dG9HSUxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBnZXQgcnVuIGxvb3AgZm9yIGN1cnJlbnQgdGhyZWFkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCXBfdHN0YXRlID0gUHlNZW1fTWFsbG9jKHNpemVvZihQeVRocmVhZFN0YXRlICopKTsKLQlpZiAocF90c3RhdGUgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsCi0JCQkJIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlICIKLQkJCQkidHN0YXRlIHBvaW50ZXIiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCSpwX3RzdGF0ZSA9IE5VTEw7Ci0JY29udGV4dC5pbmZvID0gKHZvaWQgKilwX3RzdGF0ZTsKLQljb250ZXh0LnJlbGVhc2UgPSBpbmZvUmVsZWFzZTsKKyAgICBwX3RzdGF0ZSA9IFB5TWVtX01hbGxvYyhzaXplb2YoUHlUaHJlYWRTdGF0ZSAqKSk7CisgICAgaWYgKHBfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0c3RhdGUgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgKnBfdHN0YXRlID0gTlVMTDsKKyAgICBjb250ZXh0LmluZm8gPSAodm9pZCAqKXBfdHN0YXRlOworICAgIGNvbnRleHQucmVsZWFzZSA9IGluZm9SZWxlYXNlOwogCi0Jb2JzZXJ2ZXIgPSBDRlJ1bkxvb3BPYnNlcnZlckNyZWF0ZSgKLQkJTlVMTCwKLQkJa0NGUnVuTG9vcEJlZm9yZVdhaXRpbmcgfCBrQ0ZSdW5Mb29wQWZ0ZXJXYWl0aW5nLAotCQkxLCAwLCBhdXRvR0lMQ2FsbGJhY2ssICZjb250ZXh0KTsKLQlpZiAob2JzZXJ2ZXIgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoQXV0b0dJTEVycm9yLAotCQkJCSJjYW4ndCBjcmVhdGUgZXZlbnQgbG9vcCBvYnNlcnZlciIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JQ0ZSdW5Mb29wQWRkT2JzZXJ2ZXIocmwsIG9ic2VydmVyLCBrQ0ZSdW5Mb29wRGVmYXVsdE1vZGUpOwotCS8qIFhYWCBob3cgdG8gY2hlY2sgZm9yIGVycm9ycz8gKi8KKyAgICBvYnNlcnZlciA9IENGUnVuTG9vcE9ic2VydmVyQ3JlYXRlKAorICAgICAgICBOVUxMLAorICAgICAgICBrQ0ZSdW5Mb29wQmVmb3JlV2FpdGluZyB8IGtDRlJ1bkxvb3BBZnRlcldhaXRpbmcsCisgICAgICAgIDEsIDAsIGF1dG9HSUxDYWxsYmFjaywgJmNvbnRleHQpOworICAgIGlmIChvYnNlcnZlciA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhBdXRvR0lMRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgY3JlYXRlIGV2ZW50IGxvb3Agb2JzZXJ2ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIENGUnVuTG9vcEFkZE9ic2VydmVyKHJsLCBvYnNlcnZlciwga0NGUnVuTG9vcERlZmF1bHRNb2RlKTsKKyAgICAvKiBYWFggaG93IHRvIGNoZWNrIGZvciBlcnJvcnM/ICovCiAKLQkvKiByZWdpc3RlciB0aGF0IHdlIGhhdmUgaW5zdGFsbGVkIGEgY2FsbGJhY2sgZm9yIHRoaXMgdGhyZWFkICovCi0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHRzdGF0ZV9kaWN0LCAiYXV0b0dJTC5JbnN0YWxsZWRBdXRvR0lMIiwKLQkJCQkgUHlfTm9uZSkgPCAwKQotCQlyZXR1cm4gTlVMTDsKKyAgICAvKiByZWdpc3RlciB0aGF0IHdlIGhhdmUgaW5zdGFsbGVkIGEgY2FsbGJhY2sgZm9yIHRoaXMgdGhyZWFkICovCisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHRzdGF0ZV9kaWN0LCAiYXV0b0dJTC5JbnN0YWxsZWRBdXRvR0lMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIFB5RG9jX1NUUlZBUihhdXRvR0lMX2luc3RhbGxBdXRvR0lMX2RvYywKQEAgLTExNCwxMyArMTE0LDEzIEBACiApOwogCiBzdGF0aWMgUHlNZXRob2REZWYgYXV0b0dJTF9tZXRob2RzW10gPSB7Ci0JewotCQkiaW5zdGFsbEF1dG9HSUwiLAotCQkoUHlDRnVuY3Rpb24pYXV0b0dJTF9pbnN0YWxsQXV0b0dJTCwKLQkJTUVUSF9OT0FSR1MsCi0JCWF1dG9HSUxfaW5zdGFsbEF1dG9HSUxfZG9jCi0JfSwKLQl7IDAsIDAsIDAsIDAgfSAvKiBzZW50aW5lbCAqLworICAgIHsKKyAgICAgICAgImluc3RhbGxBdXRvR0lMIiwKKyAgICAgICAgKFB5Q0Z1bmN0aW9uKWF1dG9HSUxfaW5zdGFsbEF1dG9HSUwsCisgICAgICAgIE1FVEhfTk9BUkdTLAorICAgICAgICBhdXRvR0lMX2luc3RhbGxBdXRvR0lMX2RvYworICAgIH0sCisgICAgeyAwLCAwLCAwLCAwIH0gLyogc2VudGluZWwgKi8KIH07CiAKIFB5RG9jX1NUUlZBUihhdXRvR0lMX2RvY3MsCkBAIC0xMzIsMjEgKzEzMiwyMSBAQAogUHlNT0RJTklUX0ZVTkMKIGluaXRhdXRvR0lMKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm1vZDsKKyAgICBQeU9iamVjdCAqbW9kOwogCi0JaWYgKFB5RXJyX1dhcm5QeTNrKCJJbiAzLngsIHRoZSBhdXRvR0lMIG1vZHVsZSBpcyByZW1vdmVkLiIsIDEpIDwgMCkKLQkJcmV0dXJuOworICAgIGlmIChQeUVycl9XYXJuUHkzaygiSW4gMy54LCB0aGUgYXV0b0dJTCBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSA8IDApCisgICAgICAgIHJldHVybjsKIAotCW1vZCA9IFB5X0luaXRNb2R1bGU0KCJhdXRvR0lMIiwgYXV0b0dJTF9tZXRob2RzLCBhdXRvR0lMX2RvY3MsCi0JCQkgICAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlyZXR1cm47Ci0JQXV0b0dJTEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdXRvR0lMLkF1dG9HSUxFcnJvciIsCi0JCQkJCSAgUHlFeGNfRXhjZXB0aW9uLCBOVUxMKTsKLQlpZiAoQXV0b0dJTEVycm9yID09IE5VTEwpCi0JCXJldHVybjsKLQlQeV9JTkNSRUYoQXV0b0dJTEVycm9yKTsKLQlpZiAoUHlNb2R1bGVfQWRkT2JqZWN0KG1vZCwgIkF1dG9HSUxFcnJvciIsCi0JCQkgICAgICAgQXV0b0dJTEVycm9yKSA8IDApCi0JCXJldHVybjsKKyAgICBtb2QgPSBQeV9Jbml0TW9kdWxlNCgiYXV0b0dJTCIsIGF1dG9HSUxfbWV0aG9kcywgYXV0b0dJTF9kb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIFBZVEhPTl9BUElfVkVSU0lPTik7CisgICAgaWYgKG1vZCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgQXV0b0dJTEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJhdXRvR0lMLkF1dG9HSUxFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXhjX0V4Y2VwdGlvbiwgTlVMTCk7CisgICAgaWYgKEF1dG9HSUxFcnJvciA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgUHlfSU5DUkVGKEF1dG9HSUxFcnJvcik7CisgICAgaWYgKFB5TW9kdWxlX0FkZE9iamVjdChtb2QsICJBdXRvR0lMRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0b0dJTEVycm9yKSA8IDApCisgICAgICAgIHJldHVybjsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9fQ2FyYm9uRXZ0bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9jYXJib25ldnQvX0NhcmJvbkV2dG1vZHVsZS5jCmluZGV4IDg5M2JlZWMuLjYyM2EzZTUgMTAwNzU1Ci0tLSBhL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9fQ2FyYm9uRXZ0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L19DYXJib25FdnRtb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTMwLDExICszMCwxMSBAQAogc3RhdGljIGludAogRXZlbnRUeXBlU3BlY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudFR5cGVTcGVjICpvdXQpCiB7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZSh2LCAiKE8mbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmKG91dC0+ZXZlbnRDbGFzcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAmKG91dC0+ZXZlbnRLaW5kKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChQeUFyZ19QYXJzZSh2LCAiKE8mbCkiLAorICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICYob3V0LT5ldmVudENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgJihvdXQtPmV2ZW50S2luZCkpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKiogZW5kIEV2ZW50VHlwZVNwZWMgKioqKioqKi8KQEAgLTQ1LDE1ICs0NSwxNSBAQAogc3RhdGljIFB5T2JqZWN0KgogSElQb2ludF9OZXcoSElQb2ludCAqaW4pCiB7Ci0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJmZiIsIGluLT54LCBpbi0+eSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImZmIiwgaW4tPngsIGluLT55KTsKIH0KIAogc3RhdGljIGludAogSElQb2ludF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBISVBvaW50ICpvdXQpCiB7Ci0gICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJmZiIsICYob3V0LT54KSwgJihvdXQtPnkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImZmIiwgJihvdXQtPngpLCAmKG91dC0+eSkpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gTlVMTDsKIH0KICNlbmRpZgogCkBAIC02NCw5ICs2NCw5IEBACiBzdGF0aWMgaW50CiBFdmVudEhvdEtleUlEX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50SG90S2V5SUQgKm91dCkKIHsKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJm91dC0+c2lnbmF0dXJlLCAmb3V0LT5pZCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJsbCIsICZvdXQtPnNpZ25hdHVyZSwgJm91dC0+aWQpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqKioqKioqKiogZW5kIEV2ZW50SG90S2V5SUQgKioqKioqKi8KQEAgLTc3LDI3ICs3NywyNyBAQAogCiBzdGF0aWMgcGFzY2FsIE9TU3RhdHVzCiBteUV2ZW50SGFuZGxlcihFdmVudEhhbmRsZXJDYWxsUmVmIGhhbmRsZXJSZWYsIEV2ZW50UmVmIGV2ZW50LCB2b2lkICpvdXRQeU9iamVjdCkgewotICAgICAgICBQeU9iamVjdCAqcmV0VmFsdWU7Ci0gICAgICAgIGludCBzdGF0dXM7CisgICAgUHlPYmplY3QgKnJldFZhbHVlOworICAgIGludCBzdGF0dXM7CiAKLSAgICAgICAgcmV0VmFsdWUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopb3V0UHlPYmplY3QsICJPJk8mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl9OZXcsIGhhbmRsZXJSZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgZXZlbnQpOwotICAgICAgICBpZiAocmV0VmFsdWUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBldmVudCBoYW5kbGVyIGNhbGxiYWNrOlxuIik7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsgIC8qIHRoaXMgYWxzbyBjbGVhcnMgdGhlIGVycm9yICovCi0gICAgICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIGNvbXBsYWluPyBob3c/ICovCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJldFZhbHVlID09IFB5X05vbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBub0VycjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChQeUludF9DaGVjayhyZXRWYWx1ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFB5SW50X0FzTG9uZyhyZXRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBub0VycjsgLyogd3Jvbmcgb2JqZWN0IHR5cGUsIGNvbXBsYWluPyAqLwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXRWYWx1ZSk7Ci0gICAgICAgIH0KKyAgICByZXRWYWx1ZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKilvdXRQeU9iamVjdCwgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfTmV3LCBoYW5kbGVyUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgZXZlbnQpOworICAgIGlmIChyZXRWYWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBldmVudCBoYW5kbGVyIGNhbGxiYWNrOlxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7ICAvKiB0aGlzIGFsc28gY2xlYXJzIHRoZSBlcnJvciAqLworICAgICAgICBzdGF0dXMgPSBub0VycjsgLyogY29tcGxhaW4/IGhvdz8gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocmV0VmFsdWUgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHN0YXR1cyA9IG5vRXJyOworICAgICAgICBlbHNlIGlmIChQeUludF9DaGVjayhyZXRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFB5SW50X0FzTG9uZyhyZXRWYWx1ZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIHdyb25nIG9iamVjdCB0eXBlLCBjb21wbGFpbj8gKi8KKyAgICAgICAgUHlfREVDUkVGKHJldFZhbHVlKTsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc3RhdHVzOwogfQogCiAvKioqKioqKiogZW5kIG15RXZlbnRIYW5kbGVyICoqKioqKioqKioqLwpAQCAtMTEyLDI2OCArMTEyLDI2OCBAQAogI2RlZmluZSBFdmVudFJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudFJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50UmVmIG9iX2l0c2VsZjsKIH0gRXZlbnRSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudFJlZl9OZXcoRXZlbnRSZWYgaXRzZWxmKQogewotCUV2ZW50UmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudFJlZk9iamVjdCwgJkV2ZW50UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBFdmVudFJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRSZWZPYmplY3QsICZFdmVudFJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudFJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudFJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudFJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudFJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudFJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50UmVmX2RlYWxsb2MoRXZlbnRSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX1JldGFpbkV2ZW50KEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJldGFpbkV2ZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJldGFpbkV2ZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0dldEV2ZW50UmV0YWluQ291bnQoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEV2ZW50UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEV2ZW50UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfUmVsZWFzZUV2ZW50KEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVsZWFzZUV2ZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJlbGVhc2VFdmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfU2V0RXZlbnRQYXJhbWV0ZXIoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGluTmFtZTsKLQlPU1R5cGUgaW5UeXBlOwotCWNoYXIgKmluRGF0YVB0cl9faW5fXzsKLQlsb25nIGluRGF0YVB0cl9fbGVuX187Ci0JaW50IGluRGF0YVB0cl9faW5fbGVuX187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5OYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRhdGFQdHJfX2luX18sICZpbkRhdGFQdHJfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5EYXRhUHRyX19sZW5fXyA9IGluRGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IFNldEV2ZW50UGFyYW1ldGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkRhdGFQdHJfX2xlbl9fLCBpbkRhdGFQdHJfX2luX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBpbk5hbWU7CisgICAgT1NUeXBlIGluVHlwZTsKKyAgICBjaGFyICppbkRhdGFQdHJfX2luX187CisgICAgbG9uZyBpbkRhdGFQdHJfX2xlbl9fOworICAgIGludCBpbkRhdGFQdHJfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EYXRhUHRyX19pbl9fLCAmaW5EYXRhUHRyX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluRGF0YVB0cl9fbGVuX18gPSBpbkRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBTZXRFdmVudFBhcmFtZXRlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EYXRhUHRyX19sZW5fXywgaW5EYXRhUHRyX19pbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9HZXRFdmVudENsYXNzKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRFdmVudENsYXNzKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudENsYXNzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0dldEV2ZW50S2luZChFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RXZlbnRLaW5kKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudEtpbmQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfR2V0RXZlbnRUaW1lKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlkb3VibGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRFdmVudFRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImQiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGRvdWJsZSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEV2ZW50VGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9TZXRFdmVudFRpbWUoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JZG91YmxlIGluVGltZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRFdmVudFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGluVGltZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgZG91YmxlIGluVGltZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRFdmVudFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluVGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfSXNVc2VyQ2FuY2VsRXZlbnRSZWYoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1VzZXJDYW5jZWxFdmVudFJlZihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVXNlckNhbmNlbEV2ZW50UmVmKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UmVmX0NvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIG91dEV2ZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb252ZXJ0RXZlbnRSZWZUb0V2ZW50UmVjb3JkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmb3V0RXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBvdXRFdmVudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJm91dEV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl9Jc0V2ZW50SW5NYXNrKEV2ZW50UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlVSW50MTYgaW5NYXNrOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNFdmVudEluTWFzayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgaW5NYXNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgVUludDE2IGluTWFzazsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzRXZlbnRJbk1hc2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfU2VuZEV2ZW50VG9FdmVudFRhcmdldChFdmVudFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlFdmVudFRhcmdldFJlZiBpblRhcmdldDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpblRhcmdldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZW5kRXZlbnRUb0V2ZW50VGFyZ2V0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfQ29udmVydCwgJmluVGFyZ2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNlbmRFdmVudFRvRXZlbnRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhcmdldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRSZWZfR2V0RXZlbnRQYXJhbWV0ZXIoRXZlbnRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCVVJbnQzMiBidWZmZXJTaXplOwotCUV2ZW50UGFyYW1OYW1lIGluTmFtZTsKLQlFdmVudFBhcmFtVHlwZSBpblR5cGU7Ci0JT1NFcnIgX2VycjsKLQl2b2lkICogYnVmZmVyOworICAgIFVJbnQzMiBidWZmZXJTaXplOworICAgIEV2ZW50UGFyYW1OYW1lIGluTmFtZTsKKyAgICBFdmVudFBhcmFtVHlwZSBpblR5cGU7CisgICAgT1NFcnIgX2VycjsKKyAgICB2b2lkICogYnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsIFB5TWFjX0dldE9TVHlwZSwgJmluTmFtZSwgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlKSkKLQkgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmaW5OYW1lLCBQeU1hY19HZXRPU1R5cGUsICZpblR5cGUpKQorICAgICAgICAgIHJldHVybiBOVUxMOwogCi0JLyogRmlndXJlIG91dCB0aGUgc2l6ZSBieSBwYXNzaW5nIGEgbnVsbCBidWZmZXIgdG8gR2V0RXZlbnRQYXJhbWV0ZXIgKi8KLQlfZXJyID0gR2V0RXZlbnRQYXJhbWV0ZXIoX3NlbGYtPm9iX2l0c2VsZiwgaW5OYW1lLCBpblR5cGUsIE5VTEwsIDAsICZidWZmZXJTaXplLCBOVUxMKTsKKyAgICAvKiBGaWd1cmUgb3V0IHRoZSBzaXplIGJ5IHBhc3NpbmcgYSBudWxsIGJ1ZmZlciB0byBHZXRFdmVudFBhcmFtZXRlciAqLworICAgIF9lcnIgPSBHZXRFdmVudFBhcmFtZXRlcihfc2VsZi0+b2JfaXRzZWxmLCBpbk5hbWUsIGluVHlwZSwgTlVMTCwgMCwgJmJ1ZmZlclNpemUsIE5VTEwpOwogCi0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCWJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBidWZmZXJTaXplKTsKLQlpZiAoYnVmZmVyID09IE5VTEwpCi0JICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIGJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBidWZmZXJTaXplKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKLQlfZXJyID0gR2V0RXZlbnRQYXJhbWV0ZXIoX3NlbGYtPm9iX2l0c2VsZiwgaW5OYW1lLCBpblR5cGUsIE5VTEwsIGJ1ZmZlclNpemUsIE5VTEwsIGJ1ZmZlcik7CisgICAgX2VyciA9IEdldEV2ZW50UGFyYW1ldGVyKF9zZWxmLT5vYl9pdHNlbGYsIGluTmFtZSwgaW5UeXBlLCBOVUxMLCBidWZmZXJTaXplLCBOVUxMLCBidWZmZXIpOwogCi0JaWYgKF9lcnIgIT0gbm9FcnIpIHsKLQkgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKLQkgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsIGJ1ZmZlciwgYnVmZmVyU2l6ZSk7Ci0JUHlNZW1fREVMKGJ1ZmZlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKKyAgICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsIGJ1ZmZlciwgYnVmZmVyU2l6ZSk7CisgICAgUHlNZW1fREVMKGJ1ZmZlcik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50UmVmX21ldGhvZHNbXSA9IHsKLQl7IlJldGFpbkV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1JldGFpbkV2ZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFJlZiBfcnYpIil9LAotCXsiR2V0RXZlbnRSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFJldGFpbkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IlJlbGVhc2VFdmVudCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9SZWxlYXNlRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNldEV2ZW50UGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1NldEV2ZW50UGFyYW1ldGVyLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgaW5OYW1lLCBPU1R5cGUgaW5UeXBlLCBCdWZmZXIgaW5EYXRhUHRyKSAtPiBOb25lIil9LAotCXsiR2V0RXZlbnRDbGFzcyIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudENsYXNzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKLQl7IkdldEV2ZW50S2luZCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudEtpbmQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiR2V0RXZlbnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0dldEV2ZW50VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCi0JeyJTZXRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2V0RXZlbnRUaW1lLCAxLAotCSBQeURvY19TVFIoIihkb3VibGUgaW5UaW1lKSAtPiBOb25lIil9LAotCXsiSXNVc2VyQ2FuY2VsRXZlbnRSZWYiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfSXNVc2VyQ2FuY2VsRXZlbnRSZWYsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNvbnZlcnRFdmVudFJlZlRvRXZlbnRSZWNvcmQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIG91dEV2ZW50KSIpfSwKLQl7IklzRXZlbnRJbk1hc2siLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfSXNFdmVudEluTWFzaywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IGluTWFzaykgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNlbmRFdmVudFRvRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2VuZEV2ZW50VG9FdmVudFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQpIC0+IE5vbmUiKX0sCi0JeyJHZXRFdmVudFBhcmFtZXRlciIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9HZXRFdmVudFBhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRQYXJhbU5hbWUgZXZlbnROYW1lLCBFdmVudFBhcmFtVHlwZSBldmVudFR5cGUpIC0+IChTdHJpbmcgZXZlbnRQYXJhbURhdGEpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUmV0YWluRXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfUmV0YWluRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50UmVmIF9ydikiKX0sCisgICAgeyJHZXRFdmVudFJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0dldEV2ZW50UmV0YWluQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiUmVsZWFzZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX1JlbGVhc2VFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0RXZlbnRQYXJhbWV0ZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfU2V0RXZlbnRQYXJhbWV0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBpbk5hbWUsIE9TVHlwZSBpblR5cGUsIEJ1ZmZlciBpbkRhdGFQdHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRFdmVudENsYXNzIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0dldEV2ZW50Q2xhc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiR2V0RXZlbnRLaW5kIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0dldEV2ZW50S2luZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJHZXRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRSZWZfR2V0RXZlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKKyAgICB7IlNldEV2ZW50VGltZSIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9TZXRFdmVudFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKGRvdWJsZSBpblRpbWUpIC0+IE5vbmUiKX0sCisgICAgeyJJc1VzZXJDYW5jZWxFdmVudFJlZiIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9Jc1VzZXJDYW5jZWxFdmVudFJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ29udmVydEV2ZW50UmVmVG9FdmVudFJlY29yZCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9Db252ZXJ0RXZlbnRSZWZUb0V2ZW50UmVjb3JkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgb3V0RXZlbnQpIil9LAorICAgIHsiSXNFdmVudEluTWFzayIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9Jc0V2ZW50SW5NYXNrLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgaW5NYXNrKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2VuZEV2ZW50VG9FdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilFdmVudFJlZl9TZW5kRXZlbnRUb0V2ZW50VGFyZ2V0LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFRhcmdldFJlZiBpblRhcmdldCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEV2ZW50UGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UmVmX0dldEV2ZW50UGFyYW1ldGVyLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFBhcmFtTmFtZSBldmVudE5hbWUsIEV2ZW50UGFyYW1UeXBlIGV2ZW50VHlwZSkgLT4gKFN0cmluZyBldmVudFBhcmFtRGF0YSkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50UmVmX2dldHNldGxpc3QgTlVMTApAQCAtMzkwLDYxICszOTAsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFJlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JRXZlbnRSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudFJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEV2ZW50UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50UmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgRXZlbnRSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRXZlbnRSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudFJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRXZlbnRSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50UmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50UmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUV2ZW50UmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50UmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlFdmVudFJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50UmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRXZlbnRSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudFJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudFJlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRXZlbnRSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50UmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50UmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEV2ZW50UmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50UmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudFJlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBFdmVudFJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50UmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudFJlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNDU3LDE0NCArNDU3LDE0NCBAQAogI2RlZmluZSBFdmVudFF1ZXVlUmVmX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkV2ZW50UXVldWVSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRRdWV1ZVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRRdWV1ZVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUV2ZW50UXVldWVSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFdmVudFF1ZXVlUmVmIG9iX2l0c2VsZjsKIH0gRXZlbnRRdWV1ZVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfTmV3KEV2ZW50UXVldWVSZWYgaXRzZWxmKQogewotCUV2ZW50UXVldWVSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50UXVldWVSZWZPYmplY3QsICZFdmVudFF1ZXVlUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBFdmVudFF1ZXVlUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudFF1ZXVlUmVmT2JqZWN0LCAmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudFF1ZXVlUmVmX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50UXVldWVSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRRdWV1ZVJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudFF1ZXVlUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEV2ZW50UXVldWVSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRRdWV1ZVJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudFF1ZXVlUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEV2ZW50UXVldWVSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudFF1ZXVlUmVmX2RlYWxsb2MoRXZlbnRRdWV1ZVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRRdWV1ZVJlZl9Qb3N0RXZlbnRUb1F1ZXVlKEV2ZW50UXVldWVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRSZWYgaW5FdmVudDsKLQlTSW50MTYgaW5Qcmlvcml0eTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUHJpb3JpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUG9zdEV2ZW50VG9RdWV1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcmlvcml0eSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRSZWYgaW5FdmVudDsKKyAgICBTSW50MTYgaW5Qcmlvcml0eTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlZl9Db252ZXJ0LCAmaW5FdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUHJpb3JpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUG9zdEV2ZW50VG9RdWV1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcmlvcml0eSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRRdWV1ZVJlZl9GbHVzaEV2ZW50c01hdGNoaW5nTGlzdEZyb21RdWV1ZShFdmVudFF1ZXVlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpbk51bVR5cGVzOwotCUV2ZW50VHlwZVNwZWMgaW5MaXN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGluTnVtVHlwZXM7CisgICAgRXZlbnRUeXBlU3BlYyBpbkxpc3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGbHVzaEV2ZW50c01hdGNoaW5nTGlzdEZyb21RdWV1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFF1ZXVlUmVmX0ZsdXNoRXZlbnRRdWV1ZShFdmVudFF1ZXVlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hFdmVudFF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hFdmVudFF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfR2V0TnVtRXZlbnRzSW5RdWV1ZShFdmVudFF1ZXVlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROdW1FdmVudHNJblF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROdW1FdmVudHNJblF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfUmVtb3ZlRXZlbnRGcm9tUXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlFdmVudFJlZiBpbkV2ZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfQ29udmVydCwgJmluRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRXZlbnRGcm9tUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FdmVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRSZWYgaW5FdmVudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZUV2ZW50RnJvbVF1ZXVlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfSXNFdmVudEluUXVldWUoRXZlbnRRdWV1ZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRSZWYgaW5FdmVudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNFdmVudEluUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRSZWYgaW5FdmVudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNFdmVudEluUXVldWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbkV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50UXVldWVSZWZfbWV0aG9kc1tdID0gewotCXsiUG9zdEV2ZW50VG9RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX1Bvc3RFdmVudFRvUXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQsIFNJbnQxNiBpblByaW9yaXR5KSAtPiBOb25lIil9LAotCXsiRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9GbHVzaEV2ZW50c01hdGNoaW5nTGlzdEZyb21RdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0KSAtPiBOb25lIil9LAotCXsiRmx1c2hFdmVudFF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfRmx1c2hFdmVudFF1ZXVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXROdW1FdmVudHNJblF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfR2V0TnVtRXZlbnRzSW5RdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJSZW1vdmVFdmVudEZyb21RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX1JlbW92ZUV2ZW50RnJvbVF1ZXVlLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50KSAtPiBOb25lIil9LAotCXsiSXNFdmVudEluUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9Jc0V2ZW50SW5RdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlBvc3RFdmVudFRvUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9Qb3N0RXZlbnRUb1F1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50LCBTSW50MTYgaW5Qcmlvcml0eSkgLT4gTm9uZSIpfSwKKyAgICB7IkZsdXNoRXZlbnRzTWF0Y2hpbmdMaXN0RnJvbVF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfRmx1c2hFdmVudHNNYXRjaGluZ0xpc3RGcm9tUXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCkgLT4gTm9uZSIpfSwKKyAgICB7IkZsdXNoRXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0ZsdXNoRXZlbnRRdWV1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TnVtRXZlbnRzSW5RdWV1ZSIsIChQeUNGdW5jdGlvbilFdmVudFF1ZXVlUmVmX0dldE51bUV2ZW50c0luUXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiUmVtb3ZlRXZlbnRGcm9tUXVldWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRRdWV1ZVJlZl9SZW1vdmVFdmVudEZyb21RdWV1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gTm9uZSIpfSwKKyAgICB7IklzRXZlbnRJblF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50UXVldWVSZWZfSXNFdmVudEluUXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVmIGluRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50UXVldWVSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC02MTEsNjEgKzYxMSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50UXVldWVSZWZfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUV2ZW50UXVldWVSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudFF1ZXVlUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50UXVldWVSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChFdmVudFF1ZXVlUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50UXVldWVSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudFF1ZXVlUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEV2ZW50UXVldWVSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRRdWV1ZVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRRdWV1ZVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEV2ZW50UXVldWVSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudFF1ZXVlUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50UXVldWVSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEV2ZW50UXVldWVSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50UXVldWVSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRRdWV1ZVJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlFdmVudFF1ZXVlUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50UXVldWVSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50UXVldWVSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRXZlbnRRdWV1ZVJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50UXVldWVSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRRdWV1ZVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEV2ZW50UXVldWVSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudFF1ZXVlUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50UXVldWVSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEV2ZW50UXVldWVSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50UXVldWVSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRRdWV1ZVJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBFdmVudFF1ZXVlUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50UXVldWVSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50UXVldWVSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRXZlbnRRdWV1ZVJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50UXVldWVSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEV2ZW50UXVldWVSZWYgLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC02NzgsNTMgKzY3OCw1MyBAQAogI2RlZmluZSBFdmVudExvb3BSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRMb29wUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50TG9vcFJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRMb29wUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRMb29wUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRMb29wUmVmIG9iX2l0c2VsZjsKIH0gRXZlbnRMb29wUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRMb29wUmVmX05ldyhFdmVudExvb3BSZWYgaXRzZWxmKQogewotCUV2ZW50TG9vcFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRMb29wUmVmT2JqZWN0LCAmRXZlbnRMb29wUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBFdmVudExvb3BSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50TG9vcFJlZk9iamVjdCwgJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudExvb3BSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRMb29wUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50TG9vcFJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudExvb3BSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRMb29wUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50TG9vcFJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudExvb3BSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRMb29wUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRMb29wUmVmX2RlYWxsb2MoRXZlbnRMb29wUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudExvb3BSZWZfUXVpdEV2ZW50TG9vcChFdmVudExvb3BSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRdWl0RXZlbnRMb29wKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUXVpdEV2ZW50TG9vcChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50TG9vcFJlZl9tZXRob2RzW10gPSB7Ci0JeyJRdWl0RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFJlZl9RdWl0RXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJRdWl0RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFJlZl9RdWl0RXZlbnRMb29wLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50TG9vcFJlZl9nZXRzZXRsaXN0IE5VTEwKQEAgLTc0MSw2MSArNzQxLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRMb29wUmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudExvb3BSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudExvb3BSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRMb29wUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRMb29wUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50TG9vcFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50TG9vcFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudExvb3BSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRMb29wUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudExvb3BSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudExvb3BSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudExvb3BSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRMb29wUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudExvb3BSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50TG9vcFJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudExvb3BSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRMb29wUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50TG9vcFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRMb29wUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50TG9vcFJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50TG9vcFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudExvb3BSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudExvb3BSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudExvb3BSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRMb29wUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudExvb3BSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50TG9vcFJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudExvb3BSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRMb29wUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50TG9vcFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRMb29wUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50TG9vcFJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50TG9vcFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEV2ZW50TG9vcFJlZiAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTgwOCw3MSArODA4LDcxIEBACiAjZGVmaW5lIEV2ZW50TG9vcFRpbWVyUmVmX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBFdmVudExvb3BUaW1lclJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUV2ZW50TG9vcFRpbWVyUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRMb29wVGltZXJSZWYgb2JfaXRzZWxmOwogfSBFdmVudExvb3BUaW1lclJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50TG9vcFRpbWVyUmVmX05ldyhFdmVudExvb3BUaW1lclJlZiBpdHNlbGYpCiB7Ci0JRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0LCAmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhFdmVudExvb3BUaW1lclJlZk9iamVjdCwgJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEV2ZW50TG9vcFRpbWVyUmVmX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50TG9vcFRpbWVyUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50TG9vcFRpbWVyUmVmX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50TG9vcFRpbWVyUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50TG9vcFRpbWVyUmVmX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50TG9vcFRpbWVyUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRMb29wVGltZXJSZWZfZGVhbGxvYyhFdmVudExvb3BUaW1lclJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRMb29wVGltZXJSZWZfUmVtb3ZlRXZlbnRMb29wVGltZXIoRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVFdmVudExvb3BUaW1lcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZUV2ZW50TG9vcFRpbWVyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50TG9vcFRpbWVyUmVmX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lKEV2ZW50TG9vcFRpbWVyUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWRvdWJsZSBpbk5leHRGaXJlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImQiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OZXh0RmlyZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRFdmVudExvb3BUaW1lck5leHRGaXJlVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5leHRGaXJlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBkb3VibGUgaW5OZXh0RmlyZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmV4dEZpcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OZXh0RmlyZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudExvb3BUaW1lclJlZl9tZXRob2RzW10gPSB7Ci0JeyJSZW1vdmVFdmVudExvb3BUaW1lciIsIChQeUNGdW5jdGlvbilFdmVudExvb3BUaW1lclJlZl9SZW1vdmVFdmVudExvb3BUaW1lciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWUiLCAoUHlDRnVuY3Rpb24pRXZlbnRMb29wVGltZXJSZWZfU2V0RXZlbnRMb29wVGltZXJOZXh0RmlyZVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKGRvdWJsZSBpbk5leHRGaXJlKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiUmVtb3ZlRXZlbnRMb29wVGltZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRMb29wVGltZXJSZWZfUmVtb3ZlRXZlbnRMb29wVGltZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50TG9vcFRpbWVyUmVmX1NldEV2ZW50TG9vcFRpbWVyTmV4dEZpcmVUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihkb3VibGUgaW5OZXh0RmlyZSkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRXZlbnRMb29wVGltZXJSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC04ODksNjEgKzg4OSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50TG9vcFRpbWVyUmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudExvb3BUaW1lclJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEV2ZW50TG9vcFRpbWVyUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50TG9vcFRpbWVyUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRMb29wVGltZXJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRMb29wVGltZXJSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudExvb3BUaW1lclJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudExvb3BUaW1lclJlZl90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBFdmVudExvb3BUaW1lclJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRMb29wVGltZXJSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudExvb3BUaW1lclJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEV2ZW50TG9vcFRpbWVyUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50TG9vcFRpbWVyUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudExvb3BUaW1lclJlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRXZlbnRMb29wVGltZXJSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRMb29wVGltZXJSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRMb29wVGltZXJSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRXZlbnRMb29wVGltZXJSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50TG9vcFRpbWVyUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50TG9vcFRpbWVyUmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRXZlbnRMb29wVGltZXJSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRMb29wVGltZXJSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudExvb3BUaW1lclJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEV2ZW50TG9vcFRpbWVyUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50TG9vcFRpbWVyUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudExvb3BUaW1lclJlZl9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRXZlbnRMb29wVGltZXJSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRMb29wVGltZXJSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRMb29wVGltZXJSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRXZlbnRMb29wVGltZXJSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50TG9vcFRpbWVyUmVmX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRXZlbnRMb29wVGltZXJSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudExvb3BUaW1lclJlZiAtLS0tLS0tLS0tLS0tLS0tICovCkBAIC05NTYsMTE2ICs5NTYsMTE2IEBACiAjZGVmaW5lIEV2ZW50SGFuZGxlclJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudEhhbmRsZXJSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRIYW5kbGVyUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBFdmVudEhhbmRsZXJSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudEhhbmRsZXJSZWYgb2JfaXRzZWxmOwotCVB5T2JqZWN0ICpvYl9jYWxsYmFjazsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRIYW5kbGVyUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqb2JfY2FsbGJhY2s7CiB9IEV2ZW50SGFuZGxlclJlZk9iamVjdDsKIAogUHlPYmplY3QgKkV2ZW50SGFuZGxlclJlZl9OZXcoRXZlbnRIYW5kbGVyUmVmIGl0c2VsZikKIHsKLQlFdmVudEhhbmRsZXJSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SGFuZGxlclJlZk9iamVjdCwgJkV2ZW50SGFuZGxlclJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBFdmVudEhhbmRsZXJSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SGFuZGxlclJlZk9iamVjdCwgJkV2ZW50SGFuZGxlclJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEV2ZW50SGFuZGxlclJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudEhhbmRsZXJSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRIYW5kbGVyUmVmX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SGFuZGxlclJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudEhhbmRsZXJSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRIYW5kbGVyUmVmX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV2ZW50SGFuZGxlclJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudEhhbmRsZXJSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudEhhbmRsZXJSZWZfZGVhbGxvYyhFdmVudEhhbmRsZXJSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2l0c2VsZiAhPSBOVUxMKSB7Ci0JCVJlbW92ZUV2ZW50SGFuZGxlcihzZWxmLT5vYl9pdHNlbGYpOwotCQlQeV9ERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2spOwotCX0KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9pdHNlbGYgIT0gTlVMTCkgeworICAgICAgICBSZW1vdmVFdmVudEhhbmRsZXIoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgUHlfREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrKTsKKyAgICB9CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJSZWZfQWRkRXZlbnRUeXBlc1RvSGFuZGxlcihFdmVudEhhbmRsZXJSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGluTnVtVHlwZXM7Ci0JRXZlbnRUeXBlU3BlYyBpbkxpc3Q7Ci0JaWYgKF9zZWxmLT5vYl9pdHNlbGYgPT0gTlVMTCkgewotCQlQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEV2ZW50VHlwZXNUb0hhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bVR5cGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbk51bVR5cGVzOworICAgIEV2ZW50VHlwZVNwZWMgaW5MaXN0OworICAgIGlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VHlwZVNwZWNfQ29udmVydCwgJmluTGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRFdmVudFR5cGVzVG9IYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5MaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJSZWZfUmVtb3ZlRXZlbnRUeXBlc0Zyb21IYW5kbGVyKEV2ZW50SGFuZGxlclJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5OdW1UeXBlczsKLQlFdmVudFR5cGVTcGVjIGluTGlzdDsKLQlpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7Ci0JCVB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAotCSAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRXZlbnRUeXBlc0Zyb21IYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bVR5cGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGluTnVtVHlwZXM7CisgICAgRXZlbnRUeXBlU3BlYyBpbkxpc3Q7CisgICAgaWYgKF9zZWxmLT5vYl9pdHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1UeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50SGFuZGxlclJlZl9SZW1vdmVFdmVudEhhbmRsZXIoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU1N0YXR1cyBfZXJyOwotCWlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsKLQkgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQlQeV9ERUNSRUYoX3NlbGYtPm9iX2NhbGxiYWNrKTsKLQlfc2VsZi0+b2JfY2FsbGJhY2sgPSBOVUxMOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIGlmIChfc2VsZi0+b2JfaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoX3NlbGYtPm9iX2NhbGxiYWNrKTsKKyAgICBfc2VsZi0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEV2ZW50SGFuZGxlclJlZl9tZXRob2RzW10gPSB7Ci0JeyJBZGRFdmVudFR5cGVzVG9IYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9BZGRFdmVudFR5cGVzVG9IYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVFdmVudFR5cGVzRnJvbUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyUmVmX1JlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0KSAtPiBOb25lIil9LAotCXsiUmVtb3ZlRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50SGFuZGxlclJlZl9SZW1vdmVFdmVudEhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkFkZEV2ZW50VHlwZXNUb0hhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyUmVmX0FkZEV2ZW50VHlwZXNUb0hhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpbk51bVR5cGVzLCBFdmVudFR5cGVTcGVjIGluTGlzdCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZUV2ZW50VHlwZXNGcm9tSGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudEhhbmRsZXJSZWZfUmVtb3ZlRXZlbnRUeXBlc0Zyb21IYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyUmVmX1JlbW92ZUV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBFdmVudEhhbmRsZXJSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMDgyLDYxICsxMDgyLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRIYW5kbGVyUmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudEhhbmRsZXJSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBFdmVudEhhbmRsZXJSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRIYW5kbGVyUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50SGFuZGxlclJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50SGFuZGxlclJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudEhhbmRsZXJSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgRXZlbnRIYW5kbGVyUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudEhhbmRsZXJSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudEhhbmRsZXJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBFdmVudEhhbmRsZXJSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRIYW5kbGVyUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudEhhbmRsZXJSZWZfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEV2ZW50SGFuZGxlclJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudEhhbmRsZXJSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRIYW5kbGVyUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUV2ZW50SGFuZGxlclJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRIYW5kbGVyUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50SGFuZGxlclJlZl90cF9uZXcsIC8qIHRwX25ldyAqLwotCUV2ZW50SGFuZGxlclJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudEhhbmRsZXJSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudEhhbmRsZXJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBFdmVudEhhbmRsZXJSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRIYW5kbGVyUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudEhhbmRsZXJSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEV2ZW50SGFuZGxlclJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudEhhbmRsZXJSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRIYW5kbGVyUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEV2ZW50SGFuZGxlclJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRIYW5kbGVyUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50SGFuZGxlclJlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEV2ZW50SGFuZGxlclJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudEhhbmRsZXJSZWYgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTExNDksNTYgKzExNDksNTYgQEAKICNkZWZpbmUgRXZlbnRIYW5kbGVyQ2FsbFJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudEhhbmRsZXJDYWxsUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJDYWxsUmVmX05ldyhFdmVudEhhbmRsZXJDYWxsUmVmIGl0c2VsZikKIHsKLQlFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0LCAmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCwgJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRIYW5kbGVyQ2FsbFJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudEhhbmRsZXJDYWxsUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUV2ZW50SGFuZGxlckNhbGxSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRIYW5kbGVyQ2FsbFJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUV2ZW50SGFuZGxlckNhbGxSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRIYW5kbGVyQ2FsbFJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRXZlbnRIYW5kbGVyQ2FsbFJlZl9kZWFsbG9jKEV2ZW50SGFuZGxlckNhbGxSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50SGFuZGxlckNhbGxSZWZfQ2FsbE5leHRFdmVudEhhbmRsZXIoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlFdmVudFJlZiBpbkV2ZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfQ29udmVydCwgJmluRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2FsbE5leHRFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FdmVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRXZlbnRSZWYgaW5FdmVudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX0NvbnZlcnQsICZpbkV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENhbGxOZXh0RXZlbnRIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXZlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZlbnRIYW5kbGVyQ2FsbFJlZl9tZXRob2RzW10gPSB7Ci0JeyJDYWxsTmV4dEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudEhhbmRsZXJDYWxsUmVmX0NhbGxOZXh0RXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlZiBpbkV2ZW50KSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ2FsbE5leHRFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRIYW5kbGVyQ2FsbFJlZl9DYWxsTmV4dEV2ZW50SGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWYgaW5FdmVudCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRXZlbnRIYW5kbGVyQ2FsbFJlZl9nZXRzZXRsaXN0IE5VTEwKQEAgLTEyMTUsNjEgKzEyMTUsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhhbmRsZXJDYWxsUmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudEhhbmRsZXJDYWxsUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudEhhbmRsZXJDYWxsUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudEhhbmRsZXJDYWxsUmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRXZlbnRIYW5kbGVyQ2FsbFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudEhhbmRsZXJDYWxsUmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ2FyYm9uRXZ0LkV2ZW50SGFuZGxlckNhbGxSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRIYW5kbGVyQ2FsbFJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBFdmVudEhhbmRsZXJDYWxsUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudEhhbmRsZXJDYWxsUmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudEhhbmRsZXJDYWxsUmVmX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUV2ZW50SGFuZGxlckNhbGxSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRIYW5kbGVyQ2FsbFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50SGFuZGxlckNhbGxSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudEhhbmRsZXJDYWxsUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ2FyYm9uRXZ0LkV2ZW50SGFuZGxlckNhbGxSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudEhhbmRsZXJDYWxsUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRIYW5kbGVyQ2FsbFJlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBFdmVudEhhbmRsZXJDYWxsUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudEhhbmRsZXJDYWxsUmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudEhhbmRsZXJDYWxsUmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50SGFuZGxlckNhbGxSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBFdmVudEhhbmRsZXJDYWxsUmVmIC0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTI4Miw3OCArMTI4Miw3OCBAQAogI2RlZmluZSBFdmVudFRhcmdldFJlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZFdmVudFRhcmdldFJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZFdmVudFRhcmdldFJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRXZlbnRUYXJnZXRSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlFdmVudFRhcmdldFJlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEV2ZW50VGFyZ2V0UmVmIG9iX2l0c2VsZjsKIH0gRXZlbnRUYXJnZXRSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpFdmVudFRhcmdldFJlZl9OZXcoRXZlbnRUYXJnZXRSZWYgaXRzZWxmKQogewotCUV2ZW50VGFyZ2V0UmVmT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhFdmVudFRhcmdldFJlZk9iamVjdCwgJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBFdmVudFRhcmdldFJlZk9iamVjdCAqaXQ7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRUYXJnZXRSZWZPYmplY3QsICZFdmVudFRhcmdldFJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBFdmVudFRhcmdldFJlZl9Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudFRhcmdldFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFFdmVudFRhcmdldFJlZl9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudFRhcmdldFJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChFdmVudFRhcmdldFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFFdmVudFRhcmdldFJlZl9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJFdmVudFRhcmdldFJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChFdmVudFRhcmdldFJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEV2ZW50VGFyZ2V0UmVmX2RlYWxsb2MoRXZlbnRUYXJnZXRSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50VGFyZ2V0UmVmX0luc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlcihFdmVudFRhcmdldFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudFRhcmdldFJlZl9JbnN0YWxsRXZlbnRIYW5kbGVyKEV2ZW50VGFyZ2V0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlFdmVudFR5cGVTcGVjIGluU3BlYzsKLQlQeU9iamVjdCAqY2FsbGJhY2s7Ci0JRXZlbnRIYW5kbGVyUmVmIG91dFJlZjsKLQlPU1N0YXR1cyBfZXJyOworICAgIEV2ZW50VHlwZVNwZWMgaW5TcGVjOworICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICBFdmVudEhhbmRsZXJSZWYgb3V0UmVmOworICAgIE9TU3RhdHVzIF9lcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8iLCBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpblNwZWMsICZjYWxsYmFjaykpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8iLCBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpblNwZWMsICZjYWxsYmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX2VyciA9IEluc3RhbGxFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwgbXlFdmVudEhhbmRsZXJVUFAsIDEsICZpblNwZWMsICh2b2lkICopY2FsbGJhY2ssICZvdXRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX2VyciA9IEluc3RhbGxFdmVudEhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwgbXlFdmVudEhhbmRsZXJVUFAsIDEsICZpblNwZWMsICh2b2lkICopY2FsbGJhY2ssICZvdXRSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiAKLQlfcmVzID0gRXZlbnRIYW5kbGVyUmVmX05ldyhvdXRSZWYpOwotCWlmIChfcmVzICE9IE5VTEwpIHsKLQkgICAgICAgICgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KilfcmVzKS0+b2JfY2FsbGJhY2sgPSBjYWxsYmFjazsKLQkgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7Ci0JfQotCXJldHVybiBfcmVzOworICAgIF9yZXMgPSBFdmVudEhhbmRsZXJSZWZfTmV3KG91dFJlZik7CisgICAgaWYgKF9yZXMgIT0gTlVMTCkgeworICAgICAgICAoKEV2ZW50SGFuZGxlclJlZk9iamVjdCopX3JlcyktPm9iX2NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7CisgICAgfQorICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRXZlbnRUYXJnZXRSZWZfbWV0aG9kc1tdID0gewotCXsiSW5zdGFsbFN0YW5kYXJkRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50VGFyZ2V0UmVmX0luc3RhbGxTdGFuZGFyZEV2ZW50SGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSW5zdGFsbEV2ZW50SGFuZGxlciIsIChQeUNGdW5jdGlvbilFdmVudFRhcmdldFJlZl9JbnN0YWxsRXZlbnRIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihFdmVudFR5cGVTcGVjIGluU3BlYywgTWV0aG9kIGNhbGxiYWNrKSAtPiAoRXZlbnRIYW5kbGVyUmVmIG91dFJlZikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJJbnN0YWxsU3RhbmRhcmRFdmVudEhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRXZlbnRUYXJnZXRSZWZfSW5zdGFsbFN0YW5kYXJkRXZlbnRIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJbnN0YWxsRXZlbnRIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKUV2ZW50VGFyZ2V0UmVmX0luc3RhbGxFdmVudEhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50VHlwZVNwZWMgaW5TcGVjLCBNZXRob2QgY2FsbGJhY2spIC0+IChFdmVudEhhbmRsZXJSZWYgb3V0UmVmKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRXZlbnRUYXJnZXRSZWZfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMzcwLDYxICsxMzcwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRXZlbnRUYXJnZXRSZWZfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUV2ZW50VGFyZ2V0UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRXZlbnRUYXJnZXRSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRUYXJnZXRSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChFdmVudFRhcmdldFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBFdmVudFRhcmdldFJlZl9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEV2ZW50VGFyZ2V0UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIEV2ZW50VGFyZ2V0UmVmX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEV2ZW50VGFyZ2V0UmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NhcmJvbkV2dC5FdmVudFRhcmdldFJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKEV2ZW50VGFyZ2V0UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRXZlbnRUYXJnZXRSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRXZlbnRUYXJnZXRSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEV2ZW50VGFyZ2V0UmVmX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBFdmVudFRhcmdldFJlZl9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlFdmVudFRhcmdldFJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlFdmVudFRhcmdldFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlFdmVudFRhcmdldFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRXZlbnRUYXJnZXRSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRXZlbnRUYXJnZXRSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlFdmVudFRhcmdldFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NhcmJvbkV2dC5FdmVudFRhcmdldFJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEV2ZW50VGFyZ2V0UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgRXZlbnRUYXJnZXRSZWZfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgRXZlbnRUYXJnZXRSZWZfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEV2ZW50VGFyZ2V0UmVmX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBFdmVudFRhcmdldFJlZl9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBFdmVudFRhcmdldFJlZl9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBFdmVudFRhcmdldFJlZl9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBFdmVudFRhcmdldFJlZl90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgRXZlbnRUYXJnZXRSZWZfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRXZlbnRUYXJnZXRSZWZfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBFdmVudFRhcmdldFJlZl90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRXZlbnRUYXJnZXRSZWYgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE0MzcsNTMgKzE0MzcsNTMgQEAKICNkZWZpbmUgRXZlbnRIb3RLZXlSZWZfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRXZlbnRIb3RLZXlSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRXZlbnRIb3RLZXlSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEV2ZW50SG90S2V5UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRXZlbnRIb3RLZXlSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBFdmVudEhvdEtleVJlZiBvYl9pdHNlbGY7CiB9IEV2ZW50SG90S2V5UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqRXZlbnRIb3RLZXlSZWZfTmV3KEV2ZW50SG90S2V5UmVmIGl0c2VsZikKIHsKLQlFdmVudEhvdEtleVJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRXZlbnRIb3RLZXlSZWZPYmplY3QsICZFdmVudEhvdEtleVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRXZlbnRIb3RLZXlSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKEV2ZW50SG90S2V5UmVmT2JqZWN0LCAmRXZlbnRIb3RLZXlSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgRXZlbnRIb3RLZXlSZWZfQ29udmVydChQeU9iamVjdCAqdiwgRXZlbnRIb3RLZXlSZWYgKnBfaXRzZWxmKQogewotCWlmICghRXZlbnRIb3RLZXlSZWZfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRIb3RLZXlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRXZlbnRIb3RLZXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghRXZlbnRIb3RLZXlSZWZfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXZlbnRIb3RLZXlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRXZlbnRIb3RLZXlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBFdmVudEhvdEtleVJlZl9kZWFsbG9jKEV2ZW50SG90S2V5UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdmVudEhvdEtleVJlZl9VbnJlZ2lzdGVyRXZlbnRIb3RLZXkoRXZlbnRIb3RLZXlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVbnJlZ2lzdGVyRXZlbnRIb3RLZXkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVbnJlZ2lzdGVyRXZlbnRIb3RLZXkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdmVudEhvdEtleVJlZl9tZXRob2RzW10gPSB7Ci0JeyJVbnJlZ2lzdGVyRXZlbnRIb3RLZXkiLCAoUHlDRnVuY3Rpb24pRXZlbnRIb3RLZXlSZWZfVW5yZWdpc3RlckV2ZW50SG90S2V5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJVbnJlZ2lzdGVyRXZlbnRIb3RLZXkiLCAoUHlDRnVuY3Rpb24pRXZlbnRIb3RLZXlSZWZfVW5yZWdpc3RlckV2ZW50SG90S2V5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEV2ZW50SG90S2V5UmVmX2dldHNldGxpc3QgTlVMTApAQCAtMTUwMCw2MSArMTUwMCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkV2ZW50SG90S2V5UmVmX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlFdmVudEhvdEtleVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEV2ZW50SG90S2V5UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEV2ZW50SG90S2V5UmVmX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRXZlbnRIb3RLZXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRXZlbnRIb3RLZXlSZWZfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChFdmVudEhvdEtleVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBFdmVudEhvdEtleVJlZl90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBFdmVudEhvdEtleVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DYXJib25FdnQuRXZlbnRIb3RLZXlSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihFdmVudEhvdEtleVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEV2ZW50SG90S2V5UmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEV2ZW50SG90S2V5UmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBFdmVudEhvdEtleVJlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRXZlbnRIb3RLZXlSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRXZlbnRIb3RLZXlSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRXZlbnRIb3RLZXlSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRXZlbnRIb3RLZXlSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUV2ZW50SG90S2V5UmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUV2ZW50SG90S2V5UmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRXZlbnRIb3RLZXlSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DYXJib25FdnQuRXZlbnRIb3RLZXlSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihFdmVudEhvdEtleVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEV2ZW50SG90S2V5UmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEV2ZW50SG90S2V5UmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBFdmVudEhvdEtleVJlZl9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRXZlbnRIb3RLZXlSZWZfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRXZlbnRIb3RLZXlSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgRXZlbnRIb3RLZXlSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRXZlbnRIb3RLZXlSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEV2ZW50SG90S2V5UmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEV2ZW50SG90S2V5UmVmX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRXZlbnRIb3RLZXlSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEV2ZW50SG90S2V5UmVmIC0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNTYyLDU3NyArMTU2Miw1NzcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0Q3VycmVudEV2ZW50TG9vcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRMb29wUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q3VycmVudEV2ZW50TG9vcCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb29wUmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRMb29wUmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q3VycmVudEV2ZW50TG9vcCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb29wUmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50TG9vcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRMb29wUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWFpbkV2ZW50TG9vcCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb29wUmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRMb29wUmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWFpbkV2ZW50TG9vcCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMb29wUmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUnVuQ3VycmVudEV2ZW50TG9vcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlkb3VibGUgaW5UaW1lb3V0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImQiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UaW1lb3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJ1bkN1cnJlbnRFdmVudExvb3AoaW5UaW1lb3V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBkb3VibGUgaW5UaW1lb3V0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UaW1lb3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJ1bkN1cnJlbnRFdmVudExvb3AoaW5UaW1lb3V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUmVjZWl2ZU5leHRFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5OdW1UeXBlczsKLQlFdmVudFR5cGVTcGVjIGluTGlzdDsKLQlkb3VibGUgaW5UaW1lb3V0OwotCUJvb2xlYW4gaW5QdWxsRXZlbnQ7Ci0JRXZlbnRSZWYgb3V0RXZlbnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mZGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1UeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUeXBlU3BlY19Db252ZXJ0LCAmaW5MaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UaW1lb3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QdWxsRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVjZWl2ZU5leHRFdmVudChpbk51bVR5cGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbkxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5UaW1lb3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUHVsbEV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFdmVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgb3V0RXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbk51bVR5cGVzOworICAgIEV2ZW50VHlwZVNwZWMgaW5MaXN0OworICAgIGRvdWJsZSBpblRpbWVvdXQ7CisgICAgQm9vbGVhbiBpblB1bGxFdmVudDsKKyAgICBFdmVudFJlZiBvdXRFdmVudDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZkYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpbkxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblB1bGxFdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZWNlaXZlTmV4dEV2ZW50KGluTnVtVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QdWxsRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEV2ZW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfTmV3LCBvdXRFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFF1ZXVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFF1ZXVlUmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q3VycmVudEV2ZW50UXVldWUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50UXVldWVSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFF1ZXVlUmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q3VycmVudEV2ZW50UXVldWUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UXVldWVSZWZfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRNYWluRXZlbnRRdWV1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRRdWV1ZVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1haW5FdmVudFF1ZXVlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlUmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRRdWV1ZVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1haW5FdmVudFF1ZXVlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlUmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0Q3VycmVudEV2ZW50VGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZG91YmxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q3VycmVudEV2ZW50VGltZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBkb3VibGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDdXJyZW50RXZlbnRUaW1lKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1RyYWNrTW91c2VMb2NhdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHcmFmUHRyIGluUG9ydDsKLQlQb2ludCBvdXRQdDsKLQlVSW50MTYgb3V0UmVzdWx0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmaW5Qb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYWNrTW91c2VMb2NhdGlvbihpblBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG91dFB0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgR3JhZlB0ciBpblBvcnQ7CisgICAgUG9pbnQgb3V0UHQ7CisgICAgVUludDE2IG91dFJlc3VsdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja01vdXNlTG9jYXRpb24oaW5Qb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBvdXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHcmFmUHRyIGluUG9ydDsKLQlPcHRpb25CaXRzIGluT3B0aW9uczsKLQlkb3VibGUgaW5UaW1lb3V0OwotCVBvaW50IG91dFB0OwotCVVJbnQzMiBvdXRNb2RpZmllcnM7Ci0JVUludDE2IG91dFJlc3VsdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxkIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmaW5Qb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5UaW1lb3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zKGluUG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRpbWVvdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgb3V0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgR3JhZlB0ciBpblBvcnQ7CisgICAgT3B0aW9uQml0cyBpbk9wdGlvbnM7CisgICAgZG91YmxlIGluVGltZW91dDsKKyAgICBQb2ludCBvdXRQdDsKKyAgICBVSW50MzIgb3V0TW9kaWZpZXJzOworICAgIFVJbnQxNiBvdXRSZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVGltZW91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucyhpblBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG91dFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19UcmFja01vdXNlUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUdyYWZQdHIgaW5Qb3J0OwotCVJnbkhhbmRsZSBpblJlZ2lvbjsKLQlCb29sZWFuIGlvV2FzSW5SZ247Ci0JVUludDE2IG91dFJlc3VsdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmluUG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpblJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlvV2FzSW5SZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhY2tNb3VzZVJlZ2lvbihpblBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmlvV2FzSW5SZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYkgiLAotCSAgICAgICAgICAgICAgICAgICAgIGlvV2FzSW5SZ24sCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBHcmFmUHRyIGluUG9ydDsKKyAgICBSZ25IYW5kbGUgaW5SZWdpb247CisgICAgQm9vbGVhbiBpb1dhc0luUmduOworICAgIFVJbnQxNiBvdXRSZXN1bHQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZpblBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5SZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpb1dhc0luUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRyYWNrTW91c2VSZWdpb24oaW5Qb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb1dhc0luUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpb1dhc0luUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldExhc3RVc2VyRXZlbnRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlkb3VibGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMYXN0VXNlckV2ZW50VGltZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBkb3VibGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMYXN0VXNlckV2ZW50VGltZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19Jc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTW91c2VDb2FsZXNjaW5nRW5hYmxlZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19TZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaW5OZXdTdGF0ZTsKLQlCb29sZWFuIG91dE9sZFN0YXRlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OZXdTdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkKGluTmV3U3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE9sZFN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRPbGRTdGF0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBpbk5ld1N0YXRlOworICAgIEJvb2xlYW4gb3V0T2xkU3RhdGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk5ld1N0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1vdXNlQ29hbGVzY2luZ0VuYWJsZWQoaW5OZXdTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0T2xkU3RhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9sZFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0V2luZG93RXZlbnRUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93RXZlbnRUYXJnZXQoaW5XaW5kb3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFRhcmdldFJlZiBfcnY7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd0V2ZW50VGFyZ2V0KGluV2luZG93KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0Q29udHJvbEV2ZW50VGFyZ2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFRhcmdldFJlZiBfcnY7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xFdmVudFRhcmdldChpbkNvbnRyb2wpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFRhcmdldFJlZiBfcnY7CisgICAgQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xFdmVudFRhcmdldChpbkNvbnRyb2wpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRNZW51RXZlbnRUYXJnZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50VGFyZ2V0UmVmIF9ydjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluTWVudSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVFdmVudFRhcmdldChpbk1lbnUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFRhcmdldFJlZiBfcnY7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51RXZlbnRUYXJnZXQoaW5NZW51KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0QXBwbGljYXRpb25FdmVudFRhcmdldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRUYXJnZXRSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRBcHBsaWNhdGlvbkV2ZW50VGFyZ2V0KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50VGFyZ2V0UmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNFdmVudFRhcmdldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRUYXJnZXRSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRVc2VyRm9jdXNFdmVudFRhcmdldCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBFdmVudFRhcmdldFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFVzZXJGb2N1c0V2ZW50VGFyZ2V0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFRhcmdldFJlZl9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldEV2ZW50RGlzcGF0Y2hlclRhcmdldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRXZlbnRUYXJnZXRSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRFdmVudERpc3BhdGNoZXJUYXJnZXQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRUYXJnZXRSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRFdmVudERpc3BhdGNoZXJUYXJnZXQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUnVuQXBwbGljYXRpb25FdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlSdW5BcHBsaWNhdGlvbkV2ZW50TG9vcCgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJ1bkFwcGxpY2F0aW9uRXZlbnRMb29wKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19RdWl0QXBwbGljYXRpb25FdmVudExvb3AoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlRdWl0QXBwbGljYXRpb25FdmVudExvb3AoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBRdWl0QXBwbGljYXRpb25FdmVudExvb3AoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX1J1bkFwcE1vZGFsTG9vcEZvcldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJ1bkFwcE1vZGFsTG9vcEZvcldpbmRvdyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSdW5BcHBNb2RhbExvb3BGb3JXaW5kb3coaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19RdWl0QXBwTW9kYWxMb29wRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRdWl0QXBwTW9kYWxMb29wRm9yV2luZG93KGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfQmVnaW5BcHBNb2RhbFN0YXRlRm9yV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQmVnaW5BcHBNb2RhbFN0YXRlRm9yV2luZG93KGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEJlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0VuZEFwcE1vZGFsU3RhdGVGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93KGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVuZEFwcE1vZGFsU3RhdGVGb3JXaW5kb3coaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNhcmJvbkV2ZW50c19TZXRVc2VyRm9jdXNXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRVc2VyRm9jdXNXaW5kb3coaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VXNlckZvY3VzV2luZG93KGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0VXNlckZvY3VzV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRVc2VyRm9jdXNXaW5kb3coKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFVzZXJGb2N1c1dpbmRvdygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfU2V0V2luZG93RGVmYXVsdEJ1dHRvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250cm9sKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0RlZmF1bHRCdXR0b24oaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250cm9sKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0RlZmF1bHRCdXR0b24oaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfU2V0V2luZG93Q2FuY2VsQnV0dG9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlDb250cm9sSGFuZGxlIGluQ29udHJvbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRyb2wpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93Q2FuY2VsQnV0dG9uKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250cm9sKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0NhbmNlbEJ1dHRvbihpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0RlZmF1bHRCdXR0b24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93RGVmYXVsdEJ1dHRvbihpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0RlZmF1bHRCdXR0b24oaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfR2V0V2luZG93Q2FuY2VsQnV0dG9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0NhbmNlbEJ1dHRvbihpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93Q2FuY2VsQnV0dG9uKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDYXJib25FdmVudHNfUmVnaXN0ZXJFdmVudEhvdEtleShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5Ib3RLZXlDb2RlOwotCVVJbnQzMiBpbkhvdEtleU1vZGlmaWVyczsKLQlFdmVudEhvdEtleUlEIGluSG90S2V5SUQ7Ci0JRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQ7Ci0JT3B0aW9uQml0cyBpbk9wdGlvbnM7Ci0JRXZlbnRIb3RLZXlSZWYgb3V0UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3RLZXlDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3RLZXlNb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50SG90S2V5SURfQ29udmVydCwgJmluSG90S2V5SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIEV2ZW50VGFyZ2V0UmVmX0NvbnZlcnQsICZpblRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWdpc3RlckV2ZW50SG90S2V5KGluSG90S2V5Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvdEtleU1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvdEtleUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRXZlbnRIb3RLZXlSZWZfTmV3LCBvdXRSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpbkhvdEtleUNvZGU7CisgICAgVUludDMyIGluSG90S2V5TW9kaWZpZXJzOworICAgIEV2ZW50SG90S2V5SUQgaW5Ib3RLZXlJRDsKKyAgICBFdmVudFRhcmdldFJlZiBpblRhcmdldDsKKyAgICBPcHRpb25CaXRzIGluT3B0aW9uczsKKyAgICBFdmVudEhvdEtleVJlZiBvdXRSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhvdEtleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhvdEtleU1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIb3RLZXlJRF9Db252ZXJ0LCAmaW5Ib3RLZXlJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRUYXJnZXRSZWZfQ29udmVydCwgJmluVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVyRXZlbnRIb3RLZXkoaW5Ib3RLZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSG90S2V5TW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSG90S2V5SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEhvdEtleVJlZl9OZXcsIG91dFJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDYXJib25FdmVudHNfbWV0aG9kc1tdID0gewotCXsiR2V0Q3VycmVudEV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0Q3VycmVudEV2ZW50TG9vcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRMb29wUmVmIF9ydikiKX0sCi0JeyJHZXRNYWluRXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRNYWluRXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudExvb3BSZWYgX3J2KSIpfSwKLQl7IlJ1bkN1cnJlbnRFdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1J1bkN1cnJlbnRFdmVudExvb3AsIDEsCi0JIFB5RG9jX1NUUigiKGRvdWJsZSBpblRpbWVvdXQpIC0+IE5vbmUiKX0sCi0JeyJSZWNlaXZlTmV4dEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SZWNlaXZlTmV4dEV2ZW50LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaW5OdW1UeXBlcywgRXZlbnRUeXBlU3BlYyBpbkxpc3QsIGRvdWJsZSBpblRpbWVvdXQsIEJvb2xlYW4gaW5QdWxsRXZlbnQpIC0+IChFdmVudFJlZiBvdXRFdmVudCkiKX0sCi0JeyJHZXRDdXJyZW50RXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0Q3VycmVudEV2ZW50UXVldWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50UXVldWVSZWYgX3J2KSIpfSwKLQl7IkdldE1haW5FdmVudFF1ZXVlIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRNYWluRXZlbnRRdWV1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRRdWV1ZVJlZiBfcnYpIil9LAotCXsiR2V0Q3VycmVudEV2ZW50VGltZSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0Q3VycmVudEV2ZW50VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCi0JeyJUcmFja01vdXNlTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1RyYWNrTW91c2VMb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciBpblBvcnQpIC0+IChQb2ludCBvdXRQdCwgVUludDE2IG91dFJlc3VsdCkiKX0sCi0JeyJUcmFja01vdXNlTG9jYXRpb25XaXRoT3B0aW9ucyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKEdyYWZQdHIgaW5Qb3J0LCBPcHRpb25CaXRzIGluT3B0aW9ucywgZG91YmxlIGluVGltZW91dCkgLT4gKFBvaW50IG91dFB0LCBVSW50MzIgb3V0TW9kaWZpZXJzLCBVSW50MTYgb3V0UmVzdWx0KSIpfSwKLQl7IlRyYWNrTW91c2VSZWdpb24iLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1RyYWNrTW91c2VSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYWZQdHIgaW5Qb3J0LCBSZ25IYW5kbGUgaW5SZWdpb24sIEJvb2xlYW4gaW9XYXNJblJnbikgLT4gKEJvb2xlYW4gaW9XYXNJblJnbiwgVUludDE2IG91dFJlc3VsdCkiKX0sCi0JeyJHZXRMYXN0VXNlckV2ZW50VGltZSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TGFzdFVzZXJFdmVudFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAotCXsiSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19Jc01vdXNlQ29hbGVzY2luZ0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE1vdXNlQ29hbGVzY2luZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldE1vdXNlQ29hbGVzY2luZ0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5OZXdTdGF0ZSkgLT4gKEJvb2xlYW4gb3V0T2xkU3RhdGUpIil9LAotCXsiR2V0V2luZG93RXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFdpbmRvd0V2ZW50VGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiR2V0Q29udHJvbEV2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRDb250cm9sRXZlbnRUYXJnZXQsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xIYW5kbGUgaW5Db250cm9sKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKLQl7IkdldE1lbnVFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWVudUV2ZW50VGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCi0JeyJHZXRBcHBsaWNhdGlvbkV2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRBcHBsaWNhdGlvbkV2ZW50VGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiR2V0VXNlckZvY3VzRXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFVzZXJGb2N1c0V2ZW50VGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAotCXsiR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRFdmVudERpc3BhdGNoZXJUYXJnZXQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCi0JeyJSdW5BcHBsaWNhdGlvbkV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUnVuQXBwbGljYXRpb25FdmVudExvb3AsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlF1aXRBcHBsaWNhdGlvbkV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUXVpdEFwcGxpY2F0aW9uRXZlbnRMb29wLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSdW5BcHBNb2RhbExvb3BGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1J1bkFwcE1vZGFsTG9vcEZvcldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUXVpdEFwcE1vZGFsTG9vcEZvcldpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiQmVnaW5BcHBNb2RhbFN0YXRlRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19CZWdpbkFwcE1vZGFsU3RhdGVGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkVuZEFwcE1vZGFsU3RhdGVGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0VuZEFwcE1vZGFsU3RhdGVGb3JXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlNldFVzZXJGb2N1c1dpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0VXNlckZvY3VzV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJHZXRVc2VyRm9jdXNXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldFVzZXJGb2N1c1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJTZXRXaW5kb3dEZWZhdWx0QnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRXaW5kb3dEZWZhdWx0QnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93Q2FuY2VsQnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRXaW5kb3dDYW5jZWxCdXR0b24sIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgQ29udHJvbEhhbmRsZSBpbkNvbnRyb2wpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dEZWZhdWx0QnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRXaW5kb3dEZWZhdWx0QnV0dG9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiR2V0V2luZG93Q2FuY2VsQnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRXaW5kb3dDYW5jZWxCdXR0b24sIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJSZWdpc3RlckV2ZW50SG90S2V5IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SZWdpc3RlckV2ZW50SG90S2V5LCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaW5Ib3RLZXlDb2RlLCBVSW50MzIgaW5Ib3RLZXlNb2RpZmllcnMsIEV2ZW50SG90S2V5SUQgaW5Ib3RLZXlJRCwgRXZlbnRUYXJnZXRSZWYgaW5UYXJnZXQsIE9wdGlvbkJpdHMgaW5PcHRpb25zKSAtPiAoRXZlbnRIb3RLZXlSZWYgb3V0UmVmKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldEN1cnJlbnRFdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudExvb3AsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50TG9vcFJlZiBfcnYpIil9LAorICAgIHsiR2V0TWFpbkV2ZW50TG9vcCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRMb29wUmVmIF9ydikiKX0sCisgICAgeyJSdW5DdXJyZW50RXZlbnRMb29wIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5DdXJyZW50RXZlbnRMb29wLCAxLAorICAgICBQeURvY19TVFIoIihkb3VibGUgaW5UaW1lb3V0KSAtPiBOb25lIil9LAorICAgIHsiUmVjZWl2ZU5leHRFdmVudCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUmVjZWl2ZU5leHRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGluTnVtVHlwZXMsIEV2ZW50VHlwZVNwZWMgaW5MaXN0LCBkb3VibGUgaW5UaW1lb3V0LCBCb29sZWFuIGluUHVsbEV2ZW50KSAtPiAoRXZlbnRSZWYgb3V0RXZlbnQpIil9LAorICAgIHsiR2V0Q3VycmVudEV2ZW50UXVldWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFF1ZXVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudFF1ZXVlUmVmIF9ydikiKX0sCisgICAgeyJHZXRNYWluRXZlbnRRdWV1ZSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0TWFpbkV2ZW50UXVldWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEV2ZW50UXVldWVSZWYgX3J2KSIpfSwKKyAgICB7IkdldEN1cnJlbnRFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldEN1cnJlbnRFdmVudFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGRvdWJsZSBfcnYpIil9LAorICAgIHsiVHJhY2tNb3VzZUxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlTG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgaW5Qb3J0KSAtPiAoUG9pbnQgb3V0UHQsIFVJbnQxNiBvdXRSZXN1bHQpIil9LAorICAgIHsiVHJhY2tNb3VzZUxvY2F0aW9uV2l0aE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1RyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zLCAxLAorICAgICBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCwgT3B0aW9uQml0cyBpbk9wdGlvbnMsIGRvdWJsZSBpblRpbWVvdXQpIC0+IChQb2ludCBvdXRQdCwgVUludDMyIG91dE1vZGlmaWVycywgVUludDE2IG91dFJlc3VsdCkiKX0sCisgICAgeyJUcmFja01vdXNlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19UcmFja01vdXNlUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFmUHRyIGluUG9ydCwgUmduSGFuZGxlIGluUmVnaW9uLCBCb29sZWFuIGlvV2FzSW5SZ24pIC0+IChCb29sZWFuIGlvV2FzSW5SZ24sIFVJbnQxNiBvdXRSZXN1bHQpIil9LAorICAgIHsiR2V0TGFzdFVzZXJFdmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldExhc3RVc2VyRXZlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKKyAgICB7IklzTW91c2VDb2FsZXNjaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfSXNNb3VzZUNvYWxlc2NpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19TZXRNb3VzZUNvYWxlc2NpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluTmV3U3RhdGUpIC0+IChCb29sZWFuIG91dE9sZFN0YXRlKSIpfSwKKyAgICB7IkdldFdpbmRvd0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRXaW5kb3dFdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xFdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0Q29udHJvbEV2ZW50VGFyZ2V0LCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gKEV2ZW50VGFyZ2V0UmVmIF9ydikiKX0sCisgICAgeyJHZXRNZW51RXZlbnRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX0dldE1lbnVFdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAorICAgIHsiR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0QXBwbGljYXRpb25FdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IkdldFVzZXJGb2N1c0V2ZW50VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNFdmVudFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRUYXJnZXRSZWYgX3J2KSIpfSwKKyAgICB7IkdldEV2ZW50RGlzcGF0Y2hlclRhcmdldCIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0RXZlbnREaXNwYXRjaGVyVGFyZ2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChFdmVudFRhcmdldFJlZiBfcnYpIil9LAorICAgIHsiUnVuQXBwbGljYXRpb25FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1J1bkFwcGxpY2F0aW9uRXZlbnRMb29wLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJRdWl0QXBwbGljYXRpb25FdmVudExvb3AiLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1F1aXRBcHBsaWNhdGlvbkV2ZW50TG9vcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUnVuQXBwTW9kYWxMb29wRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19SdW5BcHBNb2RhbExvb3BGb3JXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlF1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1F1aXRBcHBNb2RhbExvb3BGb3JXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IkJlZ2luQXBwTW9kYWxTdGF0ZUZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfQmVnaW5BcHBNb2RhbFN0YXRlRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJFbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19FbmRBcHBNb2RhbFN0YXRlRm9yV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRVc2VyRm9jdXNXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ2FyYm9uRXZlbnRzX1NldFVzZXJGb2N1c1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0VXNlckZvY3VzV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUNhcmJvbkV2ZW50c19HZXRVc2VyRm9jdXNXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiU2V0V2luZG93RGVmYXVsdEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0V2luZG93RGVmYXVsdEJ1dHRvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBDb250cm9sSGFuZGxlIGluQ29udHJvbCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd0NhbmNlbEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfU2V0V2luZG93Q2FuY2VsQnV0dG9uLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93RGVmYXVsdEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93RGVmYXVsdEJ1dHRvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkdldFdpbmRvd0NhbmNlbEJ1dHRvbiIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfR2V0V2luZG93Q2FuY2VsQnV0dG9uLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiUmVnaXN0ZXJFdmVudEhvdEtleSIsIChQeUNGdW5jdGlvbilDYXJib25FdmVudHNfUmVnaXN0ZXJFdmVudEhvdEtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGluSG90S2V5Q29kZSwgVUludDMyIGluSG90S2V5TW9kaWZpZXJzLCBFdmVudEhvdEtleUlEIGluSG90S2V5SUQsIEV2ZW50VGFyZ2V0UmVmIGluVGFyZ2V0LCBPcHRpb25CaXRzIGluT3B0aW9ucykgLT4gKEV2ZW50SG90S2V5UmVmIG91dFJlZikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZWxzZSAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgQ2FyYm9uRXZlbnRzX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwpAQCAtMjE0MSw3NyArMjE0MSw3NyBAQAogCiB2b2lkIGluaXRfQ2FyYm9uRXZ0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQ2FyYm9uRXZ0IiwgQ2FyYm9uRXZlbnRzX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQ2FyYm9uRXZ0IiwgQ2FyYm9uRXZlbnRzX21ldGhvZHMpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JbXlFdmVudEhhbmRsZXJVUFAgPSBOZXdFdmVudEhhbmRsZXJVUFAobXlFdmVudEhhbmRsZXIpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUNhcmJvbkV2ZW50c19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKENhcmJvbkV2ZW50c19FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENhcmJvbkV2ZW50c19FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUV2ZW50UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZFdmVudFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudFJlZl9UeXBlKTsKLQlFdmVudFF1ZXVlUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZFdmVudFF1ZXVlUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UXVldWVSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkV2ZW50UXVldWVSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFF1ZXVlUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudFF1ZXVlUmVmX1R5cGUpOwotCUV2ZW50TG9vcFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRMb29wUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRXZlbnRMb29wUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRMb29wUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkV2ZW50TG9vcFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wUmVmX1R5cGUpOwotCUV2ZW50TG9vcFRpbWVyUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZFdmVudExvb3BUaW1lclJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRMb29wVGltZXJSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFRpbWVyUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKLQlFdmVudEhhbmRsZXJSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkV2ZW50SGFuZGxlclJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50SGFuZGxlclJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50SGFuZGxlclJlZiIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50SGFuZGxlclJlZl9UeXBlKTsKLQlFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50SGFuZGxlckNhbGxSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJDYWxsUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOwotCUV2ZW50VGFyZ2V0UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZFdmVudFRhcmdldFJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRUYXJnZXRSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRUYXJnZXRSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZFdmVudFRhcmdldFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50VGFyZ2V0UmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudFRhcmdldFJlZl9UeXBlKTsKLQlFdmVudEhvdEtleVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRIb3RLZXlSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZFdmVudEhvdEtleVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50SG90S2V5UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50SG90S2V5UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRXZlbnRIb3RLZXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhvdEtleVJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRIb3RLZXlSZWZfVHlwZSk7CisgICAgbXlFdmVudEhhbmRsZXJVUFAgPSBOZXdFdmVudEhhbmRsZXJVUFAobXlFdmVudEhhbmRsZXIpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIENhcmJvbkV2ZW50c19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKENhcmJvbkV2ZW50c19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIENhcmJvbkV2ZW50c19FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIEV2ZW50UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZFdmVudFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudFJlZl9UeXBlKTsKKyAgICBFdmVudFF1ZXVlUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZFdmVudFF1ZXVlUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50UXVldWVSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRRdWV1ZVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkV2ZW50UXVldWVSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudFF1ZXVlUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudFF1ZXVlUmVmX1R5cGUpOworICAgIEV2ZW50TG9vcFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRMb29wUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRXZlbnRMb29wUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRMb29wUmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkV2ZW50TG9vcFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wUmVmX1R5cGUpOworICAgIEV2ZW50TG9vcFRpbWVyUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZFdmVudExvb3BUaW1lclJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50TG9vcFRpbWVyUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRMb29wVGltZXJSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRMb29wVGltZXJSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50TG9vcFRpbWVyUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudExvb3BUaW1lclJlZl9UeXBlKTsKKyAgICBFdmVudEhhbmRsZXJSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkV2ZW50SGFuZGxlclJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50SGFuZGxlclJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50SGFuZGxlclJlZiIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudEhhbmRsZXJSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkV2ZW50SGFuZGxlclJlZl9UeXBlKTsKKyAgICBFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50SGFuZGxlckNhbGxSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRIYW5kbGVyQ2FsbFJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkV2ZW50SGFuZGxlckNhbGxSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhhbmRsZXJDYWxsUmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudEhhbmRsZXJDYWxsUmVmX1R5cGUpOworICAgIEV2ZW50VGFyZ2V0UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZFdmVudFRhcmdldFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkV2ZW50VGFyZ2V0UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRXZlbnRUYXJnZXRSZWYiLCAoUHlPYmplY3QgKikmRXZlbnRUYXJnZXRSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZFdmVudFRhcmdldFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50VGFyZ2V0UmVmVHlwZSIsIChQeU9iamVjdCAqKSZFdmVudFRhcmdldFJlZl9UeXBlKTsKKyAgICBFdmVudEhvdEtleVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRXZlbnRIb3RLZXlSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZFdmVudEhvdEtleVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkV2ZW50SG90S2V5UmVmIiwgKFB5T2JqZWN0ICopJkV2ZW50SG90S2V5UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRXZlbnRIb3RLZXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJFdmVudEhvdEtleVJlZlR5cGUiLCAoUHlPYmplY3QgKikmRXZlbnRIb3RLZXlSZWZfVHlwZSk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NmL19DRm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKaW5kZXggMDkwNGFlMS4uZWU2N2M3MCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvY2YvX0NGbW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC04NCwxOSArODQsMTkgQEAKIFB5T2JqZWN0ICpDRlJhbmdlX05ldyhDRlJhbmdlICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsIiwgKGxvbmcpaXRzZWxmLT5sb2NhdGlvbiwgKGxvbmcpaXRzZWxmLT5sZW5ndGgpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIChsb25nKWl0c2VsZi0+bG9jYXRpb24sIChsb25nKWl0c2VsZi0+bGVuZ3RoKTsKIH0KIAogaW50CiBDRlJhbmdlX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGUmFuZ2UgKnBfaXRzZWxmKQogewotICAgICAgICBsb25nIGxvY2F0aW9uLCBsZW5ndGg7CisgICAgbG9uZyBsb2NhdGlvbiwgbGVuZ3RoOwogCi0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmbG9jYXRpb24sICZsZW5ndGgpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcF9pdHNlbGYtPmxvY2F0aW9uID0gKENGSW5kZXgpbG9jYXRpb247Ci0gICAgICAgIHBfaXRzZWxmLT5sZW5ndGggPSAoQ0ZJbmRleClsZW5ndGg7Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmbG9jYXRpb24sICZsZW5ndGgpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcF9pdHNlbGYtPmxvY2F0aW9uID0gKENGSW5kZXgpbG9jYXRpb247CisgICAgcF9pdHNlbGYtPmxlbmd0aCA9IChDRkluZGV4KWxlbmd0aDsKKyAgICByZXR1cm4gMTsKIH0KIAogLyogT3B0aW9uYWwgQ0ZVUkwgYXJndW1lbnQgb3IgTm9uZSAocGFzc2VkIGFzIE5VTEwpICovCkBAIC0xMDQsOCArMTA0LDggQEAKIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZVUkxSZWYgKnBfaXRzZWxmKQogewogICAgIGlmICggdiA9PSBQeV9Ob25lICkgewotICAgICAgICBwX2l0c2VsZiA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAxOworICAgIHBfaXRzZWxmID0gTlVMTDsKKyAgICByZXR1cm4gMTsKICAgICB9CiAgICAgcmV0dXJuIENGVVJMUmVmT2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOwogfQpAQCAtMTE5LDI2MiArMTE5LDI2MiBAQAogI2RlZmluZSBDRlR5cGVSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZUeXBlUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGVHlwZVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZUeXBlUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZUeXBlUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZUeXBlUmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZUeXBlUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX05ldyhDRlR5cGVSZWYgaXRzZWxmKQogewotCUNGVHlwZVJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGVHlwZVJlZk9iamVjdCwgJkNGVHlwZVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRlR5cGVSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRlR5cGVSZWZPYmplY3QsICZDRlR5cGVSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRlR5cGVSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZUeXBlUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZUeXBlUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGVHlwZVJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRlR5cGVSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZUeXBlUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGVHlwZVJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRlR5cGVSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRlR5cGVSZWZPYmpfZGVhbGxvYyhDRlR5cGVSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZHZXRUeXBlSUQoQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRkdldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGR2V0VHlwZUlEKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkdldFR5cGVJRChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlR5cGVSZWZPYmpfQ0ZSZXRhaW4oQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVSZWYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlR5cGVSZWYgX3J2OwogI2lmbmRlZiBDRlJldGFpbgotCVB5TWFjX1BSRUNIRUNLKENGUmV0YWluKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlJldGFpbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZSZXRhaW4oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlJldGFpbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGUmVsZWFzZShDRlR5cGVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ0ZSZWxlYXNlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZSZWxlYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlJlbGVhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNGUmVsZWFzZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGUmVsZWFzZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGR2V0UmV0YWluQ291bnQoQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkluZGV4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CiAjaWZuZGVmIENGR2V0UmV0YWluQ291bnQKLQlQeU1hY19QUkVDSEVDSyhDRkdldFJldGFpbkNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkdldFJldGFpbkNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkdldFJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkdldFJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRkVxdWFsKENGVHlwZVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZUeXBlUmVmIGNmMjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0ZUeXBlUmVmIGNmMjsKICNpZm5kZWYgQ0ZFcXVhbAotCVB5TWFjX1BSRUNIRUNLKENGRXF1YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRXF1YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfQ29udmVydCwgJmNmMikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRXF1YWwoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGNmMik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfQ29udmVydCwgJmNmMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRXF1YWwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGNmMik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGSGFzaChDRlR5cGVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSGFzaENvZGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkhhc2hDb2RlIF9ydjsKICNpZm5kZWYgQ0ZIYXNoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZIYXNoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkhhc2gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGSGFzaChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZIYXNoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRkNvcHlEZXNjcmlwdGlvbihDRlR5cGVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRkNvcHlEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKENGQ29weURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkNvcHlEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZDb3B5RGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQ29weURlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZVhNTERhdGEoQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkRhdGFSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlByb3BlcnR5TGlzdENyZWF0ZVhNTERhdGEoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEYXRhUmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRGVlcENvcHkoQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVSZWYgX3J2OwotCUNGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm11dGFiaWxpdHlPcHRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlByb3BlcnR5TGlzdENyZWF0ZURlZXBDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFiaWxpdHlPcHRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZUeXBlUmVmIF9ydjsKKyAgICBDRk9wdGlvbkZsYWdzIG11dGFiaWxpdHlPcHRpb247CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdXRhYmlsaXR5T3B0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVEZWVwQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmlsaXR5T3B0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGU2hvdyhDRlR5cGVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ0ZTaG93Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTaG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlNob3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNGU2hvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU2hvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX0NGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEoQ0ZUeXBlUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlDRlR5cGVSZWYgX3J2OwotCUNGT3B0aW9uRmxhZ3MgbXV0YWJpbGl0eU9wdGlvbjsKLQlDRlN0cmluZ1JlZiBlcnJvclN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm11dGFiaWxpdHlPcHRpb24pKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmlsaXR5T3B0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yU3RyaW5nKTsKLQlpZiAoZXJyb3JTdHJpbmcpCi0JICAgICAgICBDRlJlbGVhc2UoZXJyb3JTdHJpbmcpOwotCWlmIChfcnYgPT0gTlVMTCkgewotCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlBhcnNlIGVycm9yIGluIFhNTCBkYXRhIik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIENGVHlwZVJlZiBfcnY7CisgICAgQ0ZPcHRpb25GbGFncyBtdXRhYmlsaXR5T3B0aW9uOworICAgIENGU3RyaW5nUmVmIGVycm9yU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbXV0YWJpbGl0eU9wdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJvcGVydHlMaXN0Q3JlYXRlRnJvbVhNTERhdGEoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJpbGl0eU9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvclN0cmluZyk7CisgICAgaWYgKGVycm9yU3RyaW5nKQorICAgICAgICBDRlJlbGVhc2UoZXJyb3JTdHJpbmcpOworICAgIGlmIChfcnYgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiUGFyc2UgZXJyb3IgaW4gWE1MIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial90b1B5dGhvbihDRlR5cGVSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCV9yZXMgPSBQeUNGX0NGMlB5dGhvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBfcmVzID0gUHlDRl9DRjJQeXRob24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGVHlwZVJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRkdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZHZXRUeXBlSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCi0JeyJDRlJldGFpbiIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZSZXRhaW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAotCXsiQ0ZSZWxlYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlJlbGVhc2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNGR2V0UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGR2V0UmV0YWluQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKLQl7IkNGRXF1YWwiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGRXF1YWwsIDEsCi0JIFB5RG9jX1NUUigiKENGVHlwZVJlZiBjZjIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRkhhc2giLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGSGFzaCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZIYXNoQ29kZSBfcnYpIil9LAotCXsiQ0ZDb3B5RGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGQ29weURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZVhNTERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVEZWVwQ29weSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVEZWVwQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZPcHRpb25GbGFncyBtdXRhYmlsaXR5T3B0aW9uKSAtPiAoQ0ZUeXBlUmVmIF9ydikiKX0sCi0JeyJDRlNob3ciLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGU2hvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZPcHRpb25GbGFncyBtdXRhYmlsaXR5T3B0aW9uKSAtPiAoQ0ZUeXBlUmVmT2JqKSIpfSwKLQl7InRvUHl0aG9uIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial90b1B5dGhvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAocHl0aG9uX29iamVjdCkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRlJldGFpbiIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZSZXRhaW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAorICAgIHsiQ0ZSZWxlYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlJlbGVhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGR2V0UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGR2V0UmV0YWluQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7IkNGRXF1YWwiLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGRXF1YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVHlwZVJlZiBjZjIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRkhhc2giLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGSGFzaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZIYXNoQ29kZSBfcnYpIil9LAorICAgIHsiQ0ZDb3B5RGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGQ29weURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVYTUxEYXRhIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial9DRlByb3BlcnR5TGlzdENyZWF0ZVhNTERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAorICAgIHsiQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVEZWVwQ29weSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVEZWVwQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZPcHRpb25GbGFncyBtdXRhYmlsaXR5T3B0aW9uKSAtPiAoQ0ZUeXBlUmVmIF9ydikiKX0sCisgICAgeyJDRlNob3ciLCAoUHlDRnVuY3Rpb24pQ0ZUeXBlUmVmT2JqX0NGU2hvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSIsIChQeUNGdW5jdGlvbilDRlR5cGVSZWZPYmpfQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZPcHRpb25GbGFncyBtdXRhYmlsaXR5T3B0aW9uKSAtPiAoQ0ZUeXBlUmVmT2JqKSIpfSwKKyAgICB7InRvUHl0aG9uIiwgKFB5Q0Z1bmN0aW9uKUNGVHlwZVJlZk9ial90b1B5dGhvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAocHl0aG9uX29iamVjdCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGVHlwZVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTM4Miw5MyArMzgyLDkzIEBACiAKIHN0YXRpYyBpbnQgQ0ZUeXBlUmVmT2JqX2NvbXBhcmUoQ0ZUeXBlUmVmT2JqZWN0ICpzZWxmLCBDRlR5cGVSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZUeXBlUmVmT2JqX3JlcHIoQ0ZUeXBlUmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZUeXBlUmVmIHR5cGUtJWQgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKGludClDRkdldFR5cGVJRChzZWxmLT5vYl9pdHNlbGYpLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGVHlwZVJlZiB0eXBlLSVkIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsIChpbnQpQ0ZHZXRUeXBlSUQoc2VsZi0+b2JfaXRzZWxmKSwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZUeXBlUmVmT2JqX2hhc2goQ0ZUeXBlUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGVHlwZVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZUeXBlUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRlR5cGVSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGVHlwZVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRlR5cGVSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRlR5cGVSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGVHlwZVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRlR5cGVSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGVHlwZVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZUeXBlUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRlR5cGVSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGVHlwZVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRlR5cGVSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZUeXBlUmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZUeXBlUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZUeXBlUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGVHlwZVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZUeXBlUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRlR5cGVSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZUeXBlUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGVHlwZVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRlR5cGVSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGVHlwZVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRlR5cGVSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRlR5cGVSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRlR5cGVSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRlR5cGVSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRlR5cGVSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZUeXBlUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRlR5cGVSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGVHlwZVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRlR5cGVSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZUeXBlUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGVHlwZVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZUeXBlUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGVHlwZVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGVHlwZVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRlR5cGVSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ4MSwxMDQgKzQ4MSwxMDQgQEAKICNkZWZpbmUgQ0ZBcnJheVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRkFycmF5UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGQXJyYXlSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGQXJyYXlSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRkFycmF5UmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZBcnJheVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGQXJyYXlSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRkFycmF5UmVmT2JqX05ldyhDRkFycmF5UmVmIGl0c2VsZikKIHsKLQlDRkFycmF5UmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZBcnJheVJlZk9iamVjdCwgJkNGQXJyYXlSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGQXJyYXlSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRkFycmF5UmVmT2JqZWN0LCAmQ0ZBcnJheVJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRkFycmF5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGQXJyYXlSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRkFycmF5UmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGQXJyYXlSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZBcnJheVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRkFycmF5UmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGQXJyYXlSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZBcnJheVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGQXJyYXlSZWZPYmpfZGVhbGxvYyhDRkFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZBcnJheVJlZk9ial9DRkFycmF5Q3JlYXRlQ29weShDRkFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBcnJheUNyZWF0ZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQXJyYXlDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZBcnJheVJlZk9ial9DRkFycmF5R2V0Q291bnQoQ0ZBcnJheVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OwogI2lmbmRlZiBDRkFycmF5R2V0Q291bnQKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5R2V0Q291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlHZXRDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBcnJheUdldENvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkFycmF5R2V0Q291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZBcnJheVJlZk9ial9DRlN0cmluZ0NyZWF0ZUJ5Q29tYmluaW5nU3RyaW5ncyhDRkFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgc2VwYXJhdG9yU3RyaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnNlcGFyYXRvclN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlQnlDb21iaW5pbmdTdHJpbmdzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzZXBhcmF0b3JTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZUJ5Q29tYmluaW5nU3RyaW5ncygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRkFycmF5UmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGQXJyYXlDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGQXJyYXlSZWZPYmpfQ0ZBcnJheUNyZWF0ZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKLQl7IkNGQXJyYXlHZXRDb3VudCIsIChQeUNGdW5jdGlvbilDRkFycmF5UmVmT2JqX0NGQXJyYXlHZXRDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MiLCAoUHlDRnVuY3Rpb24pQ0ZBcnJheVJlZk9ial9DRlN0cmluZ0NyZWF0ZUJ5Q29tYmluaW5nU3RyaW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc2VwYXJhdG9yU3RyaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNGQXJyYXlDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGQXJyYXlSZWZPYmpfQ0ZBcnJheUNyZWF0ZUNvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGQXJyYXlSZWYgX3J2KSIpfSwKKyAgICB7IkNGQXJyYXlHZXRDb3VudCIsIChQeUNGdW5jdGlvbilDRkFycmF5UmVmT2JqX0NGQXJyYXlHZXRDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVCeUNvbWJpbmluZ1N0cmluZ3MiLCAoUHlDRnVuY3Rpb24pQ0ZBcnJheVJlZk9ial9DRlN0cmluZ0NyZWF0ZUJ5Q29tYmluaW5nU3RyaW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc2VwYXJhdG9yU3RyaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZBcnJheVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTU4NiwxMDAgKzU4NiwxMDAgQEAKIAogc3RhdGljIGludCBDRkFycmF5UmVmT2JqX2NvbXBhcmUoQ0ZBcnJheVJlZk9iamVjdCAqc2VsZiwgQ0ZBcnJheVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRkFycmF5UmVmT2JqX3JlcHIoQ0ZBcnJheVJlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGQXJyYXlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRkFycmF5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGQXJyYXlSZWZPYmpfaGFzaChDRkFycmF5UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGQXJyYXlSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGQXJyYXlSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGQXJyYXlSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRkFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGQXJyYXlSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGQXJyYXlSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZBcnJheVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRkFycmF5UmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGQXJyYXlSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRkFycmF5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZBcnJheVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRkFycmF5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRkFycmF5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRkFycmF5UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGQXJyYXlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZBcnJheVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRkFycmF5UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRkFycmF5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGQXJyYXlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRkFycmF5UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZBcnJheVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGQXJyYXlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRkFycmF5UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGQXJyYXlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGQXJyYXlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGQXJyYXlSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZBcnJheVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRkFycmF5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGQXJyYXlSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGQXJyYXlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZBcnJheVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGQXJyYXlSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZBcnJheVJlZiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC02OTIsMTMzICs2OTIsMTMzIEBACiAjZGVmaW5lIENGTXV0YWJsZUFycmF5UmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRk11dGFibGVBcnJheVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGTXV0YWJsZUFycmF5UmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRk11dGFibGVBcnJheVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGTXV0YWJsZUFycmF5UmVmT2JqX05ldyhDRk11dGFibGVBcnJheVJlZiBpdHNlbGYpCiB7Ci0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVBcnJheVJlZk9iamVjdCwgJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRk11dGFibGVBcnJheVJlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0LCAmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZNdXRhYmxlQXJyYXlSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRk11dGFibGVBcnJheVJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRk11dGFibGVBcnJheVJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRk11dGFibGVBcnJheVJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRk11dGFibGVBcnJheVJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGTXV0YWJsZUFycmF5UmVmT2JqX2RlYWxsb2MoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRkFycmF5UmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGQXJyYXlSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggaWR4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGlkeDsKICNpZm5kZWYgQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleAotCVB5TWFjX1BSRUNIRUNLKENGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZHgpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVBbGxWYWx1ZXMoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ0ZBcnJheVJlbW92ZUFsbFZhbHVlcwotCVB5TWFjX1BSRUNIRUNLKENGQXJyYXlSZW1vdmVBbGxWYWx1ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlSZW1vdmVBbGxWYWx1ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNGQXJyYXlSZW1vdmVBbGxWYWx1ZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkFycmF5UmVtb3ZlQWxsVmFsdWVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggaWR4MTsKLQlDRkluZGV4IGlkeDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggaWR4MTsKKyAgICBDRkluZGV4IGlkeDI7CiAjaWZuZGVmIENGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcwotCVB5TWFjX1BSRUNIRUNLKENGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkeDEsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZHgyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeDEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeDIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWR4MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHgyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheUFwcGVuZEFycmF5KENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIG90aGVyQXJyYXk7Ci0JQ0ZSYW5nZSBvdGhlclJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkFycmF5UmVmIG90aGVyQXJyYXk7CisgICAgQ0ZSYW5nZSBvdGhlclJhbmdlOwogI2lmbmRlZiBDRkFycmF5QXBwZW5kQXJyYXkKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5QXBwZW5kQXJyYXkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlBcHBlbmRBcnJheSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAmb3RoZXJBcnJheSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmb3RoZXJSYW5nZSkpCi0JCXJldHVybiBOVUxMOwotCUNGQXJyYXlBcHBlbmRBcnJheShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBvdGhlckFycmF5LAotCSAgICAgICAgICAgICAgICAgICBvdGhlclJhbmdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJm90aGVyQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJm90aGVyUmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkFycmF5QXBwZW5kQXJyYXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJSYW5nZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5UmVtb3ZlVmFsdWVBdEluZGV4LCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGlkeCkgLT4gTm9uZSIpfSwKLQl7IkNGQXJyYXlSZW1vdmVBbGxWYWx1ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheVJlbW92ZUFsbFZhbHVlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0ZBcnJheUV4Y2hhbmdlVmFsdWVzQXRJbmRpY2VzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBpZHgxLCBDRkluZGV4IGlkeDIpIC0+IE5vbmUiKX0sCi0JeyJDRkFycmF5QXBwZW5kQXJyYXkiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheUFwcGVuZEFycmF5LCAxLAotCSBQeURvY19TVFIoIihDRkFycmF5UmVmIG90aGVyQXJyYXksIENGUmFuZ2Ugb3RoZXJSYW5nZSkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNGQXJyYXlSZW1vdmVWYWx1ZUF0SW5kZXgiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ0ZBcnJheVJlbW92ZVZhbHVlQXRJbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBpZHgpIC0+IE5vbmUiKX0sCisgICAgeyJDRkFycmF5UmVtb3ZlQWxsVmFsdWVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlSZW1vdmVBbGxWYWx1ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGQXJyYXlFeGNoYW5nZVZhbHVlc0F0SW5kaWNlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVBcnJheVJlZk9ial9DRkFycmF5RXhjaGFuZ2VWYWx1ZXNBdEluZGljZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggaWR4MSwgQ0ZJbmRleCBpZHgyKSAtPiBOb25lIil9LAorICAgIHsiQ0ZBcnJheUFwcGVuZEFycmF5IiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZUFycmF5UmVmT2JqX0NGQXJyYXlBcHBlbmRBcnJheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZBcnJheVJlZiBvdGhlckFycmF5LCBDRlJhbmdlIG90aGVyUmFuZ2UpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGTXV0YWJsZUFycmF5UmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtODI2LDEwMCArODI2LDEwMCBAQAogCiBzdGF0aWMgaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX2NvbXBhcmUoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKnNlbGYsIENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGTXV0YWJsZUFycmF5UmVmT2JqX3JlcHIoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVBcnJheVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGTXV0YWJsZUFycmF5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX2hhc2goQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCi0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGTXV0YWJsZUFycmF5UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRk11dGFibGVBcnJheVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZUFycmF5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVBcnJheVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZUFycmF5UmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRk11dGFibGVBcnJheVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRk11dGFibGVBcnJheVJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRk11dGFibGVBcnJheVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRk11dGFibGVBcnJheVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGTXV0YWJsZUFycmF5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGTXV0YWJsZUFycmF5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRk11dGFibGVBcnJheVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRk11dGFibGVBcnJheVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRk11dGFibGVBcnJheVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRk11dGFibGVBcnJheVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRk11dGFibGVBcnJheVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGTXV0YWJsZUFycmF5UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRk11dGFibGVBcnJheVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRk11dGFibGVBcnJheVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGTXV0YWJsZUFycmF5UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGTXV0YWJsZUFycmF5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGTXV0YWJsZUFycmF5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRk11dGFibGVBcnJheVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGTXV0YWJsZUFycmF5UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZNdXRhYmxlQXJyYXlSZWYgLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtOTMyLDg2ICs5MzIsODYgQEAKICNkZWZpbmUgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGRGljdGlvbmFyeVJlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRkRpY3Rpb25hcnlSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGRGljdGlvbmFyeVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGRGljdGlvbmFyeVJlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGRGljdGlvbmFyeVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGRGljdGlvbmFyeVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGRGljdGlvbmFyeVJlZk9ial9OZXcoQ0ZEaWN0aW9uYXJ5UmVmIGl0c2VsZikKIHsKLQlDRkRpY3Rpb25hcnlSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRkRpY3Rpb25hcnlSZWZPYmplY3QsICZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGRGljdGlvbmFyeVJlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGRGljdGlvbmFyeVJlZk9iamVjdCwgJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZEaWN0aW9uYXJ5UmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KIAotCWlmICghQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGRGljdGlvbmFyeVJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGRGljdGlvbmFyeVJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRkRpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYyhDRkRpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRkRpY3Rpb25hcnlSZWZPYmpfQ0ZEaWN0aW9uYXJ5Q3JlYXRlQ29weShDRkRpY3Rpb25hcnlSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGljdGlvbmFyeVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGljdGlvbmFyeVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeUdldENvdW50KENGRGljdGlvbmFyeVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OwogI2lmbmRlZiBDRkRpY3Rpb25hcnlHZXRDb3VudAotCVB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeUdldENvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlHZXRDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEaWN0aW9uYXJ5R2V0Q291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGljdGlvbmFyeUdldENvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZEaWN0aW9uYXJ5UmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGRGljdGlvbmFyeUNyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeUNyZWF0ZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGRGljdGlvbmFyeVJlZiBfcnYpIil9LAotCXsiQ0ZEaWN0aW9uYXJ5R2V0Q291bnQiLCAoUHlDRnVuY3Rpb24pQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeUdldENvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRkluZGV4IF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkRpY3Rpb25hcnlDcmVhdGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlDcmVhdGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRkRpY3Rpb25hcnlSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGljdGlvbmFyeUdldENvdW50IiwgKFB5Q0Z1bmN0aW9uKUNGRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlHZXRDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRkRpY3Rpb25hcnlSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMDE5LDEwMCArMTAxOSwxMDAgQEAKIAogc3RhdGljIGludCBDRkRpY3Rpb25hcnlSZWZPYmpfY29tcGFyZShDRkRpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYsIENGRGljdGlvbmFyeVJlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRkRpY3Rpb25hcnlSZWZPYmpfcmVwcihDRkRpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRkRpY3Rpb25hcnlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRkRpY3Rpb25hcnlSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2hhc2goQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGRGljdGlvbmFyeVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZEaWN0aW9uYXJ5UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRkRpY3Rpb25hcnlSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRkRpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGRGljdGlvbmFyeVJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGRGljdGlvbmFyeVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRkRpY3Rpb25hcnlSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRkRpY3Rpb25hcnlSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRkRpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRkRpY3Rpb25hcnlSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGRGljdGlvbmFyeVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRkRpY3Rpb25hcnlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGRGljdGlvbmFyeVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGRGljdGlvbmFyeVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGRGljdGlvbmFyeVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGRGljdGlvbmFyeVJlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGRGljdGlvbmFyeVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGRGljdGlvbmFyeVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRkRpY3Rpb25hcnlSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGRGljdGlvbmFyeVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZEaWN0aW9uYXJ5UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGRGljdGlvbmFyeVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRkRpY3Rpb25hcnlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRkRpY3Rpb25hcnlSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGRGljdGlvbmFyeVJlZiAtLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTEyNSw3MCArMTEyNSw3MCBAQAogI2RlZmluZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdDsKIAogUHlPYmplY3QgKkNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfTmV3KENGTXV0YWJsZURpY3Rpb25hcnlSZWYgaXRzZWxmKQogewotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0LCAmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QsICZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9kZWFsbG9jKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRkRpY3Rpb25hcnlSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeVJlbW92ZUFsbFZhbHVlcyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGRGljdGlvbmFyeVJlbW92ZUFsbFZhbHVlcwotCVB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeVJlbW92ZUFsbFZhbHVlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5UmVtb3ZlQWxsVmFsdWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DRkRpY3Rpb25hcnlSZW1vdmVBbGxWYWx1ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNGRGljdGlvbmFyeVJlbW92ZUFsbFZhbHVlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NGRGljdGlvbmFyeVJlbW92ZUFsbFZhbHVlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTE5NiwxMDAgKzExOTYsMTAwIEBACiAKIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9jb21wYXJlKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYsIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKm90aGVyKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKLQlpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9yZXByKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2hhc2goQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqc2VsZikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogc3RhdGljIGludCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQkoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGTXV0YWJsZURpY3Rpb25hcnlSZWYiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTMwMiwxMjQgKzEzMDIsMTI0IEBACiAjZGVmaW5lIENGRGF0YVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRkRhdGFSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZEYXRhUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBDRkRhdGFSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRkRhdGFSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRkRhdGFSZWYgb2JfaXRzZWxmOworICAgIHZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOwogfSBDRkRhdGFSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRkRhdGFSZWZPYmpfTmV3KENGRGF0YVJlZiBpdHNlbGYpCiB7Ci0JQ0ZEYXRhUmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZEYXRhUmVmT2JqZWN0LCAmQ0ZEYXRhUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCi0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDRkRhdGFSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRkRhdGFSZWZPYmplY3QsICZDRkRhdGFSZWZfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIC8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ0ZEYXRhUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGRGF0YVJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JICAgIGNoYXIgKmNTdHI7Ci0JICAgIFB5X3NzaXplX3QgY0xlbjsKLQkgICAgaWYoIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSh2LCAmY1N0ciwgJmNMZW4pIDwgMCApIHJldHVybiAwOwotCSAgICAqcF9pdHNlbGYgPSBDRkRhdGFDcmVhdGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsICh1bnNpZ25lZCBjaGFyICopY1N0ciwgY0xlbik7Ci0JICAgIHJldHVybiAxOwotCX0KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgIGNoYXIgKmNTdHI7CisgICAgICAgIFB5X3NzaXplX3QgY0xlbjsKKyAgICAgICAgaWYoIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSh2LCAmY1N0ciwgJmNMZW4pIDwgMCApIHJldHVybiAwOworICAgICAgICAqcF9pdHNlbGYgPSBDRkRhdGFDcmVhdGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsICh1bnNpZ25lZCBjaGFyICopY1N0ciwgY0xlbik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAotCWlmICghQ0ZEYXRhUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGRGF0YVJlZiByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChDRkRhdGFSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghQ0ZEYXRhUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGRGF0YVJlZiByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDRkRhdGFSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDRkRhdGFSZWZPYmpfZGVhbGxvYyhDRkRhdGFSZWZPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOwotCQlzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOwotCX0KLQlDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICB9CisgICAgQ0ZUeXBlUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRkRhdGFSZWZPYmpfQ0ZEYXRhQ3JlYXRlQ29weShDRkRhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGF0YVJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGF0YUNyZWF0ZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGF0YUNyZWF0ZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX0NGRGF0YUdldExlbmd0aChDRkRhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKICNpZm5kZWYgQ0ZEYXRhR2V0TGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhR2V0TGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFHZXRMZW5ndGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGF0YUdldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZEYXRhR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGRGF0YVJlZk9ial9DRlN0cmluZ0NyZWF0ZUZyb21FeHRlcm5hbFJlcHJlc2VudGF0aW9uKENGRGF0YVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVGcm9tRXh0ZXJuYWxSZXByZXNlbnRhdGlvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZEYXRhUmVmT2JqX0NGRGF0YUdldERhdGEoQ0ZEYXRhUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgc2l6ZSA9IENGRGF0YUdldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQljaGFyICpkYXRhID0gKGNoYXIgKilDRkRhdGFHZXRCeXRlUHRyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGludCBzaXplID0gQ0ZEYXRhR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGNoYXIgKmRhdGEgPSAoY2hhciAqKUNGRGF0YUdldEJ5dGVQdHIoX3NlbGYtPm9iX2l0c2VsZik7CiAKLQlfcmVzID0gKFB5T2JqZWN0ICopUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoZGF0YSwgc2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IChQeU9iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGRhdGEsIHNpemUpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRkRhdGFSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZEYXRhQ3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZEYXRhQ3JlYXRlQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFHZXRMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGRGF0YUdldExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVGcm9tRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVGcm9tRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFHZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRkRhdGFHZXREYXRhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzdHJpbmcgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNGRGF0YUNyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGRGF0YUNyZWF0ZUNvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAorICAgIHsiQ0ZEYXRhR2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGRGF0YVJlZk9ial9DRkRhdGFHZXRMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZEYXRhUmVmT2JqX0NGU3RyaW5nQ3JlYXRlRnJvbUV4dGVybmFsUmVwcmVzZW50YXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZEYXRhR2V0RGF0YSIsIChQeUNGdW5jdGlvbilDRkRhdGFSZWZPYmpfQ0ZEYXRhR2V0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc3RyaW5nIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGRGF0YVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTE0MjcsMTAwICsxNDI3LDEwMCBAQAogCiBzdGF0aWMgaW50IENGRGF0YVJlZk9ial9jb21wYXJlKENGRGF0YVJlZk9iamVjdCAqc2VsZiwgQ0ZEYXRhUmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGRGF0YVJlZk9ial9yZXByKENGRGF0YVJlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGRGF0YVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGRGF0YVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRkRhdGFSZWZPYmpfaGFzaChDRkRhdGFSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCi0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KIHN0YXRpYyBpbnQgQ0ZEYXRhUmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRkRhdGFSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGRGF0YVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGRGF0YVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGRGF0YVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRkRhdGFSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZEYXRhUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRkRhdGFSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRkRhdGFSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGRGF0YVJlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRkRhdGFSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZEYXRhUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGRGF0YVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGRGF0YVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGRGF0YVJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRkRhdGFSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGRGF0YVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZEYXRhUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGRGF0YVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRkRhdGFSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZEYXRhUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRkRhdGFSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZEYXRhUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZEYXRhUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZEYXRhUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZEYXRhUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZEYXRhUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGRGF0YVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZEYXRhUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRkRhdGFSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZEYXRhUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGRGF0YVJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRkRhdGFSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGRGF0YVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRkRhdGFSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRkRhdGFSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ0ZEYXRhUmVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNTMzLDE1OCArMTUzMywxNTggQEAKICNkZWZpbmUgQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRk11dGFibGVEYXRhUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGTXV0YWJsZURhdGFSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGTXV0YWJsZURhdGFSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRk11dGFibGVEYXRhUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZNdXRhYmxlRGF0YVJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGTXV0YWJsZURhdGFSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRk11dGFibGVEYXRhUmVmT2JqX05ldyhDRk11dGFibGVEYXRhUmVmIGl0c2VsZikKIHsKLQlDRk11dGFibGVEYXRhUmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCwgJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGTXV0YWJsZURhdGFSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRk11dGFibGVEYXRhUmVmT2JqZWN0LCAmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRk11dGFibGVEYXRhUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGTXV0YWJsZURhdGFSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRk11dGFibGVEYXRhUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZURhdGFSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRk11dGFibGVEYXRhUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGTXV0YWJsZURhdGFSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGTXV0YWJsZURhdGFSZWZPYmpfZGVhbGxvYyhDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJc2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsKLQkJc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQl9Ci0JQ0ZEYXRhUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGRGF0YVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFTZXRMZW5ndGgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBsZW5ndGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggbGVuZ3RoOwogI2lmbmRlZiBDRkRhdGFTZXRMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhDRkRhdGFTZXRMZW5ndGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YVNldExlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCUNGRGF0YVNldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBsZW5ndGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGRGF0YVNldExlbmd0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUluY3JlYXNlTGVuZ3RoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggZXh0cmFMZW5ndGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggZXh0cmFMZW5ndGg7CiAjaWZuZGVmIENGRGF0YUluY3JlYXNlTGVuZ3RoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhSW5jcmVhc2VMZW5ndGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YUluY3JlYXNlTGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFMZW5ndGgpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkRhdGFJbmNyZWFzZUxlbmd0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGV4dHJhTGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYUxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGRGF0YUluY3JlYXNlTGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFMZW5ndGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUFwcGVuZEJ5dGVzKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGNoYXIgKmJ5dGVzX19pbl9fOwotCWxvbmcgYnl0ZXNfX2xlbl9fOwotCWludCBieXRlc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX19pbl9fOworICAgIGxvbmcgYnl0ZXNfX2xlbl9fOworICAgIGludCBieXRlc19faW5fbGVuX187CiAjaWZuZGVmIENGRGF0YUFwcGVuZEJ5dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQXBwZW5kQnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YUFwcGVuZEJ5dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX19pbl9fLCAmYnl0ZXNfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JYnl0ZXNfX2xlbl9fID0gYnl0ZXNfX2luX2xlbl9fOwotCUNGRGF0YUFwcGVuZEJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgYnl0ZXNfX2luX18sIGJ5dGVzX19sZW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX19pbl9fLCAmYnl0ZXNfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnl0ZXNfX2xlbl9fID0gYnl0ZXNfX2luX2xlbl9fOworICAgIENGRGF0YUFwcGVuZEJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfX2luX18sIGJ5dGVzX19sZW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhUmVwbGFjZUJ5dGVzKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGUmFuZ2UgcmFuZ2U7Ci0JdW5zaWduZWQgY2hhciAqbmV3Qnl0ZXNfX2luX187Ci0JbG9uZyBuZXdCeXRlc19fbGVuX187Ci0JaW50IG5ld0J5dGVzX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICB1bnNpZ25lZCBjaGFyICpuZXdCeXRlc19faW5fXzsKKyAgICBsb25nIG5ld0J5dGVzX19sZW5fXzsKKyAgICBpbnQgbmV3Qnl0ZXNfX2luX2xlbl9fOwogI2lmbmRlZiBDRkRhdGFSZXBsYWNlQnl0ZXMKLQlQeU1hY19QUkVDSEVDSyhDRkRhdGFSZXBsYWNlQnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YVJlcGxhY2VCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdCeXRlc19faW5fXywgJm5ld0J5dGVzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCW5ld0J5dGVzX19sZW5fXyA9IG5ld0J5dGVzX19pbl9sZW5fXzsKLQlDRkRhdGFSZXBsYWNlQnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgcmFuZ2UsCi0JICAgICAgICAgICAgICAgICAgIG5ld0J5dGVzX19pbl9fLCBuZXdCeXRlc19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdCeXRlc19faW5fXywgJm5ld0J5dGVzX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5ld0J5dGVzX19sZW5fXyA9IG5ld0J5dGVzX19pbl9sZW5fXzsKKyAgICBDRkRhdGFSZXBsYWNlQnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIG5ld0J5dGVzX19pbl9fLCBuZXdCeXRlc19fbGVuX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YURlbGV0ZUJ5dGVzKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGUmFuZ2UgcmFuZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CiAjaWZuZGVmIENGRGF0YURlbGV0ZUJ5dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhRGVsZXRlQnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YURlbGV0ZUJ5dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDRkRhdGFEZWxldGVCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHJhbmdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGRGF0YURlbGV0ZUJ5dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGTXV0YWJsZURhdGFSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZEYXRhU2V0TGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhU2V0TGVuZ3RoLCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGxlbmd0aCkgLT4gTm9uZSIpfSwKLQl7IkNGRGF0YUluY3JlYXNlTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhSW5jcmVhc2VMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggZXh0cmFMZW5ndGgpIC0+IE5vbmUiKX0sCi0JeyJDRkRhdGFBcHBlbmRCeXRlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YUFwcGVuZEJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IE5vbmUiKX0sCi0JeyJDRkRhdGFSZXBsYWNlQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFSZXBsYWNlQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UsIEJ1ZmZlciBuZXdCeXRlcykgLT4gTm9uZSIpfSwKLQl7IkNGRGF0YURlbGV0ZUJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhRGVsZXRlQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRkRhdGFTZXRMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFTZXRMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggbGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiQ0ZEYXRhSW5jcmVhc2VMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFJbmNyZWFzZUxlbmd0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBleHRyYUxlbmd0aCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGRGF0YUFwcGVuZEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZURhdGFSZWZPYmpfQ0ZEYXRhQXBwZW5kQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBieXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkNGRGF0YVJlcGxhY2VCeXRlcyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVEYXRhUmVmT2JqX0NGRGF0YVJlcGxhY2VCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQnVmZmVyIG5ld0J5dGVzKSAtPiBOb25lIil9LAorICAgIHsiQ0ZEYXRhRGVsZXRlQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlRGF0YVJlZk9ial9DRkRhdGFEZWxldGVCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGF0YVJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTE2OTIsMTAwICsxNjkyLDEwMCBAQAogCiBzdGF0aWMgaW50IENGTXV0YWJsZURhdGFSZWZPYmpfY29tcGFyZShDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpzZWxmLCBDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGTXV0YWJsZURhdGFSZWZPYmpfcmVwcihDRk11dGFibGVEYXRhUmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlRGF0YVJlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGTXV0YWJsZURhdGFSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGF0YVJlZk9ial9oYXNoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCi0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQ0ZNdXRhYmxlRGF0YVJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZNdXRhYmxlRGF0YVJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZURhdGFSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGTXV0YWJsZURhdGFSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZNdXRhYmxlRGF0YVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLQkvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRk11dGFibGVEYXRhUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRk11dGFibGVEYXRhUmVmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENGTXV0YWJsZURhdGFSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZNdXRhYmxlRGF0YVJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGTXV0YWJsZURhdGFSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBDRk11dGFibGVEYXRhUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIENGTXV0YWJsZURhdGFSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZNdXRhYmxlRGF0YVJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRk11dGFibGVEYXRhUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUNGTXV0YWJsZURhdGFSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRk11dGFibGVEYXRhUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZNdXRhYmxlRGF0YVJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENGTXV0YWJsZURhdGFSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZNdXRhYmxlRGF0YVJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZNdXRhYmxlRGF0YVJlZk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ0ZNdXRhYmxlRGF0YVJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRk11dGFibGVEYXRhUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGTXV0YWJsZURhdGFSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRk11dGFibGVEYXRhUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRk11dGFibGVEYXRhUmVmIC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE3OTgsNjM2ICsxNzk4LDYzNiBAQAogI2RlZmluZSBDRlN0cmluZ1JlZk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDRlN0cmluZ1JlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDRlN0cmluZ1JlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZTdHJpbmdSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDRlN0cmluZ1JlZiBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENGU3RyaW5nUmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZTdHJpbmdSZWZPYmplY3Q7CiAKIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9OZXcoQ0ZTdHJpbmdSZWYgaXRzZWxmKQogewotCUNGU3RyaW5nUmVmT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0ZTdHJpbmdSZWZPYmplY3QsICZDRlN0cmluZ1JlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZTdHJpbmdSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhDRlN0cmluZ1JlZk9iamVjdCwgJkNGU3RyaW5nUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGU3RyaW5nUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGU3RyaW5nUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQlpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkgICAgY2hhciAqY1N0cjsKLQkgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiZXMiLCAiYXNjaWkiLCAmY1N0cikpCi0JICAgICAgICByZXR1cm4gMDsKLQkgICAgICAgICpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsIGNTdHIsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpOwotCQlQeU1lbV9GcmVlKGNTdHIpOwotCSAgICAgICAgcmV0dXJuIDE7Ci0JfQotCWlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKLQkgICAgICAgIC8qIFdlIHVzZSB0aGUgQ0YgdHlwZXMgaGVyZSwgaWYgUHl0aG9uIHdhcyBjb25maWd1cmVkIGRpZmZlcmVudGx5IHRoYXQgd2lsbCBnaXZlIGFuIGVycm9yICovCi0JICAgICAgICBDRkluZGV4IHNpemUgPSBQeVVuaWNvZGVfR2V0U2l6ZSh2KTsKLQkgICAgICAgIFVuaUNoYXIgKnVuaWNoYXJzID0gUHlVbmljb2RlX0FzVW5pY29kZSh2KTsKLQkgICAgICAgIGlmICghdW5pY2hhcnMpIHJldHVybiAwOwotCSAgICAgICAgKnBfaXRzZWxmID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgdW5pY2hhcnMsIHNpemUpOwotCSAgICAgICAgcmV0dXJuIDE7Ci0JfQorICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgY2hhciAqY1N0cjsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiZXMiLCAiYXNjaWkiLCAmY1N0cikpCisgICAgICAgIHJldHVybiAwOworICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjU3RyLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKKyAgICAgICAgUHlNZW1fRnJlZShjU3RyKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgLyogV2UgdXNlIHRoZSBDRiB0eXBlcyBoZXJlLCBpZiBQeXRob24gd2FzIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhdCB3aWxsIGdpdmUgYW4gZXJyb3IgKi8KKyAgICAgICAgQ0ZJbmRleCBzaXplID0gUHlVbmljb2RlX0dldFNpemUodik7CisgICAgICAgIFVuaUNoYXIgKnVuaWNoYXJzID0gUHlVbmljb2RlX0FzVW5pY29kZSh2KTsKKyAgICAgICAgaWYgKCF1bmljaGFycykgcmV0dXJuIDA7CisgICAgICAgICpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCiAKLQlpZiAoIUNGU3RyaW5nUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGU3RyaW5nUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGU3RyaW5nUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGU3RyaW5nUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGU3RyaW5nUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGU3RyaW5nUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZTdHJpbmdSZWZPYmpfZGVhbGxvYyhDRlN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZyhDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUNGUmFuZ2UgcmFuZ2U7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoU3Vic3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVDb3B5KENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldExlbmd0aChDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldExlbmd0aAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldExlbmd0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0Qnl0ZXMoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OwotCUNGUmFuZ2UgcmFuZ2U7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKLQlVSW50OCBsb3NzQnl0ZTsKLQlCb29sZWFuIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbjsKLQlVSW50OCBidWZmZXI7Ci0JQ0ZJbmRleCBtYXhCdWZMZW47Ci0JQ0ZJbmRleCB1c2VkQnVmTGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IF9ydjsKKyAgICBDRlJhbmdlIHJhbmdlOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgVUludDggbG9zc0J5dGU7CisgICAgQm9vbGVhbiBpc0V4dGVybmFsUmVwcmVzZW50YXRpb247CisgICAgVUludDggYnVmZmVyOworICAgIENGSW5kZXggbWF4QnVmTGVuOworICAgIENGSW5kZXggdXNlZEJ1ZkxlbjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0Qnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0Qnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsYmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmxvc3NCeXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4QnVmTGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRCeXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgIGxvc3NCeXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1heEJ1ZkxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkQnVmTGVuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgIHVzZWRCdWZMZW4pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb3NzQnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heEJ1ZkxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0Qnl0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzQnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZEJ1Zkxlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkQnVmTGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUV4dGVybmFsUmVwcmVzZW50YXRpb24oQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGF0YVJlZiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKLQlVSW50OCBsb3NzQnl0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmxvc3NCeXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc0J5dGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEYXRhUmVmIF9ydjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFVJbnQ4IGxvc3NCeXRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9zc0J5dGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZUV4dGVybmFsUmVwcmVzZW50YXRpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzQnl0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZyhDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEZhc3Rlc3RFbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nR2V0RmFzdGVzdEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldEZhc3Rlc3RFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyhDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZDb21wYXJpc29uUmVzdWx0IF9ydjsKLQlDRlN0cmluZ1JlZiB0aGVTdHJpbmcyOwotCUNGUmFuZ2UgcmFuZ2VUb0NvbXBhcmU7Ci0JQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZDb21wYXJpc29uUmVzdWx0IF9ydjsKKyAgICBDRlN0cmluZ1JlZiB0aGVTdHJpbmcyOworICAgIENGUmFuZ2UgcmFuZ2VUb0NvbXBhcmU7CisgICAgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9uczsKICNpZm5kZWYgQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbXBhcmVXaXRoT3B0aW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nMiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2VUb0NvbXBhcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nMiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVRvQ29tcGFyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlT3B0aW9ucyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2VUb0NvbXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVRvQ29tcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlT3B0aW9ucyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkNvbXBhcmlzb25SZXN1bHQgX3J2OwotCUNGU3RyaW5nUmVmIHRoZVN0cmluZzI7Ci0JQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZDb21wYXJpc29uUmVzdWx0IF9ydjsKKyAgICBDRlN0cmluZ1JlZiB0aGVTdHJpbmcyOworICAgIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CiAjaWZuZGVmIENGU3RyaW5nQ29tcGFyZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29tcGFyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb21wYXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aGVTdHJpbmcyLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NvbXBhcmUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nMiwKLQkgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aGVTdHJpbmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbXBhcmUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nRmluZFdpdGhPcHRpb25zKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7Ci0JQ0ZSYW5nZSByYW5nZVRvU2VhcmNoOwotCUNGT3B0aW9uRmxhZ3Mgc2VhcmNoT3B0aW9uczsKLQlDRlJhbmdlIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kOworICAgIENGUmFuZ2UgcmFuZ2VUb1NlYXJjaDsKKyAgICBDRk9wdGlvbkZsYWdzIHNlYXJjaE9wdGlvbnM7CisgICAgQ0ZSYW5nZSByZXN1bHQ7CiAjaWZuZGVmIENGU3RyaW5nRmluZFdpdGhPcHRpb25zCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdGaW5kV2l0aE9wdGlvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRmluZFdpdGhPcHRpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN0cmluZ1RvRmluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2VUb1NlYXJjaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaE9wdGlvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRmluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVRvU2VhcmNoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaE9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCByZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN0cmluZ1RvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2VUb1NlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaE9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVRvU2VhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaE9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCByZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlXaXRoRmluZFJlc3VsdHMoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGQXJyYXlSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHN0cmluZ1RvRmluZDsKLQlDRlJhbmdlIHJhbmdlVG9TZWFyY2g7Ci0JQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9uczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdHJpbmdUb0ZpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlVG9TZWFyY2gsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wYXJlT3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlQXJyYXlXaXRoRmluZFJlc3VsdHMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nVG9GaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VUb1NlYXJjaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVPcHRpb25zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkFycmF5UmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7CisgICAgQ0ZSYW5nZSByYW5nZVRvU2VhcmNoOworICAgIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3RyaW5nVG9GaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZVRvU2VhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGFyZU9wdGlvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlVG9TZWFyY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlT3B0aW9ucyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmQoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGUmFuZ2UgX3J2OwotCUNGU3RyaW5nUmVmIHN0cmluZ1RvRmluZDsKLQlDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlJhbmdlIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQ7CisgICAgQ0ZPcHRpb25GbGFncyBjb21wYXJlT3B0aW9uczsKICNpZm5kZWYgQ0ZTdHJpbmdGaW5kCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdGaW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0ZpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN0cmluZ1RvRmluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdGaW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRmluZCwKLQkgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN0cmluZ1RvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBhcmVPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdGaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1RvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZU9wdGlvbnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdIYXNQcmVmaXgoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUNGU3RyaW5nUmVmIHByZWZpeDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgcHJlZml4OwogI2lmbmRlZiBDRlN0cmluZ0hhc1ByZWZpeAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nSGFzUHJlZml4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0hhc1ByZWZpeCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwcmVmaXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0hhc1ByZWZpeChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcHJlZml4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdIYXNQcmVmaXgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzU3VmZml4KENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlDRlN0cmluZ1JlZiBzdWZmaXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIENGU3RyaW5nUmVmIHN1ZmZpeDsKICNpZm5kZWYgQ0ZTdHJpbmdIYXNTdWZmaXgKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0hhc1N1ZmZpeCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdIYXNTdWZmaXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3VmZml4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdIYXNTdWZmaXgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1ZmZpeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nSGFzU3VmZml4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldExpbmVCb3VuZHMoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGUmFuZ2UgcmFuZ2U7Ci0JQ0ZJbmRleCBsaW5lQmVnaW5JbmRleDsKLQlDRkluZGV4IGxpbmVFbmRJbmRleDsKLQlDRkluZGV4IGNvbnRlbnRzRW5kSW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CisgICAgQ0ZJbmRleCBsaW5lQmVnaW5JbmRleDsKKyAgICBDRkluZGV4IGxpbmVFbmRJbmRleDsKKyAgICBDRkluZGV4IGNvbnRlbnRzRW5kSW5kZXg7CiAjaWZuZGVmIENGU3RyaW5nR2V0TGluZUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TGluZUJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRMaW5lQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ0dldExpbmVCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaW5lQmVnaW5JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbmVFbmRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRzRW5kSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIGxpbmVCZWdpbkluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgIGxpbmVFbmRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICBjb250ZW50c0VuZEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdHZXRMaW5lQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGluZUJlZ2luSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5lRW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50c0VuZEluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lQmVnaW5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNFbmRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVBcnJheUJ5U2VwYXJhdGluZ1N0cmluZ3MoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGQXJyYXlSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHNlcGFyYXRvclN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzZXBhcmF0b3JTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvclN0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZBcnJheVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgc2VwYXJhdG9yU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnNlcGFyYXRvclN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlQXJyYXlCeVNlcGFyYXRpbmdTdHJpbmdzKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yU3RyaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0SW50VmFsdWUoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIENGU3RyaW5nR2V0SW50VmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEludFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldEludFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0dldEludFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldEludFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0RG91YmxlVmFsdWUoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWRvdWJsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGRvdWJsZSBfcnY7CiAjaWZuZGVmIENGU3RyaW5nR2V0RG91YmxlVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldERvdWJsZVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldERvdWJsZVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0dldERvdWJsZVZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldERvdWJsZVZhbHVlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIF9ydjsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0SUFOQUNoYXJTZXROYW1lVG9FbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTaG93U3RyKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGU2hvd1N0cgotCVB5TWFjX1BSRUNIRUNLKENGU2hvd1N0cik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTaG93U3RyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlNob3dTdHIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlNob3dTdHIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aFN0cmluZyhDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUNGVVJMUmVmIGJhc2VVUkw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQsICZiYXNlVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIENGVVJMUmVmIGJhc2VVUkw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQsICZiYXNlVVJMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aChDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUNGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZTsKLQlCb29sZWFuIGlzRGlyZWN0b3J5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdGhTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlOworICAgIEJvb2xlYW4gaXNEaXJlY3Rvcnk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aCgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhSZWxhdGl2ZVRvQmFzZShDRlN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUNGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZTsKLQlCb29sZWFuIGlzRGlyZWN0b3J5OwotCUNGVVJMUmVmIGJhc2VVUkw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXRoU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZTsKKyAgICBCb29sZWFuIGlzRGlyZWN0b3J5OworICAgIENGVVJMUmVmIGJhc2VVUkw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVVJMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZDsKLQlDRlN0cmluZ1JlZiBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZDsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZDsKKyAgICBDRlN0cmluZ1JlZiBsZWdhbFVSTENoYXJhY3RlcnNUb0JlRXNjYXBlZDsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlVW5lc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRTdHJpbmcoQ0ZTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWludCBzaXplID0gQ0ZTdHJpbmdHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZikrMTsKLQljaGFyICpkYXRhID0gbWFsbG9jKHNpemUpOworICAgIGludCBzaXplID0gQ0ZTdHJpbmdHZXRMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZikrMTsKKyAgICBjaGFyICpkYXRhID0gbWFsbG9jKHNpemUpOwogCi0JaWYoIGRhdGEgPT0gTlVMTCApIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCWlmICggQ0ZTdHJpbmdHZXRDU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUsIDApICkgewotCSAgICAgICAgX3JlcyA9IChQeU9iamVjdCAqKVB5U3RyaW5nX0Zyb21TdHJpbmcoZGF0YSk7Ci0JfSBlbHNlIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJDRlN0cmluZ0dldENTdHJpbmcgY291bGQgbm90IGZpdCB0aGUgc3RyaW5nIik7Ci0JICAgICAgICBfcmVzID0gTlVMTDsKLQl9Ci0JZnJlZShkYXRhKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgaWYgKCBDRlN0cmluZ0dldENTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwgZGF0YSwgc2l6ZSwgMCkgKSB7CisgICAgICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nKGRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJDRlN0cmluZ0dldENTdHJpbmcgY291bGQgbm90IGZpdCB0aGUgc3RyaW5nIik7CisgICAgICAgIF9yZXMgPSBOVUxMOworICAgIH0KKyAgICBmcmVlKGRhdGEpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRVbmljb2RlKENGU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpKzE7Ci0JUHlfVU5JQ09ERSAqZGF0YSA9IG1hbGxvYyhzaXplKnNpemVvZihQeV9VTklDT0RFKSk7Ci0JQ0ZSYW5nZSByYW5nZTsKKyAgICBpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKF9zZWxmLT5vYl9pdHNlbGYpKzE7CisgICAgUHlfVU5JQ09ERSAqZGF0YSA9IG1hbGxvYyhzaXplKnNpemVvZihQeV9VTklDT0RFKSk7CisgICAgQ0ZSYW5nZSByYW5nZTsKIAotCXJhbmdlLmxvY2F0aW9uID0gMDsKLQlyYW5nZS5sZW5ndGggPSBzaXplOwotCWlmKCBkYXRhID09IE5VTEwgKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlDRlN0cmluZ0dldENoYXJhY3RlcnMoX3NlbGYtPm9iX2l0c2VsZiwgcmFuZ2UsIGRhdGEpOwotCV9yZXMgPSAoUHlPYmplY3QgKilQeVVuaWNvZGVfRnJvbVVuaWNvZGUoZGF0YSwgc2l6ZS0xKTsKLQlmcmVlKGRhdGEpOwotCXJldHVybiBfcmVzOworICAgIHJhbmdlLmxvY2F0aW9uID0gMDsKKyAgICByYW5nZS5sZW5ndGggPSBzaXplOworICAgIGlmKCBkYXRhID09IE5VTEwgKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBDRlN0cmluZ0dldENoYXJhY3RlcnMoX3NlbGYtPm9iX2l0c2VsZiwgcmFuZ2UsIGRhdGEpOworICAgIF9yZXMgPSAoUHlPYmplY3QgKilQeVVuaWNvZGVfRnJvbVVuaWNvZGUoZGF0YSwgc2l6ZS0xKTsKKyAgICBmcmVlKGRhdGEpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRlN0cmluZ1JlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhTdWJzdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVXaXRoU3Vic3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlQ29weSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldExlbmd0aCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRCeXRlcyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBVSW50OCBsb3NzQnl0ZSwgQm9vbGVhbiBpc0V4dGVybmFsUmVwcmVzZW50YXRpb24sIENGSW5kZXggbWF4QnVmTGVuKSAtPiAoQ0ZJbmRleCBfcnYsIFVJbnQ4IGJ1ZmZlciwgQ0ZJbmRleCB1c2VkQnVmTGVuKSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlRXh0ZXJuYWxSZXByZXNlbnRhdGlvbiIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUV4dGVybmFsUmVwcmVzZW50YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIFVJbnQ4IGxvc3NCeXRlKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldFNtYWxsZXN0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldEZhc3Rlc3RFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEZhc3Rlc3RFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlV2l0aE9wdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRoZVN0cmluZzIsIENGUmFuZ2UgcmFuZ2VUb0NvbXBhcmUsIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnMpIC0+IChDRkNvbXBhcmlzb25SZXN1bHQgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29tcGFyZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NvbXBhcmUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRoZVN0cmluZzIsIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnMpIC0+IChDRkNvbXBhcmlzb25SZXN1bHQgX3J2KSIpfSwKLQl7IkNGU3RyaW5nRmluZFdpdGhPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nRmluZFdpdGhPcHRpb25zLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQsIENGUmFuZ2UgcmFuZ2VUb1NlYXJjaCwgQ0ZPcHRpb25GbGFncyBzZWFyY2hPcHRpb25zKSAtPiAoQm9vbGVhbiBfcnYsIENGUmFuZ2UgcmVzdWx0KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlQXJyYXlXaXRoRmluZFJlc3VsdHMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVBcnJheVdpdGhGaW5kUmVzdWx0cywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRlJhbmdlIHJhbmdlVG9TZWFyY2gsIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnMpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0ZpbmQiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdGaW5kLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdHJpbmdUb0ZpbmQsIENGT3B0aW9uRmxhZ3MgY29tcGFyZU9wdGlvbnMpIC0+IChDRlJhbmdlIF9ydikiKX0sCi0JeyJDRlN0cmluZ0hhc1ByZWZpeCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0hhc1ByZWZpeCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcHJlZml4KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdIYXNTdWZmaXgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdIYXNTdWZmaXgsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN1ZmZpeCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0TGluZUJvdW5kcyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldExpbmVCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IChDRkluZGV4IGxpbmVCZWdpbkluZGV4LCBDRkluZGV4IGxpbmVFbmRJbmRleCwgQ0ZJbmRleCBjb250ZW50c0VuZEluZGV4KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlQXJyYXlCeVNlcGFyYXRpbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlCeVNlcGFyYXRpbmdTdHJpbmdzLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzZXBhcmF0b3JTdHJpbmcpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldEludFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0SW50VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldERvdWJsZVZhbHVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChkb3VibGUgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb252ZXJ0SUFOQUNoYXJTZXROYW1lVG9FbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAotCXsiQ0ZTaG93U3RyIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU2hvd1N0ciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0ZVUkxDcmVhdGVXaXRoU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aCIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlLCBCb29sZWFuIGlzRGlyZWN0b3J5KSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGhSZWxhdGl2ZVRvQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlLCBCb29sZWFuIGlzRGlyZWN0b3J5LCBDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlU3RyaW5nQnlSZXBsYWNpbmdQZXJjZW50RXNjYXBlcyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZVN0cmluZ0J5QWRkaW5nUGVyY2VudEVzY2FwZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZVVuZXNjYXBlZCwgQ0ZTdHJpbmdSZWYgbGVnYWxVUkxDaGFyYWN0ZXJzVG9CZUVzY2FwZWQsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHN0cmluZyBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRVbmljb2RlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0VW5pY29kZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5pY29kZSBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoU3Vic3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlV2l0aFN1YnN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgVUludDggbG9zc0J5dGUsIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uLCBDRkluZGV4IG1heEJ1ZkxlbikgLT4gKENGSW5kZXggX3J2LCBVSW50OCBidWZmZXIsIENGSW5kZXggdXNlZEJ1ZkxlbikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZUV4dGVybmFsUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDcmVhdGVFeHRlcm5hbFJlcHJlc2VudGF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBVSW50OCBsb3NzQnl0ZSkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRTbWFsbGVzdEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U21hbGxlc3RFbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRGYXN0ZXN0RW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29tcGFyZVdpdGhPcHRpb25zLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0aGVTdHJpbmcyLCBDRlJhbmdlIHJhbmdlVG9Db21wYXJlLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZDb21wYXJpc29uUmVzdWx0IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbXBhcmUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdDb21wYXJlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0aGVTdHJpbmcyLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZDb21wYXJpc29uUmVzdWx0IF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0ZpbmRXaXRoT3B0aW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRlJhbmdlIHJhbmdlVG9TZWFyY2gsIENGT3B0aW9uRmxhZ3Mgc2VhcmNoT3B0aW9ucykgLT4gKEJvb2xlYW4gX3J2LCBDRlJhbmdlIHJlc3VsdCkiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZUFycmF5V2l0aEZpbmRSZXN1bHRzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ3JlYXRlQXJyYXlXaXRoRmluZFJlc3VsdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHN0cmluZ1RvRmluZCwgQ0ZSYW5nZSByYW5nZVRvU2VhcmNoLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdGaW5kIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nRmluZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc3RyaW5nVG9GaW5kLCBDRk9wdGlvbkZsYWdzIGNvbXBhcmVPcHRpb25zKSAtPiAoQ0ZSYW5nZSBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdIYXNQcmVmaXgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdIYXNQcmVmaXgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHByZWZpeCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nSGFzU3VmZml4IiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nSGFzU3VmZml4LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBzdWZmaXgpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldExpbmVCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXRMaW5lQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlKSAtPiAoQ0ZJbmRleCBsaW5lQmVnaW5JbmRleCwgQ0ZJbmRleCBsaW5lRW5kSW5kZXgsIENGSW5kZXggY29udGVudHNFbmRJbmRleCkiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0NyZWF0ZUFycmF5QnlTZXBhcmF0aW5nU3RyaW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgc2VwYXJhdG9yU3RyaW5nKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRJbnRWYWx1ZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldEludFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0RG91YmxlVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdHZXREb3VibGVWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoZG91YmxlIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbnZlcnRJQU5BQ2hhclNldE5hbWVUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nQ29udmVydElBTkFDaGFyU2V0TmFtZVRvRW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKKyAgICB7IkNGU2hvd1N0ciIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlNob3dTdHIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlV2l0aFN0cmluZyIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlVSTENyZWF0ZVdpdGhTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVXaXRoRmlsZVN5c3RlbVBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZVdpdGhGaWxlU3lzdGVtUGF0aFJlbGF0aXZlVG9CYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlV2l0aEZpbGVTeXN0ZW1QYXRoUmVsYXRpdmVUb0Jhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSwgQm9vbGVhbiBpc0RpcmVjdG9yeSwgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZVN0cmluZ0J5UmVwbGFjaW5nUGVyY2VudEVzY2FwZXMiLCAoUHlDRnVuY3Rpb24pQ0ZTdHJpbmdSZWZPYmpfQ0ZVUkxDcmVhdGVTdHJpbmdCeVJlcGxhY2luZ1BlcmNlbnRFc2NhcGVzLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVTdHJpbmdCeUFkZGluZ1BlcmNlbnRFc2NhcGVzIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGVVJMQ3JlYXRlU3RyaW5nQnlBZGRpbmdQZXJjZW50RXNjYXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVVbmVzY2FwZWQsIENGU3RyaW5nUmVmIGxlZ2FsVVJMQ2hhcmFjdGVyc1RvQmVFc2NhcGVkLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGU3RyaW5nUmVmT2JqX0NGU3RyaW5nR2V0U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzdHJpbmcgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0VW5pY29kZSIsIChQeUNGdW5jdGlvbilDRlN0cmluZ1JlZk9ial9DRlN0cmluZ0dldFVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuaWNvZGUgX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgQ0ZTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yNDM1LDEwMCArMjQzNSwxMDAgQEAKIAogc3RhdGljIGludCBDRlN0cmluZ1JlZk9ial9jb21wYXJlKENGU3RyaW5nUmVmT2JqZWN0ICpzZWxmLCBDRlN0cmluZ1JlZk9iamVjdCAqb3RoZXIpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLwotCWlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOwotCWlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKLQlyZXR1cm4gMDsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7CisgICAgaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKiBDRlN0cmluZ1JlZk9ial9yZXByKENGU3RyaW5nUmVmT2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8Q0ZTdHJpbmdSZWYgb2JqZWN0IGF0IDB4JTguOHggZm9yIDB4JTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbMTAwXTsKKyAgICBzcHJpbnRmKGJ1ZiwgIjxDRlN0cmluZ1JlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRlN0cmluZ1JlZk9ial9oYXNoKENGU3RyaW5nUmVmT2JqZWN0ICpzZWxmKQogewotCS8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLwotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8KKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiBzdGF0aWMgaW50IENGU3RyaW5nUmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRlN0cmluZ1JlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgQ0ZTdHJpbmdSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZTdHJpbmdSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRlN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC0xOworICAgIC8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLworICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQorICAgIHsKKyAgICAgICAgKChDRlN0cmluZ1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIENGU3RyaW5nUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKLQlpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDRlN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOwotCSgoQ0ZTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChDRlN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgQ0ZTdHJpbmdSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZTdHJpbmdSZWZfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ0YuQ0ZTdHJpbmdSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihDRlN0cmluZ1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGU3RyaW5nUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIENGU3RyaW5nUmVmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDRlN0cmluZ1JlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZTdHJpbmdSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ0ZTdHJpbmdSZWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ0ZTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZTdHJpbmdSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUNGU3RyaW5nUmVmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNGU3RyaW5nUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZTdHJpbmdSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DRi5DRlN0cmluZ1JlZiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENGU3RyaW5nUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZTdHJpbmdSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ0ZTdHJpbmdSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIENGU3RyaW5nUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRlN0cmluZ1JlZk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDRlN0cmluZ1JlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBDRlN0cmluZ1JlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRlN0cmluZ1JlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ0ZTdHJpbmdSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQ0ZTdHJpbmdSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRlN0cmluZ1JlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENGU3RyaW5nUmVmIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTI1NDEsMjgxICsyNTQxLDI4MSBAQAogI2RlZmluZSBDRk11dGFibGVTdHJpbmdSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZNdXRhYmxlU3RyaW5nUmVmIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShDRlR5cGVSZWYgcHRyKTsKIH0gQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX05ldyhDRk11dGFibGVTdHJpbmdSZWYgaXRzZWxmKQogewotCUNGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCwgJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0LCAmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAvKiBYWFhYIFNob3VsZCB3ZSB0cF9pbml0IG9yIHRwX25ldyBvdXIgYmFzZXR5cGU/ICovCisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRk11dGFibGVTdHJpbmdSZWYgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCS8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRk11dGFibGVTdHJpbmdSZWZPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDRk11dGFibGVTdHJpbmdSZWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIENGTXV0YWJsZVN0cmluZ1JlZk9ial9kZWFsbG9jKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGU3RyaW5nUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKKyAgICB7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgfQorICAgIENGU3RyaW5nUmVmX1R5cGUudHBfZGVhbGxvYygoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmQoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBhcHBlbmRlZFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgYXBwZW5kZWRTdHJpbmc7CiAjaWZuZGVmIENGU3RyaW5nQXBwZW5kCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdBcHBlbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGVuZGVkU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdBcHBlbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBhcHBlbmRlZFN0cmluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGVuZGVkU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdBcHBlbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBhcHBlbmRlZFN0cmluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVbmlDaGFyICpjaGFyc19faW5fXzsKLQlVbmlDaGFyQ291bnQgY2hhcnNfX2xlbl9fOwotCWludCBjaGFyc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVuaUNoYXIgKmNoYXJzX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBjaGFyc19fbGVuX187CisgICAgaW50IGNoYXJzX19pbl9sZW5fXzsKICNpZm5kZWYgQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2hhcnNfX2luX18sICZjaGFyc19faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQljaGFyc19fbGVuX18gPSBjaGFyc19faW5fbGVuX187Ci0JQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzX19pbl9fLCBjaGFyc19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc19faW5fXywgJmNoYXJzX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNoYXJzX19sZW5fXyA9IGNoYXJzX19pbl9sZW5fXzsKKyAgICBDRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNfX2luX18sIGNoYXJzX19sZW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZyhDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBwU3RyOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBwU3RyOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDU3RyaW5nKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciogY1N0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyKiBjU3RyOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQXBwZW5kQ1N0cmluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQXBwZW5kQ1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdBcHBlbmRDU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nQXBwZW5kQ1N0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nQXBwZW5kQ1N0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0luc2VydChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggaWR4OwotCUNGU3RyaW5nUmVmIGluc2VydGVkU3RyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkluZGV4IGlkeDsKKyAgICBDRlN0cmluZ1JlZiBpbnNlcnRlZFN0cjsKICNpZm5kZWYgQ0ZTdHJpbmdJbnNlcnQKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0luc2VydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdJbnNlcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkeCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluc2VydGVkU3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0ZTdHJpbmdJbnNlcnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpZHgsCi0JICAgICAgICAgICAgICAgaW5zZXJ0ZWRTdHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5zZXJ0ZWRTdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ0luc2VydChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGlkeCwKKyAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFN0cik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0RlbGV0ZShDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGUmFuZ2UgcmFuZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGUmFuZ2UgcmFuZ2U7CiAjaWZuZGVmIENGU3RyaW5nRGVsZXRlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdEZWxldGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nRGVsZXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZSYW5nZV9Db252ZXJ0LCAmcmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ0RlbGV0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHJhbmdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlJhbmdlX0NvbnZlcnQsICZyYW5nZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgcmFuZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdSZXBsYWNlKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZSYW5nZSByYW5nZTsKLQlDRlN0cmluZ1JlZiByZXBsYWNlbWVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZSYW5nZSByYW5nZTsKKyAgICBDRlN0cmluZ1JlZiByZXBsYWNlbWVudDsKICNpZm5kZWYgQ0ZTdHJpbmdSZXBsYWNlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdSZXBsYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1JlcGxhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcmVwbGFjZW1lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1JlcGxhY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgcmFuZ2UsCi0JICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfQ29udmVydCwgJnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcmVwbGFjZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlN0cmluZ1JlcGxhY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZUFsbChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIHJlcGxhY2VtZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiByZXBsYWNlbWVudDsKICNpZm5kZWYgQ0ZTdHJpbmdSZXBsYWNlQWxsCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdSZXBsYWNlQWxsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1JlcGxhY2VBbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmcmVwbGFjZW1lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1JlcGxhY2VBbGwoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZyZXBsYWNlbWVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nUmVwbGFjZUFsbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1BhZChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIHBhZFN0cmluZzsKLQlDRkluZGV4IGxlbmd0aDsKLQlDRkluZGV4IGluZGV4SW50b1BhZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgcGFkU3RyaW5nOworICAgIENGSW5kZXggbGVuZ3RoOworICAgIENGSW5kZXggaW5kZXhJbnRvUGFkOwogI2lmbmRlZiBDRlN0cmluZ1BhZAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nUGFkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1BhZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnBhZFN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4SW50b1BhZCkpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nUGFkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgcGFkU3RyaW5nLAotCSAgICAgICAgICAgIGxlbmd0aCwKLQkgICAgICAgICAgICBpbmRleEludG9QYWQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnBhZFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4SW50b1BhZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nUGFkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgcGFkU3RyaW5nLAorICAgICAgICAgICAgICAgIGxlbmd0aCwKKyAgICAgICAgICAgICAgICBpbmRleEludG9QYWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdUcmltKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgdHJpbVN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgdHJpbVN0cmluZzsKICNpZm5kZWYgQ0ZTdHJpbmdUcmltCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdUcmltKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1RyaW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdHJpbVN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCUNGU3RyaW5nVHJpbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICB0cmltU3RyaW5nKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdHJpbVN0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENGU3RyaW5nVHJpbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICB0cmltU3RyaW5nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nVHJpbVdoaXRlc3BhY2UoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENGU3RyaW5nVHJpbVdoaXRlc3BhY2UKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZTdHJpbmdUcmltV2hpdGVzcGFjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDRk11dGFibGVTdHJpbmdSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ0ZTdHJpbmdBcHBlbmQiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBlbmRlZFN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDaGFyYWN0ZXJzLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgY2hhcnMpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ0FwcGVuZFBhc2NhbFN0cmluZyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBwU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiBOb25lIil9LAotCXsiQ0ZTdHJpbmdBcHBlbmRDU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZENTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKGNoYXIqIGNTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ0luc2VydCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdJbnNlcnQsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggaWR4LCBDRlN0cmluZ1JlZiBpbnNlcnRlZFN0cikgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nRGVsZXRlIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0RlbGV0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSkgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nUmVwbGFjZSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdSZXBsYWNlLCAxLAotCSBQeURvY19TVFIoIihDRlJhbmdlIHJhbmdlLCBDRlN0cmluZ1JlZiByZXBsYWNlbWVudCkgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nUmVwbGFjZUFsbCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdSZXBsYWNlQWxsLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiByZXBsYWNlbWVudCkgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nUGFkIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1BhZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcGFkU3RyaW5nLCBDRkluZGV4IGxlbmd0aCwgQ0ZJbmRleCBpbmRleEludG9QYWQpIC0+IE5vbmUiKX0sCi0JeyJDRlN0cmluZ1RyaW0iLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nVHJpbSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdHJpbVN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkNGU3RyaW5nVHJpbVdoaXRlc3BhY2UiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nVHJpbVdoaXRlc3BhY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkNGU3RyaW5nQXBwZW5kIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ0FwcGVuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwZW5kZWRTdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ0FwcGVuZENoYXJhY3RlcnMiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kQ2hhcmFjdGVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdBcHBlbmRQYXNjYWxTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nQXBwZW5kUGFzY2FsU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gTm9uZSIpfSwKKyAgICB7IkNGU3RyaW5nQXBwZW5kQ1N0cmluZyIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdBcHBlbmRDU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdJbnNlcnQiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nSW5zZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGlkeCwgQ0ZTdHJpbmdSZWYgaW5zZXJ0ZWRTdHIpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ0RlbGV0ZSIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdEZWxldGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGUmFuZ2UgcmFuZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ1JlcGxhY2UiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZSYW5nZSByYW5nZSwgQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ1JlcGxhY2VBbGwiLCAoUHlDRnVuY3Rpb24pQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NGU3RyaW5nUmVwbGFjZUFsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcmVwbGFjZW1lbnQpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ1BhZCIsIChQeUNGdW5jdGlvbilDRk11dGFibGVTdHJpbmdSZWZPYmpfQ0ZTdHJpbmdQYWQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHBhZFN0cmluZywgQ0ZJbmRleCBsZW5ndGgsIENGSW5kZXggaW5kZXhJbnRvUGFkKSAtPiBOb25lIil9LAorICAgIHsiQ0ZTdHJpbmdUcmltIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW0sIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIHRyaW1TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDRlN0cmluZ1RyaW1XaGl0ZXNwYWNlIiwgKFB5Q0Z1bmN0aW9uKUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DRlN0cmluZ1RyaW1XaGl0ZXNwYWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENGTXV0YWJsZVN0cmluZ1JlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI4MjMsMTAwICsyODIzLDEwMCBAQAogCiBzdGF0aWMgaW50IENGTXV0YWJsZVN0cmluZ1JlZk9ial9jb21wYXJlKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqc2VsZiwgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGTXV0YWJsZVN0cmluZ1JlZk9ial9yZXByKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqc2VsZikKIHsKLQljaGFyIGJ1ZlsxMDBdOwotCXNwcmludGYoYnVmLCAiPENGTXV0YWJsZVN0cmluZ1JlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGTXV0YWJsZVN0cmluZ1JlZiBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogc3RhdGljIGludCBDRk11dGFibGVTdHJpbmdSZWZPYmpfaGFzaChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCi0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KIHN0YXRpYyBpbnQgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlDRk11dGFibGVTdHJpbmdSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIENGTXV0YWJsZVN0cmluZ1JlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKLQl7Ci0JCSgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotCS8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLwotCWlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICAvKiBBbnkgQ0ZUeXBlUmVmIGRlc2NlbmRlbnQgaXMgYWxsb3dlZCBhcyBpbml0aWFsaXplciB0b28gKi8KKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnNlbGY7Ci0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRk11dGFibGVTdHJpbmdSZWZPYmplY3QgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICgoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NGLkNGTXV0YWJsZVN0cmluZ1JlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNGTXV0YWJsZVN0cmluZ1JlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRk11dGFibGVTdHJpbmdSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0YuQ0ZNdXRhYmxlU3RyaW5nUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENGTXV0YWJsZVN0cmluZ1JlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDRk11dGFibGVTdHJpbmdSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRk11dGFibGVTdHJpbmdSZWYgLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yOTI5LDU0NSArMjkyOSw1NDUgQEAKICNkZWZpbmUgQ0ZVUkxSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0ZVUkxSZWZfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ0ZVUkxSZWZfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENGVVJMUmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0ZVUkxSZWYgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDRlVSTFJlZiBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7CiB9IENGVVJMUmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfTmV3KENGVVJMUmVmIGl0c2VsZikKIHsKLQlDRlVSTFJlZk9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWl0ID0gUHlPYmplY3RfTkVXKENGVVJMUmVmT2JqZWN0LCAmQ0ZVUkxSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCS8qIFhYWFggU2hvdWxkIHdlIHRwX2luaXQgb3IgdHBfbmV3IG91ciBiYXNldHlwZT8gKi8KLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENGVVJMUmVmT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ0ZVUkxSZWZPYmplY3QsICZDRlVSTFJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgLyogWFhYWCBTaG91bGQgd2UgdHBfaW5pdCBvciB0cF9uZXcgb3VyIGJhc2V0eXBlPyAqLworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDRlVSTFJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlVSTFJlZiAqcF9pdHNlbGYpCiB7CiAKLQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCiAKLQlpZiAoIUNGVVJMUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGVVJMUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGVVJMUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNGVVJMUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNGVVJMUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKENGVVJMUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0ZVUkxSZWZPYmpfZGVhbGxvYyhDRlVSTFJlZk9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikKLQl7Ci0JCXNlbGYtPm9iX2ZyZWVpdCgoQ0ZUeXBlUmVmKXNlbGYtPm9iX2l0c2VsZik7Ci0JCXNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCUNGVHlwZVJlZl9UeXBlLnRwX2RlYWxsb2MoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIH0KKyAgICBDRlR5cGVSZWZfVHlwZS50cF9kZWFsbG9jKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlRGF0YShDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZEYXRhUmVmIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwotCUJvb2xlYW4gZXNjYXBlV2hpdGVzcGFjZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmVzY2FwZVdoaXRlc3BhY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZURhdGEoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVXaGl0ZXNwYWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGRGF0YVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBCb29sZWFuIGVzY2FwZVdoaXRlc3BhY2U7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlc2NhcGVXaGl0ZXNwYWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVEYXRhKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlV2hpdGVzcGFjZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlCb29sZWFuIHJlc29sdmVBZ2FpbnN0QmFzZTsKLQlVSW50OCBidWZmZXI7Ci0JQ0ZJbmRleCBtYXhCdWZMZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEJvb2xlYW4gcmVzb2x2ZUFnYWluc3RCYXNlOworICAgIFVJbnQ4IGJ1ZmZlcjsKKyAgICBDRkluZGV4IG1heEJ1ZkxlbjsKICNpZm5kZWYgQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24KLQlQeU1hY19QUkVDSEVDSyhDRlVSTEdldEZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFnYWluc3RCYXNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4QnVmTGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWdhaW5zdEJhc2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZMZW4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFnYWluc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4QnVmTGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWdhaW5zdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZMZW4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5QWJzb2x1dGVVUkwoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlBYnNvbHV0ZVVSTAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUFic29sdXRlVVJMKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlBYnNvbHV0ZVVSTCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5QWJzb2x1dGVVUkwoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weUFic29sdXRlVVJMKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMR2V0U3RyaW5nKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxHZXRTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlVSTEdldFN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0U3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEdldFN0cmluZyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEdldEJhc2VVUkwoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OwogI2lmbmRlZiBDRlVSTEdldEJhc2VVUkwKLQlQeU1hY19QUkVDSEVDSyhDRlVSTEdldEJhc2VVUkwpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMR2V0QmFzZVVSTCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxHZXRCYXNlVVJMKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEdldEJhc2VVUkwoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDYW5CZURlY29tcG9zZWQoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQ0ZVUkxDYW5CZURlY29tcG9zZWQKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENhbkJlRGVjb21wb3NlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDYW5CZURlY29tcG9zZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ2FuQmVEZWNvbXBvc2VkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENhbkJlRGVjb21wb3NlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlTY2hlbWUoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlTY2hlbWUKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlTY2hlbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVNjaGVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5U2NoZW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlTY2hlbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5TmV0TG9jYXRpb24oQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlOZXRMb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weU5ldExvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlOZXRMb2NhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5TmV0TG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weU5ldExvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVBhdGgoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlQYXRoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGF0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGF0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5UGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5UGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlTdHJpY3RQYXRoKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JQm9vbGVhbiBpc0Fic29sdXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQm9vbGVhbiBpc0Fic29sdXRlOwogI2lmbmRlZiBDRlVSTENvcHlTdHJpY3RQYXRoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5U3RyaWN0UGF0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5U3RyaWN0UGF0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5U3RyaWN0UGF0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzQWJzb2x1dGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlTdHJpY3RQYXRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNBYnNvbHV0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNBYnNvbHV0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlVSTFBhdGhTdHlsZSBwYXRoU3R5bGU7CiAjaWZuZGVmIENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUZpbGVTeXN0ZW1QYXRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3R5bGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aFN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3R5bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMSGFzRGlyZWN0b3J5UGF0aChDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBDRlVSTEhhc0RpcmVjdG9yeVBhdGgKLQlQeU1hY19QUkVDSEVDSyhDRlVSTEhhc0RpcmVjdG9yeVBhdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMSGFzRGlyZWN0b3J5UGF0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTEhhc0RpcmVjdG9yeVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllcgotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5UmVzb3VyY2VTcGVjaWZpZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weUhvc3ROYW1lKENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKICNpZm5kZWYgQ0ZVUkxDb3B5SG9zdE5hbWUKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlIb3N0TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5SG9zdE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUhvc3ROYW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlIb3N0TmFtZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTEdldFBvcnROdW1iZXIoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIENGVVJMR2V0UG9ydE51bWJlcgotCVB5TWFjX1BSRUNIRUNLKENGVVJMR2V0UG9ydE51bWJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRQb3J0TnVtYmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTEdldFBvcnROdW1iZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMR2V0UG9ydE51bWJlcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENvcHlVc2VyTmFtZShDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CiAjaWZuZGVmIENGVVJMQ29weVVzZXJOYW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5VXNlck5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVVzZXJOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENvcHlVc2VyTmFtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5VXNlck5hbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGFzc3dvcmQoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlQYXNzd29yZAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVBhc3N3b3JkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlQYXNzd29yZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5UGFzc3dvcmQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weVBhc3N3b3JkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVBhcmFtZXRlclN0cmluZyhDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUNGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZDsKICNpZm5kZWYgQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlQYXJhbWV0ZXJTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UXVlcnlTdHJpbmcoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CiAjaWZuZGVmIENGVVJMQ29weVF1ZXJ5U3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UXVlcnlTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weVF1ZXJ5U3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weVF1ZXJ5U3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlRdWVyeVN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RnJhZ21lbnQoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQ7CiAjaWZuZGVmIENGVVJMQ29weUZyYWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5RnJhZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUZyYWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ29weUZyYWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENvcHlGcmFnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQoQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5TGFzdFBhdGhDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ29weVBhdGhFeHRlbnNpb24oQ0ZVUkxSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OwogI2lmbmRlZiBDRlVSTENvcHlQYXRoRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50KENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgcGF0aENvbXBvbmVudDsKLQlCb29sZWFuIGlzRGlyZWN0b3J5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZwYXRoQ29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhDb21wb25lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBwYXRoQ29tcG9uZW50OworICAgIEJvb2xlYW4gaXNEaXJlY3Rvcnk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnBhdGhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KENGVVJMUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnQoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbihDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCUNGU3RyaW5nUmVmIGV4dGVuc2lvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZleHRlbnNpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoRXh0ZW5zaW9uKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBleHRlbnNpb247CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmZXh0ZW5zaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nUGF0aEV4dGVuc2lvbihDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24oKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlVSTFJlZiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMQ3JlYXRlQ29weURlbGV0aW5nUGF0aEV4dGVuc2lvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRGU1JlZihDRlVSTFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRlNSZWYgZnNSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEZTUmVmIGZzUmVmOwogI2lmbmRlZiBDRlVSTEdldEZTUmVmCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRGU1JlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRGU1JlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxHZXRGU1JlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmZzUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJmZzUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZVUkxHZXRGU1JlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZzUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJmZzUmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGVVJMUmVmT2JqX21ldGhvZHNbXSA9IHsKLQl7IkNGVVJMQ3JlYXRlRGF0YSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIEJvb2xlYW4gZXNjYXBlV2hpdGVzcGFjZSkgLT4gKENGRGF0YVJlZiBfcnYpIil9LAotCXsiQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRGaWxlU3lzdGVtUmVwcmVzZW50YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gcmVzb2x2ZUFnYWluc3RCYXNlLCBDRkluZGV4IG1heEJ1ZkxlbikgLT4gKEJvb2xlYW4gX3J2LCBVSW50OCBidWZmZXIpIil9LAotCXsiQ0ZVUkxDb3B5QWJzb2x1dGVVUkwiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5QWJzb2x1dGVVUkwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldFN0cmluZyIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldFN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMR2V0QmFzZVVSTCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldEJhc2VVUkwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENhbkJlRGVjb21wb3NlZCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENhbkJlRGVjb21wb3NlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5U2NoZW1lIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVNjaGVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weU5ldExvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weU5ldExvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5UGF0aCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5U3RyaWN0UGF0aCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlTdHJpY3RQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYsIEJvb2xlYW4gaXNBYnNvbHV0ZSkiKX0sCi0JeyJDRlVSTENvcHlGaWxlU3lzdGVtUGF0aCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlGaWxlU3lzdGVtUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZVUkxQYXRoU3R5bGUgcGF0aFN0eWxlKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMSGFzRGlyZWN0b3J5UGF0aCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEhhc0RpcmVjdG9yeVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVJlc291cmNlU3BlY2lmaWVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5SG9zdE5hbWUiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5SG9zdE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldFBvcnROdW1iZXIiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRQb3J0TnVtYmVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkNGVVJMQ29weVVzZXJOYW1lIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVVzZXJOYW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5UGFzc3dvcmQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGFzc3dvcmQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENvcHlQYXJhbWV0ZXJTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5UXVlcnlTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UXVlcnlTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlVSTENvcHlGcmFnbWVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlGcmFnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUxhc3RQYXRoQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlQYXRoRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBwYXRoQ29tcG9uZW50LCBCb29sZWFuIGlzRGlyZWN0b3J5KSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdMYXN0UGF0aENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aEV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgZXh0ZW5zaW9uKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlQ29weURlbGV0aW5nUGF0aEV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTEdldEZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0RlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBGU1JlZiBmc1JlZikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDRlVSTENyZWF0ZURhdGEiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBCb29sZWFuIGVzY2FwZVdoaXRlc3BhY2UpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0RmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHJlc29sdmVBZ2FpbnN0QmFzZSwgQ0ZJbmRleCBtYXhCdWZMZW4pIC0+IChCb29sZWFuIF9ydiwgVUludDggYnVmZmVyKSIpfSwKKyAgICB7IkNGVVJMQ29weUFic29sdXRlVVJMIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUFic29sdXRlVVJMLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxHZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTEdldEJhc2VVUkwiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxHZXRCYXNlVVJMLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDYW5CZURlY29tcG9zZWQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDYW5CZURlY29tcG9zZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVNjaGVtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlTY2hlbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlOZXRMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlOZXRMb2NhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVN0cmljdFBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5U3RyaWN0UGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2LCBCb29sZWFuIGlzQWJzb2x1dGUpIil9LAorICAgIHsiQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RmlsZVN5c3RlbVBhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUGF0aFN0eWxlIHBhdGhTdHlsZSkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTEhhc0RpcmVjdG9yeVBhdGgiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxIYXNEaXJlY3RvcnlQYXRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllciIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlSZXNvdXJjZVNwZWNpZmllciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weUhvc3ROYW1lIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weUhvc3ROYW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxHZXRQb3J0TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMR2V0UG9ydE51bWJlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlVc2VyTmFtZSIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlVc2VyTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVBhc3N3b3JkIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhc3N3b3JkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5UGFyYW1ldGVyU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVBhcmFtZXRlclN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgY2hhcmFjdGVyc1RvTGVhdmVFc2NhcGVkKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVF1ZXJ5U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ29weVF1ZXJ5U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBjaGFyYWN0ZXJzVG9MZWF2ZUVzY2FwZWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDb3B5RnJhZ21lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5RnJhZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGNoYXJhY3RlcnNUb0xlYXZlRXNjYXBlZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTENvcHlMYXN0UGF0aENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ29weVBhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDb3B5UGF0aEV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5QXBwZW5kaW5nUGF0aENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgcGF0aENvbXBvbmVudCwgQm9vbGVhbiBpc0RpcmVjdG9yeSkgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUNvcHlEZWxldGluZ0xhc3RQYXRoQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weURlbGV0aW5nTGFzdFBhdGhDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUNvcHlBcHBlbmRpbmdQYXRoRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUNGVVJMUmVmT2JqX0NGVVJMQ3JlYXRlQ29weUFwcGVuZGluZ1BhdGhFeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGV4dGVuc2lvbikgLT4gKENGVVJMUmVmIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZUNvcHlEZWxldGluZ1BhdGhFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ0ZVUkxSZWZPYmpfQ0ZVUkxDcmVhdGVDb3B5RGVsZXRpbmdQYXRoRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxHZXRGU1JlZiIsIChQeUNGdW5jdGlvbilDRlVSTFJlZk9ial9DRlVSTEdldEZTUmVmLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgRlNSZWYgZnNSZWYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDRlVSTFJlZk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTM0NzUsMTAwICszNDc1LDEwMCBAQAogCiBzdGF0aWMgaW50IENGVVJMUmVmT2JqX2NvbXBhcmUoQ0ZVUkxSZWZPYmplY3QgKnNlbGYsIENGVVJMUmVmT2JqZWN0ICpvdGhlcikKIHsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovCi0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkVxdWFsPz8gKi8KKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsKKyAgICBpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqIENGVVJMUmVmT2JqX3JlcHIoQ0ZVUkxSZWZPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbMTAwXTsKLQlzcHJpbnRmKGJ1ZiwgIjxDRlVSTCBvYmplY3QgYXQgMHglOC44eCBmb3IgMHglOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKKyAgICBjaGFyIGJ1ZlsxMDBdOworICAgIHNwcmludGYoYnVmLCAiPENGVVJMIG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IENGVVJMUmVmT2JqX2hhc2goQ0ZVUkxSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGSGFzaD8/ICovCi0JcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOworICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBDRkhhc2g/PyAqLworICAgIHJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKIH0KIHN0YXRpYyBpbnQgQ0ZVUkxSZWZPYmpfdHBfaW5pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCUNGVVJMUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBDRlVSTFJlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKQotCXsKLQkJKChDRlVSTFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCQlyZXR1cm4gMDsKLQl9CisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoQ0ZVUkxSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0JLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKENGVVJMUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLTE7CisgICAgLyogQW55IENGVHlwZVJlZiBkZXNjZW5kZW50IGlzIGFsbG93ZWQgYXMgaW5pdGlhbGl6ZXIgdG9vICovCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDRlR5cGVSZWZPYmpfQ29udmVydCwgJml0c2VsZikpCisgICAgeworICAgICAgICAoKENGVVJMUmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7CiB9CiAKICNkZWZpbmUgQ0ZVUkxSZWZPYmpfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkNGVVJMUmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKENGVVJMUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChDRlVSTFJlZk9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7Ci0JcmV0dXJuIHNlbGY7CisgICAgUHlPYmplY3QgKnNlbGY7CisgICAgaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ0ZVUkxSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAoKENGVVJMUmVmT2JqZWN0ICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsKKyAgICByZXR1cm4gc2VsZjsKIH0KIAogI2RlZmluZSBDRlVSTFJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDRlVSTFJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DRi5DRlVSTFJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENGVVJMUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ0ZVUkxSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQ0ZVUkxSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENGVVJMUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDRlVSTFJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlDRlVSTFJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDRlVSTFJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDRlVSTFJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQ0ZVUkxSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0ZVUkxSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDRlVSTFJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0NGLkNGVVJMUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0ZVUkxSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDRlVSTFJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBDRlVSTFJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0ZVUkxSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIENGVVJMUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIENGVVJMUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENGVVJMUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIENGVVJMUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBDRlVSTFJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDRlVSTFJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIENGVVJMUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDRlVSTFJlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzU3NiwxMjUwICszNTc2LDEyNTAgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpDRl9fX0NGUmFuZ2VNYWtlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlJhbmdlIF9ydjsKLQlDRkluZGV4IGxvYzsKLQlDRkluZGV4IGxlbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZSYW5nZSBfcnY7CisgICAgQ0ZJbmRleCBsb2M7CisgICAgQ0ZJbmRleCBsZW47CiAjaWZuZGVmIF9fQ0ZSYW5nZU1ha2UKLQlQeU1hY19QUkVDSEVDSyhfX0NGUmFuZ2VNYWtlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhfX0NGUmFuZ2VNYWtlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxvYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IF9fQ0ZSYW5nZU1ha2UobG9jLAotCSAgICAgICAgICAgICAgICAgICAgbGVuKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IF9fQ0ZSYW5nZU1ha2UobG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGUmFuZ2VfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGQWxsb2NhdG9yR2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZBbGxvY2F0b3JHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRkFsbG9jYXRvckdldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZBbGxvY2F0b3JHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQWxsb2NhdG9yR2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGQWxsb2NhdG9yR2V0VHlwZUlEKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBfcnY7Ci0JQ0ZJbmRleCBzaXplOwotCUNGT3B0aW9uRmxhZ3MgaGludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CisgICAgQ0ZJbmRleCBzaXplOworICAgIENGT3B0aW9uRmxhZ3MgaGludDsKICNpZm5kZWYgQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZQotCVB5TWFjX1BSRUNIRUNLKENGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkNvcHlUeXBlSUREZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUNGVHlwZUlEIHR5cGVfaWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlR5cGVJRCB0eXBlX2lkOwogI2lmbmRlZiBDRkNvcHlUeXBlSUREZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKENGQ29weVR5cGVJRERlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkNvcHlUeXBlSUREZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkNvcHlUeXBlSUREZXNjcmlwdGlvbih0eXBlX2lkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfaWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkNvcHlUeXBlSUREZXNjcmlwdGlvbih0eXBlX2lkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkFycmF5R2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZBcnJheUdldFR5cGVJRAotCVB5TWFjX1BSRUNIRUNLKENGQXJyYXlHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGQXJyYXlHZXRUeXBlSUQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBcnJheUdldFR5cGVJRCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVBcnJheVJlZiBfcnY7Ci0JQ0ZJbmRleCBjYXBhY2l0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CiAjaWZuZGVmIENGQXJyYXlDcmVhdGVNdXRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZBcnJheUNyZWF0ZU11dGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlDcmVhdGVNdXRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZUFycmF5Q2FsbEJhY2tzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZUFycmF5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVBcnJheVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRk11dGFibGVBcnJheVJlZiBfcnY7Ci0JQ0ZJbmRleCBjYXBhY2l0eTsKLQlDRkFycmF5UmVmIHRoZUFycmF5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRk11dGFibGVBcnJheVJlZiBfcnY7CisgICAgQ0ZJbmRleCBjYXBhY2l0eTsKKyAgICBDRkFycmF5UmVmIHRoZUFycmF5OwogI2lmbmRlZiBDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkKLQlQeU1hY19QUkVDSEVDSyhDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfQ29udmVydCwgJnRoZUFycmF5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQXJyYXkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAmdGhlQXJyYXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVBcnJheSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVBcnJheVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEYXRhR2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZEYXRhR2V0VHlwZUlECi0JUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhR2V0VHlwZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGRGF0YUdldFR5cGVJRCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRkRhdGFHZXRUeXBlSUQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRhdGFDcmVhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGF0YVJlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187Ci0JbG9uZyBieXRlc19fbGVuX187Ci0JaW50IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEYXRhUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKKyAgICBsb25nIGJ5dGVzX19sZW5fXzsKKyAgICBpbnQgYnl0ZXNfX2luX2xlbl9fOwogI2lmbmRlZiBDRkRhdGFDcmVhdGUKLQlQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YUNyZWF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKLQlfcnYgPSBDRkRhdGFDcmVhdGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRkRhdGFDcmVhdGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGF0YVJlZiBfcnY7Ci0JdW5zaWduZWQgY2hhciAqYnl0ZXNfX2luX187Ci0JbG9uZyBieXRlc19fbGVuX187Ci0JaW50IGJ5dGVzX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZEYXRhUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKKyAgICBsb25nIGJ5dGVzX19sZW5fXzsKKyAgICBpbnQgYnl0ZXNfX2luX2xlbl9fOwogI2lmbmRlZiBDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkKLQlQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKLQlfcnYgPSBDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBieXRlc19fbGVuX18gPSBieXRlc19faW5fbGVuX187CisgICAgX3J2ID0gQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGRGF0YUNyZWF0ZU11dGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZURhdGFSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZURhdGFSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CiAjaWZuZGVmIENGRGF0YUNyZWF0ZU11dGFibGUKLQlQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGVNdXRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGVNdXRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGF0YVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGF0YUNyZWF0ZU11dGFibGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRhdGFDcmVhdGVNdXRhYmxlQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZNdXRhYmxlRGF0YVJlZiBfcnY7Ci0JQ0ZJbmRleCBjYXBhY2l0eTsKLQlDRkRhdGFSZWYgdGhlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZNdXRhYmxlRGF0YVJlZiBfcnY7CisgICAgQ0ZJbmRleCBjYXBhY2l0eTsKKyAgICBDRkRhdGFSZWYgdGhlRGF0YTsKICNpZm5kZWYgQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkKLQlQeU1hY19QUkVDSEVDSyhDRkRhdGFDcmVhdGVNdXRhYmxlQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBDRkRhdGFSZWZPYmpfQ29udmVydCwgJnRoZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRhdGFDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZURhdGFSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEYXRhUmVmT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVEYXRhUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRkRpY3Rpb25hcnlHZXRUeXBlSUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVHlwZUlEIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZUeXBlSUQgX3J2OwogI2lmbmRlZiBDRkRpY3Rpb25hcnlHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlHZXRUeXBlSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeUdldFR5cGVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGljdGlvbmFyeUdldFR5cGVJRCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CiAjaWZuZGVmIENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUKLQlQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhcGFjaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWYgX3J2OwotCUNGSW5kZXggY2FwYWNpdHk7Ci0JQ0ZEaWN0aW9uYXJ5UmVmIHRoZURpY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgX3J2OworICAgIENGSW5kZXggY2FwYWNpdHk7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIHRoZURpY3Q7CiAjaWZuZGVmIENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYXBhY2l0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQsICZ0aGVEaWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZUNvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGljdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0LCAmdGhlRGljdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURpY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZUeXBlUmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBrZXk7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZUeXBlUmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBrZXk7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZShrZXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYga2V5OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdDsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZShrZXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc0dldEFwcEludGVnZXJWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZJbmRleCBfcnY7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZJbmRleCBfcnY7CisgICAgQ0ZTdHJpbmdSZWYga2V5OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdDsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0dldEFwcEludGVnZXJWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0dldEFwcEludGVnZXJWYWx1ZShrZXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcmVmZXJlbmNlc0dldEFwcEludGVnZXJWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBrZXk7Ci0JQ0ZUeXBlUmVmIHZhbHVlOwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlR5cGVSZWYgdmFsdWU7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZ2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUoa2V5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlKGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHN1aXRlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgc3VpdGVJRDsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcAotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHApOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmc3VpdGVJRCkpCi0JCXJldHVybiBOVUxMOwotCUNGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAoYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZzdWl0ZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcChhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiBzdWl0ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHN1aXRlSUQ7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcAotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1aXRlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAoYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGVJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnN1aXRlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAoYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZShhcHBsaWNhdGlvbklEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplKGFwcGxpY2F0aW9uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5VmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVHlwZVJlZiBfcnY7Ci0JQ0ZTdHJpbmdSZWYga2V5OwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQ0ZTdHJpbmdSZWYgdXNlck5hbWU7Ci0JQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZVJlZiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYga2V5OworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNDb3B5VmFsdWUKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZShrZXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZShrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGRGljdGlvbmFyeVJlZiBfcnY7Ci0JQ0ZBcnJheVJlZiBrZXlzVG9GZXRjaDsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRpY3Rpb25hcnlSZWYgX3J2OworICAgIENGQXJyYXlSZWYga2V5c1RvRmV0Y2g7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiB1c2VyTmFtZTsKKyAgICBDRlN0cmluZ1JlZiBob3N0TmFtZTsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0NvcHlNdWx0aXBsZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZrZXlzVG9GZXRjaCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlNdWx0aXBsZShrZXlzVG9GZXRjaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRkFycmF5UmVmT2JqX0NvbnZlcnQsICZrZXlzVG9GZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlNdWx0aXBsZShrZXlzVG9GZXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc1NldFZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBrZXk7Ci0JQ0ZUeXBlUmVmIHZhbHVlOwotCUNGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7Ci0JQ0ZTdHJpbmdSZWYgdXNlck5hbWU7Ci0JQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIGtleTsKKyAgICBDRlR5cGVSZWYgdmFsdWU7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiB1c2VyTmFtZTsKKyAgICBDRlN0cmluZ1JlZiBob3N0TmFtZTsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc1NldFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzU2V0VmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIENGVHlwZVJlZk9ial9Db252ZXJ0LCAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUNGUHJlZmVyZW5jZXNTZXRWYWx1ZShrZXksCi0JICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklELAotCSAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0ZQcmVmZXJlbmNlc1NldFZhbHVlKGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZEaWN0aW9uYXJ5UmVmIGtleXNUb1NldDsKLQlDRkFycmF5UmVmIGtleXNUb1JlbW92ZTsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkRpY3Rpb25hcnlSZWYga2V5c1RvU2V0OworICAgIENGQXJyYXlSZWYga2V5c1RvUmVtb3ZlOworICAgIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQ7CisgICAgQ0ZTdHJpbmdSZWYgdXNlck5hbWU7CisgICAgQ0ZTdHJpbmdSZWYgaG9zdE5hbWU7CiAjaWZuZGVmIENGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZQotCVB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJmtleXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAma2V5c1RvUmVtb3ZlLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUoa2V5c1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzVG9SZW1vdmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWZPYmpfQ29udmVydCwgJmtleXNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9Db252ZXJ0LCAma2V5c1RvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUoa2V5c1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzVG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKLQlDRlN0cmluZ1JlZiB1c2VyTmFtZTsKLQlDRlN0cmluZ1JlZiBob3N0TmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRDsKKyAgICBDRlN0cmluZ1JlZiB1c2VyTmFtZTsKKyAgICBDRlN0cmluZ1JlZiBob3N0TmFtZTsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzU3luY2hyb25pemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplKGFwcGxpY2F0aW9uSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplKGFwcGxpY2F0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0TmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGQXJyYXlSZWYgX3J2OwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkFycmF5UmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiB1c2VyTmFtZTsKKyAgICBDRlN0cmluZ1JlZiBob3N0TmFtZTsKICNpZm5kZWYgQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QodXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmhvc3ROYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZQcmVmZXJlbmNlc0NvcHlBcHBsaWNhdGlvbkxpc3QodXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRkFycmF5UmVmIF9ydjsKLQlDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOwotCUNGU3RyaW5nUmVmIHVzZXJOYW1lOwotCUNGU3RyaW5nUmVmIGhvc3ROYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRkFycmF5UmVmIF9ydjsKKyAgICBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEOworICAgIENGU3RyaW5nUmVmIHVzZXJOYW1lOworICAgIENGU3RyaW5nUmVmIGhvc3ROYW1lOwogI2lmbmRlZiBDRlByZWZlcmVuY2VzQ29weUtleUxpc3QKLQlQeU1hY19QUkVDSEVDSyhDRlByZWZlcmVuY2VzQ29weUtleUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKENGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnVzZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaG9zdE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlByZWZlcmVuY2VzQ29weUtleUxpc3QoYXBwbGljYXRpb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3ROYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGQXJyYXlSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdXNlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZob3N0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdChhcHBsaWNhdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZBcnJheVJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXRUeXBlSUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVHlwZUlEIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZUeXBlSUQgX3J2OwogI2lmbmRlZiBDRlN0cmluZ0dldFR5cGVJRAotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0VHlwZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFR5cGVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRUeXBlSUQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRUeXBlSUQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlTdHIyNTUgcFN0cjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgU3RyMjU1IHBTdHI7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQljaGFyKiBjU3RyOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBjaGFyKiBjU3RyOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlVbmlDaGFyICpjaGFyc19faW5fXzsKLQlVbmlDaGFyQ291bnQgY2hhcnNfX2xlbl9fOwotCWludCBjaGFyc19faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBVbmlDaGFyICpjaGFyc19faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgY2hhcnNfX2xlbl9fOworICAgIGludCBjaGFyc19faW5fbGVuX187CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzX19pbl9fLCAmY2hhcnNfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY2hhcnNfX2xlbl9fID0gY2hhcnNfX2luX2xlbl9fOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc19faW5fXywgY2hhcnNfX2xlbl9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc19faW5fXywgJmNoYXJzX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNoYXJzX19sZW5fXyA9IGNoYXJzX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNfX2luX18sIGNoYXJzX19sZW5fXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JU3RyMjU1IHBTdHI7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdSZWYgX3J2OworICAgIFN0cjI1NSBwU3RyOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGQWxsb2NhdG9yUmVmKU5VTEwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGQWxsb2NhdG9yUmVmKU5VTEwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQljaGFyKiBjU3RyOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBjaGFyKiBjU3RyOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNTdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHkoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjU3RyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0ZBbGxvY2F0b3JSZWYpTlVMTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzTm9Db3B5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ1JlZiBfcnY7Ci0JVW5pQ2hhciAqY2hhcnNfX2luX187Ci0JVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKLQlpbnQgY2hhcnNfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgVW5pQ2hhciAqY2hhcnNfX2luX187CisgICAgVW5pQ2hhckNvdW50IGNoYXJzX19sZW5fXzsKKyAgICBpbnQgY2hhcnNfX2luX2xlbl9fOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzTm9Db3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaGFyc19faW5fXywgJmNoYXJzX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWNoYXJzX19sZW5fXyA9IGNoYXJzX19pbl9sZW5fXzsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNfX2luX18sIGNoYXJzX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc19faW5fXywgJmNoYXJzX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNoYXJzX19sZW5fXyA9IGNoYXJzX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzTm9Db3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNfX2luX18sIGNoYXJzX19sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDRkFsbG9jYXRvclJlZilOVUxMKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0NyZWF0ZU11dGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGTXV0YWJsZVN0cmluZ1JlZiBfcnY7Ci0JQ0ZJbmRleCBtYXhMZW5ndGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZVN0cmluZ1JlZiBfcnY7CisgICAgQ0ZJbmRleCBtYXhMZW5ndGg7CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlTXV0YWJsZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlTXV0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heExlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlTXV0YWJsZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZNdXRhYmxlU3RyaW5nUmVmIF9ydjsKLQlDRkluZGV4IG1heExlbmd0aDsKLQlDRlN0cmluZ1JlZiB0aGVTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGTXV0YWJsZVN0cmluZ1JlZiBfcnY7CisgICAgQ0ZJbmRleCBtYXhMZW5ndGg7CisgICAgQ0ZTdHJpbmdSZWYgdGhlU3RyaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TGVuZ3RoLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGhlU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aGVTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5KChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQl1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKLQlsb25nIGJ5dGVzX19sZW5fXzsKLQlpbnQgYnl0ZXNfX2luX2xlbl9fOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JQm9vbGVhbiBpc0V4dGVybmFsUmVwcmVzZW50YXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICB1bnNpZ25lZCBjaGFyICpieXRlc19faW5fXzsKKyAgICBsb25nIGJ5dGVzX19sZW5fXzsKKyAgICBpbnQgYnl0ZXNfX2luX2xlbl9fOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgQm9vbGVhbiBpc0V4dGVybmFsUmVwcmVzZW50YXRpb247CiAjaWZuZGVmIENGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNfX2luX18sICZieXRlc19faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCWJ5dGVzX19sZW5fXyA9IGJ5dGVzX19pbl9sZW5fXzsKLQlfcnYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19faW5fXywgYnl0ZXNfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRXh0ZXJuYWxSZXByZXNlbnRhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc19faW5fXywgJmJ5dGVzX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnl0ZXNfX2xlbl9fID0gYnl0ZXNfX2luX2xlbl9fOworICAgIF9ydiA9IENGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzKChDRkFsbG9jYXRvclJlZilOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX19pbl9fLCBieXRlc19fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CiAjaWZuZGVmIENGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmcoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGSW5kZXggX3J2OwotCUNGSW5kZXggbGVuZ3RoOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGSW5kZXggX3J2OworICAgIENGSW5kZXggbGVuZ3RoOworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nKGxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nKGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZShlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZShlbmNvZGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZTdHJpbmdSZWYgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nUmVmIF9ydjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZyhlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcoZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb05TU3RyaW5nRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvTlNTdHJpbmdFbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb05TU3RyaW5nRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nKGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb05TU3RyaW5nRW5jb2RpbmcoZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlN0cmluZ0VuY29kaW5nIF9ydjsKLQlVSW50MzIgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIFVJbnQzMiBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhDRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nKGVuY29kaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0ZTdHJpbmdDb252ZXJ0TlNTdHJpbmdFbmNvZGluZ1RvRW5jb2RpbmcoZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7Ci0JQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKKyAgICBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOwogI2lmbmRlZiBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZShlbmNvZGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UoZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nRW5jb2RpbmcgX3J2OwotCVVJbnQzMiBjb2RlcGFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBfcnY7CisgICAgVUludDMyIGNvZGVwYWdlOwogI2lmbmRlZiBDRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvZGVwYWdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZyhjb2RlcGFnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlcGFnZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcoY29kZXBhZ2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQlDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKICNpZm5kZWYgQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZQotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lKGVuY29kaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDRl9DRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nRW5jb2RpbmcgX3J2OwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGU3RyaW5nRW5jb2RpbmcgX3J2OworICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7CiAjaWZuZGVmIENGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZwotCVB5TWFjX1BSRUNIRUNLKENGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcoZW5jb2RpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcoZW5jb2RpbmcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX19fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGU3RyaW5nUmVmIF9ydjsKLQljaGFyKiBjU3RyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDRlN0cmluZ1JlZiBfcnY7CisgICAgY2hhciogY1N0cjsKICNpZm5kZWYgX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZwotCVB5TWFjX1BSRUNIRUNLKF9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKF9fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjU3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyhjU3RyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNTdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBfX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nKGNTdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMR2V0VHlwZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlR5cGVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVHlwZUlEIF9ydjsKICNpZm5kZWYgQ0ZVUkxHZXRUeXBlSUQKLQlQeU1hY19QUkVDSEVDSyhDRlVSTEdldFR5cGVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxHZXRUeXBlSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENGVVJMR2V0VHlwZUlEKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENGVVJMR2V0VHlwZUlEKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQl1bnNpZ25lZCBjaGFyICpVUkxCeXRlc19faW5fXzsKLQlsb25nIFVSTEJ5dGVzX19sZW5fXzsKLQlpbnQgVVJMQnl0ZXNfX2luX2xlbl9fOwotCUNGU3RyaW5nRW5jb2RpbmcgZW5jb2Rpbmc7Ci0JQ0ZVUkxSZWYgYmFzZVVSTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIHVuc2lnbmVkIGNoYXIgKlVSTEJ5dGVzX19pbl9fOworICAgIGxvbmcgVVJMQnl0ZXNfX2xlbl9fOworICAgIGludCBVUkxCeXRlc19faW5fbGVuX187CisgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZzsKKyAgICBDRlVSTFJlZiBiYXNlVVJMOwogI2lmbmRlZiBDRlVSTENyZWF0ZVdpdGhCeXRlcwotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ3JlYXRlV2l0aEJ5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZVdpdGhCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2xPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZVUkxCeXRlc19faW5fXywgJlVSTEJ5dGVzX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQsICZiYXNlVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVVJMQnl0ZXNfX2xlbl9fID0gVVJMQnl0ZXNfX2luX2xlbl9fOwotCV9ydiA9IENGVVJMQ3JlYXRlV2l0aEJ5dGVzKChDRkFsbG9jYXRvclJlZilOVUxMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTEJ5dGVzX19pbl9fLCBVUkxCeXRlc19fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmVVJMQnl0ZXNfX2luX18sICZVUkxCeXRlc19faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxDRlVSTFJlZk9ial9Db252ZXJ0LCAmYmFzZVVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFVSTEJ5dGVzX19sZW5fXyA9IFVSTEJ5dGVzX19pbl9sZW5fXzsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZVdpdGhCeXRlcygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxCeXRlc19faW5fXywgVVJMQnl0ZXNfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0ZVUkxSZWYgX3J2OwotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcl9faW5fXzsKLQlsb25nIGJ1ZmZlcl9fbGVuX187Ci0JaW50IGJ1ZmZlcl9faW5fbGVuX187Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcl9faW5fXzsKKyAgICBsb25nIGJ1ZmZlcl9fbGVuX187CisgICAgaW50IGJ1ZmZlcl9faW5fbGVuX187CisgICAgQm9vbGVhbiBpc0RpcmVjdG9yeTsKICNpZm5kZWYgQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcl9faW5fXywgJmJ1ZmZlcl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSkpCi0JCXJldHVybiBOVUxMOwotCWJ1ZmZlcl9fbGVuX18gPSBidWZmZXJfX2luX2xlbl9fOwotCV9ydiA9IENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX19pbl9fLCBidWZmZXJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcl9faW5fXywgJmJ1ZmZlcl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0RpcmVjdG9yeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGJ1ZmZlcl9fbGVuX18gPSBidWZmZXJfX2luX2xlbl9fOworICAgIF9ydiA9IENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX19pbl9fLCBidWZmZXJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0ZfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNGVVJMUmVmIF9ydjsKLQl1bnNpZ25lZCBjaGFyICpidWZmZXJfX2luX187Ci0JbG9uZyBidWZmZXJfX2xlbl9fOwotCWludCBidWZmZXJfX2luX2xlbl9fOwotCUJvb2xlYW4gaXNEaXJlY3Rvcnk7Ci0JQ0ZVUkxSZWYgYmFzZVVSTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0ZVUkxSZWYgX3J2OworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcl9faW5fXzsKKyAgICBsb25nIGJ1ZmZlcl9fbGVuX187CisgICAgaW50IGJ1ZmZlcl9faW5fbGVuX187CisgICAgQm9vbGVhbiBpc0RpcmVjdG9yeTsKKyAgICBDRlVSTFJlZiBiYXNlVVJMOwogI2lmbmRlZiBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZQotCVB5TWFjX1BSRUNIRUNLKENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2xPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJfX2luX18sICZidWZmZXJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmJhc2VVUkwpKQotCQlyZXR1cm4gTlVMTDsKLQlidWZmZXJfX2xlbl9fID0gYnVmZmVyX19pbl9sZW5fXzsKLQlfcnYgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb25SZWxhdGl2ZVRvQmFzZSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfX2luX18sIGJ1ZmZlcl9fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEaXJlY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyX19pbl9fLCAmYnVmZmVyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQsICZiYXNlVVJMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYnVmZmVyX19sZW5fXyA9IGJ1ZmZlcl9faW5fbGVuX187CisgICAgX3J2ID0gQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UoKENGQWxsb2NhdG9yUmVmKU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX19pbl9fLCBidWZmZXJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX0NGVVJMQ3JlYXRlRnJvbUZTUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDRlVSTFJlZiBfcnY7Ci0JRlNSZWYgZnNSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENGVVJMUmVmIF9ydjsKKyAgICBGU1JlZiBmc1JlZjsKICNpZm5kZWYgQ0ZVUkxDcmVhdGVGcm9tRlNSZWYKLQlQeU1hY19QUkVDSEVDSyhDRlVSTENyZWF0ZUZyb21GU1JlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ0ZVUkxDcmVhdGVGcm9tRlNSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmZzUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0ZVUkxDcmVhdGVGcm9tRlNSZWYoKENGQWxsb2NhdG9yUmVmKU5VTEwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmZnNSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDRlVSTENyZWF0ZUZyb21GU1JlZigoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNGX3RvQ0YoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCUNGVHlwZVJlZiBydjsKLQlDRlR5cGVJRCB0eXBlaWQ7CisgICAgQ0ZUeXBlUmVmIHJ2OworICAgIENGVHlwZUlEIHR5cGVpZDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUHlDRl9QeXRob24yQ0YsICZydikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQl0eXBlaWQgPSBDRkdldFR5cGVJRChydik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBQeUNGX1B5dGhvbjJDRiwgJnJ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgdHlwZWlkID0gQ0ZHZXRUeXBlSUQocnYpOwogCi0JaWYgKHR5cGVpZCA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQotCSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBydik7Ci0JaWYgKHR5cGVpZCA9PSBDRkFycmF5R2V0VHlwZUlEKCkpCi0JICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRkFycmF5UmVmT2JqX05ldywgcnYpOwotCWlmICh0eXBlaWQgPT0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCkpCi0JICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBydik7Ci0JaWYgKHR5cGVpZCA9PSBDRlVSTEdldFR5cGVJRCgpKQotCSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZVUkxSZWZPYmpfTmV3LCBydik7CisgICAgaWYgKHR5cGVpZCA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlN0cmluZ1JlZk9ial9OZXcsIHJ2KTsKKyAgICBpZiAodHlwZWlkID09IENGQXJyYXlHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZBcnJheVJlZk9ial9OZXcsIHJ2KTsKKyAgICBpZiAodHlwZWlkID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBydik7CisgICAgaWYgKHR5cGVpZCA9PSBDRlVSTEdldFR5cGVJRCgpKQorICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlVSTFJlZk9ial9OZXcsIHJ2KTsKIAotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIENGVHlwZVJlZk9ial9OZXcsIHJ2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlR5cGVSZWZPYmpfTmV3LCBydik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIENGX21ldGhvZHNbXSA9IHsKLQl7Il9fQ0ZSYW5nZU1ha2UiLCAoUHlDRnVuY3Rpb24pQ0ZfX19DRlJhbmdlTWFrZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsb2MsIENGSW5kZXggbGVuKSAtPiAoQ0ZSYW5nZSBfcnYpIil9LAotCXsiQ0ZBbGxvY2F0b3JHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBbGxvY2F0b3JHZXRUeXBlSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCi0JeyJDRkFsbG9jYXRvckdldFByZWZlcnJlZFNpemVGb3JTaXplIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggc2l6ZSwgQ0ZPcHRpb25GbGFncyBoaW50KSAtPiAoQ0ZJbmRleCBfcnYpIil9LAotCXsiQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZDb3B5VHlwZUlERGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKENGVHlwZUlEIHR5cGVfaWQpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZBcnJheUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkFycmF5R2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZBcnJheUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBcnJheUNyZWF0ZU11dGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQXJyYXlDcmVhdGVNdXRhYmxlQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZBcnJheVJlZiB0aGVBcnJheSkgLT4gKENGTXV0YWJsZUFycmF5UmVmIF9ydikiKX0sCi0JeyJDRkRhdGFHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZEYXRhQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGJ5dGVzKSAtPiAoQ0ZEYXRhUmVmIF9ydikiKX0sCi0JeyJDRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlV2l0aEJ5dGVzTm9Db3B5LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKLQl7IkNGRGF0YUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlTXV0YWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSkgLT4gKENGTXV0YWJsZURhdGFSZWYgX3J2KSIpfSwKLQl7IkNGRGF0YUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGF0YUNyZWF0ZU11dGFibGVDb3B5LCAxLAotCSBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5LCBDRkRhdGFSZWYgdGhlRGF0YSkgLT4gKENGTXV0YWJsZURhdGFSZWYgX3J2KSIpfSwKLQl7IkNGRGljdGlvbmFyeUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlHZXRUeXBlSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCi0JeyJDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHkpIC0+IChDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCi0JeyJDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSwgQ0ZEaWN0aW9uYXJ5UmVmIHRoZURpY3QpIC0+IChDRk11dGFibGVEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCi0JeyJDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKENGVHlwZVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0dldEFwcEJvb2xlYW5WYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBrZXlFeGlzdHNBbmRIYXNWYWxpZEZvcm1hdCkiKX0sCi0JeyJDRlByZWZlcmVuY2VzR2V0QXBwSW50ZWdlclZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKENGSW5kZXggX3J2LCBCb29sZWFuIGtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0QXBwVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZUeXBlUmVmIHZhbHVlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiBOb25lIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0FkZFN1aXRlUHJlZmVyZW5jZXNUb0FwcCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiBzdWl0ZUlEKSAtPiBOb25lIil9LAotCXsiQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNSZW1vdmVTdWl0ZVByZWZlcmVuY2VzRnJvbUFwcCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgc3VpdGVJRCkgLT4gTm9uZSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQXBwU3luY2hyb25pemUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRlByZWZlcmVuY2VzQ29weVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZUeXBlUmVmIF9ydikiKX0sCi0JeyJDRlByZWZlcmVuY2VzQ29weU11bHRpcGxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUsIDEsCi0JIFB5RG9jX1NUUigiKENGQXJyYXlSZWYga2V5c1RvRmV0Y2gsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKENGRGljdGlvbmFyeVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc1NldFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTZXRWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlR5cGVSZWYgdmFsdWUsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gTm9uZSIpfSwKLQl7IkNGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU2V0TXVsdGlwbGUsIDEsCi0JIFB5RG9jX1NUUigiKENGRGljdGlvbmFyeVJlZiBrZXlzVG9TZXQsIENGQXJyYXlSZWYga2V5c1RvUmVtb3ZlLCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IE5vbmUiKX0sCi0JeyJDRlByZWZlcmVuY2VzU3luY2hyb25pemUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1N5bmNocm9uaXplLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzQ29weUFwcGxpY2F0aW9uTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5S2V5TGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZBcnJheVJlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRUeXBlSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKGNoYXIqIGNTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgY2hhcnMpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZ05vQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHBTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZ05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5LCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBjU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnNOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGNoYXJzKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZU11dGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggbWF4TGVuZ3RoKSAtPiAoQ0ZNdXRhYmxlU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHksIDEsCi0JIFB5RG9jX1NUUigiKENGSW5kZXggbWF4TGVuZ3RoLCBDRlN0cmluZ1JlZiB0aGVTdHJpbmcpIC0+IChDRk11dGFibGVTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aEJ5dGVzLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcsIEJvb2xlYW4gaXNFeHRlcm5hbFJlcHJlc2VudGF0aW9uKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nR2V0U3lzdGVtRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0TWF4aW11bVNpemVGb3JFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZJbmRleCBsZW5ndGgsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRkluZGV4IF9ydikiKX0sCi0JeyJDRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdJc0VuY29kaW5nQXZhaWxhYmxlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ0ZTdHJpbmdHZXROYW1lT2ZFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9OU1N0cmluZ0VuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnROU1N0cmluZ0VuY29kaW5nVG9FbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAotCXsiQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb1dpbmRvd3NDb2RlcGFnZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJDRlN0cmluZ0NvbnZlcnRXaW5kb3dzQ29kZXBhZ2VUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmcsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2RlcGFnZSkgLT4gKENGU3RyaW5nRW5jb2RpbmcgX3J2KSIpfSwKLQl7IkNGU3RyaW5nQ29udmVydEVuY29kaW5nVG9JQU5BQ2hhclNldE5hbWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCi0JeyJDRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRNb3N0Q29tcGF0aWJsZU1hY1N0cmluZ0VuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAotCXsiX19DRlN0cmluZ01ha2VDb25zdGFudFN0cmluZyIsIChQeUNGdW5jdGlvbilDRl9fX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihjaGFyKiBjU3RyKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKLQl7IkNGVVJMR2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMR2V0VHlwZUlELCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlR5cGVJRCBfcnYpIil9LAotCXsiQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVXaXRoQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBVUkxCeXRlcywgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgQ0ZVUkxSZWYgYmFzZVVSTCkgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24iLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgYnVmZmVyLCBCb29sZWFuIGlzRGlyZWN0b3J5KSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvblJlbGF0aXZlVG9CYXNlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgYnVmZmVyLCBCb29sZWFuIGlzRGlyZWN0b3J5LCBDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKLQl7IkNGVVJMQ3JlYXRlRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGVVJMQ3JlYXRlRnJvbUZTUmVmLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBmc1JlZikgLT4gKENGVVJMUmVmIF9ydikiKX0sCi0JeyJ0b0NGIiwgKFB5Q0Z1bmN0aW9uKUNGX3RvQ0YsIDEsCi0JIFB5RG9jX1NUUigiKHB5dGhvbl9vYmplY3QpIC0+IChDRl9vYmplY3QpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiX19DRlJhbmdlTWFrZSIsIChQeUNGdW5jdGlvbilDRl9fX0NGUmFuZ2VNYWtlLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGxvYywgQ0ZJbmRleCBsZW4pIC0+IChDRlJhbmdlIF9ydikiKX0sCisgICAgeyJDRkFsbG9jYXRvckdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkFsbG9jYXRvckdldFR5cGVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKKyAgICB7IkNGQWxsb2NhdG9yR2V0UHJlZmVycmVkU2l6ZUZvclNpemUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBbGxvY2F0b3JHZXRQcmVmZXJyZWRTaXplRm9yU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBzaXplLCBDRk9wdGlvbkZsYWdzIGhpbnQpIC0+IChDRkluZGV4IF9ydikiKX0sCisgICAgeyJDRkNvcHlUeXBlSUREZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilDRl9DRkNvcHlUeXBlSUREZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZUeXBlSUQgdHlwZV9pZCkgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRkFycmF5R2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGQXJyYXlHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRkFycmF5Q3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRkFycmF5Q3JlYXRlTXV0YWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSkgLT4gKENGTXV0YWJsZUFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRkFycmF5Q3JlYXRlTXV0YWJsZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZBcnJheUNyZWF0ZU11dGFibGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5LCBDRkFycmF5UmVmIHRoZUFycmF5KSAtPiAoQ0ZNdXRhYmxlQXJyYXlSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUdldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRkRhdGFDcmVhdGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgYnl0ZXMpIC0+IChDRkRhdGFSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGF0YUNyZWF0ZVdpdGhCeXRlc05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFDcmVhdGVXaXRoQnl0ZXNOb0NvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBieXRlcykgLT4gKENGRGF0YVJlZiBfcnYpIil9LAorICAgIHsiQ0ZEYXRhQ3JlYXRlTXV0YWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRkRhdGFDcmVhdGVNdXRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5KSAtPiAoQ0ZNdXRhYmxlRGF0YVJlZiBfcnYpIil9LAorICAgIHsiQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEYXRhQ3JlYXRlTXV0YWJsZUNvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKENGSW5kZXggY2FwYWNpdHksIENGRGF0YVJlZiB0aGVEYXRhKSAtPiAoQ0ZNdXRhYmxlRGF0YVJlZiBfcnYpIil9LAorICAgIHsiQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGljdGlvbmFyeUdldFR5cGVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKKyAgICB7IkNGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBjYXBhY2l0eSkgLT4gKENGTXV0YWJsZURpY3Rpb25hcnlSZWYgX3J2KSIpfSwKKyAgICB7IkNGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGRGljdGlvbmFyeUNyZWF0ZU11dGFibGVDb3B5LCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGNhcGFjaXR5LCBDRkRpY3Rpb25hcnlSZWYgdGhlRGljdCkgLT4gKENGTXV0YWJsZURpY3Rpb25hcnlSZWYgX3J2KSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiAoQ0ZUeXBlUmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzR2V0QXBwQm9vbGVhblZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNHZXRBcHBCb29sZWFuVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGtleSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKEJvb2xlYW4gX3J2LCBCb29sZWFuIGtleUV4aXN0c0FuZEhhc1ZhbGlkRm9ybWF0KSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNHZXRBcHBJbnRlZ2VyVmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0dldEFwcEludGVnZXJWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklEKSAtPiAoQ0ZJbmRleCBfcnYsIEJvb2xlYW4ga2V5RXhpc3RzQW5kSGFzVmFsaWRGb3JtYXQpIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc1NldEFwcFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTZXRBcHBWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlR5cGVSZWYgdmFsdWUsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQpIC0+IE5vbmUiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQWRkU3VpdGVQcmVmZXJlbmNlc1RvQXBwIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNBZGRTdWl0ZVByZWZlcmVuY2VzVG9BcHAsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHN1aXRlSUQpIC0+IE5vbmUiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzUmVtb3ZlU3VpdGVQcmVmZXJlbmNlc0Zyb21BcHAiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1JlbW92ZVN1aXRlUHJlZmVyZW5jZXNGcm9tQXBwLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiBzdWl0ZUlEKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc0FwcFN5bmNocm9uaXplIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNBcHBTeW5jaHJvbml6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNDb3B5VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYga2V5LCBDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChDRlR5cGVSZWYgX3J2KSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNDb3B5TXVsdGlwbGUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlNdWx0aXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZBcnJheVJlZiBrZXlzVG9GZXRjaCwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiAoQ0ZEaWN0aW9uYXJ5UmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzU2V0VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc1NldFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBrZXksIENGVHlwZVJlZiB2YWx1ZSwgQ0ZTdHJpbmdSZWYgYXBwbGljYXRpb25JRCwgQ0ZTdHJpbmdSZWYgdXNlck5hbWUsIENGU3RyaW5nUmVmIGhvc3ROYW1lKSAtPiBOb25lIil9LAorICAgIHsiQ0ZQcmVmZXJlbmNlc1NldE11bHRpcGxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNTZXRNdWx0aXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZEaWN0aW9uYXJ5UmVmIGtleXNUb1NldCwgQ0ZBcnJheVJlZiBrZXlzVG9SZW1vdmUsIENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNTeW5jaHJvbml6ZSIsIChQeUNGdW5jdGlvbilDRl9DRlByZWZlcmVuY2VzU3luY2hyb25pemUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGFwcGxpY2F0aW9uSUQsIENGU3RyaW5nUmVmIHVzZXJOYW1lLCBDRlN0cmluZ1JlZiBob3N0TmFtZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGUHJlZmVyZW5jZXNDb3B5QXBwbGljYXRpb25MaXN0LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRlByZWZlcmVuY2VzQ29weUtleUxpc3QiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZQcmVmZXJlbmNlc0NvcHlLZXlMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBhcHBsaWNhdGlvbklELCBDRlN0cmluZ1JlZiB1c2VyTmFtZSwgQ0ZTdHJpbmdSZWYgaG9zdE5hbWUpIC0+IChDRkFycmF5UmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldFR5cGVJRCIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldFR5cGVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZUeXBlSUQgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBwU3RyLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoY2hhciogY1N0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBjaGFycykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmdOb0NvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoUGFzY2FsU3RyaW5nTm9Db3B5LCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgcFN0ciwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGU3RyaW5nUmVmIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5IiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmdOb0NvcHksIDEsCisgICAgIFB5RG9jX1NUUigiKGNoYXIqIGNTdHIsIENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVyc05vQ29weSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzTm9Db3B5LCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgY2hhcnMpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ3JlYXRlTXV0YWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBtYXhMZW5ndGgpIC0+IChDRk11dGFibGVTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ3JlYXRlTXV0YWJsZUNvcHkiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVNdXRhYmxlQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZJbmRleCBtYXhMZW5ndGgsIENGU3RyaW5nUmVmIHRoZVN0cmluZykgLT4gKENGTXV0YWJsZVN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDcmVhdGVXaXRoQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBieXRlcywgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZywgQm9vbGVhbiBpc0V4dGVybmFsUmVwcmVzZW50YXRpb24pIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdHZXRTeXN0ZW1FbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldFN5c3RlbUVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldE1heGltdW1TaXplRm9yRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdHZXRNYXhpbXVtU2l6ZUZvckVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRkluZGV4IGxlbmd0aCwgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZykgLT4gKENGSW5kZXggX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nSXNFbmNvZGluZ0F2YWlsYWJsZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0lzRW5jb2RpbmdBdmFpbGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0dldE5hbWVPZkVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nR2V0TmFtZU9mRW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb05TU3RyaW5nRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb05TU3RyaW5nRW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydE5TU3RyaW5nRW5jb2RpbmdUb0VuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgZW5jb2RpbmcpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJDRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvV2luZG93c0NvZGVwYWdlIiwgKFB5Q0Z1bmN0aW9uKUNGX0NGU3RyaW5nQ29udmVydEVuY29kaW5nVG9XaW5kb3dzQ29kZXBhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nQ29udmVydFdpbmRvd3NDb2RlcGFnZVRvRW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZTdHJpbmdDb252ZXJ0V2luZG93c0NvZGVwYWdlVG9FbmNvZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvZGVwYWdlKSAtPiAoQ0ZTdHJpbmdFbmNvZGluZyBfcnYpIil9LAorICAgIHsiQ0ZTdHJpbmdDb252ZXJ0RW5jb2RpbmdUb0lBTkFDaGFyU2V0TmFtZSIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0NvbnZlcnRFbmNvZGluZ1RvSUFOQUNoYXJTZXROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nKSAtPiAoQ0ZTdHJpbmdSZWYgX3J2KSIpfSwKKyAgICB7IkNGU3RyaW5nR2V0TW9zdENvbXBhdGlibGVNYWNTdHJpbmdFbmNvZGluZyIsIChQeUNGdW5jdGlvbilDRl9DRlN0cmluZ0dldE1vc3RDb21wYXRpYmxlTWFjU3RyaW5nRW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nRW5jb2RpbmcgZW5jb2RpbmcpIC0+IChDRlN0cmluZ0VuY29kaW5nIF9ydikiKX0sCisgICAgeyJfX0NGU3RyaW5nTWFrZUNvbnN0YW50U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUNGX19fQ0ZTdHJpbmdNYWtlQ29uc3RhbnRTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGNoYXIqIGNTdHIpIC0+IChDRlN0cmluZ1JlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxHZXRUeXBlSUQiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxHZXRUeXBlSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGVHlwZUlEIF9ydikiKX0sCisgICAgeyJDRlVSTENyZWF0ZVdpdGhCeXRlcyIsIChQeUNGdW5jdGlvbilDRl9DRlVSTENyZWF0ZVdpdGhCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIFVSTEJ5dGVzLCBDRlN0cmluZ0VuY29kaW5nIGVuY29kaW5nLCBDRlVSTFJlZiBiYXNlVVJMKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7IkNGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiIsIChQeUNGdW5jdGlvbilDRl9DRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBidWZmZXIsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uUmVsYXRpdmVUb0Jhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBidWZmZXIsIEJvb2xlYW4gaXNEaXJlY3RvcnksIENGVVJMUmVmIGJhc2VVUkwpIC0+IChDRlVSTFJlZiBfcnYpIil9LAorICAgIHsiQ0ZVUkxDcmVhdGVGcm9tRlNSZWYiLCAoUHlDRnVuY3Rpb24pQ0ZfQ0ZVUkxDcmVhdGVGcm9tRlNSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGZzUmVmKSAtPiAoQ0ZVUkxSZWYgX3J2KSIpfSwKKyAgICB7InRvQ0YiLCAoUHlDRnVuY3Rpb24pQ0ZfdG9DRiwgMSwKKyAgICAgUHlEb2NfU1RSKCIocHl0aG9uX29iamVjdCkgLT4gKENGX29iamVjdCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTQ4MjgsMTY1ICs0ODI4LDE2NSBAQAogLyogUm91dGluZXMgdG8gY29udmVydCBhbnkgQ0YgdHlwZSB0by9mcm9tIHRoZSBjb3JyZXNwb25kaW5nIENGeHh4T2JqICovCiBQeU9iamVjdCAqQ0ZPYmpfTmV3KENGVHlwZVJlZiBpdHNlbGYpCiB7Ci0gICAgICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZBcnJheVJlZk9ial9OZXcoKENGQXJyYXlSZWYpaXRzZWxmKTsKLSAgICAgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCkpIHJldHVybiBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KChDRkRpY3Rpb25hcnlSZWYpaXRzZWxmKTsKLSAgICAgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZEYXRhR2V0VHlwZUlEKCkpIHJldHVybiBDRkRhdGFSZWZPYmpfTmV3KChDRkRhdGFSZWYpaXRzZWxmKTsKLSAgICAgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldygoQ0ZTdHJpbmdSZWYpaXRzZWxmKTsKLSAgICAgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkgcmV0dXJuIENGVVJMUmVmT2JqX05ldygoQ0ZVUkxSZWYpaXRzZWxmKTsKLSAgICAgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFB5Q0ZfQ0YyUHl0aG9uIGhlcmU/PyAqLwotICAgICAgICByZXR1cm4gQ0ZUeXBlUmVmT2JqX05ldyhpdHNlbGYpOworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJjYW5ub3Qgd3JhcCBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkFycmF5R2V0VHlwZUlEKCkpIHJldHVybiBDRkFycmF5UmVmT2JqX05ldygoQ0ZBcnJheVJlZilpdHNlbGYpOworICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKSByZXR1cm4gQ0ZEaWN0aW9uYXJ5UmVmT2JqX05ldygoQ0ZEaWN0aW9uYXJ5UmVmKWl0c2VsZik7CisgICAgaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZEYXRhR2V0VHlwZUlEKCkpIHJldHVybiBDRkRhdGFSZWZPYmpfTmV3KChDRkRhdGFSZWYpaXRzZWxmKTsKKyAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKSByZXR1cm4gQ0ZTdHJpbmdSZWZPYmpfTmV3KChDRlN0cmluZ1JlZilpdHNlbGYpOworICAgIGlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGVVJMR2V0VHlwZUlEKCkpIHJldHVybiBDRlVSTFJlZk9ial9OZXcoKENGVVJMUmVmKWl0c2VsZik7CisgICAgLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFB5Q0ZfQ0YyUHl0aG9uIGhlcmU/PyAqLworICAgIHJldHVybiBDRlR5cGVSZWZPYmpfTmV3KGl0c2VsZik7CiB9CiBpbnQgQ0ZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZUeXBlUmVmICpwX2l0c2VsZikKIHsKIAotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0gICAgICAgIC8qIENoZWNrIGZvciBvdGhlciBDRiBvYmplY3RzIGhlcmUgKi8KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0gICAgICAgIGlmICghQ0ZUeXBlUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKLSAgICAgICAgICAgICAgICAhQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKLSAgICAgICAgICAgICAgICAhQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKLSAgICAgICAgICAgICAgICAhQ0ZEYXRhUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGTXV0YWJsZURhdGFSZWZPYmpfQ2hlY2sodikgJiYKLSAgICAgICAgICAgICAgICAhQ0ZTdHJpbmdSZWZPYmpfQ2hlY2sodikgJiYKLSAgICAgICAgICAgICAgICAhQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpICYmCi0gICAgICAgICAgICAgICAgIUNGVVJMUmVmT2JqX0NoZWNrKHYpICkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX1B5dGhvbjJDRiBoZXJlPz8gKi8KLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0Ygb2JqZWN0IHJlcXVpcmVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgKnBfaXRzZWxmID0gKChDRlR5cGVSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoIUNGVHlwZVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZBcnJheVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgIUNGRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZEYXRhUmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICFDRk11dGFibGVEYXRhUmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICFDRlN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgorICAgICAgICAhQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICFDRlVSTFJlZk9ial9DaGVjayh2KSApCisgICAgeworICAgICAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgUHlDRl9QeXRob24yQ0YgaGVyZT8/ICovCisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDRiBvYmplY3QgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0ZUeXBlUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogCiB2b2lkIGluaXRfQ0Yodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRlR5cGVSZWYsIENGT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVHlwZVJlZiwgQ0ZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZUeXBlUmVmLCBDRlR5cGVSZWZPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZUeXBlUmVmLCBDRlR5cGVSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZTdHJpbmdSZWYsIENGU3RyaW5nUmVmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGU3RyaW5nUmVmLCBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRk11dGFibGVTdHJpbmdSZWYsIENGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVTdHJpbmdSZWYsIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRkFycmF5UmVmLCBDRkFycmF5UmVmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGQXJyYXlSZWYsIENGQXJyYXlSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlQXJyYXlSZWYsIENGTXV0YWJsZUFycmF5UmVmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGTXV0YWJsZUFycmF5UmVmLCBDRk11dGFibGVBcnJheVJlZk9ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRkRpY3Rpb25hcnlSZWYsIENGRGljdGlvbmFyeVJlZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRkRpY3Rpb25hcnlSZWYsIENGRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGTXV0YWJsZURpY3Rpb25hcnlSZWYsIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZVUkxSZWYsIENGVVJMUmVmT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVVJMUmVmLCBDRlVSTFJlZk9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRlR5cGVSZWYsIENGT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVHlwZVJlZiwgQ0ZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZUeXBlUmVmLCBDRlR5cGVSZWZPYmpfTmV3KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ0ZUeXBlUmVmLCBDRlR5cGVSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZTdHJpbmdSZWYsIENGU3RyaW5nUmVmT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGU3RyaW5nUmVmLCBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRk11dGFibGVTdHJpbmdSZWYsIENGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRk11dGFibGVTdHJpbmdSZWYsIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRkFycmF5UmVmLCBDRkFycmF5UmVmT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGQXJyYXlSZWYsIENGQXJyYXlSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZNdXRhYmxlQXJyYXlSZWYsIENGTXV0YWJsZUFycmF5UmVmT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGTXV0YWJsZUFycmF5UmVmLCBDRk11dGFibGVBcnJheVJlZk9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRkRpY3Rpb25hcnlSZWYsIENGRGljdGlvbmFyeVJlZk9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDRkRpY3Rpb25hcnlSZWYsIENGRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGTXV0YWJsZURpY3Rpb25hcnlSZWYsIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ29udmVydCk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ0ZVUkxSZWYsIENGVVJMUmVmT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENGVVJMUmVmLCBDRlVSTFJlZk9ial9Db252ZXJ0KTsKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9DRiIsIENGX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUNGX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoQ0ZfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDRl9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUNGVHlwZVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZUeXBlUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZUeXBlUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZUeXBlUmVmIiwgKFB5T2JqZWN0ICopJkNGVHlwZVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGVHlwZVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVHlwZVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZUeXBlUmVmX1R5cGUpOwotCUNGQXJyYXlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGQXJyYXlSZWZfVHlwZS50cF9iYXNlID0gJkNGVHlwZVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGQXJyYXlSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRkFycmF5UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZBcnJheVJlZiIsIChQeU9iamVjdCAqKSZDRkFycmF5UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZBcnJheVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGQXJyYXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGQXJyYXlSZWZfVHlwZSk7Ci0JQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCUNGTXV0YWJsZUFycmF5UmVmX1R5cGUudHBfYmFzZSA9ICZDRkFycmF5UmVmX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZUFycmF5UmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVBcnJheVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7Ci0JQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlDRkRpY3Rpb25hcnlSZWZfVHlwZS50cF9iYXNlID0gJkNGVHlwZVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGRGljdGlvbmFyeVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGljdGlvbmFyeVJlZiIsIChQeU9iamVjdCAqKSZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRpY3Rpb25hcnlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGRGljdGlvbmFyeVJlZl9UeXBlKTsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUudHBfYmFzZSA9ICZDRkRpY3Rpb25hcnlSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEaWN0aW9uYXJ5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOwotCUNGRGF0YVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZEYXRhUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDRkRhdGFSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDRkRhdGFSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRhdGFSZWYiLCAoUHlPYmplY3QgKikmQ0ZEYXRhUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ0ZEYXRhUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEYXRhUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkRhdGFSZWZfVHlwZSk7Ci0JQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZEYXRhUmVmX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEYXRhUmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRk11dGFibGVEYXRhUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGF0YVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKLQlDRlN0cmluZ1JlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZTdHJpbmdSZWZfVHlwZS50cF9iYXNlID0gJkNGVHlwZVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGU3RyaW5nUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZTdHJpbmdSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlN0cmluZ1JlZiIsIChQeU9iamVjdCAqKSZDRlN0cmluZ1JlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGU3RyaW5nUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZTdHJpbmdSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGU3RyaW5nUmVmX1R5cGUpOwotCUNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUudHBfYmFzZSA9ICZDRlN0cmluZ1JlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZVN0cmluZ1JlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVTdHJpbmdSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZVN0cmluZ1JlZl9UeXBlKTsKLQlDRlVSTFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JQ0ZVUkxSZWZfVHlwZS50cF9iYXNlID0gJkNGVHlwZVJlZl9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNGVVJMUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0ZVUkxSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlVSTFJlZiIsIChQeU9iamVjdCAqKSZDRlVSTFJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNGVVJMUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZVUkxSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGVVJMUmVmX1R5cGUpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQ0YiLCBDRl9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBDRl9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKENGX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ0ZfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBDRlR5cGVSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGVHlwZVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGVHlwZVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVHlwZVJlZiIsIChQeU9iamVjdCAqKSZDRlR5cGVSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRlR5cGVSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRlR5cGVSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGVHlwZVJlZl9UeXBlKTsKKyAgICBDRkFycmF5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRkFycmF5UmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRkFycmF5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZBcnJheVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGQXJyYXlSZWYiLCAoUHlPYmplY3QgKikmQ0ZBcnJheVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGQXJyYXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkFycmF5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkFycmF5UmVmX1R5cGUpOworICAgIENGTXV0YWJsZUFycmF5UmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBDRk11dGFibGVBcnJheVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZBcnJheVJlZl9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlQXJyYXlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVBcnJheVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVBcnJheVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlQXJyYXlSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZUFycmF5UmVmX1R5cGUpOworICAgIENGRGljdGlvbmFyeVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRkRpY3Rpb25hcnlSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRkRpY3Rpb25hcnlSZWYiLCAoUHlPYmplY3QgKikmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEaWN0aW9uYXJ5UmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRkRpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZEaWN0aW9uYXJ5UmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVEaWN0aW9uYXJ5UmVmIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURpY3Rpb25hcnlSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVEaWN0aW9uYXJ5UmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZl9UeXBlKTsKKyAgICBDRkRhdGFSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGRGF0YVJlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZUeXBlUmVmX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ0ZEYXRhUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmQ0ZEYXRhUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZEYXRhUmVmIiwgKFB5T2JqZWN0ICopJkNGRGF0YVJlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkNGRGF0YVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGRGF0YVJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0ZEYXRhUmVmX1R5cGUpOworICAgIENGTXV0YWJsZURhdGFSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGTXV0YWJsZURhdGFSZWZfVHlwZS50cF9iYXNlID0gJkNGRGF0YVJlZl9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNGTXV0YWJsZURhdGFSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVEYXRhUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlRGF0YVJlZiIsIChQeU9iamVjdCAqKSZDRk11dGFibGVEYXRhUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlRGF0YVJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGTXV0YWJsZURhdGFSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNGTXV0YWJsZURhdGFSZWZfVHlwZSk7CisgICAgQ0ZTdHJpbmdSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGU3RyaW5nUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRlN0cmluZ1JlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGU3RyaW5nUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZTdHJpbmdSZWYiLCAoUHlPYmplY3QgKikmQ0ZTdHJpbmdSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRlN0cmluZ1JlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGU3RyaW5nUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlN0cmluZ1JlZl9UeXBlKTsKKyAgICBDRk11dGFibGVTdHJpbmdSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGTXV0YWJsZVN0cmluZ1JlZl9UeXBlLnRwX2Jhc2UgPSAmQ0ZTdHJpbmdSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDRk11dGFibGVTdHJpbmdSZWYiLCAoUHlPYmplY3QgKikmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQ0ZNdXRhYmxlU3RyaW5nUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRk11dGFibGVTdHJpbmdSZWZfVHlwZSk7CisgICAgQ0ZVUkxSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIENGVVJMUmVmX1R5cGUudHBfYmFzZSA9ICZDRlR5cGVSZWZfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDRlVSTFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNGVVJMUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0ZVUkxSZWYiLCAoUHlPYmplY3QgKikmQ0ZVUkxSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDRlVSTFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNGVVJMUmVmVHlwZSIsIChQeU9iamVjdCAqKSZDRlVSTFJlZl9UeXBlKTsKIAogI2RlZmluZSBfU1RSSU5HQ09OU1QobmFtZSkgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICNuYW1lLCBDRlN0cmluZ1JlZk9ial9OZXcobmFtZSkpCi0JX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55QXBwbGljYXRpb24pOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRBcHBsaWNhdGlvbik7Ci0JX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55SG9zdCk7Ci0JX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQ3VycmVudEhvc3QpOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0FueVVzZXIpOwotCV9TVFJJTkdDT05TVChrQ0ZQcmVmZXJlbmNlc0N1cnJlbnRVc2VyKTsKKyAgICBfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNBbnlBcHBsaWNhdGlvbik7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQ3VycmVudEFwcGxpY2F0aW9uKTsKKyAgICBfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNBbnlIb3N0KTsKKyAgICBfU1RSSU5HQ09OU1Qoa0NGUHJlZmVyZW5jZXNDdXJyZW50SG9zdCk7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQW55VXNlcik7CisgICAgX1NUUklOR0NPTlNUKGtDRlByZWZlcmVuY2VzQ3VycmVudFVzZXIpOwogCiAKIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2YvcHljZmJyaWRnZS5jIGIvTWFjL01vZHVsZXMvY2YvcHljZmJyaWRnZS5jCmluZGV4IDA2NzAwYjMuLjcwOGMxZTYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2NmL3B5Y2ZicmlkZ2UuYworKysgYi9NYWMvTW9kdWxlcy9jZi9weWNmYnJpZGdlLmMKQEAgLTE1LDEyOCArMTUsMTI4IEBACiAKIFB5T2JqZWN0ICoKIFB5Q0ZfQ0YyUHl0aG9uKENGVHlwZVJlZiBzcmMpIHsKLQlDRlR5cGVJRCB0eXBlaWQ7Ci0JCi0JaWYoIHNyYyA9PSBOVUxMICkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQl0eXBlaWQgPSBDRkdldFR5cGVJRChzcmMpOwotCWlmICh0eXBlaWQgPT0gQ0ZBcnJheUdldFR5cGVJRCgpKQotCQlyZXR1cm4gUHlDRl9DRjJQeXRob25fc2VxdWVuY2UoKENGQXJyYXlSZWYpc3JjKTsKLQlpZiAodHlwZWlkID09IENGRGljdGlvbmFyeUdldFR5cGVJRCgpKQotCQlyZXR1cm4gUHlDRl9DRjJQeXRob25fbWFwcGluZygoQ0ZEaWN0aW9uYXJ5UmVmKXNyYyk7Ci0JcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX3NpbXBsZShzcmMpOworICAgIENGVHlwZUlEIHR5cGVpZDsKKworICAgIGlmKCBzcmMgPT0gTlVMTCApIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgdHlwZWlkID0gQ0ZHZXRUeXBlSUQoc3JjKTsKKyAgICBpZiAodHlwZWlkID09IENGQXJyYXlHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX3NlcXVlbmNlKChDRkFycmF5UmVmKXNyYyk7CisgICAgaWYgKHR5cGVpZCA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfQ0YyUHl0aG9uX21hcHBpbmcoKENGRGljdGlvbmFyeVJlZilzcmMpOworICAgIHJldHVybiBQeUNGX0NGMlB5dGhvbl9zaW1wbGUoc3JjKTsKIH0KIAogUHlPYmplY3QgKgogUHlDRl9DRjJQeXRob25fc2VxdWVuY2UoQ0ZBcnJheVJlZiBzcmMpIHsKLQlpbnQgc2l6ZSA9IENGQXJyYXlHZXRDb3VudChzcmMpOwotCVB5T2JqZWN0ICpydjsKLQlDRlR5cGVSZWYgaXRlbV9jZjsKLQlQeU9iamVjdCAqaXRlbV9weSA9IE5VTEw7Ci0JaW50IGk7Ci0JCi0JaWYgKCAocnY9UHlMaXN0X05ldyhzaXplKSkgPT0gTlVMTCApCi0JCXJldHVybiBOVUxMOwotCWZvcihpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCWl0ZW1fY2YgPSBDRkFycmF5R2V0VmFsdWVBdEluZGV4KHNyYywgaSk7Ci0JCWlmIChpdGVtX2NmID09IE5VTEwgKSBnb3RvIGVycjsKLQkJaXRlbV9weSA9IFB5Q0ZfQ0YyUHl0aG9uKGl0ZW1fY2YpOwotCQlpZiAoaXRlbV9weSA9PSBOVUxMICkgZ290byBlcnI7Ci0JCWlmIChQeUxpc3RfU2V0SXRlbShydiwgaSwgaXRlbV9weSkgPCAwKSBnb3RvIGVycjsKLQkJaXRlbV9weSA9IE5VTEw7Ci0JfQotCXJldHVybiBydjsKKyAgICBpbnQgc2l6ZSA9IENGQXJyYXlHZXRDb3VudChzcmMpOworICAgIFB5T2JqZWN0ICpydjsKKyAgICBDRlR5cGVSZWYgaXRlbV9jZjsKKyAgICBQeU9iamVjdCAqaXRlbV9weSA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBpZiAoIChydj1QeUxpc3RfTmV3KHNpemUpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yKGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAgaXRlbV9jZiA9IENGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoc3JjLCBpKTsKKyAgICAgICAgaWYgKGl0ZW1fY2YgPT0gTlVMTCApIGdvdG8gZXJyOworICAgICAgICBpdGVtX3B5ID0gUHlDRl9DRjJQeXRob24oaXRlbV9jZik7CisgICAgICAgIGlmIChpdGVtX3B5ID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKFB5TGlzdF9TZXRJdGVtKHJ2LCBpLCBpdGVtX3B5KSA8IDApIGdvdG8gZXJyOworICAgICAgICBpdGVtX3B5ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogZXJyOgotCVB5X1hERUNSRUYoaXRlbV9weSk7Ci0JUHlfREVDUkVGKHJ2KTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGl0ZW1fcHkpOworICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q0ZfQ0YyUHl0aG9uX21hcHBpbmcoQ0ZUeXBlUmVmIHNyYykgewotCWludCBzaXplID0gQ0ZEaWN0aW9uYXJ5R2V0Q291bnQoc3JjKTsKLQlQeU9iamVjdCAqcnYgPSBOVUxMOwotCUNGVHlwZVJlZiAqYWxsa2V5cyA9IE5VTEwsICphbGx2YWx1ZXMgPSBOVUxMOwotCUNGVHlwZVJlZiBrZXlfY2YsIHZhbHVlX2NmOwotCVB5T2JqZWN0ICprZXlfcHkgPSBOVUxMLCAqdmFsdWVfcHkgPSBOVUxMOwotCWludCBpOwotCQotCWFsbGtleXMgPSBtYWxsb2Moc2l6ZSpzaXplb2YoQ0ZUeXBlUmVmICopKTsKLQlpZiAoYWxsa2V5cyA9PSBOVUxMKSB7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZXJyOwotCX0KLQlhbGx2YWx1ZXMgPSBtYWxsb2Moc2l6ZSpzaXplb2YoQ0ZUeXBlUmVmICopKTsKLQlpZiAoYWxsdmFsdWVzID09IE5VTEwpIHsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJZ290byBlcnI7Ci0JfQotCWlmICggKHJ2PVB5RGljdF9OZXcoKSkgPT0gTlVMTCApIGdvdG8gZXJyOwotCUNGRGljdGlvbmFyeUdldEtleXNBbmRWYWx1ZXMoc3JjLCBhbGxrZXlzLCBhbGx2YWx1ZXMpOwotCWZvcihpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCWtleV9jZiA9IGFsbGtleXNbaV07Ci0JCXZhbHVlX2NmID0gYWxsdmFsdWVzW2ldOwotCQlrZXlfcHkgPSBQeUNGX0NGMlB5dGhvbihrZXlfY2YpOwotCQlpZiAoa2V5X3B5ID09IE5VTEwgKSBnb3RvIGVycjsKLQkJdmFsdWVfcHkgPSBQeUNGX0NGMlB5dGhvbih2YWx1ZV9jZik7Ci0JCWlmICh2YWx1ZV9weSA9PSBOVUxMICkgZ290byBlcnI7Ci0JCWlmIChQeURpY3RfU2V0SXRlbShydiwga2V5X3B5LCB2YWx1ZV9weSkgPCAwKSBnb3RvIGVycjsKLQkJa2V5X3B5ID0gTlVMTDsKLQkJdmFsdWVfcHkgPSBOVUxMOwotCX0KLQlyZXR1cm4gcnY7CisgICAgaW50IHNpemUgPSBDRkRpY3Rpb25hcnlHZXRDb3VudChzcmMpOworICAgIFB5T2JqZWN0ICpydiA9IE5VTEw7CisgICAgQ0ZUeXBlUmVmICphbGxrZXlzID0gTlVMTCwgKmFsbHZhbHVlcyA9IE5VTEw7CisgICAgQ0ZUeXBlUmVmIGtleV9jZiwgdmFsdWVfY2Y7CisgICAgUHlPYmplY3QgKmtleV9weSA9IE5VTEwsICp2YWx1ZV9weSA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBhbGxrZXlzID0gbWFsbG9jKHNpemUqc2l6ZW9mKENGVHlwZVJlZiAqKSk7CisgICAgaWYgKGFsbGtleXMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisgICAgYWxsdmFsdWVzID0gbWFsbG9jKHNpemUqc2l6ZW9mKENGVHlwZVJlZiAqKSk7CisgICAgaWYgKGFsbHZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBpZiAoIChydj1QeURpY3RfTmV3KCkpID09IE5VTEwgKSBnb3RvIGVycjsKKyAgICBDRkRpY3Rpb25hcnlHZXRLZXlzQW5kVmFsdWVzKHNyYywgYWxsa2V5cywgYWxsdmFsdWVzKTsKKyAgICBmb3IoaT0wOyBpPHNpemU7IGkrKykgeworICAgICAgICBrZXlfY2YgPSBhbGxrZXlzW2ldOworICAgICAgICB2YWx1ZV9jZiA9IGFsbHZhbHVlc1tpXTsKKyAgICAgICAga2V5X3B5ID0gUHlDRl9DRjJQeXRob24oa2V5X2NmKTsKKyAgICAgICAgaWYgKGtleV9weSA9PSBOVUxMICkgZ290byBlcnI7CisgICAgICAgIHZhbHVlX3B5ID0gUHlDRl9DRjJQeXRob24odmFsdWVfY2YpOworICAgICAgICBpZiAodmFsdWVfcHkgPT0gTlVMTCApIGdvdG8gZXJyOworICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0ocnYsIGtleV9weSwgdmFsdWVfcHkpIDwgMCkgZ290byBlcnI7CisgICAgICAgIGtleV9weSA9IE5VTEw7CisgICAgICAgIHZhbHVlX3B5ID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHJ2OwogZXJyOgotCVB5X1hERUNSRUYoa2V5X3B5KTsKLQlQeV9YREVDUkVGKHZhbHVlX3B5KTsKLQlQeV9YREVDUkVGKHJ2KTsKLQlmcmVlKGFsbGtleXMpOwotCWZyZWUoYWxsdmFsdWVzKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBQeV9YREVDUkVGKGtleV9weSk7CisgICAgUHlfWERFQ1JFRih2YWx1ZV9weSk7CisgICAgUHlfWERFQ1JFRihydik7CisgICAgZnJlZShhbGxrZXlzKTsKKyAgICBmcmVlKGFsbHZhbHVlcyk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKIFB5Q0ZfQ0YyUHl0aG9uX3NpbXBsZShDRlR5cGVSZWYgc3JjKSB7Ci0JQ0ZUeXBlSUQgdHlwZWlkOwotCQotCXR5cGVpZCA9IENGR2V0VHlwZUlEKHNyYyk7Ci0JaWYgKHR5cGVpZCA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKQotCQlyZXR1cm4gUHlDRl9DRjJQeXRob25fc3RyaW5nKChDRlN0cmluZ1JlZilzcmMpOwotCWlmICh0eXBlaWQgPT0gQ0ZCb29sZWFuR2V0VHlwZUlEKCkpCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpQ0ZCb29sZWFuR2V0VmFsdWUoc3JjKSk7Ci0JaWYgKHR5cGVpZCA9PSBDRk51bWJlckdldFR5cGVJRCgpKSB7Ci0JCWlmIChDRk51bWJlcklzRmxvYXRUeXBlKHNyYykpIHsKLQkJCWRvdWJsZSBkOwotCQkJQ0ZOdW1iZXJHZXRWYWx1ZShzcmMsIGtDRk51bWJlckRvdWJsZVR5cGUsICZkKTsKLQkJCXJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoZCk7Ci0JCX0gZWxzZSB7Ci0JCQlsb25nIGw7Ci0JCQlpZiAoIUNGTnVtYmVyR2V0VmFsdWUoc3JjLCBrQ0ZOdW1iZXJMb25nVHlwZSwgJmwpKQotCQkJCS8qIFhYWFggT3V0IG9mIHJhbmdlISAqLzsKLQkJCXJldHVybiBQeUludF9Gcm9tTG9uZyhsKTsKLQkJfQotCX0KLQkvKiBYWFhYIFNob3VsZCByZXR1cm4gYXMgQ0ZUeXBlUmVmLCByZWFsbHkuLi4gKi8KLQlQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JcmV0dXJuIE5VTEw7CisgICAgQ0ZUeXBlSUQgdHlwZWlkOworCisgICAgdHlwZWlkID0gQ0ZHZXRUeXBlSUQoc3JjKTsKKyAgICBpZiAodHlwZWlkID09IENGU3RyaW5nR2V0VHlwZUlEKCkpCisgICAgICAgIHJldHVybiBQeUNGX0NGMlB5dGhvbl9zdHJpbmcoKENGU3RyaW5nUmVmKXNyYyk7CisgICAgaWYgKHR5cGVpZCA9PSBDRkJvb2xlYW5HZXRUeXBlSUQoKSkKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygobG9uZylDRkJvb2xlYW5HZXRWYWx1ZShzcmMpKTsKKyAgICBpZiAodHlwZWlkID09IENGTnVtYmVyR2V0VHlwZUlEKCkpIHsKKyAgICAgICAgaWYgKENGTnVtYmVySXNGbG9hdFR5cGUoc3JjKSkgeworICAgICAgICAgICAgZG91YmxlIGQ7CisgICAgICAgICAgICBDRk51bWJlckdldFZhbHVlKHNyYywga0NGTnVtYmVyRG91YmxlVHlwZSwgJmQpOworICAgICAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvbmcgbDsKKyAgICAgICAgICAgIGlmICghQ0ZOdW1iZXJHZXRWYWx1ZShzcmMsIGtDRk51bWJlckxvbmdUeXBlLCAmbCkpCisgICAgICAgICAgICAgICAgLyogWFhYWCBPdXQgb2YgcmFuZ2UhICovOworICAgICAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKGwpOworICAgICAgICB9CisgICAgfQorICAgIC8qIFhYWFggU2hvdWxkIHJldHVybiBhcyBDRlR5cGVSZWYsIHJlYWxseS4uLiAqLworICAgIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogVW5zdXJlIC0gUmV0dXJuIHVuaWNvZGUgb3IgOCBiaXQgc3RyaW5ncz8gKi8KIFB5T2JqZWN0ICoKIFB5Q0ZfQ0YyUHl0aG9uX3N0cmluZyhDRlN0cmluZ1JlZiBzcmMpIHsKLQlpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKHNyYykrMTsKLQlQeV9VTklDT0RFICpkYXRhID0gbWFsbG9jKHNpemUqc2l6ZW9mKFB5X1VOSUNPREUpKTsKLQlDRlJhbmdlIHJhbmdlOwotCVB5T2JqZWN0ICpydjsKKyAgICBpbnQgc2l6ZSA9IENGU3RyaW5nR2V0TGVuZ3RoKHNyYykrMTsKKyAgICBQeV9VTklDT0RFICpkYXRhID0gbWFsbG9jKHNpemUqc2l6ZW9mKFB5X1VOSUNPREUpKTsKKyAgICBDRlJhbmdlIHJhbmdlOworICAgIFB5T2JqZWN0ICpydjsKIAotCXJhbmdlLmxvY2F0aW9uID0gMDsKLQlyYW5nZS5sZW5ndGggPSBzaXplOwotCWlmKCBkYXRhID09IE5VTEwgKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlDRlN0cmluZ0dldENoYXJhY3RlcnMoc3JjLCByYW5nZSwgZGF0YSk7Ci0JcnYgPSAoUHlPYmplY3QgKilQeVVuaWNvZGVfRnJvbVVuaWNvZGUoZGF0YSwgc2l6ZS0xKTsKLQlmcmVlKGRhdGEpOwotCXJldHVybiBydjsKKyAgICByYW5nZS5sb2NhdGlvbiA9IDA7CisgICAgcmFuZ2UubGVuZ3RoID0gc2l6ZTsKKyAgICBpZiggZGF0YSA9PSBOVUxMICkgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJzKHNyYywgcmFuZ2UsIGRhdGEpOworICAgIHJ2ID0gKFB5T2JqZWN0ICopUHlVbmljb2RlX0Zyb21Vbmljb2RlKGRhdGEsIHNpemUtMSk7CisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE0NiwxNTggKzE0NiwxNTggQEAKIGludAogUHlDRl9QeXRob24yQ0YoUHlPYmplY3QgKnNyYywgQ0ZUeXBlUmVmICpkc3QpIHsKIAotCWlmIChQeVN0cmluZ19DaGVjayhzcmMpIHx8IFB5VW5pY29kZV9DaGVjayhzcmMpKQotCQlyZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2ltcGxlKHNyYywgZHN0KTsKLQlpZiAoUHlTZXF1ZW5jZV9DaGVjayhzcmMpKQotCQlyZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2VxdWVuY2Uoc3JjLCAoQ0ZBcnJheVJlZiAqKWRzdCk7Ci0JaWYgKFB5TWFwcGluZ19DaGVjayhzcmMpKQotCQlyZXR1cm4gUHlDRl9QeXRob24yQ0ZfbWFwcGluZyhzcmMsIChDRkRpY3Rpb25hcnlSZWYgKilkc3QpOwotCXJldHVybiBQeUNGX1B5dGhvbjJDRl9zaW1wbGUoc3JjLCBkc3QpOworICAgIGlmIChQeVN0cmluZ19DaGVjayhzcmMpIHx8IFB5VW5pY29kZV9DaGVjayhzcmMpKQorICAgICAgICByZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2ltcGxlKHNyYywgZHN0KTsKKyAgICBpZiAoUHlTZXF1ZW5jZV9DaGVjayhzcmMpKQorICAgICAgICByZXR1cm4gUHlDRl9QeXRob24yQ0Zfc2VxdWVuY2Uoc3JjLCAoQ0ZBcnJheVJlZiAqKWRzdCk7CisgICAgaWYgKFB5TWFwcGluZ19DaGVjayhzcmMpKQorICAgICAgICByZXR1cm4gUHlDRl9QeXRob24yQ0ZfbWFwcGluZyhzcmMsIChDRkRpY3Rpb25hcnlSZWYgKilkc3QpOworICAgIHJldHVybiBQeUNGX1B5dGhvbjJDRl9zaW1wbGUoc3JjLCBkc3QpOwogfQogCiBpbnQKIFB5Q0ZfUHl0aG9uMkNGX3NlcXVlbmNlKFB5T2JqZWN0ICpzcmMsIENGQXJyYXlSZWYgKmRzdCkgewotCUNGTXV0YWJsZUFycmF5UmVmIHJ2ID0gTlVMTDsKLQlDRlR5cGVSZWYgaXRlbV9jZiA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMOwotCWludCBzaXplLCBpOwotCQotCWlmKCAhUHlTZXF1ZW5jZV9DaGVjayhzcmMpICkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGQXJyYXkiLAotCQkJc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXNpemUgPSBQeVNlcXVlbmNlX1NpemUoc3JjKTsKLQlydiA9IENGQXJyYXlDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLCBzaXplLCAma0NGVHlwZUFycmF5Q2FsbEJhY2tzKTsKLQlpZiAocnYgPT0gTlVMTCkgewotCQlQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IAotCQlnb3RvIGVycjsKLQl9CisgICAgQ0ZNdXRhYmxlQXJyYXlSZWYgcnYgPSBOVUxMOworICAgIENGVHlwZVJlZiBpdGVtX2NmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXRlbV9weSA9IE5VTEw7CisgICAgaW50IHNpemUsIGk7CiAKLQlmb3IoIGk9MDsgaTxzaXplOyBpKyspIHsKLQkJaXRlbV9weSA9IFB5U2VxdWVuY2VfR2V0SXRlbShzcmMsIGkpOwotCQlpZiAoaXRlbV9weSA9PSBOVUxMKSBnb3RvIGVycjsKLQkJaWYgKCAhUHlDRl9QeXRob24yQ0YoaXRlbV9weSwgJml0ZW1fY2YpKSBnb3RvIGVycjsKLQkJUHlfREVDUkVGKGl0ZW1fcHkpOwotCQlDRkFycmF5U2V0VmFsdWVBdEluZGV4KHJ2LCBpLCBpdGVtX2NmKTsKLQkJQ0ZSZWxlYXNlKGl0ZW1fY2YpOwotCQlpdGVtX2NmID0gTlVMTDsKLQl9Ci0JKmRzdCA9IHJ2OwotCXJldHVybiAxOworICAgIGlmKCAhUHlTZXF1ZW5jZV9DaGVjayhzcmMpICkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGQXJyYXkiLAorICAgICAgICAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNpemUgPSBQeVNlcXVlbmNlX1NpemUoc3JjKTsKKyAgICBydiA9IENGQXJyYXlDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLCBzaXplLCAma0NGVHlwZUFycmF5Q2FsbEJhY2tzKTsKKyAgICBpZiAocnYgPT0gTlVMTCkgeworICAgICAgICBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGZvciggaT0wOyBpPHNpemU7IGkrKykgeworICAgICAgICBpdGVtX3B5ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHNyYywgaSk7CisgICAgICAgIGlmIChpdGVtX3B5ID09IE5VTEwpIGdvdG8gZXJyOworICAgICAgICBpZiAoICFQeUNGX1B5dGhvbjJDRihpdGVtX3B5LCAmaXRlbV9jZikpIGdvdG8gZXJyOworICAgICAgICBQeV9ERUNSRUYoaXRlbV9weSk7CisgICAgICAgIENGQXJyYXlTZXRWYWx1ZUF0SW5kZXgocnYsIGksIGl0ZW1fY2YpOworICAgICAgICBDRlJlbGVhc2UoaXRlbV9jZik7CisgICAgICAgIGl0ZW1fY2YgPSBOVUxMOworICAgIH0KKyAgICAqZHN0ID0gcnY7CisgICAgcmV0dXJuIDE7CiBlcnI6Ci0JUHlfWERFQ1JFRihpdGVtX3B5KTsKLQlpZiAocnYpIENGUmVsZWFzZShydik7Ci0JaWYgKGl0ZW1fY2YpIENGUmVsZWFzZShpdGVtX2NmKTsKLQlyZXR1cm4gMDsJCQorICAgIFB5X1hERUNSRUYoaXRlbV9weSk7CisgICAgaWYgKHJ2KSBDRlJlbGVhc2UocnYpOworICAgIGlmIChpdGVtX2NmKSBDRlJlbGVhc2UoaXRlbV9jZik7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAogUHlDRl9QeXRob24yQ0ZfbWFwcGluZyhQeU9iamVjdCAqc3JjLCBDRkRpY3Rpb25hcnlSZWYgKmRzdCkgewotCUNGTXV0YWJsZURpY3Rpb25hcnlSZWYgcnYgPSBOVUxMOwotCVB5T2JqZWN0ICphc2xpc3QgPSBOVUxMOwotCUNGVHlwZVJlZiBrZXlfY2YgPSBOVUxMLCB2YWx1ZV9jZiA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZW1fcHkgPSBOVUxMLCAqa2V5X3B5ID0gTlVMTCwgKnZhbHVlX3B5ID0gTlVMTDsKLQlpbnQgc2l6ZSwgaTsKLQkKLQlpZiggIVB5TWFwcGluZ19DaGVjayhzcmMpICkgewotCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkJIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGRGljdGlvbmFyeSIsCi0JCQlzcmMtPm9iX3R5cGUtPnRwX25hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc2l6ZSA9IFB5TWFwcGluZ19TaXplKHNyYyk7Ci0JcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLCBzaXplLAotCQkJCQkma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7Ci0JaWYgKHJ2ID09IE5VTEwpIHsKLQkJUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyAKLQkJZ290byBlcnI7Ci0JfQotCWlmICggKGFzbGlzdCA9IFB5TWFwcGluZ19JdGVtcyhzcmMpKSA9PSBOVUxMICkgZ290byBlcnI7CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBydiA9IE5VTEw7CisgICAgUHlPYmplY3QgKmFzbGlzdCA9IE5VTEw7CisgICAgQ0ZUeXBlUmVmIGtleV9jZiA9IE5VTEwsIHZhbHVlX2NmID0gTlVMTDsKKyAgICBQeU9iamVjdCAqaXRlbV9weSA9IE5VTEwsICprZXlfcHkgPSBOVUxMLCAqdmFsdWVfcHkgPSBOVUxMOworICAgIGludCBzaXplLCBpOwogCi0JZm9yKCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0JCWl0ZW1fcHkgPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXNsaXN0LCBpKTsKLQkJaWYgKGl0ZW1fcHkgPT0gTlVMTCkgZ290byBlcnI7Ci0JCWlmICghUHlBcmdfUGFyc2VUdXBsZShpdGVtX3B5LCAiT08iLCAma2V5X3B5LCAmdmFsdWVfcHkpKSBnb3RvIGVycjsKLQkJaWYgKCAhUHlDRl9QeXRob24yQ0Yoa2V5X3B5LCAma2V5X2NmKSApIGdvdG8gZXJyOwotCQlpZiAoICFQeUNGX1B5dGhvbjJDRih2YWx1ZV9weSwgJnZhbHVlX2NmKSApIGdvdG8gZXJyOwotCQlDRkRpY3Rpb25hcnlBZGRWYWx1ZShydiwga2V5X2NmLCB2YWx1ZV9jZik7Ci0JCUNGUmVsZWFzZShrZXlfY2YpOwotCQlrZXlfY2YgPSBOVUxMOwotCQlDRlJlbGVhc2UodmFsdWVfY2YpOwotCQl2YWx1ZV9jZiA9IE5VTEw7Ci0JfQotCSpkc3QgPSBydjsKLQlyZXR1cm4gMTsKKyAgICBpZiggIVB5TWFwcGluZ19DaGVjayhzcmMpICkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgIkNhbm5vdCBjb252ZXJ0ICUuNTAwcyBvYmplY3RzIHRvIENGRGljdGlvbmFyeSIsCisgICAgICAgICAgICBzcmMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2l6ZSA9IFB5TWFwcGluZ19TaXplKHNyYyk7CisgICAgcnYgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKChDRkFsbG9jYXRvclJlZilOVUxMLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOworICAgIGlmIChydiA9PSBOVUxMKSB7CisgICAgICAgIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorICAgIGlmICggKGFzbGlzdCA9IFB5TWFwcGluZ19JdGVtcyhzcmMpKSA9PSBOVUxMICkgZ290byBlcnI7CisKKyAgICBmb3IoIGk9MDsgaTxzaXplOyBpKyspIHsKKyAgICAgICAgaXRlbV9weSA9IFB5U2VxdWVuY2VfR2V0SXRlbShhc2xpc3QsIGkpOworICAgICAgICBpZiAoaXRlbV9weSA9PSBOVUxMKSBnb3RvIGVycjsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGl0ZW1fcHksICJPTyIsICZrZXlfcHksICZ2YWx1ZV9weSkpIGdvdG8gZXJyOworICAgICAgICBpZiAoICFQeUNGX1B5dGhvbjJDRihrZXlfcHksICZrZXlfY2YpICkgZ290byBlcnI7CisgICAgICAgIGlmICggIVB5Q0ZfUHl0aG9uMkNGKHZhbHVlX3B5LCAmdmFsdWVfY2YpICkgZ290byBlcnI7CisgICAgICAgIENGRGljdGlvbmFyeUFkZFZhbHVlKHJ2LCBrZXlfY2YsIHZhbHVlX2NmKTsKKyAgICAgICAgQ0ZSZWxlYXNlKGtleV9jZik7CisgICAgICAgIGtleV9jZiA9IE5VTEw7CisgICAgICAgIENGUmVsZWFzZSh2YWx1ZV9jZik7CisgICAgICAgIHZhbHVlX2NmID0gTlVMTDsKKyAgICB9CisgICAgKmRzdCA9IHJ2OworICAgIHJldHVybiAxOwogZXJyOgotCVB5X1hERUNSRUYoaXRlbV9weSk7Ci0JUHlfWERFQ1JFRihhc2xpc3QpOwotCWlmIChydikgQ0ZSZWxlYXNlKHJ2KTsKLQlpZiAoa2V5X2NmKSBDRlJlbGVhc2Uoa2V5X2NmKTsKLQlpZiAodmFsdWVfY2YpIENGUmVsZWFzZSh2YWx1ZV9jZik7Ci0JcmV0dXJuIDA7CQkKKyAgICBQeV9YREVDUkVGKGl0ZW1fcHkpOworICAgIFB5X1hERUNSRUYoYXNsaXN0KTsKKyAgICBpZiAocnYpIENGUmVsZWFzZShydik7CisgICAgaWYgKGtleV9jZikgQ0ZSZWxlYXNlKGtleV9jZik7CisgICAgaWYgKHZhbHVlX2NmKSBDRlJlbGVhc2UodmFsdWVfY2YpOworICAgIHJldHVybiAwOwogfQogCiBpbnQKIFB5Q0ZfUHl0aG9uMkNGX3NpbXBsZShQeU9iamVjdCAqc3JjLCBDRlR5cGVSZWYgKmRzdCkgewotCQorCiAjaWYgMAotCWlmIChQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHNyYywgIkNGVHlwZSIpKSB7Ci0JCSpkc3QgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHNyYywgIkNGVHlwZSIsICIiKTsKLQkJcmV0dXJuICgqZHN0ICE9IE5VTEwpOwotCX0KKyAgICBpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhzcmMsICJDRlR5cGUiKSkgeworICAgICAgICAqZHN0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChzcmMsICJDRlR5cGUiLCAiIik7CisgICAgICAgIHJldHVybiAoKmRzdCAhPSBOVUxMKTsKKyAgICB9CiAjZW5kaWYKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVVuaWNvZGVfQ2hlY2soc3JjKSkgCi0JCXJldHVybiBQeUNGX1B5dGhvbjJDRl9zdHJpbmcoc3JjLCAoQ0ZTdHJpbmdSZWYgKilkc3QpOwotCWlmIChQeUJvb2xfQ2hlY2soc3JjKSkgewotCQlpZiAoc3JjID09IFB5X1RydWUpCi0JCQkqZHN0ID0ga0NGQm9vbGVhblRydWU7Ci0JCWVsc2UKLQkJCSpkc3QgPSBrQ0ZCb29sZWFuRmFsc2U7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoUHlJbnRfQ2hlY2soc3JjKSkgewotCQlsb25nIHYgPSBQeUludF9Bc0xvbmcoc3JjKTsKLQkJKmRzdCA9IENGTnVtYmVyQ3JlYXRlKE5VTEwsIGtDRk51bWJlckxvbmdUeXBlLCAmdik7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoUHlGbG9hdF9DaGVjayhzcmMpKSB7Ci0JCWRvdWJsZSBkID0gUHlGbG9hdF9Bc0RvdWJsZShzcmMpOwotCQkqZHN0ID0gQ0ZOdW1iZXJDcmVhdGUoTlVMTCwga0NGTnVtYmVyRG91YmxlVHlwZSwgJmQpOwotCQlyZXR1cm4gMTsKLQl9Ci0JCQkKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotCQkgICJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRlR5cGUiLAotCQkJCSAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSB8fCBQeVVuaWNvZGVfQ2hlY2soc3JjKSkKKyAgICAgICAgcmV0dXJuIFB5Q0ZfUHl0aG9uMkNGX3N0cmluZyhzcmMsIChDRlN0cmluZ1JlZiAqKWRzdCk7CisgICAgaWYgKFB5Qm9vbF9DaGVjayhzcmMpKSB7CisgICAgICAgIGlmIChzcmMgPT0gUHlfVHJ1ZSkKKyAgICAgICAgICAgICpkc3QgPSBrQ0ZCb29sZWFuVHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmRzdCA9IGtDRkJvb2xlYW5GYWxzZTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChQeUludF9DaGVjayhzcmMpKSB7CisgICAgICAgIGxvbmcgdiA9IFB5SW50X0FzTG9uZyhzcmMpOworICAgICAgICAqZHN0ID0gQ0ZOdW1iZXJDcmVhdGUoTlVMTCwga0NGTnVtYmVyTG9uZ1R5cGUsICZ2KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChQeUZsb2F0X0NoZWNrKHNyYykpIHsKKyAgICAgICAgZG91YmxlIGQgPSBQeUZsb2F0X0FzRG91YmxlKHNyYyk7CisgICAgICAgICpkc3QgPSBDRk51bWJlckNyZWF0ZShOVUxMLCBrQ0ZOdW1iZXJEb3VibGVUeXBlLCAmZCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICJDYW5ub3QgY29udmVydCAlLjUwMHMgb2JqZWN0cyB0byBDRlR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeUNGX1B5dGhvbjJDRl9zdHJpbmcoUHlPYmplY3QgKnNyYywgQ0ZTdHJpbmdSZWYgKmRzdCkgewotCWNoYXIgKmNoYXJzOwotCUNGSW5kZXggc2l6ZTsKLQlVbmlDaGFyICp1bmljaGFyczsKLQkKLQlpZiAoUHlTdHJpbmdfQ2hlY2soc3JjKSkgewotCQlpZiAoIVB5QXJnX1BhcnNlKHNyYywgImVzIiwgImFzY2lpIiwgJmNoYXJzKSkKLQkJCXJldHVybiAwOyAvKiBUaGlzIGVycm9yIGlzIG1vcmUgZGVzY3JpcHRpdmUgdGhhbiB0aGUgZ2VuZXJhbCBvbmUgYmVsb3cgKi8KLQkJKmRzdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsIGNoYXJzLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKLQkJUHlNZW1fRnJlZShjaGFycyk7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoUHlVbmljb2RlX0NoZWNrKHNyYykpIHsKLQkJLyogV2UgdXNlIHRoZSBDRiB0eXBlcyBoZXJlLCBpZiBQeXRob24gd2FzIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhdCB3aWxsIGdpdmUgYW4gZXJyb3IgKi8KLQkJc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHNyYyk7Ci0JCWlmICgodW5pY2hhcnMgPSBQeVVuaWNvZGVfQXNVbmljb2RlKHNyYykpID09IE5VTEwgKSBnb3RvIGVycjsKLQkJKmRzdCA9IENGU3RyaW5nQ3JlYXRlV2l0aENoYXJhY3RlcnMoKENGQWxsb2NhdG9yUmVmKU5VTEwsIHVuaWNoYXJzLCBzaXplKTsKLQkJcmV0dXJuIDE7Ci0JfQorICAgIGNoYXIgKmNoYXJzOworICAgIENGSW5kZXggc2l6ZTsKKyAgICBVbmlDaGFyICp1bmljaGFyczsKKworICAgIGlmIChQeVN0cmluZ19DaGVjayhzcmMpKSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2Uoc3JjLCAiZXMiLCAiYXNjaWkiLCAmY2hhcnMpKQorICAgICAgICAgICAgcmV0dXJuIDA7IC8qIFRoaXMgZXJyb3IgaXMgbW9yZSBkZXNjcmlwdGl2ZSB0aGFuIHRoZSBnZW5lcmFsIG9uZSBiZWxvdyAqLworICAgICAgICAqZHN0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgY2hhcnMsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpOworICAgICAgICBQeU1lbV9GcmVlKGNoYXJzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc3JjKSkgeworICAgICAgICAvKiBXZSB1c2UgdGhlIENGIHR5cGVzIGhlcmUsIGlmIFB5dGhvbiB3YXMgY29uZmlndXJlZCBkaWZmZXJlbnRseSB0aGF0IHdpbGwgZ2l2ZSBhbiBlcnJvciAqLworICAgICAgICBzaXplID0gUHlVbmljb2RlX0dldFNpemUoc3JjKTsKKyAgICAgICAgaWYgKCh1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUoc3JjKSkgPT0gTlVMTCApIGdvdG8gZXJyOworICAgICAgICAqZHN0ID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgdW5pY2hhcnMsIHNpemUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiBlcnI6Ci0JUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAiQ2Fubm90IGNvbnZlcnQgJS41MDBzIG9iamVjdHMgdG8gQ0ZTdHJpbmciLAotCQkJCSAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKLQlyZXR1cm4gMDsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJS41MDBzIG9iamVjdHMgdG8gQ0ZTdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuYyBiL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuYwppbmRleCBiYzI5NzZlLi45NTVhY2ZiIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmMKKysrIGIvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5jCkBAIC0xLDQ1ICsxLDQ1IEBACiAvKgotCUZpbGU6CQlDRk1MYXRlSW1wb3J0LmMKKyAgICBGaWxlOiAgICAgICAgICAgICAgIENGTUxhdGVJbXBvcnQuYwogCi0JQ29udGFpbnM6CUltcGxlbWVudGF0aW9uIG9mIENGTSBsYXRlIGltcG9ydCBsaWJyYXJ5LgorICAgIENvbnRhaW5zOiAgICAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgQ0ZNIGxhdGUgaW1wb3J0IGxpYnJhcnkuCiAKLQlXcml0dGVuIGJ5OglRdWlubgorICAgIFdyaXR0ZW4gYnk6ICAgICAgICAgUXVpbm4KIAotCUNvcHlyaWdodDoJQ29weXJpZ2h0IKkgMTk5OSBieSBBcHBsZSBDb21wdXRlciwgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICBDb3B5cmlnaHQ6ICAgICAgICAgIENvcHlyaWdodCCpIDE5OTkgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKLQkJCQlZb3UgbWF5IGluY29ycG9yYXRlIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGludG8geW91ciBwcm9ncmFtKHMpIHdpdGhvdXQKLQkJCQlyZXN0cmljdGlvbi4gVGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaGFzIGJlZW4gcHJvdmlkZWQgIkFTIElTIiBhbmQgdGhlCi0JCQkJcmVzcG9uc2liaWxpdHkgZm9yIGl0cyBvcGVyYXRpb24gaXMgeW91cnMuIFlvdSBhcmUgbm90IHBlcm1pdHRlZCB0byByZWRpc3RyaWJ1dGUKLQkJCQl0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBhcyAiQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIiBhZnRlciBoYXZpbmcgbWFkZQotCQkJCWNoYW5nZXMuIElmIHlvdSdyZSBnb2luZyB0byByZS1kaXN0cmlidXRlIHRoZSBzb3VyY2UsIHdlIHJlcXVpcmUgdGhhdCB5b3UgbWFrZQotCQkJCWl0IGNsZWFyIGluIHRoZSBzb3VyY2UgdGhhdCB0aGUgY29kZSB3YXMgZGVzY2VuZGVkIGZyb20gQXBwbGUgc2FtcGxlIHNvdXJjZQotCQkJCWNvZGUsIGJ1dCB0aGF0IHlvdSd2ZSBtYWRlIGNoYW5nZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBpbmNvcnBvcmF0ZSB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBpbnRvIHlvdXIgcHJvZ3JhbShzKSB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdHJpY3Rpb24uIFRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHByb3ZpZGVkICJBUyBJUyIgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3BlcmF0aW9uIGlzIHlvdXJzLiBZb3UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gcmVkaXN0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgYXMgIkFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSIgYWZ0ZXIgaGF2aW5nIG1hZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLiBJZiB5b3UncmUgZ29pbmcgdG8gcmUtZGlzdHJpYnV0ZSB0aGUgc291cmNlLCB3ZSByZXF1aXJlIHRoYXQgeW91IG1ha2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBjbGVhciBpbiB0aGUgc291cmNlIHRoYXQgdGhlIGNvZGUgd2FzIGRlc2NlbmRlZCBmcm9tIEFwcGxlIHNhbXBsZSBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLCBidXQgdGhhdCB5b3UndmUgbWFkZSBjaGFuZ2VzLgogCi0JQ2hhbmdlIEhpc3RvcnkgKG1vc3QgcmVjZW50IGZpcnN0KToKKyAgICBDaGFuZ2UgSGlzdG9yeSAobW9zdCByZWNlbnQgZmlyc3QpOgogCi0gICAgICAgIDwxMz4gICAgIDI0LzkvMDEgICAgUXVpbm4gICBGaXhlcyB0byBjb21waWxlIHdpdGggQysrIGFjdGl2YXRlZC4KLSAgICAgICAgPDEyPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIFsyNzEwNDg5XSBGaXggdHlwbyBpbiB0aGUgY29tbWVudHMgZm9yIEZyYWdtZW50TG9va3VwLgotICAgICAgICA8MTE+ICAgICAyMS85LzAxICAgIFF1aW5uICAgQ2hhbmdlcyBmb3IgQ1dQcm83IE1hY2gtTyBidWlsZC4KLSAgICAgICAgPDEwPiAgICAgMTkvOS8wMSAgICBRdWlubiAgIENvcnJlY3RlZCBpbXBsZW1lbnRhdGlvbiBvZiBrUEVGUmVsb2NTbUJ5U2VjdGlvbi4gQWRkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBvZiBrUEVGUmVsb2NTZXRQb3NpdGlvbiBhbmQga1BFRlJlbG9jTGdCeUltcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyb20gY29kZSBjb250cmlidXRlZCBieSBFcmljIEdyYW50LCBOZWQgSG9sYnJvb2ssIGFuZCBTdGV2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2Fsa3dhcmYpLCBhbHRob3VnaCBJIGNhbid0IHRlc3QgdGhlbSB5ZXQuCi0gICAgICAgICA8OT4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBXZSBub3cgaGFuZGxlIHVucGFja2VkIGRhdGEgc2VjdGlvbnMsIGNvdXJ0ZXN5IG9mIHNvbWUgY29kZSBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZWQgSG9sYnJvb2suCi0gICAgICAgICA8OD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBNaW5vciBmaXhlcyBmb3IgdGhlIHByZXZpb3VzIGNoZWNraW4uIFVwZGF0ZWQgc29tZSBjb21tZW50cyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxlZCBzb21lIGRlYWQgY29kZS4KLSAgICAgICAgIDw3PiAgICAgMTkvOS8wMSAgICBRdWlubiAgIFNpbXBsaWZpZWQgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBhZnRlciBhIHN1Z2dlc3Rpb24gYnkgRXJpYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbnQuIFlvdSBubyBsb25nZXIgaGF2ZSB0byBDRk0gZXhwb3J0IGEgZHVtbXkgZnVuY3Rpb247IHlvdQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGp1c3QgcGFzcyBpbiB0aGUgYWRkcmVzcyBvZiB5b3VyIGZyYWdtZW50J3MgaW5pdCByb3V0aW5lLgotICAgICAgICAgPDY+ICAgICAxNS8yLzAxICAgIFF1aW5uICAgTW9kaWZ5IGNvbXBpbGUtdGltZSB3YXJuaW5ncyB0byBjb21wbGFpbiBpZiB5b3UgdHJ5IHRvIGJ1aWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1vZHVsZSBpbnRvIGEgTWFjaC1PIGJpbmFyeS4KLSAgICAgICAgIDw1PiAgICAgIDUvMi8wMSAgICBRdWlubiAgIFJlbW92ZWQgcmVkdW5kYW50IGFzc2lnbm1lbnQgaW4gQ0ZNTGF0ZUltcG9ydENvcmUuCi0gICAgICAgICA8ND4gICAgMzAvMTEvMDAgICAgUXVpbm4gICBBZGRlZCBjb21tZW50IGFib3V0IGZ1dHVyZSBvZiBkYXRhIHN5bWJvbHMgaW4gQ0YuCi0gICAgICAgICA8Mz4gICAgMTYvMTEvMDAgICAgUXVpbm4gICBBbGxvdyBzeW1ib2wgZmluZGluZyB2aWEgYSBjYWxsYmFjayBhbmQgdXNlIHRoYXQgdG8gaW1wbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZSBzdXBwb3J0LgotICAgICAgICAgPDI+ICAgIDE4LzEwLzk5ICAgIFF1aW5uICAgUmVuYW1lZCBDRk1MYXRlSW1wb3J0IHRvIENGTUxhdGVJbXBvcnRMaWJyYXJ5IHRvIGFsbG93IGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZnV0dXJlIEFQSSBleHBhbnNpb24uCi0gICAgICAgICA8MT4gICAgIDE1LzYvOTkgICAgUXVpbm4gICBGaXJzdCBjaGVja2VkIGluLgorICAgIDwxMz4gICAgIDI0LzkvMDEgICAgUXVpbm4gICBGaXhlcyB0byBjb21waWxlIHdpdGggQysrIGFjdGl2YXRlZC4KKyAgICA8MTI+ICAgICAyMS85LzAxICAgIFF1aW5uICAgWzI3MTA0ODldIEZpeCB0eXBvIGluIHRoZSBjb21tZW50cyBmb3IgRnJhZ21lbnRMb29rdXAuCisgICAgPDExPiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCisgICAgPDEwPiAgICAgMTkvOS8wMSAgICBRdWlubiAgIENvcnJlY3RlZCBpbXBsZW1lbnRhdGlvbiBvZiBrUEVGUmVsb2NTbUJ5U2VjdGlvbi4gQWRkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIG9mIGtQRUZSZWxvY1NldFBvc2l0aW9uIGFuZCBrUEVGUmVsb2NMZ0J5SW1wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tIGNvZGUgY29udHJpYnV0ZWQgYnkgRXJpYyBHcmFudCwgTmVkIEhvbGJyb29rLCBhbmQgU3RldmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2Fsa3dhcmYpLCBhbHRob3VnaCBJIGNhbid0IHRlc3QgdGhlbSB5ZXQuCisgICAgIDw5PiAgICAgMTkvOS8wMSAgICBRdWlubiAgIFdlIG5vdyBoYW5kbGUgdW5wYWNrZWQgZGF0YSBzZWN0aW9ucywgY291cnRlc3kgb2Ygc29tZSBjb2RlIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVkIEhvbGJyb29rLgorICAgICA8OD4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBNaW5vciBmaXhlcyBmb3IgdGhlIHByZXZpb3VzIGNoZWNraW4uIFVwZGF0ZWQgc29tZSBjb21tZW50cyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lsbGVkIHNvbWUgZGVhZCBjb2RlLgorICAgICA8Nz4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBTaW1wbGlmaWVkIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEVyaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbnQuIFlvdSBubyBsb25nZXIgaGF2ZSB0byBDRk0gZXhwb3J0IGEgZHVtbXkgZnVuY3Rpb247IHlvdQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4ganVzdCBwYXNzIGluIHRoZSBhZGRyZXNzIG9mIHlvdXIgZnJhZ21lbnQncyBpbml0IHJvdXRpbmUuCisgICAgIDw2PiAgICAgMTUvMi8wMSAgICBRdWlubiAgIE1vZGlmeSBjb21waWxlLXRpbWUgd2FybmluZ3MgdG8gY29tcGxhaW4gaWYgeW91IHRyeSB0byBidWlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1vZHVsZSBpbnRvIGEgTWFjaC1PIGJpbmFyeS4KKyAgICAgPDU+ICAgICAgNS8yLzAxICAgIFF1aW5uICAgUmVtb3ZlZCByZWR1bmRhbnQgYXNzaWdubWVudCBpbiBDRk1MYXRlSW1wb3J0Q29yZS4KKyAgICAgPDQ+ICAgIDMwLzExLzAwICAgIFF1aW5uICAgQWRkZWQgY29tbWVudCBhYm91dCBmdXR1cmUgb2YgZGF0YSBzeW1ib2xzIGluIENGLgorICAgICA8Mz4gICAgMTYvMTEvMDAgICAgUXVpbm4gICBBbGxvdyBzeW1ib2wgZmluZGluZyB2aWEgYSBjYWxsYmFjayBhbmQgdXNlIHRoYXQgdG8gaW1wbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGQnVuZGxlIHN1cHBvcnQuCisgICAgIDwyPiAgICAxOC8xMC85OSAgICBRdWlubiAgIFJlbmFtZWQgQ0ZNTGF0ZUltcG9ydCB0byBDRk1MYXRlSW1wb3J0TGlicmFyeSB0byBhbGxvdyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZnV0dXJlIEFQSSBleHBhbnNpb24uCisgICAgIDwxPiAgICAgMTUvNi85OSAgICBRdWlubiAgIEZpcnN0IGNoZWNrZWQgaW4uCiAqLwogCiAvLyBUbyBEbyBMaXN0OgpAQCAtNjYsOCArNjYsOCBAQAogLy8gTWFjIE9TIEludGVyZmFjZXMKIAogI2lmICEgTU9SRV9GUkFNRVdPUktfSU5DTFVERVMKLQkjaW5jbHVkZSA8Q29kZUZyYWdtZW50cy5oPgotCSNpbmNsdWRlIDxQRUZCaW5hcnlGb3JtYXQuaD4KKyAgICAjaW5jbHVkZSA8Q29kZUZyYWdtZW50cy5oPgorICAgICNpbmNsdWRlIDxQRUZCaW5hcnlGb3JtYXQuaD4KICNlbmRpZgogCiAvLyBTdGFuZGFyZCBDIEludGVyZmFjZXMKQEAgLTg2LDMyICs4NiwzMiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogI2lmIFRBUkdFVF9SVF9NQUNfTUFDSE8KLQkjZXJyb3IgQ0ZNTGF0ZUltcG9ydCBpcyBub3Qgc3VpdGFibGUgZm9yIHVzZSBpbiBhIE1hY2gtTyBwcm9qZWN0LgorICAgICNlcnJvciBDRk1MYXRlSW1wb3J0IGlzIG5vdCBzdWl0YWJsZSBmb3IgdXNlIGluIGEgTWFjaC1PIHByb2plY3QuCiAjZWxpZiAhVEFSR0VUX1JUX01BQ19DRk0gfHwgIVRBUkdFVF9DUFVfUFBDCi0JI2Vycm9yIENGTUxhdGVJbXBvcnQgaGFzIG5vdCBiZWVuIHF1YWxpZmllZCBmb3IgNjhLIG9yIENGTS02OEsgdXNlLgorICAgICNlcnJvciBDRk1MYXRlSW1wb3J0IGhhcyBub3QgYmVlbiBxdWFsaWZpZWQgZm9yIDY4SyBvciBDRk0tNjhLIHVzZS4KICNlbmRpZgogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogI3ByYWdtYSBtYXJrIC0tLS0tIFV0aWxpdHkgUm91dGluZXMgLS0tLS0KIAogc3RhdGljIE9TU3RhdHVzIEZTUmVhZEF0T2Zmc2V0KFNJbnQxNiByZWZOdW0sIFNJbnQzMiBvZmZzZXQsIFNJbnQzMiBjb3VudCwgdm9pZCAqYnVmZmVyKQotCS8vIEEgY29udmVuaWVudCB3cmFwcGVyIGFyb3VuZCBQQlJlYWQgd2hpY2ggaGFzIHR3byBhZHZhbnRhZ2VzCi0JLy8gb3ZlciBGU1JlYWQuICBGaXJzdCwgaXQgdGFrZXMgY291bnQgYXMgYSB2YWx1ZSBwYXJhbWV0ZXIuCi0JLy8gU2Vjb25kLCBpdCByZWFkcyBmcm9tIGFuIGFyYml0cmFyeSBvZmZzZXQgaW50byB0aGUgZmlsZSwKLQkvLyB3aGljaCBhdm9pZHMgYSBidW5jaCBvZiBTZXRGUG9zIGNhbGxzLgotCS8vCi0JLy8gSSBndWVzcyB0aGlzIHNob3VsZCBnbyBpbnRvICJNb3JlRmlsZXMuaCIsIGJ1dCBJJ20gbm90IHN1cmUKLQkvLyBob3cgd2UncmUgZ29pbmcgdG8gaW50ZWdyYXRlIHN1Y2ggYSBjb25jZXB0IGludG8gTUlCIHlldC4KKyAgICAvLyBBIGNvbnZlbmllbnQgd3JhcHBlciBhcm91bmQgUEJSZWFkIHdoaWNoIGhhcyB0d28gYWR2YW50YWdlcworICAgIC8vIG92ZXIgRlNSZWFkLiAgRmlyc3QsIGl0IHRha2VzIGNvdW50IGFzIGEgdmFsdWUgcGFyYW1ldGVyLgorICAgIC8vIFNlY29uZCwgaXQgcmVhZHMgZnJvbSBhbiBhcmJpdHJhcnkgb2Zmc2V0IGludG8gdGhlIGZpbGUsCisgICAgLy8gd2hpY2ggYXZvaWRzIGEgYnVuY2ggb2YgU2V0RlBvcyBjYWxscy4KKyAgICAvLworICAgIC8vIEkgZ3Vlc3MgdGhpcyBzaG91bGQgZ28gaW50byAiTW9yZUZpbGVzLmgiLCBidXQgSSdtIG5vdCBzdXJlCisgICAgLy8gaG93IHdlJ3JlIGdvaW5nIHRvIGludGVncmF0ZSBzdWNoIGEgY29uY2VwdCBpbnRvIE1JQiB5ZXQuCiB7Ci0JUGFyYW1CbG9ja1JlYyBwYjsKLQkKLQlwYi5pb1BhcmFtLmlvUmVmTnVtICAgICA9IHJlZk51bTsKLQlwYi5pb1BhcmFtLmlvQnVmZmVyICAgICA9IChQdHIpIGJ1ZmZlcjsKLQlwYi5pb1BhcmFtLmlvUmVxQ291bnQgICA9IGNvdW50OwotCXBiLmlvUGFyYW0uaW9Qb3NNb2RlICAgID0gZnNGcm9tU3RhcnQ7Ci0JcGIuaW9QYXJhbS5pb1Bvc09mZnNldCAgPSBvZmZzZXQ7Ci0JCi0JcmV0dXJuIFBCUmVhZFN5bmMoJnBiKTsKKyAgICBQYXJhbUJsb2NrUmVjIHBiOworCisgICAgcGIuaW9QYXJhbS5pb1JlZk51bSAgICAgPSByZWZOdW07CisgICAgcGIuaW9QYXJhbS5pb0J1ZmZlciAgICAgPSAoUHRyKSBidWZmZXI7CisgICAgcGIuaW9QYXJhbS5pb1JlcUNvdW50ICAgPSBjb3VudDsKKyAgICBwYi5pb1BhcmFtLmlvUG9zTW9kZSAgICA9IGZzRnJvbVN0YXJ0OworICAgIHBiLmlvUGFyYW0uaW9Qb3NPZmZzZXQgID0gb2Zmc2V0OworCisgICAgcmV0dXJuIFBCUmVhZFN5bmMoJnBiKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTEyNCwxNiArMTI0LDE2IEBACiAvLyB3ZSBmaWxsIG91dCBtb3JlIGZpZWxkcy4KIAogc3RydWN0IEZyYWdUb0ZpeEluZm8gewotCUNGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvcglsb2NhdG9yOwkJCQkvLyBIb3cgdG8gZmluZCB0aGUgZnJhZ21lbnQncyBjb250YWluZXIuCi0JQ0ZyYWdDb25uZWN0aW9uSUQgCQkJY29ubklEOwkJCQkJLy8gQ0ZNIGNvbm5lY3Rpb24gdG8gdGhlIGZyYWdtZW50LgotCUNGcmFnSW5pdEZ1bmN0aW9uIAkJCWluaXRSb3V0aW5lOwkJCS8vIFRoZSBDRk0gaW5pdCByb3V0aW5lIGZvciB0aGUgZnJhZ21lbnQuCi0JUEVGQ29udGFpbmVySGVhZGVyIAkJCWNvbnRhaW5lckhlYWRlcjsJCS8vIFRoZSBDRk0gaGVhZGVyLCByZWFkIGluIGZyb20gdGhlIGNvbnRhaW5lci4KLQlQRUZTZWN0aW9uSGVhZGVyCQkJKnNlY3Rpb25IZWFkZXJzOwkJLy8gVGhlIENGTSBzZWN0aW9uIGhlYWRlcnMuICBBIHBvaW50ZXIgYmxvY2sgY29udGFpbmluZyBhbiBhcnJheSBvZiBjb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50IGVsZW1lbnRzLgotCVBFRkxvYWRlckluZm9IZWFkZXIJCQkqbG9hZGVyU2VjdGlvbjsJCQkvLyBUaGUgZW50aXJlIENGTSBsb2FkZXIgc2VjdGlvbiBpbiBhIHBvaW50ZXIgYmxvY2suCi0JU0ludDE2CQkJCQkJZmlsZVJlZjsJCQkJLy8gQSByZWFkLW9ubHkgcGF0aCB0byB0aGUgQ0ZNIGNvbnRhaW5lci4gIFdlIGtlZXAgdGhpcyBoZXJlIGJlY2F1c2Ugb25lIHRoYXQgb25lIHJvdXRpbmUgbmVlZHMgdG8gcmVhZCBmcm9tIHRoZSBjb250YWluZXIuCi0Jdm9pZCAJCQkJCQkqc2VjdGlvbjBCYXNlOwkJCS8vIFRoZSBiYXNlIGFkZHJlc3Mgb2Ygc2VjdGlvbiAwLCB3aGljaCB3ZSBnbyB0aHJvdWdoIGhvb3BzIHRvIGNhbGN1bGF0ZS4KLQl2b2lkIAkJCQkJCSpzZWN0aW9uMUJhc2U7CQkJLy8gVGhlIGJhc2UgYWRkcmVzcyBvZiBzZWN0aW9uIDEsIHdoaWNoIHdlIGdvIHRocm91Z2ggaG9vcHMgdG8gY2FsY3VsYXRlLgotCUJvb2xlYW4JCQkJCQlkaXNwb3NlU2VjdGlvblBvaW50ZXJzOwkvLyBTZWUgYmVsb3cuCisgICAgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICAgICAgICAgbG9jYXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhvdyB0byBmaW5kIHRoZSBmcmFnbWVudCdzIGNvbnRhaW5lci4KKyAgICBDRnJhZ0Nvbm5lY3Rpb25JRCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5JRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDRk0gY29ubmVjdGlvbiB0byB0aGUgZnJhZ21lbnQuCisgICAgQ0ZyYWdJbml0RnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0Um91dGluZTsgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBDRk0gaW5pdCByb3V0aW5lIGZvciB0aGUgZnJhZ21lbnQuCisgICAgUEVGQ29udGFpbmVySGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJIZWFkZXI7ICAgICAgICAgICAgICAgIC8vIFRoZSBDRk0gaGVhZGVyLCByZWFkIGluIGZyb20gdGhlIGNvbnRhaW5lci4KKyAgICBQRUZTZWN0aW9uSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWN0aW9uSGVhZGVyczsgICAgICAgICAgICAgICAgLy8gVGhlIENGTSBzZWN0aW9uIGhlYWRlcnMuICBBIHBvaW50ZXIgYmxvY2sgY29udGFpbmluZyBhbiBhcnJheSBvZiBjb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50IGVsZW1lbnRzLgorICAgIFBFRkxvYWRlckluZm9IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYWRlclNlY3Rpb247ICAgICAgICAgICAgICAgICAvLyBUaGUgZW50aXJlIENGTSBsb2FkZXIgc2VjdGlvbiBpbiBhIHBvaW50ZXIgYmxvY2suCisgICAgU0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVSZWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJlYWQtb25seSBwYXRoIHRvIHRoZSBDRk0gY29udGFpbmVyLiAgV2Uga2VlcCB0aGlzIGhlcmUgYmVjYXVzZSBvbmUgdGhhdCBvbmUgcm91dGluZSBuZWVkcyB0byByZWFkIGZyb20gdGhlIGNvbnRhaW5lci4KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlY3Rpb24wQmFzZTsgICAgICAgICAgICAgICAgICAvLyBUaGUgYmFzZSBhZGRyZXNzIG9mIHNlY3Rpb24gMCwgd2hpY2ggd2UgZ28gdGhyb3VnaCBob29wcyB0byBjYWxjdWxhdGUuCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWN0aW9uMUJhc2U7ICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2UgYWRkcmVzcyBvZiBzZWN0aW9uIDEsIHdoaWNoIHdlIGdvIHRocm91Z2ggaG9vcHMgdG8gY2FsY3VsYXRlLgorICAgIEJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NlU2VjdGlvblBvaW50ZXJzOyAvLyBTZWUgYmVsb3cuCiB9OwogdHlwZWRlZiBzdHJ1Y3QgRnJhZ1RvRml4SW5mbyBGcmFnVG9GaXhJbmZvOwogCkBAIC0xNTEsNjE0ICsxNTEsNjE0IEBACiAvLyBkaXNwb3NlU2VjdGlvblBvaW50ZXJzIHJlbWFpbnMgYXMgdmVzdGlnaWFsIHN1cHBvcnQgZm9yIHRoZSBjb25jZXB0LgogCiBzdGF0aWMgT1NTdGF0dXMgUmVhZENvbnRhaW5lckJhc2ljcyhGcmFnVG9GaXhJbmZvICpmcmFnVG9GaXgpCi0JLy8gUmVhZHMgc29tZSBiYXNpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb250YWluZXIgb2YgdGhlCi0JLy8gZnJhZ21lbnQgdG8gZml4IGFuZCBzdG9yZXMgaXQgaW4gdmFyaW91cyBmaWVsZHMgb2YKLQkvLyBmcmFnVG9GaXguICBUaGlzIGluY2x1ZGVzOgotCS8vCi0JLy8gbyBjb250YWluZXJIZWFkZXIgLS0gVGhlIGNvbnRhaW4gaGVhZGVyIGl0c2VsZi4KLQkvLyBvIHNlY3Rpb25IZWFkZXJzICAtLSBUaGUgYXJyYXkgb2Ygc2VjdGlvbiBoZWFkZXJzIChpbiBhIG5ld2x5IGFsbG9jYXRlZCBwb2ludGVyIGJsb2NrKS4KLQkvLyBvIGxvYWRlclNlY3Rpb24gICAtLSBUaGUgZW50aXJlIGxvYWRlciBzZWN0aW9uIChpbiBhIG5ld2x5IGFsbG9jYXRlZCBwb2ludGVyIGJsb2NrKS4KLQkvLwotCS8vIEFsc28gc2V0cyBkaXNwb3NlU2VjdGlvblBvaW50ZXJzIHRvIGluZGljYXRlIHdoZXRoZXIKLQkvLyB0aGUgbGFzdCB0d28gcG9pbnRlcnMgc2hvdWxkIGJlIGRpc3Bvc2VkIG9mLgotCS8vCi0JLy8gRmluYWxseSwgaXQgbGVhdmVzIHRoZSBjb250YWluZXIgZmlsZSBvcGVuIGZvciBsYXRlcgotCS8vIGZvbGtzIHdobyB3YW50IHRvIHJlYWQgZGF0YSBmcm9tIGl0LgorICAgIC8vIFJlYWRzIHNvbWUgYmFzaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29udGFpbmVyIG9mIHRoZQorICAgIC8vIGZyYWdtZW50IHRvIGZpeCBhbmQgc3RvcmVzIGl0IGluIHZhcmlvdXMgZmllbGRzIG9mCisgICAgLy8gZnJhZ1RvRml4LiAgVGhpcyBpbmNsdWRlczoKKyAgICAvLworICAgIC8vIG8gY29udGFpbmVySGVhZGVyIC0tIFRoZSBjb250YWluIGhlYWRlciBpdHNlbGYuCisgICAgLy8gbyBzZWN0aW9uSGVhZGVycyAgLS0gVGhlIGFycmF5IG9mIHNlY3Rpb24gaGVhZGVycyAoaW4gYSBuZXdseSBhbGxvY2F0ZWQgcG9pbnRlciBibG9jaykuCisgICAgLy8gbyBsb2FkZXJTZWN0aW9uICAgLS0gVGhlIGVudGlyZSBsb2FkZXIgc2VjdGlvbiAoaW4gYSBuZXdseSBhbGxvY2F0ZWQgcG9pbnRlciBibG9jaykuCisgICAgLy8KKyAgICAvLyBBbHNvIHNldHMgZGlzcG9zZVNlY3Rpb25Qb2ludGVycyB0byBpbmRpY2F0ZSB3aGV0aGVyCisgICAgLy8gdGhlIGxhc3QgdHdvIHBvaW50ZXJzIHNob3VsZCBiZSBkaXNwb3NlZCBvZi4KKyAgICAvLworICAgIC8vIEZpbmFsbHksIGl0IGxlYXZlcyB0aGUgY29udGFpbmVyIGZpbGUgb3BlbiBmb3IgbGF0ZXIKKyAgICAvLyBmb2xrcyB3aG8gd2FudCB0byByZWFkIGRhdGEgZnJvbSBpdC4KIHsKLQlPU1N0YXR1cyAJZXJyOwotCVVJbnQxNiAJCXNlY3Rpb25JbmRleDsKLQlCb29sZWFuIAlmb3VuZDsKKyAgICBPU1N0YXR1cyAgICAgICAgICAgIGVycjsKKyAgICBVSW50MTYgICAgICAgICAgICAgIHNlY3Rpb25JbmRleDsKKyAgICBCb29sZWFuICAgICAgICAgICAgIGZvdW5kOwogCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2NhdG9yLmZpbGVTcGVjICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5jb25uSUQgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gPT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzID09IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5maWxlUmVmID09IDApOwotCQotCWZyYWdUb0ZpeC0+ZGlzcG9zZVNlY3Rpb25Qb2ludGVycyA9IHRydWU7Ci0JCi0JLy8gT3BlbiB1cCB0aGUgZmlsZSwgcmVhZCB0aGUgY29udGFpbmVyIGhlYWQsIHRoZW4gcmVhZCBpbgotCS8vIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzLCB0aGVuIGdvIGxvb2tpbmcgdGhyb3VnaCB0aGUKLQkvLyBzZWN0aW9uIGhlYWRlcnMgZm9yIHRoZSBsb2FkZXIgc2VjdGlvbiAoUEVGIGRlZmluZXMKLQkvLyB0aGF0IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSkuCi0JCi0JZXJyID0gRlNwT3BlbkRGKGZyYWdUb0ZpeC0+bG9jYXRvci5maWxlU3BlYywgZnNSZFBlcm0sICZmcmFnVG9GaXgtPmZpbGVSZWYpOwotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAotCQkJCQkJCQlmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0LAotCQkJCQkJCQlzaXplb2YoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIpLAotCQkJCQkJCQkmZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIpOwotCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQlpZiAoICAgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMSAhPSBrUEVGVGFnMQotCQkJCXx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzIgIT0ga1BFRlRhZzIKLQkJCQl8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5hcmNoaXRlY3R1cmUgIT0ga0NvbXBpbGVkQ0ZyYWdBcmNoCi0JCQkJfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuZm9ybWF0VmVyc2lvbiAhPSBrUEVGVmVyc2lvbikgewotCQkJCWVyciA9IGNmcmFnRnJhZ21lbnRGb3JtYXRFcnI7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVyciA9PSBub0VycikgewotCQkJZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyA9IChQRUZTZWN0aW9uSGVhZGVyICopIE5ld1B0cihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5zZWN0aW9uQ291bnQgKiBzaXplb2YoUEVGU2VjdGlvbkhlYWRlcikpOwotCQkJZXJyID0gTWVtRXJyb3IoKTsKLQkJfQotCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQllcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsCi0JCQkJCQkJCQlmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0ICsgc2l6ZW9mKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKSwKLQkJCQkJCQkJCWZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnNlY3Rpb25Db3VudCAqIHNpemVvZihQRUZTZWN0aW9uSGVhZGVyKSwgCi0JCQkJCQkJCQlmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzKTsKLQkJfQotCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQlzZWN0aW9uSW5kZXggPSAwOwotCQkJZm91bmQgPSBmYWxzZTsKLQkJCXdoaWxlICggc2VjdGlvbkluZGV4IDwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICYmICEgZm91bmQgKSB7Ci0JCQkJZm91bmQgPSAoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLnNlY3Rpb25LaW5kID09IGtQRUZMb2FkZXJTZWN0aW9uKTsKLQkJCQlpZiAoICEgZm91bmQgKSB7Ci0JCQkJCXNlY3Rpb25JbmRleCArPSAxOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZXJyID09IG5vRXJyICYmICEgZm91bmQpIHsKLQkJCWVyciA9IGNmcmFnTm9TZWN0aW9uRXJyOwotCQl9Ci0JCQotCQkvLyBOb3cgcmVhZCBhbGxvY2F0ZSBhIHBvaW50ZXIgYmxvY2sgYW5kIHJlYWQgdGhlIGxvYWRlciBzZWN0aW9uIGludG8gaXQuCi0JCQotCQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCQlmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gPSAoUEVGTG9hZGVySW5mb0hlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lckxlbmd0aCk7Ci0JCQllcnIgPSBNZW1FcnJvcigpOwotCQl9Ci0JCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCWVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwgCi0JCQkJCQkJCQlmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0ICsgZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLmNvbnRhaW5lck9mZnNldCwKLQkJCQkJCQkJCWZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJMZW5ndGgsIAotCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uKTsKLQkJfQkJCQkKLQl9Ci0JCi0JLy8gTm8gY2xlYW4gdXAuICBUaGUgY2xpZW50IG11c3QgaW5pdCBmcmFnVG9GaXggdG8gemVyb3MgYW5kIHRoZW4KLQkvLyBjbGVhbiB1cCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgcmV0dXJuIGFuIGVycm9yLgotCQkKLQlyZXR1cm4gZXJyOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9jYXRvci5maWxlU3BlYyAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29ubklEICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uID09IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVycyA9PSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+ZmlsZVJlZiA9PSAwKTsKKworICAgIGZyYWdUb0ZpeC0+ZGlzcG9zZVNlY3Rpb25Qb2ludGVycyA9IHRydWU7CisKKyAgICAvLyBPcGVuIHVwIHRoZSBmaWxlLCByZWFkIHRoZSBjb250YWluZXIgaGVhZCwgdGhlbiByZWFkIGluCisgICAgLy8gYWxsIHRoZSBzZWN0aW9uIGhlYWRlcnMsIHRoZW4gZ28gbG9va2luZyB0aHJvdWdoIHRoZQorICAgIC8vIHNlY3Rpb24gaGVhZGVycyBmb3IgdGhlIGxvYWRlciBzZWN0aW9uIChQRUYgZGVmaW5lcworICAgIC8vIHRoYXQgdGhlcmUgY2FuIGJlIG9ubHkgb25lKS4KKworICAgIGVyciA9IEZTcE9wZW5ERihmcmFnVG9GaXgtPmxvY2F0b3IuZmlsZVNwZWMsIGZzUmRQZXJtLCAmZnJhZ1RvRml4LT5maWxlUmVmKTsKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGVyciA9IEZTUmVhZEF0T2Zmc2V0KGZyYWdUb0ZpeC0+ZmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyKTsKKyAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgaWYgKCAgIGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgIT0ga1BFRlRhZzEKKyAgICAgICAgICAgICAgICB8fCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcyICE9IGtQRUZUYWcyCisgICAgICAgICAgICAgICAgfHwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuYXJjaGl0ZWN0dXJlICE9IGtDb21waWxlZENGcmFnQXJjaAorICAgICAgICAgICAgICAgIHx8IGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLmZvcm1hdFZlcnNpb24gIT0ga1BFRlZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBjZnJhZ0ZyYWdtZW50Rm9ybWF0RXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnMgPSAoUEVGU2VjdGlvbkhlYWRlciAqKSBOZXdQdHIoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICogc2l6ZW9mKFBFRlNlY3Rpb25IZWFkZXIpKTsKKyAgICAgICAgICAgIGVyciA9IE1lbUVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCArIHNpemVvZihmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5zZWN0aW9uQ291bnQgKiBzaXplb2YoUEVGU2VjdGlvbkhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICBzZWN0aW9uSW5kZXggPSAwOworICAgICAgICAgICAgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIHdoaWxlICggc2VjdGlvbkluZGV4IDwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICYmICEgZm91bmQgKSB7CisgICAgICAgICAgICAgICAgZm91bmQgPSAoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tzZWN0aW9uSW5kZXhdLnNlY3Rpb25LaW5kID09IGtQRUZMb2FkZXJTZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoICEgZm91bmQgKSB7CisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25JbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IG5vRXJyICYmICEgZm91bmQpIHsKKyAgICAgICAgICAgIGVyciA9IGNmcmFnTm9TZWN0aW9uRXJyOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IHJlYWQgYWxsb2NhdGUgYSBwb2ludGVyIGJsb2NrIGFuZCByZWFkIHRoZSBsb2FkZXIgc2VjdGlvbiBpbnRvIGl0LgorCisgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiA9IChQRUZMb2FkZXJJbmZvSGVhZGVyICopIE5ld1B0cihmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW3NlY3Rpb25JbmRleF0uY29udGFpbmVyTGVuZ3RoKTsKKyAgICAgICAgICAgIGVyciA9IE1lbUVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgZXJyID0gRlNSZWFkQXRPZmZzZXQoZnJhZ1RvRml4LT5maWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldCArIGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbc2VjdGlvbkluZGV4XS5jb250YWluZXJPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW3NlY3Rpb25JbmRleF0uY29udGFpbmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vIGNsZWFuIHVwLiAgVGhlIGNsaWVudCBtdXN0IGluaXQgZnJhZ1RvRml4IHRvIHplcm9zIGFuZCB0aGVuCisgICAgLy8gY2xlYW4gdXAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIHJldHVybiBhbiBlcnJvci4KKworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBVSW50MzIgRGVjb2RlVkNvdW50VmFsdWUoY29uc3QgVUludDggKnN0YXJ0LCBVSW50MzIgKm91dENvdW50KQotCS8vIEdpdmVuIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSB2YXJpYWJsZSBsZW5ndGggUEVGIHZhbHVlLCAKLQkvLyB3b3JrIG91dCB0aGUgdmFsdWUgKGluICpvdXRDb3VudCkuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgCi0JLy8gY29uc3VtZWQgYnkgdGhlIHZhbHVlLgorICAgIC8vIEdpdmVuIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgYSB2YXJpYWJsZSBsZW5ndGggUEVGIHZhbHVlLAorICAgIC8vIHdvcmsgb3V0IHRoZSB2YWx1ZSAoaW4gKm91dENvdW50KS4gIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcworICAgIC8vIGNvbnN1bWVkIGJ5IHRoZSB2YWx1ZS4KIHsKLQlVSW50OCAqCQkJYnl0ZVB0cjsKLQlVSW50OAkJCWJ5dGU7Ci0JVUludDMyCQkJY291bnQ7Ci0JCi0JYnl0ZVB0ciA9IChVSW50OCAqKXN0YXJ0OwotCQotCS8vIENvZGUgdGFrZW4gZnJvbSAiUEVGQmluYXJ5Rm9ybWF0LmgiLgotCWNvdW50ID0gMDsKLQlkbyB7Ci0JCWJ5dGUgPSAqYnl0ZVB0cisrOwotCQljb3VudCA9IChjb3VudCA8PCBrUEVGUGtEYXRhVkNvdW50U2hpZnQpIHwgKGJ5dGUgJiBrUEVGUGtEYXRhVkNvdW50TWFzayk7Ci0JfSB3aGlsZSAoKGJ5dGUgJiBrUEVGUGtEYXRhVkNvdW50RW5kTWFzaykgIT0gMCk7Ci0JCi0JKm91dENvdW50ID0gY291bnQ7Ci0JcmV0dXJuIGJ5dGVQdHIgLSBzdGFydDsKKyAgICBVSW50OCAqICAgICAgICAgICAgICAgICAgICAgYnl0ZVB0cjsKKyAgICBVSW50OCAgICAgICAgICAgICAgICAgICAgICAgYnl0ZTsKKyAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgY291bnQ7CisKKyAgICBieXRlUHRyID0gKFVJbnQ4ICopc3RhcnQ7CisKKyAgICAvLyBDb2RlIHRha2VuIGZyb20gIlBFRkJpbmFyeUZvcm1hdC5oIi4KKyAgICBjb3VudCA9IDA7CisgICAgZG8geworICAgICAgICBieXRlID0gKmJ5dGVQdHIrKzsKKyAgICAgICAgY291bnQgPSAoY291bnQgPDwga1BFRlBrRGF0YVZDb3VudFNoaWZ0KSB8IChieXRlICYga1BFRlBrRGF0YVZDb3VudE1hc2spOworICAgIH0gd2hpbGUgKChieXRlICYga1BFRlBrRGF0YVZDb3VudEVuZE1hc2spICE9IDApOworCisgICAgKm91dENvdW50ID0gY291bnQ7CisgICAgcmV0dXJuIGJ5dGVQdHIgLSBzdGFydDsKIH0KIAogc3RhdGljIFVJbnQzMiBEZWNvZGVJbnN0ckNvdW50VmFsdWUoY29uc3QgVUludDggKmluT3BTdGFydCwgVUludDMyICpvdXRDb3VudCkKLQkvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGFuIG9wY29kZSAoaW5PcFN0YXJ0KSwgd29yayBvdXQgdGhlIAotCS8vIGNvdW50IGFyZ3VtZW50IGZvciB0aGF0IG9wY29kZSAoKm91dENvdW50KS4gIFJldHVybnMgdGhlIG51bWJlciBvZiAKLQkvLyBieXRlcyBjb25zdW1lZCBieSB0aGUgb3Bjb2RlIGFuZCBjb3VudCBjb21iaW5hdGlvbi4KKyAgICAvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGFuIG9wY29kZSAoaW5PcFN0YXJ0KSwgd29yayBvdXQgdGhlCisgICAgLy8gY291bnQgYXJndW1lbnQgZm9yIHRoYXQgb3Bjb2RlICgqb3V0Q291bnQpLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICAgLy8gYnl0ZXMgY29uc3VtZWQgYnkgdGhlIG9wY29kZSBhbmQgY291bnQgY29tYmluYXRpb24uCiB7Ci0JTW9yZUFzc2VydFEoaW5PcFN0YXJ0ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEob3V0Q291bnQgICE9IG5pbCk7Ci0JCi0JaWYgKFBFRlBrRGF0YUNvdW50NSgqaW5PcFN0YXJ0KSAhPSAwKQotCXsKLQkJLy8gU2ltcGxlIGNhc2UsIGNvdW50IGVuY29kZWQgaW4gb3Bjb2RlLgotCQkqb3V0Q291bnQgPSBQRUZQa0RhdGFDb3VudDUoKmluT3BTdGFydCk7Ci0JCXJldHVybiAxOwotCX0KLQllbHNlCi0JewotCQkvLyBWYXJpYWJsZS1sZW5ndGggY2FzZS4KLQkJcmV0dXJuIDEgKyBEZWNvZGVWQ291bnRWYWx1ZShpbk9wU3RhcnQgKyAxLCBvdXRDb3VudCk7Ci0JfQorICAgIE1vcmVBc3NlcnRRKGluT3BTdGFydCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKG91dENvdW50ICAhPSBuaWwpOworCisgICAgaWYgKFBFRlBrRGF0YUNvdW50NSgqaW5PcFN0YXJ0KSAhPSAwKQorICAgIHsKKyAgICAgICAgLy8gU2ltcGxlIGNhc2UsIGNvdW50IGVuY29kZWQgaW4gb3Bjb2RlLgorICAgICAgICAqb3V0Q291bnQgPSBQRUZQa0RhdGFDb3VudDUoKmluT3BTdGFydCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBWYXJpYWJsZS1sZW5ndGggY2FzZS4KKyAgICAgICAgcmV0dXJuIDEgKyBEZWNvZGVWQ291bnRWYWx1ZShpbk9wU3RhcnQgKyAxLCBvdXRDb3VudCk7CisgICAgfQogfQogCiBzdGF0aWMgT1NTdGF0dXMgVW5wYWNrUEVGRGF0YVNlY3Rpb24oY29uc3QgVUludDggKiBjb25zdCBwYWNrZWREYXRhLCAgIFVJbnQzMiBwYWNrZWRTaXplLAotCQkJCQkJCQkgICAgICAgICAgIFVJbnQ4ICogY29uc3QgdW5wYWNrZWREYXRhLCBVSW50MzIgdW5wYWNrZWRTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDggKiBjb25zdCB1bnBhY2tlZERhdGEsIFVJbnQzMiB1bnBhY2tlZFNpemUpCiB7Ci0JT1NFcnIJCQllcnI7Ci0JVUludDMyCQkJb2Zmc2V0OwotCVVJbnQ4CQkJb3BDb2RlOwotCVVJbnQ4ICoJCQl1bnBhY2tDdXJzb3I7Ci0JCi0JTW9yZUFzc2VydFEocGFja2VkRGF0YSAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHVucGFja2VkRGF0YSAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHVucGFja2VkU2l6ZSA+PSBwYWNrZWRTaXplKTsKKyAgICBPU0VyciAgICAgICAgICAgICAgICAgICAgICAgZXJyOworICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ7CisgICAgVUludDggICAgICAgICAgICAgICAgICAgICAgIG9wQ29kZTsKKyAgICBVSW50OCAqICAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yOwogCi0JLy8gVGhlIGZvbGxvd2luZyBhc3NlcnRzIGFzc3VtZSB0aGF0IHRoZSBjbGllbnQgYWxsb2NhdGVkIHRoZSBtZW1vcnkgd2l0aCBOZXdQdHIsIAotCS8vIHdoaWNoIG1heSBub3QgYWx3YXlzIGJlIHRydWUuICBIb3dldmVyLCB0aGUgYXNzZXJ0cycgdmFsdWUgaW4gcHJldmVudGluZyBhY2NpZGVudGFsIAotCS8vIG1lbW9yeSBibG9jayBvdmVycnVucyBvdXR3ZWlnaHMgdGhlIHBvc3NpYmxlIG1haW50ZW5hbmNlIGVmZm9ydC4KLQkKLQlNb3JlQXNzZXJ0USggcGFja2VkU2l6ZSAgID09IEdldFB0clNpemUoIChQdHIpIHBhY2tlZERhdGEgICkgKTsKLQlNb3JlQXNzZXJ0USggdW5wYWNrZWRTaXplID09IEdldFB0clNpemUoIChQdHIpIHVucGFja2VkRGF0YSkgKTsKLQkKLQllcnIgICAgICAgICAgPSBub0VycjsKLQlvZmZzZXQgICAgICAgPSAwOwotCXVucGFja0N1cnNvciA9IHVucGFja2VkRGF0YTsKLQl3aGlsZSAob2Zmc2V0IDwgcGFja2VkU2l6ZSkgewotCQlNb3JlQXNzZXJ0USh1bnBhY2tDdXJzb3IgPCAmdW5wYWNrZWREYXRhW3VucGFja2VkU2l6ZV0pOwotCQkKLQkJb3BDb2RlID0gcGFja2VkRGF0YVtvZmZzZXRdOwotCQkKLQkJc3dpdGNoIChQRUZQa0RhdGFPcGNvZGUob3BDb2RlKSkgewotCQkJY2FzZSBrUEVGUGtEYXRhWmVybzoKLQkJCQl7Ci0JCQkJCVVJbnQzMgljb3VudDsKLQkJCQkJCi0JCQkJCW9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvdW50KTsKLQkJCQkJCi0JCQkJCU1vcmVCbG9ja1plcm8odW5wYWNrQ3Vyc29yLCBjb3VudCk7Ci0JCQkJCXVucGFja0N1cnNvciArPSBjb3VudDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkKLQkJCWNhc2Uga1BFRlBrRGF0YUJsb2NrOgotCQkJCXsKLQkJCQkJVUludDMyCWJsb2NrU2l6ZTsKLQkJCQkJCi0JCQkJCW9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmJsb2NrU2l6ZSk7Ci0JCQkJCQotCQkJCQlCbG9ja01vdmVEYXRhKCZwYWNrZWREYXRhW29mZnNldF0sIHVucGFja0N1cnNvciwgYmxvY2tTaXplKTsKLQkJCQkJdW5wYWNrQ3Vyc29yICs9IGJsb2NrU2l6ZTsKLQkJCQkJb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkKLQkJCWNhc2Uga1BFRlBrRGF0YVJlcGVhdDoKLQkJCQl7Ci0JCQkJCVVJbnQzMglibG9ja1NpemU7Ci0JCQkJCVVJbnQzMglyZXBlYXRDb3VudDsKLQkJCQkJVUludDMyICBsb29wQ291bnRlcjsKLQkJCQkJCi0JCQkJCW9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmJsb2NrU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmcmVwZWF0Q291bnQpOwotCQkJCQlyZXBlYXRDb3VudCArPSAxOwkvLyBzdG9yZWQgdmFsdWUgaXMgKHJlcGVhdENvdW50IC0gMSkKLQkJCQkJCi0JCQkJCWZvciAobG9vcENvdW50ZXIgPSAwOyBsb29wQ291bnRlciA8IHJlcGVhdENvdW50OyBsb29wQ291bnRlcisrKSB7Ci0JCQkJCQlCbG9ja01vdmVEYXRhKCZwYWNrZWREYXRhW29mZnNldF0sIHVucGFja0N1cnNvciwgYmxvY2tTaXplKTsKLQkJCQkJCXVucGFja0N1cnNvciArPSBibG9ja1NpemU7Ci0JCQkJCX0KLQkJCQkJb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkKLQkJCWNhc2Uga1BFRlBrRGF0YVJlcGVhdEJsb2NrOgotCQkJCXsKLQkJCQkJVUludDMyCWNvbW1vblNpemU7Ci0JCQkJCVVJbnQzMgljdXN0b21TaXplOwotCQkJCQlVSW50MzIJcmVwZWF0Q291bnQ7Ci0JCQkJCWNvbnN0IFVJbnQ4ICpjb21tb25EYXRhOwotCQkJCQljb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKLQkJCQkJVUludDMyIGxvb3BDb3VudGVyOwotCQkJCQkKLQkJCQkJb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY29tbW9uU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY3VzdG9tU2l6ZSk7Ci0JCQkJCW9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmcmVwZWF0Q291bnQpOwotCQkJCQkKLQkJCQkJY29tbW9uRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldF07Ci0JCQkJCWN1c3RvbURhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXQgKyBjb21tb25TaXplXTsKLQkJCQkJCi0JCQkJCWZvciAobG9vcENvdW50ZXIgPSAwOyBsb29wQ291bnRlciA8IHJlcGVhdENvdW50OyBsb29wQ291bnRlcisrKSB7Ci0JCQkJCQlCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gY29tbW9uU2l6ZTsKLQkJCQkJCUJsb2NrTW92ZURhdGEoY3VzdG9tRGF0YSwgdW5wYWNrQ3Vyc29yLCBjdXN0b21TaXplKTsKLQkJCQkJCXVucGFja0N1cnNvciArPSBjdXN0b21TaXplOwotCQkJCQkJY3VzdG9tRGF0YSArPSBjdXN0b21TaXplOwotCQkJCQl9Ci0JCQkJCUJsb2NrTW92ZURhdGEoY29tbW9uRGF0YSwgdW5wYWNrQ3Vyc29yLCBjb21tb25TaXplKTsKLQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7Ci0JCQkJCW9mZnNldCArPSAocmVwZWF0Q291bnQgKiAoY29tbW9uU2l6ZSArIGN1c3RvbVNpemUpKSArIGNvbW1vblNpemU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQljYXNlIGtQRUZQa0RhdGFSZXBlYXRaZXJvOgotCQkJCXsKLQkJCQkJVUludDMyCWNvbW1vblNpemU7Ci0JCQkJCVVJbnQzMgljdXN0b21TaXplOwotCQkJCQlVSW50MzIJcmVwZWF0Q291bnQ7Ci0JCQkJCWNvbnN0IFVJbnQ4ICpjdXN0b21EYXRhOwotCQkJCQlVSW50MzIgbG9vcENvdW50ZXI7Ci0JCQkJCQotCQkJCQlvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjb21tb25TaXplKTsKLQkJCQkJb2Zmc2V0ICs9IERlY29kZVZDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZjdXN0b21TaXplKTsKLQkJCQkJb2Zmc2V0ICs9IERlY29kZVZDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZyZXBlYXRDb3VudCk7Ci0JCQkJCQotCQkJCQljdXN0b21EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0XTsKLQkJCQkJCi0JCQkJCWZvciAobG9vcENvdW50ZXIgPSAwOyBsb29wQ291bnRlciA8IHJlcGVhdENvdW50OyBsb29wQ291bnRlcisrKSB7Ci0JCQkJCQlNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7Ci0JCQkJCQl1bnBhY2tDdXJzb3IgKz0gY29tbW9uU2l6ZTsKLQkJCQkJCUJsb2NrTW92ZURhdGEoY3VzdG9tRGF0YSwgdW5wYWNrQ3Vyc29yLCBjdXN0b21TaXplKTsKLQkJCQkJCXVucGFja0N1cnNvciArPSBjdXN0b21TaXplOwotCQkJCQkJY3VzdG9tRGF0YSArPSBjdXN0b21TaXplOwotCQkJCQl9Ci0JCQkJCU1vcmVCbG9ja1plcm8odW5wYWNrQ3Vyc29yLCBjb21tb25TaXplKTsKLQkJCQkJdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7Ci0JCQkJCW9mZnNldCArPSByZXBlYXRDb3VudCAqIGN1c3RvbVNpemU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJCi0JCQlkZWZhdWx0OgotCQkJCSNpZiBNT1JFX0RFQlVHCi0JCQkJCURlYnVnU3RyKCJccFVucGFja1BFRkRhdGFTZWN0aW9uOiBVbmV4cGVjdGVkIGRhdGEgb3Bjb2RlIik7Ci0JCQkJI2VuZGlmCi0JCQkJZXJyID0gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnI7Ci0JCQkJZ290byBsZWF2ZU5vdzsKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKKyAgICBNb3JlQXNzZXJ0UShwYWNrZWREYXRhICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEodW5wYWNrZWREYXRhICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEodW5wYWNrZWRTaXplID49IHBhY2tlZFNpemUpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBhc3NlcnRzIGFzc3VtZSB0aGF0IHRoZSBjbGllbnQgYWxsb2NhdGVkIHRoZSBtZW1vcnkgd2l0aCBOZXdQdHIsCisgICAgLy8gd2hpY2ggbWF5IG5vdCBhbHdheXMgYmUgdHJ1ZS4gIEhvd2V2ZXIsIHRoZSBhc3NlcnRzJyB2YWx1ZSBpbiBwcmV2ZW50aW5nIGFjY2lkZW50YWwKKyAgICAvLyBtZW1vcnkgYmxvY2sgb3ZlcnJ1bnMgb3V0d2VpZ2hzIHRoZSBwb3NzaWJsZSBtYWludGVuYW5jZSBlZmZvcnQuCisKKyAgICBNb3JlQXNzZXJ0USggcGFja2VkU2l6ZSAgID09IEdldFB0clNpemUoIChQdHIpIHBhY2tlZERhdGEgICkgKTsKKyAgICBNb3JlQXNzZXJ0USggdW5wYWNrZWRTaXplID09IEdldFB0clNpemUoIChQdHIpIHVucGFja2VkRGF0YSkgKTsKKworICAgIGVyciAgICAgICAgICA9IG5vRXJyOworICAgIG9mZnNldCAgICAgICA9IDA7CisgICAgdW5wYWNrQ3Vyc29yID0gdW5wYWNrZWREYXRhOworICAgIHdoaWxlIChvZmZzZXQgPCBwYWNrZWRTaXplKSB7CisgICAgICAgIE1vcmVBc3NlcnRRKHVucGFja0N1cnNvciA8ICZ1bnBhY2tlZERhdGFbdW5wYWNrZWRTaXplXSk7CisKKyAgICAgICAgb3BDb2RlID0gcGFja2VkRGF0YVtvZmZzZXRdOworCisgICAgICAgIHN3aXRjaCAoUEVGUGtEYXRhT3Bjb2RlKG9wQ29kZSkpIHsKKyAgICAgICAgICAgIGNhc2Uga1BFRlBrRGF0YVplcm86CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgY291bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY291bnQpOworCisgICAgICAgICAgICAgICAgICAgIE1vcmVCbG9ja1plcm8odW5wYWNrQ3Vyc29yLCBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga1BFRlBrRGF0YUJsb2NrOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZTsKKworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlSW5zdHJDb3VudFZhbHVlKCZwYWNrZWREYXRhW29mZnNldF0sICZibG9ja1NpemUpOworCisgICAgICAgICAgICAgICAgICAgIEJsb2NrTW92ZURhdGEoJnBhY2tlZERhdGFbb2Zmc2V0XSwgdW5wYWNrQ3Vyc29yLCBibG9ja1NpemUpOworICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gYmxvY2tTaXplOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYmxvY2tTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBrUEVGUGtEYXRhUmVwZWF0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdENvdW50OworICAgICAgICAgICAgICAgICAgICBVSW50MzIgIGxvb3BDb3VudGVyOworCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmcmVwZWF0Q291bnQpOworICAgICAgICAgICAgICAgICAgICByZXBlYXRDb3VudCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlZCB2YWx1ZSBpcyAocmVwZWF0Q291bnQgLSAxKQorCisgICAgICAgICAgICAgICAgICAgIGZvciAobG9vcENvdW50ZXIgPSAwOyBsb29wQ291bnRlciA8IHJlcGVhdENvdW50OyBsb29wQ291bnRlcisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKCZwYWNrZWREYXRhW29mZnNldF0sIHVucGFja0N1cnNvciwgYmxvY2tTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBibG9ja1NpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga1BFRlBrRGF0YVJlcGVhdEJsb2NrOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TaXplOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJbnQ4ICpjb21tb25EYXRhOworICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCAqY3VzdG9tRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyIGxvb3BDb3VudGVyOworCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVJbnN0ckNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmNvbW1vblNpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJmN1c3RvbVNpemUpOworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gRGVjb2RlVkNvdW50VmFsdWUoJnBhY2tlZERhdGFbb2Zmc2V0XSwgJnJlcGVhdENvdW50KTsKKworICAgICAgICAgICAgICAgICAgICBjb21tb25EYXRhID0gJnBhY2tlZERhdGFbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAgICAgY3VzdG9tRGF0YSA9ICZwYWNrZWREYXRhW29mZnNldCArIGNvbW1vblNpemVdOworCisgICAgICAgICAgICAgICAgICAgIGZvciAobG9vcENvdW50ZXIgPSAwOyBsb29wQ291bnRlciA8IHJlcGVhdENvdW50OyBsb29wQ291bnRlcisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKGNvbW1vbkRhdGEsIHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY29tbW9uU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrTW92ZURhdGEoY3VzdG9tRGF0YSwgdW5wYWNrQ3Vyc29yLCBjdXN0b21TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjdXN0b21TaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRGF0YSArPSBjdXN0b21TaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEJsb2NrTW92ZURhdGEoY29tbW9uRGF0YSwgdW5wYWNrQ3Vyc29yLCBjb21tb25TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSAocmVwZWF0Q291bnQgKiAoY29tbW9uU2l6ZSArIGN1c3RvbVNpemUpKSArIGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGtQRUZQa0RhdGFSZXBlYXRaZXJvOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgIGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICBjdXN0b21TaXplOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0Q291bnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJbnQ4ICpjdXN0b21EYXRhOworICAgICAgICAgICAgICAgICAgICBVSW50MzIgbG9vcENvdW50ZXI7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IERlY29kZUluc3RyQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmY3VzdG9tU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBEZWNvZGVWQ291bnRWYWx1ZSgmcGFja2VkRGF0YVtvZmZzZXRdLCAmcmVwZWF0Q291bnQpOworCisgICAgICAgICAgICAgICAgICAgIGN1c3RvbURhdGEgPSAmcGFja2VkRGF0YVtvZmZzZXRdOworCisgICAgICAgICAgICAgICAgICAgIGZvciAobG9vcENvdW50ZXIgPSAwOyBsb29wQ291bnRlciA8IHJlcGVhdENvdW50OyBsb29wQ291bnRlcisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNb3JlQmxvY2taZXJvKHVucGFja0N1cnNvciwgY29tbW9uU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tDdXJzb3IgKz0gY29tbW9uU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrTW92ZURhdGEoY3VzdG9tRGF0YSwgdW5wYWNrQ3Vyc29yLCBjdXN0b21TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja0N1cnNvciArPSBjdXN0b21TaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRGF0YSArPSBjdXN0b21TaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE1vcmVCbG9ja1plcm8odW5wYWNrQ3Vyc29yLCBjb21tb25TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgdW5wYWNrQ3Vyc29yICs9IGNvbW1vblNpemU7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSByZXBlYXRDb3VudCAqIGN1c3RvbVNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICNpZiBNT1JFX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIERlYnVnU3RyKCJccFVucGFja1BFRkRhdGFTZWN0aW9uOiBVbmV4cGVjdGVkIGRhdGEgb3Bjb2RlIik7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgZXJyID0gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnI7CisgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogbGVhdmVOb3c6Ci0JcmV0dXJuIGVycjsKKyAgICByZXR1cm4gZXJyOwogfQogCi0vKglTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzIFJhdGlvbmFsZQotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCi0JT0ssIGhlcmUncyB3aGVyZSB0aGluZ3MgZ2V0IHdlaXJkLiAgSW4gb3JkZXIgdG8gcnVuIHRoZSByZWxvY2F0aW9uCi0JZW5naW5lLCBJIG5lZWQgdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkCi0Jc2VjdGlvbiBvZiB0aGUgZnJhZ21lbnQgd2UncmUgZml4aW5nIHVwIGdpdmVuIG9ubHkgaXRzIHNlY3Rpb24gbnVtYmVyLgotCVRoaXMgaXNuJ3QgaGFyZCBmb3IgQ0ZNIHRvIGRvIGJlY2F1c2UgaXQncyB0aGUgb25lIHRoYXQgaW5zdGFudGlhdGVkIHRoZQotCXNlY3Rpb25zIGluIHRoZSBmaXJzdCBwbGFjZS4gIEl0J3Mgc3VycHJpc2luZ2x5IGRpZmZpY3VsdCB0byBkbyBpZgotCXlvdSdyZSBub3QgQ0ZNLiAgW0FuZCB5b3UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgQ0ZNIEFQaXMgZm9yIAotCWRvaW5nIGl0Ll0KLQkKLQlbQWxhbiBMaWxsaWNoIGlzIGdvaW5nIHRvIGtpbGwgbWUgd2hlbiBoZSByZWFkcyB0aGlzISAgSSBzaG91bGQgcG9pbnQgb3V0Ci0JIHRoYXQgVFZlY3RvcidzIGRvbid0IGhhdmUgdG8gY29udGFpbiB0d28gd29yZHMsIHRoZXkgY2FuIGJlIGxvbmdlciwKLQkgYW5kIHRoYXQgdGhlIHNlY29uZCB3b3JkIGlzbid0IG5lY2Vzc2FyaWx5IGEgVE9DIHBvaW50ZXIsIGl0J3MKLQkganVzdCB0aGF0IHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIHJlcXVpcmUgdGhhdCBpdCBiZSBwdXQgaW4gdGhlCi0JIFRPQyByZWdpc3RlciB3aGVuIHRoZSBjb2RlIGlzIGNhbGxlZC4KLQkgCi0JIEZ1cnRoZXJtb3JlLCB0aGUgY29kZSBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDAsIGFuZCB0aGUgZGF0YQotCSBzZWN0aW9uIGlzbid0IGFsd2F5cyBzZWN0aW9uIDEsIGFuZCB0aGVyZSBjYW4gYmUgemVybyB0byBtYW55IHNlY3Rpb25zCi0JIG9mIGVhY2ggdHlwZS4KLQkgCi0JIEJ1dCB0aGVzZSBuaWNldGllcyBhcmUgYmVzaWRlcyB0aGUgcG9pbnQ6IEknbSBkb2luZyBzb21ldGhpbmcgdHJpY2t5IAotCSBiZWNhdXNlIEkgZG9uJ3QgaGF2ZSBhIG5pY2UgQVBJIGZvciBnZXR0aW5nIHNlY3Rpb24gYmFzZSBhZGRyZXNzZXMuICAKLQkgSWYgSSBoYWQgYSBuaWNlIEFQSSBmb3IgZG9pbmcgdGhhdCwgbm9uZSBvZiB0aGlzIGNvZGUgd291bGQgZXhpc3QuCi0JXQorLyogICAgICBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzIFJhdGlvbmFsZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLQlUaGUgdGVjaG5pcXVlIGlzIHZlcnkgc25lYWt5ICh0aGFua3MgdG8gRXJpYyBHcmFudCkuICBUaGUgZnJhZ21lbnQgdG8gCi0JZml4IG5lY2Vzc2FyaWx5IGhhcyBhIENGTSBpbml0IHJvdXRpbmUgKGJlY2F1c2UgaXQgbmVlZHMgdGhhdCByb3V0aW5lIAotCWluIG9yZGVyIHRvIGNhcHR1cmUgdGhlIGZyYWdtZW50IGxvY2F0aW9uIGFuZCBjb25uZWN0aW9uIElEKS4gIFRodXMgdGhlIAotCWZyYWdtZW50IHRvIGZpeCBtdXN0IGhhdmUgYSBUVmVjdG9yIGluIGl0cyBkYXRhIHNlY3Rpb24uICBUVmVjdG9ycyBhcmUgCi0JaW50ZXJlc3RpbmcgYmVjYXVzZSB0aGV5J3JlIG1hZGUgdXAgb2YgdHdvIHdvcmRzLiAgVGhlIGZpcnN0IGlzIGEgcG9pbnRlciAKLQl0byB0aGUgY29kZSB0aGF0IGltcGxlbWVudHMgdGhlIHJvdXRpbmU7IHRoZSBzZWNvbmQgaXMgYSBwb2ludGVyIHRvIHRoZSBUT0MKLQlmb3IgdGhlIGZyYWdtZW50IHRoYXQncyBleHBvcnRpbmcgdGhlIFRWZWN0b3IuICBIb3cgVFZlY3RvcnMgYXJlCi0JY3JlYXRlZCBpcyBpbnRlcmVzdGluZyB0b28uICBPbiBkaXNrLCBhIFRWZWN0b3IgY29uc2lzdHMgb2YgdHdvIHdvcmRzLAotCXRoZSBmaXJzdCBiZWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjb2RlIHNlY3Rpb24gdG8gdGhlCi0Jcm91dGluZSwgdGhlIHNlY29uZCBiZWluZyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlY3Rpb24KLQl0byB0aGUgVE9DIGJhc2UuICBXaGVuIENGTSBwcmVwYXJlcyBhIFRWZWN0b3IsIGl0IGFwcGxpZXMgdGhlIGZvbGxvd2luZwotCXRyYW5zZm9ybToKLQkKLQkJdHZlY3Rvci5jb2RlUHRyID0gdHZlY3Rvci5jb2RlT2Zmc2V0ICsgYmFzZSBvZiBjb2RlIHNlY3Rpb24KLQkJdHZlY3Rvci50b2NQdHIgID0gdHZlY3Rvci50b2NPZmZzZXQgICsgYmFzZSBvZiBkYXRhIHNlY3Rpb24KLQkJCi0JTm93LCB5b3UgY2FuIHJldmVyc2UgdGhlc2UgcXVlc3Rpb25zIHRvIG1ha2UgdGhlbToKLQkKLQkJYmFzZSBvZiBjb2RlIHNlY3Rpb24gPSB0dmVjdG9yLmNvZGVQdHIgLSB0dmVjdG9yLmNvZGVPZmZzZXQKLQkJYmFzZSBvZiBkYXRhIHNlY3Rpb24gPSB0dmVjdG9yLmRhdGFQdHIgLSB0dmVjdG9yLmRhdGFPZmZzZXQKLQkKLQlTbyBpZiB5b3UgY2FuIGZpbmQgdGhlIHJlbG9jYXRlZCBjb250ZW50cyBvZiB0aGUgVFZlY3RvciBhbmQKLQlmaW5kIHRoZSBvcmlnaW5hbCBvZmZzZXRzIHRoYXQgbWFkZSB1cCB0aGUgVFZlY3RvciwgeW91IGNhbiB0aGVuCi0JY2FsY3VsYXRlIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYm90aCB0aGUgY29kZSBhbmQgZGF0YSBzZWN0aW9ucy4KLQkKLQlGaW5kaW5nIHRoZSByZWxvY2F0ZWQgY29udGVudHMgb2YgdGhlIFRWZWN0b3IgaXMgZWFzeTsgSSBzaW1wbHkgCi0JcmVxdWlyZSB0aGUgY2xpZW50IHRvIHBhc3MgaW4gYSBwb2ludGVyIHRvIGl0cyBpbml0IHJvdXRpbmUuIAotCUEgcm91dGluZSBwb2ludGVyIGlzIGEgVFZlY3RvciBwb2ludGVyLCBzbyB5b3UgY2FuIGp1c3QgY2FzdCBpdCAKLQlhbmQgZXh0cmFjdCB0aGUgcGFpciBvZiB3b3Jkcy4KKyAgICBPSywgaGVyZSdzIHdoZXJlIHRoaW5ncyBnZXQgd2VpcmQuICBJbiBvcmRlciB0byBydW4gdGhlIHJlbG9jYXRpb24KKyAgICBlbmdpbmUsIEkgbmVlZCB0byBiZSBhYmxlIHRvIGZpbmQgdGhlIGJhc2UgYWRkcmVzcyBvZiBhbiBpbnN0YW50aWF0ZWQKKyAgICBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudCB3ZSdyZSBmaXhpbmcgdXAgZ2l2ZW4gb25seSBpdHMgc2VjdGlvbiBudW1iZXIuCisgICAgVGhpcyBpc24ndCBoYXJkIGZvciBDRk0gdG8gZG8gYmVjYXVzZSBpdCdzIHRoZSBvbmUgdGhhdCBpbnN0YW50aWF0ZWQgdGhlCisgICAgc2VjdGlvbnMgaW4gdGhlIGZpcnN0IHBsYWNlLiAgSXQncyBzdXJwcmlzaW5nbHkgZGlmZmljdWx0IHRvIGRvIGlmCisgICAgeW91J3JlIG5vdCBDRk0uICBbQW5kIHlvdSBkb24ndCBoYXZlIGFjY2VzcyB0byB0aGUgcHJpdmF0ZSBDRk0gQVBpcyBmb3IKKyAgICBkb2luZyBpdC5dCiAKLQlGaW5kaW5nIHRoZSBvcmlnaW5hbCBvZmZzZXRzIGlzIGEgdHJpY2tpZXIuICBNeSB0ZWNobmlxdWUgaXMgdG8KLQlsb29rIHVwIHRoZSBpbml0IHJvdXRpbmUgaW4gdGhlIGZyYWdtZW50J3MgbG9hZGVyIGluZm8gaGVhZGVyLiAgVGhpcwotCXlpZWxkcyB0aGUgc2VjdGlvbiBudW1iZXIgYW5kIG9mZnNldCB3aGVyZSB0aGUgaW5pdCByb3V0aW5lJ3MgdW5yZWxvY2F0ZWQgCi0JVFZlY3RvciBleGlzdHMuICBPbmNlIEkgaGF2ZSB0aGF0LCBJIGNhbiBqdXN0IHJlYWQgdGhlIHVucmVsb2NhdGVkIFRWZWN0b3IKLQlvdXQgb2YgdGhlIGZpbGUgYW5kIGV4dHJhY3QgdGhlIG9mZnNldHMuCisgICAgW0FsYW4gTGlsbGljaCBpcyBnb2luZyB0byBraWxsIG1lIHdoZW4gaGUgcmVhZHMgdGhpcyEgIEkgc2hvdWxkIHBvaW50IG91dAorICAgICB0aGF0IFRWZWN0b3IncyBkb24ndCBoYXZlIHRvIGNvbnRhaW4gdHdvIHdvcmRzLCB0aGV5IGNhbiBiZSBsb25nZXIsCisgICAgIGFuZCB0aGF0IHRoZSBzZWNvbmQgd29yZCBpc24ndCBuZWNlc3NhcmlseSBhIFRPQyBwb2ludGVyLCBpdCdzCisgICAgIGp1c3QgdGhhdCB0aGUgY2FsbGluZyBjb252ZW50aW9ucyByZXF1aXJlIHRoYXQgaXQgYmUgcHV0IGluIHRoZQorICAgICBUT0MgcmVnaXN0ZXIgd2hlbiB0aGUgY29kZSBpcyBjYWxsZWQuCisKKyAgICAgRnVydGhlcm1vcmUsIHRoZSBjb2RlIHNlY3Rpb24gaXNuJ3QgYWx3YXlzIHNlY3Rpb24gMCwgYW5kIHRoZSBkYXRhCisgICAgIHNlY3Rpb24gaXNuJ3QgYWx3YXlzIHNlY3Rpb24gMSwgYW5kIHRoZXJlIGNhbiBiZSB6ZXJvIHRvIG1hbnkgc2VjdGlvbnMKKyAgICAgb2YgZWFjaCB0eXBlLgorCisgICAgIEJ1dCB0aGVzZSBuaWNldGllcyBhcmUgYmVzaWRlcyB0aGUgcG9pbnQ6IEknbSBkb2luZyBzb21ldGhpbmcgdHJpY2t5CisgICAgIGJlY2F1c2UgSSBkb24ndCBoYXZlIGEgbmljZSBBUEkgZm9yIGdldHRpbmcgc2VjdGlvbiBiYXNlIGFkZHJlc3Nlcy4KKyAgICAgSWYgSSBoYWQgYSBuaWNlIEFQSSBmb3IgZG9pbmcgdGhhdCwgbm9uZSBvZiB0aGlzIGNvZGUgd291bGQgZXhpc3QuCisgICAgXQorCisgICAgVGhlIHRlY2huaXF1ZSBpcyB2ZXJ5IHNuZWFreSAodGhhbmtzIHRvIEVyaWMgR3JhbnQpLiAgVGhlIGZyYWdtZW50IHRvCisgICAgZml4IG5lY2Vzc2FyaWx5IGhhcyBhIENGTSBpbml0IHJvdXRpbmUgKGJlY2F1c2UgaXQgbmVlZHMgdGhhdCByb3V0aW5lCisgICAgaW4gb3JkZXIgdG8gY2FwdHVyZSB0aGUgZnJhZ21lbnQgbG9jYXRpb24gYW5kIGNvbm5lY3Rpb24gSUQpLiAgVGh1cyB0aGUKKyAgICBmcmFnbWVudCB0byBmaXggbXVzdCBoYXZlIGEgVFZlY3RvciBpbiBpdHMgZGF0YSBzZWN0aW9uLiAgVFZlY3RvcnMgYXJlCisgICAgaW50ZXJlc3RpbmcgYmVjYXVzZSB0aGV5J3JlIG1hZGUgdXAgb2YgdHdvIHdvcmRzLiAgVGhlIGZpcnN0IGlzIGEgcG9pbnRlcgorICAgIHRvIHRoZSBjb2RlIHRoYXQgaW1wbGVtZW50cyB0aGUgcm91dGluZTsgdGhlIHNlY29uZCBpcyBhIHBvaW50ZXIgdG8gdGhlIFRPQworICAgIGZvciB0aGUgZnJhZ21lbnQgdGhhdCdzIGV4cG9ydGluZyB0aGUgVFZlY3Rvci4gIEhvdyBUVmVjdG9ycyBhcmUKKyAgICBjcmVhdGVkIGlzIGludGVyZXN0aW5nIHRvby4gIE9uIGRpc2ssIGEgVFZlY3RvciBjb25zaXN0cyBvZiB0d28gd29yZHMsCisgICAgdGhlIGZpcnN0IGJlaW5nIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGNvZGUgc2VjdGlvbiB0byB0aGUKKyAgICByb3V0aW5lLCB0aGUgc2Vjb25kIGJlaW5nIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VjdGlvbgorICAgIHRvIHRoZSBUT0MgYmFzZS4gIFdoZW4gQ0ZNIHByZXBhcmVzIGEgVFZlY3RvciwgaXQgYXBwbGllcyB0aGUgZm9sbG93aW5nCisgICAgdHJhbnNmb3JtOgorCisgICAgICAgIHR2ZWN0b3IuY29kZVB0ciA9IHR2ZWN0b3IuY29kZU9mZnNldCArIGJhc2Ugb2YgY29kZSBzZWN0aW9uCisgICAgICAgIHR2ZWN0b3IudG9jUHRyICA9IHR2ZWN0b3IudG9jT2Zmc2V0ICArIGJhc2Ugb2YgZGF0YSBzZWN0aW9uCisKKyAgICBOb3csIHlvdSBjYW4gcmV2ZXJzZSB0aGVzZSBxdWVzdGlvbnMgdG8gbWFrZSB0aGVtOgorCisgICAgICAgIGJhc2Ugb2YgY29kZSBzZWN0aW9uID0gdHZlY3Rvci5jb2RlUHRyIC0gdHZlY3Rvci5jb2RlT2Zmc2V0CisgICAgICAgIGJhc2Ugb2YgZGF0YSBzZWN0aW9uID0gdHZlY3Rvci5kYXRhUHRyIC0gdHZlY3Rvci5kYXRhT2Zmc2V0CisKKyAgICBTbyBpZiB5b3UgY2FuIGZpbmQgdGhlIHJlbG9jYXRlZCBjb250ZW50cyBvZiB0aGUgVFZlY3RvciBhbmQKKyAgICBmaW5kIHRoZSBvcmlnaW5hbCBvZmZzZXRzIHRoYXQgbWFkZSB1cCB0aGUgVFZlY3RvciwgeW91IGNhbiB0aGVuCisgICAgY2FsY3VsYXRlIHRoZSBiYXNlIGFkZHJlc3Mgb2YgYm90aCB0aGUgY29kZSBhbmQgZGF0YSBzZWN0aW9ucy4KKworICAgIEZpbmRpbmcgdGhlIHJlbG9jYXRlZCBjb250ZW50cyBvZiB0aGUgVFZlY3RvciBpcyBlYXN5OyBJIHNpbXBseQorICAgIHJlcXVpcmUgdGhlIGNsaWVudCB0byBwYXNzIGluIGEgcG9pbnRlciB0byBpdHMgaW5pdCByb3V0aW5lLgorICAgIEEgcm91dGluZSBwb2ludGVyIGlzIGEgVFZlY3RvciBwb2ludGVyLCBzbyB5b3UgY2FuIGp1c3QgY2FzdCBpdAorICAgIGFuZCBleHRyYWN0IHRoZSBwYWlyIG9mIHdvcmRzLgorCisgICAgRmluZGluZyB0aGUgb3JpZ2luYWwgb2Zmc2V0cyBpcyBhIHRyaWNraWVyLiAgTXkgdGVjaG5pcXVlIGlzIHRvCisgICAgbG9vayB1cCB0aGUgaW5pdCByb3V0aW5lIGluIHRoZSBmcmFnbWVudCdzIGxvYWRlciBpbmZvIGhlYWRlci4gIFRoaXMKKyAgICB5aWVsZHMgdGhlIHNlY3Rpb24gbnVtYmVyIGFuZCBvZmZzZXQgd2hlcmUgdGhlIGluaXQgcm91dGluZSdzIHVucmVsb2NhdGVkCisgICAgVFZlY3RvciBleGlzdHMuICBPbmNlIEkgaGF2ZSB0aGF0LCBJIGNhbiBqdXN0IHJlYWQgdGhlIHVucmVsb2NhdGVkIFRWZWN0b3IKKyAgICBvdXQgb2YgdGhlIGZpbGUgYW5kIGV4dHJhY3QgdGhlIG9mZnNldHMuCiAqLwogCiBzdHJ1Y3QgVFZlY3RvciB7Ci0Jdm9pZCAqY29kZVB0cjsKLQl2b2lkICp0b2NQdHI7CisgICAgdm9pZCAqY29kZVB0cjsKKyAgICB2b2lkICp0b2NQdHI7CiB9OwogdHlwZWRlZiBzdHJ1Y3QgVFZlY3RvciBUVmVjdG9yOwogCiBzdGF0aWMgT1NTdGF0dXMgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyhGcmFnVG9GaXhJbmZvICpmcmFnVG9GaXgpCi0JLy8gVGhpcyByb3V0aW5lIGluaXRpYWxpc2VzIHRoZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZQotCS8vIGJhc2UgZmllbGRzIG9mIGZyYWdUb0ZpeCB0byB0aGUgYmFzZSBhZGRyZXNzZXMgb2YgdGhlCi0JLy8gaW5zdGFudGlhdGVkIGZyYWdtZW50IHJlcHJlc2VudGVkIGJ5IHRoZSBvdGhlciBmaWVsZHMKLQkvLyBvZiBmcmFnVG9GaXguICBUaGUgcHJvY2VzcyB3b3JrcyBpbiB0aHJlZSBzdGF0ZXM6Ci0JLy8KLQkvLyAxLiAJRmluZCB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRlZCBUVmVjdG9yIG9mIHRoZSAKLQkvLyAgICAgIGZyYWdtZW50J3MgaW5pdGlhbGlzYXRpb24gcm91dGluZSwgcHJvdmlkZWQgdG8gdXMgYnkgCi0JLy8gICAgICB0aGUgY2FsbGVyLgotCS8vCi0JLy8gMi4JRmluZCB0aGUgY29udGVudHMgb2YgdGhlIG5vbi1yZWxvY2F0ZWQgVFZlY3RvciBieSAKLQkvLyAgICAgIGxvb2tpbmcgaXQgdXAgaW4gdGhlIFBFRiBsb2FkZXIgaW5mbyBoZWFkZXIgYW5kIHRoZW4gCi0JLy8gICAgICB1c2luZyB0aGF0IHRvIHJlYWQgdGhlIFRWZWN0b3IgY29udGVudHMgZnJvbSBkaXNrLgotCS8vICAgICAgVGhpcyB5aWVsZHMgdGhlIG9mZnNldHMgZnJvbSB0aGUgc2VjdGlvbiBiYXNlcyBmb3IgCi0JLy8gICAgICB0aGUgaW5pdCByb3V0aW5lLgotCS8vCi0JLy8gMy4JU3VidHJhY3QgMiBmcm9tIDMuCisgICAgLy8gVGhpcyByb3V0aW5lIGluaXRpYWxpc2VzIHRoZSBzZWN0aW9uMEJhc2UgYW5kIHNlY3Rpb24xQmFzZQorICAgIC8vIGJhc2UgZmllbGRzIG9mIGZyYWdUb0ZpeCB0byB0aGUgYmFzZSBhZGRyZXNzZXMgb2YgdGhlCisgICAgLy8gaW5zdGFudGlhdGVkIGZyYWdtZW50IHJlcHJlc2VudGVkIGJ5IHRoZSBvdGhlciBmaWVsZHMKKyAgICAvLyBvZiBmcmFnVG9GaXguICBUaGUgcHJvY2VzcyB3b3JrcyBpbiB0aHJlZSBzdGF0ZXM6CisgICAgLy8KKyAgICAvLyAxLiAgICAgICBGaW5kIHRoZSBjb250ZW50cyBvZiB0aGUgcmVsb2NhdGVkIFRWZWN0b3Igb2YgdGhlCisgICAgLy8gICAgICBmcmFnbWVudCdzIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUsIHByb3ZpZGVkIHRvIHVzIGJ5CisgICAgLy8gICAgICB0aGUgY2FsbGVyLgorICAgIC8vCisgICAgLy8gMi4gICAgICAgRmluZCB0aGUgY29udGVudHMgb2YgdGhlIG5vbi1yZWxvY2F0ZWQgVFZlY3RvciBieQorICAgIC8vICAgICAgbG9va2luZyBpdCB1cCBpbiB0aGUgUEVGIGxvYWRlciBpbmZvIGhlYWRlciBhbmQgdGhlbgorICAgIC8vICAgICAgdXNpbmcgdGhhdCB0byByZWFkIHRoZSBUVmVjdG9yIGNvbnRlbnRzIGZyb20gZGlzay4KKyAgICAvLyAgICAgIFRoaXMgeWllbGRzIHRoZSBvZmZzZXRzIGZyb20gdGhlIHNlY3Rpb24gYmFzZXMgZm9yCisgICAgLy8gICAgICB0aGUgaW5pdCByb3V0aW5lLgorICAgIC8vCisgICAgLy8gMy4gICAgICAgU3VidHJhY3QgMiBmcm9tIDMuCiB7Ci0JT1NTdGF0dXMgCQkJZXJyOwotCVRWZWN0b3IgKgkJCXJlbG9jYXRlZEV4cG9ydDsKLQlTSW50MzIJCQkJaW5pdFNlY3Rpb247Ci0JVUludDMyCQkJCWluaXRPZmZzZXQ7Ci0JUEVGU2VjdGlvbkhlYWRlciAqCWluaXRTZWN0aW9uSGVhZGVyOwotCVB0cgkJCQkJcGFja2VkRGF0YVNlY3Rpb247Ci0JUHRyCQkJCQl1bnBhY2tlZERhdGFTZWN0aW9uOwotCVRWZWN0b3IgCQkJb3JpZ2luYWxPZmZzZXRzOworICAgIE9TU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKyAgICBUVmVjdG9yICogICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0ZWRFeHBvcnQ7CisgICAgU0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFNlY3Rpb247CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE9mZnNldDsKKyAgICBQRUZTZWN0aW9uSGVhZGVyICogICAgICAgICAgaW5pdFNlY3Rpb25IZWFkZXI7CisgICAgUHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZWREYXRhU2VjdGlvbjsKKyAgICBQdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFja2VkRGF0YVNlY3Rpb247CisgICAgVFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxPZmZzZXRzOwogCi0JcGFja2VkRGF0YVNlY3Rpb24gICA9IG5pbDsKLQl1bnBhY2tlZERhdGFTZWN0aW9uID0gbmlsOwotCQotCS8vIFN0ZXAgMS4KKyAgICBwYWNrZWREYXRhU2VjdGlvbiAgID0gbmlsOworICAgIHVucGFja2VkRGF0YVNlY3Rpb24gPSBuaWw7CiAKLQkvLyBGaXJzdCBmaW5kIHRoZSBpbml0IHJvdXRpbmUncyBUVmVjdG9yLCB3aGljaCBnaXZlcyB1cyB0aGUgcmVsb2NhdGVkIAotCS8vIG9mZnNldHMgb2YgdGhlIGluaXQgcm91dGluZSBpbnRvIHRoZSBkYXRhIGFuZCBjb2RlIHNlY3Rpb25zLgorICAgIC8vIFN0ZXAgMS4KIAotCXJlbG9jYXRlZEV4cG9ydCA9IChUVmVjdG9yICopIGZyYWdUb0ZpeC0+aW5pdFJvdXRpbmU7Ci0JCQotCS8vIFN0ZXAgMi4KLQkKLQkvLyBOb3cgZmluZCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3RvcidzIG9mZnNldHMgaW4gdGhlIGRhdGEgc2VjdGlvbiBvbiAKLQkvLyBkaXNrLiAgVGhpcyBnaXZlcyB1cyB0aGUgcmF3IG9mZnNldHMgZnJvbSB0aGUgZGF0YSBhbmQgY29kZSBzZWN0aW9uIAotCS8vIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluaXQgcm91dGluZS4KLQkKLQllcnIgPSBub0VycjsKLQlpbml0U2VjdGlvbiA9IGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+aW5pdFNlY3Rpb247Ci0JaW5pdE9mZnNldCAgPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRPZmZzZXQ7Ci0JaWYgKGluaXRTZWN0aW9uID09IC0xKSB7Ci0JCWVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKLQl9Ci0JaWYgKGVyciA9PSBub0VycikgewotCQlNb3JlQXNzZXJ0USggaW5pdFNlY3Rpb24gPj0gMCApOwkJLy8gTmVnYXRpdmUgaW5kZXhlcyBhcmUgcHNldWRvLXNlY3Rpb25zIHdoaWNoIGFyZSBqdXN0IG5vdCBhbGxvd2VkIQotCQlNb3JlQXNzZXJ0USggaW5pdFNlY3Rpb24gPCBmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci5zZWN0aW9uQ291bnQgKTsKKyAgICAvLyBGaXJzdCBmaW5kIHRoZSBpbml0IHJvdXRpbmUncyBUVmVjdG9yLCB3aGljaCBnaXZlcyB1cyB0aGUgcmVsb2NhdGVkCisgICAgLy8gb2Zmc2V0cyBvZiB0aGUgaW5pdCByb3V0aW5lIGludG8gdGhlIGRhdGEgYW5kIGNvZGUgc2VjdGlvbnMuCiAKLQkJaW5pdFNlY3Rpb25IZWFkZXIgPSAmZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl07Ci0JCQotCQkvLyBJZiB0aGUgZGF0YSBzZWN0aW9uIGlzIHBhY2tlZCwgdW5wYWNrIGl0IHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgdGhlbiBnZXQgdGhlIAotCQkvLyBvcmlnaW5hbCBvZmZzZXRzIGZyb20gdGhhdCBidWZmZXIuICBJZiB0aGUgZGF0YSBzZWN0aW9uIGlzIHVucGFja2VkLCBqdXN0IHJlYWQgCi0JCS8vIHRoZSBvcmlnaW5hbCBvZmZzZXRzIGRpcmVjdGx5IG9mZiB0aGUgZGlzay4KLQkJCi0JCWlmICggaW5pdFNlY3Rpb25IZWFkZXItPnNlY3Rpb25LaW5kID09IGtQRUZQYWNrZWREYXRhU2VjdGlvbiApIHsKKyAgICByZWxvY2F0ZWRFeHBvcnQgPSAoVFZlY3RvciAqKSBmcmFnVG9GaXgtPmluaXRSb3V0aW5lOwogCi0JCQkvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgcGFja2VkIGFuZCB1bnBhY2tlZCBjb3BpZXMgb2YgdGhlIHNlY3Rpb24uCi0JCQkKLQkJCXBhY2tlZERhdGFTZWN0aW9uID0gTmV3UHRyKGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJMZW5ndGgpOwotCQkJZXJyID0gTWVtRXJyb3IoKTsKKyAgICAvLyBTdGVwIDIuCiAKLQkJCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCQl1bnBhY2tlZERhdGFTZWN0aW9uID0gTmV3UHRyKGluaXRTZWN0aW9uSGVhZGVyLT51bnBhY2tlZExlbmd0aCk7Ci0JCQkJZXJyID0gTWVtRXJyb3IoKTsKLQkJCX0KKyAgICAvLyBOb3cgZmluZCB0aGUgaW5pdCByb3V0aW5lJ3MgVFZlY3RvcidzIG9mZnNldHMgaW4gdGhlIGRhdGEgc2VjdGlvbiBvbgorICAgIC8vIGRpc2suICBUaGlzIGdpdmVzIHVzIHRoZSByYXcgb2Zmc2V0cyBmcm9tIHRoZSBkYXRhIGFuZCBjb2RlIHNlY3Rpb24KKyAgICAvLyBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbml0IHJvdXRpbmUuCiAKLQkJCS8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZWQgc2VjdGlvbi4KLQkJCQotCQkJaWYgKGVyciA9PSBub0VycikgewotCQkJCWVyciA9IEZTUmVhZEF0T2Zmc2V0KAlmcmFnVG9GaXgtPmZpbGVSZWYsCi0JCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldAotCQkJCQkJCQkJCSsgaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lck9mZnNldCwKLQkJCQkJCQkJCQlpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoLAotCQkJCQkJCQkJCXBhY2tlZERhdGFTZWN0aW9uKTsKLQkJCX0KLQkJCQotCQkJLy8gVW5wYWNrIHRoZSBkYXRhIGludG8gdGhlIHVucGFja2VkIHNlY3Rpb24uCi0JCQkKLQkJCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCQllcnIgPSBVbnBhY2tQRUZEYXRhU2VjdGlvbiggKFVJbnQ4ICopIHBhY2tlZERhdGFTZWN0aW9uLCAgIGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJMZW5ndGgsCi0JCQkJCQkJCSAgICAgICAgICAgIChVSW50OCAqKSB1bnBhY2tlZERhdGFTZWN0aW9uLCBpbml0U2VjdGlvbkhlYWRlci0+dW5wYWNrZWRMZW5ndGgpOwotCQkJfQotCQkJCi0JCQkvLyBFeHRyYWN0IHRoZSBpbml0IHJvdXRpbmUncyBUVmVjdG9yIGZyb20gdGhlIHVucGFja2VkIHNlY3Rpb24uCi0JCQkKLQkJCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJCQlCbG9ja01vdmVEYXRhKHVucGFja2VkRGF0YVNlY3Rpb24gKyBpbml0T2Zmc2V0LCAmb3JpZ2luYWxPZmZzZXRzLCBzaXplb2YoVFZlY3RvcikpOwotCQkJfQotCQkJCi0JCX0gZWxzZSB7Ci0JCQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW2luaXRTZWN0aW9uXS5zZWN0aW9uS2luZCA9PSBrUEVGVW5wYWNrZWREYXRhU2VjdGlvbik7Ci0JCQllcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsIAotCQkJCQkJCQkJZnJhZ1RvRml4LT5sb2NhdG9yLm9mZnNldAotCQkJCQkJCQkJKyBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW2luaXRTZWN0aW9uXS5jb250YWluZXJPZmZzZXQKLQkJCQkJCQkJCSsgaW5pdE9mZnNldCwKLQkJCQkJCQkJCXNpemVvZihUVmVjdG9yKSwgCi0JCQkJCQkJCQkmb3JpZ2luYWxPZmZzZXRzKTsKLQkJfQotCX0KKyAgICBlcnIgPSBub0VycjsKKyAgICBpbml0U2VjdGlvbiA9IGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+aW5pdFNlY3Rpb247CisgICAgaW5pdE9mZnNldCAgPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmluaXRPZmZzZXQ7CisgICAgaWYgKGluaXRTZWN0aW9uID09IC0xKSB7CisgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKKyAgICB9CisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBNb3JlQXNzZXJ0USggaW5pdFNlY3Rpb24gPj0gMCApOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIGluZGV4ZXMgYXJlIHBzZXVkby1zZWN0aW9ucyB3aGljaCBhcmUganVzdCBub3QgYWxsb3dlZCEKKyAgICAgICAgTW9yZUFzc2VydFEoIGluaXRTZWN0aW9uIDwgZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIuc2VjdGlvbkNvdW50ICk7CiAKLQkvLyBTdGVwIDMuCi0JCQotCS8vIERvIHRoZSBtYXRocyB0byBzdWJ0cmFjdCB0aGUgdW5yZWxvY2F0ZWQgb2Zmc2V0cyBmcm9tIHRoZSBjdXJyZW50IGFkZHJlc3MgCi0JLy8gdG8gZ2V0IHRoZSBiYXNlIGFkZHJlc3MuCi0JCi0JaWYgKGVyciA9PSBub0VycikgewotCQlmcmFnVG9GaXgtPnNlY3Rpb24wQmFzZSA9ICgoY2hhciAqKSByZWxvY2F0ZWRFeHBvcnQtPmNvZGVQdHIpIC0gKFVJbnQzMikgb3JpZ2luYWxPZmZzZXRzLmNvZGVQdHI7Ci0JCWZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlID0gKChjaGFyICopIHJlbG9jYXRlZEV4cG9ydC0+dG9jUHRyKSAgLSAoVUludDMyKSBvcmlnaW5hbE9mZnNldHMudG9jUHRyOwotCX0KLQkKLQkvLyBDbGVhbiB1cC4KLQkKLQlpZiAocGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7Ci0JCURpc3Bvc2VQdHIocGFja2VkRGF0YVNlY3Rpb24pOwotCQlNb3JlQXNzZXJ0USggTWVtRXJyb3IoKSA9PSBub0VyciApOwotCX0KLQlpZiAodW5wYWNrZWREYXRhU2VjdGlvbiAhPSBuaWwpIHsKLQkJRGlzcG9zZVB0cih1bnBhY2tlZERhdGFTZWN0aW9uKTsKLQkJTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICAgICAgaW5pdFNlY3Rpb25IZWFkZXIgPSAmZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1tpbml0U2VjdGlvbl07CisKKyAgICAgICAgLy8gSWYgdGhlIGRhdGEgc2VjdGlvbiBpcyBwYWNrZWQsIHVucGFjayBpdCB0byBhIHRlbXBvcmFyeSBidWZmZXIgYW5kIHRoZW4gZ2V0IHRoZQorICAgICAgICAvLyBvcmlnaW5hbCBvZmZzZXRzIGZyb20gdGhhdCBidWZmZXIuICBJZiB0aGUgZGF0YSBzZWN0aW9uIGlzIHVucGFja2VkLCBqdXN0IHJlYWQKKyAgICAgICAgLy8gdGhlIG9yaWdpbmFsIG9mZnNldHMgZGlyZWN0bHkgb2ZmIHRoZSBkaXNrLgorCisgICAgICAgIGlmICggaW5pdFNlY3Rpb25IZWFkZXItPnNlY3Rpb25LaW5kID09IGtQRUZQYWNrZWREYXRhU2VjdGlvbiApIHsKKworICAgICAgICAgICAgLy8gQWxsb2NhdGUgc3BhY2UgZm9yIHBhY2tlZCBhbmQgdW5wYWNrZWQgY29waWVzIG9mIHRoZSBzZWN0aW9uLgorCisgICAgICAgICAgICBwYWNrZWREYXRhU2VjdGlvbiA9IE5ld1B0cihpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyTGVuZ3RoKTsKKyAgICAgICAgICAgIGVyciA9IE1lbUVycm9yKCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICB1bnBhY2tlZERhdGFTZWN0aW9uID0gTmV3UHRyKGluaXRTZWN0aW9uSGVhZGVyLT51bnBhY2tlZExlbmd0aCk7CisgICAgICAgICAgICAgICAgZXJyID0gTWVtRXJyb3IoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tlZCBzZWN0aW9uLgorCisgICAgICAgICAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgICAgICAgICAgZXJyID0gRlNSZWFkQXRPZmZzZXQoICAgICAgICAgICAgICAgICAgIGZyYWdUb0ZpeC0+ZmlsZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbml0U2VjdGlvbkhlYWRlci0+Y29udGFpbmVyT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZWN0aW9uSGVhZGVyLT5jb250YWluZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2VkRGF0YVNlY3Rpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBVbnBhY2sgdGhlIGRhdGEgaW50byB0aGUgdW5wYWNrZWQgc2VjdGlvbi4KKworICAgICAgICAgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICAgICAgICAgIGVyciA9IFVucGFja1BFRkRhdGFTZWN0aW9uKCAoVUludDggKikgcGFja2VkRGF0YVNlY3Rpb24sICAgaW5pdFNlY3Rpb25IZWFkZXItPmNvbnRhaW5lckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSW50OCAqKSB1bnBhY2tlZERhdGFTZWN0aW9uLCBpbml0U2VjdGlvbkhlYWRlci0+dW5wYWNrZWRMZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBpbml0IHJvdXRpbmUncyBUVmVjdG9yIGZyb20gdGhlIHVucGFja2VkIHNlY3Rpb24uCisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICBCbG9ja01vdmVEYXRhKHVucGFja2VkRGF0YVNlY3Rpb24gKyBpbml0T2Zmc2V0LCAmb3JpZ2luYWxPZmZzZXRzLCBzaXplb2YoVFZlY3RvcikpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzW2luaXRTZWN0aW9uXS5zZWN0aW9uS2luZCA9PSBrUEVGVW5wYWNrZWREYXRhU2VjdGlvbik7CisgICAgICAgICAgICBlcnIgPSBGU1JlYWRBdE9mZnNldChmcmFnVG9GaXgtPmZpbGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnVG9GaXgtPmxvY2F0b3Iub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbaW5pdFNlY3Rpb25dLmNvbnRhaW5lck9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbml0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yaWdpbmFsT2Zmc2V0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdGVwIDMuCisKKyAgICAvLyBEbyB0aGUgbWF0aHMgdG8gc3VidHJhY3QgdGhlIHVucmVsb2NhdGVkIG9mZnNldHMgZnJvbSB0aGUgY3VycmVudCBhZGRyZXNzCisgICAgLy8gdG8gZ2V0IHRoZSBiYXNlIGFkZHJlc3MuCisKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGZyYWdUb0ZpeC0+c2VjdGlvbjBCYXNlID0gKChjaGFyICopIHJlbG9jYXRlZEV4cG9ydC0+Y29kZVB0cikgLSAoVUludDMyKSBvcmlnaW5hbE9mZnNldHMuY29kZVB0cjsKKyAgICAgICAgZnJhZ1RvRml4LT5zZWN0aW9uMUJhc2UgPSAoKGNoYXIgKikgcmVsb2NhdGVkRXhwb3J0LT50b2NQdHIpICAtIChVSW50MzIpIG9yaWdpbmFsT2Zmc2V0cy50b2NQdHI7CisgICAgfQorCisgICAgLy8gQ2xlYW4gdXAuCisKKyAgICBpZiAocGFja2VkRGF0YVNlY3Rpb24gIT0gbmlsKSB7CisgICAgICAgIERpc3Bvc2VQdHIocGFja2VkRGF0YVNlY3Rpb24pOworICAgICAgICBNb3JlQXNzZXJ0USggTWVtRXJyb3IoKSA9PSBub0VyciApOworICAgIH0KKyAgICBpZiAodW5wYWNrZWREYXRhU2VjdGlvbiAhPSBuaWwpIHsKKyAgICAgICAgRGlzcG9zZVB0cih1bnBhY2tlZERhdGFTZWN0aW9uKTsKKyAgICAgICAgTW9yZUFzc2VydFEoIE1lbUVycm9yKCkgPT0gbm9FcnIgKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgKkdldFNlY3Rpb25CYXNlQWRkcmVzcyhjb25zdCBGcmFnVG9GaXhJbmZvICpmcmFnVG9GaXgsIFVJbnQxNiBzZWN0aW9uSW5kZXgpCi0JLy8gVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIGJhc2Ugb2YgdGhlIGluc3RhbnRpYXRlZCBzZWN0aW9uCi0JLy8gd2hvc2UgaW5kZXggaXMgc2VjdGlvbkluZGV4LiAgVGhpcyByb3V0aW5lIGlzIHRoZSBldmlsIHR3aW4KLQkvLyBvZiBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzLiAgSXQgc2ltcGx5IHJldHVybnMgdGhlIHZhbHVlcwotCS8vIGZvciBzZWN0aW9uIDAgYW5kIDEgdGhhdCB3ZSBkZXJpdmVkIGluIFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMuCi0JLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGlzIHJvdXRpbmUgd291bGQgY2FsbCBDRk0gQVBJCi0JLy8gdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24sIGFuZCBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzIHdvdWxkCi0JLy8gbm90IGV4aXN0LCBidXQgQ0ZNIGRvZXMgbm90IGV4cG9ydCB0aGUgbmVjZXNzYXJ5IEFQSXMgdG8KLQkvLyB0aGlyZCBwYXJ0aWVzLgorICAgIC8vIFRoaXMgcm91dGluZSByZXR1cm5zIHRoZSBiYXNlIG9mIHRoZSBpbnN0YW50aWF0ZWQgc2VjdGlvbgorICAgIC8vIHdob3NlIGluZGV4IGlzIHNlY3Rpb25JbmRleC4gIFRoaXMgcm91dGluZSBpcyB0aGUgZXZpbCB0d2luCisgICAgLy8gb2YgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3Nlcy4gIEl0IHNpbXBseSByZXR1cm5zIHRoZSB2YWx1ZXMKKyAgICAvLyBmb3Igc2VjdGlvbiAwIGFuZCAxIHRoYXQgd2UgZGVyaXZlZCBpbiBTZXR1cFNlY3Rpb25CYXNlQWRkcmVzc2VzLgorICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyByb3V0aW5lIHdvdWxkIGNhbGwgQ0ZNIEFQSQorICAgIC8vIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uLCBhbmQgU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcyB3b3VsZAorICAgIC8vIG5vdCBleGlzdCwgYnV0IENGTSBkb2VzIG5vdCBleHBvcnQgdGhlIG5lY2Vzc2FyeSBBUElzIHRvCisgICAgLy8gdGhpcmQgcGFydGllcy4KIHsKLQl2b2lkICpyZXN1bHQ7Ci0JCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5jb250YWluZXJIZWFkZXIudGFnMSA9PSBrUEVGVGFnMSk7Ci0JCi0Jc3dpdGNoIChzZWN0aW9uSW5kZXgpIHsKLQkJY2FzZSAwOgotCQkJcmVzdWx0ID0gZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2U7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcmVzdWx0ID0gZnJhZ1RvRml4LT5zZWN0aW9uMUJhc2U7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJlc3VsdCA9IG5pbDsKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gcmVzdWx0OworICAgIHZvaWQgKnJlc3VsdDsKKworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgPT0ga1BFRlRhZzEpOworCisgICAgc3dpdGNoIChzZWN0aW9uSW5kZXgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcmVzdWx0ID0gZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmVzdWx0ID0gZnJhZ1RvRml4LT5zZWN0aW9uMUJhc2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJlc3VsdCA9IG5pbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAKIHN0YXRpYyBPU1N0YXR1cyBGaW5kSW1wb3J0TGlicmFyeShQRUZMb2FkZXJJbmZvSGVhZGVyICpsb2FkZXJTZWN0aW9uLCBjb25zdCBjaGFyICpsaWJyYXJ5TmFtZSwgUEVGSW1wb3J0ZWRMaWJyYXJ5ICoqaW1wb3J0TGlicmFyeSkKLQkvLyBUaGlzIHJvdXRpbmUgZmluZHMgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uIChQRUZJbXBvcnRlZExpYnJhcnkpCi0JLy8gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBsaWJyYXJ5TmFtZSBpbiB0aGUgUEVGIGxvYWRlciBzZWN0aW9uLgotCS8vIEl0IHNldHMgKmltcG9ydExpYnJhcnkgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlc2NyaXB0aW9uLgorICAgIC8vIFRoaXMgcm91dGluZSBmaW5kcyB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24gKFBFRkltcG9ydGVkTGlicmFyeSkKKyAgICAvLyBmb3IgdGhlIGltcG9ydCBsaWJyYXJ5IGxpYnJhcnlOYW1lIGluIHRoZSBQRUYgbG9hZGVyIHNlY3Rpb24uCisgICAgLy8gSXQgc2V0cyAqaW1wb3J0TGlicmFyeSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZGVzY3JpcHRpb24uCiB7Ci0JT1NTdGF0dXMgCQkJZXJyOwotCVVJbnQzMiAJCQkJbGlicmFyaWVzUmVtYWluaW5nOwotCVBFRkltcG9ydGVkTGlicmFyeSAJKnRoaXNJbXBvcnRMaWJyYXJ5OwotCUJvb2xlYW4gCQkJZm91bmQ7Ci0JCi0JTW9yZUFzc2VydFEobG9hZGVyU2VjdGlvbiAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKGxpYnJhcnlOYW1lICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoaW1wb3J0TGlicmFyeSAhPSBuaWwpOwotCQotCS8vIExvb3AgdGhyb3VnaCBlYWNoIGltcG9ydCBsaWJyYXJ5IGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcgbmFtZS4KLQkKLQkvLyBJbml0aWFsaXNlIHRoaXNJbXBvcnRMaWJyYXJ5IHRvIHBvaW50IHRvIHRoZSBieXRlIGFmdGVyIHRoZQotCS8vIGVuZCBvZiB0aGUgbG9hZGVyIHNlY3Rpb24ncyBoZWFkZXIuCi0JCi0JdGhpc0ltcG9ydExpYnJhcnkgPSAoUEVGSW1wb3J0ZWRMaWJyYXJ5ICopIChsb2FkZXJTZWN0aW9uICsgMSk7Ci0JbGlicmFyaWVzUmVtYWluaW5nID0gbG9hZGVyU2VjdGlvbi0+aW1wb3J0ZWRMaWJyYXJ5Q291bnQ7Ci0JZm91bmQgPSBmYWxzZTsKLQl3aGlsZSAoIGxpYnJhcmllc1JlbWFpbmluZyA+IDAgJiYgISBmb3VuZCApIHsKLQkJLy8gUEVGIGRlZmluZXMgdGhhdCBpbXBvcnQgbGlicmFyeSBuYW1lcyB3aWxsIGhhdmUKLQkJLy8gYSBudWxsIHRlcm1pbmF0b3IsIHNvIHdlIGNhbiBqdXN0IHVzZSBzdHJjbXAuCi0JCWZvdW5kID0gKHN0cmNtcCggbGlicmFyeU5hbWUsCi0JCQkJCQkoKGNoYXIgKilsb2FkZXJTZWN0aW9uKQotCQkJCQkJKyBsb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0IAotCQkJCQkJKyB0aGlzSW1wb3J0TGlicmFyeS0+bmFtZU9mZnNldCkgPT0gMCk7Ci0JCS8vICoqKiBSZW1vdmUgQU5TSSBzdHJjbXAgZXZlbnR1YWxseS4KLQkJaWYgKCAhIGZvdW5kICkgewotCQkJdGhpc0ltcG9ydExpYnJhcnkgKz0gMTsKLQkJCWxpYnJhcmllc1JlbWFpbmluZyAtPSAxOwotCQl9Ci0JfQotCQotCWlmIChmb3VuZCkgewotCQkqaW1wb3J0TGlicmFyeSA9IHRoaXNJbXBvcnRMaWJyYXJ5OwotCQllcnIgPSBub0VycjsKLQl9IGVsc2UgewotCQkqaW1wb3J0TGlicmFyeSA9IG5pbDsKLQkJZXJyID0gY2ZyYWdOb0xpYnJhcnlFcnI7Ci0JfQotCXJldHVybiBlcnI7CisgICAgT1NTdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyOworICAgIFVJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllc1JlbWFpbmluZzsKKyAgICBQRUZJbXBvcnRlZExpYnJhcnkgICAgICAgICAgKnRoaXNJbXBvcnRMaWJyYXJ5OworICAgIEJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kOworCisgICAgTW9yZUFzc2VydFEobG9hZGVyU2VjdGlvbiAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGxpYnJhcnlOYW1lICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoaW1wb3J0TGlicmFyeSAhPSBuaWwpOworCisgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggaW1wb3J0IGxpYnJhcnkgbG9va2luZyBmb3IgYSBtYXRjaGluZyBuYW1lLgorCisgICAgLy8gSW5pdGlhbGlzZSB0aGlzSW1wb3J0TGlicmFyeSB0byBwb2ludCB0byB0aGUgYnl0ZSBhZnRlciB0aGUKKyAgICAvLyBlbmQgb2YgdGhlIGxvYWRlciBzZWN0aW9uJ3MgaGVhZGVyLgorCisgICAgdGhpc0ltcG9ydExpYnJhcnkgPSAoUEVGSW1wb3J0ZWRMaWJyYXJ5ICopIChsb2FkZXJTZWN0aW9uICsgMSk7CisgICAgbGlicmFyaWVzUmVtYWluaW5nID0gbG9hZGVyU2VjdGlvbi0+aW1wb3J0ZWRMaWJyYXJ5Q291bnQ7CisgICAgZm91bmQgPSBmYWxzZTsKKyAgICB3aGlsZSAoIGxpYnJhcmllc1JlbWFpbmluZyA+IDAgJiYgISBmb3VuZCApIHsKKyAgICAgICAgLy8gUEVGIGRlZmluZXMgdGhhdCBpbXBvcnQgbGlicmFyeSBuYW1lcyB3aWxsIGhhdmUKKyAgICAgICAgLy8gYSBudWxsIHRlcm1pbmF0b3IsIHNvIHdlIGNhbiBqdXN0IHVzZSBzdHJjbXAuCisgICAgICAgIGZvdW5kID0gKHN0cmNtcCggbGlicmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyICopbG9hZGVyU2VjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxvYWRlclNlY3Rpb24tPmxvYWRlclN0cmluZ3NPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXNJbXBvcnRMaWJyYXJ5LT5uYW1lT2Zmc2V0KSA9PSAwKTsKKyAgICAgICAgLy8gKioqIFJlbW92ZSBBTlNJIHN0cmNtcCBldmVudHVhbGx5LgorICAgICAgICBpZiAoICEgZm91bmQgKSB7CisgICAgICAgICAgICB0aGlzSW1wb3J0TGlicmFyeSArPSAxOworICAgICAgICAgICAgbGlicmFyaWVzUmVtYWluaW5nIC09IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgKmltcG9ydExpYnJhcnkgPSB0aGlzSW1wb3J0TGlicmFyeTsKKyAgICAgICAgZXJyID0gbm9FcnI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmltcG9ydExpYnJhcnkgPSBuaWw7CisgICAgICAgIGVyciA9IGNmcmFnTm9MaWJyYXJ5RXJyOworICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgT1NTdGF0dXMgTG9va3VwU3ltYm9sKENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwgdm9pZCAqcmVmQ29uLAotCQkJCQkJCVBFRkxvYWRlckluZm9IZWFkZXIgKmxvYWRlclNlY3Rpb24sCi0JCQkJCQkJVUludDMyIHN5bWJvbEluZGV4LAotCQkJCQkJCVVJbnQzMiAqc3ltYm9sVmFsdWUpCi0JLy8gVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gbG9vayB1cCBhIHN5bWJvbCBkdXJpbmcgcmVsb2NhdGlvbi4KLQkvLyAibG9va3VwIiBpcyBhIGNsaWVudCBjYWxsYmFjayBhbmQgcmVmQ29uIGlzIGl0cyBhcmd1bWVudC4KLQkvLyBUeXBpY2FsbHkgcmVmQ29uIGlzIHRoZSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IGlzCi0JLy8gc3Vic3RpdHV0aW5nIGZvciB0aGUgd2VhayBsaW5rZWQgbGlicmFyeS4gIGxvYWRlclNlY3Rpb24KLQkvLyBpcyBhIHBvaW50ZXIgdG8gdGhlIGxvYWRlciBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudCB0byBmaXggdXAuCi0JLy8gc3ltYm9sSW5kZXggaXMgdGhlIGluZGV4IG9mIHRoZSBpbXBvcnRlZCBzeW1ib2wgaW4gdGhlIGxvYWRlciBzZWN0aW9uLgotCS8vIFRoZSByb3V0aW5lIHNldHMgdGhlIHdvcmQgcG9pbnRlZCB0byBieSBzeW1ib2xWYWx1ZSB0byB0aGUKLQkvLyB2YWx1ZSBvZiB0aGUgc3ltYm9sLgotCS8vCi0JLy8gVGhlIHJvdXRpbmUgd29ya3MgYnkgdXNpbmcgc3ltYm9sSW5kZXggdG8gaW5kZXggaW50byB0aGUgaW1wb3J0ZWQKLQkvLyBzeW1ib2wgdGFibGUgdG8gZmluZCB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wncyBuYW1lIGluIHRoZSBzdHJpbmcKLQkvLyB0YWJsZS4gIEl0IHRoZW4gbG9va3MgdXAgdGhlIHN5bWJvbCBieSBjYWxsaW5nIHRoZSBjbGllbnQncyAibG9va3VwIgotCS8vIGZ1bmN0aW9uIGFuZCBwYXNzZXMgdGhlIHJlc3VsdGluZyBzeW1ib2wgYWRkcmVzcyBiYWNrIGluIHN5bWJvbFZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUZMb2FkZXJJbmZvSGVhZGVyICpsb2FkZXJTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MzIgc3ltYm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAqc3ltYm9sVmFsdWUpCisgICAgLy8gVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gbG9vayB1cCBhIHN5bWJvbCBkdXJpbmcgcmVsb2NhdGlvbi4KKyAgICAvLyAibG9va3VwIiBpcyBhIGNsaWVudCBjYWxsYmFjayBhbmQgcmVmQ29uIGlzIGl0cyBhcmd1bWVudC4KKyAgICAvLyBUeXBpY2FsbHkgcmVmQ29uIGlzIHRoZSBDRk0gY29ubmVjdGlvbiB0byB0aGUgbGlicmFyeSB0aGF0IGlzCisgICAgLy8gc3Vic3RpdHV0aW5nIGZvciB0aGUgd2VhayBsaW5rZWQgbGlicmFyeS4gIGxvYWRlclNlY3Rpb24KKyAgICAvLyBpcyBhIHBvaW50ZXIgdG8gdGhlIGxvYWRlciBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudCB0byBmaXggdXAuCisgICAgLy8gc3ltYm9sSW5kZXggaXMgdGhlIGluZGV4IG9mIHRoZSBpbXBvcnRlZCBzeW1ib2wgaW4gdGhlIGxvYWRlciBzZWN0aW9uLgorICAgIC8vIFRoZSByb3V0aW5lIHNldHMgdGhlIHdvcmQgcG9pbnRlZCB0byBieSBzeW1ib2xWYWx1ZSB0byB0aGUKKyAgICAvLyB2YWx1ZSBvZiB0aGUgc3ltYm9sLgorICAgIC8vCisgICAgLy8gVGhlIHJvdXRpbmUgd29ya3MgYnkgdXNpbmcgc3ltYm9sSW5kZXggdG8gaW5kZXggaW50byB0aGUgaW1wb3J0ZWQKKyAgICAvLyBzeW1ib2wgdGFibGUgdG8gZmluZCB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wncyBuYW1lIGluIHRoZSBzdHJpbmcKKyAgICAvLyB0YWJsZS4gIEl0IHRoZW4gbG9va3MgdXAgdGhlIHN5bWJvbCBieSBjYWxsaW5nIHRoZSBjbGllbnQncyAibG9va3VwIgorICAgIC8vIGZ1bmN0aW9uIGFuZCBwYXNzZXMgdGhlIHJlc3VsdGluZyBzeW1ib2wgYWRkcmVzcyBiYWNrIGluIHN5bWJvbFZhbHVlLgogewotCU9TU3RhdHVzIAkJCWVycjsKLQlVSW50MzIgCQkJCSppbXBvcnRTeW1ib2xUYWJsZTsKLQlVSW50MzIgCQkJCXN5bWJvbFN0cmluZ09mZnNldDsKLQlCb29sZWFuIAkJCXN5bWJvbElzV2VhazsKLQlDRnJhZ1N5bWJvbENsYXNzIAlzeW1ib2xDbGFzczsKLQljaGFyIAkJCQkqc3ltYm9sU3RyaW5nQWRkcmVzczsKLQlTdHIyNTUgCQkJCXN5bWJvbFN0cmluZzsKLQkKLQlNb3JlQXNzZXJ0UShsb29rdXAgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShsb2FkZXJTZWN0aW9uICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoc3ltYm9sSW5kZXggPCBsb2FkZXJTZWN0aW9uLT50b3RhbEltcG9ydGVkU3ltYm9sQ291bnQpOwotCU1vcmVBc3NlcnRRKHN5bWJvbFZhbHVlICE9IG5pbCk7Ci0JCi0JLy8gRmluZCB0aGUgYmFzZSBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIHRhYmxlLgotCQotCWltcG9ydFN5bWJvbFRhYmxlID0gKFVJbnQzMiAqKSgoKGNoYXIgKikobG9hZGVyU2VjdGlvbiArIDEpKSArIChsb2FkZXJTZWN0aW9uLT5pbXBvcnRlZExpYnJhcnlDb3VudCAqIHNpemVvZihQRUZJbXBvcnRlZExpYnJhcnkpKSk7Ci0JCi0JLy8gR3JhYiB0aGUgYXBwcm9wcmlhdGUgZW50cnkgb3V0IG9mIHRoZSB0YWJsZSBhbmQKLQkvLyBleHRyYWN0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoYXQgZW50cnkuCi0JCi0Jc3ltYm9sU3RyaW5nT2Zmc2V0ID0gaW1wb3J0U3ltYm9sVGFibGVbc3ltYm9sSW5kZXhdOwotCXN5bWJvbENsYXNzID0gUEVGSW1wb3J0ZWRTeW1ib2xDbGFzcyhzeW1ib2xTdHJpbmdPZmZzZXQpOwotCXN5bWJvbElzV2VhayA9ICgoc3ltYm9sQ2xhc3MgJiBrUEVGV2Vha0ltcG9ydFN5bU1hc2spICE9IDApOwotCXN5bWJvbENsYXNzID0gc3ltYm9sQ2xhc3MgJiB+a1BFRldlYWtJbXBvcnRTeW1NYXNrOwotCXN5bWJvbFN0cmluZ09mZnNldCA9IFBFRkltcG9ydGVkU3ltYm9sTmFtZU9mZnNldChzeW1ib2xTdHJpbmdPZmZzZXQpOwotCQotCS8vIEZpbmQgdGhlIHN0cmluZyBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgc3RyaW5ncyB0YWJsZSBhbmQKLQkvLyBleHRyYWN0IGl0IGZyb20gdGhlIHRhYmxlIGludG8gYSBQYXNjYWwgc3RyaW5nIG9uIHRoZSBzdGFjay4KLQkKLQlzeW1ib2xTdHJpbmdBZGRyZXNzID0gKChjaGFyICopbG9hZGVyU2VjdGlvbikgKyBsb2FkZXJTZWN0aW9uLT5sb2FkZXJTdHJpbmdzT2Zmc2V0ICsgc3ltYm9sU3RyaW5nT2Zmc2V0OwotCXN5bWJvbFN0cmluZ1swXSA9IHN0cmxlbihzeW1ib2xTdHJpbmdBZGRyZXNzKTsJCS8vICoqKiByZW1vdmUgQU5TSSBzdHJsZW4KLQlCbG9ja01vdmVEYXRhKHN5bWJvbFN0cmluZ0FkZHJlc3MsICZzeW1ib2xTdHJpbmdbMV0sIHN5bWJvbFN0cmluZ1swXSk7Ci0JCi0JLy8gTG9vayB1cCB0aGUgc3ltYm9sIGluIHN1YnN0aXR1dGUgbGlicmFyeS4gIElmIGl0IGZhaWxzLCByZXR1cm4KLQkvLyBhIDAgdmFsdWUgYW5kIGNoZWNrIHdoZXRoZXIgdGhlIGVycm9yIGlzIGZhdGFsIChhIHN0cm9uZyBsaW5rZWQKLQkvLyBzeW1ib2wpIG9yIGJlbmlnbiAoYSB3ZWFrIGxpbmtlZCBzeW1ib2wpLgotCQotCWVyciA9IGxvb2t1cChzeW1ib2xTdHJpbmcsIHN5bWJvbENsYXNzLCAodm9pZCAqKikgc3ltYm9sVmFsdWUsIHJlZkNvbik7Ci0JaWYgKGVyciAhPSBub0VycikgewotCQkqc3ltYm9sVmFsdWUgPSAwOwotCQlpZiAoc3ltYm9sSXNXZWFrKSB7Ci0JCQllcnIgPSBub0VycjsKLQkJfQotCX0KLQlyZXR1cm4gZXJyOworICAgIE9TU3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKyAgICBVSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW1wb3J0U3ltYm9sVGFibGU7CisgICAgVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sU3RyaW5nT2Zmc2V0OworICAgIEJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbElzV2VhazsKKyAgICBDRnJhZ1N5bWJvbENsYXNzICAgICAgICAgICAgc3ltYm9sQ2xhc3M7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN5bWJvbFN0cmluZ0FkZHJlc3M7CisgICAgU3RyMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sU3RyaW5nOworCisgICAgTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEobG9hZGVyU2VjdGlvbiAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKHN5bWJvbEluZGV4IDwgbG9hZGVyU2VjdGlvbi0+dG90YWxJbXBvcnRlZFN5bWJvbENvdW50KTsKKyAgICBNb3JlQXNzZXJ0UShzeW1ib2xWYWx1ZSAhPSBuaWwpOworCisgICAgLy8gRmluZCB0aGUgYmFzZSBvZiB0aGUgaW1wb3J0ZWQgc3ltYm9sIHRhYmxlLgorCisgICAgaW1wb3J0U3ltYm9sVGFibGUgPSAoVUludDMyICopKCgoY2hhciAqKShsb2FkZXJTZWN0aW9uICsgMSkpICsgKGxvYWRlclNlY3Rpb24tPmltcG9ydGVkTGlicmFyeUNvdW50ICogc2l6ZW9mKFBFRkltcG9ydGVkTGlicmFyeSkpKTsKKworICAgIC8vIEdyYWIgdGhlIGFwcHJvcHJpYXRlIGVudHJ5IG91dCBvZiB0aGUgdGFibGUgYW5kCisgICAgLy8gZXh0cmFjdCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGF0IGVudHJ5LgorCisgICAgc3ltYm9sU3RyaW5nT2Zmc2V0ID0gaW1wb3J0U3ltYm9sVGFibGVbc3ltYm9sSW5kZXhdOworICAgIHN5bWJvbENsYXNzID0gUEVGSW1wb3J0ZWRTeW1ib2xDbGFzcyhzeW1ib2xTdHJpbmdPZmZzZXQpOworICAgIHN5bWJvbElzV2VhayA9ICgoc3ltYm9sQ2xhc3MgJiBrUEVGV2Vha0ltcG9ydFN5bU1hc2spICE9IDApOworICAgIHN5bWJvbENsYXNzID0gc3ltYm9sQ2xhc3MgJiB+a1BFRldlYWtJbXBvcnRTeW1NYXNrOworICAgIHN5bWJvbFN0cmluZ09mZnNldCA9IFBFRkltcG9ydGVkU3ltYm9sTmFtZU9mZnNldChzeW1ib2xTdHJpbmdPZmZzZXQpOworCisgICAgLy8gRmluZCB0aGUgc3RyaW5nIGZvciB0aGUgc3ltYm9sIGluIHRoZSBzdHJpbmdzIHRhYmxlIGFuZAorICAgIC8vIGV4dHJhY3QgaXQgZnJvbSB0aGUgdGFibGUgaW50byBhIFBhc2NhbCBzdHJpbmcgb24gdGhlIHN0YWNrLgorCisgICAgc3ltYm9sU3RyaW5nQWRkcmVzcyA9ICgoY2hhciAqKWxvYWRlclNlY3Rpb24pICsgbG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCArIHN5bWJvbFN0cmluZ09mZnNldDsKKyAgICBzeW1ib2xTdHJpbmdbMF0gPSBzdHJsZW4oc3ltYm9sU3RyaW5nQWRkcmVzcyk7ICAgICAgICAgICAgICAvLyAqKiogcmVtb3ZlIEFOU0kgc3RybGVuCisgICAgQmxvY2tNb3ZlRGF0YShzeW1ib2xTdHJpbmdBZGRyZXNzLCAmc3ltYm9sU3RyaW5nWzFdLCBzeW1ib2xTdHJpbmdbMF0pOworCisgICAgLy8gTG9vayB1cCB0aGUgc3ltYm9sIGluIHN1YnN0aXR1dGUgbGlicmFyeS4gIElmIGl0IGZhaWxzLCByZXR1cm4KKyAgICAvLyBhIDAgdmFsdWUgYW5kIGNoZWNrIHdoZXRoZXIgdGhlIGVycm9yIGlzIGZhdGFsIChhIHN0cm9uZyBsaW5rZWQKKyAgICAvLyBzeW1ib2wpIG9yIGJlbmlnbiAoYSB3ZWFrIGxpbmtlZCBzeW1ib2wpLgorCisgICAgZXJyID0gbG9va3VwKHN5bWJvbFN0cmluZywgc3ltYm9sQ2xhc3MsICh2b2lkICoqKSBzeW1ib2xWYWx1ZSwgcmVmQ29uKTsKKyAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICpzeW1ib2xWYWx1ZSA9IDA7CisgICAgICAgIGlmIChzeW1ib2xJc1dlYWspIHsKKyAgICAgICAgICAgIGVyciA9IG5vRXJyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIC8vIFRoZSBFbmdpbmVTdGF0ZSBzdHJ1Y3R1cmUgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgcGVyc2lzdGVudCBzdGF0ZQpAQCAtNzcxLDEzICs3NzEsMTMgQEAKIC8vIGluc3RydWN0aW9uYWwgZGVzaWduLgogCiBzdHJ1Y3QgRW5naW5lU3RhdGUgewotCVVJbnQzMiBjdXJyZW50UmVsb2M7CQkvLyBJbmRleCBvZiBjdXJyZW50IHJlbG9jYXRpb24gb3Bjb2RlcwotCVVJbnQzMiB0ZXJtaW5hdGluZ1JlbG9jOwkvLyBJbmRleCBvZiByZWxvY2F0aW9uIG9wY29kZXMgd2hpY2ggdGVybWluYXRlcyByZWxvY2F0aW9uCi0JVUludDMyICpzZWN0aW9uQmFzZTsJCS8vIFN0YXJ0IG9mIHRoZSBzZWN0aW9uCi0JVUludDMyICpyZWxvY0FkZHJlc3M7CQkvLyBBZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiB3aGVyZSB0aGUgcmVsb2NhdGlvbnMgYXJlIHRvIGJlIHBlcmZvcm1lZAotCVVJbnQzMiBpbXBvcnRJbmRleDsJCQkvLyBTeW1ib2wgaW5kZXgsIHdoaWNoIGlzIHVzZWQgdG8gYWNjZXNzIGFuIGltcG9ydGVkIHN5bWJvbCdzIGFkZHJlc3MKLQl2b2lkICAqc2VjdGlvbkM7CQkJLy8gTWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gd2l0aGluIHRoZSBQRUYgY29udGFpbmVyOyB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcmVsb2NhdGlvbiBvcGNvZGVzIHRoYXQgcmVsb2NhdGUgc2VjdGlvbiBhZGRyZXNzZXMKLQl2b2lkICAqc2VjdGlvbkQ7CQkJLy8gTWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gd2l0aGluIHRoZSBQRUYgY29udGFpbmVyOyB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcmVsb2NhdGlvbiBvcGNvZGVzIHRoYXQgcmVsb2NhdGUgc2VjdGlvbiBhZGRyZXNzZXMKKyAgICBVSW50MzIgY3VycmVudFJlbG9jOyAgICAgICAgICAgICAgICAvLyBJbmRleCBvZiBjdXJyZW50IHJlbG9jYXRpb24gb3Bjb2RlcworICAgIFVJbnQzMiB0ZXJtaW5hdGluZ1JlbG9jOyAgICAgICAgICAgIC8vIEluZGV4IG9mIHJlbG9jYXRpb24gb3Bjb2RlcyB3aGljaCB0ZXJtaW5hdGVzIHJlbG9jYXRpb24KKyAgICBVSW50MzIgKnNlY3Rpb25CYXNlOyAgICAgICAgICAgICAgICAvLyBTdGFydCBvZiB0aGUgc2VjdGlvbgorICAgIFVJbnQzMiAqcmVsb2NBZGRyZXNzOyAgICAgICAgICAgICAgIC8vIEFkZHJlc3Mgd2l0aGluIHRoZSBzZWN0aW9uIHdoZXJlIHRoZSByZWxvY2F0aW9ucyBhcmUgdG8gYmUgcGVyZm9ybWVkCisgICAgVUludDMyIGltcG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2wgaW5kZXgsIHdoaWNoIGlzIHVzZWQgdG8gYWNjZXNzIGFuIGltcG9ydGVkIHN5bWJvbCdzIGFkZHJlc3MKKyAgICB2b2lkICAqc2VjdGlvbkM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbW9yeSBhZGRyZXNzIG9mIGFuIGluc3RhbnRpYXRlZCBzZWN0aW9uIHdpdGhpbiB0aGUgUEVGIGNvbnRhaW5lcjsgdGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IHJlbG9jYXRpb24gb3Bjb2RlcyB0aGF0IHJlbG9jYXRlIHNlY3Rpb24gYWRkcmVzc2VzCisgICAgdm9pZCAgKnNlY3Rpb25EOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW1vcnkgYWRkcmVzcyBvZiBhbiBpbnN0YW50aWF0ZWQgc2VjdGlvbiB3aXRoaW4gdGhlIFBFRiBjb250YWluZXI7IHRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSByZWxvY2F0aW9uIG9wY29kZXMgdGhhdCByZWxvY2F0ZSBzZWN0aW9uIGFkZHJlc3NlcwogfTsKIHR5cGVkZWYgc3RydWN0IEVuZ2luZVN0YXRlIEVuZ2luZVN0YXRlOwogCkBAIC03ODYsODMgKzc4Niw4MyBAQAogLy8gaGF2ZSB0byBhZGQgYSByZXBlYXQgY291bnRlciB0byBFbmdpbmVTdGF0ZS4KIAogc3RhdGljIE9TU3RhdHVzIEluaXRFbmdpbmVTdGF0ZShjb25zdCBGcmFnVG9GaXhJbmZvICpmcmFnVG9GaXgsCi0JCQkJCQkJCVVJbnQxNiByZWxvY0hlYWRlckluZGV4LAotCQkJCQkJCQlFbmdpbmVTdGF0ZSAqc3RhdGUpCi0JLy8gVGhpcyByb3V0aW5lIGluaXRpYWxpc2VzIHRoZSBlbmdpbmUgc3RhdGUgc3VpdGFibHkgZm9yCi0JLy8gcnVubmluZyB0aGUgcmVsb2NhdGlvbiBvcGNvZGVzIGZvciB0aGUgc2VjdGlvbiB3aG9zZQotCS8vIGluZGV4IGlzIHJlbG9jSGVhZGVySW5kZXguICByZWxvY0hlYWRlckluZGV4IGlzIG5vdCBhCi0JLy8gYSBzZWN0aW9uIG51bWJlci4gIFNlZSB0aGUgY29tbWVudCB3aGVyZSBpdCdzIHVzZWQgYmVsb3cKLQkvLyBmb3IgZGV0YWlscy4gIFRoZSByb3V0aW5lIGJhc2ljYWxseSBmaWxscyBvdXQgYWxsIHRoZSBmaWVsZHMKLQkvLyBpbiB0aGUgRW5naW5lU3RhdGUgc3RydWN0dXJlIGFzIGRlc2NyaWJlZCBieQotCS8vICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50MTYgcmVsb2NIZWFkZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmdpbmVTdGF0ZSAqc3RhdGUpCisgICAgLy8gVGhpcyByb3V0aW5lIGluaXRpYWxpc2VzIHRoZSBlbmdpbmUgc3RhdGUgc3VpdGFibHkgZm9yCisgICAgLy8gcnVubmluZyB0aGUgcmVsb2NhdGlvbiBvcGNvZGVzIGZvciB0aGUgc2VjdGlvbiB3aG9zZQorICAgIC8vIGluZGV4IGlzIHJlbG9jSGVhZGVySW5kZXguICByZWxvY0hlYWRlckluZGV4IGlzIG5vdCBhCisgICAgLy8gYSBzZWN0aW9uIG51bWJlci4gIFNlZSB0aGUgY29tbWVudCB3aGVyZSBpdCdzIHVzZWQgYmVsb3cKKyAgICAvLyBmb3IgZGV0YWlscy4gIFRoZSByb3V0aW5lIGJhc2ljYWxseSBmaWxscyBvdXQgYWxsIHRoZSBmaWVsZHMKKyAgICAvLyBpbiB0aGUgRW5naW5lU3RhdGUgc3RydWN0dXJlIGFzIGRlc2NyaWJlZCBieQorICAgIC8vICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIi4KIHsKLQlPU1N0YXR1cyBlcnI7Ci0JUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlciAqcmVsb2NIZWFkZXI7Ci0JCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoc3RhdGUgIT0gbmlsKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlciAqcmVsb2NIZWFkZXI7CiAKLQkvLyBUaGlzIGJpdCBpcyB0cmlja3kuICByZWxvY0hlYWRlckluZGV4IGlzIGFuIGluZGV4IGludG8gdGhlIHJlbG9jYXRpb24KLQkvLyBoZWFkZXIgdGFibGUsIHN0YXJ0aW5nIGF0IHJlbG9jU2VjdGlvbkNvdW50ICh3aGljaCBpcyBpbiB0aGUgbG9hZGVyCi0JLy8gc2VjdGlvbiBoZWFkZXIpIGZvciB0aGUgZmlyc3QgcmVsb2NhdGVkIHNlY3Rpb24gYW5kIGRlY3JlbWVudGluZwotCS8vIGRvd24gdG8gMSBmb3IgdGhlIGxhc3QgcmVsb2NhdGVkIHNlY3Rpb24uICBJIGZpbmQgdGhlIHJlbG9jYXRpb24KLQkvLyBoZWFkZXIgYnkgdXNpbmcgcmVsb2NIZWFkZXJJbmRleCBhcyBhIGluZGV4IGJhY2t3YXJkcyBmcm9tIHRoZQotCS8vIHN0YXJ0IG9mIHRoZSByZWxvY2F0aW9uIG9wY29kZXMgKGllIHJlbG9jSW5zdHJPZmZzZXQpLiAgSWYgeW91Ci0JLy8gbG9vayBhdCB0aGUgZGlhZ3JhbSBvZiB0aGUgbGF5b3V0IG9mIHRoZSBjb250YWluZXIgaW4KLQkvLyAiUEVGQmluYXJ5Rm9ybWF0LmgiLCB5b3UnbGwgc2VlIHRoYXQgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcwotCS8vIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgcmVsb2NhdGlvbiBoZWFkZXJzLgotCS8vCi0JLy8gSSBkaWQgdGhpcyBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSAoc3RhcnRpbmcgYXQgdGhlIGxvYWRlcgotCS8vIGhlYWRlciBhbmQgc3RlcHBpbmcgcGFzdCB0aGUgaW1wb3J0IGxpYnJhcnkgdGFibGUgYW5kIHRoZQotCS8vIGltcG9ydCBzeW1ib2wgdGFibGUpIHdhcyBhIHBhaW4uCisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4ICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoc3RhdGUgIT0gbmlsKTsKIAotCXJlbG9jSGVhZGVyID0gKFBFRkxvYWRlclJlbG9jYXRpb25IZWFkZXIgKikgKCgoY2hhciAqKSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24pICsgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY0luc3RyT2Zmc2V0IC0gcmVsb2NIZWFkZXJJbmRleCAqIHNpemVvZihQRUZMb2FkZXJSZWxvY2F0aW9uSGVhZGVyKSk7Ci0JCi0JTW9yZUFzc2VydFEocmVsb2NIZWFkZXItPnJlc2VydmVkQSA9PSAwKTsJCS8vIFBFRiBzcGVjIHNheXMgaXQgbXVzdCBiZTsgd2UgY2hlY2sgdG8gdHJ5IHRvIGNhdGNoIGJ1Z3MgaW4gY2FsY3VsYXRpb24gb2YgcmVsb2NIZWFkZXIKLQkKLQlzdGF0ZS0+Y3VycmVudFJlbG9jID0gcmVsb2NIZWFkZXItPmZpcnN0UmVsb2NPZmZzZXQ7Ci0Jc3RhdGUtPnRlcm1pbmF0aW5nUmVsb2MgPSByZWxvY0hlYWRlci0+Zmlyc3RSZWxvY09mZnNldCArIHJlbG9jSGVhZGVyLT5yZWxvY0NvdW50OwotCXN0YXRlLT5zZWN0aW9uQmFzZSA9IChVSW50MzIgKikgR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgcmVsb2NIZWFkZXItPnNlY3Rpb25JbmRleCk7Ci0Jc3RhdGUtPnJlbG9jQWRkcmVzcyA9IHN0YXRlLT5zZWN0aW9uQmFzZTsKLQlzdGF0ZS0+aW1wb3J0SW5kZXggPSAwOworICAgIC8vIFRoaXMgYml0IGlzIHRyaWNreS4gIHJlbG9jSGVhZGVySW5kZXggaXMgYW4gaW5kZXggaW50byB0aGUgcmVsb2NhdGlvbgorICAgIC8vIGhlYWRlciB0YWJsZSwgc3RhcnRpbmcgYXQgcmVsb2NTZWN0aW9uQ291bnQgKHdoaWNoIGlzIGluIHRoZSBsb2FkZXIKKyAgICAvLyBzZWN0aW9uIGhlYWRlcikgZm9yIHRoZSBmaXJzdCByZWxvY2F0ZWQgc2VjdGlvbiBhbmQgZGVjcmVtZW50aW5nCisgICAgLy8gZG93biB0byAxIGZvciB0aGUgbGFzdCByZWxvY2F0ZWQgc2VjdGlvbi4gIEkgZmluZCB0aGUgcmVsb2NhdGlvbgorICAgIC8vIGhlYWRlciBieSB1c2luZyByZWxvY0hlYWRlckluZGV4IGFzIGEgaW5kZXggYmFja3dhcmRzIGZyb20gdGhlCisgICAgLy8gc3RhcnQgb2YgdGhlIHJlbG9jYXRpb24gb3Bjb2RlcyAoaWUgcmVsb2NJbnN0ck9mZnNldCkuICBJZiB5b3UKKyAgICAvLyBsb29rIGF0IHRoZSBkaWFncmFtIG9mIHRoZSBsYXlvdXQgb2YgdGhlIGNvbnRhaW5lciBpbgorICAgIC8vICJQRUZCaW5hcnlGb3JtYXQuaCIsIHlvdSdsbCBzZWUgdGhhdCB0aGUgcmVsb2NhdGlvbiBvcGNvZGVzCisgICAgLy8gaW1tZWRpYXRlbHkgZm9sbG93IHRoZSByZWxvY2F0aW9uIGhlYWRlcnMuCisgICAgLy8KKyAgICAvLyBJIGRpZCB0aGlzIGJlY2F1c2UgdGhlIGFsdGVybmF0aXZlIChzdGFydGluZyBhdCB0aGUgbG9hZGVyCisgICAgLy8gaGVhZGVyIGFuZCBzdGVwcGluZyBwYXN0IHRoZSBpbXBvcnQgbGlicmFyeSB0YWJsZSBhbmQgdGhlCisgICAgLy8gaW1wb3J0IHN5bWJvbCB0YWJsZSkgd2FzIGEgcGFpbi4KIAotCS8vIEZyb20gIk1hYyBPUyBSdW50aW1lIEFyY2hpdGVjdHVyZXMiOgotCS8vCi0JLy8gVGhlIHNlY3Rpb25DIGFuZCBzZWN0aW9uRCB2YXJpYWJsZXMgYWN0dWFsbHkgY29udGFpbiB0aGUKLQkvLyBtZW1vcnkgYWRkcmVzcyBvZiBhbiBpbnN0YW50aWF0ZWQgc2VjdGlvbiBtaW51cyB0aGUKLQkvLyBkZWZhdWx0IGFkZHJlc3MgZm9yIHRoYXQgc2VjdGlvbi4gVGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgYQotCS8vIHNlY3Rpb24gaXMgY29udGFpbmVkIGluIHRoZSBkZWZhdWx0QWRkcmVzcyBmaWVsZCBvZiB0aGUKLQkvLyBzZWN0aW9uIGhlYWRlci4gSG93ZXZlciwgaW4gYWxtb3N0IGFsbCBjYXNlcyB0aGUgZGVmYXVsdAotCS8vIGFkZHJlc3Mgc2hvdWxkIGJlIDAsIHNvIHRoZSBzaW1wbGlmaWVkIGRlZmluaXRpb24gc3VmZmljZXMuCi0JLy8gCi0JLy8gSW4gdGhlIGRlYnVnIHZlcnNpb24sIHdlIGRyb3AgaW50byBNYWNzQnVnIGlmIHRoaXMgd2VpcmQgY2FzZQotCS8vIGV2ZXIgZXhlY3V0ZXMgYmVjYXVzZSBpdCdzIG1vcmUgbGlrZWx5IHdlIG1hZGUgYSBtaXN0YWtlIHRoYW4KLQkvLyB3ZSBlbmNvdW50ZXJlZCBhIHNlY3Rpb24gd2l0aCBhIGRlZmF1bHQgYWRkcmVzcy4KKyAgICByZWxvY0hlYWRlciA9IChQRUZMb2FkZXJSZWxvY2F0aW9uSGVhZGVyICopICgoKGNoYXIgKikgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uKSArIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCAtIHJlbG9jSGVhZGVySW5kZXggKiBzaXplb2YoUEVGTG9hZGVyUmVsb2NhdGlvbkhlYWRlcikpOwogCi0Jc3RhdGUtPnNlY3Rpb25DID0gR2V0U2VjdGlvbkJhc2VBZGRyZXNzKGZyYWdUb0ZpeCwgMCk7Ci0JaWYgKHN0YXRlLT5zZWN0aW9uQyAhPSBuaWwpIHsKLQkJI2lmIE1PUkVfREVCVUcKLQkJCWlmIChmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzBdLmRlZmF1bHRBZGRyZXNzICE9IDApIHsKLQkJCQlEZWJ1Z1N0cigiXHBJbml0RW5naW5lU3RhdGU6IEV4ZWN1dGluZyB3ZWlyZCBjYXNlLiIpOwotCQkJfQotCQkjZW5kaWYKLQkJKGNoYXIgKikgc3RhdGUtPnNlY3Rpb25DIC09IGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMF0uZGVmYXVsdEFkZHJlc3M7Ci0JfQotCXN0YXRlLT5zZWN0aW9uRCA9IEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIDEpOwotCWlmIChzdGF0ZS0+c2VjdGlvbkQgIT0gbmlsKSB7Ci0JCSNpZiBNT1JFX0RFQlVHCi0JCQlpZiAoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1sxXS5kZWZhdWx0QWRkcmVzcyAhPSAwKSB7Ci0JCQkJRGVidWdTdHIoIlxwSW5pdEVuZ2luZVN0YXRlOiBFeGVjdXRpbmcgd2VpcmQgY2FzZS4iKTsKLQkJCX0KLQkJI2VuZGlmCi0JCShjaGFyICopIHN0YXRlLT5zZWN0aW9uRCAtPSBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzFdLmRlZmF1bHRBZGRyZXNzOwotCX0KKyAgICBNb3JlQXNzZXJ0UShyZWxvY0hlYWRlci0+cmVzZXJ2ZWRBID09IDApOyAgICAgICAgICAgICAgICAgICAvLyBQRUYgc3BlYyBzYXlzIGl0IG11c3QgYmU7IHdlIGNoZWNrIHRvIHRyeSB0byBjYXRjaCBidWdzIGluIGNhbGN1bGF0aW9uIG9mIHJlbG9jSGVhZGVyCiAKLQllcnIgPSBub0VycjsKLQlpZiAoc3RhdGUtPnJlbG9jQWRkcmVzcyA9PSBuaWwpIHsKLQkJZXJyID0gY2ZyYWdGcmFnbWVudFVzYWdlRXJyOwotCX0KLQlyZXR1cm4gZXJyOworICAgIHN0YXRlLT5jdXJyZW50UmVsb2MgPSByZWxvY0hlYWRlci0+Zmlyc3RSZWxvY09mZnNldDsKKyAgICBzdGF0ZS0+dGVybWluYXRpbmdSZWxvYyA9IHJlbG9jSGVhZGVyLT5maXJzdFJlbG9jT2Zmc2V0ICsgcmVsb2NIZWFkZXItPnJlbG9jQ291bnQ7CisgICAgc3RhdGUtPnNlY3Rpb25CYXNlID0gKFVJbnQzMiAqKSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCByZWxvY0hlYWRlci0+c2VjdGlvbkluZGV4KTsKKyAgICBzdGF0ZS0+cmVsb2NBZGRyZXNzID0gc3RhdGUtPnNlY3Rpb25CYXNlOworICAgIHN0YXRlLT5pbXBvcnRJbmRleCA9IDA7CisKKyAgICAvLyBGcm9tICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIjoKKyAgICAvLworICAgIC8vIFRoZSBzZWN0aW9uQyBhbmQgc2VjdGlvbkQgdmFyaWFibGVzIGFjdHVhbGx5IGNvbnRhaW4gdGhlCisgICAgLy8gbWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5zdGFudGlhdGVkIHNlY3Rpb24gbWludXMgdGhlCisgICAgLy8gZGVmYXVsdCBhZGRyZXNzIGZvciB0aGF0IHNlY3Rpb24uIFRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIGEKKyAgICAvLyBzZWN0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgZGVmYXVsdEFkZHJlc3MgZmllbGQgb2YgdGhlCisgICAgLy8gc2VjdGlvbiBoZWFkZXIuIEhvd2V2ZXIsIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIGRlZmF1bHQKKyAgICAvLyBhZGRyZXNzIHNob3VsZCBiZSAwLCBzbyB0aGUgc2ltcGxpZmllZCBkZWZpbml0aW9uIHN1ZmZpY2VzLgorICAgIC8vCisgICAgLy8gSW4gdGhlIGRlYnVnIHZlcnNpb24sIHdlIGRyb3AgaW50byBNYWNzQnVnIGlmIHRoaXMgd2VpcmQgY2FzZQorICAgIC8vIGV2ZXIgZXhlY3V0ZXMgYmVjYXVzZSBpdCdzIG1vcmUgbGlrZWx5IHdlIG1hZGUgYSBtaXN0YWtlIHRoYW4KKyAgICAvLyB3ZSBlbmNvdW50ZXJlZCBhIHNlY3Rpb24gd2l0aCBhIGRlZmF1bHQgYWRkcmVzcy4KKworICAgIHN0YXRlLT5zZWN0aW9uQyA9IEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIDApOworICAgIGlmIChzdGF0ZS0+c2VjdGlvbkMgIT0gbmlsKSB7CisgICAgICAgICNpZiBNT1JFX0RFQlVHCisgICAgICAgICAgICBpZiAoZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1swXS5kZWZhdWx0QWRkcmVzcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgRGVidWdTdHIoIlxwSW5pdEVuZ2luZVN0YXRlOiBFeGVjdXRpbmcgd2VpcmQgY2FzZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIChjaGFyICopIHN0YXRlLT5zZWN0aW9uQyAtPSBmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzWzBdLmRlZmF1bHRBZGRyZXNzOworICAgIH0KKyAgICBzdGF0ZS0+c2VjdGlvbkQgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCAxKTsKKyAgICBpZiAoc3RhdGUtPnNlY3Rpb25EICE9IG5pbCkgeworICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgaWYgKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnNbMV0uZGVmYXVsdEFkZHJlc3MgIT0gMCkgeworICAgICAgICAgICAgICAgIERlYnVnU3RyKCJccEluaXRFbmdpbmVTdGF0ZTogRXhlY3V0aW5nIHdlaXJkIGNhc2UuIik7CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZgorICAgICAgICAoY2hhciAqKSBzdGF0ZS0+c2VjdGlvbkQgLT0gZnJhZ1RvRml4LT5zZWN0aW9uSGVhZGVyc1sxXS5kZWZhdWx0QWRkcmVzczsKKyAgICB9CisKKyAgICBlcnIgPSBub0VycjsKKyAgICBpZiAoc3RhdGUtPnJlbG9jQWRkcmVzcyA9PSBuaWwpIHsKKyAgICAgICAgZXJyID0gY2ZyYWdGcmFnbWVudFVzYWdlRXJyOworICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiAvLyBrUEVGUmVsb2NCYXNpY09wY29kZXMgaXMgYSB0YWJsZSB0aGF0IG1hcHMgdGhlIHRvcCA3IGJpdHMgb2YgdGhlIG9wY29kZQpAQCAtODcxLDQ5MCArODcxLDQ5MCBAQAogCiBzdGF0aWMgVUludDgga1BFRlJlbG9jQmFzaWNPcGNvZGVzW2tQRUZSZWxvY0Jhc2ljT3Bjb2RlUmFuZ2VdID0geyBQRUZNYXNrZWRCYXNpY09wY29kZXMgfTsKIAotc3RhdGljIE9TU3RhdHVzIFJ1blJlbG9jYXRpb25FbmdpbmUoY29uc3QgRnJhZ1RvRml4SW5mbyAqZnJhZ1RvRml4LCAKLQkJCQkJCQkJCQlQRUZJbXBvcnRlZExpYnJhcnkgICppbXBvcnRMaWJyYXJ5LCAKLQkJCQkJCQkJCQlDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsIHZvaWQgKnJlZkNvbikKLQkvLyBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgcmVhbGx5IGhpdHMgdGhlLiAgR2l2ZW4gYSBmdWxseQotCS8vIHBvcHVsYXRlZCBmcmFnVG9GaXggc3RydWN0dXJlLCB0aGUgaW1wb3J0IGxpYnJhcnkgZGVzY3JpcHRpb24KLQkvLyBvZiB0aGUgd2VhayBpbXBvcnRlZCBsaWJyYXJ5IHdlJ3JlIHJlc29sdmluZywgYW5kIGEgY29ubmVjdGlvbgotCS8vIHRvIHRoZSBsaWJyYXJ5IHdlJ3JlIGdvaW5nIHRvIHN1YnN0aXR1dGUgaXQsIHJlLWV4ZWN1dGUgdGhlCi0JLy8gcmVsb2NhdGlvbiBpbnN0cnVjdGlvbnMgKENGTSBoYXMgYWxyZWFkeSBleGVjdXRlZCB0aGVtIG9uY2UpCi0JLy8gYnV0IG9ubHkgKmRvKiBpbnN0cnVjdGlvbnMgKGllIHN0b3JlIHRoZSBjaGFuZ2UgdG8gdGhlIGRhdGEgc2VjdGlvbikKLQkvLyB0aGF0IENGTSBza2lwcGVkIGJlY2F1c2UgdGhlIHdlYWsgc3ltYm9scyB3ZXJlIG1pc3NpbmcuCitzdGF0aWMgT1NTdGF0dXMgUnVuUmVsb2NhdGlvbkVuZ2luZShjb25zdCBGcmFnVG9GaXhJbmZvICpmcmFnVG9GaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFRkltcG9ydGVkTGlicmFyeSAgKmltcG9ydExpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGTUxhdGVJbXBvcnRMb29rdXBQcm9jIGxvb2t1cCwgdm9pZCAqcmVmQ29uKQorICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIHJ1YmJlciByZWFsbHkgaGl0cyB0aGUuICBHaXZlbiBhIGZ1bGx5CisgICAgLy8gcG9wdWxhdGVkIGZyYWdUb0ZpeCBzdHJ1Y3R1cmUsIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbgorICAgIC8vIG9mIHRoZSB3ZWFrIGltcG9ydGVkIGxpYnJhcnkgd2UncmUgcmVzb2x2aW5nLCBhbmQgYSBjb25uZWN0aW9uCisgICAgLy8gdG8gdGhlIGxpYnJhcnkgd2UncmUgZ29pbmcgdG8gc3Vic3RpdHV0ZSBpdCwgcmUtZXhlY3V0ZSB0aGUKKyAgICAvLyByZWxvY2F0aW9uIGluc3RydWN0aW9ucyAoQ0ZNIGhhcyBhbHJlYWR5IGV4ZWN1dGVkIHRoZW0gb25jZSkKKyAgICAvLyBidXQgb25seSAqZG8qIGluc3RydWN0aW9ucyAoaWUgc3RvcmUgdGhlIGNoYW5nZSB0byB0aGUgZGF0YSBzZWN0aW9uKQorICAgIC8vIHRoYXQgQ0ZNIHNraXBwZWQgYmVjYXVzZSB0aGUgd2VhayBzeW1ib2xzIHdlcmUgbWlzc2luZy4KIHsKLQlPU1N0YXR1cyAJZXJyOwotCUVuZ2luZVN0YXRlCXN0YXRlOwotCVVJbnQxNiAJCXNlY3Rpb25zTGVmdFRvUmVsb2NhdGU7Ci0JVUludDMyIAkJdG90YWxSZWxvY3M7Ci0JVUludDE2CQkqcmVsb2NJbnN0clRhYmxlOwotCVVJbnQxNiAJCW9wQ29kZTsKLQkKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXggIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmNvbnRhaW5lckhlYWRlci50YWcxID09IGtQRUZUYWcxKTsKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb25IZWFkZXJzICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4LT5zZWN0aW9uMEJhc2UgIT0gbmlsKTsJLy8gVGVjaG5pY2FsbHksIGhhdmluZyBhIG5pbCBmb3IgdGhlc2UgdHdvIGlzIG5vdCBhIHByb2JsZW0sIC4uLgotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlICE9IG5pbCk7CS8vIGJ1dCBpbiBwcmFjdGlzZSBpdCBhIHdpbGRseSBkZXZpYW50IGNhc2UgYW5kIHdlIHNob3VsZCBrbm93IGFib3V0IGl0LgotCU1vcmVBc3NlcnRRKGltcG9ydExpYnJhcnkgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShsb29rdXAgIT0gbmlsKTsKKyAgICBPU1N0YXR1cyAgICAgICAgICAgIGVycjsKKyAgICBFbmdpbmVTdGF0ZSAgICAgICAgIHN0YXRlOworICAgIFVJbnQxNiAgICAgICAgICAgICAgc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZTsKKyAgICBVSW50MzIgICAgICAgICAgICAgIHRvdGFsUmVsb2NzOworICAgIFVJbnQxNiAgICAgICAgICAgICAgKnJlbG9jSW5zdHJUYWJsZTsKKyAgICBVSW50MTYgICAgICAgICAgICAgIG9wQ29kZTsKIAotCS8vIEJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcCwgd29yayBvdXQgc29tZSBpbmZvcm1hdGlvbiBpbiBhZHZhbmNlLgorICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeCAhPSBuaWwpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+Y29udGFpbmVySGVhZGVyLnRhZzEgPT0ga1BFRlRhZzEpOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbkhlYWRlcnMgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24gIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPnNlY3Rpb24wQmFzZSAhPSBuaWwpOyAgICAgICAgLy8gVGVjaG5pY2FsbHksIGhhdmluZyBhIG5pbCBmb3IgdGhlc2UgdHdvIGlzIG5vdCBhIHByb2JsZW0sIC4uLgorICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+c2VjdGlvbjFCYXNlICE9IG5pbCk7ICAgICAgICAvLyBidXQgaW4gcHJhY3Rpc2UgaXQgYSB3aWxkbHkgZGV2aWFudCBjYXNlIGFuZCB3ZSBzaG91bGQga25vdyBhYm91dCBpdC4KKyAgICBNb3JlQXNzZXJ0UShpbXBvcnRMaWJyYXJ5ICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CiAKLQkvLyB0b3RhbFJlbG9jcyBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZywgdG8gbWFrZSBzdXJlIG91cgotCS8vIHJlbG9jYXRpb24gUEMgKHN0YXRlLmN1cnJlbnRSZWxvYykgZG9lc24ndCBydW4gd2lsZC4KLQkKLQl0b3RhbFJlbG9jcyA9IChmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPmxvYWRlclN0cmluZ3NPZmZzZXQgLSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jSW5zdHJPZmZzZXQpIC8gc2l6ZW9mKFVJbnQxNik7Ci0JCi0JLy8gcmVsb2NJbnN0clRhYmxlIGlzIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIHRhYmxlIG9mIHJlbG9jYXRpb24KLQkvLyBpbnN0cnVjdGlvbnMgaW4gdGhlIGZyYWdtZW50IHRvIGZpeC4KLQkKLQlyZWxvY0luc3RyVGFibGUgPSAoVUludDE2ICopKChjaGFyICopIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiArIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCk7Ci0JCi0JLy8gc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSBpcyB0aGUgbG9vcCBjb3VudGVyIGZvciB0aGUgb3V0ZXIgbG9vcC4KLQkKLQlNb3JlQXNzZXJ0UShmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jU2VjdGlvbkNvdW50IDw9IDB4MEZGRkYpOwotCXNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPSBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24tPnJlbG9jU2VjdGlvbkNvdW50OworICAgIC8vIEJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcCwgd29yayBvdXQgc29tZSBpbmZvcm1hdGlvbiBpbiBhZHZhbmNlLgogCi0JLy8gTm93IGxldCdzIHJ1biB0aGUgcmVsb2NhdGlvbiBlbmdpbmUuICBXZSBydW4gaXQgb25jZSBwZXIKLQkvLyBzZWN0aW9uIGluIHRoZSB0YWJsZS4gIEVhY2ggdGltZSBhcm91bmQsIHdlIGluaXQgdGhlIGVuZ2luZQotCS8vIGFuZCB0aGVuIGxvb3AgYWdhaW4sIHRoaXMgdGltZSBleGVjdXRpbmcgaW5kaXZpZHVhbCBvcGNvZGVzLgotCS8vIFRoZSBvcGNvZGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4gdGhlIHJlbG9jYXRpb24gUEMKLQkvLyAoc3RhdGUuY3VycmVudFJlbG9jKSBoaXRzIHRoZSBmaW5hbCBvcGNvZGUgKHN0YXRlLnRlcm1pbmF0aW5nUmVsb2MpLgotCQotCS8vIE5vdGU6Ci0JLy8gT25lIGRlc2lnbiBkZWNpc2lvbiBJIG1hZGUgd2FzIHRvIHRvdGFsbHkgcmUtaW5pdCB0aGUgZW5naW5lIHN0YXRlCi0JLy8gZm9yIGVhY2ggc2VjdGlvbi4gIFRoZSBDRk0gc3BlYyBpcyB1bmNsZWFyIGFzIHRvIHdoZXRoZXIgeW91J3JlIHN1cHBvc2VkCi0JLy8gdG8gdG90YWxseSByZS1pbml0IHRoZSBlbmdpbmUgc3RhdGUsIG9yIGp1c3QgcmUtaW5pdCB0aGUgc2VjdGlvbi1zcGVjaWZpYwotCS8vIHN0YXRlIChpZSBjdXJyZW50UmVsb2MsIHRlcm1pbmF0aW5nUmVsb2MsIGFuZCByZWxvY0FkZHJlc3MpLiAgSSBob3BlIHRoaXMKLQkvLyBpcyBjb3JyZWN0LCBidXQgaXQncyBoYXJkIHRvIHRlc3Qgd2l0aG91dCBoYXZpbmcgYSBmcmFnbWVudCB3aXRoIG11bHRpcGxlCi0JLy8gcmVsb2NhdGVkIHNlY3Rpb25zLCB3aGljaCBpcyBkaWZmaWN1bHQgdG8gY3JlYXRlLgotCQotCS8vIEhvdyBkbyBJIGRlY2lkZSB3aGljaCBvcGNvZGVzIHNob3VsZCBiZSBlZmZlY3RpdmUgKGllIG1ha2UgY2hhbmdlcyB0bwotCS8vIHRoZSBzZWN0aW9uIGJlaW5nIHJlbG9jYXRlZCkgYW5kIHdoaWNoIG9wY29kZXMgc2hvdWxkIGp1c3QgYmUgZXhlY3V0ZWQKLQkvLyBmb3IgdGhlaXIgc2lkZSBlZmZlY3RzIChpZSB1cGRhdGVkIHN0YXRlLnJlbG9jQWRkcmVzcyBvciBzdGF0ZS5pbXBvcnRJbmRleCk/Ci0JLy8gVGhlIGFuc3dlciBpcyBib3RoIHNpbXBsZSBhbmQgc3VidGxlLiAgT3Bjb2RlcyB3aG9zZSBhY3Rpb25zIGFyZSBkZXBlbmRlbnQKLQkvLyBvbiBhIHN5bWJvbCB0aGF0IHdhcyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSBhcmUgZWZmZWN0aXZlLCB0aG9zZSB0aGF0Ci0JLy8gYW4gaW5kZXBlbmRlbnQgb2YgdGhvc2Ugc3ltYm9scyBhcmUgbm90LiAgVGhlIG9ubHkgb3Bjb2RlcyB0aGF0IHVzZQotCS8vIHN5bWJvbGljIHZhbHVlcyBhcmUga1BFRlJlbG9jSW1wb3J0UnVuIGFuZCBrUEVGUmVsb2NTbUJ5SW1wb3J0LCBhbmQKLQkvLyB0aGVzZSBhcmUgb25seSBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5LgotCS8vIEFsbCBvdGhlciBjYXNlcyBhcmUgZXhlY3V0ZWQgZm9yIHRoZWlyIHNpZGUgZWZmZWN0cyBvbmx5LgotCS8vCi0JLy8gSG93IGRvIEkgZGV0ZXJtaW5lIGlmIGEgc3ltYm9sIGlzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5PwotCS8vIFdlbGwgSSBrbm93IHRoZSBzeW1ib2wncyBpbmRleCBhbmQgSSBrbm93IHRoZSBsb3dlciBib3VuZCBhbmQgY291bnQKLQkvLyBvZiB0aGUgc3ltYm9scyBpbiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSwgc28gSSBqdXN0IGRvIGEgc2ltcGxlCi0JLy8gYm91bmRzIHRlc3QsIGllIAotCS8vCi0JLy8gICBmaXJzdEltcG9ydGVkU3ltYm9sIDw9IGltcG9ydEluZGV4IDwgZmlyc3RJbXBvcnRlZFN5bWJvbCArIGltcG9ydGVkU3ltYm9sQ291bnQKKyAgICAvLyB0b3RhbFJlbG9jcyBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZywgdG8gbWFrZSBzdXJlIG91cgorICAgIC8vIHJlbG9jYXRpb24gUEMgKHN0YXRlLmN1cnJlbnRSZWxvYykgZG9lc24ndCBydW4gd2lsZC4KIAotCS8vIEZyb20gdGhpcyBjb2RlLCBpdCdzIHJlbGF0aXZlbHkgZWFzeSB0byBzZWUgd2hpY2ggcmVsb2NhdGlvbiBvcGNvZGVzCi0JLy8gYXJlbid0IGltcGxlbWVudGVkLiAgSWYgeW91IGV2ZXIgZW5jb3VudGVyIG9uZSwgeW91J2xsIGZpbmQgeW91cnNlbGYKLQkvLyBpbiBNYWNzQnVnIHdpdGggYSBtZXNzYWdlIHRlbGxpbmcgeW91IHdoaWNoIG9wY29kZSB3YXMgZm91bmQuICBUaGUKLQkvLyB0d28gYmlnIGdyb3VwcyBvZiBvcGNvZGVzIEkgc2tpcHBlZCB3ZXJlIHRoZSBsYXJnZSBmb3JtYXQgb3Bjb2RlcwotCS8vIGFuZCB0aGUgcmVwZWF0aW5nIG9wY29kZXMuICBJIHNraXBwZWQgdGhlbSBiZWNhdXNlOgotCS8vCi0JLy8gYSkgSSBoYXZlbid0IGdvdCBhIHdheSB0byBnZW5lcmF0ZSB0aGVtIGluIGEgUEVGIGNvbnRhaW5lciB0aGF0IEkgY2FuIAotCS8vICAgIHRlc3QgYWdhaW5zdC4gV2l0aG91dCB0aGF0LCB0aGVyZSdzIG5vIHdheSBJIGNvdWxkIGJlIGFzc3VyZWQgdGhhdAotCS8vICAgIHRoZSBjb2RlIHdvcmtlZC4KLQkvLwotCS8vIGIpIEknbSBsYXp5LgorICAgIHRvdGFsUmVsb2NzID0gKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+bG9hZGVyU3RyaW5nc09mZnNldCAtIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NJbnN0ck9mZnNldCkgLyBzaXplb2YoVUludDE2KTsKIAotCWVyciA9IG5vRXJyOwotCXdoaWxlICggc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSA+IDAgKSB7Ci0JCWVyciA9IEluaXRFbmdpbmVTdGF0ZShmcmFnVG9GaXgsIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUsICZzdGF0ZSk7Ci0JCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJCWdvdG8gbGVhdmVOb3c7Ci0JCX0KLQkJCi0JCXdoaWxlICggc3RhdGUuY3VycmVudFJlbG9jICE9IHN0YXRlLnRlcm1pbmF0aW5nUmVsb2MgKSB7Ci0JCQkKLQkJCU1vcmVBc3NlcnRRKCBzdGF0ZS5jdXJyZW50UmVsb2MgPCB0b3RhbFJlbG9jcyApOworICAgIC8vIHJlbG9jSW5zdHJUYWJsZSBpcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSB0YWJsZSBvZiByZWxvY2F0aW9uCisgICAgLy8gaW5zdHJ1Y3Rpb25zIGluIHRoZSBmcmFnbWVudCB0byBmaXguCiAKLQkJCW9wQ29kZSA9IHJlbG9jSW5zdHJUYWJsZVtzdGF0ZS5jdXJyZW50UmVsb2NdOwotCQkJc3dpdGNoICggUEVGUmVsb2NCYXNpY09wY29kZShvcENvZGUpICkgewotCQkJCWNhc2Uga1BFRlJlbG9jQnlTZWN0RFdpdGhTa2lwOgotCQkJCQl7Ci0JCQkJCQlVSW50MTYgc2tpcENvdW50OwotCQkJCQkJVUludDE2IHJlbG9jQ291bnQ7Ci0JCQkJCQkKLQkJCQkJCXNraXBDb3VudCA9ICgob3BDb2RlID4+IDYpICYgMHgwMEZGKTsKLQkJCQkJCXJlbG9jQ291bnQgPSAob3BDb2RlICYgMHgwMDNGKTsKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSBza2lwQ291bnQ7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gcmVsb2NDb3VudDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0J5U2VjdEM6Ci0JCQkJY2FzZSBrUEVGUmVsb2NCeVNlY3REOgotCQkJCQl7Ci0JCQkJCQlVSW50MTYgcnVuTGVuZ3RoOworICAgIHJlbG9jSW5zdHJUYWJsZSA9IChVSW50MTYgKikoKGNoYXIgKikgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uICsgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLT5yZWxvY0luc3RyT2Zmc2V0KTsKIAotCQkJCQkJcnVuTGVuZ3RoID0gKG9wQ29kZSAmIDB4MDFGRikgKyAxOwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IHJ1bkxlbmd0aDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1RWZWN0b3IxMjoKLQkJCQkJewotCQkJCQkJVUludDE2IHJ1bkxlbmd0aDsKKyAgICAvLyBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlIGlzIHRoZSBsb29wIGNvdW50ZXIgZm9yIHRoZSBvdXRlciBsb29wLgogCi0JCQkJCQlydW5MZW5ndGggPSAob3BDb2RlICYgMHgwMUZGKSArIDE7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gKHJ1bkxlbmd0aCAqIDMpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jVFZlY3Rvcjg6Ci0JCQkJY2FzZSBrUEVGUmVsb2NWVGFibGU4OgotCQkJCQl7Ci0JCQkJCQlVSW50MTYgcnVuTGVuZ3RoOworICAgIE1vcmVBc3NlcnRRKGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NTZWN0aW9uQ291bnQgPD0gMHgwRkZGRik7CisgICAgc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSA9IGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbi0+cmVsb2NTZWN0aW9uQ291bnQ7CiAKLQkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyArPSAocnVuTGVuZ3RoICogMik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NJbXBvcnRSdW46Ci0JCQkJCXsKLQkJCQkJCVVJbnQzMiBzeW1ib2xWYWx1ZTsKLQkJCQkJCVVJbnQxNiBydW5MZW5ndGg7Ci0JCQkJCQkKLQkJCQkJCXJ1bkxlbmd0aCA9IChvcENvZGUgJiAweDAxRkYpICsgMTsKLQkJCQkJCXdoaWxlIChydW5MZW5ndGggPiAwKSB7Ci0JCQkJCQkJaWYgKCBzdGF0ZS5pbXBvcnRJbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIHN0YXRlLmltcG9ydEluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKLQkJCQkJCQkJZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIHN0YXRlLmltcG9ydEluZGV4LCAmc3ltYm9sVmFsdWUpOwotCQkJCQkJCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQkJCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQkJCQl9Ci0JCQkJCQkJCSooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKLQkJCQkJCQl9Ci0JCQkJCQkJc3RhdGUuaW1wb3J0SW5kZXggKz0gMTsKLQkJCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKLQkJCQkJCQlydW5MZW5ndGggLT0gMTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1NtQnlJbXBvcnQ6Ci0JCQkJCXsKLQkJCQkJCVVJbnQzMiBzeW1ib2xWYWx1ZTsKLQkJCQkJCVVJbnQzMiBpbmRleDsKKyAgICAvLyBOb3cgbGV0J3MgcnVuIHRoZSByZWxvY2F0aW9uIGVuZ2luZS4gIFdlIHJ1biBpdCBvbmNlIHBlcgorICAgIC8vIHNlY3Rpb24gaW4gdGhlIHRhYmxlLiAgRWFjaCB0aW1lIGFyb3VuZCwgd2UgaW5pdCB0aGUgZW5naW5lCisgICAgLy8gYW5kIHRoZW4gbG9vcCBhZ2FpbiwgdGhpcyB0aW1lIGV4ZWN1dGluZyBpbmRpdmlkdWFsIG9wY29kZXMuCisgICAgLy8gVGhlIG9wY29kZSBsb29wIHRlcm1pbmF0ZXMgd2hlbiB0aGUgcmVsb2NhdGlvbiBQQworICAgIC8vIChzdGF0ZS5jdXJyZW50UmVsb2MpIGhpdHMgdGhlIGZpbmFsIG9wY29kZSAoc3RhdGUudGVybWluYXRpbmdSZWxvYykuCiAKLQkJCQkJCWluZGV4ID0gKG9wQ29kZSAmIDB4MDFGRik7Ci0JCQkJCQlpZiAoIGluZGV4ID49IGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgJiYgaW5kZXggPCAoaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCArIGltcG9ydExpYnJhcnktPmltcG9ydGVkU3ltYm9sQ291bnQpICkgewotCQkJCQkJCWVyciA9IExvb2t1cFN5bWJvbChsb29rdXAsIHJlZkNvbiwgZnJhZ1RvRml4LT5sb2FkZXJTZWN0aW9uLCBpbmRleCwgJnN5bWJvbFZhbHVlKTsKLQkJCQkJCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQkJCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCQkJfQotCQkJCQkJCSooc3RhdGUucmVsb2NBZGRyZXNzKSArPSBzeW1ib2xWYWx1ZTsKLQkJCQkJCX0KLQkJCQkJCXN0YXRlLmltcG9ydEluZGV4ID0gaW5kZXggKyAxOwotCQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IDE7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTbVNldFNlY3RDOgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgaW5kZXg7CisgICAgLy8gTm90ZToKKyAgICAvLyBPbmUgZGVzaWduIGRlY2lzaW9uIEkgbWFkZSB3YXMgdG8gdG90YWxseSByZS1pbml0IHRoZSBlbmdpbmUgc3RhdGUKKyAgICAvLyBmb3IgZWFjaCBzZWN0aW9uLiAgVGhlIENGTSBzcGVjIGlzIHVuY2xlYXIgYXMgdG8gd2hldGhlciB5b3UncmUgc3VwcG9zZWQKKyAgICAvLyB0byB0b3RhbGx5IHJlLWluaXQgdGhlIGVuZ2luZSBzdGF0ZSwgb3IganVzdCByZS1pbml0IHRoZSBzZWN0aW9uLXNwZWNpZmljCisgICAgLy8gc3RhdGUgKGllIGN1cnJlbnRSZWxvYywgdGVybWluYXRpbmdSZWxvYywgYW5kIHJlbG9jQWRkcmVzcykuICBJIGhvcGUgdGhpcworICAgIC8vIGlzIGNvcnJlY3QsIGJ1dCBpdCdzIGhhcmQgdG8gdGVzdCB3aXRob3V0IGhhdmluZyBhIGZyYWdtZW50IHdpdGggbXVsdGlwbGUKKyAgICAvLyByZWxvY2F0ZWQgc2VjdGlvbnMsIHdoaWNoIGlzIGRpZmZpY3VsdCB0byBjcmVhdGUuCiAKLQkJCQkJCWluZGV4ID0gKG9wQ29kZSAmIDB4MDFGRik7Ci0JCQkJCQlzdGF0ZS5zZWN0aW9uQyA9IEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIGluZGV4KTsKLQkJCQkJCU1vcmVBc3NlcnRRKHN0YXRlLnNlY3Rpb25DICE9IG5pbCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTbVNldFNlY3REOgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgaW5kZXg7CisgICAgLy8gSG93IGRvIEkgZGVjaWRlIHdoaWNoIG9wY29kZXMgc2hvdWxkIGJlIGVmZmVjdGl2ZSAoaWUgbWFrZSBjaGFuZ2VzIHRvCisgICAgLy8gdGhlIHNlY3Rpb24gYmVpbmcgcmVsb2NhdGVkKSBhbmQgd2hpY2ggb3Bjb2RlcyBzaG91bGQganVzdCBiZSBleGVjdXRlZAorICAgIC8vIGZvciB0aGVpciBzaWRlIGVmZmVjdHMgKGllIHVwZGF0ZWQgc3RhdGUucmVsb2NBZGRyZXNzIG9yIHN0YXRlLmltcG9ydEluZGV4KT8KKyAgICAvLyBUaGUgYW5zd2VyIGlzIGJvdGggc2ltcGxlIGFuZCBzdWJ0bGUuICBPcGNvZGVzIHdob3NlIGFjdGlvbnMgYXJlIGRlcGVuZGVudAorICAgIC8vIG9uIGEgc3ltYm9sIHRoYXQgd2FzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IGFyZSBlZmZlY3RpdmUsIHRob3NlIHRoYXQKKyAgICAvLyBhbiBpbmRlcGVuZGVudCBvZiB0aG9zZSBzeW1ib2xzIGFyZSBub3QuICBUaGUgb25seSBvcGNvZGVzIHRoYXQgdXNlCisgICAgLy8gc3ltYm9saWMgdmFsdWVzIGFyZSBrUEVGUmVsb2NJbXBvcnRSdW4gYW5kIGtQRUZSZWxvY1NtQnlJbXBvcnQsIGFuZAorICAgIC8vIHRoZXNlIGFyZSBvbmx5IGlmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkuCisgICAgLy8gQWxsIG90aGVyIGNhc2VzIGFyZSBleGVjdXRlZCBmb3IgdGhlaXIgc2lkZSBlZmZlY3RzIG9ubHkuCisgICAgLy8KKyAgICAvLyBIb3cgZG8gSSBkZXRlcm1pbmUgaWYgYSBzeW1ib2wgaXMgaW4gdGhlIHdlYWsgbGlua2VkIGxpYnJhcnk/CisgICAgLy8gV2VsbCBJIGtub3cgdGhlIHN5bWJvbCdzIGluZGV4IGFuZCBJIGtub3cgdGhlIGxvd2VyIGJvdW5kIGFuZCBjb3VudAorICAgIC8vIG9mIHRoZSBzeW1ib2xzIGluIHRoZSB3ZWFrIGxpbmtlZCBsaWJyYXJ5LCBzbyBJIGp1c3QgZG8gYSBzaW1wbGUKKyAgICAvLyBib3VuZHMgdGVzdCwgaWUKKyAgICAvLworICAgIC8vICAgZmlyc3RJbXBvcnRlZFN5bWJvbCA8PSBpbXBvcnRJbmRleCA8IGZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRlZFN5bWJvbENvdW50CiAKLQkJCQkJCWluZGV4ID0gKG9wQ29kZSAmIDB4MDFGRik7Ci0JCQkJCQlzdGF0ZS5zZWN0aW9uRCA9IEdldFNlY3Rpb25CYXNlQWRkcmVzcyhmcmFnVG9GaXgsIGluZGV4KTsKLQkJCQkJCU1vcmVBc3NlcnRRKHN0YXRlLnNlY3Rpb25EICE9IG5pbCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTbUJ5U2VjdGlvbjoKLQkJCQkJc3RhdGUucmVsb2NBZGRyZXNzICs9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jSW5jclBvc2l0aW9uOgotCQkJCQl7Ci0JCQkJCQlVSW50MTYgb2Zmc2V0OwotCQkJCQkJCi0JCQkJCQlvZmZzZXQgPSAob3BDb2RlICYgMHgwRkZGKSArIDE7Ci0JCQkJCQkoKGNoYXIgKikgc3RhdGUucmVsb2NBZGRyZXNzKSArPSBvZmZzZXQ7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBrUEVGUmVsb2NTbVJlcGVhdDoKLQkJCQkJI2lmIE1PUkVfREVCVUcKLQkJCQkJCURlYnVnU3RyKCJccFJ1blJlbG9jYXRpb25FbmdpbmU6IGtQRUZSZWxvY1NtUmVwZWF0IG5vdCB5ZXQgaW1wbGVtZW50ZWQiKTsKLQkJCQkJI2VuZGlmCi0JCQkJCWVyciA9IHVuaW1wRXJyOwotCQkJCQlnb3RvIGxlYXZlTm93OwotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY1NldFBvc2l0aW9uOgotCQkJCQl7Ci0JCQkJCQlVSW50MzIgb2Zmc2V0OworICAgIC8vIEZyb20gdGhpcyBjb2RlLCBpdCdzIHJlbGF0aXZlbHkgZWFzeSB0byBzZWUgd2hpY2ggcmVsb2NhdGlvbiBvcGNvZGVzCisgICAgLy8gYXJlbid0IGltcGxlbWVudGVkLiAgSWYgeW91IGV2ZXIgZW5jb3VudGVyIG9uZSwgeW91J2xsIGZpbmQgeW91cnNlbGYKKyAgICAvLyBpbiBNYWNzQnVnIHdpdGggYSBtZXNzYWdlIHRlbGxpbmcgeW91IHdoaWNoIG9wY29kZSB3YXMgZm91bmQuICBUaGUKKyAgICAvLyB0d28gYmlnIGdyb3VwcyBvZiBvcGNvZGVzIEkgc2tpcHBlZCB3ZXJlIHRoZSBsYXJnZSBmb3JtYXQgb3Bjb2RlcworICAgIC8vIGFuZCB0aGUgcmVwZWF0aW5nIG9wY29kZXMuICBJIHNraXBwZWQgdGhlbSBiZWNhdXNlOgorICAgIC8vCisgICAgLy8gYSkgSSBoYXZlbid0IGdvdCBhIHdheSB0byBnZW5lcmF0ZSB0aGVtIGluIGEgUEVGIGNvbnRhaW5lciB0aGF0IEkgY2FuCisgICAgLy8gICAgdGVzdCBhZ2FpbnN0LiBXaXRob3V0IHRoYXQsIHRoZXJlJ3Mgbm8gd2F5IEkgY291bGQgYmUgYXNzdXJlZCB0aGF0CisgICAgLy8gICAgdGhlIGNvZGUgd29ya2VkLgorICAgIC8vCisgICAgLy8gYikgSSdtIGxhenkuCiAKLQkJCQkJCS8vIExvdCdzIG9mIGZvbGtzIGhhdmUgdHJpZWQgdmFyaW91cyBpbnRlcnByZXRhdGlvbnMgb2YgdGhlIGRlc2NyaXB0aW9uIG9mIAotCQkJCQkJLy8gdGhpcyBvcENvZGUgaW4gIk1hYyBPUyBSdW50aW1lIEFyY2hpdGVjdHVyZXMiICh3aGljaCBzdGF0ZXMgIlRoaXMgaW5zdHJ1Y3Rpb24gCi0JCQkJCQkvLyBzZXRzIHJlbG9jQWRkcmVzcyB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBvZmZzZXQgb2Zmc2V0LiIgICpzbWlsZSopLgotCQkJCQkJLy8gSSBldmVudHVhbGx5IGR1ZyBpbnRvIHRoZSBDRk0gc291cmNlIGNvZGUgdG8gZmluZCBteSBpbnRlcnByZXRhdGlvbiwgd2hpY2ggCi0JCQkJCQkvLyBJIGJlbGlldmUgaXMgY29ycmVjdC4gIFRoZSBrZXkgcG9pbnQgaXMgdGh0IHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gCi0JCQkJCQkvLyB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gZm9yIHdoaWNoIHRoZXNlIHJlbG9jYXRpb25zIGFyZSBiZWluZyBwZXJmb3JtZWQuCi0JCQkJCQkKLQkJCQkJCS8vIFNraXAgdG8gbmV4dCByZWxvYyB3b3JkLCB3aGljaCBpcyB0aGUgc2Vjb25kIGNodW5rIG9mIHRoZSBvZmZzZXQuCi0JCQkJCQkKLQkJCQkJCXN0YXRlLmN1cnJlbnRSZWxvYyArPSAxOwotCQkJCQkJCi0JCQkJCQkvLyBFeHRyYWN0IG9mZnNldCBiYXNlZCBvbiB0aGUgbW9zdCBzaWduaWZpY2FudCAxMCBiaXRzIGluIG9wQ29kZSBhbmQgCi0JCQkJCQkvLyB0aGUgbmV4dCBzaWduaWZpY2FudCAxNiBiaXRzIGluIHRoZSBuZXh0IHJlbG9jIHdvcmQuCi0JCQkJCQkKLQkJCQkJCW9mZnNldCA9IFBFRlJlbG9jU2V0UG9zRnVsbE9mZnNldChvcENvZGUsIHJlbG9jSW5zdHJUYWJsZVtzdGF0ZS5jdXJyZW50UmVsb2NdKTsKKyAgICBlcnIgPSBub0VycjsKKyAgICB3aGlsZSAoIHNlY3Rpb25zTGVmdFRvUmVsb2NhdGUgPiAwICkgeworICAgICAgICBlcnIgPSBJbml0RW5naW5lU3RhdGUoZnJhZ1RvRml4LCBzZWN0aW9uc0xlZnRUb1JlbG9jYXRlLCAmc3RhdGUpOworICAgICAgICBpZiAoZXJyICE9IG5vRXJyKSB7CisgICAgICAgICAgICBnb3RvIGxlYXZlTm93OworICAgICAgICB9CiAKLQkJCQkJCXN0YXRlLnJlbG9jQWRkcmVzcyA9IChVSW50MzIgKikgKCAoKGNoYXIgKikgc3RhdGUuc2VjdGlvbkJhc2UpICsgb2Zmc2V0KTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0xnQnlJbXBvcnQ6Ci0JCQkJCXsKLQkJCQkJCVVJbnQzMiBzeW1ib2xWYWx1ZTsKLQkJCQkJCVVJbnQzMiBpbmRleDsKKyAgICAgICAgd2hpbGUgKCBzdGF0ZS5jdXJyZW50UmVsb2MgIT0gc3RhdGUudGVybWluYXRpbmdSZWxvYyApIHsKIAotCQkJCQkJLy8gR2V0IHRoZSAyNiBiaXQgc3ltYm9sIGluZGV4IGZyb20gdGhlIGN1cnJlbnQgYW5kIG5leHQgcmVsb2Mgd29yZHMuCi0JCQkJCQkKLQkJCQkJCXN0YXRlLmN1cnJlbnRSZWxvYyArPSAxOwotCQkJCQkJaW5kZXggPSBQRUZSZWxvY0xnQnlJbXBvcnRGdWxsSW5kZXgob3BDb2RlLCByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXSk7Ci0JCQkJCQkKLQkJCQkJCWlmICggaW5kZXggPj0gaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCAmJiBpbmRleCA8IChpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICsgaW1wb3J0TGlicmFyeS0+aW1wb3J0ZWRTeW1ib2xDb3VudCkgKSB7Ci0JCQkJCQkJZXJyID0gTG9va3VwU3ltYm9sKGxvb2t1cCwgcmVmQ29uLCBmcmFnVG9GaXgtPmxvYWRlclNlY3Rpb24sIGluZGV4LCAmc3ltYm9sVmFsdWUpOwotCQkJCQkJCWlmIChlcnIgIT0gbm9FcnIpIHsKLQkJCQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJCQl9Ci0JCQkJCQkJKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOwotCQkJCQkJfQotCQkJCQkJc3RhdGUuaW1wb3J0SW5kZXggPSBpbmRleCArIDE7Ci0JCQkJCQlzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gMTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIGtQRUZSZWxvY0xnUmVwZWF0OgotCQkJCQkjaWYgTU9SRV9ERUJVRwotCQkJCQkJRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jTGdSZXBlYXQgbm90IHlldCBpbXBsZW1lbnRlZCIpOwotCQkJCQkjZW5kaWYKLQkJCQkJZXJyID0gdW5pbXBFcnI7Ci0JCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jTGdTZXRPckJ5U2VjdGlvbjoKLQkJCQkJI2lmIE1PUkVfREVCVUcKLQkJCQkJCURlYnVnU3RyKCJccFJ1blJlbG9jYXRpb25FbmdpbmU6IGtQRUZSZWxvY0xnU2V0T3JCeVNlY3Rpb24gbm90IHlldCBpbXBsZW1lbnRlZCIpOwotCQkJCQkjZW5kaWYKLQkJCQkJZXJyID0gdW5pbXBFcnI7Ci0JCQkJCWdvdG8gbGVhdmVOb3c7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2Uga1BFRlJlbG9jVW5kZWZpbmVkT3Bjb2RlOgotCQkJCQllcnIgPSBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVycjsKLQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJTW9yZUFzc2VydFEoZmFsc2UpOwotCQkJCQllcnIgPSBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVycjsKLQkJCQkJZ290byBsZWF2ZU5vdzsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKLQkJfQotCQkKLQkJc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSAtPSAxOwotCX0KKyAgICAgICAgICAgIE1vcmVBc3NlcnRRKCBzdGF0ZS5jdXJyZW50UmVsb2MgPCB0b3RhbFJlbG9jcyApOworCisgICAgICAgICAgICBvcENvZGUgPSByZWxvY0luc3RyVGFibGVbc3RhdGUuY3VycmVudFJlbG9jXTsKKyAgICAgICAgICAgIHN3aXRjaCAoIFBFRlJlbG9jQmFzaWNPcGNvZGUob3BDb2RlKSApIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0J5U2VjdERXaXRoU2tpcDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IHNraXBDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQxNiByZWxvY0NvdW50OworCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwQ291bnQgPSAoKG9wQ29kZSA+PiA2KSAmIDB4MDBGRik7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxvY0NvdW50ID0gKG9wQ29kZSAmIDB4MDAzRik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5yZWxvY0FkZHJlc3MgKz0gc2tpcENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVsb2NBZGRyZXNzICs9IHJlbG9jQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NCeVNlY3RDOgorICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jQnlTZWN0RDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IHJ1bkxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGVuZ3RoID0gKG9wQ29kZSAmIDB4MDFGRikgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVsb2NBZGRyZXNzICs9IHJ1bkxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1RWZWN0b3IxMjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IHJ1bkxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGVuZ3RoID0gKG9wQ29kZSAmIDB4MDFGRikgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVsb2NBZGRyZXNzICs9IChydW5MZW5ndGggKiAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY1RWZWN0b3I4OgorICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jVlRhYmxlODoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IHJ1bkxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGVuZ3RoID0gKG9wQ29kZSAmIDB4MDFGRikgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVsb2NBZGRyZXNzICs9IChydW5MZW5ndGggKiAyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0ltcG9ydFJ1bjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IHJ1bkxlbmd0aDsKKworICAgICAgICAgICAgICAgICAgICAgICAgcnVuTGVuZ3RoID0gKG9wQ29kZSAmIDB4MDFGRikgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bkxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmltcG9ydEluZGV4ID49IGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgJiYgc3RhdGUuaW1wb3J0SW5kZXggPCAoaW1wb3J0TGlicmFyeS0+Zmlyc3RJbXBvcnRlZFN5bWJvbCArIGltcG9ydExpYnJhcnktPmltcG9ydGVkU3ltYm9sQ291bnQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBMb29rdXBTeW1ib2wobG9va3VwLCByZWZDb24sIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiwgc3RhdGUuaW1wb3J0SW5kZXgsICZzeW1ib2xWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbGVhdmVOb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihzdGF0ZS5yZWxvY0FkZHJlc3MpICs9IHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbXBvcnRJbmRleCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkxlbmd0aCAtPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jU21CeUltcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIGluZGV4OworCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIGluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBMb29rdXBTeW1ib2wobG9va3VwLCByZWZDb24sIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiwgaW5kZXgsICZzeW1ib2xWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlTm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbXBvcnRJbmRleCA9IGluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jU21TZXRTZWN0QzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIGluZGV4OworCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc2VjdGlvbkMgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNb3JlQXNzZXJ0UShzdGF0ZS5zZWN0aW9uQyAhPSBuaWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jU21TZXRTZWN0RDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIGluZGV4OworCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IChvcENvZGUgJiAweDAxRkYpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc2VjdGlvbkQgPSBHZXRTZWN0aW9uQmFzZUFkZHJlc3MoZnJhZ1RvRml4LCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBNb3JlQXNzZXJ0UShzdGF0ZS5zZWN0aW9uRCAhPSBuaWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jU21CeVNlY3Rpb246CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGtQRUZSZWxvY0luY3JQb3NpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDE2IG9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKG9wQ29kZSAmIDB4MEZGRikgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgKChjaGFyICopIHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jU21SZXBlYXQ6CisgICAgICAgICAgICAgICAgICAgICNpZiBNT1JFX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NTbVJlcGVhdCBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBlcnIgPSB1bmltcEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NTZXRQb3NpdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIG9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG90J3Mgb2YgZm9sa3MgaGF2ZSB0cmllZCB2YXJpb3VzIGludGVycHJldGF0aW9ucyBvZiB0aGUgZGVzY3JpcHRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb3BDb2RlIGluICJNYWMgT1MgUnVudGltZSBBcmNoaXRlY3R1cmVzIiAod2hpY2ggc3RhdGVzICJUaGlzIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXRzIHJlbG9jQWRkcmVzcyB0byB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBvZmZzZXQgb2Zmc2V0LiIgICpzbWlsZSopLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSSBldmVudHVhbGx5IGR1ZyBpbnRvIHRoZSBDRk0gc291cmNlIGNvZGUgdG8gZmluZCBteSBpbnRlcnByZXRhdGlvbiwgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEkgYmVsaWV2ZSBpcyBjb3JyZWN0LiAgVGhlIGtleSBwb2ludCBpcyB0aHQgdGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGZvciB3aGljaCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgYmVpbmcgcGVyZm9ybWVkLgorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRvIG5leHQgcmVsb2Mgd29yZCwgd2hpY2ggaXMgdGhlIHNlY29uZCBjaHVuayBvZiB0aGUgb2Zmc2V0LgorCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jdXJyZW50UmVsb2MgKz0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCBvZmZzZXQgYmFzZWQgb24gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgMTAgYml0cyBpbiBvcENvZGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV4dCBzaWduaWZpY2FudCAxNiBiaXRzIGluIHRoZSBuZXh0IHJlbG9jIHdvcmQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IFBFRlJlbG9jU2V0UG9zRnVsbE9mZnNldChvcENvZGUsIHJlbG9jSW5zdHJUYWJsZVtzdGF0ZS5jdXJyZW50UmVsb2NdKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUucmVsb2NBZGRyZXNzID0gKFVJbnQzMiAqKSAoICgoY2hhciAqKSBzdGF0ZS5zZWN0aW9uQmFzZSkgKyBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jTGdCeUltcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIHN5bWJvbFZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyIGluZGV4OworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIDI2IGJpdCBzeW1ib2wgaW5kZXggZnJvbSB0aGUgY3VycmVudCBhbmQgbmV4dCByZWxvYyB3b3Jkcy4KKworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuY3VycmVudFJlbG9jICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IFBFRlJlbG9jTGdCeUltcG9ydEZ1bGxJbmRleChvcENvZGUsIHJlbG9jSW5zdHJUYWJsZVtzdGF0ZS5jdXJyZW50UmVsb2NdKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmRleCA+PSBpbXBvcnRMaWJyYXJ5LT5maXJzdEltcG9ydGVkU3ltYm9sICYmIGluZGV4IDwgKGltcG9ydExpYnJhcnktPmZpcnN0SW1wb3J0ZWRTeW1ib2wgKyBpbXBvcnRMaWJyYXJ5LT5pbXBvcnRlZFN5bWJvbENvdW50KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBMb29rdXBTeW1ib2wobG9va3VwLCByZWZDb24sIGZyYWdUb0ZpeC0+bG9hZGVyU2VjdGlvbiwgaW5kZXgsICZzeW1ib2xWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlTm93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHN0YXRlLnJlbG9jQWRkcmVzcykgKz0gc3ltYm9sVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5pbXBvcnRJbmRleCA9IGluZGV4ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnJlbG9jQWRkcmVzcyArPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2Uga1BFRlJlbG9jTGdSZXBlYXQ6CisgICAgICAgICAgICAgICAgICAgICNpZiBNT1JFX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z1N0cigiXHBSdW5SZWxvY2F0aW9uRW5naW5lOiBrUEVGUmVsb2NMZ1JlcGVhdCBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBlcnIgPSB1bmltcEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NMZ1NldE9yQnlTZWN0aW9uOgorICAgICAgICAgICAgICAgICAgICAjaWYgTU9SRV9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdTdHIoIlxwUnVuUmVsb2NhdGlvbkVuZ2luZToga1BFRlJlbG9jTGdTZXRPckJ5U2VjdGlvbiBub3QgeWV0IGltcGxlbWVudGVkIik7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICBlcnIgPSB1bmltcEVycjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZU5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBrUEVGUmVsb2NVbmRlZmluZWRPcGNvZGU6CisgICAgICAgICAgICAgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOworICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlTm93OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBNb3JlQXNzZXJ0UShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRDb3JydXB0RXJyOworICAgICAgICAgICAgICAgICAgICBnb3RvIGxlYXZlTm93OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRSZWxvYyArPSAxOworICAgICAgICB9CisKKyAgICAgICAgc2VjdGlvbnNMZWZ0VG9SZWxvY2F0ZSAtPSAxOworICAgIH0KIAogbGVhdmVOb3c6Ci0JcmV0dXJuIGVycjsKKyAgICByZXR1cm4gZXJyOwogfQogCiBleHRlcm4gcGFzY2FsIE9TU3RhdHVzIENGTUxhdGVJbXBvcnRDb3JlKGNvbnN0IENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAqZnJhZ1RvRml4TG9jYXRvciwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCi0JCQkJCQkJCQkJQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCi0JCQkJCQkJCQkJQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCi0JCQkJCQkJCQkJQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLAotCQkJCQkJCQkJCXZvaWQgKnJlZkNvbikKLQkvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBsb29rdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZkNvbikKKyAgICAvLyBTZWUgY29tbWVudHMgaW4gaW50ZXJmYWNlIHBhcnQuCiB7Ci0JT1NTdGF0dXMgZXJyOwotCU9TU3RhdHVzIGp1bms7Ci0JRnJhZ1RvRml4SW5mbyBmcmFnVG9GaXg7Ci0JUEVGSW1wb3J0ZWRMaWJyYXJ5ICppbXBvcnRMaWJyYXJ5OwotCWNoYXIgd2Vha0xpbmtlZExpYnJhcnlOYW1lQ1N0cmluZ1syNTZdOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBPU1N0YXR1cyBqdW5rOworICAgIEZyYWdUb0ZpeEluZm8gZnJhZ1RvRml4OworICAgIFBFRkltcG9ydGVkTGlicmFyeSAqaW1wb3J0TGlicmFyeTsKKyAgICBjaGFyIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmdbMjU2XTsKIAotCU1vcmVBc3NlcnRRKGZyYWdUb0ZpeExvY2F0b3IgIT0gbmlsKTsJCi0JTW9yZUFzc2VydFEoZnJhZ1RvRml4Q29ubklEICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoZnJhZ1RvRml4SW5pdFJvdXRpbmUgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0USh3ZWFrTGlua2VkTGlicmFyeU5hbWUgIT0gbmlsKTsJCi0JTW9yZUFzc2VydFEobG9va3VwICE9IG5pbCk7CQotCQotCS8vIEZpbGwgb3V0IHRoZSBiaXRzIG9mIGZyYWdUb0ZpeCB3aGljaCBhcmUgcGFzc2VkIGluCi0JLy8gYnkgdGhlIGNsaWVudC4KLQkKLQlNb3JlQmxvY2taZXJvKCZmcmFnVG9GaXgsIHNpemVvZihmcmFnVG9GaXgpKTsKLQlmcmFnVG9GaXgubG9jYXRvciA9ICpmcmFnVG9GaXhMb2NhdG9yOwotCWZyYWdUb0ZpeC5jb25uSUQgID0gZnJhZ1RvRml4Q29ubklEOwotCWZyYWdUb0ZpeC5pbml0Um91dGluZSA9IGZyYWdUb0ZpeEluaXRSb3V0aW5lOwotCQotCS8vIE1ha2UgYSBDIHN0cmluZyBmcm9tIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4KLQkKLQlCbG9ja01vdmVEYXRhKHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSArIDEsIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmcsIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZVswXSk7Ci0Jd2Vha0xpbmtlZExpYnJhcnlOYW1lQ1N0cmluZ1t3ZWFrTGlua2VkTGlicmFyeU5hbWVbMF1dID0gMDsKKyAgICBNb3JlQXNzZXJ0UShmcmFnVG9GaXhMb2NhdG9yICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4Q29ubklEICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEoZnJhZ1RvRml4SW5pdFJvdXRpbmUgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0USh3ZWFrTGlua2VkTGlicmFyeU5hbWUgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShsb29rdXAgIT0gbmlsKTsKIAotCS8vIEdldCB0aGUgYmFzaWMgaW5mb3JtYXRpb24gZnJvbSB0aGUgZnJhZ21lbnQuCi0JLy8gRmlsbHMgb3V0IHRoZSBjb250YWluZXJIZWFkZXIsIHNlY3Rpb25IZWFkZXJzLCBsb2FkZXJTZWN0aW9uIGFuZCBmaWxlUmVmIGZpZWxkcwotCS8vIG9mIGZyYWdUb0ZpeC4KLQkKLQllcnIgPSBSZWFkQ29udGFpbmVyQmFzaWNzKCZmcmFnVG9GaXgpOworICAgIC8vIEZpbGwgb3V0IHRoZSBiaXRzIG9mIGZyYWdUb0ZpeCB3aGljaCBhcmUgcGFzc2VkIGluCisgICAgLy8gYnkgdGhlIGNsaWVudC4KIAotCS8vIFNldCB1cCB0aGUgYmFzZSBhZGRyZXNzIGZpZWxkcyBpbiBmcmFnVG9GaXggKGllIHNlY3Rpb24wQmFzZSBhbmQgc2VjdGlvbjFCYXNlKQotCS8vIGJ5IGxvb2tpbmcgdXAgb3VyIGluaXQgcm91dGluZSAoZnJhZ1RvRml4LmluaXRSb3V0aW5lKSBhbmQgc3VidHJhY3RpbmcKLQkvLyBhd2F5IHRoZSBzZWN0aW9uIG9mZnNldHMgKHdoaWNoIHdlIGdldCBmcm9tIHRoZSBkaXNrIGNvcHkgb2YgdGhlIHNlY3Rpb24pCi0JLy8gdG8gZGVyaXZlIHRoZSBiYXNlcyBvZiB0aGUgc2VjdGlvbnMgdGhlbXNlbHZlcy4KLQkKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCWVyciA9IFNldHVwU2VjdGlvbkJhc2VBZGRyZXNzZXMoJmZyYWdUb0ZpeCk7Ci0JfQotCQotCS8vIExvb2sgaW5zaWRlIHRoZSBsb2FkZXIgc2VjdGlvbiBmb3IgdGhlIGltcG9ydCBsaWJyYXJ5IGRlc2NyaXB0aW9uCi0JLy8gb2Ygd2Vha0xpbmtlZExpYnJhcnlOYW1lLiAgV2UgbmVlZCB0aGlzIHRvIGtub3cgdGhlIHJhbmdlIG9mIHN5bWJvbAotCS8vIGluZGV4ZXMgd2UncmUgZ29pbmcgdG8gZml4IHVwLgotCQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJZXJyID0gRmluZEltcG9ydExpYnJhcnkoZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24sIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmcsICZpbXBvcnRMaWJyYXJ5KTsKLQl9Ci0JCi0JLy8gRG8gYSBxdWljayBjaGVjayB0byBlbnN1cmUgdGhhdCB0aGUgbGlicmFyeSB3YXMgYWN0dWFsbHkgaW1wb3J0ZWQgd2Vhay4KLQkvLyBJZiBpdCB3YXNuJ3QsIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHJlc29sdmUgaXRzIHdlYWsgaW1wb3J0cwotCS8vIGxhdGVyIG9uLiAgUmVzb2x2aW5nIHRoZW0gYWdhaW4gaXMgbGlrZWx5IHRvIGJlIGJhZC4KLQkKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCWlmICgoaW1wb3J0TGlicmFyeS0+b3B0aW9ucyAmIGtQRUZXZWFrSW1wb3J0TGliTWFzaykgPT0gMCkgewotCQkJZXJyID0gY2ZyYWdGcmFnbWVudFVzYWdlRXJyOwotCQl9Ci0JfQotCQotCS8vIE5vdyBydW4gdGhlIG1haW4gcmVsb2NhdGlvbiBlbmdpbmUuCi0JCi0JaWYgKGVyciA9PSBub0VycikgewotCQllcnIgPSBSdW5SZWxvY2F0aW9uRW5naW5lKCZmcmFnVG9GaXgsIGltcG9ydExpYnJhcnksIGxvb2t1cCwgcmVmQ29uKTsKLQl9Ci0JCi0JLy8gQ2xlYW4gdXAuCi0JCi0JaWYgKGZyYWdUb0ZpeC5kaXNwb3NlU2VjdGlvblBvaW50ZXJzKSB7Ci0JCWlmIChmcmFnVG9GaXguZmlsZVJlZiAhPSAwKSB7Ci0JCQlqdW5rID0gRlNDbG9zZShmcmFnVG9GaXguZmlsZVJlZik7Ci0JCQlNb3JlQXNzZXJ0UShqdW5rID09IG5vRXJyKTsKLQkJfQotCQlpZiAoZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24gIT0gbmlsKSB7Ci0JCQlEaXNwb3NlUHRyKCAoUHRyKSBmcmFnVG9GaXgubG9hZGVyU2VjdGlvbik7Ci0JCQlNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKLQkJfQotCQlpZiAoZnJhZ1RvRml4LnNlY3Rpb25IZWFkZXJzICE9IG5pbCkgewotCQkJRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LnNlY3Rpb25IZWFkZXJzKTsKLQkJCU1vcmVBc3NlcnRRKE1lbUVycm9yKCkgPT0gbm9FcnIpOwotCQl9Ci0JfQotCXJldHVybiBlcnI7CisgICAgTW9yZUJsb2NrWmVybygmZnJhZ1RvRml4LCBzaXplb2YoZnJhZ1RvRml4KSk7CisgICAgZnJhZ1RvRml4LmxvY2F0b3IgPSAqZnJhZ1RvRml4TG9jYXRvcjsKKyAgICBmcmFnVG9GaXguY29ubklEICA9IGZyYWdUb0ZpeENvbm5JRDsKKyAgICBmcmFnVG9GaXguaW5pdFJvdXRpbmUgPSBmcmFnVG9GaXhJbml0Um91dGluZTsKKworICAgIC8vIE1ha2UgYSBDIHN0cmluZyBmcm9tIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4KKworICAgIEJsb2NrTW92ZURhdGEod2Vha0xpbmtlZExpYnJhcnlOYW1lICsgMSwgd2Vha0xpbmtlZExpYnJhcnlOYW1lQ1N0cmluZywgd2Vha0xpbmtlZExpYnJhcnlOYW1lWzBdKTsKKyAgICB3ZWFrTGlua2VkTGlicmFyeU5hbWVDU3RyaW5nW3dlYWtMaW5rZWRMaWJyYXJ5TmFtZVswXV0gPSAwOworCisgICAgLy8gR2V0IHRoZSBiYXNpYyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmcmFnbWVudC4KKyAgICAvLyBGaWxscyBvdXQgdGhlIGNvbnRhaW5lckhlYWRlciwgc2VjdGlvbkhlYWRlcnMsIGxvYWRlclNlY3Rpb24gYW5kIGZpbGVSZWYgZmllbGRzCisgICAgLy8gb2YgZnJhZ1RvRml4LgorCisgICAgZXJyID0gUmVhZENvbnRhaW5lckJhc2ljcygmZnJhZ1RvRml4KTsKKworICAgIC8vIFNldCB1cCB0aGUgYmFzZSBhZGRyZXNzIGZpZWxkcyBpbiBmcmFnVG9GaXggKGllIHNlY3Rpb24wQmFzZSBhbmQgc2VjdGlvbjFCYXNlKQorICAgIC8vIGJ5IGxvb2tpbmcgdXAgb3VyIGluaXQgcm91dGluZSAoZnJhZ1RvRml4LmluaXRSb3V0aW5lKSBhbmQgc3VidHJhY3RpbmcKKyAgICAvLyBhd2F5IHRoZSBzZWN0aW9uIG9mZnNldHMgKHdoaWNoIHdlIGdldCBmcm9tIHRoZSBkaXNrIGNvcHkgb2YgdGhlIHNlY3Rpb24pCisgICAgLy8gdG8gZGVyaXZlIHRoZSBiYXNlcyBvZiB0aGUgc2VjdGlvbnMgdGhlbXNlbHZlcy4KKworICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgZXJyID0gU2V0dXBTZWN0aW9uQmFzZUFkZHJlc3NlcygmZnJhZ1RvRml4KTsKKyAgICB9CisKKyAgICAvLyBMb29rIGluc2lkZSB0aGUgbG9hZGVyIHNlY3Rpb24gZm9yIHRoZSBpbXBvcnQgbGlicmFyeSBkZXNjcmlwdGlvbgorICAgIC8vIG9mIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4gIFdlIG5lZWQgdGhpcyB0byBrbm93IHRoZSByYW5nZSBvZiBzeW1ib2wKKyAgICAvLyBpbmRleGVzIHdlJ3JlIGdvaW5nIHRvIGZpeCB1cC4KKworICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgZXJyID0gRmluZEltcG9ydExpYnJhcnkoZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24sIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZUNTdHJpbmcsICZpbXBvcnRMaWJyYXJ5KTsKKyAgICB9CisKKyAgICAvLyBEbyBhIHF1aWNrIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBsaWJyYXJ5IHdhcyBhY3R1YWxseSBpbXBvcnRlZCB3ZWFrLgorICAgIC8vIElmIGl0IHdhc24ndCwgaXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UgdG8gcmVzb2x2ZSBpdHMgd2VhayBpbXBvcnRzCisgICAgLy8gbGF0ZXIgb24uICBSZXNvbHZpbmcgdGhlbSBhZ2FpbiBpcyBsaWtlbHkgdG8gYmUgYmFkLgorCisgICAgaWYgKGVyciA9PSBub0VycikgeworICAgICAgICBpZiAoKGltcG9ydExpYnJhcnktPm9wdGlvbnMgJiBrUEVGV2Vha0ltcG9ydExpYk1hc2spID09IDApIHsKKyAgICAgICAgICAgIGVyciA9IGNmcmFnRnJhZ21lbnRVc2FnZUVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdyBydW4gdGhlIG1haW4gcmVsb2NhdGlvbiBlbmdpbmUuCisKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIGVyciA9IFJ1blJlbG9jYXRpb25FbmdpbmUoJmZyYWdUb0ZpeCwgaW1wb3J0TGlicmFyeSwgbG9va3VwLCByZWZDb24pOworICAgIH0KKworICAgIC8vIENsZWFuIHVwLgorCisgICAgaWYgKGZyYWdUb0ZpeC5kaXNwb3NlU2VjdGlvblBvaW50ZXJzKSB7CisgICAgICAgIGlmIChmcmFnVG9GaXguZmlsZVJlZiAhPSAwKSB7CisgICAgICAgICAgICBqdW5rID0gRlNDbG9zZShmcmFnVG9GaXguZmlsZVJlZik7CisgICAgICAgICAgICBNb3JlQXNzZXJ0UShqdW5rID09IG5vRXJyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhZ1RvRml4LmxvYWRlclNlY3Rpb24gIT0gbmlsKSB7CisgICAgICAgICAgICBEaXNwb3NlUHRyKCAoUHRyKSBmcmFnVG9GaXgubG9hZGVyU2VjdGlvbik7CisgICAgICAgICAgICBNb3JlQXNzZXJ0UShNZW1FcnJvcigpID09IG5vRXJyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhZ1RvRml4LnNlY3Rpb25IZWFkZXJzICE9IG5pbCkgeworICAgICAgICAgICAgRGlzcG9zZVB0ciggKFB0cikgZnJhZ1RvRml4LnNlY3Rpb25IZWFkZXJzKTsKKyAgICAgICAgICAgIE1vcmVBc3NlcnRRKE1lbUVycm9yKCkgPT0gbm9FcnIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBwYXNjYWwgT1NTdGF0dXMgRnJhZ21lbnRMb29rdXAoQ29uc3RTdHIyNTVQYXJhbSBzeW1OYW1lLCBDRnJhZ1N5bWJvbENsYXNzIHN5bUNsYXNzLAotCQkJCQkJCQkJdm9pZCAqKnN5bUFkZHIsIHZvaWQgKnJlZkNvbikKLQkvLyBUaGlzIGlzIHRoZSBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBjYWxsYmFjayB1c2VkIHdoZW4gCi0JLy8gbGF0ZSBpbXBvcnRpbmcgZnJvbSBhIENGTSBzaGFyZWQgbGlicmFyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzeW1BZGRyLCB2b2lkICpyZWZDb24pCisgICAgLy8gVGhpcyBpcyB0aGUgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgY2FsbGJhY2sgdXNlZCB3aGVuCisgICAgLy8gbGF0ZSBpbXBvcnRpbmcgZnJvbSBhIENGTSBzaGFyZWQgbGlicmFyeS4KIHsKLQlPU1N0YXR1cyBlcnI7Ci0JQ0ZyYWdDb25uZWN0aW9uSUQgY29ubklEVG9JbXBvcnQ7Ci0JQ0ZyYWdTeW1ib2xDbGFzcyAgZm91bmRTeW1DbGFzczsKLQkKLQlNb3JlQXNzZXJ0UShzeW1OYW1lICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEoc3ltQWRkciAhPSBuaWwpOwotCU1vcmVBc3NlcnRRKHJlZkNvbiAgIT0gbmlsKTsKLQkKLQljb25uSURUb0ltcG9ydCA9IChDRnJhZ0Nvbm5lY3Rpb25JRCkgcmVmQ29uOwotCQotCS8vIFNoYW1lIHRoZXJlJ3Mgbm8gd2F5IHRvIHZhbGlkYXRlIHRoYXQgY29ubklEVG9JbXBvcnQgaXMgdmFsaWQuCisgICAgT1NTdGF0dXMgZXJyOworICAgIENGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0OworICAgIENGcmFnU3ltYm9sQ2xhc3MgIGZvdW5kU3ltQ2xhc3M7CiAKLQllcnIgPSBGaW5kU3ltYm9sKGNvbm5JRFRvSW1wb3J0LCBzeW1OYW1lLCAoUHRyICopIHN5bUFkZHIsICZmb3VuZFN5bUNsYXNzKTsKLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCS8vIElmIHRoZSBzeW1ib2wgaXNuJ3Qgb2YgdGhlIHJpZ2h0IGNsYXNzLCB3ZSBhY3QgbGlrZSB3ZSBkaWRuJ3QgCi0JCS8vIGZpbmQgaXQsIGJ1dCBhbHNvIGFzc2VydCBpbiB0aGUgZGVidWcgYnVpbGQgYmVjYXVzZSB3ZWlyZCB0aGluZ3MgCi0JCS8vIGFyZSBhZm9vdC4KLQkJaWYgKGZvdW5kU3ltQ2xhc3MgIT0gc3ltQ2xhc3MpIHsKLQkJCU1vcmVBc3NlcnRRKGZhbHNlKTsKLQkJCSpzeW1BZGRyID0gbmlsOwotCQkJZXJyID0gY2ZyYWdOb1N5bWJvbEVycjsKLQkJfQotCX0KLQlyZXR1cm4gZXJyOworICAgIE1vcmVBc3NlcnRRKHN5bU5hbWUgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShzeW1BZGRyICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEocmVmQ29uICAhPSBuaWwpOworCisgICAgY29ubklEVG9JbXBvcnQgPSAoQ0ZyYWdDb25uZWN0aW9uSUQpIHJlZkNvbjsKKworICAgIC8vIFNoYW1lIHRoZXJlJ3Mgbm8gd2F5IHRvIHZhbGlkYXRlIHRoYXQgY29ubklEVG9JbXBvcnQgaXMgdmFsaWQuCisKKyAgICBlcnIgPSBGaW5kU3ltYm9sKGNvbm5JRFRvSW1wb3J0LCBzeW1OYW1lLCAoUHRyICopIHN5bUFkZHIsICZmb3VuZFN5bUNsYXNzKTsKKyAgICBpZiAoZXJyID09IG5vRXJyKSB7CisgICAgICAgIC8vIElmIHRoZSBzeW1ib2wgaXNuJ3Qgb2YgdGhlIHJpZ2h0IGNsYXNzLCB3ZSBhY3QgbGlrZSB3ZSBkaWRuJ3QKKyAgICAgICAgLy8gZmluZCBpdCwgYnV0IGFsc28gYXNzZXJ0IGluIHRoZSBkZWJ1ZyBidWlsZCBiZWNhdXNlIHdlaXJkIHRoaW5ncworICAgICAgICAvLyBhcmUgYWZvb3QuCisgICAgICAgIGlmIChmb3VuZFN5bUNsYXNzICE9IHN5bUNsYXNzKSB7CisgICAgICAgICAgICBNb3JlQXNzZXJ0UShmYWxzZSk7CisgICAgICAgICAgICAqc3ltQWRkciA9IG5pbDsKKyAgICAgICAgICAgIGVyciA9IGNmcmFnTm9TeW1ib2xFcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0TGlicmFyeShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0KQotCS8vIFNlZSBjb21tZW50cyBpbiBpbnRlcmZhY2UgcGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0KQorICAgIC8vIFNlZSBjb21tZW50cyBpbiBpbnRlcmZhY2UgcGFydC4KIHsKLQlNb3JlQXNzZXJ0UShjb25uSURUb0ltcG9ydCAhPSBuaWwpOwotCXJldHVybiBDRk1MYXRlSW1wb3J0Q29yZShmcmFnVG9GaXhMb2NhdG9yLCBmcmFnVG9GaXhDb25uSUQsIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCXdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwgRnJhZ21lbnRMb29rdXAsIGNvbm5JRFRvSW1wb3J0KTsKKyAgICBNb3JlQXNzZXJ0UShjb25uSURUb0ltcG9ydCAhPSBuaWwpOworICAgIHJldHVybiBDRk1MYXRlSW1wb3J0Q29yZShmcmFnVG9GaXhMb2NhdG9yLCBmcmFnVG9GaXhDb25uSUQsIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwgRnJhZ21lbnRMb29rdXAsIGNvbm5JRFRvSW1wb3J0KTsKIH0KIAogc3RhdGljIHBhc2NhbCBPU1N0YXR1cyBCdW5kbGVMb29rdXAoQ29uc3RTdHIyNTVQYXJhbSBzeW1OYW1lLCBDRnJhZ1N5bWJvbENsYXNzIHN5bUNsYXNzLAotCQkJCQkJCQkJdm9pZCAqKnN5bUFkZHIsIHZvaWQgKnJlZkNvbikKLQkvLyBUaGlzIGlzIHRoZSBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBjYWxsYmFjayB1c2VkIHdoZW4gCi0JLy8gbGF0ZSBpbXBvcnRpbmcgZnJvbSBhIENGQnVuZGxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnN5bUFkZHIsIHZvaWQgKnJlZkNvbikKKyAgICAvLyBUaGlzIGlzIHRoZSBDRk1MYXRlSW1wb3J0TG9va3VwUHJvYyBjYWxsYmFjayB1c2VkIHdoZW4KKyAgICAvLyBsYXRlIGltcG9ydGluZyBmcm9tIGEgQ0ZCdW5kbGUuCiB7Ci0JT1NTdGF0dXMgCWVycjsKLQlDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydDsKLQlDRlN0cmluZ1JlZiBzeW1OYW1lU3RyOwotCQotCU1vcmVBc3NlcnRRKHN5bU5hbWUgIT0gbmlsKTsKLQlNb3JlQXNzZXJ0UShzeW1BZGRyICE9IG5pbCk7Ci0JTW9yZUFzc2VydFEocmVmQ29uICAhPSBuaWwpOwotCQotCXN5bU5hbWVTdHIgPSBuaWw7Ci0JCi0JYnVuZGxlVG9JbXBvcnQgPSAoQ0ZCdW5kbGVSZWYpIHJlZkNvbjsKLQkKLQkvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGJ1bmRsZVRvSW1wb3J0IGlzIHJlYWxseSBhIGJ1bmRsZS4KLQkKLQkvLyBXZSBjYW4gb25seSBmaW5kIGZ1bmN0aW9uIHBvaW50ZXJzIGJlY2F1c2UgQ0ZCdW5kbGVHZXRGdW5jdGlvblBvaW50ZXJGb3JOYW1lIAotCS8vIG9ubHkgd29ya3MgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLiAgU28gaWYgdGhlIGNsaWVudCBpcyBhc2tpbmcgZm9yIHNvbWV0aGluZyAKLQkvLyBvdGhlciB0aGFuIGEgZnVuY3Rpb24gcG9pbnRlciAoaWUgVFZlY3RvciBzeW1ib2wpIHRoZW4gd2UgZG9uJ3QgZXZlbiB0cnVlLgotCS8vIEFsc28gYXNzZXJ0IGluIHRoZSBkZWJ1ZyBidWlsZCBiZWNhdXNlIHRoaXMgc2hvd3MgYSBjZXJ0YWluIGxhY2sgb2YgCi0JLy8gdW5kZXJzdGFuZGluZyBvbiB0aGUgcGFydCBvZiB0aGUgY2xpZW50LgotCS8vCi0JLy8gQ0YgaXMgYmVpbmcgcmV2aXNlIHRvIHN1cHBvcnQgYWNjZXNzaW5nIGRhdGEgc3ltYm9scyB1c2luZyBhIG5ldyBBUEkKLQkvLyAoY3VycmVudGx5IHRoaXMgaXMgYXZhaWxhYmxlIHRvIEFwcGxlIGludGVybmFsIGRldmVsb3BlcnMgYXMgCi0JLy8gQ0ZCdW5kbGVHZXREYXRhUG9pbnRlckZvck5hbWUpLiAgV2hlbiB0aGUgbmV3IEFQSSBpcyBhdmFpbGFibGUgaW4gYSAKLQkvLyBwdWJsaWMgaGVhZGVyIGZpbGUgSSBzaG91bGQgcmV2aXNlIHRoaXMgY29kZSB0byBsaWZ0IHRoaXMgcmVzdHJpY3Rpb24uCi0JCi0JZXJyID0gbm9FcnI7Ci0JaWYgKHN5bUNsYXNzICE9IGtUVmVjdG9yQ0ZyYWdTeW1ib2wpIHsKLQkJTW9yZUFzc2VydFEoZmFsc2UpOwotCQllcnIgPSBjZnJhZ05vU3ltYm9sRXJyOwotCX0KLQlpZiAoZXJyID09IG5vRXJyKSB7Ci0JCXN5bU5hbWVTdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhQYXNjYWxTdHJpbmcoa0NGQWxsb2NhdG9yU3lzdGVtRGVmYXVsdCwgCi0JCQkJCQkJCQkJCQkJc3ltTmFtZSwga0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbik7Ci0JCWlmIChzeW1OYW1lU3RyID09IG5pbCkgewotCQkJZXJyID0gY29yZUZvdW5kYXRpb25Vbmtub3duRXJyOwotCQl9Ci0JfQotCWlmIChlcnIgPT0gbm9FcnIpIHsKLQkJKnN5bUFkZHIgPSBDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUoYnVuZGxlVG9JbXBvcnQsIHN5bU5hbWVTdHIpOwotCQlpZiAoKnN5bUFkZHIgPT0gbmlsKSB7Ci0JCQllcnIgPSBjZnJhZ05vU3ltYm9sRXJyOwotCQl9Ci0JfQotCWlmIChzeW1OYW1lU3RyICE9IG5pbCkgewotCQlDRlJlbGVhc2Uoc3ltTmFtZVN0cik7Ci0JfQotCXJldHVybiBlcnI7CisgICAgT1NTdGF0dXMgICAgICAgICAgICBlcnI7CisgICAgQ0ZCdW5kbGVSZWYgYnVuZGxlVG9JbXBvcnQ7CisgICAgQ0ZTdHJpbmdSZWYgc3ltTmFtZVN0cjsKKworICAgIE1vcmVBc3NlcnRRKHN5bU5hbWUgIT0gbmlsKTsKKyAgICBNb3JlQXNzZXJ0UShzeW1BZGRyICE9IG5pbCk7CisgICAgTW9yZUFzc2VydFEocmVmQ29uICAhPSBuaWwpOworCisgICAgc3ltTmFtZVN0ciA9IG5pbDsKKworICAgIGJ1bmRsZVRvSW1wb3J0ID0gKENGQnVuZGxlUmVmKSByZWZDb247CisKKyAgICAvLyBTaGFtZSB0aGVyZSdzIG5vIHdheSB0byB2YWxpZGF0ZSB0aGF0IGJ1bmRsZVRvSW1wb3J0IGlzIHJlYWxseSBhIGJ1bmRsZS4KKworICAgIC8vIFdlIGNhbiBvbmx5IGZpbmQgZnVuY3Rpb24gcG9pbnRlcnMgYmVjYXVzZSBDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUKKyAgICAvLyBvbmx5IHdvcmtzIGZvciBmdW5jdGlvbiBwb2ludGVycy4gIFNvIGlmIHRoZSBjbGllbnQgaXMgYXNraW5nIGZvciBzb21ldGhpbmcKKyAgICAvLyBvdGhlciB0aGFuIGEgZnVuY3Rpb24gcG9pbnRlciAoaWUgVFZlY3RvciBzeW1ib2wpIHRoZW4gd2UgZG9uJ3QgZXZlbiB0cnVlLgorICAgIC8vIEFsc28gYXNzZXJ0IGluIHRoZSBkZWJ1ZyBidWlsZCBiZWNhdXNlIHRoaXMgc2hvd3MgYSBjZXJ0YWluIGxhY2sgb2YKKyAgICAvLyB1bmRlcnN0YW5kaW5nIG9uIHRoZSBwYXJ0IG9mIHRoZSBjbGllbnQuCisgICAgLy8KKyAgICAvLyBDRiBpcyBiZWluZyByZXZpc2UgdG8gc3VwcG9ydCBhY2Nlc3NpbmcgZGF0YSBzeW1ib2xzIHVzaW5nIGEgbmV3IEFQSQorICAgIC8vIChjdXJyZW50bHkgdGhpcyBpcyBhdmFpbGFibGUgdG8gQXBwbGUgaW50ZXJuYWwgZGV2ZWxvcGVycyBhcworICAgIC8vIENGQnVuZGxlR2V0RGF0YVBvaW50ZXJGb3JOYW1lKS4gIFdoZW4gdGhlIG5ldyBBUEkgaXMgYXZhaWxhYmxlIGluIGEKKyAgICAvLyBwdWJsaWMgaGVhZGVyIGZpbGUgSSBzaG91bGQgcmV2aXNlIHRoaXMgY29kZSB0byBsaWZ0IHRoaXMgcmVzdHJpY3Rpb24uCisKKyAgICBlcnIgPSBub0VycjsKKyAgICBpZiAoc3ltQ2xhc3MgIT0ga1RWZWN0b3JDRnJhZ1N5bWJvbCkgeworICAgICAgICBNb3JlQXNzZXJ0UShmYWxzZSk7CisgICAgICAgIGVyciA9IGNmcmFnTm9TeW1ib2xFcnI7CisgICAgfQorICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgc3ltTmFtZVN0ciA9IENGU3RyaW5nQ3JlYXRlV2l0aFBhc2NhbFN0cmluZyhrQ0ZBbGxvY2F0b3JTeXN0ZW1EZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltTmFtZSwga0NGU3RyaW5nRW5jb2RpbmdNYWNSb21hbik7CisgICAgICAgIGlmIChzeW1OYW1lU3RyID09IG5pbCkgeworICAgICAgICAgICAgZXJyID0gY29yZUZvdW5kYXRpb25Vbmtub3duRXJyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnIgPT0gbm9FcnIpIHsKKyAgICAgICAgKnN5bUFkZHIgPSBDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUoYnVuZGxlVG9JbXBvcnQsIHN5bU5hbWVTdHIpOworICAgICAgICBpZiAoKnN5bUFkZHIgPT0gbmlsKSB7CisgICAgICAgICAgICBlcnIgPSBjZnJhZ05vU3ltYm9sRXJyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzeW1OYW1lU3RyICE9IG5pbCkgeworICAgICAgICBDRlJlbGVhc2Uoc3ltTmFtZVN0cik7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIGV4dGVybiBwYXNjYWwgT1NTdGF0dXMgQ0ZNTGF0ZUltcG9ydEJ1bmRsZShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGQnVuZGxlUmVmIGJ1bmRsZVRvSW1wb3J0KQotCS8vIFNlZSBjb21tZW50cyBpbiBpbnRlcmZhY2UgcGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGQnVuZGxlUmVmIGJ1bmRsZVRvSW1wb3J0KQorICAgIC8vIFNlZSBjb21tZW50cyBpbiBpbnRlcmZhY2UgcGFydC4KIHsKLQlNb3JlQXNzZXJ0UShidW5kbGVUb0ltcG9ydCAhPSBuaWwpOwotCXJldHVybiBDRk1MYXRlSW1wb3J0Q29yZShmcmFnVG9GaXhMb2NhdG9yLCBmcmFnVG9GaXhDb25uSUQsIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCXdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwgQnVuZGxlTG9va3VwLCBidW5kbGVUb0ltcG9ydCk7CisgICAgTW9yZUFzc2VydFEoYnVuZGxlVG9JbXBvcnQgIT0gbmlsKTsKKyAgICByZXR1cm4gQ0ZNTGF0ZUltcG9ydENvcmUoZnJhZ1RvRml4TG9jYXRvciwgZnJhZ1RvRml4Q29ubklELCBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrTGlua2VkTGlicmFyeU5hbWUsIEJ1bmRsZUxvb2t1cCwgYnVuZGxlVG9JbXBvcnQpOwogfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5oIGIvTWFjL01vZHVsZXMvY2cvQ0ZNTGF0ZUltcG9ydC5oCmluZGV4IGYzYTg5YmMuLjA4Nzg5NjAgMTAwNzU1Ci0tLSBhL01hYy9Nb2R1bGVzL2NnL0NGTUxhdGVJbXBvcnQuaAorKysgYi9NYWMvTW9kdWxlcy9jZy9DRk1MYXRlSW1wb3J0LmgKQEAgLTEsMzMgKzEsMzMgQEAKIC8qCi0JRmlsZToJCUNGTUxhdGVJbXBvcnQuaAorICAgIEZpbGU6ICAgICAgICAgICAgICAgQ0ZNTGF0ZUltcG9ydC5oCiAKLQlDb250YWluczoJSW50ZXJmYWNlIHRvIENGTSBsYXRlIGltcG9ydCBsaWJyYXJ5LgorICAgIENvbnRhaW5zOiAgICAgICAgICAgSW50ZXJmYWNlIHRvIENGTSBsYXRlIGltcG9ydCBsaWJyYXJ5LgogCi0JV3JpdHRlbiBieToJUXVpbm4KKyAgICBXcml0dGVuIGJ5OiAgICAgICAgIFF1aW5uCiAKLQlDb3B5cmlnaHQ6CUNvcHlyaWdodCCpIDE5OTkgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgQ29weXJpZ2h0OiAgICAgICAgICBDb3B5cmlnaHQgqSAxOTk5IGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgogCi0JCQkJWW91IG1heSBpbmNvcnBvcmF0ZSB0aGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBpbnRvIHlvdXIgcHJvZ3JhbShzKSB3aXRob3V0Ci0JCQkJcmVzdHJpY3Rpb24uIFRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGhhcyBiZWVuIHByb3ZpZGVkICJBUyBJUyIgYW5kIHRoZQotCQkJCXJlc3BvbnNpYmlsaXR5IGZvciBpdHMgb3BlcmF0aW9uIGlzIHlvdXJzLiBZb3UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gcmVkaXN0cmlidXRlCi0JCQkJdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgYXMgIkFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSIgYWZ0ZXIgaGF2aW5nIG1hZGUKLQkJCQljaGFuZ2VzLiBJZiB5b3UncmUgZ29pbmcgdG8gcmUtZGlzdHJpYnV0ZSB0aGUgc291cmNlLCB3ZSByZXF1aXJlIHRoYXQgeW91IG1ha2UKLQkJCQlpdCBjbGVhciBpbiB0aGUgc291cmNlIHRoYXQgdGhlIGNvZGUgd2FzIGRlc2NlbmRlZCBmcm9tIEFwcGxlIHNhbXBsZSBzb3VyY2UKLQkJCQljb2RlLCBidXQgdGhhdCB5b3UndmUgbWFkZSBjaGFuZ2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgaW5jb3Jwb3JhdGUgdGhpcyBBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUgaW50byB5b3VyIHByb2dyYW0ocykgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9uLiBUaGlzIEFwcGxlIHNhbXBsZSBzb3VyY2UgY29kZSBoYXMgYmVlbiBwcm92aWRlZCAiQVMgSVMiIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSBmb3IgaXRzIG9wZXJhdGlvbiBpcyB5b3Vycy4gWW91IGFyZSBub3QgcGVybWl0dGVkIHRvIHJlZGlzdHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgQXBwbGUgc2FtcGxlIHNvdXJjZSBjb2RlIGFzICJBcHBsZSBzYW1wbGUgc291cmNlIGNvZGUiIGFmdGVyIGhhdmluZyBtYWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy4gSWYgeW91J3JlIGdvaW5nIHRvIHJlLWRpc3RyaWJ1dGUgdGhlIHNvdXJjZSwgd2UgcmVxdWlyZSB0aGF0IHlvdSBtYWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2xlYXIgaW4gdGhlIHNvdXJjZSB0aGF0IHRoZSBjb2RlIHdhcyBkZXNjZW5kZWQgZnJvbSBBcHBsZSBzYW1wbGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSwgYnV0IHRoYXQgeW91J3ZlIG1hZGUgY2hhbmdlcy4KIAotCUNoYW5nZSBIaXN0b3J5IChtb3N0IHJlY2VudCBmaXJzdCk6CisgICAgQ2hhbmdlIEhpc3RvcnkgKG1vc3QgcmVjZW50IGZpcnN0KToKIAotICAgICAgICAgPDY+ICAgICAyMS85LzAxICAgIFF1aW5uICAgQ2hhbmdlcyBmb3IgQ1dQcm83IE1hY2gtTyBidWlsZC4KLSAgICAgICAgIDw1PiAgICAgMTkvOS8wMSAgICBRdWlubiAgIENoYW5nZSBjb21tZW50cyB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgYW4gdW5wYWNrZWQgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBpcyBubyBsb25nZXIgcmVxdWlyZWQuCi0gICAgICAgICA8ND4gICAgIDE5LzkvMDEgICAgUXVpbm4gICBTaW1wbGlmaWVkIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gYWZ0ZXIgYSBzdWdnZXN0aW9uIGJ5IEVyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBqdXN0IHBhc3MgaW4gdGhlIGFkZHJlc3Mgb2YgeW91ciBmcmFnbWVudCdzIGluaXQgcm91dGluZS4KLSAgICAgICAgIDwzPiAgICAxNi8xMS8wMCAgICBRdWlubiAgIEFsbG93IHN5bWJvbCBmaW5kaW5nIHZpYSBhIGNhbGxiYWNrIGFuZCB1c2UgdGhhdCB0byBpbXBsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGQnVuZGxlIHN1cHBvcnQuCi0gICAgICAgICA8Mj4gICAgMTgvMTAvOTkgICAgUXVpbm4gICBSZW5hbWVkIENGTUxhdGVJbXBvcnQgdG8gQ0ZNTGF0ZUltcG9ydExpYnJhcnkgdG8gYWxsb3cgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBmdXR1cmUgQVBJIGV4cGFuc2lvbi4KLSAgICAgICAgIDwxPiAgICAgMTUvNi85OSAgICBRdWlubiAgIEZpcnN0IGNoZWNrZWQgaW4uCisgICAgIDw2PiAgICAgMjEvOS8wMSAgICBRdWlubiAgIENoYW5nZXMgZm9yIENXUHJvNyBNYWNoLU8gYnVpbGQuCisgICAgIDw1PiAgICAgMTkvOS8wMSAgICBRdWlubiAgIENoYW5nZSBjb21tZW50cyB0byByZWZsZWN0IHRoZSBmYWN0IHRoYXQgYW4gdW5wYWNrZWQgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGlzIG5vIGxvbmdlciByZXF1aXJlZC4KKyAgICAgPDQ+ICAgICAxOS85LzAxICAgIFF1aW5uICAgU2ltcGxpZmllZCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGFmdGVyIGEgc3VnZ2VzdGlvbiBieSBFcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYW50LiBZb3Ugbm8gbG9uZ2VyIGhhdmUgdG8gQ0ZNIGV4cG9ydCBhIGR1bW15IGZ1bmN0aW9uOyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGp1c3QgcGFzcyBpbiB0aGUgYWRkcmVzcyBvZiB5b3VyIGZyYWdtZW50J3MgaW5pdCByb3V0aW5lLgorICAgICA8Mz4gICAgMTYvMTEvMDAgICAgUXVpbm4gICBBbGxvdyBzeW1ib2wgZmluZGluZyB2aWEgYSBjYWxsYmFjayBhbmQgdXNlIHRoYXQgdG8gaW1wbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGQnVuZGxlIHN1cHBvcnQuCisgICAgIDwyPiAgICAxOC8xMC85OSAgICBRdWlubiAgIFJlbmFtZWQgQ0ZNTGF0ZUltcG9ydCB0byBDRk1MYXRlSW1wb3J0TGlicmFyeSB0byBhbGxvdyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZnV0dXJlIEFQSSBleHBhbnNpb24uCisgICAgIDwxPiAgICAgMTUvNi85OSAgICBRdWlubiAgIEZpcnN0IGNoZWNrZWQgaW4uCiAqLwogCiAjcHJhZ21hIG9uY2UKQEAgLTQxLDEwICs0MSwxMCBAQAogLy8gTWFjIE9TIEludGVyZmFjZXMKIAogI2lmICEgTU9SRV9GUkFNRVdPUktfSU5DTFVERVMKLQkjaW5jbHVkZSA8TWFjVHlwZXMuaD4KLQkjaW5jbHVkZSA8Q29kZUZyYWdtZW50cy5oPgotCSNpbmNsdWRlIDxEZXZpY2VzLmg+Ci0JI2luY2x1ZGUgPENGQnVuZGxlLmg+CisgICAgI2luY2x1ZGUgPE1hY1R5cGVzLmg+CisgICAgI2luY2x1ZGUgPENvZGVGcmFnbWVudHMuaD4KKyAgICAjaW5jbHVkZSA8RGV2aWNlcy5oPgorICAgICNpbmNsdWRlIDxDRkJ1bmRsZS5oPgogI2VuZGlmCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01MywyMTkgKzUzLDIxOSBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotLyoJRkFRCi0JLS0tCi0JCi0JUToJV2hhdCBkb2VzIHRoaXMgbGlicmFyeSBkbz8KLQlBOglJdCBhbGxvd3MgeW91IHRvIHJlc29sdmUgYSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IGF0IHJ1bnRpbWUsCi0JICAgCWJ5IHN1cHBseSBhIENGTSBjb25uZWN0aW9uIHRvIHRoZSBsaWJyYXJ5IHRoYXQgc2hvdWxkIHN1YnN0aXR1dGUKLQkgICAJZm9yIHRoZSB3ZWFrIGxpbmtlZCBvbmUuCi0JCi0JUToJRG9lcyB0aGUgc3Vic3RpdHV0ZWQgbGlicmFyeSBoYXZlIHRvIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUKLQkJd2VhayBsaW5rZWQgbGlicmFyeS4KLQlBOglOby4KLQkKLQlROglXaGF0J3MgdGhpcyB1c2VmdWwgZm9yPwotCUE6CVRoZSBtb3N0IG9idmlvdXMgZXhhbXBsZSBvZiB3aGVyZSB0aGlzIGlzIHVzZWZ1bCBpcyB3aGVuCi0JCXlvdSByZWx5IG9uIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCB0aGUgdXNlciBtaWdodCBkZWxldGUKLQkJb3IgbW92ZS4gIFRvIGNhbiBmaW5kIHRoZSBzaGFyZWQgbGlicmFyeSAocG9zc2libHkgZXZlbgotCQl1c2luZyBDYXRTZWFyY2gpLCBjYWxsIEdldERpc2tGcmFnbWVudCB0byBvcGVuIGEgY29ubmVjdGlvbgotCQl0byBpdCwgbGF0ZSBpbXBvcnQgaXQgdXNpbmcgdGhpcyBsaWJyYXJ5LCBhbmQgdGhlbiB0aGUKLQkJcmVzdCBvZiB5b3VyIGNvZGUgY2FuIGNvbnRpbnVlIHRvIHVzZSB0aGUgc2hhcmVkIGxpYnJhcnkKLQkJYXMgaWYgbm90aGluZyBoYWQgaGFwcGVuZWQuICBObyBtb3JlIGRlZmluaW5nIHRob3VzYW5kcwotCQlvZiBzdHViIHJvdXRpbmVzIHdoaWNoIGNhbGwgdGhyb3VnaCByb3V0aW5lIHBvaW50ZXJzLgotCQkKLQkJVGhlcmUgYXJlLCBob3dldmVyLCBudW1lcm91cyBsZXNzIG9idmlvdXMgdXNlcy4gIFlvdSBjYW4KLQkJdXNlIHRoaXMgY29kZSB0byBtYWtlIGEgJ3NlbGYgcmVwYWlyaW5nJyBhcHBsaWNhdGlvbi4gIElmCi0JCXRoZSB1c2VyIHJlbW92ZXMgeW91ciBzaGFyZWQgbGlicmFyeSBmcm9tIHRoZSBFeHRlbnNpb25zCi0JCWZvbGRlciwgdGhlIHN0YXJ0dXAgY29kZSBmb3IgeW91ciBhcHBsaWNhdGlvbiBjYW4gb2ZmZXIKLQkJdG9yIHJlLWluc3RhbGwgaXQuICBJZiB0aGUgdXNlciBhZ3JlZXMsIHlvdSBjYW4gdGhlbgotCQlyZS1pbnN0YWxsIHlvdXIgc2hhcmVkIGxpYnJhcnksIGxhdGUgaW1wb3J0IGl0LCBhbmQgdGhlbgotCQljb250aW51ZSBydW5uaW5nIHlvdXIgYXBwbGljYXRpb24gaWYgbm90aGluZyBoYXBwZW5lZC4KLQkJCi0JCVlvdSBjYW4gZXZlbiB1c2UgdGhpcyBjb2RlIHRvIGZyZWUgeW91cnNlbGYgZnJvbSB0aGUKLQkJRXh0ZW5zaW9ucyBmb2xkZXIgZW50aXJlbHkuICBTYXkgeW91IGhhdmUgYSBzdWl0ZSBvZgotCQlhcHBsaWNhdGlvbnMgdGhhdCBjdXJyZW50bHkgaW5zdGFsbHMgYSBkb3plbiBzaGFyZWQgCi0JCWxpYnJhcmllcyBpbiB0aGUgRXh0ZW5zaW9ucyBmb2xkZXIuICBZb3UgY2FuIG1vdmUgdGhvc2UKLQkJbGlicmFyaWVzIHRvIGFub3RoZXIgZm9sZGVyIGVudGlyZWx5IGFuZCBlYWNoIGFwcGxpY2F0aW9uJ3MKLQkJc3RhcnR1cCBjb2RlIGNhbiB0cmFjayBkb3duIHRoZSBsaWJyYXJ5ICh1c2luZyBhbiBhbGlhcwotCQlpbiB0aGUgUHJlZmVyZW5jZXMgZmlsZSkgYW5kIGxhdGUgaW1wb3J0IGl0LgotCQkKLQkJQW4gZXZlbiBjb29sZXIgdXNlIGlzIHRvIHByb3ZpZGUgZWFzeSBhYnN0cmFjdGlvbiBsYXllcnMuCi0JCVNheSB5b3UgaGF2ZSBhIG5ldHdvcmsgY29kZSBmb3IgYm90aCB0aGUgTWFjVENQCi0JCUFQSSBhbmQgdGhlIE9wZW4gVHJhbnNwb3J0IEFQSS4gIFR5cGljYWxseSwgeW91IHdvdWxkIGJlCi0JCWZvcmNlIHRvIGRvIHRoaXMgYnkgaGF2aW5nIGFuIGFic3RyYWN0aW9uIGxheWVyIHdoZXJlIGV2ZXJ5Ci0JCXJvdXRpbmUgY29udGFpbnMgYSBzd2l0Y2ggYmV0d2VlbiBNYWNUQ1AgYW5kIE9ULiAgWW91cgotCQlPcGVuU29ja2V0IHJvdXRpbmUgbWlnaHQgbG9vayBsaWtlOgorLyogICAgICBGQVEKKyAgICAtLS0KIAotCQkJc3RhdGljIGludCBPcGVuU29ja2V0KHZvaWQpCi0JCQl7Ci0JCQkgICAgaWYgKGdPVEF2YWlsYWJsZSkgewotCQkJICAgICAgICByZXR1cm4gT3BlblNvY2tldE9UKCk7Ci0JCQkgICAgfSBlbHNlIHsKLQkJCSAgICAgICAgcmV0dXJuIE9wZW5Tb2NrZXRNYWNUQ1AoKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCQotCQlXaXRoIHRoaXMgY29kZSwgeW91IGNhbiBhdm9pZCB0aGF0IGVudGlyZWx5LiAgU2ltcGx5Ci0JCXdlYWsgbGluayB0byBhIHNoYXJlZCBsaWJyYXJ5IHRoYXQgeW91IGtub3cgaXMgbmV2ZXIKLQkJZ29pbmcgdG8gYmUgaW1wbGVtZW50ZWQgKCJjcmVhO015U29ja2V0c0R1bW15IikgYW5kIHRoZW4sIAotCQlhdCBydW50aW1lLCBkZWNpZGUgd2hldGhlciB0aGUgc3lzdGVtIGhhcyBNYWNUQ1Agb3IgT1QKLQkJYW5kIGxhdGUgaW1wb3J0IHRoZSByZWxldmFudCByZWFsIGltcGxlbWVudGF0aW9uCi0JCSgiY3JlYTtNeVNvY2tldHNNYWNUQ1AiIG9yICJjcmVhO015U29ja2V0c09UIikuCi0JCU9uZSBiZW5lZml0IG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBvbmx5IHRoZSBNYWNUQ1Agb3IKLQkJdGhlIE9UIGNvZGUgaXMgcmVzaWRlbnQgaW4gbWVtb3J5IG9uIGFueSBnaXZlbiBzeXN0ZW0uCisgICAgUTogICAgICAgICAgV2hhdCBkb2VzIHRoaXMgbGlicmFyeSBkbz8KKyAgICBBOiAgICAgICAgICBJdCBhbGxvd3MgeW91IHRvIHJlc29sdmUgYSB3ZWFrIGxpbmtlZCBsaWJyYXJ5IGF0IHJ1bnRpbWUsCisgICAgICAgIGJ5IHN1cHBseSBhIENGTSBjb25uZWN0aW9uIHRvIHRoZSBsaWJyYXJ5IHRoYXQgc2hvdWxkIHN1YnN0aXR1dGUKKyAgICAgICAgZm9yIHRoZSB3ZWFrIGxpbmtlZCBvbmUuCisKKyAgICBROiAgICAgICAgICBEb2VzIHRoZSBzdWJzdGl0dXRlZCBsaWJyYXJ5IGhhdmUgdG8gaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZQorICAgICAgICB3ZWFrIGxpbmtlZCBsaWJyYXJ5LgorICAgIEE6ICAgICAgICAgIE5vLgorCisgICAgUTogICAgICAgICAgV2hhdCdzIHRoaXMgdXNlZnVsIGZvcj8KKyAgICBBOiAgICAgICAgICBUaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcyBpcyB1c2VmdWwgaXMgd2hlbgorICAgICAgICB5b3UgcmVseSBvbiBzaGFyZWQgbGlicmFyaWVzIHRoYXQgdGhlIHVzZXIgbWlnaHQgZGVsZXRlCisgICAgICAgIG9yIG1vdmUuICBUbyBjYW4gZmluZCB0aGUgc2hhcmVkIGxpYnJhcnkgKHBvc3NpYmx5IGV2ZW4KKyAgICAgICAgdXNpbmcgQ2F0U2VhcmNoKSwgY2FsbCBHZXREaXNrRnJhZ21lbnQgdG8gb3BlbiBhIGNvbm5lY3Rpb24KKyAgICAgICAgdG8gaXQsIGxhdGUgaW1wb3J0IGl0IHVzaW5nIHRoaXMgbGlicmFyeSwgYW5kIHRoZW4gdGhlCisgICAgICAgIHJlc3Qgb2YgeW91ciBjb2RlIGNhbiBjb250aW51ZSB0byB1c2UgdGhlIHNoYXJlZCBsaWJyYXJ5CisgICAgICAgIGFzIGlmIG5vdGhpbmcgaGFkIGhhcHBlbmVkLiAgTm8gbW9yZSBkZWZpbmluZyB0aG91c2FuZHMKKyAgICAgICAgb2Ygc3R1YiByb3V0aW5lcyB3aGljaCBjYWxsIHRocm91Z2ggcm91dGluZSBwb2ludGVycy4KKworICAgICAgICBUaGVyZSBhcmUsIGhvd2V2ZXIsIG51bWVyb3VzIGxlc3Mgb2J2aW91cyB1c2VzLiAgWW91IGNhbgorICAgICAgICB1c2UgdGhpcyBjb2RlIHRvIG1ha2UgYSAnc2VsZiByZXBhaXJpbmcnIGFwcGxpY2F0aW9uLiAgSWYKKyAgICAgICAgdGhlIHVzZXIgcmVtb3ZlcyB5b3VyIHNoYXJlZCBsaWJyYXJ5IGZyb20gdGhlIEV4dGVuc2lvbnMKKyAgICAgICAgZm9sZGVyLCB0aGUgc3RhcnR1cCBjb2RlIGZvciB5b3VyIGFwcGxpY2F0aW9uIGNhbiBvZmZlcgorICAgICAgICB0b3IgcmUtaW5zdGFsbCBpdC4gIElmIHRoZSB1c2VyIGFncmVlcywgeW91IGNhbiB0aGVuCisgICAgICAgIHJlLWluc3RhbGwgeW91ciBzaGFyZWQgbGlicmFyeSwgbGF0ZSBpbXBvcnQgaXQsIGFuZCB0aGVuCisgICAgICAgIGNvbnRpbnVlIHJ1bm5pbmcgeW91ciBhcHBsaWNhdGlvbiBpZiBub3RoaW5nIGhhcHBlbmVkLgorCisgICAgICAgIFlvdSBjYW4gZXZlbiB1c2UgdGhpcyBjb2RlIHRvIGZyZWUgeW91cnNlbGYgZnJvbSB0aGUKKyAgICAgICAgRXh0ZW5zaW9ucyBmb2xkZXIgZW50aXJlbHkuICBTYXkgeW91IGhhdmUgYSBzdWl0ZSBvZgorICAgICAgICBhcHBsaWNhdGlvbnMgdGhhdCBjdXJyZW50bHkgaW5zdGFsbHMgYSBkb3plbiBzaGFyZWQKKyAgICAgICAgbGlicmFyaWVzIGluIHRoZSBFeHRlbnNpb25zIGZvbGRlci4gIFlvdSBjYW4gbW92ZSB0aG9zZQorICAgICAgICBsaWJyYXJpZXMgdG8gYW5vdGhlciBmb2xkZXIgZW50aXJlbHkgYW5kIGVhY2ggYXBwbGljYXRpb24ncworICAgICAgICBzdGFydHVwIGNvZGUgY2FuIHRyYWNrIGRvd24gdGhlIGxpYnJhcnkgKHVzaW5nIGFuIGFsaWFzCisgICAgICAgIGluIHRoZSBQcmVmZXJlbmNlcyBmaWxlKSBhbmQgbGF0ZSBpbXBvcnQgaXQuCisKKyAgICAgICAgQW4gZXZlbiBjb29sZXIgdXNlIGlzIHRvIHByb3ZpZGUgZWFzeSBhYnN0cmFjdGlvbiBsYXllcnMuCisgICAgICAgIFNheSB5b3UgaGF2ZSBhIG5ldHdvcmsgY29kZSBmb3IgYm90aCB0aGUgTWFjVENQCisgICAgICAgIEFQSSBhbmQgdGhlIE9wZW4gVHJhbnNwb3J0IEFQSS4gIFR5cGljYWxseSwgeW91IHdvdWxkIGJlCisgICAgICAgIGZvcmNlIHRvIGRvIHRoaXMgYnkgaGF2aW5nIGFuIGFic3RyYWN0aW9uIGxheWVyIHdoZXJlIGV2ZXJ5CisgICAgICAgIHJvdXRpbmUgY29udGFpbnMgYSBzd2l0Y2ggYmV0d2VlbiBNYWNUQ1AgYW5kIE9ULiAgWW91cgorICAgICAgICBPcGVuU29ja2V0IHJvdXRpbmUgbWlnaHQgbG9vayBsaWtlOgorCisgICAgICAgICAgICBzdGF0aWMgaW50IE9wZW5Tb2NrZXQodm9pZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZ09UQXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wZW5Tb2NrZXRPVCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wZW5Tb2NrZXRNYWNUQ1AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgV2l0aCB0aGlzIGNvZGUsIHlvdSBjYW4gYXZvaWQgdGhhdCBlbnRpcmVseS4gIFNpbXBseQorICAgICAgICB3ZWFrIGxpbmsgdG8gYSBzaGFyZWQgbGlicmFyeSB0aGF0IHlvdSBrbm93IGlzIG5ldmVyCisgICAgICAgIGdvaW5nIHRvIGJlIGltcGxlbWVudGVkICgiY3JlYTtNeVNvY2tldHNEdW1teSIpIGFuZCB0aGVuLAorICAgICAgICBhdCBydW50aW1lLCBkZWNpZGUgd2hldGhlciB0aGUgc3lzdGVtIGhhcyBNYWNUQ1Agb3IgT1QKKyAgICAgICAgYW5kIGxhdGUgaW1wb3J0IHRoZSByZWxldmFudCByZWFsIGltcGxlbWVudGF0aW9uCisgICAgICAgICgiY3JlYTtNeVNvY2tldHNNYWNUQ1AiIG9yICJjcmVhO015U29ja2V0c09UIikuCisgICAgICAgIE9uZSBiZW5lZml0IG9mIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCBvbmx5IHRoZSBNYWNUQ1Agb3IKKyAgICAgICAgdGhlIE9UIGNvZGUgaXMgcmVzaWRlbnQgaW4gbWVtb3J5IG9uIGFueSBnaXZlbiBzeXN0ZW0uCiAqLwogCiB0eXBlZGVmIHBhc2NhbCBPU1N0YXR1cyAoKkNGTUxhdGVJbXBvcnRMb29rdXBQcm9jKShDb25zdFN0cjI1NVBhcmFtIHN5bU5hbWUsIENGcmFnU3ltYm9sQ2xhc3Mgc3ltQ2xhc3MsCi0JCQkJCQkJCQkJCQkJdm9pZCAqKnN5bUFkZHIsIHZvaWQgKnJlZkNvbik7Ci0JLy8gQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgZGVmaW5lcyBhIGNhbGxiYWNrIGZvciBDRk1MYXRlSW1wb3J0Q29yZS4KLQkvLyBUaGUgcm91dGluZSBpcyBleHBlY3RlZCB0byBsb29rIHVwIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgbmFtZWQgCi0JLy8gc3ltTmFtZSBhbmQgcmV0dXJuIGl0IGluICpzeW1BZGRyLiAgVGhlIHN5bWJvbCBzaG91bGQgYmUgb2YgY2xhc3MgCi0JLy8gc3ltQ2xhc3MsIGFsdGhvdWdoIHRoZSBjYWxsYmFjayBkZWNpZGVzIHdoZXRoZXIgYSBjbGFzcyBtaXNtYXRjaCBpcyAKLQkvLyBhbiBlcnJvci4gIHJlZkNvbiBpcyBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIG9yaWdpbmFsbHkgCi0JLy8gcGFzc2VkIGluIHRvIENGTUxhdGVJbXBvcnRDb3JlLgotCS8vCi0JLy8gSWYgdGhpcyByb3V0aW5lIHJldHVybnMgYW4gZXJyb3IsIGEgc3ltYm9sIGFkZHJlc3Mgb2YgMCBpcyBhc3N1bWVkLiAKLQkvLyBJZiB0aGUgc3ltYm9sIGlzIG1hcmtlZCBhcyBhIHdlYWsgaW1wb3J0LCB0aGUgQ0ZNTGF0ZUltcG9ydENvcmUgd2lsbCAKLQkvLyBjb250aW51ZSwgb3RoZXJ3aXNlIHRoZSBDRk1MYXRlSW1wb3J0Q29yZSByb3V0aW5lIHdpbGwgZmFpbCB3aXRoIHRoZSAKLQkvLyBlcnJvci4KLQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnN5bUFkZHIsIHZvaWQgKnJlZkNvbik7CisgICAgLy8gQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgZGVmaW5lcyBhIGNhbGxiYWNrIGZvciBDRk1MYXRlSW1wb3J0Q29yZS4KKyAgICAvLyBUaGUgcm91dGluZSBpcyBleHBlY3RlZCB0byBsb29rIHVwIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgbmFtZWQKKyAgICAvLyBzeW1OYW1lIGFuZCByZXR1cm4gaXQgaW4gKnN5bUFkZHIuICBUaGUgc3ltYm9sIHNob3VsZCBiZSBvZiBjbGFzcworICAgIC8vIHN5bUNsYXNzLCBhbHRob3VnaCB0aGUgY2FsbGJhY2sgZGVjaWRlcyB3aGV0aGVyIGEgY2xhc3MgbWlzbWF0Y2ggaXMKKyAgICAvLyBhbiBlcnJvci4gIHJlZkNvbiBpcyBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIG9yaWdpbmFsbHkKKyAgICAvLyBwYXNzZWQgaW4gdG8gQ0ZNTGF0ZUltcG9ydENvcmUuCisgICAgLy8KKyAgICAvLyBJZiB0aGlzIHJvdXRpbmUgcmV0dXJucyBhbiBlcnJvciwgYSBzeW1ib2wgYWRkcmVzcyBvZiAwIGlzIGFzc3VtZWQuCisgICAgLy8gSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgYXMgYSB3ZWFrIGltcG9ydCwgdGhlIENGTUxhdGVJbXBvcnRDb3JlIHdpbGwKKyAgICAvLyBjb250aW51ZSwgb3RoZXJ3aXNlIHRoZSBDRk1MYXRlSW1wb3J0Q29yZSByb3V0aW5lIHdpbGwgZmFpbCB3aXRoIHRoZQorICAgIC8vIGVycm9yLgorCiBleHRlcm4gcGFzY2FsIE9TU3RhdHVzIENGTUxhdGVJbXBvcnRDb3JlKGNvbnN0IENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciAqZnJhZ1RvRml4TG9jYXRvciwKLQkJCQkJCQkJCQlDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCi0JCQkJCQkJCQkJQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCi0JCQkJCQkJCQkJQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCi0JCQkJCQkJCQkJQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLAotCQkJCQkJCQkJCXZvaWQgKnJlZkNvbik7Ci0JLy8gVGhpcyByb3V0aW5lIHdpbGwgbGluayB5b3UsIGF0IHJ1bnRpbWUsIHRvIHNvbWUgbGlicmFyeSAKLQkvLyB0aGF0IHlvdSB3ZXJlIHdlYWsgbGlua2VkIHRvIGFuZCB3YXNuJ3QgcHJlc2VudCB3aGVuIHlvdXIKLQkvLyBmcmFnbWVudCB3YXMgcHJlcGFyZWQuICBBcyB3ZWxsIGFzIHRoZSBvYnZpb3VzIGZ1bmN0aW9uYWxpdHkKLQkvLyBvZiBiZWluZyBhYmxlIHRvIHJlc29sdmUgd2VhayBsaW5rcyBhZnRlciBwcmVwYXJlIHRpbWUsCi0JLy8gdGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSBwdXQgdG8gYSBudW1iZXIgb2YgbGVzcyBvYnZpb3VzIHVzZXMsCi0JLy8gc29tZSBvZiB3aGljaCBhcmUgZGlzY3Vzc2VkIGF0IHRoZSB0b3Agb2YgdGhpcyBoZWFkZXIgZmlsZS4KLQkvLwotCS8vIFRvIGNhbGwgdGhpcyByb3V0aW5lLCB5b3UgbmVlZCBhIG51bWJlciBvZiBwaWVjZXMgb2YgaW5mb3JtYXRpb246Ci0JLy8KLQkvLyAxLiBmcmFnVG9GaXhMb2NhdG9yLCBmcmFnVG9GaXhDb25uSUQ6ICBUaGUgbG9jYXRpb24gb2YgeW91ciBvd24KLQkvLyAgICBjb2RlIGZyYWdtZW50IG9uIGRpc2sgYW5kIHRoZSBDRk0gY29ubmVjdGlvbiBJRCB0byB5b3VyIG93bgotCS8vICAgIGNvZGUgZnJhZ21lbnQuICBUeXBpY2FsbHkgeW91IGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20geW91ciAKLQkvLyAgICBmcmFnbWVudCdzIENGTSBpbml0IHJvdXRpbmUuICBZb3UgbXVzdCBlbnN1cmUgdGhhdAotCS8vICAgIGZyYWdUb0ZpeExvY2F0b3ItPmZpbGVTcGVjIHBvaW50cyB0byBhbiBGU1NwZWMgb2YgdGhlCi0JLy8gICAgZmlsZSB3aGljaCBob2xkcyB5b3VyIGNvZGUgZnJhZ21lbnQuCi0JLy8KLQkvLyAgICBJTVBPUlRBTlQ6Ci0JLy8gICAgVGhlIGZhY3QgdGhhdCB5b3UgcGFzcyBpbiBhIENGcmFnU3lzdGVtN0Rpc2tGbGF0TG9jYXRvciBhcyB0aGUKLQkvLyAgICBmcmFnVG9GaXhMb2NhdG9yIGltcGxpZXMgdGhhdCB0aGUgZnJhZ21lbnQgdG8gYmUgZml4ZWQgdXAgbXVzdAotCS8vICAgIGJlIGluIHRoZSBkYXRhIGZvcmsgb2YgYSBmaWxlLiAgVGhlIGNvZGUgY291bGQgYmUgbW9kaWZpZWQKLQkvLyAgICB0byByZW1vdmUgdGhpcyByZXF1aXJlbWVudCwgYnV0IG9uIGRpc2sgY29kZSBmcmFnbWVudHMgYXJlIHRoZSBtb3N0Ci0JLy8gICAgY29tbW9uIGNhc2UuCi0JLy8KLQkvLyAgICBJTVBPUlRBTlQ6Ci0JLy8gICAgVGhlIGZyYWdtZW50IHRvIGZpeCBtYXkgaGF2ZSBhIHBhY2tlZCBkYXRhIHNlY3Rpb24uICBQYWNraW5nIHRoZSAKLQkvLyAgICBkYXRhIHNlY3Rpb24gd2lsbCByZWR1Y2UgdGhlIHNpemUgb2YgeW91ciBmcmFnbWVudCBvbiBkaXNrLCBidXQgaXQgCi0JLy8gICAgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBtZW1vcnkgbmVlZGVkIGJ5IHRoaXMgcm91dGluZSAKLQkvLyAgICAoaXQgaW5jcmVhc2VzIG1lbW9yeSB1c2FnZSBieSB0aGUgc3VtIG9mIHRoZSBzaXplcyBvZiB0aGUgcGFja2VkIAotCS8vICAgIGFuZCB1bnBhY2tlZCBkYXRhIHNlY3Rpb24pLiAgU2VlIGJlbG93IGZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIAotCS8vICAgIGNyZWF0ZSBhbiB1bnBhY2tlZCBkYXRhIHNlY3Rpb24uCi0JLy8KLQkvLyAyLiBmcmFnVG9GaXhJbml0Um91dGluZTogIEEgcG9pbnRlciB0byB5b3VyIG93biBjb2RlIGZyYWdtZW50J3MKLQkvLyAgICBmcmFnbWVudCBpbml0aWFsaXNlciByb3V0aW5lLiAgWW91IG5lY2Vzc2FyaWx5IGhhdmUgb25lIG9mIHRoZXNlIAotCS8vICAgIGJlY2F1c2UgeW91IG5lZWQgaXQgdG8gZ2V0IHZhbHVlcyBmb3IgdGhlIGZyYWdUb0ZpeExvY2F0b3IgYW5kIAotCS8vICAgIGZyYWdUb0ZpeENvbm5JRCBwYXJhbWV0ZXJzLiAgSnVzdCBwYXNzIGl0cyBhZGRyZXNzIGluIGFzIGEgcGFyYW1ldGVyIAotCS8vICAgIGFzIHdlbGwuIAotCS8vCi0JLy8gMy4gd2Vha0xpbmtlZExpYnJhcnlOYW1lOiAgVGhlIG5hbWUgb2YgdGhlIHdlYWsgbGlua2VkIGxpYnJhcnkgd2hpY2gKLQkvLyAgICBmYWlsZWQgdG8gbGluay4gIFlvdSBtdXN0IGhhdmUgd2VhayBsaW5rZWQgdG8gdGhpcyBsaWJyYXJ5LgotCS8vICAgIEl0IGlzIG94eW1vcmljIGZvciB5b3UgdG8gcGFzcyBhIHN0cm9uZyBsaW5rZWQgbGlicmFyeSBoZXJlLAotCS8vICAgIGJlY2F1c2UgeW91ciBjb2RlIHdvdWxkIG5vdCBoYXZlIHByZXBhcmVkIGlmIGEgc3Ryb25nIGxpbmtlZAotCS8vICAgIGxpYnJhcnkgZmFpbGVkIHRvIHByZXBhcmUsIGFuZCBzbyB5b3UgY291bGRuJ3Qgc3VwcGx5IGEgdmFsaWQKLQkvLy8gICBmcmFnVG9GaXguCi0JLy8KLQkvLyA0LiBsb29rdXAsIHJlZkNvbjogIEEgcG9pbnRlciB0byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgdGhlIAotCS8vCSAgcm91dGluZSBjYWxscyB0byBsb29rIHVwIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sLCBhbmQgYSByZWZDb24gCi0JLy8gICAgZm9yIHRoYXQgY2FsbGJhY2sgcm91dGluZS4KLQkvLwotCS8vIE5vdGU6Ci0JLy8gVGhlIGZyYWdUb0ZpeExvY2F0b3IgYW5kIGZyYWdUb0ZpeEluaXRSb3V0aW5lIHBhcmFtZXRlcnMKLQkvLyBhcmUgYXJ0aWZhY3RzIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkLgotCS8vIEluIGFuIGlkZWFsIHdvcmxkLCB3aGVyZSBDRk0gZXhwb3J0ZWQgZGVjZW50IGludHJvc3BlY3Rpb24gQVBJcwotCS8vIHRvIHRoaXJkIHBhcnR5IGRldmVsb3BlcnMsIHRoZXNlIHBhcmFtZXRlcnMgd291bGQgbm90IGJlIG5lY2Vzc2FyeS4KLQkvLyBJZiB5b3UncmUgdXNpbmcgdGhpcyBjb2RlIGluc2lkZSBBcHBsZSwgeW91IHByb2JhYmx5IHNob3VsZCBpbnZlc3RpZ2F0ZQotCS8vIHVzaW5nIHRoZSBDRk0gcHJpdmF0ZSBBUElzIGZvciBnZXR0aW5nIGF0IHRoZSBpbmZvcm1hdGlvbiB0aGVzZQotCS8vIHBhcmFtZXRlcnMgYXJlIG5lZWRlZCBmb3IuICBTZWUgdGhlIGNvbW1lbnRzIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb24KLQkvLyBmb3IgbW9yZSBkZXRhaWxzLgotCS8vCi0JLy8gTm90ZToKLQkvLyBUaGUgZXh0cmEgbWVtb3J5IHRha2VuIHdoZW4geW91IHVzZSBhIHBhY2tlZCBkYXRhIHNlY3Rpb24gaXMgYWxzbyBhbiAKLQkvLyBhcnRpZmFjdCBvZiBteSB3b3JrYXJvdW5kIGZvciB0aGUgbGFjayBvZiBDRk0gaW50cm9zcGVjdGlvbiBBUElzLiAgSW4gCi0JLy8gbXkgb3BpbmlvbiBpdCdzIGJldHRlciB0byB1c2UgYW4gdW5wYWNrZWQgZGF0YSBzZWN0aW9uIGFuZCBjb25zdW1lIG1vcmUgCi0JLy8gc3BhY2Ugb24gZGlzayB3aGlsZSBzYXZpbmcgbWVtb3J5LiAgSW4gQ29kZVdhcnJpb3IgeW91IGNhbiBzd2l0Y2ggdG8gYW4gCi0JLy8gdW5wYWNrZWQgZGF0YSBzZWN0aW9uIGJ5IGNoZWNraW5nIHRoZSAiRXhwYW5kIFVuaW5pdGlhbGl6ZWQgRGF0YSIgCi0JLy8gY2hlY2tib3ggaW4gdGhlICJQUEMgUEVGIiBzZXR0aW5ncyBwYW5lbC4gIEluIE1QVywgc3BlY2lmaWVkIHRoZQotCS8vICItcGFja2RhdGEgb2ZmIiBvcHRpb24gdG8gUFBDTGluay4KLQkvLwotCS8vIFdoZW4gdGhlIHJvdXRpbmUgcmV0dXJucywgYW55IHN5bWJvbHMgdGhhdCB5b3UgaW1wb3J0ZWQgZnJvbSB0aGUKLQkvLyBsaWJyYXJ5IG5hbWVkIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSB3aWxsIGJlIHJlc29sdmVkIHRvIHRoZSBhZGRyZXNzCi0JLy8gb2YgdGhlIHN5bWJvbCBwcm92aWRlZCBieSB0aGUgImxvb2t1cCIgY2FsbGJhY2sgcm91dGluZS4KLQkvLwotCS8vIEl0IGlzIHBvc3NpYmxlIGZvciBhbiB1bnJlc29sdmVkIGltcG9ydCB0byByZW1haW4gdW5yZXNvbHZlZCBhZnRlcgotCS8vIHRoaXMgcm91dGluZSByZXR1cm5zLiAgSWYgdGhlIHN5bWJvbCBpbXBvcnQgaXMgbWFya2VkIGFzIHdlYWsgKGFzCi0JLy8gb3Bwb3NlZCB0byB0aGUgbGlicmFyeSwgd2hpY2ggKm11c3QqIGJlIG1hcmtlZCBhcyB3ZWFrKSBhbmQgdGhlIHN5bWJvbAotCS8vIGlzIG5vdCBmb3VuZCBieSB0aGUgImxvb2t1cCIgY2FsbGJhY2ssIHRoZSByb3V0aW5lIHdpbGwgc2ltcGxlIHNraXAgCi0JLy8gdGhhdCBzeW1ib2wuICBJZiB0aGUgc3ltYm9sIGlzbid0IG1hcmtlZCBhcyB3ZWFrLCB0aGUgcm91dGluZSB3aWxsIGZhaWwgCi0JLy8gaW4gdGhhdCBjYXNlLgotCS8vCi0JLy8gTW9zdCBvZiB0aGUgcG9zc2libGUgZXJyb3IgcmVzdWx0cyBhcmUgY28tb3B0ZWQgQ0ZNIGVycm9ycy4gIFRoZXNlCi0JLy8gaW5jbHVkZToKLQkvLwotCS8vIGNmcmFnRnJhZ21lbnRGb3JtYXRFcnIgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgaXMgYW4gdW5rbm93biBmb3JtYXQuCi0JLy8gY2ZyYWdOb1NlY3Rpb25FcnIgICAgICAgLS0gQ291bGQgbm90IGZpbmQgdGhlIGxvYWRlciBzZWN0aW9uIGluIHRoZSBmcmFnbWVudCB0byBmaXguCi0JLy8gY2ZyYWdOb0xpYnJhcnlFcnIgICAgICAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBpcyBub3Qgd2VhayBsaW5rZWQgdG8gd2Vha0xpbmtlZExpYnJhcnlOYW1lLgotCS8vIGNmcmFnRnJhZ21lbnRVc2FnZUVyciAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggZG9lc24ndCBoYXZlIGEgZGF0YSBzZWN0aW9uLgotCS8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tIFRoZSBmcmFnbWVudCB0byBmaXggaXMgc3Ryb25nIGxpbmtlZCB0byB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgLS0gVGhlIGZyYWdtZW50IGRvZXNuJ3QgaGF2ZSBhbiBpbml0IHJvdXRpbmUuCi0JLy8gY2ZyYWdGcmFnbWVudENvcnJ1cHRFcnIgLS0gRW5jb3VudGVyZWQgYW4gdW5kZWZpbmVkIHJlbG9jYXRpb24gb3Bjb2RlLgotCS8vIHVuaW1wRXJyICAgICAgICAgICAgICAgIC0tIEVuY291bnRlcmVkIGFuIHVuaW1wbGVtZW50IHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBlbmdpbmUgb25seSBpbXBsZW1lbnRzIGEgc3Vic2V0IG9mIHRoZSBDRk0KLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIG9wY29kZXMsIHRoZSBzdWJzZXQgbW9zdCBjb21tb25seSB1c2VkIGJ5Ci0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBXIGFuZCBDb2RlV2FycmlvciBQRUYgY29udGFpbmVycy4gIElmIHlvdSBlbmNvdW50ZXIKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVycm9yLCB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBhZGQgdGhlIHdlaXJkCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiBvcGNvZGUgdG8gdGhlIGVuZ2luZSwgd2hpY2ggc2hvdWxkbid0IGJlCi0JLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdG9vIGhhcmQuCi0JLy8gbWVtRnVsbEVycgkJCSAgIC0tIEl0J3MgbGlrZWx5IHRoYXQgdGhpcyBlcnJvciBpcyB0cmlnZ2VyZWQgYnkgdGhlIG1lbW9yeSAKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gdW5wYWNrIHlvdXIgZGF0YSBzZWN0aW9uLiAgRWl0aGVyIG1ha2UgeW91ciAKLQkvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHNlY3Rpb24gc21hbGxlciwgb3IgdW5wYWNrIGl0IChzZWUgYWJvdmUpLgotCS8vIGVycm9ycyByZXR1cm5lZCBieSBGaW5kU3ltYm9sCi0JLy8gZXJyb3JzIHJldHVybmVkIGJ5IE1lbW9yeSBNYW5hZ2VyCi0JLy8KLQkvLyBUaGUgcm91dGluZSBuZWVkcyBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIGxvYWRlciBzZWN0aW9uIG9mIHRoZSBmcmFnbWVudAotCS8vIHRvIGZpeCBpbiBtZW1vcnkuICBJdCBhbGxvY2F0ZXMgdGhhdCBtZW1vcnkgdXNpbmcgTmV3UHRyIGFuZCBkaXNwc29zZXMgb2YgCi0JLy8gaXQgYmVmb3JlIGl0IHJldHVybnMuICBZb3UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoZSBtZW1vcnkgYWxsb2NhdG9yLCB3aGljaAotCS8vIGlzIHZlcnkgc2ltcGxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0Nvbm5lY3Rpb25JRCBmcmFnVG9GaXhDb25uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNTGF0ZUltcG9ydExvb2t1cFByb2MgbG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWZDb24pOworICAgIC8vIFRoaXMgcm91dGluZSB3aWxsIGxpbmsgeW91LCBhdCBydW50aW1lLCB0byBzb21lIGxpYnJhcnkKKyAgICAvLyB0aGF0IHlvdSB3ZXJlIHdlYWsgbGlua2VkIHRvIGFuZCB3YXNuJ3QgcHJlc2VudCB3aGVuIHlvdXIKKyAgICAvLyBmcmFnbWVudCB3YXMgcHJlcGFyZWQuICBBcyB3ZWxsIGFzIHRoZSBvYnZpb3VzIGZ1bmN0aW9uYWxpdHkKKyAgICAvLyBvZiBiZWluZyBhYmxlIHRvIHJlc29sdmUgd2VhayBsaW5rcyBhZnRlciBwcmVwYXJlIHRpbWUsCisgICAgLy8gdGhpcyBmdW5jdGlvbmFsaXR5IGNhbiBiZSBwdXQgdG8gYSBudW1iZXIgb2YgbGVzcyBvYnZpb3VzIHVzZXMsCisgICAgLy8gc29tZSBvZiB3aGljaCBhcmUgZGlzY3Vzc2VkIGF0IHRoZSB0b3Agb2YgdGhpcyBoZWFkZXIgZmlsZS4KKyAgICAvLworICAgIC8vIFRvIGNhbGwgdGhpcyByb3V0aW5lLCB5b3UgbmVlZCBhIG51bWJlciBvZiBwaWVjZXMgb2YgaW5mb3JtYXRpb246CisgICAgLy8KKyAgICAvLyAxLiBmcmFnVG9GaXhMb2NhdG9yLCBmcmFnVG9GaXhDb25uSUQ6ICBUaGUgbG9jYXRpb24gb2YgeW91ciBvd24KKyAgICAvLyAgICBjb2RlIGZyYWdtZW50IG9uIGRpc2sgYW5kIHRoZSBDRk0gY29ubmVjdGlvbiBJRCB0byB5b3VyIG93bgorICAgIC8vICAgIGNvZGUgZnJhZ21lbnQuICBUeXBpY2FsbHkgeW91IGdldCB0aGlzIGluZm9ybWF0aW9uIGZyb20geW91cgorICAgIC8vICAgIGZyYWdtZW50J3MgQ0ZNIGluaXQgcm91dGluZS4gIFlvdSBtdXN0IGVuc3VyZSB0aGF0CisgICAgLy8gICAgZnJhZ1RvRml4TG9jYXRvci0+ZmlsZVNwZWMgcG9pbnRzIHRvIGFuIEZTU3BlYyBvZiB0aGUKKyAgICAvLyAgICBmaWxlIHdoaWNoIGhvbGRzIHlvdXIgY29kZSBmcmFnbWVudC4KKyAgICAvLworICAgIC8vICAgIElNUE9SVEFOVDoKKyAgICAvLyAgICBUaGUgZmFjdCB0aGF0IHlvdSBwYXNzIGluIGEgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yIGFzIHRoZQorICAgIC8vICAgIGZyYWdUb0ZpeExvY2F0b3IgaW1wbGllcyB0aGF0IHRoZSBmcmFnbWVudCB0byBiZSBmaXhlZCB1cCBtdXN0CisgICAgLy8gICAgYmUgaW4gdGhlIGRhdGEgZm9yayBvZiBhIGZpbGUuICBUaGUgY29kZSBjb3VsZCBiZSBtb2RpZmllZAorICAgIC8vICAgIHRvIHJlbW92ZSB0aGlzIHJlcXVpcmVtZW50LCBidXQgb24gZGlzayBjb2RlIGZyYWdtZW50cyBhcmUgdGhlIG1vc3QKKyAgICAvLyAgICBjb21tb24gY2FzZS4KKyAgICAvLworICAgIC8vICAgIElNUE9SVEFOVDoKKyAgICAvLyAgICBUaGUgZnJhZ21lbnQgdG8gZml4IG1heSBoYXZlIGEgcGFja2VkIGRhdGEgc2VjdGlvbi4gIFBhY2tpbmcgdGhlCisgICAgLy8gICAgZGF0YSBzZWN0aW9uIHdpbGwgcmVkdWNlIHRoZSBzaXplIG9mIHlvdXIgZnJhZ21lbnQgb24gZGlzaywgYnV0IGl0CisgICAgLy8gICAgd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSBtZW1vcnkgbmVlZGVkIGJ5IHRoaXMgcm91dGluZQorICAgIC8vICAgIChpdCBpbmNyZWFzZXMgbWVtb3J5IHVzYWdlIGJ5IHRoZSBzdW0gb2YgdGhlIHNpemVzIG9mIHRoZSBwYWNrZWQKKyAgICAvLyAgICBhbmQgdW5wYWNrZWQgZGF0YSBzZWN0aW9uKS4gIFNlZSBiZWxvdyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0bworICAgIC8vICAgIGNyZWF0ZSBhbiB1bnBhY2tlZCBkYXRhIHNlY3Rpb24uCisgICAgLy8KKyAgICAvLyAyLiBmcmFnVG9GaXhJbml0Um91dGluZTogIEEgcG9pbnRlciB0byB5b3VyIG93biBjb2RlIGZyYWdtZW50J3MKKyAgICAvLyAgICBmcmFnbWVudCBpbml0aWFsaXNlciByb3V0aW5lLiAgWW91IG5lY2Vzc2FyaWx5IGhhdmUgb25lIG9mIHRoZXNlCisgICAgLy8gICAgYmVjYXVzZSB5b3UgbmVlZCBpdCB0byBnZXQgdmFsdWVzIGZvciB0aGUgZnJhZ1RvRml4TG9jYXRvciBhbmQKKyAgICAvLyAgICBmcmFnVG9GaXhDb25uSUQgcGFyYW1ldGVycy4gIEp1c3QgcGFzcyBpdHMgYWRkcmVzcyBpbiBhcyBhIHBhcmFtZXRlcgorICAgIC8vICAgIGFzIHdlbGwuCisgICAgLy8KKyAgICAvLyAzLiB3ZWFrTGlua2VkTGlicmFyeU5hbWU6ICBUaGUgbmFtZSBvZiB0aGUgd2VhayBsaW5rZWQgbGlicmFyeSB3aGljaAorICAgIC8vICAgIGZhaWxlZCB0byBsaW5rLiAgWW91IG11c3QgaGF2ZSB3ZWFrIGxpbmtlZCB0byB0aGlzIGxpYnJhcnkuCisgICAgLy8gICAgSXQgaXMgb3h5bW9yaWMgZm9yIHlvdSB0byBwYXNzIGEgc3Ryb25nIGxpbmtlZCBsaWJyYXJ5IGhlcmUsCisgICAgLy8gICAgYmVjYXVzZSB5b3VyIGNvZGUgd291bGQgbm90IGhhdmUgcHJlcGFyZWQgaWYgYSBzdHJvbmcgbGlua2VkCisgICAgLy8gICAgbGlicmFyeSBmYWlsZWQgdG8gcHJlcGFyZSwgYW5kIHNvIHlvdSBjb3VsZG4ndCBzdXBwbHkgYSB2YWxpZAorICAgIC8vLyAgIGZyYWdUb0ZpeC4KKyAgICAvLworICAgIC8vIDQuIGxvb2t1cCwgcmVmQ29uOiAgQSBwb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB0aGUKKyAgICAvLyAgICAgICAgICAgIHJvdXRpbmUgY2FsbHMgdG8gbG9vayB1cCB0aGUgYWRkcmVzcyBvZiBhIHN5bWJvbCwgYW5kIGEgcmVmQ29uCisgICAgLy8gICAgZm9yIHRoYXQgY2FsbGJhY2sgcm91dGluZS4KKyAgICAvLworICAgIC8vIE5vdGU6CisgICAgLy8gVGhlIGZyYWdUb0ZpeExvY2F0b3IgYW5kIGZyYWdUb0ZpeEluaXRSb3V0aW5lIHBhcmFtZXRlcnMKKyAgICAvLyBhcmUgYXJ0aWZhY3RzIG9mIHRoZSB3YXkgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbmFsaXR5IGlzIGltcGxlbWVudGVkLgorICAgIC8vIEluIGFuIGlkZWFsIHdvcmxkLCB3aGVyZSBDRk0gZXhwb3J0ZWQgZGVjZW50IGludHJvc3BlY3Rpb24gQVBJcworICAgIC8vIHRvIHRoaXJkIHBhcnR5IGRldmVsb3BlcnMsIHRoZXNlIHBhcmFtZXRlcnMgd291bGQgbm90IGJlIG5lY2Vzc2FyeS4KKyAgICAvLyBJZiB5b3UncmUgdXNpbmcgdGhpcyBjb2RlIGluc2lkZSBBcHBsZSwgeW91IHByb2JhYmx5IHNob3VsZCBpbnZlc3RpZ2F0ZQorICAgIC8vIHVzaW5nIHRoZSBDRk0gcHJpdmF0ZSBBUElzIGZvciBnZXR0aW5nIGF0IHRoZSBpbmZvcm1hdGlvbiB0aGVzZQorICAgIC8vIHBhcmFtZXRlcnMgYXJlIG5lZWRlZCBmb3IuICBTZWUgdGhlIGNvbW1lbnRzIGluc2lkZSB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLgorICAgIC8vCisgICAgLy8gTm90ZToKKyAgICAvLyBUaGUgZXh0cmEgbWVtb3J5IHRha2VuIHdoZW4geW91IHVzZSBhIHBhY2tlZCBkYXRhIHNlY3Rpb24gaXMgYWxzbyBhbgorICAgIC8vIGFydGlmYWN0IG9mIG15IHdvcmthcm91bmQgZm9yIHRoZSBsYWNrIG9mIENGTSBpbnRyb3NwZWN0aW9uIEFQSXMuICBJbgorICAgIC8vIG15IG9waW5pb24gaXQncyBiZXR0ZXIgdG8gdXNlIGFuIHVucGFja2VkIGRhdGEgc2VjdGlvbiBhbmQgY29uc3VtZSBtb3JlCisgICAgLy8gc3BhY2Ugb24gZGlzayB3aGlsZSBzYXZpbmcgbWVtb3J5LiAgSW4gQ29kZVdhcnJpb3IgeW91IGNhbiBzd2l0Y2ggdG8gYW4KKyAgICAvLyB1bnBhY2tlZCBkYXRhIHNlY3Rpb24gYnkgY2hlY2tpbmcgdGhlICJFeHBhbmQgVW5pbml0aWFsaXplZCBEYXRhIgorICAgIC8vIGNoZWNrYm94IGluIHRoZSAiUFBDIFBFRiIgc2V0dGluZ3MgcGFuZWwuICBJbiBNUFcsIHNwZWNpZmllZCB0aGUKKyAgICAvLyAiLXBhY2tkYXRhIG9mZiIgb3B0aW9uIHRvIFBQQ0xpbmsuCisgICAgLy8KKyAgICAvLyBXaGVuIHRoZSByb3V0aW5lIHJldHVybnMsIGFueSBzeW1ib2xzIHRoYXQgeW91IGltcG9ydGVkIGZyb20gdGhlCisgICAgLy8gbGlicmFyeSBuYW1lZCB3ZWFrTGlua2VkTGlicmFyeU5hbWUgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgYWRkcmVzcworICAgIC8vIG9mIHRoZSBzeW1ib2wgcHJvdmlkZWQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrIHJvdXRpbmUuCisgICAgLy8KKyAgICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gdW5yZXNvbHZlZCBpbXBvcnQgdG8gcmVtYWluIHVucmVzb2x2ZWQgYWZ0ZXIKKyAgICAvLyB0aGlzIHJvdXRpbmUgcmV0dXJucy4gIElmIHRoZSBzeW1ib2wgaW1wb3J0IGlzIG1hcmtlZCBhcyB3ZWFrIChhcworICAgIC8vIG9wcG9zZWQgdG8gdGhlIGxpYnJhcnksIHdoaWNoICptdXN0KiBiZSBtYXJrZWQgYXMgd2VhaykgYW5kIHRoZSBzeW1ib2wKKyAgICAvLyBpcyBub3QgZm91bmQgYnkgdGhlICJsb29rdXAiIGNhbGxiYWNrLCB0aGUgcm91dGluZSB3aWxsIHNpbXBsZSBza2lwCisgICAgLy8gdGhhdCBzeW1ib2wuICBJZiB0aGUgc3ltYm9sIGlzbid0IG1hcmtlZCBhcyB3ZWFrLCB0aGUgcm91dGluZSB3aWxsIGZhaWwKKyAgICAvLyBpbiB0aGF0IGNhc2UuCisgICAgLy8KKyAgICAvLyBNb3N0IG9mIHRoZSBwb3NzaWJsZSBlcnJvciByZXN1bHRzIGFyZSBjby1vcHRlZCBDRk0gZXJyb3JzLiAgVGhlc2UKKyAgICAvLyBpbmNsdWRlOgorICAgIC8vCisgICAgLy8gY2ZyYWdGcmFnbWVudEZvcm1hdEVyciAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBpcyBpcyBhbiB1bmtub3duIGZvcm1hdC4KKyAgICAvLyBjZnJhZ05vU2VjdGlvbkVyciAgICAgICAtLSBDb3VsZCBub3QgZmluZCB0aGUgbG9hZGVyIHNlY3Rpb24gaW4gdGhlIGZyYWdtZW50IHRvIGZpeC4KKyAgICAvLyBjZnJhZ05vTGlicmFyeUVyciAgICAgICAtLSBUaGUgZnJhZ21lbnQgdG8gZml4IGlzIG5vdCB3ZWFrIGxpbmtlZCB0byB3ZWFrTGlua2VkTGlicmFyeU5hbWUuCisgICAgLy8gY2ZyYWdGcmFnbWVudFVzYWdlRXJyICAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBkb2Vzbid0IGhhdmUgYSBkYXRhIHNlY3Rpb24uCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgLS0gVGhlIGZyYWdtZW50IHRvIGZpeCBpcyBzdHJvbmcgbGlua2VkIHRvIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAtLSBUaGUgZnJhZ21lbnQgZG9lc24ndCBoYXZlIGFuIGluaXQgcm91dGluZS4KKyAgICAvLyBjZnJhZ0ZyYWdtZW50Q29ycnVwdEVyciAtLSBFbmNvdW50ZXJlZCBhbiB1bmRlZmluZWQgcmVsb2NhdGlvbiBvcGNvZGUuCisgICAgLy8gdW5pbXBFcnIgICAgICAgICAgICAgICAgLS0gRW5jb3VudGVyZWQgYW4gdW5pbXBsZW1lbnQgcmVsb2NhdGlvbiBvcGNvZGUuICBUaGUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIGVuZ2luZSBvbmx5IGltcGxlbWVudHMgYSBzdWJzZXQgb2YgdGhlIENGTQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gb3Bjb2RlcywgdGhlIHN1YnNldCBtb3N0IGNvbW1vbmx5IHVzZWQgYnkKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUFcgYW5kIENvZGVXYXJyaW9yIFBFRiBjb250YWluZXJzLiAgSWYgeW91IGVuY291bnRlcgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZXJyb3IsIHlvdSdsbCBwcm9iYWJseSBoYXZlIHRvIGFkZCB0aGUgd2VpcmQKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uIG9wY29kZSB0byB0aGUgZW5naW5lLCB3aGljaCBzaG91bGRuJ3QgYmUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB0b28gaGFyZC4KKyAgICAvLyBtZW1GdWxsRXJyICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBJdCdzIGxpa2VseSB0aGF0IHRoaXMgZXJyb3IgaXMgdHJpZ2dlcmVkIGJ5IHRoZSBtZW1vcnkKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gdW5wYWNrIHlvdXIgZGF0YSBzZWN0aW9uLiAgRWl0aGVyIG1ha2UgeW91cgorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgc2VjdGlvbiBzbWFsbGVyLCBvciB1bnBhY2sgaXQgKHNlZSBhYm92ZSkuCisgICAgLy8gZXJyb3JzIHJldHVybmVkIGJ5IEZpbmRTeW1ib2wKKyAgICAvLyBlcnJvcnMgcmV0dXJuZWQgYnkgTWVtb3J5IE1hbmFnZXIKKyAgICAvLworICAgIC8vIFRoZSByb3V0aW5lIG5lZWRzIGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgbG9hZGVyIHNlY3Rpb24gb2YgdGhlIGZyYWdtZW50CisgICAgLy8gdG8gZml4IGluIG1lbW9yeS4gIEl0IGFsbG9jYXRlcyB0aGF0IG1lbW9yeSB1c2luZyBOZXdQdHIgYW5kIGRpc3Bzb3NlcyBvZgorICAgIC8vIGl0IGJlZm9yZSBpdCByZXR1cm5zLiAgWW91IG1heSB3YW50IHRvIGNoYW5nZSB0aGUgbWVtb3J5IGFsbG9jYXRvciwgd2hpY2gKKyAgICAvLyBpcyB2ZXJ5IHNpbXBsZS4KIAogZXh0ZXJuIHBhc2NhbCBPU1N0YXR1cyBDRk1MYXRlSW1wb3J0TGlicmFyeShjb25zdCBDRnJhZ1N5c3RlbTdEaXNrRmxhdExvY2F0b3IgKmZyYWdUb0ZpeExvY2F0b3IsCi0JCQkJCQkJCQkJQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAotCQkJCQkJCQkJCUNGcmFnSW5pdEZ1bmN0aW9uIGZyYWdUb0ZpeEluaXRSb3V0aW5lLAotCQkJCQkJCQkJCUNvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0KTsKLQkvLyBBIHdyYXBwZXIgYXJvdW5kIENGTUxhdGVJbXBvcnRDb3JlIHRoYXQgbG9va3MgdXAgc3ltYm9scyBieSBjYWxsaW5nIAotCS8vIEZpbmRTeW1ib2wgb24gYSBjb25uZWN0aW9uIHRvIGEgQ0ZNIGxpYnJhcnkgKGNvbm5JRFRvSW1wb3J0KS4KLQkvLyBZb3UgY2FuIGdldCB0aGlzIGNvbm5lY3Rpb24gSUQgdGhyb3VnaCBhbnkgc3RhbmRhcmQgQ0ZNIEFQSSwgZm9yIGV4YW1wbGUKLQkvLyBHZXRTaGFyZWRMaWJyYXJ5LCBHZXREaXNrRnJhZ21lbnQsIG9yIEdldE1lbUZyYWdtZW50LgotCS8vCi0JLy8gSU1QT1JUQU5UOgotCS8vIFRoZSBmcmFnbWVudCBuYW1lIGZvciBjb25uSURUb0ltcG9ydCAqZG9lcyBub3QqIGhhdmUgdG8gbWF0Y2gKLQkvLyB3ZWFrTGlua2VkTGlicmFyeU5hbWUuICBUaGlzIGlzIHBhcnQgb2YgdGhlIHBvd2VyIG9mIHRoaXMgbGlicmFyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdDb25uZWN0aW9uSUQgZnJhZ1RvRml4Q29ubklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RTdHIyNTVQYXJhbSB3ZWFrTGlua2VkTGlicmFyeU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGNvbm5JRFRvSW1wb3J0KTsKKyAgICAvLyBBIHdyYXBwZXIgYXJvdW5kIENGTUxhdGVJbXBvcnRDb3JlIHRoYXQgbG9va3MgdXAgc3ltYm9scyBieSBjYWxsaW5nCisgICAgLy8gRmluZFN5bWJvbCBvbiBhIGNvbm5lY3Rpb24gdG8gYSBDRk0gbGlicmFyeSAoY29ubklEVG9JbXBvcnQpLgorICAgIC8vIFlvdSBjYW4gZ2V0IHRoaXMgY29ubmVjdGlvbiBJRCB0aHJvdWdoIGFueSBzdGFuZGFyZCBDRk0gQVBJLCBmb3IgZXhhbXBsZQorICAgIC8vIEdldFNoYXJlZExpYnJhcnksIEdldERpc2tGcmFnbWVudCwgb3IgR2V0TWVtRnJhZ21lbnQuCisgICAgLy8KKyAgICAvLyBJTVBPUlRBTlQ6CisgICAgLy8gVGhlIGZyYWdtZW50IG5hbWUgZm9yIGNvbm5JRFRvSW1wb3J0ICpkb2VzIG5vdCogaGF2ZSB0byBtYXRjaAorICAgIC8vIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZS4gIFRoaXMgaXMgcGFydCBvZiB0aGUgcG93ZXIgb2YgdGhpcyBsaWJyYXJ5LgogCiBleHRlcm4gcGFzY2FsIE9TU3RhdHVzIENGTUxhdGVJbXBvcnRCdW5kbGUoY29uc3QgQ0ZyYWdTeXN0ZW03RGlza0ZsYXRMb2NhdG9yICpmcmFnVG9GaXhMb2NhdG9yLAotCQkJCQkJCQkJCUNGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKLQkJCQkJCQkJCQlDRnJhZ0luaXRGdW5jdGlvbiBmcmFnVG9GaXhJbml0Um91dGluZSwKLQkJCQkJCQkJCQlDb25zdFN0cjI1NVBhcmFtIHdlYWtMaW5rZWRMaWJyYXJ5TmFtZSwKLQkJCQkJCQkJCQlDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCk7Ci0JLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZyAKLQkvLyBDRkJ1bmRsZUdldEZ1bmN0aW9uUG9pbnRlckZvck5hbWUgb24gYSByZWZlcmVuY2UgdG8gYSBDb3JlIEZvdW5kYXRpb24gCi0JLy8gYnVuZGxlIChidW5kbGVUb0ltcG9ydCkuICBZb3UgY2FuIGdldCB0aGlzIHJlZmVyZW5jZSB0aHJvdWdoIGFueSAKLQkvLyBDb3JlIEZvdW5kYXRpb24gYnVuZGxlIEFQSSwgZm9yIGV4YW1wbGUgQ0ZCdW5kbGVDcmVhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGcmFnQ29ubmVjdGlvbklEIGZyYWdUb0ZpeENvbm5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZyYWdJbml0RnVuY3Rpb24gZnJhZ1RvRml4SW5pdFJvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gd2Vha0xpbmtlZExpYnJhcnlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkJ1bmRsZVJlZiBidW5kbGVUb0ltcG9ydCk7CisgICAgLy8gQSB3cmFwcGVyIGFyb3VuZCBDRk1MYXRlSW1wb3J0Q29yZSB0aGF0IGxvb2tzIHVwIHN5bWJvbHMgYnkgY2FsbGluZworICAgIC8vIENGQnVuZGxlR2V0RnVuY3Rpb25Qb2ludGVyRm9yTmFtZSBvbiBhIHJlZmVyZW5jZSB0byBhIENvcmUgRm91bmRhdGlvbgorICAgIC8vIGJ1bmRsZSAoYnVuZGxlVG9JbXBvcnQpLiAgWW91IGNhbiBnZXQgdGhpcyByZWZlcmVuY2UgdGhyb3VnaCBhbnkKKyAgICAvLyBDb3JlIEZvdW5kYXRpb24gYnVuZGxlIEFQSSwgZm9yIGV4YW1wbGUgQ0ZCdW5kbGVDcmVhdGUuCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2cvX0NHbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9jZy9fQ0dtb2R1bGUuYwppbmRleCBlMzZmY2U5Li43MTY5MTAxIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jZy9fQ0dtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9jZy9fQ0dtb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTI2LDY3ICsyNiw2NyBAQAogUHlPYmplY3QgKkNHUG9pbnRfTmV3KENHUG9pbnQgKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPngsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT54LAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnkpOwogfQogCiBpbnQKIENHUG9pbnRfQ29udmVydChQeU9iamVjdCAqdiwgQ0dQb2ludCAqcF9pdHNlbGYpCiB7Ci0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgIihmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT55KSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgIihmZikiLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPngsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+eSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlPYmplY3QgKkNHUmVjdF9OZXcoQ0dSZWN0ICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZmZmKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPm9yaWdpbi54LAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+c2l6ZS53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+c2l6ZS5oZWlnaHQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZikiLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPm9yaWdpbi54LAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPm9yaWdpbi55LAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+c2l6ZS5oZWlnaHQpOwogfQogCiBpbnQKIENHUmVjdF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR1JlY3QgKnBfaXRzZWxmKQogewotICAgICAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZikiLAotICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5vcmlnaW4ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+b3JpZ2luLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnNpemUud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnNpemUuaGVpZ2h0KSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+b3JpZ2luLngsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+b3JpZ2luLnksCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+c2l6ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5zaXplLmhlaWdodCkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogUHlPYmplY3QgKkNHQWZmaW5lVHJhbnNmb3JtX05ldyhDR0FmZmluZVRyYW5zZm9ybSAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZmZmKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnR4LAotICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZmZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5hLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmIsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+YywKKyAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5kLAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnR4LAorICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnR5KTsKIH0KIAogaW50CiBDR0FmZmluZVRyYW5zZm9ybV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR0FmZmluZVRyYW5zZm9ybSAqcF9pdHNlbGYpCiB7Ci0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmZmYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YywKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+dHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnR5KSApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAxOworICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmZmYpIiwKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5hLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmIsCisgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+YywKKyAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5kLAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnR4LAorICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnR5KSApCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHX0Vycm9yOwpAQCAtOTgsMTA5MCArOTgsMTA5MCBAQAogI2RlZmluZSBDR0NvbnRleHRSZWZPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ0dDb250ZXh0UmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNHQ29udGV4dFJlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgQ0dDb250ZXh0UmVmT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ0dDb250ZXh0UmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQ0dDb250ZXh0UmVmIG9iX2l0c2VsZjsKIH0gQ0dDb250ZXh0UmVmT2JqZWN0OwogCiBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX05ldyhDR0NvbnRleHRSZWYgaXRzZWxmKQogewotCUNHQ29udGV4dFJlZk9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ0dDb250ZXh0UmVmT2JqZWN0LCAmQ0dDb250ZXh0UmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDR0NvbnRleHRSZWZPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKENHQ29udGV4dFJlZk9iamVjdCwgJkNHQ29udGV4dFJlZl9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDR0NvbnRleHRSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0dDb250ZXh0UmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUNHQ29udGV4dFJlZk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDR0NvbnRleHRSZWYgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ0dDb250ZXh0UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNHQ29udGV4dFJlZk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDR0NvbnRleHRSZWYgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ0dDb250ZXh0UmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ0dDb250ZXh0UmVmT2JqX2RlYWxsb2MoQ0dDb250ZXh0UmVmT2JqZWN0ICpzZWxmKQogewotCUNHQ29udGV4dFJlbGVhc2Uoc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIENHQ29udGV4dFJlbGVhc2Uoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTYXZlR1N0YXRlKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNhdmVHU3RhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFJlc3RvcmVHU3RhdGUoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2NhbGVDVE0oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBzeDsKLQlmbG9hdCBzeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2NhbGVDVE0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBzeCwKLQkgICAgICAgICAgICAgICAgICBzeSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBzeDsKKyAgICBmbG9hdCBzeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2NhbGVDVE0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzeCwKKyAgICAgICAgICAgICAgICAgICAgICBzeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRUcmFuc2xhdGVDVE0oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB0eDsKLQlmbG9hdCB0eTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHR4LAotCSAgICAgICAgICAgICAgICAgICAgICB0eSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCB0eDsKKyAgICBmbG9hdCB0eTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSb3RhdGVDVE0oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBhbmdsZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0Um90YXRlQ1RNKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGFuZ2xlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5nbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRSb3RhdGVDVE0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q29uY2F0Q1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydCwgJnRyYW5zZm9ybSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENvbmNhdENUTShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydCwgJnRyYW5zZm9ybSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dENvbmNhdENUTShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0Q1RNKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dBZmZpbmVUcmFuc2Zvcm0gX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRHZXRDVE0oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9OZXcsICZfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR0FmZmluZVRyYW5zZm9ybSBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENHQ29udGV4dEdldENUTShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX05ldywgJl9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldExpbmVXaWR0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHdpZHRoOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRMaW5lV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgd2lkdGg7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldExpbmVXaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lQ2FwKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IGNhcDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNhcCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldExpbmVDYXAoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGNhcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgY2FwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0TGluZUNhcChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldExpbmVKb2luKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaW50IGpvaW47Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZqb2luKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0TGluZUpvaW4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBqb2luKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBqb2luOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmam9pbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldExpbmVKb2luKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgam9pbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRNaXRlckxpbWl0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgbGltaXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldE1pdGVyTGltaXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGxpbWl0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRNaXRlckxpbWl0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRGbGF0bmVzcyhDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGZsYXRuZXNzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhdG5lc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRGbGF0bmVzcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYXRuZXNzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGZsYXRuZXNzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhdG5lc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRGbGF0bmVzcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXRuZXNzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEFscGhhKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgYWxwaGE7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldEFscGhhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgYWxwaGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgYWxwaGE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldEFscGhhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QmVnaW5QYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEJlZ2luUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRCZWdpblBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRNb3ZlVG9Qb2ludChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHg7Ci0JZmxvYXQgeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dE1vdmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICB5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dE1vdmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZExpbmVUb1BvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgeDsKLQlmbG9hdCB5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJngsCi0JICAgICAgICAgICAgICAgICAgICAgICZ5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgIHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgeDsKKyAgICBmbG9hdCB5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgY3AxeDsKLQlmbG9hdCBjcDF5OwotCWZsb2F0IGNwMng7Ci0JZmxvYXQgY3AyeTsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNwMXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcDF5LAotCSAgICAgICAgICAgICAgICAgICAgICAmY3AyeCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNwMnksCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZEN1cnZlVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjcDF4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjcDF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjcDJ4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjcDJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGNwMXg7CisgICAgZmxvYXQgY3AxeTsKKyAgICBmbG9hdCBjcDJ4OworICAgIGZsb2F0IGNwMnk7CisgICAgZmxvYXQgeDsKKyAgICBmbG9hdCB5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcDF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3AxeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwMngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcDJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AxeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgY3B4OwotCWZsb2F0IGNweTsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcHgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcHksCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZFF1YWRDdXJ2ZVRvUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNweCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNweSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGNweDsKKyAgICBmbG9hdCBjcHk7CisgICAgZmxvYXQgeDsKKyAgICBmbG9hdCB5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3B4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbG9zZVBhdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0Q2xvc2VQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dENsb3NlUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZFJlY3QoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1JlY3QgcmVjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRBZGRSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICByZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZEFyYyhDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHg7Ci0JZmxvYXQgeTsKLQlmbG9hdCByYWRpdXM7Ci0JZmxvYXQgc3RhcnRBbmdsZTsKLQlmbG9hdCBlbmRBbmdsZTsKLQlpbnQgY2xvY2t3aXNlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhZGl1cywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmRBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsb2Nrd2lzZSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEFkZEFyYyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICB5LAotCSAgICAgICAgICAgICAgICByYWRpdXMsCi0JICAgICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgIGVuZEFuZ2xlLAotCSAgICAgICAgICAgICAgICBjbG9ja3dpc2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgeDsKKyAgICBmbG9hdCB5OworICAgIGZsb2F0IHJhZGl1czsKKyAgICBmbG9hdCBzdGFydEFuZ2xlOworICAgIGZsb2F0IGVuZEFuZ2xlOworICAgIGludCBjbG9ja3dpc2U7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZmZmZpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2t3aXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkQXJjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgIHJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgZW5kQW5nbGUsCisgICAgICAgICAgICAgICAgICAgIGNsb2Nrd2lzZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRBcmNUb1BvaW50KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgeDE7Ci0JZmxvYXQgeTE7Ci0JZmxvYXQgeDI7Ci0JZmxvYXQgeTI7Ci0JZmxvYXQgcmFkaXVzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJngxLAotCSAgICAgICAgICAgICAgICAgICAgICAmeTEsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4MiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnkyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmFkaXVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0QWRkQXJjVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgeDEsCi0JICAgICAgICAgICAgICAgICAgICAgICB5MSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHgyLAotCSAgICAgICAgICAgICAgICAgICAgICAgeTIsCi0JICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgeDE7CisgICAgZmxvYXQgeTE7CisgICAgZmxvYXQgeDI7CisgICAgZmxvYXQgeTI7CisgICAgZmxvYXQgcmFkaXVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJngxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFkaXVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0QWRkQXJjVG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0SXNQYXRoRW1wdHkoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRJc1BhdGhFbXB0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0SXNQYXRoRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFBhdGhDdXJyZW50UG9pbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR1BvaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0R2V0UGF0aEN1cnJlbnRQb2ludChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENHUG9pbnRfTmV3LCAmX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dQb2ludCBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENHQ29udGV4dEdldFBhdGhDdXJyZW50UG9pbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR1BvaW50X05ldywgJl9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUmVjdCBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9OZXcsICZfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1JlY3QgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3goX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfTmV3LCAmX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RHJhd1BhdGgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgbW9kZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHREcmF3UGF0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG1vZGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IG1vZGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0RHJhd1BhdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dEZpbGxQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEZpbGxQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RU9GaWxsUGF0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRFT0ZpbGxQYXRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dEVPRmlsbFBhdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTdHJva2VQYXRoKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFN0cm9rZVBhdGgoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U3Ryb2tlUGF0aChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxSZWN0KENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dSZWN0IHJlY3Q7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRGaWxsUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRGaWxsUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUmVjdCByZWN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U3Ryb2tlUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgcmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFN0cm9rZVJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUmVjdCByZWN0OwotCWZsb2F0IHdpZHRoOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mZiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUmVjdCByZWN0OworICAgIGZsb2F0IHdpZHRoOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U3Ryb2tlUmVjdFdpdGhXaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsZWFyUmVjdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUmVjdCByZWN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0Q2xlYXJSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dSZWN0IHJlY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDR1JlY3RfQ29udmVydCwgJnJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRDbGVhclJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGlwKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dENsaXAoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0Q2xpcChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVPQ2xpcChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRFT0NsaXAoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0RU9DbGlwKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcFRvUmVjdChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUmVjdCByZWN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0dSZWN0X0NvbnZlcnQsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0Q2xpcFRvUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgcmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR1JlY3QgcmVjdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENHUmVjdF9Db252ZXJ0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dENsaXBUb1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvcihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGdyYXk7Ci0JZmxvYXQgYWxwaGE7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3JheSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JheSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGdyYXk7CisgICAgZmxvYXQgYWxwaGE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0R3JheUZpbGxDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvcihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IGdyYXk7Ci0JZmxvYXQgYWxwaGE7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3JheSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0R3JheVN0cm9rZUNvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IGdyYXk7CisgICAgZmxvYXQgYWxwaGE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFscGhhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0R3JheVN0cm9rZUNvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFJHQkZpbGxDb2xvcihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHJlZDsKLQlmbG9hdCBncmVlbjsKLQlmbG9hdCBibHVlOwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3JlZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZibHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRSR0JGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcmVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgcmVkOworICAgIGZsb2F0IGdyZWVuOworICAgIGZsb2F0IGJsdWU7CisgICAgZmxvYXQgYWxwaGE7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHJlZDsKLQlmbG9hdCBncmVlbjsKLQlmbG9hdCBibHVlOwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3JlZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZibHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHJlZDsKKyAgICBmbG9hdCBncmVlbjsKKyAgICBmbG9hdCBibHVlOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxwaGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENNWUtGaWxsQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBjeWFuOwotCWZsb2F0IG1hZ2VudGE7Ci0JZmxvYXQgeWVsbG93OwotCWZsb2F0IGJsYWNrOwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmN5YW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZtYWdlbnRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmeWVsbG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmYmxhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldENNWUtGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGN5YW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdlbnRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgeWVsbG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBjeWFuOworICAgIGZsb2F0IG1hZ2VudGE7CisgICAgZmxvYXQgeWVsbG93OworICAgIGZsb2F0IGJsYWNrOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN5YW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWdlbnRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeWVsbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldENNWUtGaWxsQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5YW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdlbnRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVsbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDTVlLU3Ryb2tlQ29sb3IoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBjeWFuOwotCWZsb2F0IG1hZ2VudGE7Ci0JZmxvYXQgeWVsbG93OwotCWZsb2F0IGJsYWNrOwotCWZsb2F0IGFscGhhOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmN5YW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZtYWdlbnRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmeWVsbG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmYmxhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldENNWUtTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWFuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdlbnRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWxsb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBmbG9hdCBjeWFuOworICAgIGZsb2F0IG1hZ2VudGE7CisgICAgZmxvYXQgeWVsbG93OworICAgIGZsb2F0IGJsYWNrOworICAgIGZsb2F0IGFscGhhOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImZmZmZmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN5YW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWdlbnRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeWVsbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHBoYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldENNWUtTdHJva2VDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdlbnRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWxsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENHQ29udGV4dEdldEludGVycG9sYXRpb25RdWFsaXR5KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpbnQgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpbnQgcXVhbGl0eTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgaW50IHF1YWxpdHk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCBzcGFjaW5nOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3BhY2luZykpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldENoYXJhY3RlclNwYWNpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNpbmcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgc3BhY2luZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYWNpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRDaGFyYWN0ZXJTcGFjaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjaW5nKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRQb3NpdGlvbihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWZsb2F0IHg7Ci0JZmxvYXQgeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ4LAotCSAgICAgICAgICAgICAgICAgICAgICAmeSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldFRleHRQb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldFRleHRQb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFRleHRQb3NpdGlvbihDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHUG9pbnQgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDR0NvbnRleHRHZXRUZXh0UG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDR1BvaW50X05ldywgJl9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHUG9pbnQgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDR0NvbnRleHRHZXRUZXh0UG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDR1BvaW50X05ldywgJl9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRNYXRyaXgoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR0FmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDR0FmZmluZVRyYW5zZm9ybV9Db252ZXJ0LCAmdHJhbnNmb3JtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX0NvbnZlcnQsICZ0cmFuc2Zvcm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHQWZmaW5lVHJhbnNmb3JtIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX05ldywgJl9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHQWZmaW5lVHJhbnNmb3JtIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtX05ldywgJl9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBtb2RlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCi0JCXJldHVybiBOVUxMOwotCUNHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBtb2RlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZvbnRTaXplKENHQ29udGV4dFJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JZmxvYXQgc2l6ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRGb250U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgc2l6ZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRGb250U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2VsZWN0Rm9udChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKiBuYW1lOwotCWZsb2F0IHNpemU7Ci0JaW50IHRleHRFbmNvZGluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzZmkiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZWxlY3RGb250KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICogbmFtZTsKKyAgICBmbG9hdCBzaXplOworICAgIGludCB0ZXh0RW5jb2Rpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2ZpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0U2VsZWN0Rm9udChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2RpbmcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2hvd1RleHQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICpjc3RyaW5nX19pbl9fOwotCWxvbmcgY3N0cmluZ19fbGVuX187Ci0JaW50IGNzdHJpbmdfX2luX2xlbl9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNzdHJpbmdfX2luX18sICZjc3RyaW5nX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWNzdHJpbmdfX2xlbl9fID0gY3N0cmluZ19faW5fbGVuX187Ci0JQ0dDb250ZXh0U2hvd1RleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBjc3RyaW5nX19pbl9fLCBjc3RyaW5nX19sZW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICpjc3RyaW5nX19pbl9fOworICAgIGxvbmcgY3N0cmluZ19fbGVuX187CisgICAgaW50IGNzdHJpbmdfX2luX2xlbl9fOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNzdHJpbmdfX2luX18sICZjc3RyaW5nX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNzdHJpbmdfX2xlbl9fID0gY3N0cmluZ19faW5fbGVuX187CisgICAgQ0dDb250ZXh0U2hvd1RleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBjc3RyaW5nX19pbl9fLCBjc3RyaW5nX19sZW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dEF0UG9pbnQoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlmbG9hdCB4OwotCWZsb2F0IHk7Ci0JY2hhciAqY3N0cmluZ19faW5fXzsKLQlsb25nIGNzdHJpbmdfX2xlbl9fOwotCWludCBjc3RyaW5nX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJmZnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJngsCi0JICAgICAgICAgICAgICAgICAgICAgICZ5LAotCSAgICAgICAgICAgICAgICAgICAgICAmY3N0cmluZ19faW5fXywgJmNzdHJpbmdfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JY3N0cmluZ19fbGVuX18gPSBjc3RyaW5nX19pbl9sZW5fXzsKLQlDR0NvbnRleHRTaG93VGV4dEF0UG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cmluZ19faW5fXywgY3N0cmluZ19fbGVuX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgZmxvYXQgeDsKKyAgICBmbG9hdCB5OworICAgIGNoYXIgKmNzdHJpbmdfX2luX187CisgICAgbG9uZyBjc3RyaW5nX19sZW5fXzsKKyAgICBpbnQgY3N0cmluZ19faW5fbGVuX187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiZmZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNzdHJpbmdfX2luX18sICZjc3RyaW5nX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNzdHJpbmdfX2xlbl9fID0gY3N0cmluZ19faW5fbGVuX187CisgICAgQ0dDb250ZXh0U2hvd1RleHRBdFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJpbmdfX2luX18sIGNzdHJpbmdfX2xlbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVuZFBhZ2UoQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0RW5kUGFnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRFbmRQYWdlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Rmx1c2goQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ0dDb250ZXh0Rmx1c2goX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ0dDb250ZXh0Rmx1c2goX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTeW5jaHJvbml6ZShDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTeW5jaHJvbml6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTeW5jaHJvbml6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFNob3VsZEFudGlhbGlhcyhDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWludCBzaG91bGRBbnRpYWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaG91bGRBbnRpYWxpYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlDR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQW50aWFsaWFzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGludCBzaG91bGRBbnRpYWxpYXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaG91bGRBbnRpYWxpYXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkQW50aWFsaWFzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX1N5bmNDR0NvbnRleHRPcmlnaW5XaXRoUG9ydChDR0NvbnRleHRSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIHBvcnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgcG9ydDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNHQ29udGV4dFJlZk9ial9DbGlwQ0dDb250ZXh0VG9SZWdpb24oQ0dDb250ZXh0UmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHBvcnRSZWN0OwotCVJnbkhhbmRsZSByZWdpb247Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZwb3J0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlDbGlwQ0dDb250ZXh0VG9SZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvcnRSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBwb3J0UmVjdDsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcG9ydFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xpcENHQ29udGV4dFRvUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYKIAogc3RhdGljIFB5TWV0aG9kRGVmIENHQ29udGV4dFJlZk9ial9tZXRob2RzW10gPSB7Ci0JeyJDR0NvbnRleHRTYXZlR1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTYXZlR1N0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRSZXN0b3JlR1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSZXN0b3JlR1N0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTY2FsZUNUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2NhbGVDVE0sIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHN4LCBmbG9hdCBzeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFRyYW5zbGF0ZUNUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0VHJhbnNsYXRlQ1RNLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCB0eCwgZmxvYXQgdHkpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRSb3RhdGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFJvdGF0ZUNUTSwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgYW5nbGUpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRDb25jYXRDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENvbmNhdENUTSwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0R2V0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRDVE0sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHQWZmaW5lVHJhbnNmb3JtIF9ydikiKX0sCi0JeyJDR0NvbnRleHRTZXRMaW5lV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldExpbmVXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgd2lkdGgpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRMaW5lQ2FwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lQ2FwLCAxLAotCSBQeURvY19TVFIoIihpbnQgY2FwKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0TGluZUpvaW4iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldExpbmVKb2luLCAxLAotCSBQeURvY19TVFIoIihpbnQgam9pbikgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldE1pdGVyTGltaXQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldE1pdGVyTGltaXQsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IGxpbWl0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0RmxhdG5lc3MiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZsYXRuZXNzLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBmbGF0bmVzcykgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldEFscGhhIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRBbHBoYSwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRCZWdpblBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEJlZ2luUGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0TW92ZVRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dE1vdmVUb1BvaW50LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZExpbmVUb1BvaW50LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IGNwMXgsIGZsb2F0IGNwMXksIGZsb2F0IGNwMngsIGZsb2F0IGNwMnksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50LCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBjcHgsIGZsb2F0IGNweSwgZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dENsb3NlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xvc2VQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRBZGRSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRSZWN0LCAxLAotCSBQeURvY19TVFIoIihDR1JlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEFkZEFyYyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByYWRpdXMsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IGVuZEFuZ2xlLCBpbnQgY2xvY2t3aXNlKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0QWRkQXJjVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHJhZGl1cykgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dElzUGF0aEVtcHR5IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRJc1BhdGhFbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoaW50IF9ydikiKX0sCi0JeyJDR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR1BvaW50IF9ydikiKX0sCi0JeyJDR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dSZWN0IF9ydikiKX0sCi0JeyJDR0NvbnRleHREcmF3UGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RHJhd1BhdGgsIDEsCi0JIFB5RG9jX1NUUigiKGludCBtb2RlKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0RmlsbFBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRFT0ZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0ZpbGxQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTdHJva2VQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTdHJva2VQYXRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRGaWxsUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RmlsbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U3Ryb2tlUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTdHJva2VSZWN0V2l0aFdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTdHJva2VSZWN0V2l0aFdpZHRoLCAxLAotCSBQeURvY19TVFIoIihDR1JlY3QgcmVjdCwgZmxvYXQgd2lkdGgpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRDbGVhclJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsZWFyUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRDbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGlwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRFT0NsaXAiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVPQ2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0Q2xpcFRvUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcFRvUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRHcmF5RmlsbENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRHcmF5RmlsbENvbG9yLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBncmF5LCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheVN0cm9rZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBncmF5LCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldFJHQkZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBjeWFuLCBmbG9hdCBtYWdlbnRhLCBmbG9hdCB5ZWxsb3csIGZsb2F0IGJsYWNrLCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldENNWUtTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS1N0cm9rZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCBjeWFuLCBmbG9hdCBtYWdlbnRhLCBmbG9hdCB5ZWxsb3csIGZsb2F0IGJsYWNrLCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEdldEludGVycG9sYXRpb25RdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoaW50IF9ydikiKX0sCi0JeyJDR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKGludCBxdWFsaXR5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0Q2hhcmFjdGVyU3BhY2luZyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q2hhcmFjdGVyU3BhY2luZywgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgc3BhY2luZykgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNldFRleHRQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0UG9zaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHUG9pbnQgX3J2KSIpfSwKLQl7IkNHQ29udGV4dFNldFRleHRNYXRyaXgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRNYXRyaXgsIDEsCi0JIFB5RG9jX1NUUigiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dEdldFRleHRNYXRyaXgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFRleHRNYXRyaXgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHQWZmaW5lVHJhbnNmb3JtIF9ydikiKX0sCi0JeyJDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IG1vZGUpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZXRGb250U2l6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Rm9udFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKGZsb2F0IHNpemUpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTZWxlY3RGb250IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZWxlY3RGb250LCAxLAotCSBQeURvY19TVFIoIihjaGFyICogbmFtZSwgZmxvYXQgc2l6ZSwgaW50IHRleHRFbmNvZGluZykgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFNob3dUZXh0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGNzdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRTaG93VGV4dEF0UG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNob3dUZXh0QXRQb2ludCwgMSwKLQkgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSwgQnVmZmVyIGNzdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRFbmRQYWdlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFbmRQYWdlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDR0NvbnRleHRGbHVzaCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Rmx1c2gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNHQ29udGV4dFN5bmNocm9uaXplIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTeW5jaHJvbml6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKGludCBzaG91bGRBbnRpYWxpYXMpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTYXZlR1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTYXZlR1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRSZXN0b3JlR1N0YXRlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRSZXN0b3JlR1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTY2FsZUNUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2NhbGVDVE0sIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHN4LCBmbG9hdCBzeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFRyYW5zbGF0ZUNUTSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0VHJhbnNsYXRlQ1RNLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCB0eCwgZmxvYXQgdHkpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRSb3RhdGVDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFJvdGF0ZUNUTSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgYW5nbGUpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRDb25jYXRDVE0iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENvbmNhdENUTSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0R2V0Q1RNIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRDVE0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHQWZmaW5lVHJhbnNmb3JtIF9ydikiKX0sCisgICAgeyJDR0NvbnRleHRTZXRMaW5lV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldExpbmVXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRMaW5lQ2FwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRMaW5lQ2FwLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgY2FwKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0TGluZUpvaW4iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldExpbmVKb2luLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgam9pbikgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldE1pdGVyTGltaXQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldE1pdGVyTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IGxpbWl0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0RmxhdG5lc3MiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldEZsYXRuZXNzLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBmbGF0bmVzcykgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldEFscGhhIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRBbHBoYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRCZWdpblBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEJlZ2luUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0TW92ZVRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dE1vdmVUb1BvaW50LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkTGluZVRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEFkZExpbmVUb1BvaW50LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkQ3VydmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRDdXJ2ZVRvUG9pbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IGNwMXgsIGZsb2F0IGNwMXksIGZsb2F0IGNwMngsIGZsb2F0IGNwMnksIGZsb2F0IHgsIGZsb2F0IHkpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRRdWFkQ3VydmVUb1BvaW50LCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBjcHgsIGZsb2F0IGNweSwgZmxvYXQgeCwgZmxvYXQgeSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dENsb3NlUGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xvc2VQYXRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRBZGRSZWN0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRBZGRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihDR1JlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEFkZEFyYyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCByYWRpdXMsIGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IGVuZEFuZ2xlLCBpbnQgY2xvY2t3aXNlKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0QWRkQXJjVG9Qb2ludCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0QWRkQXJjVG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIsIGZsb2F0IHJhZGl1cykgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dElzUGF0aEVtcHR5IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRJc1BhdGhFbXB0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoaW50IF9ydikiKX0sCisgICAgeyJDR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRQYXRoQ3VycmVudFBvaW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR1BvaW50IF9ydikiKX0sCisgICAgeyJDR0NvbnRleHRHZXRQYXRoQm91bmRpbmdCb3giLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dSZWN0IF9ydikiKX0sCisgICAgeyJDR0NvbnRleHREcmF3UGF0aCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RHJhd1BhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0RmlsbFBhdGgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEZpbGxQYXRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRFT0ZpbGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFT0ZpbGxQYXRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTdHJva2VQYXRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTdHJva2VQYXRoLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRGaWxsUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0RmlsbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENHUmVjdCByZWN0KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U3Ryb2tlUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U3Ryb2tlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTdHJva2VSZWN0V2l0aFdpZHRoIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTdHJva2VSZWN0V2l0aFdpZHRoLCAxLAorICAgICBQeURvY19TVFIoIihDR1JlY3QgcmVjdCwgZmxvYXQgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRDbGVhclJlY3QiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dENsZWFyUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRDbGlwIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRFT0NsaXAiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEVPQ2xpcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0Q2xpcFRvUmVjdCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Q2xpcFRvUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRHcmF5RmlsbENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRHcmF5RmlsbENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBncmF5LCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldEdyYXlTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0R3JheVN0cm9rZUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBncmF5LCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldFJHQkZpbGxDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0UkdCRmlsbENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCByZWQsIGZsb2F0IGdyZWVuLCBmbG9hdCBibHVlLCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldFJHQlN0cm9rZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRSR0JTdHJva2VDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRDTVlLRmlsbENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBjeWFuLCBmbG9hdCBtYWdlbnRhLCBmbG9hdCB5ZWxsb3csIGZsb2F0IGJsYWNrLCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldENNWUtTdHJva2VDb2xvciIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q01ZS1N0cm9rZUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCBjeWFuLCBmbG9hdCBtYWdlbnRhLCBmbG9hdCB5ZWxsb3csIGZsb2F0IGJsYWNrLCBmbG9hdCBhbHBoYSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEdldEludGVycG9sYXRpb25RdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoaW50IF9ydikiKX0sCisgICAgeyJDR0NvbnRleHRTZXRJbnRlcnBvbGF0aW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0SW50ZXJwb2xhdGlvblF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBxdWFsaXR5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0Q2hhcmFjdGVyU3BhY2luZyIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Q2hhcmFjdGVyU3BhY2luZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgc3BhY2luZykgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNldFRleHRQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihmbG9hdCB4LCBmbG9hdCB5KSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0R2V0VGV4dFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRHZXRUZXh0UG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHUG9pbnQgX3J2KSIpfSwKKyAgICB7IkNHQ29udGV4dFNldFRleHRNYXRyaXgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHRNYXRyaXgsIDEsCisgICAgIFB5RG9jX1NUUigiKENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dEdldFRleHRNYXRyaXgiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dEdldFRleHRNYXRyaXgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENHQWZmaW5lVHJhbnNmb3JtIF9ydikiKX0sCisgICAgeyJDR0NvbnRleHRTZXRUZXh0RHJhd2luZ01vZGUiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNldFRleHREcmF3aW5nTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50IG1vZGUpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZXRGb250U2l6ZSIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0U2V0Rm9udFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKGZsb2F0IHNpemUpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTZWxlY3RGb250IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZWxlY3RGb250LCAxLAorICAgICBQeURvY19TVFIoIihjaGFyICogbmFtZSwgZmxvYXQgc2l6ZSwgaW50IHRleHRFbmNvZGluZykgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFNob3dUZXh0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTaG93VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGNzdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRTaG93VGV4dEF0UG9pbnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NHQ29udGV4dFNob3dUZXh0QXRQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoZmxvYXQgeCwgZmxvYXQgeSwgQnVmZmVyIGNzdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRFbmRQYWdlIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRFbmRQYWdlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDR0NvbnRleHRGbHVzaCIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ0dDb250ZXh0Rmx1c2gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNHQ29udGV4dFN5bmNocm9uaXplIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTeW5jaHJvbml6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9DR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBzaG91bGRBbnRpYWxpYXMpIC0+IE5vbmUiKX0sCiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJTeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQiLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX1N5bmNDR0NvbnRleHRPcmlnaW5XaXRoUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgcG9ydCkgLT4gTm9uZSIpfSwKLQl7IkNsaXBDR0NvbnRleHRUb1JlZ2lvbiIsIChQeUNGdW5jdGlvbilDR0NvbnRleHRSZWZPYmpfQ2xpcENHQ29udGV4dFRvUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHBvcnRSZWN0LCBSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiU3luY0NHQ29udGV4dE9yaWdpbldpdGhQb3J0IiwgKFB5Q0Z1bmN0aW9uKUNHQ29udGV4dFJlZk9ial9TeW5jQ0dDb250ZXh0T3JpZ2luV2l0aFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQpIC0+IE5vbmUiKX0sCisgICAgeyJDbGlwQ0dDb250ZXh0VG9SZWdpb24iLCAoUHlDRnVuY3Rpb24pQ0dDb250ZXh0UmVmT2JqX0NsaXBDR0NvbnRleHRUb1JlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBwb3J0UmVjdCwgUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKICNlbmRpZgotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDR0NvbnRleHRSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMTk4LDYxICsxMTk4LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ0dDb250ZXh0UmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlDR0NvbnRleHRSZWYgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBDR0NvbnRleHRSZWYgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ0dDb250ZXh0UmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ0dDb250ZXh0UmVmT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENHQ29udGV4dFJlZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENHQ29udGV4dFJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBDR0NvbnRleHRSZWZPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ0dDb250ZXh0UmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NHLkNHQ29udGV4dFJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENHQ29udGV4dFJlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENHQ29udGV4dFJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDR0NvbnRleHRSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENHQ29udGV4dFJlZk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ0dDb250ZXh0UmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNHQ29udGV4dFJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDR0NvbnRleHRSZWZPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ0dDb250ZXh0UmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDR0NvbnRleHRSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ0dDb250ZXh0UmVmT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ0dDb250ZXh0UmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ0cuQ0dDb250ZXh0UmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ0dDb250ZXh0UmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ0dDb250ZXh0UmVmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENHQ29udGV4dFJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ0dDb250ZXh0UmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDR0NvbnRleHRSZWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ0dDb250ZXh0UmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENHQ29udGV4dFJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDR0NvbnRleHRSZWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENHQ29udGV4dFJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDR0NvbnRleHRSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDR0NvbnRleHRSZWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBDR0NvbnRleHRSZWYgLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMjYxLDI5ICsxMjYxLDI5IEBACiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkNHX0NyZWF0ZUNHQ29udGV4dEZvclBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdyYWZQdHIgcG9ydDsKLQlDR0NvbnRleHRSZWYgY3R4OwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdyYWZQdHIgcG9ydDsKKyAgICBDR0NvbnRleHRSZWYgY3R4OworICAgIE9TU3RhdHVzIF9lcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlfZXJyID0gQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydChwb3J0LCAmY3R4KTsKLQlpZiAoX2VyciAhPSBub0VycikKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0dDb250ZXh0UmVmT2JqX05ldywgY3R4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBfZXJyID0gQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydChwb3J0LCAmY3R4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDR0NvbnRleHRSZWZPYmpfTmV3LCBjdHgpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAjZW5kaWYKIAogc3RhdGljIFB5TWV0aG9kRGVmIENHX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkNyZWF0ZUNHQ29udGV4dEZvclBvcnQiLCAoUHlDRnVuY3Rpb24pQ0dfQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dyYWZQdHIpIC0+IENHQ29udGV4dFJlZiIpfSwKKyAgICB7IkNyZWF0ZUNHQ29udGV4dEZvclBvcnQiLCAoUHlDRnVuY3Rpb24pQ0dfQ3JlYXRlQ0dDb250ZXh0Rm9yUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dyYWZQdHIpIC0+IENHQ29udGV4dFJlZiIpfSwKICNlbmRpZgotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMjkxLDI1ICsxMjkxLDI1IEBACiAKIHZvaWQgaW5pdF9DRyh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9DRyIsIENHX21ldGhvZHMpOwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUNHX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoQ0dfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDR19FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUNHQ29udGV4dFJlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ0dDb250ZXh0UmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQ0dDb250ZXh0UmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ0dDb250ZXh0UmVmIiwgKFB5T2JqZWN0ICopJkNHQ29udGV4dFJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkNHQ29udGV4dFJlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNHQ29udGV4dFJlZlR5cGUiLCAoUHlPYmplY3QgKikmQ0dDb250ZXh0UmVmX1R5cGUpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfQ0ciLCBDR19tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBDR19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKENHX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ0dfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBDR0NvbnRleHRSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNHQ29udGV4dFJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNHQ29udGV4dFJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNHQ29udGV4dFJlZiIsIChQeU9iamVjdCAqKSZDR0NvbnRleHRSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDR0NvbnRleHRSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDR0NvbnRleHRSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkNHQ29udGV4dFJlZl9UeXBlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PSBFbmQgbW9kdWxlIF9DRyA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jbS9fQ21tb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2NtL19DbW1vZHVsZS5jCmluZGV4IDAzYTI1ZGQuLmYwN2YxMjEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2NtL19DbW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2NtL19DbW1vZHVsZS5jCkBAIC05LDkgKzksOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzYsMjEgKzM2LDIxIEBACiBDbXBEZXNjX05ldyhDb21wb25lbnREZXNjcmlwdGlvbiAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJk8mTyZsbCIsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50VHlwZSwKLSAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5jb21wb25lbnRTdWJUeXBlLAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudE1hbnVmYWN0dXJlciwKLSAgICAgICAgICAgICAgICBpdHNlbGYtPmNvbXBvbmVudEZsYWdzLCBpdHNlbGYtPmNvbXBvbmVudEZsYWdzTWFzayk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mTyZPJmxsIiwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50VHlwZSwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50TWFudWZhY3R1cmVyLAorICAgICAgICBpdHNlbGYtPmNvbXBvbmVudEZsYWdzLCBpdHNlbGYtPmNvbXBvbmVudEZsYWdzTWFzayk7CiB9CiAKIHN0YXRpYyBpbnQKIENtcERlc2NfQ29udmVydChQeU9iamVjdCAqdiwgQ29tcG9uZW50RGVzY3JpcHRpb24gKnBfaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mbGwiLAotICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRUeXBlLAotICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRTdWJUeXBlLAotICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCi0gICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5jb21wb25lbnRGbGFncywgJnBfaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOworICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJPJk8mTyZsbCIsCisgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRUeXBlLAorICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKKyAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcF9pdHNlbGYtPmNvbXBvbmVudE1hbnVmYWN0dXJlciwKKyAgICAgICAgJnBfaXRzZWxmLT5jb21wb25lbnRGbGFncywgJnBfaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOwogfQogCiAKQEAgLTYzLDE5NCArNjMsMTk0IEBACiAjZGVmaW5lIENtcEluc3RPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENvbXBvbmVudEluc3RhbmNlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ29tcG9uZW50SW5zdGFuY2Ugb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb21wb25lbnRJbnN0YW5jZSBvYl9pdHNlbGY7CiB9IENvbXBvbmVudEluc3RhbmNlT2JqZWN0OwogCiBQeU9iamVjdCAqQ21wSW5zdE9ial9OZXcoQ29tcG9uZW50SW5zdGFuY2UgaXRzZWxmKQogewotCUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbV9FcnJvciwiTlVMTCBDb21wb25lbnRJbnN0YW5jZSIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKENvbXBvbmVudEluc3RhbmNlT2JqZWN0LCAmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbV9FcnJvciwiTlVMTCBDb21wb25lbnRJbnN0YW5jZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbXBvbmVudEluc3RhbmNlT2JqZWN0LCAmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ21wSW5zdE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb21wb25lbnRJbnN0YW5jZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFDbXBJbnN0T2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbXBvbmVudEluc3RhbmNlIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUNtcEluc3RPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ29tcG9uZW50SW5zdGFuY2UgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDbXBJbnN0T2JqX2RlYWxsb2MoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfQ2xvc2VDb21wb25lbnQoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIENsb3NlQ29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xvc2VDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX0dldENvbXBvbmVudEluc3RhbmNlRXJyb3IoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEdldENvbXBvbmVudEluc3RhbmNlRXJyb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXBvbmVudEluc3RhbmNlRXJyb3IoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial9TZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciB0aGVFcnJvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgdGhlRXJyb3I7CiAjaWZuZGVmIFNldENvbXBvbmVudEluc3RhbmNlRXJyb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRXJyb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVFcnJvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRXJyb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVFcnJvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX1NldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIHRoZVN0b3JhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB0aGVTdG9yYWdlOwogI2lmbmRlZiBTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3RvcmFnZSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbXBvbmVudEluc3RhbmNlU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdG9yYWdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN0b3JhZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RvcmFnZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZChDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0Jc2hvcnQgZnRuTnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBzaG9ydCBmdG5OdW1iZXI7CiAjaWZuZGVmIENvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQKLQlQeU1hY19QUkVDSEVDSyhDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnRuTnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRuTnVtYmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ0bk51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0bk51bWJlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wSW5zdE9ial9HZXRDb21wb25lbnRWZXJzaW9uKENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldENvbXBvbmVudFZlcnNpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRWZXJzaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRWZXJzaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb21wb25lbnRWZXJzaW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb21wb25lbnRWZXJzaW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcEluc3RPYmpfQ29tcG9uZW50U2V0VGFyZ2V0KENvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSB0YXJnZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIHRhcmdldDsKICNpZm5kZWYgQ29tcG9uZW50U2V0VGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soQ29tcG9uZW50U2V0VGFyZ2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wb25lbnRTZXRUYXJnZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0YXJnZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb21wb25lbnRTZXRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRhcmdldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvbXBvbmVudFNldFRhcmdldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDbXBJbnN0T2JqX21ldGhvZHNbXSA9IHsKLQl7IkNsb3NlQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfQ2xvc2VDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldENvbXBvbmVudEluc3RhbmNlRXJyb3IiLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9HZXRDb21wb25lbnRJbnN0YW5jZUVycm9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoT1NFcnIgdGhlRXJyb3IpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9HZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdGhlU3RvcmFnZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNsb3NlQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfQ2xvc2VDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbXBvbmVudEluc3RhbmNlRXJyb3IiLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9HZXRDb21wb25lbnRJbnN0YW5jZUVycm9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb21wb25lbnRJbnN0YW5jZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfU2V0Q29tcG9uZW50SW5zdGFuY2VFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NFcnIgdGhlRXJyb3IpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9HZXRDb21wb25lbnRJbnN0YW5jZVN0b3JhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfU2V0Q29tcG9uZW50SW5zdGFuY2VTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgdGhlU3RvcmFnZSkgLT4gTm9uZSIpfSwKICNpZm5kZWYgX19MUDY0X18KLQl7IkNvbXBvbmVudEZ1bmN0aW9uSW1wbGVtZW50ZWQiLCAoUHlDRnVuY3Rpb24pQ21wSW5zdE9ial9Db21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBmdG5OdW1iZXIpIC0+IChsb25nIF9ydikiKX0sCi0JeyJHZXRDb21wb25lbnRWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfR2V0Q29tcG9uZW50VmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiQ29tcG9uZW50U2V0VGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfQ29tcG9uZW50U2V0VGFyZ2V0LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSB0YXJnZXQpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkIiwgKFB5Q0Z1bmN0aW9uKUNtcEluc3RPYmpfQ29tcG9uZW50RnVuY3Rpb25JbXBsZW1lbnRlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZnRuTnVtYmVyKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0Q29tcG9uZW50VmVyc2lvbiIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0dldENvbXBvbmVudFZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkNvbXBvbmVudFNldFRhcmdldCIsIChQeUNGdW5jdGlvbilDbXBJbnN0T2JqX0NvbXBvbmVudFNldFRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgdGFyZ2V0KSAtPiAobG9uZyBfcnYpIil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBDbXBJbnN0T2JqX2dldHNldGxpc3QgTlVMTApAQCAtMjY3LDYxICsyNjcsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpDbXBJbnN0T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlDb21wb25lbnRJbnN0YW5jZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIENvbXBvbmVudEluc3RhbmNlIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENtcEluc3RPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQ21wSW5zdE9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBDb21wb25lbnRJbnN0YW5jZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9DbS5Db21wb25lbnRJbnN0YW5jZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENvbXBvbmVudEluc3RhbmNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ21wSW5zdE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDbXBJbnN0T2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBDbXBJbnN0T2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDbXBJbnN0T2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNtcEluc3RPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JQ21wSW5zdE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDbXBJbnN0T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDbXBJbnN0T2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUNtcEluc3RPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDbXBJbnN0T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ20uQ29tcG9uZW50SW5zdGFuY2UiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihDb21wb25lbnRJbnN0YW5jZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIENtcEluc3RPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ21wSW5zdE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ21wSW5zdE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQ21wSW5zdE9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDbXBJbnN0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENtcEluc3RPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQ21wSW5zdE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ21wSW5zdE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDbXBJbnN0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQ21wSW5zdE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIENvbXBvbmVudEluc3RhbmNlIC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTMzNCwzNjEgKzMzNCwzNjEgQEAKICNkZWZpbmUgQ21wT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkNvbXBvbmVudF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZDb21wb25lbnRfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENvbXBvbmVudE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUNvbXBvbmVudCBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIENvbXBvbmVudCBvYl9pdHNlbGY7CiB9IENvbXBvbmVudE9iamVjdDsKIAogUHlPYmplY3QgKkNtcE9ial9OZXcoQ29tcG9uZW50IGl0c2VsZikKIHsKLQlDb21wb25lbnRPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYWCBPciBzaG91bGQgd2UgcmV0dXJuIE5vbmU/ICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5vIHN1Y2ggY29tcG9uZW50Iik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ29tcG9uZW50T2JqZWN0LCAmQ29tcG9uZW50X1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDb21wb25lbnRPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYWCBPciBzaG91bGQgd2UgcmV0dXJuIE5vbmU/ICovCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDbV9FcnJvciwiTm8gc3VjaCBjb21wb25lbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbXBvbmVudE9iamVjdCwgJkNvbXBvbmVudF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBDbXBPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ29tcG9uZW50ICpwX2l0c2VsZikKIHsKLQlpZiAoIHYgPT0gUHlfTm9uZSApIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IDA7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLQkgICAgICAgIH0KLQlpZiAoIUNtcE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb21wb25lbnQgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ29tcG9uZW50T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIGlmICghQ21wT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbXBvbmVudCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDb21wb25lbnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBDbXBPYmpfZGVhbGxvYyhDb21wb25lbnRPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9VbnJlZ2lzdGVyQ29tcG9uZW50KENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgVW5yZWdpc3RlckNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFVucmVnaXN0ZXJDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVucmVnaXN0ZXJDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVbnJlZ2lzdGVyQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5yZWdpc3RlckNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50SW5mbyhDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29tcG9uZW50RGVzY3JpcHRpb24gY2Q7Ci0JSGFuZGxlIGNvbXBvbmVudE5hbWU7Ci0JSGFuZGxlIGNvbXBvbmVudEluZm87Ci0JSGFuZGxlIGNvbXBvbmVudEljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29tcG9uZW50RGVzY3JpcHRpb24gY2Q7CisgICAgSGFuZGxlIGNvbXBvbmVudE5hbWU7CisgICAgSGFuZGxlIGNvbXBvbmVudEluZm87CisgICAgSGFuZGxlIGNvbXBvbmVudEljb247CiAjaWZuZGVmIEdldENvbXBvbmVudEluZm8KLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9uZW50TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb25lbnRJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvbmVudEljb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29tcG9uZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZjZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcERlc2NfTmV3LCAmY2QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb25lbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXBvbmVudEljb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcG9uZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWNvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcERlc2NfTmV3LCAmY2QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9PcGVuQ29tcG9uZW50KENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50SW5zdGFuY2UgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBfcnY7CiAjaWZuZGVmIE9wZW5Db21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhPcGVuQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcGVuQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPcGVuQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE9wZW5Db21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfUmVzb2x2ZUNvbXBvbmVudEFsaWFzKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IF9ydjsKICNpZm5kZWYgUmVzb2x2ZUNvbXBvbmVudEFsaWFzCi0JUHlNYWNfUFJFQ0hFQ0soUmVzb2x2ZUNvbXBvbmVudEFsaWFzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNvbHZlQ29tcG9uZW50QWxpYXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlc29sdmVDb21wb25lbnRBbGlhcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlc29sdmVDb21wb25lbnRBbGlhcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX0dldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyhDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyMjU1IHRoZVN0cmluZzsKLQlzaG9ydCBzdHJMaXN0SUQ7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyMjU1IHRoZVN0cmluZzsKKyAgICBzaG9ydCBzdHJMaXN0SUQ7CisgICAgc2hvcnQgaW5kZXg7CiAjaWZuZGVmIEdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZwotCVB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50UHVibGljSW5kU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRoZVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0ckxpc3RJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyTGlzdElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRoZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ckxpc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyTGlzdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9HZXRDb21wb25lbnRSZWZjb24oQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldENvbXBvbmVudFJlZmNvbgotCVB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFJlZmNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50UmVmY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb21wb25lbnRSZWZjb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbXBvbmVudFJlZmNvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfU2V0Q29tcG9uZW50UmVmY29uKENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyB0aGVSZWZjb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgdGhlUmVmY29uOwogI2lmbmRlZiBTZXRDb21wb25lbnRSZWZjb24KLQlQeU1hY19QUkVDSEVDSyhTZXRDb21wb25lbnRSZWZjb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbXBvbmVudFJlZmNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZVJlZmNvbikpCi0JCXJldHVybiBOVUxMOwotCVNldENvbXBvbmVudFJlZmNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB0aGVSZWZjb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVJlZmNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbXBvbmVudFJlZmNvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICB0aGVSZWZjb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfT3BlbkNvbXBvbmVudFJlc0ZpbGUoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgT3BlbkNvbXBvbmVudFJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhPcGVuQ29tcG9uZW50UmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlbkNvbXBvbmVudFJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5Db21wb25lbnRSZXNGaWxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuQ29tcG9uZW50UmVzRmlsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfR2V0Q29tcG9uZW50UmVzb3VyY2UoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSByZXNUeXBlOwotCXNob3J0IHJlc0lEOwotCUhhbmRsZSB0aGVSZXNvdXJjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgcmVzVHlwZTsKKyAgICBzaG9ydCByZXNJRDsKKyAgICBIYW5kbGUgdGhlUmVzb3VyY2U7CiAjaWZuZGVmIEdldENvbXBvbmVudFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50UmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlc1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wb25lbnRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVJlc291cmNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlUmVzb3VyY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb21wb25lbnRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVJlc291cmNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlUmVzb3VyY2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9HZXRDb21wb25lbnRJbmRTdHJpbmcoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSB0aGVTdHJpbmc7Ci0Jc2hvcnQgc3RyTGlzdElEOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSB0aGVTdHJpbmc7CisgICAgc2hvcnQgc3RyTGlzdElEOworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRDb21wb25lbnRJbmRTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJbmRTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbXBvbmVudEluZFN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdHJMaXN0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wb25lbnRJbmRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxpc3RJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJMaXN0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb21wb25lbnRJbmRTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckxpc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDbXBPYmpfQ291bnRDb21wb25lbnRJbnN0YW5jZXMoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIENvdW50Q29tcG9uZW50SW5zdGFuY2VzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRDb21wb25lbnRJbnN0YW5jZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50Q29tcG9uZW50SW5zdGFuY2VzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudENvbXBvbmVudEluc3RhbmNlcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRDb21wb25lbnRJbnN0YW5jZXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX1NldERlZmF1bHRDb21wb25lbnQoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGZsYWdzOwogI2lmbmRlZiBTZXREZWZhdWx0Q29tcG9uZW50Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGVmYXVsdENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGVmYXVsdENvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERlZmF1bHRDb21wb25lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREZWZhdWx0Q29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9DYXB0dXJlQ29tcG9uZW50KENvbXBvbmVudE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50IF9ydjsKLQlDb21wb25lbnQgY2FwdHVyaW5nQ29tcG9uZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgX3J2OworICAgIENvbXBvbmVudCBjYXB0dXJpbmdDb21wb25lbnQ7CiAjaWZuZGVmIENhcHR1cmVDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhDYXB0dXJlQ29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYXB0dXJlQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjYXB0dXJpbmdDb21wb25lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDYXB0dXJlQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJpbmdDb21wb25lbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2FwdHVyaW5nQ29tcG9uZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2FwdHVyZUNvbXBvbmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyaW5nQ29tcG9uZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX1VuY2FwdHVyZUNvbXBvbmVudChDb21wb25lbnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFVuY2FwdHVyZUNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFVuY2FwdHVyZUNvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5jYXB0dXJlQ29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5jYXB0dXJlQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVW5jYXB0dXJlQ29tcG9uZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkNtcE9ial9HZXRDb21wb25lbnRJY29uU3VpdGUoQ29tcG9uZW50T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBpY29uU3VpdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGljb25TdWl0ZTsKICNpZm5kZWYgR2V0Q29tcG9uZW50SWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50SWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRJY29uU3VpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb21wb25lbnRJY29uU3VpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU3VpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uU3VpdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcG9uZW50SWNvblN1aXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvblN1aXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIENtcE9ial9tZXRob2RzW10gPSB7Ci0JeyJVbnJlZ2lzdGVyQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9VbnJlZ2lzdGVyQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb21wb25lbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRJbmZvLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgY29tcG9uZW50TmFtZSwgSGFuZGxlIGNvbXBvbmVudEluZm8sIEhhbmRsZSBjb21wb25lbnRJY29uKSAtPiAoQ29tcG9uZW50RGVzY3JpcHRpb24gY2QpIil9LAotCXsiT3BlbkNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfT3BlbkNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgX3J2KSIpfSwKLQl7IlJlc29sdmVDb21wb25lbnRBbGlhcyIsIChQeUNGdW5jdGlvbilDbXBPYmpfUmVzb2x2ZUNvbXBvbmVudEFsaWFzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKLQl7IkdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UHVibGljSW5kU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgdGhlU3RyaW5nLCBzaG9ydCBzdHJMaXN0SUQsIHNob3J0IGluZGV4KSAtPiBOb25lIil9LAotCXsiR2V0Q29tcG9uZW50UmVmY29uIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRSZWZjb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlNldENvbXBvbmVudFJlZmNvbiIsIChQeUNGdW5jdGlvbilDbXBPYmpfU2V0Q29tcG9uZW50UmVmY29uLCAxLAotCSBQeURvY19TVFIoIihsb25nIHRoZVJlZmNvbikgLT4gTm9uZSIpfSwKLQl7Ik9wZW5Db21wb25lbnRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9PcGVuQ29tcG9uZW50UmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldENvbXBvbmVudFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHJlc1R5cGUsIHNob3J0IHJlc0lEKSAtPiAoSGFuZGxlIHRoZVJlc291cmNlKSIpfSwKLQl7IkdldENvbXBvbmVudEluZFN0cmluZyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50SW5kU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgdGhlU3RyaW5nLCBzaG9ydCBzdHJMaXN0SUQsIHNob3J0IGluZGV4KSAtPiBOb25lIil9LAotCXsiQ291bnRDb21wb25lbnRJbnN0YW5jZXMiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0NvdW50Q29tcG9uZW50SW5zdGFuY2VzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXREZWZhdWx0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9TZXREZWZhdWx0Q29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkNhcHR1cmVDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0NhcHR1cmVDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudCBjYXB0dXJpbmdDb21wb25lbnQpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKLQl7IlVuY2FwdHVyZUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfVW5jYXB0dXJlQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJVbnJlZ2lzdGVyQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9VbnJlZ2lzdGVyQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb21wb25lbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgY29tcG9uZW50TmFtZSwgSGFuZGxlIGNvbXBvbmVudEluZm8sIEhhbmRsZSBjb21wb25lbnRJY29uKSAtPiAoQ29tcG9uZW50RGVzY3JpcHRpb24gY2QpIil9LAorICAgIHsiT3BlbkNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfT3BlbkNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgX3J2KSIpfSwKKyAgICB7IlJlc29sdmVDb21wb25lbnRBbGlhcyIsIChQeUNGdW5jdGlvbilDbXBPYmpfUmVzb2x2ZUNvbXBvbmVudEFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IkdldENvbXBvbmVudFB1YmxpY0luZFN0cmluZyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50UHVibGljSW5kU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgdGhlU3RyaW5nLCBzaG9ydCBzdHJMaXN0SUQsIHNob3J0IGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29tcG9uZW50UmVmY29uIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRSZWZjb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlNldENvbXBvbmVudFJlZmNvbiIsIChQeUNGdW5jdGlvbilDbXBPYmpfU2V0Q29tcG9uZW50UmVmY29uLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHRoZVJlZmNvbikgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5Db21wb25lbnRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9PcGVuQ29tcG9uZW50UmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldENvbXBvbmVudFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9HZXRDb21wb25lbnRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHJlc1R5cGUsIHNob3J0IHJlc0lEKSAtPiAoSGFuZGxlIHRoZVJlc291cmNlKSIpfSwKKyAgICB7IkdldENvbXBvbmVudEluZFN0cmluZyIsIChQeUNGdW5jdGlvbilDbXBPYmpfR2V0Q29tcG9uZW50SW5kU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgdGhlU3RyaW5nLCBzaG9ydCBzdHJMaXN0SUQsIHNob3J0IGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQ291bnRDb21wb25lbnRJbnN0YW5jZXMiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0NvdW50Q29tcG9uZW50SW5zdGFuY2VzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTZXREZWZhdWx0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtcE9ial9TZXREZWZhdWx0Q29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkNhcHR1cmVDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0NhcHR1cmVDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudCBjYXB0dXJpbmdDb21wb25lbnQpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IlVuY2FwdHVyZUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbXBPYmpfVW5jYXB0dXJlQ29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJHZXRDb21wb25lbnRJY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudEljb25TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIGljb25TdWl0ZSkiKX0sCisgICAgeyJHZXRDb21wb25lbnRJY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pQ21wT2JqX0dldENvbXBvbmVudEljb25TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIGljb25TdWl0ZSkiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIENtcE9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTcwNSw2MSArNzA1LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ21wT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlDb21wb25lbnQgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBDb21wb25lbnQgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgQ21wT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQ29tcG9uZW50T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIENtcE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENvbXBvbmVudE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBDbXBPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgQ29tcG9uZW50X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX0NtLkNvbXBvbmVudCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKENvbXBvbmVudE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIENtcE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBDbXBPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIENtcE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgQ21wT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUNtcE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlDbXBPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JQ21wT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlDbXBPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQ21wT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JQ21wT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfQ20uQ29tcG9uZW50IiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoQ29tcG9uZW50T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQ21wT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIENtcE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgQ21wT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBDbXBPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQ21wT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIENtcE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBDbXBPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIENtcE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBDbXBPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBDbXBPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ29tcG9uZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NjcsMTUwICs3NjcsMTUwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ21fUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50IF9ydjsKLQlDb21wb25lbnRSZXNvdXJjZUhhbmRsZSBjcjsKLQlzaG9ydCBnbG9iYWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CisgICAgQ29tcG9uZW50UmVzb3VyY2VIYW5kbGUgY3I7CisgICAgc2hvcnQgZ2xvYmFsOwogI2lmbmRlZiBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZShjciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWdpc3RlckNvbXBvbmVudFJlc291cmNlKGNyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21fRmluZE5leHRDb21wb25lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JQ29tcG9uZW50IGFDb21wb25lbnQ7Ci0JQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IF9ydjsKKyAgICBDb21wb25lbnQgYUNvbXBvbmVudDsKKyAgICBDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nOwogI2lmbmRlZiBGaW5kTmV4dENvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKEZpbmROZXh0Q29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kTmV4dENvbXBvbmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZhQ29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBEZXNjX0NvbnZlcnQsICZsb29raW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmluZE5leHRDb21wb25lbnQoYUNvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmbG9va2luZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmFDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcERlc2NfQ29udmVydCwgJmxvb2tpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaW5kTmV4dENvbXBvbmVudChhQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsb29raW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21fQ291bnRDb21wb25lbnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBDb21wb25lbnREZXNjcmlwdGlvbiBsb29raW5nOwogI2lmbmRlZiBDb3VudENvbXBvbmVudHMKLQlQeU1hY19QUkVDSEVDSyhDb3VudENvbXBvbmVudHMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50Q29tcG9uZW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcERlc2NfQ29udmVydCwgJmxvb2tpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudENvbXBvbmVudHMoJmxvb2tpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wRGVzY19Db252ZXJ0LCAmbG9va2luZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50Q29tcG9uZW50cygmbG9va2luZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21fR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQKLQlQeU1hY19QUkVDSEVDSyhHZXRDb21wb25lbnRMaXN0TW9kU2VlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcG9uZW50TGlzdE1vZFNlZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbXBvbmVudExpc3RNb2RTZWVkKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbXBvbmVudExpc3RNb2RTZWVkKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21fQ2xvc2VDb21wb25lbnRSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlZm51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZWZudW07CiAjaWZuZGVmIENsb3NlQ29tcG9uZW50UmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKENsb3NlQ29tcG9uZW50UmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VDb21wb25lbnRSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmbnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENsb3NlQ29tcG9uZW50UmVzRmlsZShyZWZudW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmbnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsb3NlQ29tcG9uZW50UmVzRmlsZShyZWZudW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkNtX09wZW5EZWZhdWx0Q29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRJbnN0YW5jZSBfcnY7Ci0JT1NUeXBlIGNvbXBvbmVudFR5cGU7Ci0JT1NUeXBlIGNvbXBvbmVudFN1YlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBPU1R5cGUgY29tcG9uZW50VHlwZTsKKyAgICBPU1R5cGUgY29tcG9uZW50U3ViVHlwZTsKICNpZm5kZWYgT3BlbkRlZmF1bHRDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhPcGVuRGVmYXVsdENvbXBvbmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlbkRlZmF1bHRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXBvbmVudFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXBvbmVudFN1YlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBPcGVuRGVmYXVsdENvbXBvbmVudChjb21wb25lbnRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN1YlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXBvbmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXBvbmVudFN1YlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuRGVmYXVsdENvbXBvbmVudChjb21wb25lbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN1YlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ21fUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXNob3J0IHJlc1JlZk51bTsKLQlzaG9ydCBnbG9iYWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBzaG9ydCBnbG9iYWw7CiAjaWZuZGVmIFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKHJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlKHJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ21fbWV0aG9kc1tdID0gewotCXsiUmVnaXN0ZXJDb21wb25lbnRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDbV9SZWdpc3RlckNvbXBvbmVudFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRSZXNvdXJjZUhhbmRsZSBjciwgc2hvcnQgZ2xvYmFsKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJGaW5kTmV4dENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbV9GaW5kTmV4dENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGFDb21wb25lbnQsIENvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmcpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKLQl7IkNvdW50Q29tcG9uZW50cyIsIChQeUNGdW5jdGlvbilDbV9Db3VudENvbXBvbmVudHMsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudERlc2NyaXB0aW9uIGxvb2tpbmcpIC0+IChsb25nIF9ydikiKX0sCi0JeyJHZXRDb21wb25lbnRMaXN0TW9kU2VlZCIsIChQeUNGdW5jdGlvbilDbV9HZXRDb21wb25lbnRMaXN0TW9kU2VlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiQ2xvc2VDb21wb25lbnRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUNtX0Nsb3NlQ29tcG9uZW50UmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmbnVtKSAtPiBOb25lIil9LAotCXsiT3BlbkRlZmF1bHRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pQ21fT3BlbkRlZmF1bHRDb21wb25lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjb21wb25lbnRUeXBlLCBPU1R5cGUgY29tcG9uZW50U3ViVHlwZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCi0JeyJSZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilDbV9SZWdpc3RlckNvbXBvbmVudFJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCBnbG9iYWwpIC0+IChsb25nIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJSZWdpc3RlckNvbXBvbmVudFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKUNtX1JlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudFJlc291cmNlSGFuZGxlIGNyLCBzaG9ydCBnbG9iYWwpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IkZpbmROZXh0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKUNtX0ZpbmROZXh0Q29tcG9uZW50LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnQgYUNvbXBvbmVudCwgQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZykgLT4gKENvbXBvbmVudCBfcnYpIil9LAorICAgIHsiQ291bnRDb21wb25lbnRzIiwgKFB5Q0Z1bmN0aW9uKUNtX0NvdW50Q29tcG9uZW50cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50RGVzY3JpcHRpb24gbG9va2luZykgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldENvbXBvbmVudExpc3RNb2RTZWVkIiwgKFB5Q0Z1bmN0aW9uKUNtX0dldENvbXBvbmVudExpc3RNb2RTZWVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJDbG9zZUNvbXBvbmVudFJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pQ21fQ2xvc2VDb21wb25lbnRSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZudW0pIC0+IE5vbmUiKX0sCisgICAgeyJPcGVuRGVmYXVsdENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilDbV9PcGVuRGVmYXVsdENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNvbXBvbmVudFR5cGUsIE9TVHlwZSBjb21wb25lbnRTdWJUeXBlKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgX3J2KSIpfSwKKyAgICB7IlJlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKUNtX1JlZ2lzdGVyQ29tcG9uZW50UmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZXNSZWZOdW0sIHNob3J0IGdsb2JhbCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtOTE4LDM3ICs5MTgsMzcgQEAKIAogdm9pZCBpbml0X0NtKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb21wb25lbnQsIENtcE9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudCwgQ21wT2JqX0NvbnZlcnQpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnRJbnN0YW5jZSwgQ21wSW5zdE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50LCBDbXBPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudCwgQ21wT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb21wb25lbnRJbnN0YW5jZSwgQ21wSW5zdE9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIENtcEluc3RPYmpfQ29udmVydCk7CiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfQ20iLCBDbV9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlDbV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKENtX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ21fRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlDb21wb25lbnRJbnN0YW5jZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudEluc3RhbmNlIiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnRJbnN0YW5jZVR5cGUiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JQ29tcG9uZW50X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZDb21wb25lbnRfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDb21wb25lbnRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnQiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50X1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ29tcG9uZW50X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50VHlwZSIsIChQeU9iamVjdCAqKSZDb21wb25lbnRfVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9DbSIsIENtX21ldGhvZHMpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIENtX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoQ21fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBDbV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIENvbXBvbmVudEluc3RhbmNlX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZDb21wb25lbnRJbnN0YW5jZV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29tcG9uZW50SW5zdGFuY2UiLCAoUHlPYmplY3QgKikmQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudEluc3RhbmNlVHlwZSIsIChQeU9iamVjdCAqKSZDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICBDb21wb25lbnRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkNvbXBvbmVudF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNvbXBvbmVudF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbXBvbmVudCIsIChQeU9iamVjdCAqKSZDb21wb25lbnRfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDb21wb25lbnRfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb21wb25lbnRUeXBlIiwgKFB5T2JqZWN0ICopJkNvbXBvbmVudF9UeXBlKTsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PSBFbmQgbW9kdWxlIF9DbSA9PT09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jdGwvX0N0bG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvY3RsL19DdGxtb2R1bGUuYwppbmRleCBjZGI4NTU3Li5hOTU5ZWI0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jdGwvX0N0bG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2N0bC9fQ3RsbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTQxLDE5ICs0MSwxOSBAQAogQ29udHJvbEZvbnRTdHlsZV9OZXcoQ29udHJvbEZvbnRTdHlsZVJlYyAqaXRzZWxmKQogewogCi0gICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoaGhoaGhPJk8mIiwgaXRzZWxmLT5mbGFncywgaXRzZWxmLT5mb250LAotICAgICAgICAgICAgICAgIGl0c2VsZi0+c2l6ZSwgaXRzZWxmLT5zdHlsZSwgaXRzZWxmLT5tb2RlLCBpdHNlbGYtPmp1c3QsCi0gICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmaXRzZWxmLT5mb3JlQ29sb3IsIFFkUkdCX05ldywgJml0c2VsZi0+YmFja0NvbG9yKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaGhoTyZPJiIsIGl0c2VsZi0+ZmxhZ3MsIGl0c2VsZi0+Zm9udCwKKyAgICAgICAgaXRzZWxmLT5zaXplLCBpdHNlbGYtPnN0eWxlLCBpdHNlbGYtPm1vZGUsIGl0c2VsZi0+anVzdCwKKyAgICAgICAgUWRSR0JfTmV3LCAmaXRzZWxmLT5mb3JlQ29sb3IsIFFkUkdCX05ldywgJml0c2VsZi0+YmFja0NvbG9yKTsKIH0KICNlbmRpZgogCiBzdGF0aWMgaW50CiBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbnRyb2xGb250U3R5bGVSZWMgKml0c2VsZikKIHsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGhoaGhoTyZPJikiLCAmaXRzZWxmLT5mbGFncywKLSAgICAgICAgICAgICAgICAmaXRzZWxmLT5mb250LCAmaXRzZWxmLT5zaXplLCAmaXRzZWxmLT5zdHlsZSwgJml0c2VsZi0+bW9kZSwKLSAgICAgICAgICAgICAgICAmaXRzZWxmLT5qdXN0LCBRZFJHQl9Db252ZXJ0LCAmaXRzZWxmLT5mb3JlQ29sb3IsCi0gICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+YmFja0NvbG9yKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoaGhoaGhPJk8mKSIsICZpdHNlbGYtPmZsYWdzLAorICAgICAgICAmaXRzZWxmLT5mb250LCAmaXRzZWxmLT5zaXplLCAmaXRzZWxmLT5zdHlsZSwgJml0c2VsZi0+bW9kZSwKKyAgICAgICAgJml0c2VsZi0+anVzdCwgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+Zm9yZUNvbG9yLAorICAgICAgICBRZFJHQl9Db252ZXJ0LCAmaXRzZWxmLT5iYWNrQ29sb3IpOwogfQogCiAvKgpAQCAtNjMsMTMgKzYzLDEzIEBACiBQeUNvbnRyb2xJRF9OZXcoQ29udHJvbElEICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPnNpZ25hdHVyZSwgaXRzZWxmLT5pZCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPnNpZ25hdHVyZSwgaXRzZWxmLT5pZCk7CiB9CiAKIHN0YXRpYyBpbnQKIFB5Q29udHJvbElEX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbnRyb2xJRCAqaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihPJmwpIiwgUHlNYWNfR2V0T1NUeXBlLCAmaXRzZWxmLT5zaWduYXR1cmUsICZpdHNlbGYtPmlkKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihPJmwpIiwgUHlNYWNfR2V0T1NUeXBlLCAmaXRzZWxmLT5zaWduYXR1cmUsICZpdHNlbGYtPmlkKTsKIH0KIAogLyoKQEAgLTc4LDQwICs3OCw0MCBAQAogc3RhdGljIGludAogRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzYyAqaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihsTyZsKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5wcm9wZXJ0eUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaXRzZWxmLT5wcm9wZXJ0eVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5wcm9wZXJ0eUZsYWdzKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihsTyZsKSIsCisgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnByb3BlcnR5SUQsCisgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJml0c2VsZi0+cHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5wcm9wZXJ0eUZsYWdzKTsKIH0KIAogc3RhdGljIGludAogQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyAqaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoTyYpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZpdHNlbGYtPnUuaWNvblN1aXRlKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+Y29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaXRzZWxmLT51Lmljb25TdWl0ZSk7CiB9CiAKIHN0YXRpYyBpbnQKIERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjICppdHNlbGYpCiB7Ci0gICAgICAgIGl0c2VsZi0+dmVyc2lvbiA9IGtEYXRhQnJvd3Nlckxpc3RWaWV3TGF0ZXN0SGVhZGVyRGVzYzsKLSAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSEhoTyZITyZPJikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+bWluaW11bVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+bWF4aW11bVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+dGl0bGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaXRzZWxmLT50aXRsZVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmluaXRpYWxPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJml0c2VsZi0+YnRuRm9udFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkNvbnRlbnRJbmZvKTsKKyAgICBpdHNlbGYtPnZlcnNpb24gPSBrRGF0YUJyb3dzZXJMaXN0Vmlld0xhdGVzdEhlYWRlckRlc2M7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSEhoTyZITyZPJikiLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5taW5pbXVtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1heGltdW1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+dGl0bGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYtPnRpdGxlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5pbml0aWFsT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJml0c2VsZi0+YnRuRm9udFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJml0c2VsZi0+YnRuQ29udGVudEluZm8pOwogfQogCiBzdGF0aWMgaW50CiBEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyAqaXRzZWxmKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihPJk8mKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2NfQ29udmVydCwgJml0c2VsZi0+cHJvcGVydHlEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfQ29udmVydCwgJml0c2VsZi0+aGVhZGVyQnRuRGVzYyk7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZPJikiLAorICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2NfQ29udmVydCwgJml0c2VsZi0+cHJvcGVydHlEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19Db252ZXJ0LCAmaXRzZWxmLT5oZWFkZXJCdG5EZXNjKTsKIH0KIAogLyogVHJhY2tDb250cm9sIGFuZCBIYW5kbGVDb250cm9sQ2xpY2sgY2FsbGJhY2sgc3VwcG9ydCAqLwpAQCAtMTM5LDM2ODMgKzEzOSwzNjgzIEBACiAjZGVmaW5lIEN0bE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZDb250cm9sX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkNvbnRyb2xfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IENvbnRyb2xPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlDb250cm9sSGFuZGxlIG9iX2l0c2VsZjsKLQlQeU9iamVjdCAqb2JfY2FsbGJhY2tkaWN0OworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb250cm9sSGFuZGxlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqb2JfY2FsbGJhY2tkaWN0OwogfSBDb250cm9sT2JqZWN0OwogCiBQeU9iamVjdCAqQ3RsT2JqX05ldyhDb250cm9sSGFuZGxlIGl0c2VsZikKIHsKLQlDb250cm9sT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoQ29udHJvbE9iamVjdCwgJkNvbnRyb2xfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JU2V0Q29udHJvbFJlZmVyZW5jZShpdHNlbGYsIChsb25nKWl0KTsKLQlpdC0+b2JfY2FsbGJhY2tkaWN0ID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQ29udHJvbE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIFNldENvbnRyb2xSZWZlcmVuY2UoaXRzZWxmLCAobG9uZylpdCk7CisgICAgaXQtPm9iX2NhbGxiYWNrZGljdCA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgQ3RsT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbnRyb2xIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghQ3RsT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvbnRyb2wgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoQ29udHJvbE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFDdGxPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ29udHJvbCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChDb250cm9sT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQ3RsT2JqX2RlYWxsb2MoQ29udHJvbE9iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrZGljdCk7Ci0JaWYgKHNlbGYtPm9iX2l0c2VsZilTZXRDb250cm9sUmVmZXJlbmNlKHNlbGYtPm9iX2l0c2VsZiwgKGxvbmcpMCk7IC8qIE1ha2UgaXQgZm9yZ2V0IGFib3V0IHVzICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBQeV9YREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrZGljdCk7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZilTZXRDb250cm9sUmVmZXJlbmNlKHNlbGYtPm9iX2l0c2VsZiwgKGxvbmcpMCk7IC8qIE1ha2UgaXQgZm9yZ2V0IGFib3V0IHVzICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGlsaXRlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sUGFydENvZGUgaGlsaXRlU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xQYXJ0Q29kZSBoaWxpdGVTdGF0ZTsKICNpZm5kZWYgSGlsaXRlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEhpbGl0ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpbGl0ZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCUhpbGl0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGhpbGl0ZVN0YXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXRlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1Nob3dDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhTaG93Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IaWRlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpZGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNDb250cm9sQWN0aXZlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNDb250cm9sQWN0aXZlCi0JUHlNYWNfUFJFQ0hFQ0soSXNDb250cm9sQWN0aXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0NvbnRyb2xBY3RpdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ29udHJvbEFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNDb250cm9sQWN0aXZlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Jc0NvbnRyb2xWaXNpYmxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNDb250cm9sVmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbFZpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ29udHJvbFZpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ29udHJvbFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzQ29udHJvbFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0FjdGl2YXRlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBBY3RpdmF0ZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhBY3RpdmF0ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKEFjdGl2YXRlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFjdGl2YXRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFjdGl2YXRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRGVhY3RpdmF0ZUNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgRGVhY3RpdmF0ZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhEZWFjdGl2YXRlQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVhY3RpdmF0ZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEZWFjdGl2YXRlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlYWN0aXZhdGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sVmlzaWJpbGl0eShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUJvb2xlYW4gaW5Jc1Zpc2libGU7Ci0JQm9vbGVhbiBpbkRvRHJhdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBCb29sZWFuIGluSXNWaXNpYmxlOworICAgIEJvb2xlYW4gaW5Eb0RyYXc7CiAjaWZuZGVmIFNldENvbnRyb2xWaXNpYmlsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFZpc2liaWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWaXNpYmlsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Eb0RyYXcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbFZpc2liaWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc1Zpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRG9EcmF3KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklzVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRG9EcmF3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xWaXNpYmlsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNWaXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRvRHJhdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzQ29udHJvbEVuYWJsZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc0NvbnRyb2xFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNDb250cm9sRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNDb250cm9sRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNDb250cm9sRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNDb250cm9sRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRW5hYmxlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBFbmFibGVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEVuYWJsZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmFibGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9EaXNhYmxlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBEaXNhYmxlQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKERpc2FibGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc2FibGVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlzYWJsZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0RyYXcxQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERyYXcxQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKERyYXcxQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhdzFDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3MUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3MUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRCZXN0Q29udHJvbFJlY3QoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IG91dFJlY3Q7Ci0JU0ludDE2IG91dEJhc2VMaW5lT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3Qgb3V0UmVjdDsKKyAgICBTSW50MTYgb3V0QmFzZUxpbmVPZmZzZXQ7CiAjaWZuZGVmIEdldEJlc3RDb250cm9sUmVjdAotCVB5TWFjX1BSRUNIRUNLKEdldEJlc3RDb250cm9sUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0QmVzdENvbnRyb2xSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QmVzdENvbnRyb2xSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCYXNlTGluZU9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIG91dEJhc2VMaW5lT2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEJlc3RDb250cm9sUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QmFzZUxpbmVPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCYXNlTGluZU9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xGb250U3R5bGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sRm9udFN0eWxlUmVjIGluU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbEZvbnRTdHlsZVJlYyBpblN0eWxlOwogI2lmbmRlZiBTZXRDb250cm9sRm9udFN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbEZvbnRTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbEZvbnRTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJmluU3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbEZvbnRTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJmluU3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbEZvbnRTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0eWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3Q29udHJvbEluQ3VycmVudFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURyYXdDb250cm9sSW5DdXJyZW50UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdDb250cm9sSW5DdXJyZW50UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldFVwQ29udHJvbEJhY2tncm91bmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5EZXB0aDsKLQlCb29sZWFuIGluSXNDb2xvckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5EZXB0aDsKKyAgICBCb29sZWFuIGluSXNDb2xvckRldmljZTsKICNpZm5kZWYgU2V0VXBDb250cm9sQmFja2dyb3VuZAotCVB5TWFjX1BSRUNIRUNLKFNldFVwQ29udHJvbEJhY2tncm91bmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFVwQ29udHJvbEJhY2tncm91bmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNDb2xvckRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRVcENvbnRyb2xCYWNrZ3JvdW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklzQ29sb3JEZXZpY2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0VXBDb250cm9sQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0VXBDb250cm9sVGV4dENvbG9yKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluRGVwdGg7Ci0JQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluRGVwdGg7CisgICAgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2U7CiAjaWZuZGVmIFNldFVwQ29udHJvbFRleHRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFNldFVwQ29udHJvbFRleHRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VXBDb250cm9sVGV4dENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklzQ29sb3JEZXZpY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0VXBDb250cm9sVGV4dENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc0NvbG9yRGV2aWNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jc0NvbG9yRGV2aWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFVwQ29udHJvbFRleHRDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNDb2xvckRldmljZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0RyYWdDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHN0YXJ0UG9pbnQ7Ci0JUmVjdCBsaW1pdFJlY3Q7Ci0JUmVjdCBzbG9wUmVjdDsKLQlEcmFnQ29uc3RyYWludCBheGlzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBzdGFydFBvaW50OworICAgIFJlY3QgbGltaXRSZWN0OworICAgIFJlY3Qgc2xvcFJlY3Q7CisgICAgRHJhZ0NvbnN0cmFpbnQgYXhpczsKICNpZm5kZWYgRHJhZ0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhEcmFnQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhZ0NvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mSCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQb2ludCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmxpbWl0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNsb3BSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYXhpcykpCi0JCXJldHVybiBOVUxMOwotCURyYWdDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgc3RhcnRQb2ludCwKLQkgICAgICAgICAgICAmbGltaXRSZWN0LAotCSAgICAgICAgICAgICZzbG9wUmVjdCwKLQkgICAgICAgICAgICBheGlzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmxpbWl0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNsb3BSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXhpcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYWdDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKKyAgICAgICAgICAgICAgICAmbGltaXRSZWN0LAorICAgICAgICAgICAgICAgICZzbG9wUmVjdCwKKyAgICAgICAgICAgICAgICBheGlzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1Rlc3RDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xQYXJ0Q29kZSBfcnY7Ci0JUG9pbnQgdGVzdFBvaW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sUGFydENvZGUgX3J2OworICAgIFBvaW50IHRlc3RQb2ludDsKICNpZm5kZWYgVGVzdENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhUZXN0Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGVzdENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQb2ludCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRlc3RDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGVzdFBvaW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFBvaW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGVzdENvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0UG9pbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IGluV2hlcmU7Ci0JQm9vbGVhbiBtZW51RGlzcGxheWVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBvaW50IGluV2hlcmU7CisgICAgQm9vbGVhbiBtZW51RGlzcGxheWVkOwogI2lmbmRlZiBIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljawotCVB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xDb250ZXh0dWFsTWVudUNsaWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5XaGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudURpc3BsYXllZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgbWVudURpc3BsYXllZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluV2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVEaXNwbGF5ZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVEaXNwbGF5ZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgaW5XaGVyZTsKLQlFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVyczsKLQlDbGlja0FjdGl2YXRpb25SZXN1bHQgb3V0UmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBvaW50IGluV2hlcmU7CisgICAgRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnM7CisgICAgQ2xpY2tBY3RpdmF0aW9uUmVzdWx0IG91dFJlc3VsdDsKICNpZm5kZWYgR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xDbGlja0FjdGl2YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xDbGlja0FjdGl2YXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbldoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Nb2RpZmllcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3VsdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVzdWx0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9IYW5kbGVDb250cm9sS2V5KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xQYXJ0Q29kZSBfcnY7Ci0JU0ludDE2IGluS2V5Q29kZTsKLQlTSW50MTYgaW5DaGFyQ29kZTsKLQlFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbFBhcnRDb2RlIF9ydjsKKyAgICBTSW50MTYgaW5LZXlDb2RlOworICAgIFNJbnQxNiBpbkNoYXJDb2RlOworICAgIEV2ZW50TW9kaWZpZXJzIGluTW9kaWZpZXJzOwogI2lmbmRlZiBIYW5kbGVDb250cm9sS2V5Ci0JUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbEtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbEtleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5LZXlDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5DaGFyQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSGFuZGxlQ29udHJvbEtleShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5LZXlDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFyQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluTW9kaWZpZXJzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5DaGFyQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSGFuZGxlQ29udHJvbEtleShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5LZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFyQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kaWZpZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSGFuZGxlQ29udHJvbFNldEN1cnNvcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBvaW50IGxvY2FsUG9pbnQ7Ci0JRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzOwotCUJvb2xlYW4gY3Vyc29yV2FzU2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFBvaW50IGxvY2FsUG9pbnQ7CisgICAgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzOworICAgIEJvb2xlYW4gY3Vyc29yV2FzU2V0OwogI2lmbmRlZiBIYW5kbGVDb250cm9sU2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbFNldEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGFuZGxlQ29udHJvbFNldEN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvY2FsUG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSGFuZGxlQ29udHJvbFNldEN1cnNvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJzb3JXYXNTZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIGN1cnNvcldhc1NldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2NhbFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhhbmRsZUNvbnRyb2xTZXRDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29yV2FzU2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JXYXNTZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Nb3ZlQ29udHJvbChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgaDsKLQlTSW50MTYgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IGg7CisgICAgU0ludDE2IHY7CiAjaWZuZGVmIE1vdmVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soTW92ZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBoLAotCSAgICAgICAgICAgIHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1vdmVDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICB2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NpemVDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB3OwotCVNJbnQxNiBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgdzsKKyAgICBTSW50MTYgaDsKICNpZm5kZWYgU2l6ZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhTaXplQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2l6ZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlTaXplQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIHcsCi0JICAgICAgICAgICAgaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2l6ZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgIGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFRpdGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSB0aXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHRpdGxlOwogI2lmbmRlZiBTZXRDb250cm9sVGl0bGUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVGl0bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgdGl0bGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGl0bGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFRpdGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSB0aXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHRpdGxlOwogI2lmbmRlZiBHZXRDb250cm9sVGl0bGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVGl0bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Q29udHJvbFRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIHRpdGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aXRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENvbnRyb2xUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICB0aXRsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgdGl0bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sVGl0bGVXaXRoQ0ZTdHJpbmcoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKICNpZm5kZWYgU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVGl0bGVXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0NvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIG91dFN0cmluZzsKICNpZm5kZWYgQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhDb3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sVmFsdWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBuZXdWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IG5ld1ZhbHVlOwogI2lmbmRlZiBTZXRDb250cm9sVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIG5ld1ZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sTWluaW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sTWluaW11bQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xNaW5pbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sTWluaW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbE1pbmltdW0oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sTWluaW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgbmV3TWluaW11bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IG5ld01pbmltdW07CiAjaWZuZGVmIFNldENvbnRyb2xNaW5pbXVtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbE1pbmltdW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xNaW5pbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TWluaW11bSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgbmV3TWluaW11bSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TWluaW11bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgbmV3TWluaW11bSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sTWF4aW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sTWF4aW11bQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xNYXhpbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sTWF4aW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbE1heGltdW0oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sTWF4aW11bShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgbmV3TWF4aW11bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IG5ld01heGltdW07CiAjaWZuZGVmIFNldENvbnRyb2xNYXhpbXVtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbE1heGltdW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xNYXhpbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TWF4aW11bSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgbmV3TWF4aW11bSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TWF4aW11bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgbmV3TWF4aW11bSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sVmlld1NpemUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbFZpZXdTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZpZXdTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVmlld1NpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xWaWV3U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbFZpZXdTaXplKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sVmlld1NpemUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIG5ld1ZpZXdTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgbmV3Vmlld1NpemU7CiAjaWZuZGVmIFNldENvbnRyb2xWaWV3U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xWaWV3U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFZpZXdTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3Vmlld1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sVmlld1NpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgbmV3Vmlld1NpemUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZpZXdTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbFZpZXdTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZpZXdTaXplKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2wzMkJpdFZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2wzMkJpdFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbDMyQml0VmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2wzMkJpdFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sMzJCaXRWYWx1ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbDMyQml0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2wzMkJpdFZhbHVlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBuZXdWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIG5ld1ZhbHVlOwogI2lmbmRlZiBTZXRDb250cm9sMzJCaXRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sMzJCaXRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1ZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbDMyQml0VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBuZXdWYWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDb250cm9sMzJCaXRWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1ZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2wzMkJpdE1heGltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbDMyQml0TWF4aW11bQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2wzMkJpdE1heGltdW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2wzMkJpdE1heGltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2wzMkJpdE1heGltdW0oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2wzMkJpdE1heGltdW0oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2wzMkJpdE1heGltdW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIG5ld01heGltdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBuZXdNYXhpbXVtOwogI2lmbmRlZiBTZXRDb250cm9sMzJCaXRNYXhpbXVtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbDMyQml0TWF4aW11bSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbDMyQml0TWF4aW11bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01heGltdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sMzJCaXRNYXhpbXVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBuZXdNYXhpbXVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNYXhpbXVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbDMyQml0TWF4aW11bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TWF4aW11bSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sMzJCaXRNaW5pbXVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2wzMkJpdE1pbmltdW0KLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRNaW5pbXVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sMzJCaXRNaW5pbXVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sMzJCaXRNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sMzJCaXRNaW5pbXVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sMzJCaXRNaW5pbXVtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBuZXdNaW5pbXVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgbmV3TWluaW11bTsKICNpZm5kZWYgU2V0Q29udHJvbDMyQml0TWluaW11bQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdE1pbmltdW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2wzMkJpdE1pbmltdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNaW5pbXVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbDMyQml0TWluaW11bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgbmV3TWluaW11bSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TWluaW11bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2wzMkJpdE1pbmltdW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01pbmltdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNWYWxpZENvbnRyb2xIYW5kbGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBJc1ZhbGlkQ29udHJvbEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKElzVmFsaWRDb250cm9sSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1ZhbGlkQ29udHJvbEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNWYWxpZENvbnRyb2xIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVmFsaWRDb250cm9sSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sSUQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDb250cm9sSUQgaW5JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDb250cm9sSUQgaW5JRDsKICNpZm5kZWYgU2V0Q29udHJvbElECi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9Db252ZXJ0LCAmaW5JRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDb250cm9sSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZpbklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29udHJvbElEX0NvbnZlcnQsICZpbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmluSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sSUQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDb250cm9sSUQgb3V0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ29udHJvbElEIG91dElEOwogI2lmbmRlZiBHZXRDb250cm9sSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbnRyb2xJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJm91dElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlDb250cm9sSURfTmV3LCAmb3V0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9OZXcsICZvdXRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xDb21tYW5kSUQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGluQ29tbWFuZElEOwogI2lmbmRlZiBTZXRDb250cm9sQ29tbWFuZElECi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbENvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldENvbnRyb2xDb21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sQ29tbWFuZElEKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIG91dENvbW1hbmRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgb3V0Q29tbWFuZElEOwogI2lmbmRlZiBHZXRDb250cm9sQ29tbWFuZElECi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbENvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbnRyb2xDb21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29tbWFuZElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDb21tYW5kSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbENvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb21tYW5kSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dENvbW1hbmRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIHByb3BlcnR5VGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIHByb3BlcnR5VGFnOwogI2lmbmRlZiBSZW1vdmVDb250cm9sUHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVDb250cm9sUHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZUNvbnRyb2xQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVDb250cm9sUHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVDb250cm9sUHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIHByb3BlcnR5VGFnOwotCVVJbnQzMiBhdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIHByb3BlcnR5VGFnOworICAgIFVJbnQzMiBhdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIHByb3BlcnR5VGFnOwotCVVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQ7Ci0JVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIHByb3BlcnR5VGFnOworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQ7CisgICAgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyOwogI2lmbmRlZiBDaGFuZ2VDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvU2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlc1RvQ2xlYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1RvQ2xlYXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VDb250cm9sUHJvcGVydHlBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xSZWdpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDb250cm9sUGFydENvZGUgaW5QYXJ0OwotCVJnbkhhbmRsZSBvdXRSZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ29udHJvbFBhcnRDb2RlIGluUGFydDsKKyAgICBSZ25IYW5kbGUgb3V0UmVnaW9uOwogI2lmbmRlZiBHZXRDb250cm9sUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dFJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIG91dFJlZ2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRSZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZWdpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sVmFyaWFudChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sVmFyaWFudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xWYXJpYW50IF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbFZhcmlhbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sVmFyaWFudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFZhcmlhbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xWYXJpYW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sVmFyaWFudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbEFjdGlvbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQeU9iamVjdCogYWN0aW9uUHJvYzsKLQlVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0KiBhY3Rpb25Qcm9jOworICAgIFVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsKICNpZm5kZWYgU2V0Q29udHJvbEFjdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xBY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xBY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb25Qcm9jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbEFjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgbXlhY3Rpb25wcm9jX3VwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXNldGNhbGxiYWNrKChQeU9iamVjdCopX3NlbGYsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBhY3Rpb25Qcm9jLCAmY19jYWxsYmFjayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb25Qcm9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbEFjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgbXlhY3Rpb25wcm9jX3VwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHNldGNhbGxiYWNrKChQeU9iamVjdCopX3NlbGYsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBhY3Rpb25Qcm9jLCAmY19jYWxsYmFjayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xSZWZlcmVuY2UoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBkYXRhOwogI2lmbmRlZiBTZXRDb250cm9sUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbFJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sUmVmZXJlbmNlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDb250cm9sUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9FbWJlZENvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sSGFuZGxlIGluQ29udGFpbmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xIYW5kbGUgaW5Db250YWluZXI7CiAjaWZuZGVmIEVtYmVkQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEVtYmVkQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW1iZWRDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkNvbnRhaW5lcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbWJlZENvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGluQ29udGFpbmVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW1iZWRDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbnRhaW5lcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0F1dG9FbWJlZENvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBBdXRvRW1iZWRDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQXV0b0VtYmVkQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQXV0b0VtYmVkQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXV0b0VtYmVkQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQXV0b0VtYmVkQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0U3VwZXJDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbEhhbmRsZSBvdXRQYXJlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbEhhbmRsZSBvdXRQYXJlbnQ7CiAjaWZuZGVmIEdldFN1cGVyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEdldFN1cGVyQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0U3VwZXJDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U3VwZXJDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb3V0UGFyZW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0UGFyZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFN1cGVyQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcmVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dFBhcmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0NvdW50U3ViQ29udHJvbHMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVSW50MTYgb3V0TnVtQ2hpbGRyZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVUludDE2IG91dE51bUNoaWxkcmVuOwogI2lmbmRlZiBDb3VudFN1YkNvbnRyb2xzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnRTdWJDb250cm9scyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ291bnRTdWJDb250cm9scyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvdW50U3ViQ29udHJvbHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TnVtQ2hpbGRyZW4pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE51bUNoaWxkcmVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvdW50U3ViQ29udHJvbHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TnVtQ2hpbGRyZW4pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE51bUNoaWxkcmVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0SW5kZXhlZFN1YkNvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVSW50MTYgaW5JbmRleDsKLQlDb250cm9sSGFuZGxlIG91dFN1YkNvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVUludDE2IGluSW5kZXg7CisgICAgQ29udHJvbEhhbmRsZSBvdXRTdWJDb250cm9sOwogI2lmbmRlZiBHZXRJbmRleGVkU3ViQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEdldEluZGV4ZWRTdWJDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbmRleGVkU3ViQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SW5kZXhlZFN1YkNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN1YkNvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRTdWJDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SW5kZXhlZFN1YkNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN1YkNvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRTdWJDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbFN1cGVydmlzb3IoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlDb250cm9sSGFuZGxlIGluQm9zczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBDb250cm9sSGFuZGxlIGluQm9zczsKICNpZm5kZWYgU2V0Q29udHJvbFN1cGVydmlzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sU3VwZXJ2aXNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFN1cGVydmlzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQm9zcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDb250cm9sU3VwZXJ2aXNvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJvc3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX0NvbnZlcnQsICZpbkJvc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q29udHJvbFN1cGVydmlzb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Cb3NzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbEZlYXR1cmVzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDMyIG91dEZlYXR1cmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQzMiBvdXRGZWF0dXJlczsKICNpZm5kZWYgR2V0Q29udHJvbEZlYXR1cmVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbEZlYXR1cmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sRmVhdHVyZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sRmVhdHVyZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGZWF0dXJlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmVhdHVyZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbEZlYXR1cmVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmVhdHVyZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZlYXR1cmVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbERhdGFTaXplKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlTaXplIG91dE1heFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbFBhcnRDb2RlIGluUGFydDsKKyAgICBSZXNUeXBlIGluVGFnTmFtZTsKKyAgICBTaXplIG91dE1heFNpemU7CiAjaWZuZGVmIEdldENvbnRyb2xEYXRhU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xEYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbERhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNYXhTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWF4U2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TWF4U2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEcmFnVHJhY2tpbmdNZXNzYWdlIGluTWVzc2FnZTsKLQlEcmFnUmVmZXJlbmNlIGluRHJhZzsKLQlCb29sZWFuIG91dExpa2VzRHJhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEcmFnVHJhY2tpbmdNZXNzYWdlIGluTWVzc2FnZTsKKyAgICBEcmFnUmVmZXJlbmNlIGluRHJhZzsKKyAgICBCb29sZWFuIG91dExpa2VzRHJhZzsKICNpZm5kZWYgSGFuZGxlQ29udHJvbERyYWdUcmFja2luZwotCVB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaW5EcmFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EcmFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRMaWtlc0RyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dExpa2VzRHJhZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaW5EcmFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5EcmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRMaWtlc0RyYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dExpa2VzRHJhZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURyYWdSZWZlcmVuY2UgaW5EcmFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIERyYWdSZWZlcmVuY2UgaW5EcmFnOwogI2lmbmRlZiBIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUKLQlQeU1hY19QUkVDSEVDSyhIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEhhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmluRHJhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX0NvbnZlcnQsICZpbkRyYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaW5UcmFja3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBpblRyYWNrczsKICNpZm5kZWYgU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRyYWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRyYWNrcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRyYWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRyYWNrcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0lzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIG91dFRyYWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIG91dFRyYWNrczsKICNpZm5kZWYgSXNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYWNrcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0VHJhY2tzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJhY2tzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRUcmFja3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sQm91bmRzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgR2V0Q29udHJvbEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldENvbnRyb2xCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Q29udHJvbEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9Jc0NvbnRyb2xIaWxpdGVkKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNDb250cm9sSGlsaXRlZAotCVB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEhpbGl0ZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQ29udHJvbEhpbGl0ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzQ29udHJvbEhpbGl0ZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzQ29udHJvbEhpbGl0ZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xIaWxpdGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDE2IF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbEhpbGl0ZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xIaWxpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xIaWxpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldENvbnRyb2xPd25lcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBHZXRDb250cm9sT3duZXIKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sT3duZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xPd25lcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q29udHJvbE93bmVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbE93bmVyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0Q29udHJvbERhdGFIYW5kbGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbERhdGFIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sRGF0YUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbERhdGFIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xEYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbERhdGFIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SUQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldENvbnRyb2xQb3B1cE1lbnVJRAotCVB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xQb3B1cE1lbnVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFBvcHVwTWVudUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDb250cm9sUG9wdXBNZW51SUQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENvbnRyb2xQb3B1cE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbERhdGFIYW5kbGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIGRhdGFIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBkYXRhSGFuZGxlOwogI2lmbmRlZiBTZXRDb250cm9sRGF0YUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xEYXRhSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDb250cm9sRGF0YUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldENvbnRyb2xEYXRhSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbERhdGFIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSGFuZGxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xCb3VuZHMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBTZXRDb250cm9sQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgcG9wdXBNZW51OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIHBvcHVwTWVudTsKICNpZm5kZWYgU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZwb3B1cE1lbnUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDb250cm9sUG9wdXBNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1cE1lbnUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJnBvcHVwTWVudSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwTWVudSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SUQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtZW51SUQ7CiAjaWZuZGVmIFNldENvbnRyb2xQb3B1cE1lbnVJRAotCVB5TWFjX1BSRUNIRUNLKFNldENvbnRyb2xQb3B1cE1lbnVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q29udHJvbFBvcHVwTWVudUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q29udHJvbFBvcHVwTWVudUlEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIG1lbnVJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q29udHJvbFBvcHVwTWVudUlEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVVJbnQxNiBvdXRWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVSW50MTYgb3V0VmFsdWU7CiAjaWZuZGVmIEdldEJldmVsQnV0dG9uTWVudVZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJldmVsQnV0dG9uTWVudVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFZhbHVlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRWYWx1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VmFsdWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFZhbHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5WYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5WYWx1ZTsKICNpZm5kZWYgU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEJldmVsQnV0dG9uTWVudVZhbHVlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZhbHVlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTWVudUhhbmRsZSBvdXRIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTWVudUhhbmRsZSBvdXRIYW5kbGU7CiAjaWZuZGVmIEdldEJldmVsQnV0dG9uTWVudUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdldEJldmVsQnV0dG9uTWVudUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGFuZGxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dEhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0SGFuZGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudDsKICNpZm5kZWYgU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbwotCVB5TWFjX1BSRUNIRUNLKFNldEJldmVsQnV0dG9uQ29udGVudEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEJldmVsQnV0dG9uQ29udGVudEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udGVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udGVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldEJldmVsQnV0dG9uVHJhbnNmb3JtKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKICNpZm5kZWYgU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0KLQlQeU1hY19QUkVDSEVDSyhTZXRCZXZlbEJ1dHRvblRyYW5zZm9ybSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRCZXZlbEJ1dHRvblRyYW5zZm9ybShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5WYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5WYWx1ZTsKICNpZm5kZWYgU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WYWx1ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WYWx1ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldFRhYkNvbnRlbnRSZWN0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmVjdCBvdXRDb250ZW50UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IG91dENvbnRlbnRSZWN0OwogI2lmbmRlZiBHZXRUYWJDb250ZW50UmVjdAotCVB5TWFjX1BSRUNIRUNLKEdldFRhYkNvbnRlbnRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUYWJDb250ZW50UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRhYkNvbnRlbnRSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250ZW50UmVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dENvbnRlbnRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFRhYkNvbnRlbnRSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250ZW50UmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dENvbnRlbnRSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0VGFiRW5hYmxlZChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpblRhYlRvSGlsaXRlOwotCUJvb2xlYW4gaW5FbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpblRhYlRvSGlsaXRlOworICAgIEJvb2xlYW4gaW5FbmFibGVkOwogI2lmbmRlZiBTZXRUYWJFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGFiRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VGFiRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRhYlRvSGlsaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5FbmFibGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRhYkVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICBpblRhYlRvSGlsaXRlLAotCSAgICAgICAgICAgICAgICAgICAgIGluRW5hYmxlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UYWJUb0hpbGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRW5hYmxlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUYWJFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWJUb0hpbGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbkVuYWJsZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRJbWFnZVdlbGxDb250ZW50SW5mbyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudDsKICNpZm5kZWYgU2V0SW1hZ2VXZWxsQ29udGVudEluZm8KLQlQeU1hY19QUkVDSEVDSyhTZXRJbWFnZVdlbGxDb250ZW50SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VXZWxsQ29udGVudEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluQ29udGVudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRJbWFnZVdlbGxDb250ZW50SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250ZW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5Db250ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEltYWdlV2VsbENvbnRlbnRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRlbnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXRJbWFnZVdlbGxUcmFuc2Zvcm0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uVHJhbnNmb3JtVHlwZSBpblRyYW5zZm9ybTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSBpblRyYW5zZm9ybTsKICNpZm5kZWYgU2V0SW1hZ2VXZWxsVHJhbnNmb3JtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VXZWxsVHJhbnNmb3JtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJbWFnZVdlbGxUcmFuc2Zvcm0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblRyYW5zZm9ybSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRJbWFnZVdlbGxUcmFuc2Zvcm0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVHJhbnNmb3JtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVHJhbnNmb3JtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEltYWdlV2VsbFRyYW5zZm9ybShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UcmFuc2Zvcm0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclZpZXdTdHlsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9TVHlwZSBzdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgc3R5bGU7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVmlld1N0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVmlld1N0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVmlld1N0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBzdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVmlld1N0eWxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIHN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBzdHlsZTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclZpZXdTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclZpZXdTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclZpZXdTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0VuYWJsZURhdGFCcm93c2VyRWRpdENvbW1hbmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JVUludDMyIGNvbW1hbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFVJbnQzMiBjb21tYW5kOwogI2lmbmRlZiBFbmFibGVEYXRhQnJvd3NlckVkaXRDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFbmFibGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFbmFibGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29tbWFuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29tbWFuZDsKICNpZm5kZWYgRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQKLQlQeU1hY19QUkVDSEVDSyhFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21tYW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEV4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgZmlyc3Q7Ci0JVUludDMyIGxhc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGZpcnN0OworICAgIFVJbnQzMiBsYXN0OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcgotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmaXJzdCwKLQkgICAgICAgICAgICAgICAgICAgICBsYXN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhc3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGRpcmVjdGlvbjsKLQlCb29sZWFuIGV4dGVuZFNlbGVjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgZGlyZWN0aW9uOworICAgIEJvb2xlYW4gZXh0ZW5kU2VsZWN0aW9uOwogI2lmbmRlZiBNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IKLQlQeU1hY19QUkVDSEVDSyhNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZleHRlbmRTZWxlY3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRTZWxlY3Rpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuZFNlbGVjdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZFNlbGVjdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX09wZW5EYXRhQnJvd3NlckNvbnRhaW5lcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb250YWluZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbnRhaW5lcjsKICNpZm5kZWYgT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcGVuRGF0YUJyb3dzZXJDb250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9wZW5EYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb250YWluZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbnRhaW5lcjsKICNpZm5kZWYgQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lcgotCVB5TWFjX1BSRUNIRUNLKENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlRGF0YUJyb3dzZXJDb250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NvcnREYXRhQnJvd3NlckNvbnRhaW5lcihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb250YWluZXI7Ci0JQm9vbGVhbiBzb3J0Q2hpbGRyZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGNvbnRhaW5lcjsKKyAgICBCb29sZWFuIHNvcnRDaGlsZHJlbjsKICNpZm5kZWYgU29ydERhdGFCcm93c2VyQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soU29ydERhdGFCcm93c2VyQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTb3J0RGF0YUJyb3dzZXJDb250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmc29ydENoaWxkcmVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNvcnREYXRhQnJvd3NlckNvbnRhaW5lcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydENoaWxkcmVuKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3J0Q2hpbGRyZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU29ydERhdGFCcm93c2VyQ29udGFpbmVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0Q2hpbGRyZW4pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1zKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbnRhaW5lcjsKLQlCb29sZWFuIHJlY3Vyc2U7Ci0JVUludDMyIHN0YXRlOwotCUhhbmRsZSBpdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29udGFpbmVyOworICAgIEJvb2xlYW4gcmVjdXJzZTsKKyAgICBVSW50MzIgc3RhdGU7CisgICAgSGFuZGxlIGl0ZW1zOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29udGFpbmVyOwotCUJvb2xlYW4gcmVjdXJzZTsKLQlVSW50MzIgc3RhdGU7Ci0JVUludDMyIG51bUl0ZW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb250YWluZXI7CisgICAgQm9vbGVhbiByZWN1cnNlOworICAgIFVJbnQzMiBzdGF0ZTsKKyAgICBVSW50MzIgbnVtSXRlbXM7CiAjaWZuZGVmIEdldERhdGFCcm93c2VySXRlbUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUl0ZW1zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBudW1JdGVtcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3Vyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3Nlckl0ZW1Db3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtSXRlbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlVSW50MzIgaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgVUludDMyIGl0ZW07CiAjaWZuZGVmIElzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQKLQlQeU1hY19QUkVDSEVDSyhJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc0RhdGFCcm93c2VySXRlbVNlbGVjdGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQzMiBzdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaXRlbTsKKyAgICBVSW50MzIgc3RhdGU7CiAjaWZuZGVmIEdldERhdGFCcm93c2VySXRlbVN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySXRlbVN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1JldmVhbERhdGFCcm93c2VySXRlbShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQzMiBwcm9wZXJ0eUlEOwotCVVJbnQ4IG9wdGlvbnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHByb3BlcnR5SUQ7CisgICAgVUludDggb3B0aW9uczsKICNpZm5kZWYgUmV2ZWFsRGF0YUJyb3dzZXJJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soUmV2ZWFsRGF0YUJyb3dzZXJJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXZlYWxEYXRhQnJvd3Nlckl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZXZlYWxEYXRhQnJvd3Nlckl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXZlYWxEYXRhQnJvd3Nlckl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGFjdGl2ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIGFjdGl2ZTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyQWN0aXZlSXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGFjdGl2ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIGFjdGl2ZTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQWN0aXZlSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQWN0aXZlSXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0aXZlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyQWN0aXZlSXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbnNldFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbnNldFJlY3Q7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnNldFJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpbnNldFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnNldFJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpbnNldFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpbnNldFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmVjdCBpbnNldFJlY3Q7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnNldFJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpbnNldFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJTY3JvbGxCYXJJbnNldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnNldFJlY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZpbnNldFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhcmdldChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiB0YXJnZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHRhcmdldDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYXJnZXQKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhcmdldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYXJnZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhcmdldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhcmdldChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiB0YXJnZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHRhcmdldDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYXJnZXQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhcmdldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYXJnZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhcmdldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgb3JkZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IG9yZGVyOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclNvcnRPcmRlcgotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyU29ydE9yZGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNvcnRPcmRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9yZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyU29ydE9yZGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU29ydE9yZGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgb3JkZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IG9yZGVyOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNvcnRPcmRlcgotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU29ydE9yZGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNvcnRPcmRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU29ydE9yZGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3JkZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yZGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgdG9wOwotCVVJbnQzMiBsZWZ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiB0b3A7CisgICAgVUludDMyIGxlZnQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24KLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgdG9wOwotCVVJbnQzMiBsZWZ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiB0b3A7CisgICAgVUludDMyIGxlZnQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgbGVmdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBob3JpejsKLQlCb29sZWFuIHZlcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBob3JpejsKKyAgICBCb29sZWFuIHZlcnQ7CiAjaWZuZGVmIFNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycwotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmVydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiBob3JpejsKLQlCb29sZWFuIHZlcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBob3JpejsKKyAgICBCb29sZWFuIHZlcnQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIGhvcml6LAotCSAgICAgICAgICAgICAgICAgICAgIHZlcnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaXosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBwcm9wZXJ0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgcHJvcGVydHk7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyU29ydFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBwcm9wZXJ0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgcHJvcGVydHk7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyU29ydFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyU29ydFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBzZWxlY3Rpb25GbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgc2VsZWN0aW9uRmxhZ3M7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgc2VsZWN0aW9uRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHNlbGVjdGlvbkZsYWdzOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyU2VsZWN0aW9uRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHByb3BlcnR5OwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgcHJvcGVydHk7CisgICAgVUludDMyIGZsYWdzOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgcHJvcGVydHk7Ci0JVUludDMyIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBwcm9wZXJ0eTsKKyAgICBVSW50MzIgZmxhZ3M7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlckVkaXRUZXh0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgdGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiB0ZXh0OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlckVkaXRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0ZXh0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyRWRpdFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0ZXh0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyRWRpdFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfQ29weURhdGFCcm93c2VyRWRpdFRleHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiB0ZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIHRleHQ7CiAjaWZuZGVmIENvcHlEYXRhQnJvd3NlckVkaXRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soQ29weURhdGFCcm93c2VyRWRpdFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlEYXRhQnJvd3NlckVkaXRUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weURhdGFCcm93c2VyRWRpdFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIHRleHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weURhdGFCcm93c2VyRWRpdFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIHRleHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRUZXh0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZNdXRhYmxlU3RyaW5nUmVmIHRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmIHRleHQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyRWRpdFRleHQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckVkaXRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckVkaXRUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0ZXh0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyRWRpdFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlckVkaXRUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyRWRpdEl0ZW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHByb3BlcnR5OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlckVkaXRJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJFZGl0SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJFZGl0SXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJFZGl0SXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlckVkaXRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyRWRpdEl0ZW0oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MzIgcHJvcGVydHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHByb3BlcnR5OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckVkaXRJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJFZGl0SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJFZGl0SXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyRWRpdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyRWRpdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQzMiBwcm9wZXJ0eTsKLQlPU1R5cGUgcGFydDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaXRlbTsKKyAgICBVSW50MzIgcHJvcGVydHk7CisgICAgT1NUeXBlIHBhcnQ7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIEdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckl0ZW1QYXJ0Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnBhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW4oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb2x1bW47CiAjaWZuZGVmIFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBudW1Db2x1bW5zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBudW1Db2x1bW5zOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ29sdW1ucyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtQ29sdW1ucyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUNvbHVtbnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNvbHVtbnMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGhpbGl0ZVN0eWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBoaWxpdGVTdHlsZTsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZQotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlU3R5bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0eWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBoaWxpdGVTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaGlsaXRlU3R5bGU7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3SGlsaXRlU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaGlsaXRlU3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlU3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQxNiBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IGhlaWdodDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQxNiBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IGhlaWdodDsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQxNiB3aWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MTYgd2lkdGg7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgd2lkdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IHdpZHRoOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5XaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDE2IGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaXRlbTsKKyAgICBVSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaXRlbTsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpdGVtOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodAotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQxNiB3aWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQxNiB3aWR0aDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JVUludDE2IHdpZHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb2x1bW47CisgICAgVUludDE2IHdpZHRoOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zOwotCUJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gdmFyaWFibGVXaWR0aENvbHVtbnM7CisgICAgQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3M7CiAjaWZuZGVmIFNldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkKLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGhDb2x1bW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVIZWlnaHRSb3dzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoQ29sdW1ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUhlaWdodFJvd3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGhDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVIZWlnaHRSb3dzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUhlaWdodFJvd3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1uczsKLQlCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zOworICAgIEJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aENvbHVtbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSGVpZ2h0Um93cyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlV2lkdGhDb2x1bW5zLAotCSAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSGVpZ2h0Um93cyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlV2lkdGhDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUhlaWdodFJvd3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUhlaWdodFJvd3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiByb3c7Ci0JVUludDMyIGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHJvdzsKKyAgICBVSW50MzIgaXRlbTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpdGVtOwotCVVJbnQzMiByb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGl0ZW07CisgICAgVUludDMyIHJvdzsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGl0ZW07Ci0JVUludDMyIHJvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaXRlbTsKKyAgICBVSW50MzIgcm93OwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3cKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcm93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcm93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JVUludDMyIHBvc2l0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb2x1bW47CisgICAgVUludDMyIHBvc2l0aW9uOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbihDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBjb2x1bW47Ci0JVUludDMyIHBvc2l0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb2x1bW47CisgICAgVUludDMyIHBvc2l0aW9uOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblBvc2l0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgY29sdW1uOwotCVVJbnQzMiBwcm9wZXJ0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgY29sdW1uOworICAgIFVJbnQzMiBwcm9wZXJ0eTsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9BdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIEF1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnMKLQlQeU1hY19QUkVDSEVDSyhBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXV0b1NpemVEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1ucyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEF1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0FkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4oQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyBjb2x1bW5EZXNjOwotCVVJbnQzMiBwb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyBjb2x1bW5EZXNjOworICAgIFVJbnQzMiBwb3NpdGlvbjsKICNpZm5kZWYgQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbgotCVB5TWFjX1BSRUNIRUNLKEFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2NfQ29udmVydCwgJmNvbHVtbkRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbkRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZjb2x1bW5EZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2x1bW5EZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQxNiBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDE2IGhlaWdodDsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodAotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBoZWlnaHQ7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kOwogI2lmbmRlZiBTZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZVBsYWluQmFja2dyb3VuZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUGxhaW5CYWNrZ3JvdW5kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZVBsYWluQmFja2dyb3VuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlUGxhaW5CYWNrZ3JvdW5kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kOwogI2lmbmRlZiBHZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlUGxhaW5CYWNrZ3JvdW5kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICB1c2VQbGFpbkJhY2tncm91bmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VQbGFpbkJhY2tncm91bmQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBsYWluQmFja2dyb3VuZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKLQlCb29sZWFuIGV4cGFuZGFibGVSb3dzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb2x1bW47CisgICAgQm9vbGVhbiBleHBhbmRhYmxlUm93czsKICNpZm5kZWYgU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4KLQlQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXhwYW5kYWJsZVJvd3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlUm93cyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwYW5kYWJsZVJvd3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRhYmxlUm93cyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIGNvbHVtbjsKLQlCb29sZWFuIGV4cGFuZGFibGVSb3dzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBjb2x1bW47CisgICAgQm9vbGVhbiBleHBhbmRhYmxlUm93czsKICNpZm5kZWYgR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4KLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sdW1uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwYW5kYWJsZVJvd3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sCi0JICAgICAgICAgICAgICAgICAgICAgZXhwYW5kYWJsZVJvd3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGFuZGFibGVSb3dzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGFibGVSb3dzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUhhbmRsZSBwYXRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEhhbmRsZSBwYXRoOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGF0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBhdGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIHBhdGhMZW5ndGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIHBhdGhMZW5ndGg7CiAjaWZuZGVmIEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoTGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoTGVuZ3RoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwYXRoTGVuZ3RoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aExlbmd0aCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aExlbmd0aCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIHByb3BlcnR5VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlUeXBlOwogI2lmbmRlZiBTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZQotCVB5TWFjX1BSRUNIRUNLKFNldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIHByb3BlcnR5VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlUeXBlOwogI2lmbmRlZiBHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgcHJvcGVydHlUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgcHJvcGVydHlUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfYXNfUmVzb3VyY2UoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgYXNfUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhhc19SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sUmVjdChDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgR2V0Q29udHJvbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHZXRDb250cm9sUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldENvbnRyb2xSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJnJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENvbnRyb2xSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJnJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0Rpc3Bvc2VDb250cm9sKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgaWYgKCBfc2VsZi0+b2JfaXRzZWxmICkgewotCSAgICAgICAgICAgICAgICBTZXRDb250cm9sUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLwotCSAgICAgICAgICAgICAgICBEaXNwb3NlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JICAgICAgICB9Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIF9zZWxmLT5vYl9pdHNlbGYgKSB7CisgICAgICAgICAgICBTZXRDb250cm9sUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLworICAgICAgICAgICAgRGlzcG9zZUNvbnRyb2woX3NlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9UcmFja0NvbnRyb2woQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JQ29udHJvbFBhcnRDb2RlIF9ydjsKLQlQb2ludCBzdGFydFBvaW50OwotCUNvbnRyb2xBY3Rpb25VUFAgdXBwID0gMDsKLQlQeU9iamVjdCAqY2FsbGJhY2sgPSAwOworICAgIENvbnRyb2xQYXJ0Q29kZSBfcnY7CisgICAgUG9pbnQgc3RhcnRQb2ludDsKKyAgICBDb250cm9sQWN0aW9uVVBQIHVwcCA9IDA7CisgICAgUHlPYmplY3QgKmNhbGxiYWNrID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mfE8iLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsICZjYWxsYmFjaykpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlpZiAoY2FsbGJhY2sgJiYgY2FsbGJhY2sgIT0gUHlfTm9uZSkgewotCSAgICAgICAgaWYgKFB5SW50X0NoZWNrKGNhbGxiYWNrKSAmJiBQeUludF9BU19MT05HKGNhbGxiYWNrKSA9PSAtMSkKLQkgICAgICAgICAgICAgICAgdXBwID0gKENvbnRyb2xBY3Rpb25VUFApLTE7Ci0JICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgICAgICAgc2V0dHJhY2tmdW5jKGNhbGxiYWNrKTsKLQkgICAgICAgICAgICAgICAgdXBwID0gbXl0cmFja2VyX3VwcDsKLQkgICAgICAgIH0KLQl9Ci0JX3J2ID0gVHJhY2tDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCi0JICAgICAgICAgICAgICAgICAgIHVwcCk7Ci0JY2xydHJhY2tmdW5jKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ8TyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQb2ludCwgJmNhbGxiYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9IFB5X05vbmUpIHsKKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKGNhbGxiYWNrKSAmJiBQeUludF9BU19MT05HKGNhbGxiYWNrKSA9PSAtMSkKKyAgICAgICAgICAgIHVwcCA9IChDb250cm9sQWN0aW9uVVBQKS0xOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNldHRyYWNrZnVuYyhjYWxsYmFjayk7CisgICAgICAgICAgICB1cHAgPSBteXRyYWNrZXJfdXBwOworICAgICAgICB9CisgICAgfQorICAgIF9ydiA9IFRyYWNrQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICB1cHApOworICAgIGNscnRyYWNrZnVuYygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX0hhbmRsZUNvbnRyb2xDbGljayhDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlDb250cm9sUGFydENvZGUgX3J2OwotCVBvaW50IHN0YXJ0UG9pbnQ7Ci0JU0ludDE2IG1vZGlmaWVyczsKLQlDb250cm9sQWN0aW9uVVBQIHVwcCA9IDA7Ci0JUHlPYmplY3QgKmNhbGxiYWNrID0gMDsKKyAgICBDb250cm9sUGFydENvZGUgX3J2OworICAgIFBvaW50IHN0YXJ0UG9pbnQ7CisgICAgU0ludDE2IG1vZGlmaWVyczsKKyAgICBDb250cm9sQWN0aW9uVVBQIHVwcCA9IDA7CisgICAgUHlPYmplY3QgKmNhbGxiYWNrID0gMDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maHxPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2spKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKGNhbGxiYWNrICYmIGNhbGxiYWNrICE9IFB5X05vbmUpIHsKLQkgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCi0JICAgICAgICAgICAgICAgIHVwcCA9IChDb250cm9sQWN0aW9uVVBQKS0xOwotCSAgICAgICAgZWxzZSB7Ci0JICAgICAgICAgICAgICAgIHNldHRyYWNrZnVuYyhjYWxsYmFjayk7Ci0JICAgICAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7Ci0JICAgICAgICB9Ci0JfQotCV9ydiA9IEhhbmRsZUNvbnRyb2xDbGljayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBzdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgIHVwcCk7Ci0JY2xydHJhY2tmdW5jKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZofE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxsYmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7CisgICAgICAgIGlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCisgICAgICAgICAgICB1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOworICAgICAgICAgICAgdXBwID0gbXl0cmFja2VyX3VwcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfcnYgPSBIYW5kbGVDb250cm9sQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICB1cHApOworICAgIGNscnRyYWNrZnVuYygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX1NldENvbnRyb2xEYXRhKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlTaXplIGJ1ZmZlclNpemU7Ci0JUHRyIGJ1ZmZlcjsKKyAgICBPU0VyciBfZXJyOworICAgIENvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7CisgICAgUmVzVHlwZSBpblRhZ05hbWU7CisgICAgU2l6ZSBidWZmZXJTaXplOworICAgIFB0ciBidWZmZXI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlciwgJmJ1ZmZlclNpemUpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZidWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlfZXJyID0gU2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgICAgX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwogCi0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sRGF0YShDb250cm9sT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU0VyciBfZXJyOwotCUNvbnRyb2xQYXJ0Q29kZSBpblBhcnQ7Ci0JUmVzVHlwZSBpblRhZ05hbWU7Ci0JU2l6ZSBidWZmZXJTaXplOwotCVB0ciBidWZmZXI7Ci0JU2l6ZSBvdXRTaXplOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbFBhcnRDb2RlIGluUGFydDsKKyAgICBSZXNUeXBlIGluVGFnTmFtZTsKKyAgICBTaXplIGJ1ZmZlclNpemU7CisgICAgUHRyIGJ1ZmZlcjsKKyAgICBTaXplIG91dFNpemU7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEgKi8KLQlfZXJyID0gR2V0Q29udHJvbERhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JYnVmZmVyID0gUHlNZW1fTkVXKGNoYXIsIGJ1ZmZlclNpemUpOwotCWlmIChidWZmZXIgPT0gTlVMTCkKLQkgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOworICAgIC8qIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgZGF0YSAqLworICAgIF9lcnIgPSBHZXRDb250cm9sRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIGJ1ZmZlciA9IFB5TWVtX05FVyhjaGFyLCBidWZmZXJTaXplKTsKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpCisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCi0JX2VyciA9IEdldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKKyAgICBfZXJyID0gR2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNpemUpOwogCi0JaWYgKF9lcnIgIT0gbm9FcnIpIHsKLQkgICAgICAgIFB5TWVtX0RFTChidWZmZXIpOwotCSAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLCBidWZmZXIsIG91dFNpemUpOwotCVB5TWVtX0RFTChidWZmZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmIChfZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5TWVtX0RFTChidWZmZXIpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsIGJ1ZmZlciwgb3V0U2l6ZSk7CisgICAgUHlNZW1fREVMKGJ1ZmZlcik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCU9TRXJyIF9lcnI7Ci0JQ29udHJvbFBhcnRDb2RlIGluUGFydDsKLQlSZXNUeXBlIGluVGFnTmFtZTsKLQlIYW5kbGUgYnVmZmVyOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbFBhcnRDb2RlIGluUGFydDsKKyAgICBSZXNUeXBlIGluVGFnTmFtZTsKKyAgICBIYW5kbGUgYnVmZmVyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmYnVmZmVyKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmJ1ZmZlcikpCisgICAgICAgIHJldHVybiBOVUxMOwogCi0JX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYnVmZmVyKSwKLQkgICAgICAgICAgICAgICAgICAgICAgKFB0cikmYnVmZmVyKTsKKyAgICBfZXJyID0gU2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZidWZmZXIpOwogCi0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bE9ial9HZXRDb250cm9sRGF0YV9IYW5kbGUoQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NFcnIgX2VycjsKLQlDb250cm9sUGFydENvZGUgaW5QYXJ0OwotCVJlc1R5cGUgaW5UYWdOYW1lOwotCVNpemUgYnVmZmVyU2l6ZTsKLQlIYW5kbGUgaGRsOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29udHJvbFBhcnRDb2RlIGluUGFydDsKKyAgICBSZXNUeXBlIGluVGFnTmFtZTsKKyAgICBTaXplIGJ1ZmZlclNpemU7CisgICAgSGFuZGxlIGhkbDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSkpCi0JICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblRhZ05hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCS8qIENoZWNrIGl0IGlzIGhhbmRsZS1zaXplZCAqLwotCV9lcnIgPSBHZXRDb250cm9sRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikKLQkgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlpZiAoYnVmZmVyU2l6ZSAhPSBzaXplb2YoSGFuZGxlKSkgewotCSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIkdldENvbnRyb2xEYXRhU2l6ZSgpICE9IHNpemVvZihIYW5kbGUpIik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9CisgICAgLyogQ2hlY2sgaXQgaXMgaGFuZGxlLXNpemVkICovCisgICAgX2VyciA9IEdldENvbnRyb2xEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgaWYgKGJ1ZmZlclNpemUgIT0gc2l6ZW9mKEhhbmRsZSkpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIkdldENvbnRyb2xEYXRhU2l6ZSgpICE9IHNpemVvZihIYW5kbGUpIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCV9lcnIgPSBHZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhhbmRsZSksCi0JICAgICAgICAgICAgICAgICAgICAgIChQdHIpJmhkbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOworICAgIF9lcnIgPSBHZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEhhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChQdHIpJmhkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOwogCi0JaWYgKF9lcnIgIT0gbm9FcnIpIHsKLQkgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgT3B0UmVzT2JqX05ldywgaGRsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoX2VyciAhPSBub0VycikgeworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIE9wdFJlc09ial9OZXcsIGhkbCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxPYmpfU2V0Q29udHJvbERhdGFfQ2FsbGJhY2soQ29udHJvbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NFcnIgX2VycjsKLQlDb250cm9sUGFydENvZGUgaW5QYXJ0OwotCVJlc1R5cGUgaW5UYWdOYW1lOwotCVB5T2JqZWN0ICpjYWxsYmFjazsKLQlVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7CisgICAgT1NFcnIgX2VycjsKKyAgICBDb250cm9sUGFydENvZGUgaW5QYXJ0OworICAgIFJlc1R5cGUgaW5UYWdOYW1lOworICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICBVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2spKQotCSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbGxiYWNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQlpZiAoIHNldGNhbGxiYWNrKChQeU9iamVjdCAqKV9zZWxmLCBpblRhZ05hbWUsIGNhbGxiYWNrLCAmY19jYWxsYmFjaykgPCAwICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNfY2FsbGJhY2spLAotCSAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZjX2NhbGxiYWNrKTsKKyAgICBpZiAoIHNldGNhbGxiYWNrKChQeU9iamVjdCAqKV9zZWxmLCBpblRhZ05hbWUsIGNhbGxiYWNrLCAmY19jYWxsYmFjaykgPCAwICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY19jYWxsYmFjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChQdHIpJmNfY2FsbGJhY2spOwogCi0JaWYgKF9lcnIgIT0gbm9FcnIpCi0JICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgQ3RsT2JqX21ldGhvZHNbXSA9IHsKLQl7IkhpbGl0ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hpbGl0ZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xQYXJ0Q29kZSBoaWxpdGVTdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IlNob3dDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TaG93Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSGlkZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hpZGVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJc0NvbnRyb2xBY3RpdmUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbEFjdGl2ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSXNDb250cm9sVmlzaWJsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sVmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQWN0aXZhdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BY3RpdmF0ZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRlYWN0aXZhdGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EZWFjdGl2YXRlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbFZpc2liaWxpdHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xWaXNpYmlsaXR5LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGluSXNWaXNpYmxlLCBCb29sZWFuIGluRG9EcmF3KSAtPiBOb25lIil9LAotCXsiSXNDb250cm9sRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRW5hYmxlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW5hYmxlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRGlzYWJsZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Rpc2FibGVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEcmF3MUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYXcxQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0QmVzdENvbnRyb2xSZWN0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXN0Q29udHJvbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0UmVjdCwgU0ludDE2IG91dEJhc2VMaW5lT2Zmc2V0KSIpfSwKLQl7IlNldENvbnRyb2xGb250U3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xGb250U3R5bGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbnRyb2xGb250U3R5bGVSZWMgaW5TdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdDb250cm9sSW5DdXJyZW50UG9ydCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTZXRVcENvbnRyb2xCYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRVcENvbnRyb2xCYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRVcENvbnRyb2xUZXh0Q29sb3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFVwQ29udHJvbFRleHRDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluRGVwdGgsIEJvb2xlYW4gaW5Jc0NvbG9yRGV2aWNlKSAtPiBOb25lIil9LAotCXsiRHJhZ0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RyYWdDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50LCBSZWN0IGxpbWl0UmVjdCwgUmVjdCBzbG9wUmVjdCwgRHJhZ0NvbnN0cmFpbnQgYXhpcykgLT4gTm9uZSIpfSwKLQl7IlRlc3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9UZXN0Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFBvaW50KSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCi0JeyJIYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbENvbnRleHR1YWxNZW51Q2xpY2ssIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGluV2hlcmUpIC0+IChCb29sZWFuIG1lbnVEaXNwbGF5ZWQpIil9LAotCXsiR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbENsaWNrQWN0aXZhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgaW5XaGVyZSwgRXZlbnRNb2RpZmllcnMgaW5Nb2RpZmllcnMpIC0+IChDbGlja0FjdGl2YXRpb25SZXN1bHQgb3V0UmVzdWx0KSIpfSwKLQl7IkhhbmRsZUNvbnRyb2xLZXkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xLZXksIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbktleUNvZGUsIFNJbnQxNiBpbkNoYXJDb2RlLCBFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVycykgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAotCXsiSGFuZGxlQ29udHJvbFNldEN1cnNvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbFNldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgbG9jYWxQb2ludCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBjdXJzb3JXYXNTZXQpIil9LAotCXsiTW92ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX01vdmVDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaCwgU0ludDE2IHYpIC0+IE5vbmUiKX0sCi0JeyJTaXplQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2l6ZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB3LCBTSW50MTYgaCkgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xUaXRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFRpdGxlLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgdGl0bGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sVGl0bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xUaXRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU3RyMjU1IHRpdGxlKSIpfSwKLQl7IlNldENvbnRyb2xUaXRsZVdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkNvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3B5Q29udHJvbFRpdGxlQXNDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKLQl7IkdldENvbnRyb2xWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFZhbHVlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgbmV3VmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sTWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE1pbmltdW0sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiU2V0Q29udHJvbE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xNaW5pbXVtLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgbmV3TWluaW11bSkgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sTWF4aW11bSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXRDb250cm9sTWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbE1heGltdW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBuZXdNYXhpbXVtKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbFZpZXdTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmlld1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiU2V0Q29udHJvbFZpZXdTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVmlld1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdWaWV3U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2wzMkJpdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCi0JeyJTZXRDb250cm9sMzJCaXRWYWx1ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdWYWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2wzMkJpdE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2wzMkJpdE1heGltdW0sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiU2V0Q29udHJvbDMyQml0TWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0TWF4aW11bSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDMyIG5ld01heGltdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sMzJCaXRNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sMzJCaXRNaW5pbXVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IlNldENvbnRyb2wzMkJpdE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2wzMkJpdE1pbmltdW0sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBuZXdNaW5pbXVtKSAtPiBOb25lIil9LAotCXsiSXNWYWxpZENvbnRyb2xIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzVmFsaWRDb250cm9sSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRDb250cm9sSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xJRCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbElEIGluSUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbElEIG91dElEKSIpfSwKLQl7IlNldENvbnRyb2xDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRDb21tYW5kSUQpIil9LAotCXsiUmVtb3ZlQ29udHJvbFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9SZW1vdmVDb250cm9sUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gKFVJbnQzMiBhdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NoYW5nZUNvbnRyb2xQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZywgVUludDMyIGF0dHJpYnV0ZXNUb1NldCwgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbFJlZ2lvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbFBhcnRDb2RlIGluUGFydCwgUmduSGFuZGxlIG91dFJlZ2lvbikgLT4gTm9uZSIpfSwKLQl7IkdldENvbnRyb2xWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmFyaWFudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbFZhcmlhbnQgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xBY3Rpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xBY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFB5T2JqZWN0KiBhY3Rpb25Qcm9jKSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbFJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDMyIGRhdGEpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkVtYmVkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW1iZWRDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQ29udGFpbmVyKSAtPiBOb25lIil9LAotCXsiQXV0b0VtYmVkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfQXV0b0VtYmVkQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiR2V0U3VwZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRTdXBlckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0UGFyZW50KSIpfSwKLQl7IkNvdW50U3ViQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NvdW50U3ViQ29udHJvbHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvdXROdW1DaGlsZHJlbikiKX0sCi0JeyJHZXRJbmRleGVkU3ViQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0SW5kZXhlZFN1YkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQxNiBpbkluZGV4KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRTdWJDb250cm9sKSIpfSwKLQl7IlNldENvbnRyb2xTdXBlcnZpc29yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sU3VwZXJ2aXNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbEhhbmRsZSBpbkJvc3MpIC0+IE5vbmUiKX0sCi0JeyJHZXRDb250cm9sRmVhdHVyZXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xGZWF0dXJlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dEZlYXR1cmVzKSIpfSwKLQl7IkdldENvbnRyb2xEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihDb250cm9sUGFydENvZGUgaW5QYXJ0LCBSZXNUeXBlIGluVGFnTmFtZSkgLT4gKFNpemUgb3V0TWF4U2l6ZSkiKX0sCi0JeyJIYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sRHJhZ1RyYWNraW5nLCAxLAotCSBQeURvY19TVFIoIihEcmFnVHJhY2tpbmdNZXNzYWdlIGluTWVzc2FnZSwgRHJhZ1JlZmVyZW5jZSBpbkRyYWcpIC0+IChCb29sZWFuIG91dExpa2VzRHJhZykiKX0sCi0JeyJIYW5kbGVDb250cm9sRHJhZ1JlY2VpdmUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRHJhZ1JlZmVyZW5jZSBpbkRyYWcpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5UcmFja3MpIC0+IE5vbmUiKX0sCi0JeyJJc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG91dFRyYWNrcykiKX0sCi0JeyJHZXRDb250cm9sQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sQm91bmRzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCi0JeyJJc0NvbnRyb2xIaWxpdGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xIaWxpdGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRDb250cm9sSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sSGlsaXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgX3J2KSIpfSwKLQl7IkdldENvbnRyb2xPd25lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbE93bmVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkdldENvbnRyb2xEYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRDb250cm9sUG9wdXBNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUG9wdXBNZW51SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJHZXRDb250cm9sUG9wdXBNZW51SUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQb3B1cE1lbnVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldENvbnRyb2xEYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFIYW5kbGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRDb250cm9sQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gTm9uZSIpfSwKLQl7IlNldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgcG9wdXBNZW51KSAtPiBOb25lIil9LAotCXsiU2V0Q29udHJvbFBvcHVwTWVudUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sUG9wdXBNZW51SUQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IkdldEJldmVsQnV0dG9uTWVudVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dFZhbHVlKSIpfSwKLQl7IlNldEJldmVsQnV0dG9uTWVudVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluVmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEJldmVsQnV0dG9uTWVudUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBvdXRIYW5kbGUpIil9LAotCXsiU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gTm9uZSIpfSwKLQl7IlNldEJldmVsQnV0dG9uVHJhbnNmb3JtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvblRyYW5zZm9ybSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtKSAtPiBOb25lIil9LAotCXsiU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpblZhbHVlKSAtPiBOb25lIil9LAotCXsiR2V0VGFiQ29udGVudFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldFRhYkNvbnRlbnRSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dENvbnRlbnRSZWN0KSIpfSwKLQl7IlNldFRhYkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFRhYkVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpblRhYlRvSGlsaXRlLCBCb29sZWFuIGluRW5hYmxlZCkgLT4gTm9uZSIpfSwKLQl7IlNldEltYWdlV2VsbENvbnRlbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRJbWFnZVdlbGxDb250ZW50SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gTm9uZSIpfSwKLQl7IlNldEltYWdlV2VsbFRyYW5zZm9ybSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0SW1hZ2VXZWxsVHJhbnNmb3JtLCAxLAotCSBQeURvY19TVFIoIihJY29uVHJhbnNmb3JtVHlwZSBpblRyYW5zZm9ybSkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVmlld1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclZpZXdTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoT1NUeXBlIHN0eWxlKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVmlld1N0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclZpZXdTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHN0eWxlKSAtPiBOb25lIil9LAotCXsiRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRW5hYmxlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbW1hbmQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRXhlY3V0ZURhdGFCcm93c2VyRWRpdENvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb21tYW5kKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgZmlyc3QsIFVJbnQzMiBsYXN0KSIpfSwKLQl7Ik1vdmVEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgZGlyZWN0aW9uLCBCb29sZWFuIGV4dGVuZFNlbGVjdGlvbikgLT4gTm9uZSIpfSwKLQl7Ik9wZW5EYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyKSAtPiBOb25lIil9LAotCXsiQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ2xvc2VEYXRhQnJvd3NlckNvbnRhaW5lciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lcikgLT4gTm9uZSIpfSwKLQl7IlNvcnREYXRhQnJvd3NlckNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU29ydERhdGFCcm93c2VyQ29udGFpbmVyLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyLCBCb29sZWFuIHNvcnRDaGlsZHJlbikgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VySXRlbXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gcmVjdXJzZSwgVUludDMyIHN0YXRlLCBIYW5kbGUgaXRlbXMpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckl0ZW1Db3VudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gcmVjdXJzZSwgVUludDMyIHN0YXRlKSAtPiAoVUludDMyIG51bUl0ZW1zKSIpfSwKLQl7IklzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzRGF0YUJyb3dzZXJJdGVtU2VsZWN0ZWQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVN0YXRlLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKFVJbnQzMiBzdGF0ZSkiKX0sCi0JeyJSZXZlYWxEYXRhQnJvd3Nlckl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JldmVhbERhdGFCcm93c2VySXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eUlELCBVSW50OCBvcHRpb25zKSAtPiBOb25lIil9LAotCXsiU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJBY3RpdmVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3RpdmUpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFjdGl2ZSkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGluc2V0UmVjdCkiKX0sCi0JeyJHZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNjcm9sbEJhckluc2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGluc2V0UmVjdCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhcmdldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYXJnZXQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiB0YXJnZXQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhcmdldCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYXJnZXQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiB0YXJnZXQpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU29ydE9yZGVyLCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgb3JkZXIpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclNvcnRPcmRlciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvcmRlcikiKX0sCi0JeyJTZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNjcm9sbFBvc2l0aW9uLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgdG9wLCBVSW50MzIgbGVmdCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiB0b3AsIFVJbnQzMiBsZWZ0KSIpfSwKLQl7IlNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGhvcml6LCBCb29sZWFuIHZlcnQpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBob3JpeiwgQm9vbGVhbiB2ZXJ0KSIpfSwKLQl7IlNldERhdGFCcm93c2VyU29ydFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHByb3BlcnR5KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU29ydFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgcHJvcGVydHkpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHNlbGVjdGlvbkZsYWdzKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHNlbGVjdGlvbkZsYWdzKSIpfSwKLQl7IlNldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHksIFVJbnQzMiBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyUHJvcGVydHlGbGFncyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHkpIC0+IChVSW50MzIgZmxhZ3MpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgdGV4dCkgLT4gTm9uZSIpfSwKLQl7IkNvcHlEYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Db3B5RGF0YUJyb3dzZXJFZGl0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0ZTdHJpbmdSZWYgdGV4dCkiKX0sCi0JeyJHZXREYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRUZXh0LCAxLAotCSBQeURvY19TVFIoIihDRk11dGFibGVTdHJpbmdSZWYgdGV4dCkgLT4gTm9uZSIpfSwKLQl7IlNldERhdGFCcm93c2VyRWRpdEl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyRWRpdEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHkpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlckVkaXRJdGVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckVkaXRJdGVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5KSIpfSwKLQl7IkdldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VySXRlbVBhcnRCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHksIE9TVHlwZSBwYXJ0KSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW4iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JlbW92ZURhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uLCAxLAotCSBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG51bUNvbHVtbnMpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGhpbGl0ZVN0eWxlKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGhpbGl0ZVN0eWxlKSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld1Jvd0hlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoLCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgd2lkdGgpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbldpZHRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgd2lkdGgpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtLCBVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgVUludDE2IHdpZHRoKSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MTYgd2lkdGgpIil9LAotCXsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdHZW9tZXRyeSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB2YXJpYWJsZVdpZHRoQ29sdW1ucywgQm9vbGVhbiB2YXJpYWJsZUhlaWdodFJvd3MpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zLCBCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93cykiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtSUQsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiByb3cpIC0+IChVSW50MzIgaXRlbSkiKX0sCi0JeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3ciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiByb3cpIC0+IE5vbmUiKX0sCi0JeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3ciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChVSW50MzIgcm93KSIpfSwKLQl7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4sIFVJbnQzMiBwb3NpdGlvbikgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uUG9zaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IChVSW50MzIgcG9zaXRpb24pIil9LAotCXsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gKFVJbnQzMiBwcm9wZXJ0eSkiKX0sCi0JeyJBdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BdXRvU2l6ZURhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJBZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BZGREYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uLCAxLAotCSBQeURvY19TVFIoIihEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyBjb2x1bW5EZXNjLCBVSW50MzIgcG9zaXRpb24pIC0+IE5vbmUiKX0sCi0JeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAotCXsiR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IGhlaWdodCkiKX0sCi0JeyJTZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3VXNlUGxhaW5CYWNrZ3JvdW5kLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIHVzZVBsYWluQmFja2dyb3VuZCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kKSIpfSwKLQl7IlNldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgQm9vbGVhbiBleHBhbmRhYmxlUm93cykgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3RGlzY2xvc3VyZUNvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIGNvbHVtbiwgQm9vbGVhbiBleHBhbmRhYmxlUm93cykiKX0sCi0JeyJHZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdQYXRoLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgcGF0aCkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGhMZW5ndGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBwYXRoTGVuZ3RoKSIpfSwKLQl7IlNldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5VHlwZSkgLT4gTm9uZSIpfSwKLQl7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlckNvbHVtblZpZXdEaXNwbGF5VHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoT1NUeXBlIHByb3BlcnR5VHlwZSkiKX0sCi0JeyJhc19SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfYXNfUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q29udHJvbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAotCXsiRGlzcG9zZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0Rpc3Bvc2VDb250cm9sLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUcmFja0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1RyYWNrQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQb2ludCBbLHRyYWNrZXJjYWxsYmFja10pIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKLQl7IkhhbmRsZUNvbnRyb2xDbGljayIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbENsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50LCBJbnRlZ2VyIG1vZGlmaWVycywgWyx0cmFja2VyY2FsbGJhY2tdKSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCi0JeyJTZXRDb250cm9sRGF0YSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKHN0dWZmKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbERhdGEiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhLCAxLAotCSBQeURvY19TVFIoIihwYXJ0LCB0eXBlKSAtPiBTdHJpbmciKX0sCi0JeyJTZXRDb250cm9sRGF0YV9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhX0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzT2JqKSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbERhdGFfSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YV9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKHBhcnQsIHR5cGUpIC0+IFJlc09iaiIpfSwKLQl7IlNldENvbnRyb2xEYXRhX0NhbGxiYWNrIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YV9DYWxsYmFjaywgMSwKLQkgUHlEb2NfU1RSKCIoY2FsbGJhY2tmdW5jKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiSGlsaXRlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGlsaXRlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbFBhcnRDb2RlIGhpbGl0ZVN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiU2hvd0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1Nob3dDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGlkZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IklzQ29udHJvbEFjdGl2ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNDb250cm9sQWN0aXZlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc0NvbnRyb2xWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJBY3RpdmF0ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0FjdGl2YXRlQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGVhY3RpdmF0ZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0RlYWN0aXZhdGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sVmlzaWJpbGl0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFZpc2liaWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5Jc1Zpc2libGUsIEJvb2xlYW4gaW5Eb0RyYXcpIC0+IE5vbmUiKX0sCisgICAgeyJJc0NvbnRyb2xFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Jc0NvbnRyb2xFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJFbmFibGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9FbmFibGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEaXNhYmxlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRGlzYWJsZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXcxQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRHJhdzFDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRCZXN0Q29udHJvbFJlY3QiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEJlc3RDb250cm9sUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRSZWN0LCBTSW50MTYgb3V0QmFzZUxpbmVPZmZzZXQpIil9LAorICAgIHsiU2V0Q29udHJvbEZvbnRTdHlsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbEZvbnRTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29udHJvbEZvbnRTdHlsZVJlYyBpblN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiRHJhd0NvbnRyb2xJbkN1cnJlbnRQb3J0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9EcmF3Q29udHJvbEluQ3VycmVudFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFVwQ29udHJvbEJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldFVwQ29udHJvbEJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkRlcHRoLCBCb29sZWFuIGluSXNDb2xvckRldmljZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFVwQ29udHJvbFRleHRDb2xvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0VXBDb250cm9sVGV4dENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5EZXB0aCwgQm9vbGVhbiBpbklzQ29sb3JEZXZpY2UpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRHJhZ0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UG9pbnQsIFJlY3QgbGltaXRSZWN0LCBSZWN0IHNsb3BSZWN0LCBEcmFnQ29uc3RyYWludCBheGlzKSAtPiBOb25lIil9LAorICAgIHsiVGVzdENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1Rlc3RDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0ZXN0UG9pbnQpIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xDb250ZXh0dWFsTWVudUNsaWNrIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sQ29udGV4dHVhbE1lbnVDbGljaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaW5XaGVyZSkgLT4gKEJvb2xlYW4gbWVudURpc3BsYXllZCkiKX0sCisgICAgeyJHZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sQ2xpY2tBY3RpdmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbldoZXJlLCBFdmVudE1vZGlmaWVycyBpbk1vZGlmaWVycykgLT4gKENsaWNrQWN0aXZhdGlvblJlc3VsdCBvdXRSZXN1bHQpIil9LAorICAgIHsiSGFuZGxlQ29udHJvbEtleSIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbEtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluS2V5Q29kZSwgU0ludDE2IGluQ2hhckNvZGUsIEV2ZW50TW9kaWZpZXJzIGluTW9kaWZpZXJzKSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydikiKX0sCisgICAgeyJIYW5kbGVDb250cm9sU2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sU2V0Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBsb2NhbFBvaW50LCBFdmVudE1vZGlmaWVycyBtb2RpZmllcnMpIC0+IChCb29sZWFuIGN1cnNvcldhc1NldCkiKX0sCisgICAgeyJNb3ZlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfTW92ZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBoLCBTSW50MTYgdikgLT4gTm9uZSIpfSwKKyAgICB7IlNpemVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TaXplQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHcsIFNJbnQxNiBoKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFRpdGxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVGl0bGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSB0aXRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xUaXRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFRpdGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTdHIyNTUgdGl0bGUpIil9LAorICAgIHsiU2V0Q29udHJvbFRpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVGl0bGVXaXRoQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiQ29weUNvbnRyb2xUaXRsZUFzQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NvcHlDb250cm9sVGl0bGVBc0NGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAorICAgIHsiR2V0Q29udHJvbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBuZXdWYWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xNaW5pbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sTWluaW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sTWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbE1pbmltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBuZXdNaW5pbXVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbE1heGltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xNYXhpbXVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sTWF4aW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IG5ld01heGltdW0pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sVmlld1NpemUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xWaWV3U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sVmlld1NpemUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xWaWV3U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIG5ld1ZpZXdTaXplKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbDMyQml0VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2wzMkJpdFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2wzMkJpdFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sMzJCaXRWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIG5ld1ZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbDMyQml0TWF4aW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbDMyQml0TWF4aW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJTZXRDb250cm9sMzJCaXRNYXhpbXVtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sMzJCaXRNYXhpbXVtLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MzIgbmV3TWF4aW11bSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2wzMkJpdE1pbmltdW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2wzMkJpdE1pbmltdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbDMyQml0TWluaW11bSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbDMyQml0TWluaW11bSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIG5ld01pbmltdW0pIC0+IE5vbmUiKX0sCisgICAgeyJJc1ZhbGlkQ29udHJvbEhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNWYWxpZENvbnRyb2xIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xJRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbElELCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sSUQgaW5JRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xJRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbElELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb250cm9sSUQgb3V0SUQpIil9LAorICAgIHsiU2V0Q29udHJvbENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dENvbW1hbmRJRCkiKX0sCisgICAgeyJSZW1vdmVDb250cm9sUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1JlbW92ZUNvbnRyb2xQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFByb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnKSAtPiAoVUludDMyIGF0dHJpYnV0ZXMpIil9LAorICAgIHsiQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ2hhbmdlQ29udHJvbFByb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnLCBVSW50MzIgYXR0cmlidXRlc1RvU2V0LCBVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sUGFydENvZGUgaW5QYXJ0LCBSZ25IYW5kbGUgb3V0UmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q29udHJvbFZhcmlhbnQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xWYXJpYW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb250cm9sVmFyaWFudCBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbEFjdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbEFjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHlPYmplY3QqIGFjdGlvblByb2MpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MzIgZGF0YSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAorICAgIHsiRW1iZWRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9FbWJlZENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbnRyb2xIYW5kbGUgaW5Db250YWluZXIpIC0+IE5vbmUiKX0sCisgICAgeyJBdXRvRW1iZWRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9BdXRvRW1iZWRDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRTdXBlckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldFN1cGVyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRQYXJlbnQpIil9LAorICAgIHsiQ291bnRTdWJDb250cm9scyIsIChQeUNGdW5jdGlvbilDdGxPYmpfQ291bnRTdWJDb250cm9scywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG91dE51bUNoaWxkcmVuKSIpfSwKKyAgICB7IkdldEluZGV4ZWRTdWJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRJbmRleGVkU3ViQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDE2IGluSW5kZXgpIC0+IChDb250cm9sSGFuZGxlIG91dFN1YkNvbnRyb2wpIil9LAorICAgIHsiU2V0Q29udHJvbFN1cGVydmlzb3IiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xTdXBlcnZpc29yLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sSGFuZGxlIGluQm9zcykgLT4gTm9uZSIpfSwKKyAgICB7IkdldENvbnRyb2xGZWF0dXJlcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbEZlYXR1cmVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgb3V0RmVhdHVyZXMpIil9LAorICAgIHsiR2V0Q29udHJvbERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sRGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbnRyb2xQYXJ0Q29kZSBpblBhcnQsIFJlc1R5cGUgaW5UYWdOYW1lKSAtPiAoU2l6ZSBvdXRNYXhTaXplKSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmciLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0hhbmRsZUNvbnRyb2xEcmFnVHJhY2tpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKERyYWdUcmFja2luZ01lc3NhZ2UgaW5NZXNzYWdlLCBEcmFnUmVmZXJlbmNlIGluRHJhZykgLT4gKEJvb2xlYW4gb3V0TGlrZXNEcmFnKSIpfSwKKyAgICB7IkhhbmRsZUNvbnRyb2xEcmFnUmVjZWl2ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfSGFuZGxlQ29udHJvbERyYWdSZWNlaXZlLCAxLAorICAgICBQeURvY19TVFIoIihEcmFnUmVmZXJlbmNlIGluRHJhZykgLT4gTm9uZSIpfSwKKyAgICB7IlNldENvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBpblRyYWNrcykgLT4gTm9uZSIpfSwKKyAgICB7IklzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gb3V0VHJhY2tzKSIpfSwKKyAgICB7IkdldENvbnRyb2xCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7IklzQ29udHJvbEhpbGl0ZWQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0lzQ29udHJvbEhpbGl0ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xIaWxpdGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xIaWxpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBfcnYpIil9LAorICAgIHsiR2V0Q29udHJvbE93bmVyIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXRDb250cm9sT3duZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0Q29udHJvbERhdGFIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xQb3B1cE1lbnVIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldENvbnRyb2xQb3B1cE1lbnVJRCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFBvcHVwTWVudUlELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU2V0Q29udHJvbERhdGFIYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YUhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldENvbnRyb2xCb3VuZHMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbFBvcHVwTWVudUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBwb3B1cE1lbnUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDb250cm9sUG9wdXBNZW51SUQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xQb3B1cE1lbnVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldEJldmVsQnV0dG9uTWVudVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0VmFsdWUpIil9LAorICAgIHsiU2V0QmV2ZWxCdXR0b25NZW51VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEJldmVsQnV0dG9uTWVudVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5WYWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEJldmVsQnV0dG9uTWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0QmV2ZWxCdXR0b25NZW51SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIG91dEhhbmRsZSkiKX0sCisgICAgeyJTZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRCZXZlbEJ1dHRvbkNvbnRlbnRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50KSAtPiBOb25lIil9LAorICAgIHsiU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEJldmVsQnV0dG9uVHJhbnNmb3JtLCAxLAorICAgICBQeURvY19TVFIoIihJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0pIC0+IE5vbmUiKX0sCisgICAgeyJTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERpc2Nsb3N1cmVUcmlhbmdsZUxhc3RWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluVmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUYWJDb250ZW50UmVjdCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0VGFiQ29udGVudFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0Q29udGVudFJlY3QpIil9LAorICAgIHsiU2V0VGFiRW5hYmxlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0VGFiRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluVGFiVG9IaWxpdGUsIEJvb2xlYW4gaW5FbmFibGVkKSAtPiBOb25lIil9LAorICAgIHsiU2V0SW1hZ2VXZWxsQ29udGVudEluZm8iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldEltYWdlV2VsbENvbnRlbnRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50KSAtPiBOb25lIil9LAorICAgIHsiU2V0SW1hZ2VXZWxsVHJhbnNmb3JtIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRJbWFnZVdlbGxUcmFuc2Zvcm0sIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25UcmFuc2Zvcm1UeXBlIGluVHJhbnNmb3JtKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVmlld1N0eWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPU1R5cGUgc3R5bGUpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJWaWV3U3R5bGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVmlld1N0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgc3R5bGUpIC0+IE5vbmUiKX0sCisgICAgeyJFbmFibGVEYXRhQnJvd3NlckVkaXRDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9FbmFibGVEYXRhQnJvd3NlckVkaXRDb21tYW5kLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29tbWFuZCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkV4ZWN1dGVEYXRhQnJvd3NlckVkaXRDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9FeGVjdXRlRGF0YUJyb3dzZXJFZGl0Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbW1hbmQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvciIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBmaXJzdCwgVUludDMyIGxhc3QpIil9LAorICAgIHsiTW92ZURhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Nb3ZlRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBkaXJlY3Rpb24sIEJvb2xlYW4gZXh0ZW5kU2VsZWN0aW9uKSAtPiBOb25lIil9LAorICAgIHsiT3BlbkRhdGFCcm93c2VyQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9PcGVuRGF0YUJyb3dzZXJDb250YWluZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIpIC0+IE5vbmUiKX0sCisgICAgeyJDbG9zZURhdGFCcm93c2VyQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9DbG9zZURhdGFCcm93c2VyQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29udGFpbmVyKSAtPiBOb25lIil9LAorICAgIHsiU29ydERhdGFCcm93c2VyQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9Tb3J0RGF0YUJyb3dzZXJDb250YWluZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb250YWluZXIsIEJvb2xlYW4gc29ydENoaWxkcmVuKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJJdGVtcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lciwgQm9vbGVhbiByZWN1cnNlLCBVSW50MzIgc3RhdGUsIEhhbmRsZSBpdGVtcykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VySXRlbUNvdW50IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckl0ZW1Db3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbnRhaW5lciwgQm9vbGVhbiByZWN1cnNlLCBVSW50MzIgc3RhdGUpIC0+IChVSW50MzIgbnVtSXRlbXMpIil9LAorICAgIHsiSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfSXNEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXREYXRhQnJvd3Nlckl0ZW1TdGF0ZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBpdGVtKSAtPiAoVUludDMyIHN0YXRlKSIpfSwKKyAgICB7IlJldmVhbERhdGFCcm93c2VySXRlbSIsIChQeUNGdW5jdGlvbilDdGxPYmpfUmV2ZWFsRGF0YUJyb3dzZXJJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDMyIHByb3BlcnR5SUQsIFVJbnQ4IG9wdGlvbnMpIC0+IE5vbmUiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckFjdGl2ZUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGFjdGl2ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyQWN0aXZlSXRlbXMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyQWN0aXZlSXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gYWN0aXZlKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgaW5zZXRSZWN0KSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyU2Nyb2xsQmFySW5zZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgaW5zZXRSZWN0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHRhcmdldCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFyZ2V0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhcmdldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHRhcmdldCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclNvcnRPcmRlciIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJTb3J0T3JkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBvcmRlcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyU29ydE9yZGVyIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNvcnRPcmRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDE2IG9yZGVyKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU2Nyb2xsUG9zaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiB0b3AsIFVJbnQzMiBsZWZ0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTY3JvbGxQb3NpdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHRvcCwgVUludDMyIGxlZnQpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3Nlckhhc1Njcm9sbEJhcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaG9yaXosIEJvb2xlYW4gdmVydCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJIYXNTY3JvbGxCYXJzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGhvcml6LCBCb29sZWFuIHZlcnQpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyU29ydFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgcHJvcGVydHkpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNvcnRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJTb3J0UHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBwcm9wZXJ0eSkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgc2VsZWN0aW9uRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclNlbGVjdGlvbkZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgc2VsZWN0aW9uRmxhZ3MpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBwcm9wZXJ0eSwgVUludDMyIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclByb3BlcnR5RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBwcm9wZXJ0eSkgLT4gKFVJbnQzMiBmbGFncykiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlckVkaXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlckVkaXRUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiB0ZXh0KSAtPiBOb25lIil9LAorICAgIHsiQ29weURhdGFCcm93c2VyRWRpdFRleHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0NvcHlEYXRhQnJvd3NlckVkaXRUZXh0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiB0ZXh0KSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyRWRpdFRleHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyRWRpdFRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKENGTXV0YWJsZVN0cmluZ1JlZiB0ZXh0KSAtPiBOb25lIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJFZGl0SXRlbSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJFZGl0SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyRWRpdEl0ZW0iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyRWRpdEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBpdGVtLCBVSW50MzIgcHJvcGVydHkpIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJJdGVtUGFydEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQzMiBwcm9wZXJ0eSwgT1NUeXBlIHBhcnQpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJSZW1vdmVEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfUmVtb3ZlRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW4sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQzMiBjb2x1bW4pIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgbnVtQ29sdW1ucykiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaGlsaXRlU3R5bGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0hpbGl0ZVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaGlsaXRlU3R5bGUpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIihVSW50MTYgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdSb3dIZWlnaHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Um93SGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgaGVpZ2h0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiB3aWR0aCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uV2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiB3aWR0aCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0sIFVJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1Sb3dIZWlnaHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvd0hlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGl0ZW0pIC0+IChVSW50MTYgaGVpZ2h0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdOYW1lZENvbHVtbldpZHRoLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29sdW1uLCBVSW50MTYgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld05hbWVkQ29sdW1uV2lkdGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gKFVJbnQxNiB3aWR0aCkiKX0sCisgICAgeyJTZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXREYXRhQnJvd3NlclRhYmxlVmlld0dlb21ldHJ5LCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHZhcmlhYmxlV2lkdGhDb2x1bW5zLCBCb29sZWFuIHZhcmlhYmxlSGVpZ2h0Um93cykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnkiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyVGFibGVWaWV3R2VvbWV0cnksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gdmFyaWFibGVXaWR0aENvbHVtbnMsIEJvb2xlYW4gdmFyaWFibGVIZWlnaHRSb3dzKSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbUlEIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0l0ZW1JRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHJvdykgLT4gKFVJbnQzMiBpdGVtKSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93LCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaXRlbSwgVUludDMyIHJvdykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyVGFibGVWaWV3SXRlbVJvdyIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdJdGVtUm93LCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaXRlbSkgLT4gKFVJbnQzMiByb3cpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbiwgVUludDMyIHBvc2l0aW9uKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbiIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5Qb3NpdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGNvbHVtbikgLT4gKFVJbnQzMiBwb3NpdGlvbikiKX0sCisgICAgeyJHZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtblByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29sdW1uKSAtPiAoVUludDMyIHByb3BlcnR5KSIpfSwKKyAgICB7IkF1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnMiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0F1dG9TaXplRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkFkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0FkZERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW4sIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjIGNvbHVtbkRlc2MsIFVJbnQzMiBwb3NpdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJCdG5IZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9HZXREYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyQnRuSGVpZ2h0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgaGVpZ2h0KSIpfSwKKyAgICB7IlNldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdVc2VQbGFpbkJhY2tncm91bmQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gdXNlUGxhaW5CYWNrZ3JvdW5kKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJMaXN0Vmlld1VzZVBsYWluQmFja2dyb3VuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiB1c2VQbGFpbkJhY2tncm91bmQpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgY29sdW1uLCBCb29sZWFuIGV4cGFuZGFibGVSb3dzKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJMaXN0Vmlld0Rpc2Nsb3N1cmVDb2x1bW4iLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyTGlzdFZpZXdEaXNjbG9zdXJlQ29sdW1uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgY29sdW1uLCBCb29sZWFuIGV4cGFuZGFibGVSb3dzKSIpfSwKKyAgICB7IkdldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld1BhdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBwYXRoKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3UGF0aExlbmd0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIHBhdGhMZW5ndGgpIil9LAorICAgIHsiU2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGF0YUJyb3dzZXJDb2x1bW5WaWV3RGlzcGxheVR5cGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldERhdGFCcm93c2VyQ29sdW1uVmlld0Rpc3BsYXlUeXBlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPU1R5cGUgcHJvcGVydHlUeXBlKSIpfSwKKyAgICB7ImFzX1Jlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9hc19SZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRDb250cm9sUmVjdCIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCisgICAgeyJEaXNwb3NlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfRGlzcG9zZUNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRyYWNrQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxPYmpfVHJhY2tDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFBvaW50IFssdHJhY2tlcmNhbGxiYWNrXSkgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYpIil9LAorICAgIHsiSGFuZGxlQ29udHJvbENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9IYW5kbGVDb250cm9sQ2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UG9pbnQsIEludGVnZXIgbW9kaWZpZXJzLCBbLHRyYWNrZXJjYWxsYmFja10pIC0+IChDb250cm9sUGFydENvZGUgX3J2KSIpfSwKKyAgICB7IlNldENvbnRyb2xEYXRhIiwgKFB5Q0Z1bmN0aW9uKUN0bE9ial9TZXRDb250cm9sRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc3R1ZmYpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sRGF0YSIsIChQeUNGdW5jdGlvbilDdGxPYmpfR2V0Q29udHJvbERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKHBhcnQsIHR5cGUpIC0+IFN0cmluZyIpfSwKKyAgICB7IlNldENvbnRyb2xEYXRhX0hhbmRsZSIsIChQeUNGdW5jdGlvbilDdGxPYmpfU2V0Q29udHJvbERhdGFfSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNPYmopIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sRGF0YV9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX0dldENvbnRyb2xEYXRhX0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIocGFydCwgdHlwZSkgLT4gUmVzT2JqIil9LAorICAgIHsiU2V0Q29udHJvbERhdGFfQ2FsbGJhY2siLCAoUHlDRnVuY3Rpb24pQ3RsT2JqX1NldENvbnRyb2xEYXRhX0NhbGxiYWNrLCAxLAorICAgICBQeURvY19TVFIoIihjYWxsYmFja2Z1bmMpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIEN0bE9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTM4MjMsMjggKzM4MjMsMjggQEAKIAogc3RhdGljIGludCBDdGxPYmpfY29tcGFyZShDb250cm9sT2JqZWN0ICpzZWxmLCBDb250cm9sT2JqZWN0ICpvdGhlcikKIHsKLQl1bnNpZ25lZCBsb25nIHYsIHc7CisgICAgdW5zaWduZWQgbG9uZyB2LCB3OwogCi0JaWYgKCFDdGxPYmpfQ2hlY2soKFB5T2JqZWN0ICopb3RoZXIpKQotCXsKLQkJdj0odW5zaWduZWQgbG9uZylzZWxmOwotCQl3PSh1bnNpZ25lZCBsb25nKW90aGVyOwotCX0KLQllbHNlCi0JewotCQl2PSh1bnNpZ25lZCBsb25nKXNlbGYtPm9iX2l0c2VsZjsKLQkJdz0odW5zaWduZWQgbG9uZylvdGhlci0+b2JfaXRzZWxmOwotCX0KLQlpZiggdiA8IHcgKSByZXR1cm4gLTE7Ci0JaWYoIHYgPiB3ICkgcmV0dXJuIDE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFDdGxPYmpfQ2hlY2soKFB5T2JqZWN0ICopb3RoZXIpKQorICAgIHsKKyAgICAgICAgdj0odW5zaWduZWQgbG9uZylzZWxmOworICAgICAgICB3PSh1bnNpZ25lZCBsb25nKW90aGVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2PSh1bnNpZ25lZCBsb25nKXNlbGYtPm9iX2l0c2VsZjsKKyAgICAgICAgdz0odW5zaWduZWQgbG9uZylvdGhlci0+b2JfaXRzZWxmOworICAgIH0KKyAgICBpZiggdiA8IHcgKSByZXR1cm4gLTE7CisgICAgaWYoIHYgPiB3ICkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgQ3RsT2JqX3JlcHIgTlVMTAogCiBzdGF0aWMgbG9uZyBDdGxPYmpfaGFzaChDb250cm9sT2JqZWN0ICpzZWxmKQogewotCXJldHVybiAobG9uZylzZWxmLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIChsb25nKXNlbGYtPm9iX2l0c2VsZjsKIH0KICNkZWZpbmUgQ3RsT2JqX3RwX2luaXQgMAogCkBAIC0zODUyLDYxICszODUyLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlDb250cm9sSGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ29udHJvbEhhbmRsZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBDdGxPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChDb250cm9sT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEN0bE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKENvbnRyb2xPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgQ3RsT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IENvbnRyb2xfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfQ3RsLkNvbnRyb2wiLCAvKnRwX25hbWUqLwotCXNpemVvZihDb250cm9sT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQ3RsT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEN0bE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQ3RsT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBDdGxPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JQ3RsT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUN0bE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlDdGxPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUN0bE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlDdGxPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlDdGxPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9DdGwuQ29udHJvbCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKENvbnRyb2xPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBDdGxPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQ3RsT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBDdGxPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEN0bE9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBDdGxPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQ3RsT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEN0bE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQ3RsT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEN0bE9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEN0bE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgQ29udHJvbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM5MTQsMTYxNiArMzkxNCwxNjE2IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX05ld0NvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xIYW5kbGUgX3J2OwotCVdpbmRvd1B0ciBvd25pbmdXaW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVN0cjI1NSBjb250cm9sVGl0bGU7Ci0JQm9vbGVhbiBpbml0aWFsbHlWaXNpYmxlOwotCVNJbnQxNiBpbml0aWFsVmFsdWU7Ci0JU0ludDE2IG1pbmltdW1WYWx1ZTsKLQlTSW50MTYgbWF4aW11bVZhbHVlOwotCVNJbnQxNiBwcm9jSUQ7Ci0JU0ludDMyIGNvbnRyb2xSZWZlcmVuY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xIYW5kbGUgX3J2OworICAgIFdpbmRvd1B0ciBvd25pbmdXaW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFN0cjI1NSBjb250cm9sVGl0bGU7CisgICAgQm9vbGVhbiBpbml0aWFsbHlWaXNpYmxlOworICAgIFNJbnQxNiBpbml0aWFsVmFsdWU7CisgICAgU0ludDE2IG1pbmltdW1WYWx1ZTsKKyAgICBTSW50MTYgbWF4aW11bVZhbHVlOworICAgIFNJbnQxNiBwcm9jSUQ7CisgICAgU0ludDMyIGNvbnRyb2xSZWZlcmVuY2U7CiAjaWZuZGVmIE5ld0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhOZXdDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJoaGhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmb3duaW5nV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBjb250cm9sVGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsbHlWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbFJlZmVyZW5jZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0NvbnRyb2wob3duaW5nV2luZG93LAotCSAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICBjb250cm9sVGl0bGUsCi0JICAgICAgICAgICAgICAgICBpbml0aWFsbHlWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgcHJvY0lELAotCSAgICAgICAgICAgICAgICAgY29udHJvbFJlZmVyZW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJoaGhobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmb3duaW5nV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBjb250cm9sVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsbHlWaXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbFJlZmVyZW5jZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld0NvbnRyb2wob3duaW5nV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICBjb250cm9sVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICBpbml0aWFsbHlWaXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgbWluaW11bVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgbWF4aW11bVZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgY29udHJvbFJlZmVyZW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9HZXROZXdDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlTSW50MTYgcmVzb3VyY2VJRDsKLQlXaW5kb3dQdHIgb3duaW5nV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBTSW50MTYgcmVzb3VyY2VJRDsKKyAgICBXaW5kb3dQdHIgb3duaW5nV2luZG93OwogI2lmbmRlZiBHZXROZXdDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV3Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV3Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZvd25pbmdXaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXdDb250cm9sKHJlc291cmNlSUQsCi0JICAgICAgICAgICAgICAgICAgICBvd25pbmdXaW5kb3cpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZvd25pbmdXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXdDb250cm9sKHJlc291cmNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBvd25pbmdXaW5kb3cpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfRHJhd0NvbnRyb2xzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgdGhlV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OwogI2lmbmRlZiBEcmF3Q29udHJvbHMKLQlQeU1hY19QUkVDSEVDSyhEcmF3Q29udHJvbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdDb250cm9scyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhd0NvbnRyb2xzKHRoZVdpbmRvdyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEcmF3Q29udHJvbHModGhlV2luZG93KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX1VwZGF0ZUNvbnRyb2xzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JUmduSGFuZGxlIGluVXBkYXRlUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUmduSGFuZGxlIGluVXBkYXRlUmVnaW9uOwogI2lmbmRlZiBVcGRhdGVDb250cm9scwotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZUNvbnRyb2xzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVDb250cm9scyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpblVwZGF0ZVJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCVVwZGF0ZUNvbnRyb2xzKGluV2luZG93LAotCSAgICAgICAgICAgICAgIGluVXBkYXRlUmVnaW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5VcGRhdGVSZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVcGRhdGVDb250cm9scyhpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICBpblVwZGF0ZVJlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9GaW5kQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29udHJvbFBhcnRDb2RlIF9ydjsKLQlQb2ludCB0ZXN0UG9pbnQ7Ci0JV2luZG93UHRyIHRoZVdpbmRvdzsKLQlDb250cm9sSGFuZGxlIHRoZUNvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xQYXJ0Q29kZSBfcnY7CisgICAgUG9pbnQgdGVzdFBvaW50OworICAgIFdpbmRvd1B0ciB0aGVXaW5kb3c7CisgICAgQ29udHJvbEhhbmRsZSB0aGVDb250cm9sOwogI2lmbmRlZiBGaW5kQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKEZpbmRDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmluZENvbnRyb2wodGVzdFBvaW50LAotCSAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAmdGhlQ29udHJvbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIHRoZUNvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaW5kQ29udHJvbCh0ZXN0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb250cm9sKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgdGhlQ29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0lkbGVDb250cm9scyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIGluV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CiAjaWZuZGVmIElkbGVDb250cm9scwotCVB5TWFjX1BSRUNIRUNLKElkbGVDb250cm9scyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWRsZUNvbnRyb2xzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCUlkbGVDb250cm9scyhpbldpbmRvdyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIElkbGVDb250cm9scyhpbldpbmRvdyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9HZXRDb250cm9sQnlJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbElEIGluSUQ7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSUQgaW5JRDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIEdldENvbnRyb2xCeUlECi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q29udHJvbEJ5SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENvbnRyb2xCeUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRyb2xJRF9Db252ZXJ0LCAmaW5JRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRDb250cm9sQnlJRChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29udHJvbElEX0NvbnZlcnQsICZpbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldENvbnRyb2xCeUlEKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfRHVtcENvbnRyb2xIaWVyYXJjaHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUZTU3BlYyBpbkR1bXBGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBGU1NwZWMgaW5EdW1wRmlsZTsKICNpZm5kZWYgRHVtcENvbnRyb2xIaWVyYXJjaHkKLQlQeU1hY19QUkVDSEVDSyhEdW1wQ29udHJvbEhpZXJhcmNoeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHVtcENvbnRyb2xIaWVyYXJjaHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRHVtcEZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHVtcENvbnRyb2xIaWVyYXJjaHkoaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkR1bXBGaWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaW5EdW1wRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEdW1wQ29udHJvbEhpZXJhcmNoeShpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRHVtcEZpbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVSb290Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVJvb3RDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUm9vdENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVJvb3RDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSb290Q29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUm9vdENvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0dldFJvb3RDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgR2V0Um9vdENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhHZXRSb290Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Um9vdENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFJvb3RDb250cm9sKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRSb290Q29udHJvbChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfR2V0S2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIEdldEtleWJvYXJkRm9jdXMKLQlQeU1hY19QUkVDSEVDSyhHZXRLZXlib2FyZEZvY3VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRLZXlib2FyZEZvY3VzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRLZXlib2FyZEZvY3VzKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEtleWJvYXJkRm9jdXMoaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfV2hpY2hDb250cm9sLCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfU2V0S2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQ29udHJvbEhhbmRsZSBpbkNvbnRyb2w7Ci0JQ29udHJvbEZvY3VzUGFydCBpblBhcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIENvbnRyb2xIYW5kbGUgaW5Db250cm9sOworICAgIENvbnRyb2xGb2N1c1BhcnQgaW5QYXJ0OwogI2lmbmRlZiBTZXRLZXlib2FyZEZvY3VzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0S2V5Ym9hcmRGb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0S2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9Db252ZXJ0LCAmaW5Db250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEtleWJvYXJkRm9jdXMoaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Db250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUGFydCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfQ29udmVydCwgJmluQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRLZXlib2FyZEZvY3VzKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9BZHZhbmNlS2V5Ym9hcmRGb2N1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OwogI2lmbmRlZiBBZHZhbmNlS2V5Ym9hcmRGb2N1cwotCVB5TWFjX1BSRUNIRUNLKEFkdmFuY2VLZXlib2FyZEZvY3VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZHZhbmNlS2V5Ym9hcmRGb2N1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWR2YW5jZUtleWJvYXJkRm9jdXMoaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZHZhbmNlS2V5Ym9hcmRGb2N1cyhpbldpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX1JldmVyc2VLZXlib2FyZEZvY3VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CiAjaWZuZGVmIFJldmVyc2VLZXlib2FyZEZvY3VzCi0JUHlNYWNfUFJFQ0hFQ0soUmV2ZXJzZUtleWJvYXJkRm9jdXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFJldmVyc2VLZXlib2FyZEZvY3VzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZXZlcnNlS2V5Ym9hcmRGb2N1cyhpbldpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJldmVyc2VLZXlib2FyZEZvY3VzKGluV2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ2xlYXJLZXlib2FyZEZvY3VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CiAjaWZuZGVmIENsZWFyS2V5Ym9hcmRGb2N1cwotCVB5TWFjX1BSRUNIRUNLKENsZWFyS2V5Ym9hcmRGb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xlYXJLZXlib2FyZEZvY3VzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbGVhcktleWJvYXJkRm9jdXMoaW5XaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbGVhcktleWJvYXJkRm9jdXMoaW5XaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9TZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JQm9vbGVhbiBpblRyYWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgQm9vbGVhbiBpblRyYWNrczsKICNpZm5kZWYgU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhTZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVHJhY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRyYWNrcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVHJhY2tzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93KGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRyYWNrcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0lzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCUJvb2xlYW4gb3V0VHJhY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBCb29sZWFuIG91dFRyYWNrczsKICNpZm5kZWYgSXNBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IElzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3coaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRyYWNrcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0VHJhY2tzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSXNBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyhpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJhY2tzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRUcmFja3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JVUludDE2IHRoaWNrbmVzczsKLQlVSW50MTYgYmVoYXZpb3I7Ci0JQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluZm87Ci0JU0ludDE2IG1lbnVJRDsKLQlVSW50MTYgbWVudUJlaGF2aW9yOwotCVVJbnQxNiBtZW51UGxhY2VtZW50OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBVSW50MTYgdGhpY2tuZXNzOworICAgIFVJbnQxNiBiZWhhdmlvcjsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbzsKKyAgICBTSW50MTYgbWVudUlEOworICAgIFVJbnQxNiBtZW51QmVoYXZpb3I7CisgICAgVUludDE2IG1lbnVQbGFjZW1lbnQ7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUJldmVsQnV0dG9uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZISE8maEhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGlja25lc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZiZWhhdmlvciwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUJlaGF2aW9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudVBsYWNlbWVudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51QmVoYXZpb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51UGxhY2VtZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZISE8maEhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGlja25lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiZWhhdmlvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUJlaGF2aW9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudVBsYWNlbWVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51QmVoYXZpb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51UGxhY2VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlU2xpZGVyQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTSW50MzIgdmFsdWU7Ci0JU0ludDMyIG1pbmltdW07Ci0JU0ludDMyIG1heGltdW07Ci0JVUludDE2IG9yaWVudGF0aW9uOwotCVVJbnQxNiBudW1UaWNrTWFya3M7Ci0JQm9vbGVhbiBsaXZlVHJhY2tpbmc7Ci0JUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2M7Ci0JVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTSW50MzIgdmFsdWU7CisgICAgU0ludDMyIG1pbmltdW07CisgICAgU0ludDMyIG1heGltdW07CisgICAgVUludDE2IG9yaWVudGF0aW9uOworICAgIFVJbnQxNiBudW1UaWNrTWFya3M7CisgICAgQm9vbGVhbiBsaXZlVHJhY2tpbmc7CisgICAgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2M7CisgICAgVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlU2xpZGVyQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVNsaWRlckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNsaWRlckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbEhIYk8iLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZudW1UaWNrTWFya3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXZlVHJhY2tpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXZlVHJhY2tpbmdQcm9jKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVNsaWRlckNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UaWNrTWFya3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZVRyYWNraW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlzZXRjYWxsYmFjayhfcmVzLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgbGl2ZVRyYWNraW5nUHJvYywgJmNfY2FsbGJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxISGJPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtVGlja01hcmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nUHJvYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTbGlkZXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGlja01hcmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVUcmFja2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteWFjdGlvbnByb2NfdXBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgc2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JUmVjdCBpbkJvdW5kc1JlY3Q7Ci0JVUludDE2IGluT3JpZW50YXRpb247Ci0JQ0ZTdHJpbmdSZWYgaW5UaXRsZTsKLQlTSW50MzIgaW5Jbml0aWFsVmFsdWU7Ci0JQm9vbGVhbiBpbkRyYXdUaXRsZTsKLQlCb29sZWFuIGluQXV0b1RvZ2dsZXM7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBSZWN0IGluQm91bmRzUmVjdDsKKyAgICBVSW50MTYgaW5PcmllbnRhdGlvbjsKKyAgICBDRlN0cmluZ1JlZiBpblRpdGxlOworICAgIFNJbnQzMiBpbkluaXRpYWxWYWx1ZTsKKyAgICBCb29sZWFuIGluRHJhd1RpdGxlOworICAgIEJvb2xlYW4gaW5BdXRvVG9nZ2xlczsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZURpc2Nsb3N1cmVUcmlhbmdsZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVEaXNjbG9zdXJlVHJpYW5nbGVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVEaXNjbG9zdXJlVHJpYW5nbGVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZITyZsYmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5PcmllbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluVGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRHJhd1RpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdXRvVG9nZ2xlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVEaXNjbG9zdXJlVHJpYW5nbGVDb250cm9sKGluV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcmllbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhd1RpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXV0b1RvZ2dsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSE8mbGJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Jbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRyYXdUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQXV0b1RvZ2dsZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbChpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRyYXdUaXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF1dG9Ub2dnbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVByb2dyZXNzQmFyQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTSW50MzIgdmFsdWU7Ci0JU0ludDMyIG1pbmltdW07Ci0JU0ludDMyIG1heGltdW07Ci0JQm9vbGVhbiBpbmRldGVybWluYXRlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTSW50MzIgdmFsdWU7CisgICAgU0ludDMyIG1pbmltdW07CisgICAgU0ludDMyIG1heGltdW07CisgICAgQm9vbGVhbiBpbmRldGVybWluYXRlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQcm9ncmVzc0JhckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbGIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXRlcm1pbmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVQcm9ncmVzc0JhckNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXRlcm1pbmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQcm9ncmVzc0JhckNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVJlbGV2YW5jZUJhckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU0ludDMyIHZhbHVlOwotCVNJbnQzMiBtaW5pbXVtOwotCVNJbnQzMiBtYXhpbXVtOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTSW50MzIgdmFsdWU7CisgICAgU0ludDMyIG1pbmltdW07CisgICAgU0ludDMyIG1heGltdW07CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVSZWxldmFuY2VCYXJDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVSZWxldmFuY2VCYXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVSZWxldmFuY2VCYXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTSW50MzIgdmFsdWU7Ci0JU0ludDMyIG1pbmltdW07Ci0JU0ludDMyIG1heGltdW07Ci0JU0ludDMyIGluY3JlbWVudDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIFNJbnQzMiBpbmNyZW1lbnQ7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmNyZW1lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTGl0dGxlQXJyb3dzQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluY3JlbWVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQ2hhc2luZ0Fycm93c0NvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlQ2hhc2luZ0Fycm93c0NvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVNlcGFyYXRvckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlU2VwYXJhdG9yQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVNlcGFyYXRvckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNlcGFyYXRvckNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTZXBhcmF0b3JDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlU2VwYXJhdG9yQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlR3JvdXBCb3hDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCUJvb2xlYW4gcHJpbWFyeTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGl0bGU7CisgICAgQm9vbGVhbiBwcmltYXJ5OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlR3JvdXBCb3hDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlR3JvdXBCb3hDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVHcm91cEJveENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJpbWFyeSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVHcm91cEJveENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW1hcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlR3JvdXBCb3hDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JU0ludDMyIGluaXRpYWxWYWx1ZTsKLQlCb29sZWFuIHByaW1hcnk7Ci0JQm9vbGVhbiBhdXRvVG9nZ2xlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBTSW50MzIgaW5pdGlhbFZhbHVlOworICAgIEJvb2xlYW4gcHJpbWFyeTsKKyAgICBCb29sZWFuIGF1dG9Ub2dnbGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsYmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByaW1hcnksCi0JICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9Ub2dnbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0b1RvZ2dsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvVG9nZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlCb29sZWFuIHByaW1hcnk7Ci0JU0ludDE2IG1lbnVJRDsKLQlCb29sZWFuIHZhcmlhYmxlV2lkdGg7Ci0JU0ludDE2IHRpdGxlV2lkdGg7Ci0JU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbjsKLQlTdHlsZSB0aXRsZVN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBCb29sZWFuIHByaW1hcnk7CisgICAgU0ludDE2IG1lbnVJRDsKKyAgICBCb29sZWFuIHZhcmlhYmxlV2lkdGg7CisgICAgU0ludDE2IHRpdGxlV2lkdGg7CisgICAgU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbjsKKyAgICBTdHlsZSB0aXRsZVN0eWxlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYmhiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZUp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aXRsZVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSnVzdGlmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiaGJoaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW1hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlSnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlU3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVJbWFnZVdlbGxDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbmZvOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbzsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUltYWdlV2VsbENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVJbWFnZVdlbGxDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVJbWFnZVdlbGxDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUltYWdlV2VsbENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JVUludDE2IG9yaWVudGF0aW9uOwotCVVJbnQxNiBzaXplOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBVSW50MTYgb3JpZW50YXRpb247CisgICAgVUludDE2IHNpemU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVQb3B1cEFycm93Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVBvcHVwQXJyb3dDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQb3B1cEFycm93Q29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSEgiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZvcmllbnRhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVBvcHVwQXJyb3dDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVQbGFjYXJkQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVQbGFjYXJkQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVBsYWNhcmRDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVQbGFjYXJkQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVBsYWNhcmRDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQbGFjYXJkQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVDbG9ja0NvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JVUludDE2IGNsb2NrVHlwZTsKLQlVSW50MzIgY2xvY2tGbGFnczsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgVUludDE2IGNsb2NrVHlwZTsKKyAgICBVSW50MzIgY2xvY2tGbGFnczsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUNsb2NrQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUNsb2NrQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQ2xvY2tDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZIbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlQ2xvY2tDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJkhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2tGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVDbG9ja0NvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9ja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9ja0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlVXNlclBhbmVDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVVJbnQzMiBmZWF0dXJlczsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgVUludDMyIGZlYXR1cmVzOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlVXNlclBhbmVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlVXNlclBhbmVDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVVc2VyUGFuZUNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVVc2VyUGFuZUNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVVc2VyUGFuZUNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZUVkaXRUZXh0Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0ZXh0OwotCUJvb2xlYW4gaXNQYXNzd29yZDsKLQlCb29sZWFuIHVzZUlubGluZUlucHV0OwotCUNvbnRyb2xGb250U3R5bGVSZWMgc3R5bGU7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRleHQ7CisgICAgQm9vbGVhbiBpc1Bhc3N3b3JkOworICAgIEJvb2xlYW4gdXNlSW5saW5lSW5wdXQ7CisgICAgQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUVkaXRUZXh0Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUVkaXRUZXh0Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRWRpdFRleHRDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXNQYXNzd29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZUlubGluZUlucHV0LAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVFZGl0VGV4dENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQYXNzd29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUlubGluZUlucHV0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VJbmxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlRWRpdFRleHRDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJbmxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVN0YXRpY1RleHRDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRleHQ7Ci0JQ29udHJvbEZvbnRTdHlsZVJlYyBzdHlsZTsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ0ZTdHJpbmdSZWYgdGV4dDsKKyAgICBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTdGF0aWNUZXh0Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZzdHlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTdGF0aWNUZXh0Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZzdHlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTdGF0aWNUZXh0Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVBpY3R1cmVDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNvbnRyb2xCdXR0b25Db250ZW50SW5mbyBjb250ZW50OwotCUJvb2xlYW4gZG9udFRyYWNrOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gY29udGVudDsKKyAgICBCb29sZWFuIGRvbnRUcmFjazsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVBpY3R1cmVDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUGljdHVyZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVBpY3R1cmVDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmY29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRvbnRUcmFjaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVQaWN0dXJlQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9udFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbnRUcmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVQaWN0dXJlQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9udFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVJY29uQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JUmVjdCBpbkJvdW5kc1JlY3Q7Ci0JQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluSWNvbkNvbnRlbnQ7Ci0JQm9vbGVhbiBpbkRvbnRUcmFjazsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFJlY3QgaW5Cb3VuZHNSZWN0OworICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkljb25Db250ZW50OworICAgIEJvb2xlYW4gaW5Eb250VHJhY2s7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVJY29uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUljb25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVJY29uQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkljb25Db250ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Eb250VHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlSWNvbkNvbnRyb2woaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZpbkljb25Db250ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkRvbnRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkljb25Db250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Eb250VHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlSWNvbkNvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkljb25Db250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkRvbnRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlCb29sZWFuIGlzTGlzdEhlYWRlcjsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQm9vbGVhbiBpc0xpc3RIZWFkZXI7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlV2luZG93SGVhZGVyQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzTGlzdEhlYWRlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xpc3RIZWFkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzTGlzdEhlYWRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0xpc3RIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRpdGxlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVQdXNoQnV0dG9uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JQ0ZTdHJpbmdSZWYgdGl0bGU7Ci0JQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGljb247Ci0JVUludDE2IGljb25BbGlnbm1lbnQ7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRpdGxlOworICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpY29uOworICAgIFVJbnQxNiBpY29uQWxpZ25tZW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaWNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25BbGlnbm1lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUHVzaEJ1dHRvbldpdGhJY29uQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkFsaWdubWVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJmljb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uQWxpZ25tZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25BbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCVNJbnQzMiBpbml0aWFsVmFsdWU7Ci0JQm9vbGVhbiBhdXRvVG9nZ2xlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBTSW50MzIgaW5pdGlhbFZhbHVlOworICAgIEJvb2xlYW4gYXV0b1RvZ2dsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9Ub2dnbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvVG9nZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlQ2hlY2tCb3hDb250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciB3aW5kb3c7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNGU3RyaW5nUmVmIHRpdGxlOwotCVNJbnQzMiBpbml0aWFsVmFsdWU7Ci0JQm9vbGVhbiBhdXRvVG9nZ2xlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0aXRsZTsKKyAgICBTSW50MzIgaW5pdGlhbFZhbHVlOworICAgIEJvb2xlYW4gYXV0b1RvZ2dsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZUNoZWNrQm94Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUNoZWNrQm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlQ2hlY2tCb3hDb250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbml0aWFsVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdXRvVG9nZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUNoZWNrQm94Q29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1RvZ2dsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9Ub2dnbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlQ2hlY2tCb3hDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvVG9nZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTSW50MzIgdmFsdWU7Ci0JU0ludDMyIG1pbmltdW07Ci0JU0ludDMyIG1heGltdW07Ci0JU0ludDMyIHZpZXdTaXplOwotCUJvb2xlYW4gbGl2ZVRyYWNraW5nOwotCVB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jOwotCVVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU0ludDMyIHZhbHVlOworICAgIFNJbnQzMiBtaW5pbXVtOworICAgIFNJbnQzMiBtYXhpbXVtOworICAgIFNJbnQzMiB2aWV3U2l6ZTsKKyAgICBCb29sZWFuIGxpdmVUcmFja2luZzsKKyAgICBQeU9iamVjdCogbGl2ZVRyYWNraW5nUHJvYzsKKyAgICBVbml2ZXJzYWxQcm9jUHRyIGNfY2FsbGJhY2s7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVTY3JvbGxCYXJDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGxsbGJPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4aW11bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpZXdTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGl2ZVRyYWNraW5nUHJvYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTY3JvbGxCYXJDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZVRyYWNraW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15YWN0aW9ucHJvY191cHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlzZXRjYWxsYmFjayhfcmVzLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgbGl2ZVRyYWNraW5nUHJvYywgJmNfY2FsbGJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGxsYk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbmltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhpbXVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlld1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXZlVHJhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXZlVHJhY2tpbmdQcm9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVNjcm9sbEJhckNvbnRyb2wod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlVHJhY2tpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlhY3Rpb25wcm9jX3VwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHNldGNhbGxiYWNrKF9yZXMsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBsaXZlVHJhY2tpbmdQcm9jLCAmY19jYWxsYmFjayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0aXRsZTsKLQlTSW50MTYgbWVudUlEOwotCUJvb2xlYW4gdmFyaWFibGVXaWR0aDsKLQlTSW50MTYgdGl0bGVXaWR0aDsKLQlTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uOwotCVN0eWxlIHRpdGxlU3R5bGU7Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIENGU3RyaW5nUmVmIHRpdGxlOworICAgIFNJbnQxNiBtZW51SUQ7CisgICAgQm9vbGVhbiB2YXJpYWJsZVdpZHRoOworICAgIFNJbnQxNiB0aXRsZVdpZHRoOworICAgIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb247CisgICAgU3R5bGUgdGl0bGVTdHlsZTsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlSnVzdGlmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlU3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSnVzdGlmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGl0bGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlSnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpdGxlU3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVSYWRpb0dyb3VwQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIHdpbmRvdzsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVSYWRpb0dyb3VwQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVJhZGlvR3JvdXBDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVJhZGlvR3JvdXBDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVSYWRpb0dyb3VwQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTSW50MTYgY29udGVudFJlc0lEOwotCUJvb2xlYW4gYXV0b1Njcm9sbDsKLQlVSW50MzIgZGVsYXlCZWZvcmVBdXRvU2Nyb2xsOwotCVVJbnQzMiBkZWxheUJldHdlZW5BdXRvU2Nyb2xsOwotCVVJbnQxNiBhdXRvU2Nyb2xsQW1vdW50OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTSW50MTYgY29udGVudFJlc0lEOworICAgIEJvb2xlYW4gYXV0b1Njcm9sbDsKKyAgICBVSW50MzIgZGVsYXlCZWZvcmVBdXRvU2Nyb2xsOworICAgIFVJbnQzMiBkZWxheUJldHdlZW5BdXRvU2Nyb2xsOworICAgIFVJbnQxNiBhdXRvU2Nyb2xsQW1vdW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhibGxIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGVudFJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgICAmYXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlbGF5QmVmb3JlQXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlbGF5QmV0d2VlbkF1dG9TY3JvbGwsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdXRvU2Nyb2xsQW1vdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRSZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1Njcm9sbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlCZWZvcmVBdXRvU2Nyb2xsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheUJldHdlZW5BdXRvU2Nyb2xsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvU2Nyb2xsQW1vdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoYmxsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRSZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWxheUJlZm9yZUF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWxheUJldHdlZW5BdXRvU2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV0b1Njcm9sbEFtb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9TY3JvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5QmVmb3JlQXV0b1Njcm9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlCZXR3ZWVuQXV0b1Njcm9sbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1Njcm9sbEFtb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCVNJbnQzMiBpblZhbHVlOwotCUJvb2xlYW4gaW5BdXRvVG9nZ2xlczsKLQlDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluV2luZG93OworICAgIFJlY3QgaW5Cb3VuZHNSZWN0OworICAgIFNJbnQzMiBpblZhbHVlOworICAgIEJvb2xlYW4gaW5BdXRvVG9nZ2xlczsKKyAgICBDb250cm9sSGFuZGxlIG91dENvbnRyb2w7CiAjaWZuZGVmIENyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdXRvVG9nZ2xlcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdXRvVG9nZ2xlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQXV0b1RvZ2dsZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2woaW5XaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXV0b1RvZ2dsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQ3RsX0NyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgaW5XaW5kb3c7Ci0JUmVjdCBpbkJvdW5kc1JlY3Q7Ci0JU0ludDE2IGluU2l6ZTsKLQlDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50OwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgaW5XaW5kb3c7CisgICAgUmVjdCBpbkJvdW5kc1JlY3Q7CisgICAgU0ludDE2IGluU2l6ZTsKKyAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5Db250ZW50OworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlUm91bmRCdXR0b25Db250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlUm91bmRCdXR0b25Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5XaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaW5Db250ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbChpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db250ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZpbkNvbnRlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlUm91bmRCdXR0b25Db250cm9sKGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9DcmVhdGVEYXRhQnJvd3NlckNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JT1NUeXBlIHN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBPU1R5cGUgc3R5bGU7CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZURhdGFCcm93c2VyQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZURhdGFCcm93c2VyQ29udHJvbCh3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZURhdGFCcm93c2VyQ29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlRWRpdFVuaWNvZGVUZXh0Q29udHJvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgd2luZG93OwotCVJlY3QgYm91bmRzUmVjdDsKLQlDRlN0cmluZ1JlZiB0ZXh0OwotCUJvb2xlYW4gaXNQYXNzd29yZDsKLQlDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBDRlN0cmluZ1JlZiB0ZXh0OworICAgIEJvb2xlYW4gaXNQYXNzd29yZDsKKyAgICBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKICNpZm5kZWYgQ3JlYXRlRWRpdFVuaWNvZGVUZXh0Q29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzUGFzc3dvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJnN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wod2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQYXNzd29yZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvbnRyb2wpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBvdXRDb250cm9sKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNQYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0LCAmc3R5bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlRWRpdFVuaWNvZGVUZXh0Q29udHJvbCh3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9GaW5kQ29udHJvbFVuZGVyTW91c2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xIYW5kbGUgX3J2OwotCVBvaW50IGluV2hlcmU7Ci0JV2luZG93UHRyIGluV2luZG93OwotCVNJbnQxNiBvdXRQYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBQb2ludCBpbldoZXJlOworICAgIFdpbmRvd1B0ciBpbldpbmRvdzsKKyAgICBTSW50MTYgb3V0UGFydDsKICNpZm5kZWYgRmluZENvbnRyb2xVbmRlck1vdXNlCi0JUHlNYWNfUFJFQ0hFQ0soRmluZENvbnRyb2xVbmRlck1vdXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kQ29udHJvbFVuZGVyTW91c2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5XaGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpbldpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpbmRDb250cm9sVW5kZXJNb3VzZShpbldoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9XaGljaENvbnRyb2wsIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRQYXJ0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbldoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmluZENvbnRyb2xVbmRlck1vdXNlKGluV2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UGFydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX1doaWNoQ29udHJvbCwgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkN0bF9hc19Db250cm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb250cm9sSGFuZGxlIF9ydjsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29udHJvbEhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIGFzX0NvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhhc19Db250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19Db250cm9sKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfQ29udHJvbChoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19Db250cm9sKGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpDdGxfQ3JlYXRlVGFic0NvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JVUludDE2IHNpemU7Ci0JVUludDE2IGRpcmVjdGlvbjsKLQlpbnQgaTsKLQlVSW50MTYgbnVtVGFiczsKLQlDb250cm9sVGFiRW50cnkgdGFiQXJyYXlbTUFYVEFCU107Ci0JQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwotCVB5T2JqZWN0ICp0YWJBcnJheU9iaiwgKnRhYkVudHJ5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciB3aW5kb3c7CisgICAgUmVjdCBib3VuZHNSZWN0OworICAgIFVJbnQxNiBzaXplOworICAgIFVJbnQxNiBkaXJlY3Rpb247CisgICAgaW50IGk7CisgICAgVUludDE2IG51bVRhYnM7CisgICAgQ29udHJvbFRhYkVudHJ5IHRhYkFycmF5W01BWFRBQlNdOworICAgIENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqdGFiQXJyYXlPYmosICp0YWJFbnRyeTsKIAogI2lmbmRlZiBDcmVhdGVUYWJzQ29udHJvbAotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVRhYnNDb250cm9sKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVUYWJzQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mSEhPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcmVjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRhYkFycmF5T2JqKSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZISE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFiQXJyYXlPYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotCWkgPSBQeVNlcXVlbmNlX0xlbmd0aCh0YWJBcnJheU9iaik7Ci0JaWYgKGkgPT0gLTEpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlpZiAoaSA+IE1BWFRBQlMpIHsKLQkgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUb28gbWFueSB0YWJzIik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JbnVtVGFicyA9IGk7Ci0JZm9yIChpPTA7IGk8bnVtVGFiczsgaSsrKSB7Ci0JICAgICAgICB0YWJFbnRyeSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh0YWJBcnJheU9iaiwgaSk7Ci0JICAgICAgICBpZiAodGFiRW50cnkgPT0gTlVMTCkKLQkgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHRhYkVudHJ5LCAiKE8mTyZCKSIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmdGFiQXJyYXlbaV0uaWNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRhYkFycmF5W2ldLm5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWJBcnJheVtpXS5lbmFibGVkCi0JICAgICAgICAgICAgICAgICAgICAgICAgICkpCi0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCX0KKyAgICBpID0gUHlTZXF1ZW5jZV9MZW5ndGgodGFiQXJyYXlPYmopOworICAgIGlmIChpID09IC0xKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoaSA+IE1BWFRBQlMpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIlRvbyBtYW55IHRhYnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG51bVRhYnMgPSBpOworICAgIGZvciAoaT0wOyBpPG51bVRhYnM7IGkrKykgeworICAgICAgICB0YWJFbnRyeSA9IFB5U2VxdWVuY2VfR2V0SXRlbSh0YWJBcnJheU9iaiwgaSk7CisgICAgICAgIGlmICh0YWJFbnRyeSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UodGFiRW50cnksICIoTyZPJkIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJnRhYkFycmF5W2ldLmljb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRhYkFycmF5W2ldLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYkFycmF5W2ldLmVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JX2VyciA9IENyZWF0ZVRhYnNDb250cm9sKHdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGFicywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGFiQXJyYXksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgX2VyciA9IENyZWF0ZVRhYnNDb250cm9sKHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGFicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDdGxfbWV0aG9kc1tdID0gewotCXsiTmV3Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfTmV3Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIG93bmluZ1dpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgY29udHJvbFRpdGxlLCBCb29sZWFuIGluaXRpYWxseVZpc2libGUsIFNJbnQxNiBpbml0aWFsVmFsdWUsIFNJbnQxNiBtaW5pbXVtVmFsdWUsIFNJbnQxNiBtYXhpbXVtVmFsdWUsIFNJbnQxNiBwcm9jSUQsIFNJbnQzMiBjb250cm9sUmVmZXJlbmNlKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TmV3Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfR2V0TmV3Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHJlc291cmNlSUQsIFdpbmRvd1B0ciBvd25pbmdXaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCi0JeyJEcmF3Q29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX0RyYXdDb250cm9scywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHRoZVdpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUNvbnRyb2xzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9VcGRhdGVDb250cm9scywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZ25IYW5kbGUgaW5VcGRhdGVSZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJGaW5kQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfRmluZENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQb2ludCwgV2luZG93UHRyIHRoZVdpbmRvdykgLT4gKENvbnRyb2xQYXJ0Q29kZSBfcnYsIENvbnRyb2xIYW5kbGUgdGhlQ29udHJvbCkiKX0sCi0JeyJJZGxlQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX0lkbGVDb250cm9scywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiR2V0Q29udHJvbEJ5SUQiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldENvbnRyb2xCeUlELCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xJRCBpbklEKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkR1bXBDb250cm9sSGllcmFyY2h5IiwgKFB5Q0Z1bmN0aW9uKUN0bF9EdW1wQ29udHJvbEhpZXJhcmNoeSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBGU1NwZWMgaW5EdW1wRmlsZSkgLT4gTm9uZSIpfSwKLQl7IkNyZWF0ZVJvb3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSb290Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkdldFJvb3RDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXRSb290Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkdldEtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldEtleWJvYXJkRm9jdXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJTZXRLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9TZXRLZXlib2FyZEZvY3VzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIENvbnRyb2xIYW5kbGUgaW5Db250cm9sLCBDb250cm9sRm9jdXNQYXJ0IGluUGFydCkgLT4gTm9uZSIpfSwKLQl7IkFkdmFuY2VLZXlib2FyZEZvY3VzIiwgKFB5Q0Z1bmN0aW9uKUN0bF9BZHZhbmNlS2V5Ym9hcmRGb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiUmV2ZXJzZUtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX1JldmVyc2VLZXlib2FyZEZvY3VzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJDbGVhcktleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0NsZWFyS2V5Ym9hcmRGb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiBOb25lIil9LAotCXsiU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ3RsX1NldEF1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIEJvb2xlYW4gaW5UcmFja3MpIC0+IE5vbmUiKX0sCi0JeyJJc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93IiwgKFB5Q0Z1bmN0aW9uKUN0bF9Jc0F1dG9tYXRpY0NvbnRyb2xEcmFnVHJhY2tpbmdFbmFibGVkRm9yV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChCb29sZWFuIG91dFRyYWNrcykiKX0sCi0JeyJDcmVhdGVCZXZlbEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUJldmVsQnV0dG9uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgVUludDE2IHRoaWNrbmVzcywgVUludDE2IGJlaGF2aW9yLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbywgU0ludDE2IG1lbnVJRCwgVUludDE2IG1lbnVCZWhhdmlvciwgVUludDE2IG1lbnVQbGFjZW1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlU2xpZGVyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2xpZGVyQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgVUludDE2IG9yaWVudGF0aW9uLCBVSW50MTYgbnVtVGlja01hcmtzLCBCb29sZWFuIGxpdmVUcmFja2luZywgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2MpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGlzY2xvc3VyZVRyaWFuZ2xlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgVUludDE2IGluT3JpZW50YXRpb24sIENGU3RyaW5nUmVmIGluVGl0bGUsIFNJbnQzMiBpbkluaXRpYWxWYWx1ZSwgQm9vbGVhbiBpbkRyYXdUaXRsZSwgQm9vbGVhbiBpbkF1dG9Ub2dnbGVzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVByb2dyZXNzQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBCb29sZWFuIGluZGV0ZXJtaW5hdGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUmVsZXZhbmNlQmFyQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVMaXR0bGVBcnJvd3NDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBTSW50MzIgaW5jcmVtZW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGFzaW5nQXJyb3dzQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVNlcGFyYXRvckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNlcGFyYXRvckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUdyb3VwQm94Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgQm9vbGVhbiBwcmltYXJ5KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVDaGVja0dyb3VwQm94Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBwcmltYXJ5LCBCb29sZWFuIGF1dG9Ub2dnbGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBvcHVwR3JvdXBCb3hDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBCb29sZWFuIHByaW1hcnksIFNJbnQxNiBtZW51SUQsIEJvb2xlYW4gdmFyaWFibGVXaWR0aCwgU0ludDE2IHRpdGxlV2lkdGgsIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb24sIFN0eWxlIHRpdGxlU3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlSW1hZ2VXZWxsQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5mbykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQb3B1cEFycm93Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBBcnJvd0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IG9yaWVudGF0aW9uLCBVSW50MTYgc2l6ZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQbGFjYXJkQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUGxhY2FyZENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVDbG9ja0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNsb2NrQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MTYgY2xvY2tUeXBlLCBVSW50MzIgY2xvY2tGbGFncykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVVc2VyUGFuZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVVzZXJQYW5lQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MzIgZmVhdHVyZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlRWRpdFRleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVFZGl0VGV4dENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQm9vbGVhbiBpc1Bhc3N3b3JkLCBCb29sZWFuIHVzZUlubGluZUlucHV0LCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVN0YXRpY1RleHRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTdGF0aWNUZXh0Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0ZXh0LCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVBpY3R1cmVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQaWN0dXJlQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gY29udGVudCwgQm9vbGVhbiBkb250VHJhY2spIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlSWNvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUljb25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaW5JY29uQ29udGVudCwgQm9vbGVhbiBpbkRvbnRUcmFjaykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVXaW5kb3dIZWFkZXJDb250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIEJvb2xlYW4gaXNMaXN0SGVhZGVyKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVB1c2hCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQdXNoQnV0dG9uQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQdXNoQnV0dG9uV2l0aEljb25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBDb250cm9sQnV0dG9uQ29udGVudEluZm8gaWNvbiwgVUludDE2IGljb25BbGlnbm1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUmFkaW9CdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQzMiBpbml0aWFsVmFsdWUsIEJvb2xlYW4gYXV0b1RvZ2dsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVDaGVja0JveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNoZWNrQm94Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBhdXRvVG9nZ2xlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVNjcm9sbEJhckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNjcm9sbEJhckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIFNJbnQzMiB2aWV3U2l6ZSwgQm9vbGVhbiBsaXZlVHJhY2tpbmcsIFB5T2JqZWN0KiBsaXZlVHJhY2tpbmdQcm9jKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVBvcHVwQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MTYgbWVudUlELCBCb29sZWFuIHZhcmlhYmxlV2lkdGgsIFNJbnQxNiB0aXRsZVdpZHRoLCBTSW50MTYgdGl0bGVKdXN0aWZpY2F0aW9uLCBTdHlsZSB0aXRsZVN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVJhZGlvR3JvdXBDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSYWRpb0dyb3VwQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTY3JvbGxpbmdUZXh0Qm94Q29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MTYgY29udGVudFJlc0lELCBCb29sZWFuIGF1dG9TY3JvbGwsIFVJbnQzMiBkZWxheUJlZm9yZUF1dG9TY3JvbGwsIFVJbnQzMiBkZWxheUJldHdlZW5BdXRvU2Nyb2xsLCBVSW50MTYgYXV0b1Njcm9sbEFtb3VudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0JeyJDcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRGlzY2xvc3VyZUJ1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFNJbnQzMiBpblZhbHVlLCBCb29sZWFuIGluQXV0b1RvZ2dsZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlUm91bmRCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIFNJbnQxNiBpblNpemUsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkNvbnRlbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAotCXsiQ3JlYXRlRGF0YUJyb3dzZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgT1NUeXBlIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkNyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUVkaXRVbmljb2RlVGV4dENvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGV4dCwgQm9vbGVhbiBpc1Bhc3N3b3JkLCBDb250cm9sRm9udFN0eWxlUmVjIHN0eWxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7IkZpbmRDb250cm9sVW5kZXJNb3VzZSIsIChQeUNGdW5jdGlvbilDdGxfRmluZENvbnRyb2xVbmRlck1vdXNlLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpbldoZXJlLCBXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIF9ydiwgU0ludDE2IG91dFBhcnQpIil9LAotCXsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfYXNfQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCi0JeyJDcmVhdGVUYWJzQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlVGFic0NvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgVUludDE2IHNpemUsIFVJbnQxNiBkaXJlY3Rpb24sIENvbnRyb2xUYWJFbnRyeSB0YWJBcnJheSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJOZXdDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9OZXdDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgb3duaW5nV2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSBjb250cm9sVGl0bGUsIEJvb2xlYW4gaW5pdGlhbGx5VmlzaWJsZSwgU0ludDE2IGluaXRpYWxWYWx1ZSwgU0ludDE2IG1pbmltdW1WYWx1ZSwgU0ludDE2IG1heGltdW1WYWx1ZSwgU0ludDE2IHByb2NJRCwgU0ludDMyIGNvbnRyb2xSZWZlcmVuY2UpIC0+IChDb250cm9sSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXROZXdDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9HZXROZXdDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgcmVzb3VyY2VJRCwgV2luZG93UHRyIG93bmluZ1dpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRyYXdDb250cm9scyIsIChQeUNGdW5jdGlvbilDdGxfRHJhd0NvbnRyb2xzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdGhlV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiVXBkYXRlQ29udHJvbHMiLCAoUHlDRnVuY3Rpb24pQ3RsX1VwZGF0ZUNvbnRyb2xzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJnbkhhbmRsZSBpblVwZGF0ZVJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IkZpbmRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9GaW5kQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFBvaW50LCBXaW5kb3dQdHIgdGhlV2luZG93KSAtPiAoQ29udHJvbFBhcnRDb2RlIF9ydiwgQ29udHJvbEhhbmRsZSB0aGVDb250cm9sKSIpfSwKKyAgICB7IklkbGVDb250cm9scyIsIChQeUNGdW5jdGlvbilDdGxfSWRsZUNvbnRyb2xzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDb250cm9sQnlJRCIsIChQeUNGdW5jdGlvbilDdGxfR2V0Q29udHJvbEJ5SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgQ29udHJvbElEIGluSUQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiRHVtcENvbnRyb2xIaWVyYXJjaHkiLCAoUHlDRnVuY3Rpb24pQ3RsX0R1bXBDb250cm9sSGllcmFyY2h5LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIEZTU3BlYyBpbkR1bXBGaWxlKSAtPiBOb25lIil9LAorICAgIHsiQ3JlYXRlUm9vdENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVJvb3RDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiR2V0Um9vdENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0dldFJvb3RDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiR2V0S2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfR2V0S2V5Ym9hcmRGb2N1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IlNldEtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX1NldEtleWJvYXJkRm9jdXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgQ29udHJvbEhhbmRsZSBpbkNvbnRyb2wsIENvbnRyb2xGb2N1c1BhcnQgaW5QYXJ0KSAtPiBOb25lIil9LAorICAgIHsiQWR2YW5jZUtleWJvYXJkRm9jdXMiLCAoUHlDRnVuY3Rpb24pQ3RsX0FkdmFuY2VLZXlib2FyZEZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJSZXZlcnNlS2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfUmV2ZXJzZUtleWJvYXJkRm9jdXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IkNsZWFyS2V5Ym9hcmRGb2N1cyIsIChQeUNGdW5jdGlvbilDdGxfQ2xlYXJLZXlib2FyZEZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRBdXRvbWF0aWNDb250cm9sRHJhZ1RyYWNraW5nRW5hYmxlZEZvcldpbmRvdyIsIChQeUNGdW5jdGlvbilDdGxfU2V0QXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgQm9vbGVhbiBpblRyYWNrcykgLT4gTm9uZSIpfSwKKyAgICB7IklzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3ciLCAoUHlDRnVuY3Rpb24pQ3RsX0lzQXV0b21hdGljQ29udHJvbERyYWdUcmFja2luZ0VuYWJsZWRGb3JXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKEJvb2xlYW4gb3V0VHJhY2tzKSIpfSwKKyAgICB7IkNyZWF0ZUJldmVsQnV0dG9uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQmV2ZWxCdXR0b25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBVSW50MTYgdGhpY2tuZXNzLCBVSW50MTYgYmVoYXZpb3IsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbmZvLCBTSW50MTYgbWVudUlELCBVSW50MTYgbWVudUJlaGF2aW9yLCBVSW50MTYgbWVudVBsYWNlbWVudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVTbGlkZXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVTbGlkZXJDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtLCBVSW50MTYgb3JpZW50YXRpb24sIFVJbnQxNiBudW1UaWNrTWFya3MsIEJvb2xlYW4gbGl2ZVRyYWNraW5nLCBQeU9iamVjdCogbGl2ZVRyYWNraW5nUHJvYykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVEaXNjbG9zdXJlVHJpYW5nbGVDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVEaXNjbG9zdXJlVHJpYW5nbGVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5XaW5kb3csIFJlY3QgaW5Cb3VuZHNSZWN0LCBVSW50MTYgaW5PcmllbnRhdGlvbiwgQ0ZTdHJpbmdSZWYgaW5UaXRsZSwgU0ludDMyIGluSW5pdGlhbFZhbHVlLCBCb29sZWFuIGluRHJhd1RpdGxlLCBCb29sZWFuIGluQXV0b1RvZ2dsZXMpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUHJvZ3Jlc3NCYXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQcm9ncmVzc0JhckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIEJvb2xlYW4gaW5kZXRlcm1pbmF0ZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVSZWxldmFuY2VCYXJDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVSZWxldmFuY2VCYXJDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQzMiB2YWx1ZSwgU0ludDMyIG1pbmltdW0sIFNJbnQzMiBtYXhpbXVtKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUxpdHRsZUFycm93c0NvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgU0ludDMyIHZhbHVlLCBTSW50MzIgbWluaW11bSwgU0ludDMyIG1heGltdW0sIFNJbnQzMiBpbmNyZW1lbnQpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlQ2hhc2luZ0Fycm93c0NvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNoYXNpbmdBcnJvd3NDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlU2VwYXJhdG9yQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2VwYXJhdG9yQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUdyb3VwQm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlR3JvdXBCb3hDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBCb29sZWFuIHByaW1hcnkpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlQ2hlY2tHcm91cEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUNoZWNrR3JvdXBCb3hDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MzIgaW5pdGlhbFZhbHVlLCBCb29sZWFuIHByaW1hcnksIEJvb2xlYW4gYXV0b1RvZ2dsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVQb3B1cEdyb3VwQm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlUG9wdXBHcm91cEJveENvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIEJvb2xlYW4gcHJpbWFyeSwgU0ludDE2IG1lbnVJRCwgQm9vbGVhbiB2YXJpYWJsZVdpZHRoLCBTSW50MTYgdGl0bGVXaWR0aCwgU0ludDE2IHRpdGxlSnVzdGlmaWNhdGlvbiwgU3R5bGUgdGl0bGVTdHlsZSkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVJbWFnZVdlbGxDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVJbWFnZVdlbGxDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbmZvKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVBvcHVwQXJyb3dDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQb3B1cEFycm93Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MTYgb3JpZW50YXRpb24sIFVJbnQxNiBzaXplKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVBsYWNhcmRDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQbGFjYXJkQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUNsb2NrQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQ2xvY2tDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFVJbnQxNiBjbG9ja1R5cGUsIFVJbnQzMiBjbG9ja0ZsYWdzKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVVzZXJQYW5lQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlVXNlclBhbmVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFVJbnQzMiBmZWF0dXJlcykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVFZGl0VGV4dENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZUVkaXRUZXh0Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0ZXh0LCBCb29sZWFuIGlzUGFzc3dvcmQsIEJvb2xlYW4gdXNlSW5saW5lSW5wdXQsIENvbnRyb2xGb250U3R5bGVSZWMgc3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlU3RhdGljVGV4dENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVN0YXRpY1RleHRDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRleHQsIENvbnRyb2xGb250U3R5bGVSZWMgc3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUGljdHVyZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVBpY3R1cmVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBjb250ZW50LCBCb29sZWFuIGRvbnRUcmFjaykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVJY29uQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlSWNvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpbldpbmRvdywgUmVjdCBpbkJvdW5kc1JlY3QsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpbkljb25Db250ZW50LCBCb29sZWFuIGluRG9udFRyYWNrKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVdpbmRvd0hlYWRlckNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQm9vbGVhbiBpc0xpc3RIZWFkZXIpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUHVzaEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVB1c2hCdXR0b25Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVB1c2hCdXR0b25XaXRoSWNvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIENvbnRyb2xCdXR0b25Db250ZW50SW5mbyBpY29uLCBVSW50MTYgaWNvbkFsaWdubWVudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVSYWRpb0J1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVJhZGlvQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0aXRsZSwgU0ludDMyIGluaXRpYWxWYWx1ZSwgQm9vbGVhbiBhdXRvVG9nZ2xlKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZUNoZWNrQm94Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlQ2hlY2tCb3hDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIENGU3RyaW5nUmVmIHRpdGxlLCBTSW50MzIgaW5pdGlhbFZhbHVlLCBCb29sZWFuIGF1dG9Ub2dnbGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlU2Nyb2xsQmFyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBTSW50MzIgdmFsdWUsIFNJbnQzMiBtaW5pbXVtLCBTSW50MzIgbWF4aW11bSwgU0ludDMyIHZpZXdTaXplLCBCb29sZWFuIGxpdmVUcmFja2luZywgUHlPYmplY3QqIGxpdmVUcmFja2luZ1Byb2MpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUG9wdXBCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVQb3B1cEJ1dHRvbkNvbnRyb2wsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3aW5kb3csIFJlY3QgYm91bmRzUmVjdCwgQ0ZTdHJpbmdSZWYgdGl0bGUsIFNJbnQxNiBtZW51SUQsIEJvb2xlYW4gdmFyaWFibGVXaWR0aCwgU0ludDE2IHRpdGxlV2lkdGgsIFNJbnQxNiB0aXRsZUp1c3RpZmljYXRpb24sIFN0eWxlIHRpdGxlU3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlUmFkaW9Hcm91cENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVJhZGlvR3JvdXBDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlU2Nyb2xsaW5nVGV4dEJveENvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVNjcm9sbGluZ1RleHRCb3hDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93LCBSZWN0IGJvdW5kc1JlY3QsIFNJbnQxNiBjb250ZW50UmVzSUQsIEJvb2xlYW4gYXV0b1Njcm9sbCwgVUludDMyIGRlbGF5QmVmb3JlQXV0b1Njcm9sbCwgVUludDMyIGRlbGF5QmV0d2VlbkF1dG9TY3JvbGwsIFVJbnQxNiBhdXRvU2Nyb2xsQW1vdW50KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7IkNyZWF0ZURpc2Nsb3N1cmVCdXR0b25Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVEaXNjbG9zdXJlQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgU0ludDMyIGluVmFsdWUsIEJvb2xlYW4gaW5BdXRvVG9nZ2xlcykgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVSb3VuZEJ1dHRvbkNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZVJvdW5kQnV0dG9uQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluV2luZG93LCBSZWN0IGluQm91bmRzUmVjdCwgU0ludDE2IGluU2l6ZSwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIGluQ29udGVudCkgLT4gKENvbnRyb2xIYW5kbGUgb3V0Q29udHJvbCkiKX0sCisgICAgeyJDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pQ3RsX0NyZWF0ZURhdGFCcm93c2VyQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBPU1R5cGUgc3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiQ3JlYXRlRWRpdFVuaWNvZGVUZXh0Q29udHJvbCIsIChQeUNGdW5jdGlvbilDdGxfQ3JlYXRlRWRpdFVuaWNvZGVUZXh0Q29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBDRlN0cmluZ1JlZiB0ZXh0LCBCb29sZWFuIGlzUGFzc3dvcmQsIENvbnRyb2xGb250U3R5bGVSZWMgc3R5bGUpIC0+IChDb250cm9sSGFuZGxlIG91dENvbnRyb2wpIil9LAorICAgIHsiRmluZENvbnRyb2xVbmRlck1vdXNlIiwgKFB5Q0Z1bmN0aW9uKUN0bF9GaW5kQ29udHJvbFVuZGVyTW91c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGluV2hlcmUsIFdpbmRvd1B0ciBpbldpbmRvdykgLT4gKENvbnRyb2xIYW5kbGUgX3J2LCBTSW50MTYgb3V0UGFydCkiKX0sCisgICAgeyJhc19Db250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9hc19Db250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKENvbnRyb2xIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkNyZWF0ZVRhYnNDb250cm9sIiwgKFB5Q0Z1bmN0aW9uKUN0bF9DcmVhdGVUYWJzQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdywgUmVjdCBib3VuZHNSZWN0LCBVSW50MTYgc2l6ZSwgVUludDE2IGRpcmVjdGlvbiwgQ29udHJvbFRhYkVudHJ5IHRhYkFycmF5KSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtNTUzMSwyODMgKzU1MzEsMjgzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogQ3RsT2JqX05ld1VubWFuYWdlZChDb250cm9sSGFuZGxlIGl0c2VsZikKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqaXQ7Ci0gICAgICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLSAgICAgICAgaXQgPSBQeU9iamVjdF9ORVcoQ29udHJvbE9iamVjdCwgJkNvbnRyb2xfVHlwZSk7Ci0gICAgICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgICAgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLSAgICAgICAgaXQtPm9iX2NhbGxiYWNrZGljdCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBDb250cm9sT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoQ29udHJvbE9iamVjdCwgJkNvbnRyb2xfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2NhbGxiYWNrZGljdCA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgogQ3RsT2JqX1doaWNoQ29udHJvbChDb250cm9sSGFuZGxlIGMpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICppdDsKKyAgICBQeU9iamVjdCAqaXQ7CiAKLSAgICAgICAgaWYgKGMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBpdCA9IFB5X05vbmU7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldENvbnRyb2xSZWZlcmVuY2UoYyk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAqKiBJZiB0aGUgcmVmY29uIGlzIHplcm8gb3IgZG9lc24ndCBwb2ludCBiYWNrIHRvIHRoZSBQeXRob24gb2JqZWN0Ci0gICAgICAgICAgICAgICAgKiogdGhlIGNvbnRyb2wgaXMgbm90IG91cnMuIFJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAoKENvbnRyb2xPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSBjKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEN0bE9ial9OZXdVbm1hbmFnZWQoYyk7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfSU5DUkVGKGl0KTsKLSAgICAgICAgcmV0dXJuIGl0OworICAgIGlmIChjID09IE5VTEwpCisgICAgICAgIGl0ID0gUHlfTm9uZTsKKyAgICBlbHNlIHsKKyAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0Q29udHJvbFJlZmVyZW5jZShjKTsKKyAgICAgICAgLyoKKyAgICAgICAgKiogSWYgdGhlIHJlZmNvbiBpcyB6ZXJvIG9yIGRvZXNuJ3QgcG9pbnQgYmFjayB0byB0aGUgUHl0aG9uIG9iamVjdAorICAgICAgICAqKiB0aGUgY29udHJvbCBpcyBub3Qgb3Vycy4gUmV0dXJuIGEgdGVtcG9yYXJ5IG9iamVjdC4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgKChDb250cm9sT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gYykKKyAgICAgICAgICAgIHJldHVybiBDdGxPYmpfTmV3VW5tYW5hZ2VkKGMpOworICAgIH0KKyAgICBQeV9JTkNSRUYoaXQpOworICAgIHJldHVybiBpdDsKIH0KIAogc3RhdGljIGludAogc2V0dHJhY2tmdW5jKFB5T2JqZWN0ICpvYmopCiB7Ci0gICAgICAgIGlmICh0cmFja2VyKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIlRyYWNrZXIgZnVuY3Rpb24gaW4gdXNlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgdHJhY2tlciA9IG9iajsKLSAgICAgICAgUHlfSU5DUkVGKHRyYWNrZXIpOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAodHJhY2tlcikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ3RsX0Vycm9yLCAiVHJhY2tlciBmdW5jdGlvbiBpbiB1c2UiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHRyYWNrZXIgPSBvYmo7CisgICAgUHlfSU5DUkVGKHRyYWNrZXIpOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZAogY2xydHJhY2tmdW5jKHZvaWQpCiB7Ci0gICAgICAgIFB5X1hERUNSRUYodHJhY2tlcik7Ci0gICAgICAgIHRyYWNrZXIgPSAwOworICAgIFB5X1hERUNSRUYodHJhY2tlcik7CisgICAgdHJhY2tlciA9IDA7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZAogbXl0cmFja2VyKENvbnRyb2xIYW5kbGUgY3RsLCBzaG9ydCBwYXJ0KQogewotICAgICAgICBQeU9iamVjdCAqYXJncywgKnJ2PTA7CisgICAgUHlPYmplY3QgKmFyZ3MsICpydj0wOwogCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTyZpKSIsIEN0bE9ial9XaGljaENvbnRyb2wsIGN0bCwgKGludClwYXJ0KTsKLSAgICAgICAgaWYgKGFyZ3MgJiYgdHJhY2tlcikgewotICAgICAgICAgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QodHJhY2tlciwgYXJncyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChydikKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiVHJhY2tDb250cm9sIG9yIEhhbmRsZUNvbnRyb2xDbGljazogZXhjZXB0aW9uIGluIHRyYWNrZXIgZnVuY3Rpb25cbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgIH0KKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8maSkiLCBDdGxPYmpfV2hpY2hDb250cm9sLCBjdGwsIChpbnQpcGFydCk7CisgICAgaWYgKGFyZ3MgJiYgdHJhY2tlcikgeworICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHRyYWNrZXIsIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICAgIGlmIChydikKKyAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlRyYWNrQ29udHJvbCBvciBIYW5kbGVDb250cm9sQ2xpY2s6IGV4Y2VwdGlvbiBpbiB0cmFja2VyIGZ1bmN0aW9uXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQKIHNldGNhbGxiYWNrKFB5T2JqZWN0ICpteXNlbGYsIE9TVHlwZSB3aGljaCwgUHlPYmplY3QgKmNhbGxiYWNrLCBVbml2ZXJzYWxQcm9jUHRyICp1cHBwKQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpzZWxmID0gKENvbnRyb2xPYmplY3QgKilteXNlbGY7Ci0gICAgICAgIGNoYXIga2V5YnVmWzldOworICAgIENvbnRyb2xPYmplY3QgKnNlbGYgPSAoQ29udHJvbE9iamVjdCAqKW15c2VsZjsKKyAgICBjaGFyIGtleWJ1Zls5XTsKIAotICAgICAgICBpZiAoIHdoaWNoID09IGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnICkKLSAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15YWN0aW9ucHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lS2V5RG93blByb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlrZXlkb3ducHJvY191cHA7Ci0gICAgICAgIGVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnICkKLSAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15Zm9jdXNwcm9jX3VwcDsKLSAgICAgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVEcmF3UHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWRyYXdwcm9jX3VwcDsKLSAgICAgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWlkbGVwcm9jX3VwcDsKLSAgICAgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZyApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWhpdHRlc3Rwcm9jX3VwcDsKLSAgICAgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcgKQotICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXl0cmFja2luZ3Byb2NfdXBwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAvKiBPbmx5IG5vdyBkbyB3ZSB0ZXN0IGZvciBjbGVhcmluZyBvZiB0aGUgY2FsbGJhY2s6ICovCi0gICAgICAgIGlmICggY2FsbGJhY2sgPT0gUHlfTm9uZSApCi0gICAgICAgICAgICAgICAgKnVwcHAgPSBOVUxMOwotICAgICAgICAvKiBDcmVhdGUgdGhlIGRpY3QgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQgKHNvIHdlIGRvbid0IGdldCBzdWNoIGEgZGljdCBmb3IgZXZlcnkgY29udHJvbCkgKi8KLSAgICAgICAgaWYgKCBzZWxmLT5vYl9jYWxsYmFja2RpY3QgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgaWYgKCAoc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID0gUHlEaWN0X05ldygpKSA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgLyogQW5kIHN0b3JlIHRoZSBQeXRob24gY2FsbGJhY2sgKi8KLSAgICAgICAgc3ByaW50ZihrZXlidWYsICIleCIsICh1bnNpZ25lZCl3aGljaCk7Ci0gICAgICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZiwgY2FsbGJhY2spIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICggd2hpY2ggPT0ga015Q29udHJvbEFjdGlvblByb2NUYWcgKQorICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15YWN0aW9ucHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlrZXlkb3ducHJvY191cHA7CisgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVGb2N1c1Byb2NUYWcgKQorICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15Zm9jdXNwcm9jX3VwcDsKKyAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZURyYXdQcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWRyYXdwcm9jX3VwcDsKKyAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUlkbGVQcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWlkbGVwcm9jX3VwcDsKKyAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnICkKKyAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWhpdHRlc3Rwcm9jX3VwcDsKKyAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nUHJvY1RhZyApCisgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXl0cmFja2luZ3Byb2NfdXBwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworICAgIC8qIE9ubHkgbm93IGRvIHdlIHRlc3QgZm9yIGNsZWFyaW5nIG9mIHRoZSBjYWxsYmFjazogKi8KKyAgICBpZiAoIGNhbGxiYWNrID09IFB5X05vbmUgKQorICAgICAgICAqdXBwcCA9IE5VTEw7CisgICAgLyogQ3JlYXRlIHRoZSBkaWN0IGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0IChzbyB3ZSBkb24ndCBnZXQgc3VjaCBhIGRpY3QgZm9yIGV2ZXJ5IGNvbnRyb2wpICovCisgICAgaWYgKCBzZWxmLT5vYl9jYWxsYmFja2RpY3QgPT0gTlVMTCApCisgICAgICAgIGlmICggKHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9IFB5RGljdF9OZXcoKSkgPT0gTlVMTCApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgLyogQW5kIHN0b3JlIHRoZSBQeXRob24gY2FsbGJhY2sgKi8KKyAgICBzcHJpbnRmKGtleWJ1ZiwgIiV4IiwgKHVuc2lnbmVkKXdoaWNoKTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoc2VsZi0+b2JfY2FsbGJhY2tkaWN0LCBrZXlidWYsIGNhbGxiYWNrKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGNhbGxjYWxsYmFjayhDb250cm9sT2JqZWN0ICpzZWxmLCBPU1R5cGUgd2hpY2gsIFB5T2JqZWN0ICphcmdsaXN0KQogewotICAgICAgICBjaGFyIGtleWJ1Zls5XTsKLSAgICAgICAgUHlPYmplY3QgKmZ1bmMsICpydjsKKyAgICBjaGFyIGtleWJ1Zls5XTsKKyAgICBQeU9iamVjdCAqZnVuYywgKnJ2OwogCi0gICAgICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOwotICAgICAgICBpZiAoIHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPm9iX2NhbGxiYWNrZGljdCwga2V5YnVmKSkgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiQ29udHJvbCBjYWxsYmFjayAleCB3aXRob3V0IGNhbGxiYWNrIG9iamVjdFxuIiwgKHVuc2lnbmVkKXdoaWNoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ2xpc3QpOwotICAgICAgICBpZiAoIHJ2ID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBjb250cm9sIGNhbGxiYWNrICV4IGhhbmRsZXJcbiIsICh1bnNpZ25lZCl3aGljaCk7Ci0gICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnY7CisgICAgc3ByaW50ZihrZXlidWYsICIleCIsICh1bnNpZ25lZCl3aGljaCk7CisgICAgaWYgKCBzZWxmLT5vYl9jYWxsYmFja2RpY3QgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgICAgICAoZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPm9iX2NhbGxiYWNrZGljdCwga2V5YnVmKSkgPT0gTlVMTCApIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkNvbnRyb2wgY2FsbGJhY2sgJXggd2l0aG91dCBjYWxsYmFjayBvYmplY3RcbiIsICh1bnNpZ25lZCl3aGljaCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ2xpc3QpOworICAgIGlmICggcnYgPT0gTlVMTCApIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBjb250cm9sIGNhbGxiYWNrICV4IGhhbmRsZXJcbiIsICh1bnNpZ25lZCl3aGljaCk7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkCiBteWFjdGlvbnByb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBTSW50MTYgcGFydCkKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBQeV9YREVDUkVGKHJ2KTsKIH0KIAogc3RhdGljIHBhc2NhbCBDb250cm9sUGFydENvZGUKIG15a2V5ZG93bnByb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBTSW50MTYga2V5Q29kZSwgU0ludDE2IGNoYXJDb2RlLCBTSW50MTYgbW9kaWZpZXJzKQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotICAgICAgICBzaG9ydCBjX3J2ID0gMDsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgc2hvcnQgY19ydiA9IDA7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oaGgiLCBjdGxfb2JqLCBrZXlDb2RlLCBjaGFyQ29kZSwgbW9kaWZpZXJzKTsKLSAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgaWYgKCBydiApCi0gICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0gICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBQeV9YREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaGhoIiwgY3RsX29iaiwga2V5Q29kZSwgY2hhckNvZGUsIG1vZGlmaWVycyk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnLCBhcmdsaXN0KTsKKyAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgIGlmICggcnYgKQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlfWERFQ1JFRihydik7CisgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKIH0KIAogc3RhdGljIHBhc2NhbCBDb250cm9sUGFydENvZGUKIG15Zm9jdXNwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgQ29udHJvbFBhcnRDb2RlIHBhcnQpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0gICAgICAgIHNob3J0IGNfcnYgPSBrQ29udHJvbEZvY3VzTm9QYXJ0OworICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICBzaG9ydCBjX3J2ID0ga0NvbnRyb2xGb2N1c05vUGFydDsKIAotICAgICAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotICAgICAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKLSAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZywgYXJnbGlzdCk7Ci0gICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7Ci0gICAgICAgIGlmICggcnYgKQotICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQotICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnLCBhcmdsaXN0KTsKKyAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgIGlmICggcnYgKQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlfWERFQ1JFRihydik7CisgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkCiBteWRyYXdwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgU0ludDE2IHBhcnQpCiB7Ci0gICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwogCi0gICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0gICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOwotICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcsIGFyZ2xpc3QpOwotICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOwotICAgICAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOworICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVEcmF3UHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBQeV9YREVDUkVGKHJ2KTsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkCiBteWlkbGVwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCkKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk8iLCBjdGxfb2JqKTsKLSAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUlkbGVQcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihydik7CisgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiTyIsIGN0bF9vYmopOworICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBQeV9YREVDUkVGKHJ2KTsKIH0KIAogc3RhdGljIHBhc2NhbCBDb250cm9sUGFydENvZGUKIG15aGl0dGVzdHByb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBQb2ludCB3aGVyZSkKIHsKLSAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKLSAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLSAgICAgICAgc2hvcnQgY19ydiA9IC0xOworICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICBzaG9ydCBjX3J2ID0gLTE7CiAKLSAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLSAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKLSAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnLCBhcmdsaXN0KTsKLSAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKLSAgICAgICAgLyogSWdub3JlIGVycm9ycywgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhlbSAqLwotICAgICAgICBpZiAoIHJ2ICkKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9PJiIsIGN0bF9vYmosIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKKyAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lSGl0VGVzdFByb2NUYWcsIGFyZ2xpc3QpOworICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgLyogSWdub3JlIGVycm9ycywgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhlbSAqLworICAgIGlmICggcnYgKQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlfWERFQ1JFRihydik7CisgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKIH0KIAogc3RhdGljIHBhc2NhbCBDb250cm9sUGFydENvZGUKIG15dHJhY2tpbmdwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgUG9pbnQgc3RhcnRQdCwgQ29udHJvbEFjdGlvblVQUCBhY3Rpb25Qcm9jKQogewotICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotICAgICAgICBzaG9ydCBjX3J2ID0gLTE7CisgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgIHNob3J0IGNfcnYgPSAtMTsKIAotICAgICAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotICAgICAgICAvKiBXZSBjYW5ub3QgcGFzcyB0aGUgYWN0aW9uUHJvYyB3aXRob3V0IGxvdHMgb2Ygd29yayAqLwotICAgICAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT08mIiwgY3RsX29iaiwgUHlNYWNfQnVpbGRQb2ludCwgc3RhcnRQdCk7Ci0gICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVUcmFja2luZ1Byb2NUYWcsIGFyZ2xpc3QpOwotICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOwotICAgICAgICBpZiAoIHJ2ICkKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5X1hERUNSRUYocnYpOwotICAgICAgICByZXR1cm4gKENvbnRyb2xQYXJ0Q29kZSljX3J2OworICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgLyogV2UgY2Fubm90IHBhc3MgdGhlIGFjdGlvblByb2Mgd2l0aG91dCBsb3RzIG9mIHdvcmsgKi8KKyAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT08mIiwgY3RsX29iaiwgUHlNYWNfQnVpbGRQb2ludCwgc3RhcnRQdCk7CisgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nUHJvY1RhZywgYXJnbGlzdCk7CisgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICBpZiAoIHJ2ICkKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hERUNSRUYocnYpOworICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAKICNlbHNlIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBDdGxfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHZvaWQgaW5pdF9DdGwodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCi0JbXl0cmFja2VyX3VwcCA9IE5ld0NvbnRyb2xBY3Rpb25VUFAobXl0cmFja2VyKTsKLQlteWFjdGlvbnByb2NfdXBwID0gTmV3Q29udHJvbEFjdGlvblVQUChteWFjdGlvbnByb2MpOwotCW15a2V5ZG93bnByb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lS2V5RG93blVQUChteWtleWRvd25wcm9jKTsKLQlteWZvY3VzcHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVGb2N1c1VQUChteWZvY3VzcHJvYyk7Ci0JbXlkcmF3cHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVEcmF3VVBQKG15ZHJhd3Byb2MpOwotCW15aWRsZXByb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lSWRsZVVQUChteWlkbGVwcm9jKTsKLQlteWhpdHRlc3Rwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RVUFAobXloaXR0ZXN0cHJvYyk7Ci0JbXl0cmFja2luZ3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lVHJhY2tpbmdVUFAobXl0cmFja2luZ3Byb2MpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbnRyb2xIYW5kbGUsIEN0bE9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb250cm9sSGFuZGxlLCBDdGxPYmpfQ29udmVydCk7CisgICAgbXl0cmFja2VyX3VwcCA9IE5ld0NvbnRyb2xBY3Rpb25VUFAobXl0cmFja2VyKTsKKyAgICBteWFjdGlvbnByb2NfdXBwID0gTmV3Q29udHJvbEFjdGlvblVQUChteWFjdGlvbnByb2MpOworICAgIG15a2V5ZG93bnByb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lS2V5RG93blVQUChteWtleWRvd25wcm9jKTsKKyAgICBteWZvY3VzcHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVGb2N1c1VQUChteWZvY3VzcHJvYyk7CisgICAgbXlkcmF3cHJvY191cHAgPSBOZXdDb250cm9sVXNlclBhbmVEcmF3VVBQKG15ZHJhd3Byb2MpOworICAgIG15aWRsZXByb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lSWRsZVVQUChteWlkbGVwcm9jKTsKKyAgICBteWhpdHRlc3Rwcm9jX3VwcCA9IE5ld0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RVUFAobXloaXR0ZXN0cHJvYyk7CisgICAgbXl0cmFja2luZ3Byb2NfdXBwID0gTmV3Q29udHJvbFVzZXJQYW5lVHJhY2tpbmdVUFAobXl0cmFja2luZ3Byb2MpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbnRyb2xIYW5kbGUsIEN0bE9ial9OZXcpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb250cm9sSGFuZGxlLCBDdGxPYmpfQ29udmVydCk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0N0bCIsIEN0bF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0N0bCIsIEN0bF9tZXRob2RzKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUN0bF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEN0bF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIEN0bF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUNvbnRyb2xfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkNvbnRyb2xfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZDb250cm9sX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29udHJvbCIsIChQeU9iamVjdCAqKSZDb250cm9sX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmQ29udHJvbF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkNvbnRyb2xUeXBlIiwgKFB5T2JqZWN0ICopJkNvbnRyb2xfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgQ3RsX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoQ3RsX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgQ3RsX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgQ29udHJvbF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQ29udHJvbF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkNvbnRyb2xfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDb250cm9sIiwgKFB5T2JqZWN0ICopJkNvbnRyb2xfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZDb250cm9sX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ29udHJvbFR5cGUiLCAoUHlPYmplY3QgKikmQ29udHJvbF9UeXBlKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZGxnL19EbGdtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2RsZy9fRGxnbW9kdWxlLmMKaW5kZXggOWFmYTQ3Ny4uYzRkNjZhOSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZGxnL19EbGdtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9kbGcvX0RsZ21vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zNSw1NSArMzUsNTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWNvcmQgKmV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqaXRlbUhpdCkKIHsKLSAgICAgICAgQm9vbGVhbiBydjsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7Ci0gICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrOwotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogRGVmYXVsdCBiZWhhdmlvciAqLwotICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IE5VTEw7IC8qIFdlJ2xsIHJlc3RvcmUgaXQgd2hlbiBjYWxsIHN1Y2Nlc3NmdWwgKi8KLSAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgZXZlbnQpOwotICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJlcyA9IE5VTEw7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGNhbGxiYWNrLCBhcmdzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgQm9vbGVhbiBydjsKKyAgICBQeU9iamVjdCAqYXJncywgKnJlczsKKyAgICBQeU9iamVjdCAqY2FsbGJhY2sgPSBEbGdfRmlsdGVyUHJvY19jYWxsYmFjazsKKyAgICBpZiAoY2FsbGJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7IC8qIERlZmF1bHQgYmVoYXZpb3IgKi8KKyAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IE5VTEw7IC8qIFdlJ2xsIHJlc3RvcmUgaXQgd2hlbiBjYWxsIHN1Y2Nlc3NmdWwgKi8KKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsIERsZ09ial9XaGljaERpYWxvZywgZGlhbG9nLCBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCBldmVudCk7CisgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgcmVzID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoY2FsbGJhY2ssIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBGaWx0ZXJcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICAqaXRlbUhpdCA9IC0xOyAvKiBGYWtlIHJldHVybiBpdGVtICovCisgICAgICAgIHJldHVybiAxOyAvKiBXZSBoYW5kbGVkIGl0ICovCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBpZiAoUHlJbnRfQ2hlY2socmVzKSkgeworICAgICAgICAgICAgKml0ZW1IaXQgPSBQeUludF9Bc0xvbmcocmVzKTsKKyAgICAgICAgICAgIHJ2ID0gMTsKICAgICAgICAgfQotICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIERpYWxvZyBGaWx0ZXJcbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgICAgICAgICAgKml0ZW1IaXQgPSAtMTsgLyogRmFrZSByZXR1cm4gaXRlbSAqLwotICAgICAgICAgICAgICAgIHJldHVybiAxOyAvKiBXZSBoYW5kbGVkIGl0ICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgICAgICAgICBpZiAoUHlJbnRfQ2hlY2socmVzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKml0ZW1IaXQgPSBQeUludF9Bc0xvbmcocmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSBQeU9iamVjdF9Jc1RydWUocmVzKTsKLSAgICAgICAgfQotICAgICAgICBQeV9ERUNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICBlbHNlCisgICAgICAgICAgICBydiA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgIH0KKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBNb2RhbEZpbHRlclVQUAogRGxnX1Bhc3NGaWx0ZXJQcm9jKFB5T2JqZWN0ICpjYWxsYmFjaykKIHsKLSAgICAgICAgUHlPYmplY3QgKnRtcCA9IERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrOwotICAgICAgICBzdGF0aWMgTW9kYWxGaWx0ZXJVUFAgVW5pdkZpbHRlclVwcCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRtcCA9IERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrOworICAgIHN0YXRpYyBNb2RhbEZpbHRlclVQUCBVbml2RmlsdGVyVXBwID0gTlVMTDsKIAotICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IE5VTEw7Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0bXApOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7Ci0gICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOworICAgIGlmIChjYWxsYmFjayA9PSBQeV9Ob25lKSB7CiAgICAgICAgIFB5X1hERUNSRUYodG1wKTsKLSAgICAgICAgaWYgKCBVbml2RmlsdGVyVXBwID09IE5VTEwgKQotICAgICAgICAgICAgICAgIFVuaXZGaWx0ZXJVcHAgPSBOZXdNb2RhbEZpbHRlclVQUCgmRGxnX1VuaXZGaWx0ZXJQcm9jKTsKLSAgICAgICAgcmV0dXJuIFVuaXZGaWx0ZXJVcHA7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9JTkNSRUYoY2FsbGJhY2spOworICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgUHlfWERFQ1JFRih0bXApOworICAgIGlmICggVW5pdkZpbHRlclVwcCA9PSBOVUxMICkKKyAgICAgICAgVW5pdkZpbHRlclVwcCA9IE5ld01vZGFsRmlsdGVyVVBQKCZEbGdfVW5pdkZpbHRlclByb2MpOworICAgIHJldHVybiBVbml2RmlsdGVyVXBwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPSBOVUxMOwpAQCAtOTEsMjQgKzkxLDI0IEBACiBzdGF0aWMgcGFzY2FsIHZvaWQgRGxnX1VuaXZVc2VySXRlbVByb2MoRGlhbG9nUHRyIGRpYWxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgaXRlbSkKIHsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CiAKLSAgICAgICAgaWYgKERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm47IC8qIERlZmF1bHQgYmVoYXZpb3IgKi8KLSAgICAgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgaXRlbSk7Ci0gICAgICAgIGlmIChhcmdzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmVzID0gTlVMTDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjaywgYXJncyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gRGlhbG9nIFVzZXJJdGVtIHByb2NcbiIpOwotICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfWERFQ1JFRihyZXMpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCisgICAgRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCisgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsIERsZ09ial9XaGljaERpYWxvZywgZGlhbG9nLCBpdGVtKTsKKyAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICByZXMgPSBOVUxMOworICAgIGVsc2UgeworICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIH0KKyAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgVXNlckl0ZW0gcHJvY1xuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgfQorICAgIFB5X1hERUNSRUYocmVzKTsKKyAgICByZXR1cm47CiB9CiAKICNpZiAwCkBAIC0xMzMsODExICsxMzMsODExIEBACiAjZGVmaW5lIERsZ09ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZEaWFsb2dfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmRGlhbG9nX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBEaWFsb2dPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlEaWFsb2dQdHIgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBEaWFsb2dQdHIgb2JfaXRzZWxmOwogfSBEaWFsb2dPYmplY3Q7CiAKIFB5T2JqZWN0ICpEbGdPYmpfTmV3KERpYWxvZ1B0ciBpdHNlbGYpCiB7Ci0JRGlhbG9nT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsgUHlfSU5DUkVGKFB5X05vbmUpOyByZXR1cm4gUHlfTm9uZTsgfQotCWl0ID0gUHlPYmplY3RfTkVXKERpYWxvZ09iamVjdCwgJkRpYWxvZ19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlTZXRXUmVmQ29uKEdldERpYWxvZ1dpbmRvdyhpdHNlbGYpLCAobG9uZylpdCk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIERpYWxvZ09iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7IFB5X0lOQ1JFRihQeV9Ob25lKTsgcmV0dXJuIFB5X05vbmU7IH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhEaWFsb2dPYmplY3QsICZEaWFsb2dfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgU2V0V1JlZkNvbihHZXREaWFsb2dXaW5kb3coaXRzZWxmKSwgKGxvbmcpaXQpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IERsZ09ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBEaWFsb2dQdHIgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQlpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKERpYWxvZ1B0cilQeUludF9Bc0xvbmcodik7Ci0JICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOyB9Ci0JaWYgKCFEbGdPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRGlhbG9nIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKERpYWxvZ09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgIGlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoRGlhbG9nUHRyKVB5SW50X0FzTG9uZyh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7IH0KKyAgICBpZiAoIURsZ09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJEaWFsb2cgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRGlhbG9nT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgRGxnT2JqX2RlYWxsb2MoRGlhbG9nT2JqZWN0ICpzZWxmKQogewotCURpc3Bvc2VEaWFsb2coc2VsZi0+b2JfaXRzZWxmKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIERpc3Bvc2VEaWFsb2coc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9EcmF3RGlhbG9nKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEcmF3RGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd0RpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd0RpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhd0RpYWxvZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdEaWFsb2coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9VcGRhdGVEaWFsb2coRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgdXBkYXRlUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgdXBkYXRlUmduOwogI2lmbmRlZiBVcGRhdGVEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZURpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVXBkYXRlRGlhbG9nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIHVwZGF0ZVJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ1cGRhdGVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVcGRhdGVEaWFsb2coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0hpZGVEaWFsb2dJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKICNpZm5kZWYgSGlkZURpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhIaWRlRGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlkZURpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8pKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGl0ZW1Obyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSGlkZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpdGVtTm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2hvd0RpYWxvZ0l0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbU5vOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggaXRlbU5vOwogI2lmbmRlZiBTaG93RGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKFNob3dEaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93RGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObykpCi0JCXJldHVybiBOVUxMOwotCVNob3dEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaXRlbU5vKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG93RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGl0ZW1Obyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9GaW5kRGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleFplcm9CYXNlZCBfcnY7Ci0JUG9pbnQgdGhlUHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleFplcm9CYXNlZCBfcnY7CisgICAgUG9pbnQgdGhlUHQ7CiAjaWZuZGVmIEZpbmREaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soRmluZERpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbmREaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZpbmREaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdGhlUHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZpbmREaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlUHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9EaWFsb2dDdXQoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpYWxvZ0N1dAotCVB5TWFjX1BSRUNIRUNLKERpYWxvZ0N1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlhbG9nQ3V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaWFsb2dDdXQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaWFsb2dDdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9EaWFsb2dQYXN0ZShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlhbG9nUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhEaWFsb2dQYXN0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlhbG9nUGFzdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpYWxvZ1Bhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlhbG9nUGFzdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9EaWFsb2dDb3B5KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaWFsb2dDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soRGlhbG9nQ29weSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlhbG9nQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlhbG9nQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpYWxvZ0NvcHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9EaWFsb2dEZWxldGUoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpYWxvZ0RlbGV0ZQotCVB5TWFjX1BSRUNIRUNLKERpYWxvZ0RlbGV0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlhbG9nRGVsZXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaWFsb2dEZWxldGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaWFsb2dEZWxldGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKLQlEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZTsKLQlIYW5kbGUgaXRlbTsKLQlSZWN0IGJveDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKKyAgICBEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZTsKKyAgICBIYW5kbGUgaXRlbTsKKyAgICBSZWN0IGJveDsKICNpZm5kZWYgR2V0RGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8pKQotCQlyZXR1cm4gTlVMTDsKLQlHZXREaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBpdGVtTm8sCi0JICAgICAgICAgICAgICAmaXRlbVR5cGUsCi0JICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICZib3gpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3gpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaXRlbU5vLAorICAgICAgICAgICAgICAgICAgJml0ZW1UeXBlLAorICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAmYm94KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm94KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87Ci0JRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7Ci0JSGFuZGxlIGl0ZW07Ci0JUmVjdCBib3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtTm87CisgICAgRGlhbG9nSXRlbVR5cGUgaXRlbVR5cGU7CisgICAgSGFuZGxlIGl0ZW07CisgICAgUmVjdCBib3g7CiAjaWZuZGVmIFNldERpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaXRlbU5vLAotCSAgICAgICAgICAgICAgaXRlbVR5cGUsCi0JICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgJmJveCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaXRlbU5vLAorICAgICAgICAgICAgICAgICAgaXRlbVR5cGUsCisgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgJmJveCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TZWxlY3REaWFsb2dJdGVtVGV4dChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtTm87Ci0JU0ludDE2IHN0cnRTZWw7Ci0JU0ludDE2IGVuZFNlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKKyAgICBTSW50MTYgc3RydFNlbDsKKyAgICBTSW50MTYgZW5kU2VsOwogI2lmbmRlZiBTZWxlY3REaWFsb2dJdGVtVGV4dAotCVB5TWFjX1BSRUNIRUNLKFNlbGVjdERpYWxvZ0l0ZW1UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZWxlY3REaWFsb2dJdGVtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RydFNlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuZFNlbCkpCi0JCXJldHVybiBOVUxMOwotCVNlbGVjdERpYWxvZ0l0ZW1UZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgIHN0cnRTZWwsCi0JICAgICAgICAgICAgICAgICAgICAgZW5kU2VsKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cnRTZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRTZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWxlY3REaWFsb2dJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1ObywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ0U2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFNlbCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9BcHBlbmRESVRMKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIHRoZUhhbmRsZTsKLQlESVRMTWV0aG9kIG1ldGhvZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHRoZUhhbmRsZTsKKyAgICBESVRMTWV0aG9kIG1ldGhvZDsKICNpZm5kZWYgQXBwZW5kRElUTAotCVB5TWFjX1BSRUNIRUNLKEFwcGVuZERJVEwpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZERJVEwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVIYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZXRob2QpKQotCQlyZXR1cm4gTlVMTDsKLQlBcHBlbmRESVRMKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICB0aGVIYW5kbGUsCi0JICAgICAgICAgICBtZXRob2QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGhvZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFwcGVuZERJVEwoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIHRoZUhhbmRsZSwKKyAgICAgICAgICAgICAgIG1ldGhvZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9Db3VudERJVEwoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggX3J2OwogI2lmbmRlZiBDb3VudERJVEwKLQlQeU1hY19QUkVDSEVDSyhDb3VudERJVEwpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50RElUTCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRESVRMKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudERJVEwoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1Nob3J0ZW5ESVRMKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IG51bWJlckl0ZW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggbnVtYmVySXRlbXM7CiAjaWZuZGVmIFNob3J0ZW5ESVRMCi0JUHlNYWNfUFJFQ0hFQ0soU2hvcnRlbkRJVEwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3J0ZW5ESVRMKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVySXRlbXMpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG9ydGVuRElUTChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIG51bWJlckl0ZW1zKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJJdGVtcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3J0ZW5ESVRMKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgbnVtYmVySXRlbXMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfSW5zZXJ0RGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRGlhbG9nSXRlbUluZGV4IGFmdGVySXRlbTsKLQlEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZTsKLQlIYW5kbGUgaXRlbUhhbmRsZTsKLQlSZWN0IGJveDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEaWFsb2dJdGVtSW5kZXggYWZ0ZXJJdGVtOworICAgIERpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlOworICAgIEhhbmRsZSBpdGVtSGFuZGxlOworICAgIFJlY3QgYm94OwogI2lmbmRlZiBJbnNlcnREaWFsb2dJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0RGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0RGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnNlcnREaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1IYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmJveCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0RGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3gpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9SZW1vdmVEaWFsb2dJdGVtcyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKLQlEaWFsb2dJdGVtSW5kZXggYW1vdW50VG9SZW1vdmU7Ci0JQm9vbGVhbiBkaXNwb3NlSXRlbURhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRGlhbG9nSXRlbUluZGV4IGl0ZW1ObzsKKyAgICBEaWFsb2dJdGVtSW5kZXggYW1vdW50VG9SZW1vdmU7CisgICAgQm9vbGVhbiBkaXNwb3NlSXRlbURhdGE7CiAjaWZuZGVmIFJlbW92ZURpYWxvZ0l0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlRGlhbG9nSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZURpYWxvZ0l0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZhbW91bnRUb1JlbW92ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpc3Bvc2VJdGVtRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVEaWFsb2dJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudFRvUmVtb3ZlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NlSXRlbURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbW91bnRUb1JlbW92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3Bvc2VJdGVtRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVEaWFsb2dJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb3VudFRvUmVtb3ZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NlSXRlbURhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TdGRGaWx0ZXJQcm9jKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRSZWNvcmQgZXZlbnQ7Ci0JRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVjb3JkIGV2ZW50OworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0OwogI2lmbmRlZiBTdGRGaWx0ZXJQcm9jCi0JUHlNYWNfUFJFQ0hFQ0soU3RkRmlsdGVyUHJvYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RkRmlsdGVyUHJvYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN0ZEZpbHRlclByb2MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZldmVudCwKLQkgICAgICAgICAgICAgICAgICAgICZpdGVtSGl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZldmVudCwKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFN0ZEZpbHRlclByb2MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtSGl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfU2V0RGlhbG9nRGVmYXVsdEl0ZW0oRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURpYWxvZ0l0ZW1JbmRleCBuZXdJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIERpYWxvZ0l0ZW1JbmRleCBuZXdJdGVtOwogI2lmbmRlZiBTZXREaWFsb2dEZWZhdWx0SXRlbQotCVB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0RlZmF1bHRJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dEZWZhdWx0SXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld0l0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGlhbG9nRGVmYXVsdEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SXRlbSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdJdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERpYWxvZ0RlZmF1bHRJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TZXREaWFsb2dDYW5jZWxJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEaWFsb2dJdGVtSW5kZXggbmV3SXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEaWFsb2dJdGVtSW5kZXggbmV3SXRlbTsKICNpZm5kZWYgU2V0RGlhbG9nQ2FuY2VsSXRlbQotCVB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0NhbmNlbEl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ0NhbmNlbEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERpYWxvZ0NhbmNlbEl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0l0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGlhbG9nQ2FuY2VsSXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0l0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TZXREaWFsb2dUcmFja3NDdXJzb3IoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUJvb2xlYW4gdHJhY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEJvb2xlYW4gdHJhY2tzOwogI2lmbmRlZiBTZXREaWFsb2dUcmFja3NDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dUcmFja3NDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERpYWxvZ1RyYWNrc0N1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREaWFsb2dUcmFja3NDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RGlhbG9nVHJhY2tzQ3Vyc29yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9BdXRvU2l6ZURpYWxvZyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEF1dG9TaXplRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soQXV0b1NpemVEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKEF1dG9TaXplRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXV0b1NpemVEaWFsb2coX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBdXRvU2l6ZURpYWxvZyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nSXRlbUFzQ29udHJvbChEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbU5vOwotCUNvbnRyb2xIYW5kbGUgb3V0Q29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtTm87CisgICAgQ29udHJvbEhhbmRsZSBvdXRDb250cm9sOwogI2lmbmRlZiBHZXREaWFsb2dJdGVtQXNDb250cm9sCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nSXRlbUFzQ29udHJvbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nSXRlbUFzQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIG91dENvbnRyb2wpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtTm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGlhbG9nSXRlbUFzQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb250cm9sKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgb3V0Q29udHJvbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX01vdmVEaWFsb2dJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtTm87Ci0JU0ludDE2IGluSG9yaXo7Ci0JU0ludDE2IGluVmVydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtTm87CisgICAgU0ludDE2IGluSG9yaXo7CisgICAgU0ludDE2IGluVmVydDsKICNpZm5kZWYgTW92ZURpYWxvZ0l0ZW0KLQlQeU1hY19QUkVDSEVDSyhNb3ZlRGlhbG9nSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92ZURpYWxvZ0l0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbU5vLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Ib3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVmVydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBNb3ZlRGlhbG9nSXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1ObywKLQkgICAgICAgICAgICAgICAgICAgICAgaW5Ib3JpeiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5WZXJ0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5WZXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE1vdmVEaWFsb2dJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblZlcnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TaXplRGlhbG9nSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbU5vOwotCVNJbnQxNiBpbldpZHRoOwotCVNJbnQxNiBpbkhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtTm87CisgICAgU0ludDE2IGluV2lkdGg7CisgICAgU0ludDE2IGluSGVpZ2h0OwogI2lmbmRlZiBTaXplRGlhbG9nSXRlbQotCVB5TWFjX1BSRUNIRUNLKFNpemVEaWFsb2dJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaXplRGlhbG9nSXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2l6ZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTm8sCi0JICAgICAgICAgICAgICAgICAgICAgIGluV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIGluSGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2l6ZURpYWxvZ0l0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfQXBwZW5kRGlhbG9nSXRlbUxpc3QoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBkaXRsSUQ7Ci0JRElUTE1ldGhvZCBtZXRob2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGRpdGxJRDsKKyAgICBESVRMTWV0aG9kIG1ldGhvZDsKICNpZm5kZWYgQXBwZW5kRGlhbG9nSXRlbUxpc3QKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmREaWFsb2dJdGVtTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQXBwZW5kRGlhbG9nSXRlbUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGl0bElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFwcGVuZERpYWxvZ0l0ZW1MaXN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdGxJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXRsSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRob2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQXBwZW5kRGlhbG9nSXRlbUxpc3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl0bElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TZXREaWFsb2dUaW1lb3V0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgaW5CdXR0b25Ub1ByZXNzOwotCVVJbnQzMiBpblNlY29uZHNUb1dhaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IGluQnV0dG9uVG9QcmVzczsKKyAgICBVSW50MzIgaW5TZWNvbmRzVG9XYWl0OwogI2lmbmRlZiBTZXREaWFsb2dUaW1lb3V0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nVGltZW91dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nVGltZW91dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJ1dHRvblRvUHJlc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblNlY29uZHNUb1dhaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGlhbG9nVGltZW91dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQnV0dG9uVG9QcmVzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICBpblNlY29uZHNUb1dhaXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnV0dG9uVG9QcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2Vjb25kc1RvV2FpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREaWFsb2dUaW1lb3V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdXR0b25Ub1ByZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2Vjb25kc1RvV2FpdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ1RpbWVvdXQoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNJbnQxNiBvdXRCdXR0b25Ub1ByZXNzOwotCVVJbnQzMiBvdXRTZWNvbmRzVG9XYWl0OwotCVVJbnQzMiBvdXRTZWNvbmRzUmVtYWluaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBvdXRCdXR0b25Ub1ByZXNzOworICAgIFVJbnQzMiBvdXRTZWNvbmRzVG9XYWl0OworICAgIFVJbnQzMiBvdXRTZWNvbmRzUmVtYWluaW5nOwogI2lmbmRlZiBHZXREaWFsb2dUaW1lb3V0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nVGltZW91dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nVGltZW91dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERpYWxvZ1RpbWVvdXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QnV0dG9uVG9QcmVzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2Vjb25kc1RvV2FpdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2Vjb25kc1JlbWFpbmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRCdXR0b25Ub1ByZXNzLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFNlY29uZHNUb1dhaXQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U2Vjb25kc1JlbWFpbmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREaWFsb2dUaW1lb3V0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1dHRvblRvUHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNlY29uZHNUb1dhaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNlY29uZHNSZW1haW5pbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnV0dG9uVG9QcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTZWNvbmRzVG9XYWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFNlY29uZHNSZW1haW5pbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9TZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRXZlbnRNYXNrIGluTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBFdmVudE1hc2sgaW5NYXNrOwogI2lmbmRlZiBTZXRNb2RhbERpYWxvZ0V2ZW50TWFzawotCVB5TWFjX1BSRUNIRUNLKFNldE1vZGFsRGlhbG9nRXZlbnRNYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hc2spOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1vZGFsRGlhbG9nRXZlbnRNYXNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWFzayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldE1vZGFsRGlhbG9nRXZlbnRNYXNrKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlFdmVudE1hc2sgb3V0TWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBFdmVudE1hc2sgb3V0TWFzazsKICNpZm5kZWYgR2V0TW9kYWxEaWFsb2dFdmVudE1hc2sKLQlQeU1hY19QUkVDSEVDSyhHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW9kYWxEaWFsb2dFdmVudE1hc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWFzayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0TWFzayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb2RhbERpYWxvZ0V2ZW50TWFzayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWFzayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TWFzayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ1dpbmRvdyhEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREaWFsb2dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dUZXh0RWRpdEhhbmRsZShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRFSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXREaWFsb2dUZXh0RWRpdEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1RleHRFZGl0SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dUZXh0RWRpdEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREaWFsb2dUZXh0RWRpdEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ0RlZmF1bHRJdGVtKERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgR2V0RGlhbG9nRGVmYXVsdEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dEZWZhdWx0SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nRGVmYXVsdEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERpYWxvZ0RlZmF1bHRJdGVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREaWFsb2dEZWZhdWx0SXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfR2V0RGlhbG9nQ2FuY2VsSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ0NhbmNlbEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dDYW5jZWxJdGVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dDYW5jZWxJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dDYW5jZWxJdGVtKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREaWFsb2dDYW5jZWxJdGVtKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ09ial9HZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbShEaWFsb2dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dLZXlib2FyZEZvY3VzSXRlbShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX1NldFBvcnREaWFsb2dQb3J0KERpYWxvZ09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTZXRQb3J0RGlhbG9nUG9ydAotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnREaWFsb2dQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0RGlhbG9nUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydERpYWxvZ1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0RGlhbG9nUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnT2JqX0dldERpYWxvZ1BvcnQoRGlhbG9nT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIF9ydjsKICNpZm5kZWYgR2V0RGlhbG9nUG9ydAotCVB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1BvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERpYWxvZ1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldERpYWxvZ1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGlhbG9nUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRGxnT2JqX21ldGhvZHNbXSA9IHsKLQl7IkRyYXdEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0RyYXdEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZURpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdPYmpfVXBkYXRlRGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdXBkYXRlUmduKSAtPiBOb25lIil9LAotCXsiSGlkZURpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0hpZGVEaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiBOb25lIil9LAotCXsiU2hvd0RpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1Nob3dEaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiBOb25lIil9LAotCXsiRmluZERpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0ZpbmREaWFsb2dJdGVtLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVQdCkgLT4gKERpYWxvZ0l0ZW1JbmRleFplcm9CYXNlZCBfcnYpIil9LAotCXsiRGlhbG9nQ3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EaWFsb2dDdXQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRpYWxvZ1Bhc3RlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EaWFsb2dQYXN0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRGlhbG9nQ29weSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRGlhbG9nRGVsZXRlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EaWFsb2dEZWxldGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldERpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBpdGVtTm8pIC0+IChEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW0sIFJlY3QgYm94KSIpfSwKLQl7IlNldERpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBpdGVtTm8sIERpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlLCBIYW5kbGUgaXRlbSwgUmVjdCBib3gpIC0+IE5vbmUiKX0sCi0JeyJTZWxlY3REaWFsb2dJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2VsZWN0RGlhbG9nSXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBpdGVtTm8sIFNJbnQxNiBzdHJ0U2VsLCBTSW50MTYgZW5kU2VsKSAtPiBOb25lIil9LAotCXsiQXBwZW5kRElUTCIsIChQeUNGdW5jdGlvbilEbGdPYmpfQXBwZW5kRElUTCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZUhhbmRsZSwgRElUTE1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCi0JeyJDb3VudERJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0NvdW50RElUTCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCi0JeyJTaG9ydGVuRElUTCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2hvcnRlbkRJVEwsIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBudW1iZXJJdGVtcykgLT4gTm9uZSIpfSwKLQl7Ikluc2VydERpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0luc2VydERpYWxvZ0l0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBhZnRlckl0ZW0sIERpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlLCBIYW5kbGUgaXRlbUhhbmRsZSwgUmVjdCBib3gpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVEaWFsb2dJdGVtcyIsIChQeUNGdW5jdGlvbilEbGdPYmpfUmVtb3ZlRGlhbG9nSXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBpdGVtTm8sIERpYWxvZ0l0ZW1JbmRleCBhbW91bnRUb1JlbW92ZSwgQm9vbGVhbiBkaXNwb3NlSXRlbURhdGEpIC0+IE5vbmUiKX0sCi0JeyJTdGRGaWx0ZXJQcm9jIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TdGRGaWx0ZXJQcm9jLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCBldmVudCwgRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgZXZlbnQsIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0KSIpfSwKLQl7IlNldERpYWxvZ0RlZmF1bHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dEZWZhdWx0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW0pIC0+IE5vbmUiKX0sCi0JeyJTZXREaWFsb2dDYW5jZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dDYW5jZWxJdGVtLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggbmV3SXRlbSkgLT4gTm9uZSIpfSwKLQl7IlNldERpYWxvZ1RyYWNrc0N1cnNvciIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nVHJhY2tzQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIHRyYWNrcykgLT4gTm9uZSIpfSwKLQl7IkF1dG9TaXplRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9BdXRvU2l6ZURpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0RGlhbG9nSXRlbUFzQ29udHJvbCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nSXRlbUFzQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbU5vKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKLQl7Ik1vdmVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9Nb3ZlRGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbU5vLCBTSW50MTYgaW5Ib3JpeiwgU0ludDE2IGluVmVydCkgLT4gTm9uZSIpfSwKLQl7IlNpemVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TaXplRGlhbG9nSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbU5vLCBTSW50MTYgaW5XaWR0aCwgU0ludDE2IGluSGVpZ2h0KSAtPiBOb25lIil9LAotCXsiQXBwZW5kRGlhbG9nSXRlbUxpc3QiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0FwcGVuZERpYWxvZ0l0ZW1MaXN0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZGl0bElELCBESVRMTWV0aG9kIG1ldGhvZCkgLT4gTm9uZSIpfSwKLQl7IlNldERpYWxvZ1RpbWVvdXQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ1RpbWVvdXQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkJ1dHRvblRvUHJlc3MsIFVJbnQzMiBpblNlY29uZHNUb1dhaXQpIC0+IE5vbmUiKX0sCi0JeyJHZXREaWFsb2dUaW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dUaW1lb3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0QnV0dG9uVG9QcmVzcywgVUludDMyIG91dFNlY29uZHNUb1dhaXQsIFVJbnQzMiBvdXRTZWNvbmRzUmVtYWluaW5nKSIpfSwKLQl7IlNldE1vZGFsRGlhbG9nRXZlbnRNYXNrIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXRNb2RhbERpYWxvZ0V2ZW50TWFzaywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGluTWFzaykgLT4gTm9uZSIpfSwKLQl7IkdldE1vZGFsRGlhbG9nRXZlbnRNYXNrIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXRNb2RhbERpYWxvZ0V2ZW50TWFzaywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRNYXNrIG91dE1hc2spIil9LAotCXsiR2V0RGlhbG9nV2luZG93IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ1RleHRFZGl0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChURUhhbmRsZSBfcnYpIil9LAotCXsiR2V0RGlhbG9nRGVmYXVsdEl0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0RlZmF1bHRJdGVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkdldERpYWxvZ0NhbmNlbEl0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0NhbmNlbEl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlNldFBvcnREaWFsb2dQb3J0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXRQb3J0RGlhbG9nUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0RGlhbG9nUG9ydCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkRyYXdEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0RyYXdEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZURpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdPYmpfVXBkYXRlRGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdXBkYXRlUmduKSAtPiBOb25lIil9LAorICAgIHsiSGlkZURpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0hpZGVEaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiBOb25lIil9LAorICAgIHsiU2hvd0RpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1Nob3dEaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggaXRlbU5vKSAtPiBOb25lIil9LAorICAgIHsiRmluZERpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0ZpbmREaWFsb2dJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVQdCkgLT4gKERpYWxvZ0l0ZW1JbmRleFplcm9CYXNlZCBfcnYpIil9LAorICAgIHsiRGlhbG9nQ3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EaWFsb2dDdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpYWxvZ1Bhc3RlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EaWFsb2dQYXN0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGlhbG9nQ29weSIsIChQeUNGdW5jdGlvbilEbGdPYmpfRGlhbG9nQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGlhbG9nRGVsZXRlIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9EaWFsb2dEZWxldGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldERpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBpdGVtTm8pIC0+IChEaWFsb2dJdGVtVHlwZSBpdGVtVHlwZSwgSGFuZGxlIGl0ZW0sIFJlY3QgYm94KSIpfSwKKyAgICB7IlNldERpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBpdGVtTm8sIERpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlLCBIYW5kbGUgaXRlbSwgUmVjdCBib3gpIC0+IE5vbmUiKX0sCisgICAgeyJTZWxlY3REaWFsb2dJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2VsZWN0RGlhbG9nSXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBpdGVtTm8sIFNJbnQxNiBzdHJ0U2VsLCBTSW50MTYgZW5kU2VsKSAtPiBOb25lIil9LAorICAgIHsiQXBwZW5kRElUTCIsIChQeUNGdW5jdGlvbilEbGdPYmpfQXBwZW5kRElUTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZUhhbmRsZSwgRElUTE1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudERJVEwiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0NvdW50RElUTCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCisgICAgeyJTaG9ydGVuRElUTCIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2hvcnRlbkRJVEwsIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBudW1iZXJJdGVtcykgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydERpYWxvZ0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0luc2VydERpYWxvZ0l0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBhZnRlckl0ZW0sIERpYWxvZ0l0ZW1UeXBlIGl0ZW1UeXBlLCBIYW5kbGUgaXRlbUhhbmRsZSwgUmVjdCBib3gpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVEaWFsb2dJdGVtcyIsIChQeUNGdW5jdGlvbilEbGdPYmpfUmVtb3ZlRGlhbG9nSXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ0l0ZW1JbmRleCBpdGVtTm8sIERpYWxvZ0l0ZW1JbmRleCBhbW91bnRUb1JlbW92ZSwgQm9vbGVhbiBkaXNwb3NlSXRlbURhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJTdGRGaWx0ZXJQcm9jIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TdGRGaWx0ZXJQcm9jLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBldmVudCwgRGlhbG9nSXRlbUluZGV4IGl0ZW1IaXQpIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgZXZlbnQsIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0KSIpfSwKKyAgICB7IlNldERpYWxvZ0RlZmF1bHRJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dEZWZhdWx0SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGlhbG9nSXRlbUluZGV4IG5ld0l0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJTZXREaWFsb2dDYW5jZWxJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXREaWFsb2dDYW5jZWxJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihEaWFsb2dJdGVtSW5kZXggbmV3SXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldERpYWxvZ1RyYWNrc0N1cnNvciIsIChQeUNGdW5jdGlvbilEbGdPYmpfU2V0RGlhbG9nVHJhY2tzQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHRyYWNrcykgLT4gTm9uZSIpfSwKKyAgICB7IkF1dG9TaXplRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9BdXRvU2l6ZURpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGlhbG9nSXRlbUFzQ29udHJvbCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nSXRlbUFzQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbU5vKSAtPiAoQ29udHJvbEhhbmRsZSBvdXRDb250cm9sKSIpfSwKKyAgICB7Ik1vdmVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9Nb3ZlRGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbU5vLCBTSW50MTYgaW5Ib3JpeiwgU0ludDE2IGluVmVydCkgLT4gTm9uZSIpfSwKKyAgICB7IlNpemVEaWFsb2dJdGVtIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TaXplRGlhbG9nSXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbU5vLCBTSW50MTYgaW5XaWR0aCwgU0ludDE2IGluSGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiQXBwZW5kRGlhbG9nSXRlbUxpc3QiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0FwcGVuZERpYWxvZ0l0ZW1MaXN0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZGl0bElELCBESVRMTWV0aG9kIG1ldGhvZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldERpYWxvZ1RpbWVvdXQiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX1NldERpYWxvZ1RpbWVvdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkJ1dHRvblRvUHJlc3MsIFVJbnQzMiBpblNlY29uZHNUb1dhaXQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXREaWFsb2dUaW1lb3V0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dUaW1lb3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgb3V0QnV0dG9uVG9QcmVzcywgVUludDMyIG91dFNlY29uZHNUb1dhaXQsIFVJbnQzMiBvdXRTZWNvbmRzUmVtYWluaW5nKSIpfSwKKyAgICB7IlNldE1vZGFsRGlhbG9nRXZlbnRNYXNrIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXRNb2RhbERpYWxvZ0V2ZW50TWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGluTWFzaykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vZGFsRGlhbG9nRXZlbnRNYXNrIiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXRNb2RhbERpYWxvZ0V2ZW50TWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRXZlbnRNYXNrIG91dE1hc2spIil9LAorICAgIHsiR2V0RGlhbG9nV2luZG93IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9HZXREaWFsb2dXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0RGlhbG9nVGV4dEVkaXRIYW5kbGUiLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ1RleHRFZGl0SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChURUhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0RGlhbG9nRGVmYXVsdEl0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0RlZmF1bHRJdGVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkdldERpYWxvZ0NhbmNlbEl0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0NhbmNlbEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiR2V0RGlhbG9nS2V5Ym9hcmRGb2N1c0l0ZW0iLCAoUHlDRnVuY3Rpb24pRGxnT2JqX0dldERpYWxvZ0tleWJvYXJkRm9jdXNJdGVtLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlNldFBvcnREaWFsb2dQb3J0IiwgKFB5Q0Z1bmN0aW9uKURsZ09ial9TZXRQb3J0RGlhbG9nUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGlhbG9nUG9ydCIsIChQeUNGdW5jdGlvbilEbGdPYmpfR2V0RGlhbG9nUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgRGxnT2JqX2dldHNldGxpc3QgTlVMTApAQCAtOTQ1LDE2ICs5NDUsMTYgQEAKIAogc3RhdGljIGludCBEbGdPYmpfY29tcGFyZShEaWFsb2dPYmplY3QgKnNlbGYsIERpYWxvZ09iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBEbGdPYmpfcmVwciBOVUxMCiAKIHN0YXRpYyBpbnQgRGxnT2JqX2hhc2goRGlhbG9nT2JqZWN0ICpzZWxmKQogewotCXJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CiB9CiAjZGVmaW5lIERsZ09ial90cF9pbml0IDAKIApAQCAtOTYyLDYxICs5NjIsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpEbGdPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCURpYWxvZ1B0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIERpYWxvZ1B0ciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBEbGdPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChEaWFsb2dPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgRGxnT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRGlhbG9nT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIERsZ09ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBEaWFsb2dfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfRGxnLkRpYWxvZyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKERpYWxvZ09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIERsZ09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBEbGdPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIERsZ09ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRGxnT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCURsZ09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlEbGdPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRGxnT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlEbGdPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JRGxnT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JRGxnT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfRGxnLkRpYWxvZyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKERpYWxvZ09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIERsZ09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBEbGdPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIERsZ09ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRGxnT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIERsZ09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBEbGdPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRGxnT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBEbGdPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRGxnT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRGxnT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRGlhbG9nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTAyNCw1MDMgKzEwMjQsNTAzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX05ld0RpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nUHRyIF9ydjsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU3RyMjU1IHRpdGxlOwotCUJvb2xlYW4gdmlzaWJsZTsKLQlTSW50MTYgcHJvY0lEOwotCVdpbmRvd1B0ciBiZWhpbmQ7Ci0JQm9vbGVhbiBnb0F3YXlGbGFnOwotCVNJbnQzMiByZWZDb247Ci0JSGFuZGxlIGl0ZW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dQdHIgX3J2OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTdHIyNTUgdGl0bGU7CisgICAgQm9vbGVhbiB2aXNpYmxlOworICAgIFNJbnQxNiBwcm9jSUQ7CisgICAgV2luZG93UHRyIGJlaGluZDsKKyAgICBCb29sZWFuIGdvQXdheUZsYWc7CisgICAgU0ludDMyIHJlZkNvbjsKKyAgICBIYW5kbGUgaXRlbXM7CiAjaWZuZGVmIE5ld0RpYWxvZwotCVB5TWFjX1BSRUNIRUNLKE5ld0RpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3RGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZnb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3RGlhbG9nKCh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgIHRpdGxlLAotCSAgICAgICAgICAgICAgICB2aXNpYmxlLAotCSAgICAgICAgICAgICAgICBwcm9jSUQsCi0JICAgICAgICAgICAgICAgIGJlaGluZCwKLQkgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICBpdGVtcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3RGlhbG9nKCh2b2lkICopMCwKKyAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlLAorICAgICAgICAgICAgICAgICAgICBwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgIGJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICBpdGVtcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19HZXROZXdEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ1B0ciBfcnY7Ci0JU0ludDE2IGRpYWxvZ0lEOwotCVdpbmRvd1B0ciBiZWhpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ1B0ciBfcnY7CisgICAgU0ludDE2IGRpYWxvZ0lEOworICAgIFdpbmRvd1B0ciBiZWhpbmQ7CiAjaWZuZGVmIEdldE5ld0RpYWxvZwotCVB5TWFjX1BSRUNIRUNLKEdldE5ld0RpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV3RGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaWFsb2dJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXdEaWFsb2coZGlhbG9nSUQsCi0JICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgICAgYmVoaW5kKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIERsZ09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpYWxvZ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5ld0RpYWxvZyhkaWFsb2dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgICBiZWhpbmQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfTmV3Q29sb3JEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ1B0ciBfcnY7Ci0JUmVjdCBib3VuZHNSZWN0OwotCVN0cjI1NSB0aXRsZTsKLQlCb29sZWFuIHZpc2libGU7Ci0JU0ludDE2IHByb2NJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOwotCUJvb2xlYW4gZ29Bd2F5RmxhZzsKLQlTSW50MzIgcmVmQ29uOwotCUhhbmRsZSBpdGVtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nUHRyIF9ydjsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IHRpdGxlOworICAgIEJvb2xlYW4gdmlzaWJsZTsKKyAgICBTSW50MTYgcHJvY0lEOworICAgIFdpbmRvd1B0ciBiZWhpbmQ7CisgICAgQm9vbGVhbiBnb0F3YXlGbGFnOworICAgIFNJbnQzMiByZWZDb247CisgICAgSGFuZGxlIGl0ZW1zOwogI2lmbmRlZiBOZXdDb2xvckRpYWxvZwotCVB5TWFjX1BSRUNIRUNLKE5ld0NvbG9yRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdDb2xvckRpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0NvbG9yRGlhbG9nKCh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgIHByb2NJRCwKLQkgICAgICAgICAgICAgICAgICAgICBiZWhpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICByZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYmhPJmJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld0NvbG9yRGlhbG9nKCh2b2lkICopMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfTW9kYWxEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKLQlEaWFsb2dJdGVtSW5kZXggaXRlbUhpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QqIG1vZGFsRmlsdGVyOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0OwogI2lmbmRlZiBNb2RhbERpYWxvZwotCVB5TWFjX1BSRUNIRUNLKE1vZGFsRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb2RhbERpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW9kYWxEaWFsb2coRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSwKLQkgICAgICAgICAgICAmaXRlbUhpdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIGl0ZW1IaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb2RhbERpYWxvZyhEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpLAorICAgICAgICAgICAgICAgICZpdGVtSGl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUhpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0lzRGlhbG9nRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIHRoZUV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKICNpZm5kZWYgSXNEaWFsb2dFdmVudAotCVB5TWFjX1BSRUNIRUNLKElzRGlhbG9nRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzRGlhbG9nRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNEaWFsb2dFdmVudCgmdGhlRXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZ0aGVFdmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzRGlhbG9nRXZlbnQoJnRoZUV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfRGlhbG9nU2VsZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKLQlEaWFsb2dQdHIgdGhlRGlhbG9nOwotCURpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBEaWFsb2dQdHIgdGhlRGlhbG9nOworICAgIERpYWxvZ0l0ZW1JbmRleCBpdGVtSGl0OwogI2lmbmRlZiBEaWFsb2dTZWxlY3QKLQlQeU1hY19QUkVDSEVDSyhEaWFsb2dTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKERpYWxvZ1NlbGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEaWFsb2dTZWxlY3QoJnRoZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAmdGhlRGlhbG9nLAotCSAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfV2hpY2hEaWFsb2csIHRoZURpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEaWFsb2dTZWxlY3QoJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAmdGhlRGlhbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfV2hpY2hEaWFsb2csIHRoZURpYWxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfQWxlcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBfcnY7Ci0JU0ludDE2IGFsZXJ0SUQ7Ci0JUHlPYmplY3QqIG1vZGFsRmlsdGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggX3J2OworICAgIFNJbnQxNiBhbGVydElEOworICAgIFB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKICNpZm5kZWYgQWxlcnQKLQlQeU1hY19QUkVDSEVDSyhBbGVydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWxlcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQWxlcnQoYWxlcnRJRCwKLQkgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBBbGVydChhbGVydElELAorICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19TdG9wQWxlcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURpYWxvZ0l0ZW1JbmRleCBfcnY7Ci0JU0ludDE2IGFsZXJ0SUQ7Ci0JUHlPYmplY3QqIG1vZGFsRmlsdGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dJdGVtSW5kZXggX3J2OworICAgIFNJbnQxNiBhbGVydElEOworICAgIFB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKICNpZm5kZWYgU3RvcEFsZXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soU3RvcEFsZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdG9wQWxlcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3RvcEFsZXJ0KGFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFN0b3BBbGVydChhbGVydElELAorICAgICAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfTm90ZUFsZXJ0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dJdGVtSW5kZXggX3J2OwotCVNJbnQxNiBhbGVydElEOwotCVB5T2JqZWN0KiBtb2RhbEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGlhbG9nSXRlbUluZGV4IF9ydjsKKyAgICBTSW50MTYgYWxlcnRJRDsKKyAgICBQeU9iamVjdCogbW9kYWxGaWx0ZXI7CiAjaWZuZGVmIE5vdGVBbGVydAotCVB5TWFjX1BSRUNIRUNLKE5vdGVBbGVydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTm90ZUFsZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsZXJ0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RhbEZpbHRlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5vdGVBbGVydChhbGVydElELAotCSAgICAgICAgICAgICAgICBEbGdfUGFzc0ZpbHRlclByb2MobW9kYWxGaWx0ZXIpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOb3RlQWxlcnQoYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0NhdXRpb25BbGVydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nSXRlbUluZGV4IF9ydjsKLQlTSW50MTYgYWxlcnRJRDsKLQlQeU9iamVjdCogbW9kYWxGaWx0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ0l0ZW1JbmRleCBfcnY7CisgICAgU0ludDE2IGFsZXJ0SUQ7CisgICAgUHlPYmplY3QqIG1vZGFsRmlsdGVyOwogI2lmbmRlZiBDYXV0aW9uQWxlcnQKLQlQeU1hY19QUkVDSEVDSyhDYXV0aW9uQWxlcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENhdXRpb25BbGVydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGVydElELAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kYWxGaWx0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDYXV0aW9uQWxlcnQoYWxlcnRJRCwKLQkgICAgICAgICAgICAgICAgICAgRGxnX1Bhc3NGaWx0ZXJQcm9jKG1vZGFsRmlsdGVyKSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxlcnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGFsRmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2F1dGlvbkFsZXJ0KGFsZXJ0SUQsCisgICAgICAgICAgICAgICAgICAgICAgIERsZ19QYXNzRmlsdGVyUHJvYyhtb2RhbEZpbHRlcikpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19QYXJhbVRleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBwYXJhbTA7Ci0JU3RyMjU1IHBhcmFtMTsKLQlTdHIyNTUgcGFyYW0yOwotCVN0cjI1NSBwYXJhbTM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBwYXJhbTA7CisgICAgU3RyMjU1IHBhcmFtMTsKKyAgICBTdHIyNTUgcGFyYW0yOworICAgIFN0cjI1NSBwYXJhbTM7CiAjaWZuZGVmIFBhcmFtVGV4dAotCVB5TWFjX1BSRUNIRUNLKFBhcmFtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFyYW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTAsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0xLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTMpKQotCQlyZXR1cm4gTlVMTDsKLQlQYXJhbVRleHQocGFyYW0wLAotCSAgICAgICAgICBwYXJhbTEsCi0JICAgICAgICAgIHBhcmFtMiwKLQkgICAgICAgICAgcGFyYW0zKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhcmFtVGV4dChwYXJhbTAsCisgICAgICAgICAgICAgIHBhcmFtMSwKKyAgICAgICAgICAgICAgcGFyYW0yLAorICAgICAgICAgICAgICBwYXJhbTMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfR2V0RGlhbG9nSXRlbVRleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBpdGVtOwotCVN0cjI1NSB0ZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgaXRlbTsKKyAgICBTdHIyNTUgdGV4dDsKICNpZm5kZWYgR2V0RGlhbG9nSXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGlhbG9nSXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlHZXREaWFsb2dJdGVtVGV4dChpdGVtLAotCSAgICAgICAgICAgICAgICAgIHRleHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRleHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0RGlhbG9nSXRlbVRleHQoaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0ZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfU2V0RGlhbG9nSXRlbVRleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBpdGVtOwotCVN0cjI1NSB0ZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgaXRlbTsKKyAgICBTdHIyNTUgdGV4dDsKICNpZm5kZWYgU2V0RGlhbG9nSXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhTZXREaWFsb2dJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nSXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0ZXh0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0RGlhbG9nSXRlbVRleHQoaXRlbSwKLQkgICAgICAgICAgICAgICAgICB0ZXh0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0ZXh0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0RGlhbG9nSXRlbVRleHQoaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXh0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX0dldEFsZXJ0U3RhZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldEFsZXJ0U3RhZ2UKLQlQeU1hY19QUkVDSEVDSyhHZXRBbGVydFN0YWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRBbGVydFN0YWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRBbGVydFN0YWdlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEFsZXJ0U3RhZ2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfU2V0RGlhbG9nRm9udChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IGZvbnROdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBmb250TnVtOwogI2lmbmRlZiBTZXREaWFsb2dGb250Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nRm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RGlhbG9nRm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbnROdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXREaWFsb2dGb250KGZvbnROdW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnROdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXREaWFsb2dGb250KGZvbnROdW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfUmVzZXRBbGVydFN0YWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFJlc2V0QWxlcnRTdGFnZQotCVB5TWFjX1BSRUNIRUNLKFJlc2V0QWxlcnRTdGFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVzZXRBbGVydFN0YWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlSZXNldEFsZXJ0U3RhZ2UoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJlc2V0QWxlcnRTdGFnZSgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfR2V0UGFyYW1UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgcGFyYW0wOwotCVN0cjI1NSBwYXJhbTE7Ci0JU3RyMjU1IHBhcmFtMjsKLQlTdHIyNTUgcGFyYW0zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgcGFyYW0wOworICAgIFN0cjI1NSBwYXJhbTE7CisgICAgU3RyMjU1IHBhcmFtMjsKKyAgICBTdHIyNTUgcGFyYW0zOwogI2lmbmRlZiBHZXRQYXJhbVRleHQKLQlQeU1hY19QUkVDSEVDSyhHZXRQYXJhbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBhcmFtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0wLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UGFyYW1UZXh0KHBhcmFtMCwKLQkgICAgICAgICAgICAgcGFyYW0xLAotCSAgICAgICAgICAgICBwYXJhbTIsCi0JICAgICAgICAgICAgIHBhcmFtMyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcGFyYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBwYXJhbTMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRQYXJhbVRleHQocGFyYW0wLAorICAgICAgICAgICAgICAgICBwYXJhbTEsCisgICAgICAgICAgICAgICAgIHBhcmFtMiwKKyAgICAgICAgICAgICAgICAgcGFyYW0zKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX05ld0ZlYXR1cmVzRGlhbG9nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEaWFsb2dQdHIgX3J2OwotCVJlY3QgaW5Cb3VuZHNSZWN0OwotCVN0cjI1NSBpblRpdGxlOwotCUJvb2xlYW4gaW5Jc1Zpc2libGU7Ci0JU0ludDE2IGluUHJvY0lEOwotCVdpbmRvd1B0ciBpbkJlaGluZDsKLQlCb29sZWFuIGluR29Bd2F5RmxhZzsKLQlTSW50MzIgaW5SZWZDb247Ci0JSGFuZGxlIGluSXRlbUxpc3RIYW5kbGU7Ci0JVUludDMyIGluRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIERpYWxvZ1B0ciBfcnY7CisgICAgUmVjdCBpbkJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IGluVGl0bGU7CisgICAgQm9vbGVhbiBpbklzVmlzaWJsZTsKKyAgICBTSW50MTYgaW5Qcm9jSUQ7CisgICAgV2luZG93UHRyIGluQmVoaW5kOworICAgIEJvb2xlYW4gaW5Hb0F3YXlGbGFnOworICAgIFNJbnQzMiBpblJlZkNvbjsKKyAgICBIYW5kbGUgaW5JdGVtTGlzdEhhbmRsZTsKKyAgICBVSW50MzIgaW5GbGFnczsKICNpZm5kZWYgTmV3RmVhdHVyZXNEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhOZXdGZWF0dXJlc0RpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3RmVhdHVyZXNEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaW5UaXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXNWaXNpYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Qcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5CZWhpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkl0ZW1MaXN0SGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0ZlYXR1cmVzRGlhbG9nKCh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5Cb3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluVGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Jc1Zpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5CZWhpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Hb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluUmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbUxpc3RIYW5kbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Cb3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluVGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklzVmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluQmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Hb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JdGVtTGlzdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdGZWF0dXJlc0RpYWxvZygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXNWaXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1MaXN0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGxnT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEbGdfR2V0RGlhbG9nRnJvbVdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRGlhbG9nUHRyIF9ydjsKLQlXaW5kb3dQdHIgd2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEaWFsb2dQdHIgX3J2OworICAgIFdpbmRvd1B0ciB3aW5kb3c7CiAjaWZuZGVmIEdldERpYWxvZ0Zyb21XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dGcm9tV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREaWFsb2dGcm9tV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREaWFsb2dGcm9tV2luZG93KHdpbmRvdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3aW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREaWFsb2dGcm9tV2luZG93KHdpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRsZ19TZXRVc2VySXRlbUhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICAgICAgUHlPYmplY3QgKm5ldyA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICpuZXcgPSBOVUxMOwogCiAKLQkgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPIiwgJm5ldykpCi0JICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyIsICZuZXcpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLQkgICAgICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrICYmIG5ldyAmJiBuZXcgIT0gUHlfTm9uZSkgewotCSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGxnX0Vycm9yLCAiQW5vdGhlciBVc2VySXRlbVByb2MgaXMgYWxyZWFkeSBpbnN0YWxsZWQiKTsKLQkgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICB9CisgICAgICAgIGlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrICYmIG5ldyAmJiBuZXcgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERsZ19FcnJvciwgIkFub3RoZXIgVXNlckl0ZW1Qcm9jIGlzIGFscmVhZHkgaW5zdGFsbGVkIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JICAgICAgICBpZiAobmV3ID09IE5VTEwgfHwgbmV3ID09IFB5X05vbmUpIHsKLQkgICAgICAgICAgICAgICAgbmV3ID0gTlVMTDsKLQkgICAgICAgICAgICAgICAgX3JlcyA9IFB5X05vbmU7Ci0JICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLQkgICAgICAgIH0gZWxzZSB7Ci0JICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihuZXcpOwotCSAgICAgICAgICAgICAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKU5ld1VzZXJJdGVtVVBQKERsZ19Vbml2VXNlckl0ZW1Qcm9jKSk7Ci0JICAgICAgICB9CisgICAgICAgIGlmIChuZXcgPT0gTlVMTCB8fCBuZXcgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgbmV3ID0gTlVMTDsKKyAgICAgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKG5ldyk7CisgICAgICAgICAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKU5ld1VzZXJJdGVtVVBQKERsZ19Vbml2VXNlckl0ZW1Qcm9jKSk7CisgICAgICAgIH0KIAotCSAgICAgICAgRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9IG5ldzsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrID0gbmV3OworICAgICAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRGxnX21ldGhvZHNbXSA9IHsKLQl7Ik5ld0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfTmV3RGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBTSW50MTYgcHJvY0lELCBXaW5kb3dQdHIgYmVoaW5kLCBCb29sZWFuIGdvQXdheUZsYWcsIFNJbnQzMiByZWZDb24sIEhhbmRsZSBpdGVtcykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiR2V0TmV3RGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXROZXdEaWFsb2csIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBkaWFsb2dJRCwgV2luZG93UHRyIGJlaGluZCkgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiTmV3Q29sb3JEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX05ld0NvbG9yRGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBTSW50MTYgcHJvY0lELCBXaW5kb3dQdHIgYmVoaW5kLCBCb29sZWFuIGdvQXdheUZsYWcsIFNJbnQzMiByZWZDb24sIEhhbmRsZSBpdGVtcykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAotCXsiTW9kYWxEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX01vZGFsRGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCi0JeyJJc0RpYWxvZ0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKURsZ19Jc0RpYWxvZ0V2ZW50LCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCB0aGVFdmVudCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkRpYWxvZ1NlbGVjdCIsIChQeUNGdW5jdGlvbilEbGdfRGlhbG9nU2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCB0aGVFdmVudCkgLT4gKEJvb2xlYW4gX3J2LCBEaWFsb2dQdHIgdGhlRGlhbG9nLCBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCi0JeyJBbGVydCIsIChQeUNGdW5jdGlvbilEbGdfQWxlcnQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKLQl7IlN0b3BBbGVydCIsIChQeUNGdW5jdGlvbilEbGdfU3RvcEFsZXJ0LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCi0JeyJOb3RlQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX05vdGVBbGVydCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGFsZXJ0SUQsIFB5T2JqZWN0KiBtb2RhbEZpbHRlcikgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAotCXsiQ2F1dGlvbkFsZXJ0IiwgKFB5Q0Z1bmN0aW9uKURsZ19DYXV0aW9uQWxlcnQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKLQl7IlBhcmFtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdfUGFyYW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcGFyYW0wLCBTdHIyNTUgcGFyYW0xLCBTdHIyNTUgcGFyYW0yLCBTdHIyNTUgcGFyYW0zKSAtPiBOb25lIil9LAotCXsiR2V0RGlhbG9nSXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX0dldERpYWxvZ0l0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaXRlbSkgLT4gKFN0cjI1NSB0ZXh0KSIpfSwKLQl7IlNldERpYWxvZ0l0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXREaWFsb2dJdGVtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGl0ZW0sIFN0cjI1NSB0ZXh0KSAtPiBOb25lIil9LAotCXsiR2V0QWxlcnRTdGFnZSIsIChQeUNGdW5jdGlvbilEbGdfR2V0QWxlcnRTdGFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJTZXREaWFsb2dGb250IiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXREaWFsb2dGb250LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9udE51bSkgLT4gTm9uZSIpfSwKLQl7IlJlc2V0QWxlcnRTdGFnZSIsIChQeUNGdW5jdGlvbilEbGdfUmVzZXRBbGVydFN0YWdlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRQYXJhbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX0dldFBhcmFtVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IHBhcmFtMCwgU3RyMjU1IHBhcmFtMSwgU3RyMjU1IHBhcmFtMiwgU3RyMjU1IHBhcmFtMykgLT4gTm9uZSIpfSwKLQl7Ik5ld0ZlYXR1cmVzRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19OZXdGZWF0dXJlc0RpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kc1JlY3QsIFN0cjI1NSBpblRpdGxlLCBCb29sZWFuIGluSXNWaXNpYmxlLCBTSW50MTYgaW5Qcm9jSUQsIFdpbmRvd1B0ciBpbkJlaGluZCwgQm9vbGVhbiBpbkdvQXdheUZsYWcsIFNJbnQzMiBpblJlZkNvbiwgSGFuZGxlIGluSXRlbUxpc3RIYW5kbGUsIFVJbnQzMiBpbkZsYWdzKSAtPiAoRGlhbG9nUHRyIF9ydikiKX0sCi0JeyJHZXREaWFsb2dGcm9tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXREaWFsb2dGcm9tV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93KSAtPiAoRGlhbG9nUHRyIF9ydikiKX0sCi0JeyJTZXRVc2VySXRlbUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRGxnX1NldFVzZXJJdGVtSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKE5VTEwpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik5ld0RpYWxvZyIsIChQeUNGdW5jdGlvbilEbGdfTmV3RGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBTSW50MTYgcHJvY0lELCBXaW5kb3dQdHIgYmVoaW5kLCBCb29sZWFuIGdvQXdheUZsYWcsIFNJbnQzMiByZWZDb24sIEhhbmRsZSBpdGVtcykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiR2V0TmV3RGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXROZXdEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBkaWFsb2dJRCwgV2luZG93UHRyIGJlaGluZCkgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiTmV3Q29sb3JEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX05ld0NvbG9yRGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBTSW50MTYgcHJvY0lELCBXaW5kb3dQdHIgYmVoaW5kLCBCb29sZWFuIGdvQXdheUZsYWcsIFNJbnQzMiByZWZDb24sIEhhbmRsZSBpdGVtcykgLT4gKERpYWxvZ1B0ciBfcnYpIil9LAorICAgIHsiTW9kYWxEaWFsb2ciLCAoUHlDRnVuY3Rpb24pRGxnX01vZGFsRGlhbG9nLCAxLAorICAgICBQeURvY19TVFIoIihQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCisgICAgeyJJc0RpYWxvZ0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKURsZ19Jc0RpYWxvZ0V2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCB0aGVFdmVudCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkRpYWxvZ1NlbGVjdCIsIChQeUNGdW5jdGlvbilEbGdfRGlhbG9nU2VsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCB0aGVFdmVudCkgLT4gKEJvb2xlYW4gX3J2LCBEaWFsb2dQdHIgdGhlRGlhbG9nLCBEaWFsb2dJdGVtSW5kZXggaXRlbUhpdCkiKX0sCisgICAgeyJBbGVydCIsIChQeUNGdW5jdGlvbilEbGdfQWxlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKKyAgICB7IlN0b3BBbGVydCIsIChQeUNGdW5jdGlvbilEbGdfU3RvcEFsZXJ0LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgYWxlcnRJRCwgUHlPYmplY3QqIG1vZGFsRmlsdGVyKSAtPiAoRGlhbG9nSXRlbUluZGV4IF9ydikiKX0sCisgICAgeyJOb3RlQWxlcnQiLCAoUHlDRnVuY3Rpb24pRGxnX05vdGVBbGVydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGFsZXJ0SUQsIFB5T2JqZWN0KiBtb2RhbEZpbHRlcikgLT4gKERpYWxvZ0l0ZW1JbmRleCBfcnYpIil9LAorICAgIHsiQ2F1dGlvbkFsZXJ0IiwgKFB5Q0Z1bmN0aW9uKURsZ19DYXV0aW9uQWxlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBhbGVydElELCBQeU9iamVjdCogbW9kYWxGaWx0ZXIpIC0+IChEaWFsb2dJdGVtSW5kZXggX3J2KSIpfSwKKyAgICB7IlBhcmFtVGV4dCIsIChQeUNGdW5jdGlvbilEbGdfUGFyYW1UZXh0LCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgcGFyYW0wLCBTdHIyNTUgcGFyYW0xLCBTdHIyNTUgcGFyYW0yLCBTdHIyNTUgcGFyYW0zKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGlhbG9nSXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX0dldERpYWxvZ0l0ZW1UZXh0LCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaXRlbSkgLT4gKFN0cjI1NSB0ZXh0KSIpfSwKKyAgICB7IlNldERpYWxvZ0l0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXREaWFsb2dJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGl0ZW0sIFN0cjI1NSB0ZXh0KSAtPiBOb25lIil9LAorICAgIHsiR2V0QWxlcnRTdGFnZSIsIChQeUNGdW5jdGlvbilEbGdfR2V0QWxlcnRTdGFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJTZXREaWFsb2dGb250IiwgKFB5Q0Z1bmN0aW9uKURsZ19TZXREaWFsb2dGb250LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZm9udE51bSkgLT4gTm9uZSIpfSwKKyAgICB7IlJlc2V0QWxlcnRTdGFnZSIsIChQeUNGdW5jdGlvbilEbGdfUmVzZXRBbGVydFN0YWdlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRQYXJhbVRleHQiLCAoUHlDRnVuY3Rpb24pRGxnX0dldFBhcmFtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHBhcmFtMCwgU3RyMjU1IHBhcmFtMSwgU3RyMjU1IHBhcmFtMiwgU3RyMjU1IHBhcmFtMykgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld0ZlYXR1cmVzRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKURsZ19OZXdGZWF0dXJlc0RpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpbkJvdW5kc1JlY3QsIFN0cjI1NSBpblRpdGxlLCBCb29sZWFuIGluSXNWaXNpYmxlLCBTSW50MTYgaW5Qcm9jSUQsIFdpbmRvd1B0ciBpbkJlaGluZCwgQm9vbGVhbiBpbkdvQXdheUZsYWcsIFNJbnQzMiBpblJlZkNvbiwgSGFuZGxlIGluSXRlbUxpc3RIYW5kbGUsIFVJbnQzMiBpbkZsYWdzKSAtPiAoRGlhbG9nUHRyIF9ydikiKX0sCisgICAgeyJHZXREaWFsb2dGcm9tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKURsZ19HZXREaWFsb2dGcm9tV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd2luZG93KSAtPiAoRGlhbG9nUHRyIF9ydikiKX0sCisgICAgeyJTZXRVc2VySXRlbUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pRGxnX1NldFVzZXJJdGVtSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKE5VTEwpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTUzMCw5ICsxNTMwLDkgQEAKIFdpbmRvd1B0cgogRGxnT2JqX0NvbnZlcnRUb1dpbmRvdyhQeU9iamVjdCAqc2VsZikKIHsKLSAgICAgICAgaWYgKCBEbGdPYmpfQ2hlY2soc2VsZikgKQotICAgICAgICAgICAgICAgIHJldHVybiBHZXREaWFsb2dXaW5kb3coKChEaWFsb2dPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCBEbGdPYmpfQ2hlY2soc2VsZikgKQorICAgICAgICByZXR1cm4gR2V0RGlhbG9nV2luZG93KCgoRGlhbG9nT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKIC8qIFJldHVybiB0aGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpYWxvZywgb3IgTm9uZSAqLwpAQCAtMTU0MCwzNSArMTU0MCwzNSBAQAogUHlPYmplY3QgKgogRGxnT2JqX1doaWNoRGlhbG9nKERpYWxvZ1B0ciBkKQogewotICAgICAgICBQeU9iamVjdCAqaXQ7CisgICAgUHlPYmplY3QgKml0OwogCi0gICAgICAgIGlmIChkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpdCA9IFB5X05vbmU7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBXaW5kb3dQdHIgdyA9IEdldERpYWxvZ1dpbmRvdyhkKTsKKyAgICBpZiAoZCA9PSBOVUxMKSB7CisgICAgICAgIGl0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGl0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBXaW5kb3dQdHIgdyA9IEdldERpYWxvZ1dpbmRvdyhkKTsKIAotICAgICAgICAgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldFdSZWZDb24odyk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgKChEaWFsb2dPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSBkIHx8ICFEbGdPYmpfQ2hlY2soaXQpKSB7CisgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldFdSZWZDb24odyk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgoRGlhbG9nT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gZCB8fCAhRGxnT2JqX0NoZWNrKGl0KSkgewogI2lmIDAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3VsZCBkbyB0aGlzLCBidXQgd2UgZG9uJ3QgaGF2ZSBhbiBvYl9mcmVlaXQgZm9yIGRpYWxvZ3MgeWV0LiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBXaW5PYmpfTmV3KHcpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgICAgICAgICAvKiBTaG91bGQgZG8gdGhpcywgYnV0IHdlIGRvbid0IGhhdmUgYW4gb2JfZnJlZWl0IGZvciBkaWFsb2dzIHlldC4gKi8KKyAgICAgICAgICAgIGl0ID0gV2luT2JqX05ldyh3KTsKKyAgICAgICAgICAgICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9mcmVlaXQgPSBOVUxMOwogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gaXQ7CisgICAgfQorICAgIHJldHVybiBpdDsKIH0KIAogI2Vsc2UgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIERsZ19tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KQEAgLTE1NzYsMzIgKzE1NzYsMzIgQEAKIAogdm9pZCBpbml0X0RsZyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRGlhbG9nUHRyLCBEbGdPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERpYWxvZ1B0ciwgRGxnT2JqX1doaWNoRGlhbG9nKTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEaWFsb2dQdHIsIERsZ09ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRGlhbG9nUHRyLCBEbGdPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRGlhbG9nUHRyLCBEbGdPYmpfV2hpY2hEaWFsb2cpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRGlhbG9nUHRyLCBEbGdPYmpfQ29udmVydCk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0RsZyIsIERsZ19tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0RsZyIsIERsZ19tZXRob2RzKTsKIAogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCURsZ19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKERsZ19FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIERsZ19FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCURpYWxvZ19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRGlhbG9nX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRGlhbG9nX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRGlhbG9nIiwgKFB5T2JqZWN0ICopJkRpYWxvZ19UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkRpYWxvZ19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRpYWxvZ1R5cGUiLCAoUHlPYmplY3QgKikmRGlhbG9nX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIERsZ19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKERsZ19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIERsZ19FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIERpYWxvZ19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmRGlhbG9nX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRGlhbG9nX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRGlhbG9nIiwgKFB5T2JqZWN0ICopJkRpYWxvZ19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkRpYWxvZ19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRpYWxvZ1R5cGUiLCAoUHlPYmplY3QgKikmRGlhbG9nX1R5cGUpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9kcmFnL19EcmFnbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9kcmFnL19EcmFnbW9kdWxlLmMKaW5kZXggNzk3ZmIzMi4uYWE4NzY5MCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZHJhZy9fRHJhZ21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2RyYWcvX0RyYWdtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtNDQsNjkzICs0NCw2OTMgQEAKICNkZWZpbmUgRHJhZ09ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZEcmFnT2JqX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkRyYWdPYmpfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IERyYWdPYmpPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlEcmFnUmVmIG9iX2l0c2VsZjsKLQlQeU9iamVjdCAqc2VuZHByb2M7CisgICAgUHlPYmplY3RfSEVBRAorICAgIERyYWdSZWYgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0ICpzZW5kcHJvYzsKIH0gRHJhZ09iak9iamVjdDsKIAogUHlPYmplY3QgKkRyYWdPYmpfTmV3KERyYWdSZWYgaXRzZWxmKQogewotCURyYWdPYmpPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKERyYWdfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBEcmFnIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoRHJhZ09iak9iamVjdCwgJkRyYWdPYmpfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPnNlbmRwcm9jID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRHJhZ09iak9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRHJhZ19FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIERyYWciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhEcmFnT2JqT2JqZWN0LCAmRHJhZ09ial9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+c2VuZHByb2MgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IERyYWdPYmpfQ29udmVydChQeU9iamVjdCAqdiwgRHJhZ1JlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFEcmFnT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkRyYWdPYmogcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRHJhZ09iak9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFEcmFnT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkRyYWdPYmogcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRHJhZ09iak9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIERyYWdPYmpfZGVhbGxvYyhEcmFnT2JqT2JqZWN0ICpzZWxmKQogewotCVB5X1hERUNSRUYoc2VsZi0+c2VuZHByb2MpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5zZW5kcHJvYyk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0Rpc3Bvc2VEcmFnKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIERpc3Bvc2VEcmFnCi0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZURyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGlzcG9zZURyYWcoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEaXNwb3NlRHJhZyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0FkZERyYWdJdGVtRmxhdm9yKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCUZsYXZvclR5cGUgdGhlVHlwZTsKLQljaGFyICpkYXRhUHRyX19pbl9fOwotCWxvbmcgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCUZsYXZvckZsYWdzIHRoZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBGbGF2b3JUeXBlIHRoZVR5cGU7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBsb25nIGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBGbGF2b3JGbGFncyB0aGVGbGFnczsKICNpZm5kZWYgQWRkRHJhZ0l0ZW1GbGF2b3IKLQlQeU1hY19QUkVDSEVDSyhBZGREcmFnSXRlbUZsYXZvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkRHJhZ0l0ZW1GbGF2b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8meiNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEFkZERyYWdJdGVtRmxhdm9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8meiNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgX2VyciA9IEFkZERyYWdJdGVtRmxhdm9yKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9TZXREcmFnSXRlbUZsYXZvckRhdGEoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7Ci0JRmxhdm9yVHlwZSB0aGVUeXBlOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0JbG9uZyBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JVUludDMyIGRhdGFPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIEZsYXZvclR5cGUgdGhlVHlwZTsKKyAgICBjaGFyICpkYXRhUHRyX19pbl9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFVJbnQzMiBkYXRhT2Zmc2V0OwogI2lmbmRlZiBTZXREcmFnSXRlbUZsYXZvckRhdGEKLQlQeU1hY19QUkVDSEVDSyhTZXREcmFnSXRlbUZsYXZvckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERyYWdJdGVtRmxhdm9yRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ6I2wiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOwotCV9lcnIgPSBTZXREcmFnSXRlbUZsYXZvckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ6I2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBkYXRhUHRyX19sZW5fXyA9IGRhdGFQdHJfX2luX2xlbl9fOworICAgIF9lcnIgPSBTZXREcmFnSXRlbUZsYXZvckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1NldERyYWdJbWFnZShEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBpbWFnZVBpeE1hcDsKLQlSZ25IYW5kbGUgaW1hZ2VSZ247Ci0JUG9pbnQgaW1hZ2VPZmZzZXRQdDsKLQlEcmFnSW1hZ2VGbGFncyB0aGVJbWFnZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBpbWFnZVBpeE1hcDsKKyAgICBSZ25IYW5kbGUgaW1hZ2VSZ247CisgICAgUG9pbnQgaW1hZ2VPZmZzZXRQdDsKKyAgICBEcmFnSW1hZ2VGbGFncyB0aGVJbWFnZUZsYWdzOwogI2lmbmRlZiBTZXREcmFnSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhTZXREcmFnSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERyYWdJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbWFnZVBpeE1hcCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbWFnZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpbWFnZU9mZnNldFB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSW1hZ2VGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREcmFnSW1hZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGltYWdlUGl4TWFwLAotCSAgICAgICAgICAgICAgICAgICAgaW1hZ2VSZ24sCi0JICAgICAgICAgICAgICAgICAgICBpbWFnZU9mZnNldFB0LAotCSAgICAgICAgICAgICAgICAgICAgdGhlSW1hZ2VGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VQaXhNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW1hZ2VPZmZzZXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUltYWdlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0RHJhZ0ltYWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBpeE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VPZmZzZXRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZUltYWdlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfQ2hhbmdlRHJhZ0JlaGF2aW9ycyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURyYWdCZWhhdmlvcnMgaW5CZWhhdmlvcnNUb1NldDsKLQlEcmFnQmVoYXZpb3JzIGluQmVoYXZpb3JzVG9DbGVhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEcmFnQmVoYXZpb3JzIGluQmVoYXZpb3JzVG9TZXQ7CisgICAgRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvQ2xlYXI7CiAjaWZuZGVmIENoYW5nZURyYWdCZWhhdmlvcnMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VEcmFnQmVoYXZpb3JzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VEcmFnQmVoYXZpb3JzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQmVoYXZpb3JzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkJlaGF2aW9yc1RvQ2xlYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2hhbmdlRHJhZ0JlaGF2aW9ycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoYXZpb3JzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CZWhhdmlvcnNUb0NsZWFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJlaGF2aW9yc1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CZWhhdmlvcnNUb0NsZWFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZURyYWdCZWhhdmlvcnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkJlaGF2aW9yc1RvU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQmVoYXZpb3JzVG9DbGVhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9UcmFja0RyYWcoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlFdmVudFJlY29yZCB0aGVFdmVudDsKLQlSZ25IYW5kbGUgdGhlUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OworICAgIFJnbkhhbmRsZSB0aGVSZWdpb247CiAjaWZuZGVmIFRyYWNrRHJhZwotCVB5TWFjX1BSRUNIRUNLKFRyYWNrRHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhY2tEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJnRoZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja0RyYWcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZ0aGVFdmVudCwKLQkgICAgICAgICAgICAgICAgIHRoZVJlZ2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRyYWNrRHJhZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgdGhlUmVnaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0NvdW50RHJhZ0l0ZW1zKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDE2IG51bUl0ZW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQxNiBudW1JdGVtczsKICNpZm5kZWYgQ291bnREcmFnSXRlbXMKLQlQeU1hY19QUkVDSEVDSyhDb3VudERyYWdJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ291bnREcmFnSXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3VudERyYWdJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtSXRlbXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvdW50RHJhZ0l0ZW1zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1JdGVtcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlbXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVSW50MTYgaW5kZXg7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVJbnQxNiBpbmRleDsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CiAjaWZuZGVmIEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERyYWdJdGVtUmVmZXJlbmNlTnVtYmVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9Db3VudERyYWdJdGVtRmxhdm9ycyhEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKLQlVSW50MTYgbnVtRmxhdm9yczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgVUludDE2IG51bUZsYXZvcnM7CiAjaWZuZGVmIENvdW50RHJhZ0l0ZW1GbGF2b3JzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnREcmFnSXRlbUZsYXZvcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50RHJhZ0l0ZW1GbGF2b3JzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3VudERyYWdJdGVtRmxhdm9ycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtRmxhdm9ycyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtRmxhdm9ycyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvdW50RHJhZ0l0ZW1GbGF2b3JzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1GbGF2b3JzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1GbGF2b3JzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldEZsYXZvclR5cGUoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7Ci0JVUludDE2IGluZGV4OwotCUZsYXZvclR5cGUgdGhlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgVUludDE2IGluZGV4OworICAgIEZsYXZvclR5cGUgdGhlVHlwZTsKICNpZm5kZWYgR2V0Rmxhdm9yVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldEZsYXZvclR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZsYXZvclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEZsYXZvclR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICZ0aGVUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGbGF2b3JUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldEZsYXZvckZsYWdzKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCUZsYXZvclR5cGUgdGhlVHlwZTsKLQlGbGF2b3JGbGFncyB0aGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgRmxhdm9yVHlwZSB0aGVUeXBlOworICAgIEZsYXZvckZsYWdzIHRoZUZsYWdzOwogI2lmbmRlZiBHZXRGbGF2b3JGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldEZsYXZvckZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGbGF2b3JGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGbGF2b3JGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldEZsYXZvckRhdGFTaXplKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCUZsYXZvclR5cGUgdGhlVHlwZTsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBGbGF2b3JUeXBlIHRoZVR5cGU7CisgICAgU2l6ZSBkYXRhU2l6ZTsKICNpZm5kZWYgR2V0Rmxhdm9yRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRGbGF2b3JEYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Rmxhdm9yRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Rmxhdm9yRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSXRlbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9HZXRGbGF2b3JEYXRhKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmOwotCUZsYXZvclR5cGUgdGhlVHlwZTsKLQljaGFyICpkYXRhUHRyX19vdXRfXzsKLQlsb25nIGRhdGFQdHJfX2xlbl9fOwotCWludCBkYXRhUHRyX19pbl9sZW5fXzsKLQlVSW50MzIgZGF0YU9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7CisgICAgRmxhdm9yVHlwZSB0aGVUeXBlOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIGxvbmcgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFVJbnQzMiBkYXRhT2Zmc2V0OwogI2lmbmRlZiBHZXRGbGF2b3JEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rmxhdm9yRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZpbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCi0JewotCQlQeUVycl9Ob01lbW9yeSgpOwotCQlnb3RvIGRhdGFQdHJfX2Vycm9yX187Ci0JfQotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JX2VyciA9IEdldEZsYXZvckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sICZkYXRhUHRyX19sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOwotCWZyZWUoZGF0YVB0cl9fb3V0X18pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmlsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGRhdGFQdHJfX291dF9fID0gbWFsbG9jKGRhdGFQdHJfX2luX2xlbl9fKSkgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIGdvdG8gZGF0YVB0cl9fZXJyb3JfXzsKKyAgICB9CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBfZXJyID0gR2V0Rmxhdm9yRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgJmRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7CisgICAgZnJlZShkYXRhUHRyX19vdXRfXyk7CiAgZGF0YVB0cl9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfR2V0RHJhZ0l0ZW1Cb3VuZHMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7Ci0JUmVjdCBpdGVtQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBSZWN0IGl0ZW1Cb3VuZHM7CiAjaWZuZGVmIEdldERyYWdJdGVtQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0l0ZW1Cb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdJdGVtQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnSXRlbUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJml0ZW1Cb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSXRlbVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnSXRlbUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJml0ZW1Cb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfU2V0RHJhZ0l0ZW1Cb3VuZHMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWY7Ci0JUmVjdCBpdGVtQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZjsKKyAgICBSZWN0IGl0ZW1Cb3VuZHM7CiAjaWZuZGVmIFNldERyYWdJdGVtQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ0l0ZW1Cb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERyYWdJdGVtQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaXRlbUJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXREcmFnSXRlbUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpdGVtQm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERyYWdJdGVtQm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtQm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyb3BMb2NhdGlvbihEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFFRGVzYyBkcm9wTG9jYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQUVEZXNjIGRyb3BMb2NhdGlvbjsKICNpZm5kZWYgR2V0RHJvcExvY2F0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJvcExvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREcm9wTG9jYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcm9wTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkcm9wTG9jYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmZHJvcExvY2F0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERyb3BMb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyb3BMb2NhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZkcm9wTG9jYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfU2V0RHJvcExvY2F0aW9uKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQUVEZXNjIGRyb3BMb2NhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBBRURlc2MgZHJvcExvY2F0aW9uOwogI2lmbmRlZiBTZXREcm9wTG9jYXRpb24KLQlQeU1hY19QUkVDSEVDSyhTZXREcm9wTG9jYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldERyb3BMb2NhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmZHJvcExvY2F0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERyb3BMb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmRyb3BMb2NhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJmRyb3BMb2NhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREcm9wTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcm9wTG9jYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfR2V0RHJhZ0F0dHJpYnV0ZXMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEcmFnQXR0cmlidXRlcyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEcmFnQXR0cmlidXRlcyBmbGFnczsKICNpZm5kZWYgR2V0RHJhZ0F0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhHZXREcmFnQXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ0F0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXREcmFnQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERyYWdBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfR2V0RHJhZ01vdXNlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgbW91c2U7Ci0JUG9pbnQgZ2xvYmFsUGlubmVkTW91c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUG9pbnQgbW91c2U7CisgICAgUG9pbnQgZ2xvYmFsUGlubmVkTW91c2U7CiAjaWZuZGVmIEdldERyYWdNb3VzZQotCVB5TWFjX1BSRUNIRUNLKEdldERyYWdNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ01vdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RHJhZ01vdXNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmbW91c2UsCi0JICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsUGlubmVkTW91c2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG1vdXNlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGdsb2JhbFBpbm5lZE1vdXNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERyYWdNb3VzZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1vdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFBpbm5lZE1vdXNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBtb3VzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBnbG9iYWxQaW5uZWRNb3VzZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ09ial9TZXREcmFnTW91c2UoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQb2ludCBnbG9iYWxQaW5uZWRNb3VzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQb2ludCBnbG9iYWxQaW5uZWRNb3VzZTsKICNpZm5kZWYgU2V0RHJhZ01vdXNlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RHJhZ01vdXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREcmFnTW91c2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmdsb2JhbFBpbm5lZE1vdXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldERyYWdNb3VzZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUGlubmVkTW91c2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZnbG9iYWxQaW5uZWRNb3VzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXREcmFnTW91c2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFBpbm5lZE1vdXNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdPcmlnaW4oRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQb2ludCBnbG9iYWxJbml0aWFsTW91c2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUG9pbnQgZ2xvYmFsSW5pdGlhbE1vdXNlOwogI2lmbmRlZiBHZXREcmFnT3JpZ2luCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ09yaWdpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ09yaWdpbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdPcmlnaW4oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsSW5pdGlhbE1vdXNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsSW5pdGlhbE1vdXNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERyYWdPcmlnaW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsSW5pdGlhbE1vdXNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgZ2xvYmFsSW5pdGlhbE1vdXNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0dldERyYWdNb2RpZmllcnMoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgbW9kaWZpZXJzOwotCVNJbnQxNiBtb3VzZURvd25Nb2RpZmllcnM7Ci0JU0ludDE2IG1vdXNlVXBNb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IG1vZGlmaWVyczsKKyAgICBTSW50MTYgbW91c2VEb3duTW9kaWZpZXJzOworICAgIFNJbnQxNiBtb3VzZVVwTW9kaWZpZXJzOwogI2lmbmRlZiBHZXREcmFnTW9kaWZpZXJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ01vZGlmaWVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RHJhZ01vZGlmaWVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdNb2RpZmllcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZURvd25Nb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm1vdXNlVXBNb2RpZmllcnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAotCSAgICAgICAgICAgICAgICAgICAgIG1vdXNlRG93bk1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICBtb3VzZVVwTW9kaWZpZXJzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldERyYWdNb2RpZmllcnMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3VzZURvd25Nb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdXNlVXBNb2RpZmllcnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlRG93bk1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3VzZVVwTW9kaWZpZXJzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1Nob3dEcmFnSGlsaXRlKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIGhpbGl0ZUZyYW1lOwotCUJvb2xlYW4gaW5zaWRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJnbkhhbmRsZSBoaWxpdGVGcmFtZTsKKyAgICBCb29sZWFuIGluc2lkZTsKICNpZm5kZWYgU2hvd0RyYWdIaWxpdGUKLQlQeU1hY19QUkVDSEVDSyhTaG93RHJhZ0hpbGl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0RyYWdIaWxpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoaWxpdGVGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluc2lkZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTaG93RHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5zaWRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmhpbGl0ZUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zaWRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNob3dEcmFnSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfSGlkZURyYWdIaWxpdGUoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgSGlkZURyYWdIaWxpdGUKLQlQeU1hY19QUkVDSEVDSyhIaWRlRHJhZ0hpbGl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlkZURyYWdIaWxpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWRlRHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhpZGVEcmFnSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdPYmpfRHJhZ1ByZVNjcm9sbChEcmFnT2JqT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBkSDsKLQlTSW50MTYgZFY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGRIOworICAgIFNJbnQxNiBkVjsKICNpZm5kZWYgRHJhZ1ByZVNjcm9sbAotCVB5TWFjX1BSRUNIRUNLKERyYWdQcmVTY3JvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdQcmVTY3JvbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZEgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkVikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEcmFnUHJlU2Nyb2xsKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgZEgsCi0JICAgICAgICAgICAgICAgICAgICAgZFYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZFYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRHJhZ1ByZVNjcm9sbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRILAorICAgICAgICAgICAgICAgICAgICAgICAgIGRWKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX0RyYWdQb3N0U2Nyb2xsKERyYWdPYmpPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIERyYWdQb3N0U2Nyb2xsCi0JUHlNYWNfUFJFQ0hFQ0soRHJhZ1Bvc3RTY3JvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdQb3N0U2Nyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRHJhZ1Bvc3RTY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEcmFnUG9zdFNjcm9sbChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX1VwZGF0ZURyYWdIaWxpdGUoRHJhZ09iak9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdXBkYXRlUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJnbkhhbmRsZSB1cGRhdGVSZ247CiAjaWZuZGVmIFVwZGF0ZURyYWdIaWxpdGUKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVEcmFnSGlsaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVEcmFnSGlsaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ1cGRhdGVSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlRHJhZ0hpbGl0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVEcmFnSGlsaXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIERyYWdPYmpfbWV0aG9kc1tdID0gewotCXsiRGlzcG9zZURyYWciLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9EaXNwb3NlRHJhZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQWRkRHJhZ0l0ZW1GbGF2b3IiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9BZGREcmFnSXRlbUZsYXZvciwgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUsIEJ1ZmZlciBkYXRhUHRyLCBGbGF2b3JGbGFncyB0aGVGbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldERyYWdJdGVtRmxhdm9yRGF0YSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX1NldERyYWdJdGVtRmxhdm9yRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUsIEJ1ZmZlciBkYXRhUHRyLCBVSW50MzIgZGF0YU9mZnNldCkgLT4gTm9uZSIpfSwKLQl7IlNldERyYWdJbWFnZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX1NldERyYWdJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIGltYWdlUGl4TWFwLCBSZ25IYW5kbGUgaW1hZ2VSZ24sIFBvaW50IGltYWdlT2Zmc2V0UHQsIERyYWdJbWFnZUZsYWdzIHRoZUltYWdlRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJDaGFuZ2VEcmFnQmVoYXZpb3JzIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQ2hhbmdlRHJhZ0JlaGF2aW9ycywgMSwKLQkgUHlEb2NfU1RSKCIoRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvU2V0LCBEcmFnQmVoYXZpb3JzIGluQmVoYXZpb3JzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IlRyYWNrRHJhZyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX1RyYWNrRHJhZywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQsIFJnbkhhbmRsZSB0aGVSZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJDb3VudERyYWdJdGVtcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NvdW50RHJhZ0l0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgbnVtSXRlbXMpIil9LAotCXsiR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDE2IGluZGV4KSAtPiAoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmKSIpfSwKLQl7IkNvdW50RHJhZ0l0ZW1GbGF2b3JzIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQ291bnREcmFnSXRlbUZsYXZvcnMsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikgLT4gKFVJbnQxNiBudW1GbGF2b3JzKSIpfSwKLQl7IkdldEZsYXZvclR5cGUiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXRGbGF2b3JUeXBlLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIFVJbnQxNiBpbmRleCkgLT4gKEZsYXZvclR5cGUgdGhlVHlwZSkiKX0sCi0JeyJHZXRGbGF2b3JGbGFncyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckZsYWdzLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIEZsYXZvclR5cGUgdGhlVHlwZSkgLT4gKEZsYXZvckZsYWdzIHRoZUZsYWdzKSIpfSwKLQl7IkdldEZsYXZvckRhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yRGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlKSAtPiAoU2l6ZSBkYXRhU2l6ZSkiKX0sCi0JeyJHZXRGbGF2b3JEYXRhIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUsIEJ1ZmZlciBkYXRhUHRyLCBVSW50MzIgZGF0YU9mZnNldCkgLT4gKEJ1ZmZlciBkYXRhUHRyKSIpfSwKLQl7IkdldERyYWdJdGVtQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ0l0ZW1Cb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikgLT4gKFJlY3QgaXRlbUJvdW5kcykiKX0sCi0JeyJTZXREcmFnSXRlbUJvdW5kcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX1NldERyYWdJdGVtQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIFJlY3QgaXRlbUJvdW5kcykgLT4gTm9uZSIpfSwKLQl7IkdldERyb3BMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyb3BMb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIGRyb3BMb2NhdGlvbikiKX0sCi0JeyJTZXREcm9wTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcm9wTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEFFRGVzYyBkcm9wTG9jYXRpb24pIC0+IE5vbmUiKX0sCi0JeyJHZXREcmFnQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChEcmFnQXR0cmlidXRlcyBmbGFncykiKX0sCi0JeyJHZXREcmFnTW91c2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnTW91c2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IG1vdXNlLCBQb2ludCBnbG9iYWxQaW5uZWRNb3VzZSkiKX0sCi0JeyJTZXREcmFnTW91c2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnTW91c2UsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGdsb2JhbFBpbm5lZE1vdXNlKSAtPiBOb25lIil9LAotCXsiR2V0RHJhZ09yaWdpbiIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdPcmlnaW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IGdsb2JhbEluaXRpYWxNb3VzZSkiKX0sCi0JeyJHZXREcmFnTW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ01vZGlmaWVycywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG1vZGlmaWVycywgU0ludDE2IG1vdXNlRG93bk1vZGlmaWVycywgU0ludDE2IG1vdXNlVXBNb2RpZmllcnMpIil9LAotCXsiU2hvd0RyYWdIaWxpdGUiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TaG93RHJhZ0hpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGhpbGl0ZUZyYW1lLCBCb29sZWFuIGluc2lkZSkgLT4gTm9uZSIpfSwKLQl7IkhpZGVEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfSGlkZURyYWdIaWxpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkRyYWdQcmVTY3JvbGwiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9EcmFnUHJlU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZEgsIFNJbnQxNiBkVikgLT4gTm9uZSIpfSwKLQl7IkRyYWdQb3N0U2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRHJhZ1Bvc3RTY3JvbGwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZURyYWdIaWxpdGUiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9VcGRhdGVEcmFnSGlsaXRlLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdXBkYXRlUmduKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiRGlzcG9zZURyYWciLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9EaXNwb3NlRHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQWRkRHJhZ0l0ZW1GbGF2b3IiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9BZGREcmFnSXRlbUZsYXZvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUsIEJ1ZmZlciBkYXRhUHRyLCBGbGF2b3JGbGFncyB0aGVGbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldERyYWdJdGVtRmxhdm9yRGF0YSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX1NldERyYWdJdGVtRmxhdm9yRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUsIEJ1ZmZlciBkYXRhUHRyLCBVSW50MzIgZGF0YU9mZnNldCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldERyYWdJbWFnZSIsIChQeUNGdW5jdGlvbilEcmFnT2JqX1NldERyYWdJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIGltYWdlUGl4TWFwLCBSZ25IYW5kbGUgaW1hZ2VSZ24sIFBvaW50IGltYWdlT2Zmc2V0UHQsIERyYWdJbWFnZUZsYWdzIHRoZUltYWdlRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJDaGFuZ2VEcmFnQmVoYXZpb3JzIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQ2hhbmdlRHJhZ0JlaGF2aW9ycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRHJhZ0JlaGF2aW9ycyBpbkJlaGF2aW9yc1RvU2V0LCBEcmFnQmVoYXZpb3JzIGluQmVoYXZpb3JzVG9DbGVhcikgLT4gTm9uZSIpfSwKKyAgICB7IlRyYWNrRHJhZyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX1RyYWNrRHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgdGhlRXZlbnQsIFJnbkhhbmRsZSB0aGVSZWdpb24pIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudERyYWdJdGVtcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0NvdW50RHJhZ0l0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MTYgbnVtSXRlbXMpIil9LAorICAgIHsiR2V0RHJhZ0l0ZW1SZWZlcmVuY2VOdW1iZXIiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnSXRlbVJlZmVyZW5jZU51bWJlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDE2IGluZGV4KSAtPiAoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmKSIpfSwKKyAgICB7IkNvdW50RHJhZ0l0ZW1GbGF2b3JzIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfQ291bnREcmFnSXRlbUZsYXZvcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikgLT4gKFVJbnQxNiBudW1GbGF2b3JzKSIpfSwKKyAgICB7IkdldEZsYXZvclR5cGUiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXRGbGF2b3JUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIFVJbnQxNiBpbmRleCkgLT4gKEZsYXZvclR5cGUgdGhlVHlwZSkiKX0sCisgICAgeyJHZXRGbGF2b3JGbGFncyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldEZsYXZvckZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIEZsYXZvclR5cGUgdGhlVHlwZSkgLT4gKEZsYXZvckZsYWdzIHRoZUZsYWdzKSIpfSwKKyAgICB7IkdldEZsYXZvckRhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yRGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZiwgRmxhdm9yVHlwZSB0aGVUeXBlKSAtPiAoU2l6ZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJHZXRGbGF2b3JEYXRhIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0Rmxhdm9yRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSXRlbVJlZmVyZW5jZSB0aGVJdGVtUmVmLCBGbGF2b3JUeXBlIHRoZVR5cGUsIEJ1ZmZlciBkYXRhUHRyLCBVSW50MzIgZGF0YU9mZnNldCkgLT4gKEJ1ZmZlciBkYXRhUHRyKSIpfSwKKyAgICB7IkdldERyYWdJdGVtQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ0l0ZW1Cb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEl0ZW1SZWZlcmVuY2UgdGhlSXRlbVJlZikgLT4gKFJlY3QgaXRlbUJvdW5kcykiKX0sCisgICAgeyJTZXREcmFnSXRlbUJvdW5kcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX1NldERyYWdJdGVtQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihJdGVtUmVmZXJlbmNlIHRoZUl0ZW1SZWYsIFJlY3QgaXRlbUJvdW5kcykgLT4gTm9uZSIpfSwKKyAgICB7IkdldERyb3BMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyb3BMb2NhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIGRyb3BMb2NhdGlvbikiKX0sCisgICAgeyJTZXREcm9wTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcm9wTG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBkcm9wTG9jYXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJHZXREcmFnQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChEcmFnQXR0cmlidXRlcyBmbGFncykiKX0sCisgICAgeyJHZXREcmFnTW91c2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9HZXREcmFnTW91c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IG1vdXNlLCBQb2ludCBnbG9iYWxQaW5uZWRNb3VzZSkiKX0sCisgICAgeyJTZXREcmFnTW91c2UiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TZXREcmFnTW91c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGdsb2JhbFBpbm5lZE1vdXNlKSAtPiBOb25lIil9LAorICAgIHsiR2V0RHJhZ09yaWdpbiIsIChQeUNGdW5jdGlvbilEcmFnT2JqX0dldERyYWdPcmlnaW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IGdsb2JhbEluaXRpYWxNb3VzZSkiKX0sCisgICAgeyJHZXREcmFnTW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfR2V0RHJhZ01vZGlmaWVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG1vZGlmaWVycywgU0ludDE2IG1vdXNlRG93bk1vZGlmaWVycywgU0ludDE2IG1vdXNlVXBNb2RpZmllcnMpIil9LAorICAgIHsiU2hvd0RyYWdIaWxpdGUiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9TaG93RHJhZ0hpbGl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGhpbGl0ZUZyYW1lLCBCb29sZWFuIGluc2lkZSkgLT4gTm9uZSIpfSwKKyAgICB7IkhpZGVEcmFnSGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfSGlkZURyYWdIaWxpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYWdQcmVTY3JvbGwiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9EcmFnUHJlU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZEgsIFNJbnQxNiBkVikgLT4gTm9uZSIpfSwKKyAgICB7IkRyYWdQb3N0U2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKURyYWdPYmpfRHJhZ1Bvc3RTY3JvbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZURyYWdIaWxpdGUiLCAoUHlDRnVuY3Rpb24pRHJhZ09ial9VcGRhdGVEcmFnSGlsaXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdXBkYXRlUmduKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBEcmFnT2JqX2dldHNldGxpc3QgTlVMTApAQCAtNzQ3LDYxICs3NDcsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlEcmFnUmVmIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgRHJhZ1JlZiBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBEcmFnT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoRHJhZ09iak9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBEcmFnT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoRHJhZ09iak9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBEcmFnT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IERyYWdPYmpfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfRHJhZy5EcmFnT2JqIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRHJhZ09iak9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIERyYWdPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRHJhZ09ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRHJhZ09ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRHJhZ09ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlEcmFnT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCURyYWdPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRHJhZ09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRHJhZ09ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlEcmFnT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JRHJhZ09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0RyYWcuRHJhZ09iaiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKERyYWdPYmpPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBEcmFnT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIERyYWdPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIERyYWdPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIERyYWdPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRHJhZ09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBEcmFnT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIERyYWdPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIERyYWdPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRHJhZ09ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIERyYWdPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIERyYWdPYmogLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MDksMjA0ICs4MDksMjA0IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19OZXdEcmFnKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURyYWdSZWYgdGhlRHJhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEcmFnUmVmIHRoZURyYWc7CiAjaWZuZGVmIE5ld0RyYWcKLQlQeU1hY19QUkVDSEVDSyhOZXdEcmFnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3RHJhZygmdGhlRHJhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfTmV3LCB0aGVEcmFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld0RyYWcoJnRoZURyYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX05ldywgdGhlRHJhZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19HZXREcmFnSGlsaXRlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIHdpbmRvdzsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgd2luZG93OworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBHZXREcmFnSGlsaXRlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXREcmFnSGlsaXRlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldERyYWdIaWxpdGVDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldERyYWdIaWxpdGVDb2xvcih3aW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJndpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXREcmFnSGlsaXRlQ29sb3Iod2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfV2FpdE1vdXNlTW92ZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IGluaXRpYWxNb3VzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgaW5pdGlhbE1vdXNlOwogI2lmbmRlZiBXYWl0TW91c2VNb3ZlZAotCVB5TWFjX1BSRUNIRUNLKFdhaXRNb3VzZU1vdmVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhXYWl0TW91c2VNb3ZlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5pdGlhbE1vdXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gV2FpdE1vdXNlTW92ZWQoaW5pdGlhbE1vdXNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5pdGlhbE1vdXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gV2FpdE1vdXNlTW92ZWQoaW5pdGlhbE1vdXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX1pvb21SZWN0cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IGZyb21SZWN0OwotCVJlY3QgdG9SZWN0OwotCVNJbnQxNiB6b29tU3RlcHM7Ci0JWm9vbUFjY2VsZXJhdGlvbiBhY2NlbGVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCBmcm9tUmVjdDsKKyAgICBSZWN0IHRvUmVjdDsKKyAgICBTSW50MTYgem9vbVN0ZXBzOworICAgIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uOwogI2lmbmRlZiBab29tUmVjdHMKLQlQeU1hY19QUkVDSEVDSyhab29tUmVjdHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFpvb21SZWN0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZnJvbVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0b1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ6b29tU3RlcHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY2NlbGVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gWm9vbVJlY3RzKCZmcm9tUmVjdCwKLQkgICAgICAgICAgICAgICAgICZ0b1JlY3QsCi0JICAgICAgICAgICAgICAgICB6b29tU3RlcHMsCi0JICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZmcm9tUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRvUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnpvb21TdGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY2VsZXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBab29tUmVjdHMoJmZyb21SZWN0LAorICAgICAgICAgICAgICAgICAgICAgJnRvUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIHpvb21TdGVwcywKKyAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRHJhZ19ab29tUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247Ci0JUG9pbnQgem9vbURpc3RhbmNlOwotCVNJbnQxNiB6b29tU3RlcHM7Ci0JWm9vbUFjY2VsZXJhdGlvbiBhY2NlbGVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQb2ludCB6b29tRGlzdGFuY2U7CisgICAgU0ludDE2IHpvb21TdGVwczsKKyAgICBab29tQWNjZWxlcmF0aW9uIGFjY2VsZXJhdGlvbjsKICNpZm5kZWYgWm9vbVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFpvb21SZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFpvb21SZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmem9vbURpc3RhbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmem9vbVN0ZXBzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWNjZWxlcmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFpvb21SZWdpb24ocmVnaW9uLAotCSAgICAgICAgICAgICAgICAgIHpvb21EaXN0YW5jZSwKLQkgICAgICAgICAgICAgICAgICB6b29tU3RlcHMsCi0JICAgICAgICAgICAgICAgICAgYWNjZWxlcmF0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ6b29tRGlzdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ6b29tU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2NlbGVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gWm9vbVJlZ2lvbihyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgem9vbURpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgIHpvb21TdGVwcywKKyAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfSW5zdGFsbFRyYWNraW5nSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKLQkgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7Ci0JICAgIE9TRXJyIF9lcnI7CisgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKKyAgICAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CisgICAgICAgIE9TRXJyIF9lcnI7CiAKLQkgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk98TyYiLCAmY2FsbGJhY2ssIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsgICAgICAgIC8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KLQkgICAgX2VyciA9IEluc3RhbGxUcmFja2luZ0hhbmRsZXIoZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQLCB0aGVXaW5kb3csICh2b2lkICopY2FsbGJhY2spOwotCSAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQkgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLQkgICAgICAgIF9yZXMgPSBQeV9Ob25lOwotCSAgICAgICAgcmV0dXJuIF9yZXM7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPfE8mIiwgJmNhbGxiYWNrLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsgICAgICAgIC8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KKyAgICAgICAgX2VyciA9IEluc3RhbGxUcmFja2luZ0hhbmRsZXIoZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQLCB0aGVXaW5kb3csICh2b2lkICopY2FsbGJhY2spOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfSW5zdGFsbFJlY2VpdmVIYW5kbGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQkgICAgUHlPYmplY3QgKmNhbGxiYWNrOwotCSAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKLQkgICAgT1NFcnIgX2VycjsKKyAgICAgICAgUHlPYmplY3QgKmNhbGxiYWNrOworICAgICAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKKyAgICAgICAgT1NFcnIgX2VycjsKIAotCSAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiT3xPJiIsICZjYWxsYmFjaywgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCSAgICBQeV9JTkNSRUYoY2FsbGJhY2spOyAgICAgICAgLyogQ2Fubm90IGRlY3JlZiBsYXRlciwgdG9vIGJhZCAqLwotCSAgICBfZXJyID0gSW5zdGFsbFJlY2VpdmVIYW5kbGVyKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQLCB0aGVXaW5kb3csICh2b2lkICopY2FsbGJhY2spOwotCSAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQkgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLQkgICAgICAgIF9yZXMgPSBQeV9Ob25lOwotCSAgICAgICAgcmV0dXJuIF9yZXM7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPfE8mIiwgJmNhbGxiYWNrLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsgICAgICAgIC8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KKyAgICAgICAgX2VyciA9IEluc3RhbGxSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpEcmFnX1JlbW92ZVRyYWNraW5nSGFuZGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JICAgIFdpbmRvd1B0ciB0aGVXaW5kb3cgPSBOVUxMOwotCSAgICBPU0VyciBfZXJyOworICAgICAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKKyAgICAgICAgT1NFcnIgX2VycjsKIAotCSAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8mIiwgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCSAgICBfZXJyID0gUmVtb3ZlVHJhY2tpbmdIYW5kbGVyKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlclVQUCwgdGhlV2luZG93KTsKLQkgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JICAgICAgICBfcmVzID0gUHlfTm9uZTsKLQkgICAgICAgIHJldHVybiBfcmVzOworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8mIiwgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIF9lcnIgPSBSZW1vdmVUcmFja2luZ0hhbmRsZXIoZHJhZ2dsdWVfVHJhY2tpbmdIYW5kbGVyVVBQLCB0aGVXaW5kb3cpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkRyYWdfUmVtb3ZlUmVjZWl2ZUhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCSAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKLQkgICAgT1NFcnIgX2VycjsKKyAgICAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CisgICAgICAgIE9TRXJyIF9lcnI7CiAKLQkgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPJiIsIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgX2VyciA9IFJlbW92ZVJlY2VpdmVIYW5kbGVyKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQLCB0aGVXaW5kb3cpOwotCSAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQkgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLQkgICAgICAgIF9yZXMgPSBQeV9Ob25lOwotCSAgICAgICAgcmV0dXJuIF9yZXM7CisgICAgICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyYiLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgX2VyciA9IFJlbW92ZVJlY2VpdmVIYW5kbGVyKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQLCB0aGVXaW5kb3cpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRHJhZ19tZXRob2RzW10gPSB7Ci0JeyJOZXdEcmFnIiwgKFB5Q0Z1bmN0aW9uKURyYWdfTmV3RHJhZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRHJhZ1JlZiB0aGVEcmFnKSIpfSwKLQl7IkdldERyYWdIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilEcmFnX0dldERyYWdIaWxpdGVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdykgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKLQl7IldhaXRNb3VzZU1vdmVkIiwgKFB5Q0Z1bmN0aW9uKURyYWdfV2FpdE1vdXNlTW92ZWQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGluaXRpYWxNb3VzZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ilpvb21SZWN0cyIsIChQeUNGdW5jdGlvbilEcmFnX1pvb21SZWN0cywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBmcm9tUmVjdCwgUmVjdCB0b1JlY3QsIFNJbnQxNiB6b29tU3RlcHMsIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uKSAtPiBOb25lIil9LAotCXsiWm9vbVJlZ2lvbiIsIChQeUNGdW5jdGlvbilEcmFnX1pvb21SZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24sIFBvaW50IHpvb21EaXN0YW5jZSwgU0ludDE2IHpvb21TdGVwcywgWm9vbUFjY2VsZXJhdGlvbiBhY2NlbGVyYXRpb24pIC0+IE5vbmUiKX0sCi0JeyJJbnN0YWxsVHJhY2tpbmdIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdfSW5zdGFsbFRyYWNraW5nSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKE5VTEwpfSwKLQl7Ikluc3RhbGxSZWNlaXZlSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX0luc3RhbGxSZWNlaXZlSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKE5VTEwpfSwKLQl7IlJlbW92ZVRyYWNraW5nSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX1JlbW92ZVRyYWNraW5nSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKE5VTEwpfSwKLQl7IlJlbW92ZVJlY2VpdmVIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdfUmVtb3ZlUmVjZWl2ZUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUihOVUxMKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJOZXdEcmFnIiwgKFB5Q0Z1bmN0aW9uKURyYWdfTmV3RHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRHJhZ1JlZiB0aGVEcmFnKSIpfSwKKyAgICB7IkdldERyYWdIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilEcmFnX0dldERyYWdIaWxpdGVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdpbmRvdykgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKKyAgICB7IldhaXRNb3VzZU1vdmVkIiwgKFB5Q0Z1bmN0aW9uKURyYWdfV2FpdE1vdXNlTW92ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGluaXRpYWxNb3VzZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ilpvb21SZWN0cyIsIChQeUNGdW5jdGlvbilEcmFnX1pvb21SZWN0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBmcm9tUmVjdCwgUmVjdCB0b1JlY3QsIFNJbnQxNiB6b29tU3RlcHMsIFpvb21BY2NlbGVyYXRpb24gYWNjZWxlcmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiWm9vbVJlZ2lvbiIsIChQeUNGdW5jdGlvbilEcmFnX1pvb21SZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24sIFBvaW50IHpvb21EaXN0YW5jZSwgU0ludDE2IHpvb21TdGVwcywgWm9vbUFjY2VsZXJhdGlvbiBhY2NlbGVyYXRpb24pIC0+IE5vbmUiKX0sCisgICAgeyJJbnN0YWxsVHJhY2tpbmdIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdfSW5zdGFsbFRyYWNraW5nSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKE5VTEwpfSwKKyAgICB7Ikluc3RhbGxSZWNlaXZlSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX0luc3RhbGxSZWNlaXZlSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKE5VTEwpfSwKKyAgICB7IlJlbW92ZVRyYWNraW5nSGFuZGxlciIsIChQeUNGdW5jdGlvbilEcmFnX1JlbW92ZVRyYWNraW5nSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKE5VTEwpfSwKKyAgICB7IlJlbW92ZVJlY2VpdmVIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKURyYWdfUmVtb3ZlUmVjZWl2ZUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTEwMTUsODEgKzEwMTUsODEgQEAKIGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlcihEcmFnVHJhY2tpbmdNZXNzYWdlIHRoZU1lc3NhZ2UsIFdpbmRvd1B0ciB0aGVXaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaGFuZGxlclJlZkNvbiwgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKQogewotICAgICAgICBQeU9iamVjdCAqYXJncywgKnJ2OwotICAgICAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqYXJncywgKnJ2OworICAgIGludCBpOwogCi0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJoTyZPJiIsIHRoZU1lc3NhZ2UsIERyYWdPYmpfTmV3LCB0aGVEcmFnLCBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7Ci0gICAgICAgIGlmICggYXJncyA9PSBOVUxMICkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoKFB5T2JqZWN0ICopaGFuZGxlclJlZkNvbiwgYXJncyk7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gVHJhY2tpbmdIYW5kbGVyXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpID0gLTE7Ci0gICAgICAgIGlmICggcnYgPT0gUHlfTm9uZSApCi0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiBpOworICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJoTyZPJiIsIHRoZU1lc3NhZ2UsIERyYWdPYmpfTmV3LCB0aGVEcmFnLCBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7CisgICAgaWYgKCBhcmdzID09IE5VTEwgKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdCgoUHlPYmplY3QgKiloYW5kbGVyUmVmQ29uLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFRyYWNraW5nSGFuZGxlclxuIik7CisgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaSA9IC0xOworICAgIGlmICggcnYgPT0gUHlfTm9uZSApCisgICAgICAgIGkgPSAwOworICAgIGVsc2UKKyAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOworICAgIFB5X0RFQ1JFRihydik7CisgICAgcmV0dXJuIGk7CiB9CiAKIHN0YXRpYyBwYXNjYWwgT1NFcnIKIGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyKFdpbmRvd1B0ciB0aGVXaW5kb3csIHZvaWQgKmhhbmRsZXJSZWZDb24sCiAgICAgICAgICAgICAgICAgICAgICAgICBEcmFnUmVmZXJlbmNlIHRoZURyYWcpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7Ci0gICAgICAgIGludCBpOworICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7CisgICAgaW50IGk7CiAKLSAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOwotICAgICAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKWhhbmRsZXJSZWZDb24sIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmICggcnYgPT0gTlVMTCApIHsKLSAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFJlY2VpdmVIYW5kbGVyXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpID0gLTE7Ci0gICAgICAgIGlmICggcnYgPT0gUHlfTm9uZSApCi0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiBpOworICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgRHJhZ09ial9OZXcsIHRoZURyYWcsIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKKyAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKWhhbmRsZXJSZWZDb24sIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gUmVjZWl2ZUhhbmRsZXJcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGkgPSAtMTsKKyAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQorICAgICAgICBpID0gMDsKKyAgICBlbHNlCisgICAgICAgIFB5QXJnX1BhcnNlKHJ2LCAibCIsICZpKTsKKyAgICBQeV9ERUNSRUYocnYpOworICAgIHJldHVybiBpOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TRXJyCiBkcmFnZ2x1ZV9TZW5kRGF0YShGbGF2b3JUeXBlIHRoZVR5cGUsIHZvaWQgKmRyYWdTZW5kUmVmQ29uLAogICAgICAgICAgICAgICAgICAgICAgIEl0ZW1SZWZlcmVuY2UgdGhlSXRlbSwgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKQogewotICAgICAgICBEcmFnT2JqT2JqZWN0ICpzZWxmID0gKERyYWdPYmpPYmplY3QgKilkcmFnU2VuZFJlZkNvbjsKLSAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKLSAgICAgICAgaW50IGk7CisgICAgRHJhZ09iak9iamVjdCAqc2VsZiA9IChEcmFnT2JqT2JqZWN0ICopZHJhZ1NlbmRSZWZDb247CisgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKKyAgICBpbnQgaTsKIAotICAgICAgICBpZiAoIHNlbGYtPnNlbmRwcm9jID09IE5VTEwgKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLCB0aGVJdGVtKTsKLSAgICAgICAgaWYgKCBhcmdzID09IE5VTEwgKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChzZWxmLT5zZW5kcHJvYywgYXJncyk7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gU2VuZERhdGFIYW5kbGVyXG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpID0gLTE7Ci0gICAgICAgIGlmICggcnYgPT0gUHlfTm9uZSApCi0gICAgICAgICAgICAgICAgaSA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiBpOworICAgIGlmICggc2VsZi0+c2VuZHByb2MgPT0gTlVMTCApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUsIHRoZUl0ZW0pOworICAgIGlmICggYXJncyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+c2VuZHByb2MsIGFyZ3MpOworICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICBpZiAoIHJ2ID09IE5VTEwgKSB7CisgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gU2VuZERhdGFIYW5kbGVyXG4iKTsKKyAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpID0gLTE7CisgICAgaWYgKCBydiA9PSBQeV9Ob25lICkKKyAgICAgICAgaSA9IDA7CisgICAgZWxzZQorICAgICAgICBQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7CisgICAgUHlfREVDUkVGKHJ2KTsKKyAgICByZXR1cm4gaTsKIH0KIAogI2lmIDAKQEAgLTExMDksNDUgKzExMDksNDUgQEAKICNlbmRpZgogI2Vsc2UgLyogX19MUDY0X18gKi8KIHN0YXRpYyBQeU1ldGhvZERlZiBEcmFnX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiB2b2lkIGluaXRfRHJhZyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRHJhZ1JlZiwgRHJhZ09ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKERyYWdSZWYsIERyYWdPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERyYWdSZWYsIERyYWdPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKERyYWdSZWYsIERyYWdPYmpfQ29udmVydCk7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfRHJhZyIsIERyYWdfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9EcmFnIiwgRHJhZ19tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlEcmFnX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoRHJhZ19FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIERyYWdfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlEcmFnT2JqX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZEcmFnT2JqX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmRHJhZ09ial9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRyYWdPYmoiLCAoUHlPYmplY3QgKikmRHJhZ09ial9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkRyYWdPYmpfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEcmFnT2JqVHlwZSIsIChQeU9iamVjdCAqKSZEcmFnT2JqX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIERyYWdfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChEcmFnX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRHJhZ19FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIERyYWdPYmpfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkRyYWdPYmpfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZEcmFnT2JqX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRHJhZ09iaiIsIChQeU9iamVjdCAqKSZEcmFnT2JqX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRHJhZ09ial9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkRyYWdPYmpUeXBlIiwgKFB5T2JqZWN0ICopJkRyYWdPYmpfVHlwZSk7CiAKLQlkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXJVUFAgPSBOZXdEcmFnVHJhY2tpbmdIYW5kbGVyVVBQKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlcik7Ci0JZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXJVUFAgPSBOZXdEcmFnUmVjZWl2ZUhhbmRsZXJVUFAoZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXIpOwotCWRyYWdnbHVlX1NlbmREYXRhVVBQID0gTmV3RHJhZ1NlbmREYXRhVVBQKGRyYWdnbHVlX1NlbmREYXRhKTsKKyAgICBkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXJVUFAgPSBOZXdEcmFnVHJhY2tpbmdIYW5kbGVyVVBQKGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlcik7CisgICAgZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXJVUFAgPSBOZXdEcmFnUmVjZWl2ZUhhbmRsZXJVUFAoZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXIpOworICAgIGRyYWdnbHVlX1NlbmREYXRhVVBQID0gTmV3RHJhZ1NlbmREYXRhVVBQKGRyYWdnbHVlX1NlbmREYXRhKTsKICNpZiAwCi0JZHJhZ2dsdWVfSW5wdXRVUFAgPSBOZXdEcmFnSW5wdXRVUFAoZHJhZ2dsdWVfSW5wdXQpOwotCWRyYWdnbHVlX0RyYXdpbmdVUFAgPSBOZXdEcmFnRHJhd2luZ1VQUChkcmFnZ2x1ZV9EcmF3aW5nKTsKKyAgICBkcmFnZ2x1ZV9JbnB1dFVQUCA9IE5ld0RyYWdJbnB1dFVQUChkcmFnZ2x1ZV9JbnB1dCk7CisgICAgZHJhZ2dsdWVfRHJhd2luZ1VQUCA9IE5ld0RyYWdEcmF3aW5nVVBQKGRyYWdnbHVlX0RyYXdpbmcpOwogI2VuZGlmCiAKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2V2dC9fRXZ0bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9ldnQvX0V2dG1vZHVsZS5jCmluZGV4IDA0ZjNiMjMuLmJkNjFlZmEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2V2dC9fRXZ0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZXZ0L19FdnRtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMjMsNTM1ICsyMyw1MzUgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfR2V0TW91c2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IG1vdXNlTG9jOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBtb3VzZUxvYzsKICNpZm5kZWYgR2V0TW91c2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW91c2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldE1vdXNlKCZtb3VzZUxvYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBtb3VzZUxvYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdXNlKCZtb3VzZUxvYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBtb3VzZUxvYyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0J1dHRvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBCdXR0b24KLQlQeU1hY19QUkVDSEVDSyhCdXR0b24pOworICAgIFB5TWFjX1BSRUNIRUNLKEJ1dHRvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQnV0dG9uKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEJ1dHRvbigpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9TdGlsbERvd24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgU3RpbGxEb3duCi0JUHlNYWNfUFJFQ0hFQ0soU3RpbGxEb3duKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdGlsbERvd24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN0aWxsRG93bigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTdGlsbERvd24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfV2FpdE1vdXNlVXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgV2FpdE1vdXNlVXAKLQlQeU1hY19QUkVDSEVDSyhXYWl0TW91c2VVcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soV2FpdE1vdXNlVXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFdhaXRNb3VzZVVwKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFdhaXRNb3VzZVVwKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldENhcmV0VGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDMyIF9ydjsKICNpZm5kZWYgR2V0Q2FyZXRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q2FyZXRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDYXJldFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldENhcmV0VGltZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDYXJldFRpbWUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfR2V0S2V5cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JS2V5TWFwIHRoZUtleXNfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBLZXlNYXAgdGhlS2V5c19fb3V0X187CiAjaWZuZGVmIEdldEtleXMKLQlQeU1hY19QUkVDSEVDSyhHZXRLZXlzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRLZXlzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRLZXlzKHRoZUtleXNfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnRoZUtleXNfX291dF9fLCAoaW50KXNpemVvZihLZXlNYXApKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0S2V5cyh0aGVLZXlzX19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVLZXlzX19vdXRfXywgKGludClzaXplb2YoS2V5TWFwKSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldERibFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CiAjaWZuZGVmIEdldERibFRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXREYmxUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREYmxUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXREYmxUaW1lKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldERibFRpbWUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfU2V0RXZlbnRNYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudE1hc2sgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50TWFzayB2YWx1ZTsKICNpZm5kZWYgU2V0RXZlbnRNYXNrCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RXZlbnRNYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRFdmVudE1hc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldEV2ZW50TWFzayh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRFdmVudE1hc2sodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfR2V0TmV4dEV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudE1hc2sgZXZlbnRNYXNrOwotCUV2ZW50UmVjb3JkIHRoZUV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudE1hc2sgZXZlbnRNYXNrOworICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OwogI2lmbmRlZiBHZXROZXh0RXZlbnQKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0RXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHRFdmVudChldmVudE1hc2ssCi0JICAgICAgICAgICAgICAgICAgICZ0aGVFdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZ0aGVFdmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXh0RXZlbnQoZXZlbnRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAmdGhlRXZlbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9FdmVudEF2YWlsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlFdmVudE1hc2sgZXZlbnRNYXNrOwotCUV2ZW50UmVjb3JkIHRoZUV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudE1hc2sgZXZlbnRNYXNrOworICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OwogI2lmbmRlZiBFdmVudEF2YWlsCi0JUHlNYWNfUFJFQ0hFQ0soRXZlbnRBdmFpbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXZlbnRBdmFpbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEV2ZW50QXZhaWwoZXZlbnRNYXNrLAotCSAgICAgICAgICAgICAgICAgJnRoZUV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEV2ZW50QXZhaWwoZXZlbnRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfUG9zdEV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUV2ZW50S2luZCBldmVudE51bTsKLQlVSW50MzIgZXZlbnRNc2c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRXZlbnRLaW5kIGV2ZW50TnVtOworICAgIFVJbnQzMiBldmVudE1zZzsKICNpZm5kZWYgUG9zdEV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soUG9zdEV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQb3N0RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXZlbnROdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZldmVudE1zZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQb3N0RXZlbnQoZXZlbnROdW0sCi0JICAgICAgICAgICAgICAgICBldmVudE1zZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudE1zZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQb3N0RXZlbnQoZXZlbnROdW0sCisgICAgICAgICAgICAgICAgICAgICBldmVudE1zZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0ZsdXNoRXZlbnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudE1hc2sgd2hpY2hNYXNrOwotCUV2ZW50TWFzayBzdG9wTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRNYXNrIHdoaWNoTWFzazsKKyAgICBFdmVudE1hc2sgc3RvcE1hc2s7CiAjaWZuZGVmIEZsdXNoRXZlbnRzCi0JUHlNYWNfUFJFQ0hFQ0soRmx1c2hFdmVudHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsdXNoRXZlbnRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhIIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0b3BNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRmx1c2hFdmVudHMod2hpY2hNYXNrLAotCSAgICAgICAgICAgIHN0b3BNYXNrKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RvcE1hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGbHVzaEV2ZW50cyh3aGljaE1hc2ssCisgICAgICAgICAgICAgICAgc3RvcE1hc2spOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfR2V0R2xvYmFsTW91c2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IGdsb2JhbE1vdXNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBnbG9iYWxNb3VzZTsKICNpZm5kZWYgR2V0R2xvYmFsTW91c2UKLQlQeU1hY19QUkVDSEVDSyhHZXRHbG9iYWxNb3VzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R2xvYmFsTW91c2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldEdsb2JhbE1vdXNlKCZnbG9iYWxNb3VzZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBnbG9iYWxNb3VzZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEdsb2JhbE1vdXNlKCZnbG9iYWxNb3VzZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBnbG9iYWxNb3VzZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0dldEN1cnJlbnRLZXlNb2RpZmllcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CiAjaWZuZGVmIEdldEN1cnJlbnRLZXlNb2RpZmllcnMKLQlQeU1hY19QUkVDSEVDSyhHZXRDdXJyZW50S2V5TW9kaWZpZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDdXJyZW50S2V5TW9kaWZpZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDdXJyZW50S2V5TW9kaWZpZXJzKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEN1cnJlbnRLZXlNb2RpZmllcnMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBDaGVja0V2ZW50UXVldWVGb3JVc2VyQ2FuY2VsCi0JUHlNYWNfUFJFQ0hFQ0soQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDaGVja0V2ZW50UXVldWVGb3JVc2VyQ2FuY2VsKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0tleVNjcmlwdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgY29kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgY29kZTsKICNpZm5kZWYgS2V5U2NyaXB0Ci0JUHlNYWNfUFJFQ0hFQ0soS2V5U2NyaXB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhLZXlTY3JpcHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JS2V5U2NyaXB0KGNvZGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBLZXlTY3JpcHQoY29kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9Jc0NtZENoYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGV2ZW50OwotCXNob3J0IHRlc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVjb3JkIGV2ZW50OworICAgIHNob3J0IHRlc3Q7CiAjaWZuZGVmIElzQ21kQ2hhcgotCVB5TWFjX1BSRUNIRUNLKElzQ21kQ2hhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNDbWRDaGFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNDbWRDaGFyKCZldmVudCwKLQkgICAgICAgICAgICAgICAgdGVzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc0NtZENoYXIoJmV2ZW50LAorICAgICAgICAgICAgICAgICAgICB0ZXN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfTE1HZXRLZXlUaHJlc2goUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIExNR2V0S2V5VGhyZXNoCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRLZXlUaHJlc2gpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0S2V5VGhyZXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldEtleVRocmVzaCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEtleVRocmVzaCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTVNldEtleVRocmVzaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgdmFsdWU7CiAjaWZuZGVmIExNU2V0S2V5VGhyZXNoCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRLZXlUaHJlc2gpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0S2V5VGhyZXNoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEtleVRocmVzaCh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEtleVRocmVzaCh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTUdldEtleVJlcFRocmVzaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRLZXlSZXBUaHJlc2gKLQlQeU1hY19QUkVDSEVDSyhMTUdldEtleVJlcFRocmVzaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRLZXlSZXBUaHJlc2gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0S2V5UmVwVGhyZXNoKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0S2V5UmVwVGhyZXNoKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0xNU2V0S2V5UmVwVGhyZXNoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiB2YWx1ZTsKICNpZm5kZWYgTE1TZXRLZXlSZXBUaHJlc2gKLQlQeU1hY19QUkVDSEVDSyhMTVNldEtleVJlcFRocmVzaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRLZXlSZXBUaHJlc2gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0S2V5UmVwVGhyZXNoKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0S2V5UmVwVGhyZXNoKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0xNR2V0S2JkTGFzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCBfcnY7CiAjaWZuZGVmIExNR2V0S2JkTGFzdAotCVB5TWFjX1BSRUNIRUNLKExNR2V0S2JkTGFzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRLYmRMYXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldEtiZExhc3QoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRLYmRMYXN0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRXZ0X0xNU2V0S2JkTGFzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IHZhbHVlOwogI2lmbmRlZiBMTVNldEtiZExhc3QKLQlQeU1hY19QUkVDSEVDSyhMTVNldEtiZExhc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0S2JkTGFzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRLYmRMYXN0KHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0S2JkTGFzdCh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTUdldEtiZFR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEtiZFR5cGUKLQlQeU1hY19QUkVDSEVDSyhMTUdldEtiZFR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0S2JkVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRLYmRUeXBlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0S2JkVHlwZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9MTVNldEtiZFR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRLYmRUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRLYmRUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEtiZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0S2JkVHlwZSh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEtiZFR5cGUodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpFdnRfVGlja0NvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBUaWNrQ291bnQKLQlQeU1hY19QUkVDSEVDSyhUaWNrQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRpY2tDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGlja0NvdW50KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRpY2tDb3VudCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkV2dF9XYWl0TmV4dEV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlCb29sZWFuIF9ydjsKLQlFdmVudE1hc2sgZXZlbnRNYXNrOwotCUV2ZW50UmVjb3JkIHRoZUV2ZW50OwotCVVJbnQzMiBzbGVlcDsKLQlIYW5kbGUgbW91c2VyZWdpb24gPSAoSGFuZGxlKTA7CisgICAgQm9vbGVhbiBfcnY7CisgICAgRXZlbnRNYXNrIGV2ZW50TWFzazsKKyAgICBFdmVudFJlY29yZCB0aGVFdmVudDsKKyAgICBVSW50MzIgc2xlZXA7CisgICAgSGFuZGxlIG1vdXNlcmVnaW9uID0gKEhhbmRsZSkwOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGx8TyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZXZlbnRNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2xlZXAsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmbW91c2VyZWdpb24pKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JX3J2ID0gV2FpdE5leHRFdmVudChldmVudE1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAmdGhlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICBzbGVlcCwKLQkgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpbW91c2VyZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhsfE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50TWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsZWVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1vdXNlcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gV2FpdE5leHRFdmVudChldmVudE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChSZ25IYW5kbGUpbW91c2VyZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdnRfbWV0aG9kc1tdID0gewotCXsiR2V0TW91c2UiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldE1vdXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBtb3VzZUxvYykiKX0sCi0JeyJCdXR0b24iLCAoUHlDRnVuY3Rpb24pRXZ0X0J1dHRvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU3RpbGxEb3duIiwgKFB5Q0Z1bmN0aW9uKUV2dF9TdGlsbERvd24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IldhaXRNb3VzZVVwIiwgKFB5Q0Z1bmN0aW9uKUV2dF9XYWl0TW91c2VVcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0Q2FyZXRUaW1lIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRDYXJldFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiR2V0S2V5cyIsIChQeUNGdW5jdGlvbilFdnRfR2V0S2V5cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoS2V5TWFwIHRoZUtleXMpIil9LAotCXsiR2V0RGJsVGltZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0RGJsVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJTZXRFdmVudE1hc2siLCAoUHlDRnVuY3Rpb24pRXZ0X1NldEV2ZW50TWFzaywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIHZhbHVlKSAtPiBOb25lIil9LAotCXsiR2V0TmV4dEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXROZXh0RXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayBldmVudE1hc2spIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAotCXsiRXZlbnRBdmFpbCIsIChQeUNGdW5jdGlvbilFdnRfRXZlbnRBdmFpbCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGV2ZW50TWFzaykgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCi0JeyJQb3N0RXZlbnQiLCAoUHlDRnVuY3Rpb24pRXZ0X1Bvc3RFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRLaW5kIGV2ZW50TnVtLCBVSW50MzIgZXZlbnRNc2cpIC0+IE5vbmUiKX0sCi0JeyJGbHVzaEV2ZW50cyIsIChQeUNGdW5jdGlvbilFdnRfRmx1c2hFdmVudHMsIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50TWFzayB3aGljaE1hc2ssIEV2ZW50TWFzayBzdG9wTWFzaykgLT4gTm9uZSIpfSwKLQl7IkdldEdsb2JhbE1vdXNlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRHbG9iYWxNb3VzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgZ2xvYmFsTW91c2UpIil9LAotCXsiR2V0Q3VycmVudEtleU1vZGlmaWVycyIsIChQeUNGdW5jdGlvbilFdnRfR2V0Q3VycmVudEtleU1vZGlmaWVycywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJDaGVja0V2ZW50UXVldWVGb3JVc2VyQ2FuY2VsIiwgKFB5Q0Z1bmN0aW9uKUV2dF9DaGVja0V2ZW50UXVldWVGb3JVc2VyQ2FuY2VsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJLZXlTY3JpcHQiLCAoUHlDRnVuY3Rpb24pRXZ0X0tleVNjcmlwdCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY29kZSkgLT4gTm9uZSIpfSwKLQl7IklzQ21kQ2hhciIsIChQeUNGdW5jdGlvbilFdnRfSXNDbWRDaGFyLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCBldmVudCwgc2hvcnQgdGVzdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkxNR2V0S2V5VGhyZXNoIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTUdldEtleVRocmVzaCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJMTVNldEtleVRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLZXlUaHJlc2gsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0S2V5UmVwVGhyZXNoIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTUdldEtleVJlcFRocmVzaCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCi0JeyJMTVNldEtleVJlcFRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLZXlSZXBUaHJlc2gsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0S2JkTGFzdCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLYmRMYXN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAotCXsiTE1TZXRLYmRMYXN0IiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtiZExhc3QsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRLYmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTUdldEtiZFR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCi0JeyJMTVNldEtiZFR5cGUiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2JkVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJUaWNrQ291bnQiLCAoUHlDRnVuY3Rpb24pRXZ0X1RpY2tDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCi0JeyJXYWl0TmV4dEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9XYWl0TmV4dEV2ZW50LCAxLAotCSBQeURvY19TVFIoIihFdmVudE1hc2sgZXZlbnRNYXNrLCBVSW50MzIgc2xlZXAgWyxSZWdpb25IYW5kbGVdKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldE1vdXNlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9HZXRNb3VzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgbW91c2VMb2MpIil9LAorICAgIHsiQnV0dG9uIiwgKFB5Q0Z1bmN0aW9uKUV2dF9CdXR0b24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlN0aWxsRG93biIsIChQeUNGdW5jdGlvbilFdnRfU3RpbGxEb3duLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJXYWl0TW91c2VVcCIsIChQeUNGdW5jdGlvbilFdnRfV2FpdE1vdXNlVXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldENhcmV0VGltZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0Q2FyZXRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldEtleXMiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEtleXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEtleU1hcCB0aGVLZXlzKSIpfSwKKyAgICB7IkdldERibFRpbWUiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldERibFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiU2V0RXZlbnRNYXNrIiwgKFB5Q0Z1bmN0aW9uKUV2dF9TZXRFdmVudE1hc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50TWFzayB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE5leHRFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfR2V0TmV4dEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudE1hc2sgZXZlbnRNYXNrKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKKyAgICB7IkV2ZW50QXZhaWwiLCAoUHlDRnVuY3Rpb24pRXZ0X0V2ZW50QXZhaWwsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50TWFzayBldmVudE1hc2spIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAorICAgIHsiUG9zdEV2ZW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9Qb3N0RXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50S2luZCBldmVudE51bSwgVUludDMyIGV2ZW50TXNnKSAtPiBOb25lIil9LAorICAgIHsiRmx1c2hFdmVudHMiLCAoUHlDRnVuY3Rpb24pRXZ0X0ZsdXNoRXZlbnRzLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudE1hc2sgd2hpY2hNYXNrLCBFdmVudE1hc2sgc3RvcE1hc2spIC0+IE5vbmUiKX0sCisgICAgeyJHZXRHbG9iYWxNb3VzZSIsIChQeUNGdW5jdGlvbilFdnRfR2V0R2xvYmFsTW91c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IGdsb2JhbE1vdXNlKSIpfSwKKyAgICB7IkdldEN1cnJlbnRLZXlNb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pRXZ0X0dldEN1cnJlbnRLZXlNb2RpZmllcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCIsIChQeUNGdW5jdGlvbilFdnRfQ2hlY2tFdmVudFF1ZXVlRm9yVXNlckNhbmNlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiS2V5U2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKUV2dF9LZXlTY3JpcHQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGNvZGUpIC0+IE5vbmUiKX0sCisgICAgeyJJc0NtZENoYXIiLCAoUHlDRnVuY3Rpb24pRXZ0X0lzQ21kQ2hhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZXZlbnQsIHNob3J0IHRlc3QpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJMTUdldEtleVRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLZXlUaHJlc2gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiTE1TZXRLZXlUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2V5VGhyZXNoLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEtleVJlcFRocmVzaCIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLZXlSZXBUaHJlc2gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiTE1TZXRLZXlSZXBUaHJlc2giLCAoUHlDRnVuY3Rpb24pRXZ0X0xNU2V0S2V5UmVwVGhyZXNoLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEtiZExhc3QiLCAoUHlDRnVuY3Rpb24pRXZ0X0xNR2V0S2JkTGFzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKKyAgICB7IkxNU2V0S2JkTGFzdCIsIChQeUNGdW5jdGlvbilFdnRfTE1TZXRLYmRMYXN0LCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0S2JkVHlwZSIsIChQeUNGdW5jdGlvbilFdnRfTE1HZXRLYmRUeXBlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAorICAgIHsiTE1TZXRLYmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKUV2dF9MTVNldEtiZFR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiVGlja0NvdW50IiwgKFB5Q0Z1bmN0aW9uKUV2dF9UaWNrQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAorICAgIHsiV2FpdE5leHRFdmVudCIsIChQeUNGdW5jdGlvbilFdnRfV2FpdE5leHRFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRXZlbnRNYXNrIGV2ZW50TWFzaywgVUludDMyIHNsZWVwIFssUmVnaW9uSGFuZGxlXSkgLT4gKEJvb2xlYW4gX3J2LCBFdmVudFJlY29yZCB0aGVFdmVudCkiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKICNlbHNlIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBFdnRfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIHZvaWQgaW5pdF9FdnQodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9FdnQiLCBFdnRfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9FdnQiLCBFdnRfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRXZ0X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoRXZ0X0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRXZ0X0Vycm9yKSAhPSAwKQotCQlyZXR1cm47CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgRXZ0X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRXZ0X0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRXZ0X0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZmlsZS9fRmlsZW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZmlsZS9fRmlsZW1vZHVsZS5jCmluZGV4IDIyZTEyZWMuLmViNWIxNmQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ZpbGUvX0ZpbGVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9maWxlL19GaWxlbW9kdWxlLmMKQEAgLTgsMTQgKzgsMTQgQEAKICNpbmNsdWRlICJweW1hY3Rvb2xib3guaCIKIAogI2lmbmRlZiBIQVZFX09TWDEwNV9TREsKLXR5cGVkZWYgU0ludDE2CUZTSU9SZWZOdW07Cit0eXBlZGVmIFNJbnQxNiAgRlNJT1JlZk51bTsKICNlbmRpZgogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBQeU1hY19HZXRGU1NwZWMgX1B5TWFjX0dldEZTU3BlYwogI2RlZmluZSBQeU1hY19HZXRGU1JlZiBfUHlNYWNfR2V0RlNSZWYKIAotI2Vsc2UJLyogIVVTRV9UT09MQk9YX09CSkVDVF9HTFVFICovCisjZWxzZSAgIC8qICFVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRSAqLwogCiAjaWZuZGVmIF9fTFA2NF9fCiBleHRlcm4gaW50IFB5TWFjX0dldEZTU3BlYyhQeU9iamVjdCAqdiwgRlNTcGVjICpzcGVjKTsKQEAgLTQ1LDcgKzQ1LDcgQEAKIGV4dGVybiBpbnQgUHlNYWNfR2V0RlNSZWYoUHlPYmplY3QgKnYsIEZTUmVmICpmc3IpOwogZXh0ZXJuIFB5T2JqZWN0ICpQeU1hY19CdWlsZEZTUmVmKEZTUmVmICpzcGVjKTsKIAotI2VuZGlmCS8qICFVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRSAqLworI2VuZGlmICAvKiAhVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUgKi8KIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfTmV3KEZTUmVmICppdHNlbGYpOwpAQCAtNjksMTMgKzY5LDEzIEBACiBzdGF0aWMgaW50CiBVVENEYXRlVGltZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBVVENEYXRlVGltZSAqcHRyKQogewotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihIbEgpIiwgJnB0ci0+aGlnaFNlY29uZHMsICZwdHItPmxvd1NlY29uZHMsICZwdHItPmZyYWN0aW9uKTsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihIbEgpIiwgJnB0ci0+aGlnaFNlY29uZHMsICZwdHItPmxvd1NlY29uZHMsICZwdHItPmZyYWN0aW9uKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIFVUQ0RhdGVUaW1lX05ldyhVVENEYXRlVGltZSAqcHRyKQogewotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKEhsSCkiLCBwdHItPmhpZ2hTZWNvbmRzLCBwdHItPmxvd1NlY29uZHMsIHB0ci0+ZnJhY3Rpb24pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoSGxIKSIsIHB0ci0+aGlnaFNlY29uZHMsIHB0ci0+bG93U2Vjb25kcywgcHRyLT5mcmFjdGlvbik7CiB9CiAKIC8qCkBAIC04NSwyMiArODUsMjIgQEAKIHN0YXRpYyBpbnQKIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyKFB5T2JqZWN0ICp2LCBGU1NwZWMgKipzcGVjKQogewotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAgICAgKnNwZWMgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQeU1hY19HZXRGU1NwZWModiwgKnNwZWMpOworICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgKnNwZWMgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIFB5TWFjX0dldEZTU3BlYyh2LCAqc3BlYyk7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBpbnQKIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIoUHlPYmplY3QgKnYsIEZTUmVmICoqcmVmKQogewotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAgICAgKnJlZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFB5TWFjX0dldEZTUmVmKHYsICpyZWYpOworICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgKnJlZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gUHlNYWNfR2V0RlNSZWYodiwgKnJlZik7CiB9CiAKIC8qCkBAIC0xMTAsNTIgKzExMCw1MiBAQAogUHlNYWNfQnVpbGRIRlNVbmlTdHIyNTUoSEZTVW5pU3RyMjU1ICppdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInUjIiwgaXRzZWxmLT51bmljb2RlLCBpdHNlbGYtPmxlbmd0aCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoInUjIiwgaXRzZWxmLT51bmljb2RlLCBpdHNlbGYtPmxlbmd0aCk7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBPU0VycgogX1B5TWFjX0dldEZ1bGxQYXRobmFtZShGU1NwZWMgKmZzcywgY2hhciAqcGF0aCwgaW50IGxlbikKIHsKLQlGU1JlZiBmc3I7Ci0JT1NFcnIgZXJyOworICAgIEZTUmVmIGZzcjsKKyAgICBPU0VyciBlcnI7CiAKLQkqcGF0aCA9ICdcMCc7Ci0JZXJyID0gRlNwTWFrZUZTUmVmKGZzcywgJmZzcik7Ci0JaWYgKGVyciA9PSBmbmZFcnIpIHsKLQkJLyogRlNTcGVjcyBjYW4gcG9pbnQgdG8gbm9uLWV4aXN0aW5nIGZpbGVzLCBmc3JlZnMgY2FuJ3QuICovCi0JCUZTU3BlYyBmc3MyOwotCQlpbnQgdG9jb3B5OworICAgICpwYXRoID0gJ1wwJzsKKyAgICBlcnIgPSBGU3BNYWtlRlNSZWYoZnNzLCAmZnNyKTsKKyAgICBpZiAoZXJyID09IGZuZkVycikgeworICAgICAgICAvKiBGU1NwZWNzIGNhbiBwb2ludCB0byBub24tZXhpc3RpbmcgZmlsZXMsIGZzcmVmcyBjYW4ndC4gKi8KKyAgICAgICAgRlNTcGVjIGZzczI7CisgICAgICAgIGludCB0b2NvcHk7CiAKLQkJZXJyID0gRlNNYWtlRlNTcGVjKGZzcy0+dlJlZk51bSwgZnNzLT5wYXJJRCwKLQkJCQkgICAodW5zaWduZWQgY2hhciopIiIsICZmc3MyKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWVyciA9IEZTcE1ha2VGU1JlZigmZnNzMiwgJmZzcik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQllcnIgPSAoT1NFcnIpRlNSZWZNYWtlUGF0aCgmZnNyLCAodW5zaWduZWQgY2hhciopcGF0aCwgbGVuLTEpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJLyogVGhpcyBwYXJ0IGlzIG5vdCAxMDAlIHNhZmU6IHdlIGFwcGVuZCB0aGUgZmlsZW5hbWUgcGFydCwgYnV0Ci0JCSoqIEknbSBub3Qgc3VyZSB0aGF0IHdlIGRvbid0IHJ1biBhZm91bCBvZiB0aGUgdmFyaW91cyA4Yml0Ci0JCSoqIGVuY29kaW5ncyBoZXJlLiBXaWxsIGhhdmUgdG8gbG9vayB0aGlzIHVwIGF0IHNvbWUgcG9pbnQuLi4KLQkJKi8KLQkJc3RyY2F0KHBhdGgsICIvIik7Ci0JCXRvY29weSA9IGZzcy0+bmFtZVswXTsKLQkJaWYgKChzdHJsZW4ocGF0aCkgKyB0b2NvcHkpID49IGxlbikKLQkJCXRvY29weSA9IGxlbiAtIHN0cmxlbihwYXRoKSAtIDE7Ci0JCWlmICh0b2NvcHkgPiAwKQotCQkJc3RybmNhdChwYXRoLCAoY2hhciopZnNzLT5uYW1lKzEsIHRvY29weSk7Ci0JfQotCWVsc2UgewotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJZXJyID0gKE9TRXJyKUZTUmVmTWFrZVBhdGgoJmZzciwgKHVuc2lnbmVkIGNoYXIqKXBhdGgsIGxlbik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKKyAgICAgICAgZXJyID0gRlNNYWtlRlNTcGVjKGZzcy0+dlJlZk51bSwgZnNzLT5wYXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKikiIiwgJmZzczIpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgZXJyID0gRlNwTWFrZUZTUmVmKCZmc3MyLCAmZnNyKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIGVyciA9IChPU0VycilGU1JlZk1ha2VQYXRoKCZmc3IsICh1bnNpZ25lZCBjaGFyKilwYXRoLCBsZW4tMSk7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAvKiBUaGlzIHBhcnQgaXMgbm90IDEwMCUgc2FmZTogd2UgYXBwZW5kIHRoZSBmaWxlbmFtZSBwYXJ0LCBidXQKKyAgICAgICAgKiogSSdtIG5vdCBzdXJlIHRoYXQgd2UgZG9uJ3QgcnVuIGFmb3VsIG9mIHRoZSB2YXJpb3VzIDhiaXQKKyAgICAgICAgKiogZW5jb2RpbmdzIGhlcmUuIFdpbGwgaGF2ZSB0byBsb29rIHRoaXMgdXAgYXQgc29tZSBwb2ludC4uLgorICAgICAgICAqLworICAgICAgICBzdHJjYXQocGF0aCwgIi8iKTsKKyAgICAgICAgdG9jb3B5ID0gZnNzLT5uYW1lWzBdOworICAgICAgICBpZiAoKHN0cmxlbihwYXRoKSArIHRvY29weSkgPj0gbGVuKQorICAgICAgICAgICAgdG9jb3B5ID0gbGVuIC0gc3RybGVuKHBhdGgpIC0gMTsKKyAgICAgICAgaWYgKHRvY29weSA+IDApCisgICAgICAgICAgICBzdHJuY2F0KHBhdGgsIChjaGFyKilmc3MtPm5hbWUrMSwgdG9jb3B5KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBlcnIgPSAoT1NFcnIpRlNSZWZNYWtlUGF0aCgmZnNyLCAodW5zaWduZWQgY2hhciopcGF0aCwgbGVuKTsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHJldHVybiAwOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCkBAIC0xNjksMjYzICsxNjksMjYzIEBACiAjZGVmaW5lIEZTQ2F0YWxvZ0luZm9fQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRlNDYXRhbG9nSW5mb19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZGU0NhdGFsb2dJbmZvX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBGU0NhdGFsb2dJbmZvT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRlNDYXRhbG9nSW5mbyBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZTQ2F0YWxvZ0luZm8gb2JfaXRzZWxmOwogfSBGU0NhdGFsb2dJbmZvT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fTmV3KEZTQ2F0YWxvZ0luZm8gKml0c2VsZikKIHsKLQlGU0NhdGFsb2dJbmZvT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsgUHlfSU5DUkVGKFB5X05vbmUpOyByZXR1cm4gUHlfTm9uZTsgfQotCWl0ID0gUHlPYmplY3RfTkVXKEZTQ2F0YWxvZ0luZm9PYmplY3QsICZGU0NhdGFsb2dJbmZvX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRlNDYXRhbG9nSW5mb09iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7IFB5X0lOQ1JFRihQeV9Ob25lKTsgcmV0dXJuIFB5X05vbmU7IH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhGU0NhdGFsb2dJbmZvT2JqZWN0LCAmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9ICppdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fQ29udmVydChQeU9iamVjdCAqdiwgRlNDYXRhbG9nSW5mbyAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFGU0NhdGFsb2dJbmZvX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTQ2F0YWxvZ0luZm8gcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoRlNDYXRhbG9nSW5mb09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFGU0NhdGFsb2dJbmZvX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTQ2F0YWxvZ0luZm8gcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoRlNDYXRhbG9nSW5mb09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEZTQ2F0YWxvZ0luZm9fZGVhbGxvYyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZTQ2F0YWxvZ0luZm9fbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9ub2RlRmxhZ3MoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiSCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlRmxhZ3MpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJIIiwgc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfbm9kZUZsYWdzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZzZWxmLT5vYl9pdHNlbGYubm9kZUZsYWdzKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZzZWxmLT5vYl9pdHNlbGYubm9kZUZsYWdzKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3ZvbHVtZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2JfaXRzZWxmLnZvbHVtZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9pdHNlbGYudm9sdW1lKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF92b2x1bWUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJoIiwgJnNlbGYtPm9iX2l0c2VsZi52b2x1bWUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJoIiwgJnNlbGYtPm9iX2l0c2VsZi52b2x1bWUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfcGFyZW50RGlySUQoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5wYXJlbnREaXJJRCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X3BhcmVudERpcklEKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5wYXJlbnREaXJJRCktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9ub2RlSUQoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlSUQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfbm9kZUlEKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYubm9kZUlEKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYubm9kZUlEKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X2NyZWF0ZURhdGUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2NyZWF0ZURhdGUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jcmVhdGVEYXRlKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X2NvbnRlbnRNb2REYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2NvbnRlbnRNb2REYXRlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiTyYiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X2F0dHJpYnV0ZU1vZERhdGUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2F0dHJpYnV0ZU1vZERhdGUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X2FjY2Vzc0RhdGUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2FjY2Vzc0RhdGUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5hY2Nlc3NEYXRlKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X2JhY2t1cERhdGUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2JhY2t1cERhdGUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5iYWNrdXBEYXRlKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3Blcm1pc3Npb25zKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JRlNQZXJtaXNzaW9uSW5mbyogaW5mbyA9IChGU1Blcm1pc3Npb25JbmZvKikmKHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9ucyk7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbGxsKSIsIGluZm8tPnVzZXJJRCwgaW5mby0+Z3JvdXBJRCwgaW5mby0+dXNlckFjY2VzcywgaW5mby0+bW9kZSk7CisgICAgRlNQZXJtaXNzaW9uSW5mbyogaW5mbyA9IChGU1Blcm1pc3Npb25JbmZvKikmKHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9ucyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbGxsKSIsIGluZm8tPnVzZXJJRCwgaW5mby0+Z3JvdXBJRCwgaW5mby0+dXNlckFjY2VzcywgaW5mby0+bW9kZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfcGVybWlzc2lvbnMoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JbG9uZyB1c2VySUQ7Ci0JbG9uZyBncm91cElEOwotCWxvbmcgdXNlckFjY2VzczsKLQlsb25nIG1vZGU7Ci0JaW50IHI7CisgICAgbG9uZyB1c2VySUQ7CisgICAgbG9uZyBncm91cElEOworICAgIGxvbmcgdXNlckFjY2VzczsKKyAgICBsb25nIG1vZGU7CisgICAgaW50IHI7CiAKLQlGU1Blcm1pc3Npb25JbmZvKiBpbmZvID0gKEZTUGVybWlzc2lvbkluZm8qKSYoc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zKTsKKyAgICBGU1Blcm1pc3Npb25JbmZvKiBpbmZvID0gKEZTUGVybWlzc2lvbkluZm8qKSYoc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zKTsKIAotCXIgPSBQeUFyZ19QYXJzZSh2LCAiKGxsbGwpIiwgJnVzZXJJRCwgJmdyb3VwSUQsICZ1c2VyQWNjZXNzLCAmbW9kZSk7Ci0JaWYgKCFyKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaW5mby0+dXNlcklEID0gdXNlcklEOwotCWluZm8tPmdyb3VwSUQgPSBncm91cElEOwotCWluZm8tPnVzZXJBY2Nlc3MgPSB1c2VyQWNjZXNzOwotCWluZm8tPm1vZGUgPSBtb2RlOwotCXJldHVybiAwOworICAgIHIgPSBQeUFyZ19QYXJzZSh2LCAiKGxsbGwpIiwgJnVzZXJJRCwgJmdyb3VwSUQsICZ1c2VyQWNjZXNzLCAmbW9kZSk7CisgICAgaWYgKCFyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW5mby0+dXNlcklEID0gdXNlcklEOworICAgIGluZm8tPmdyb3VwSUQgPSBncm91cElEOworICAgIGluZm8tPnVzZXJBY2Nlc3MgPSB1c2VyQWNjZXNzOworICAgIGluZm8tPm1vZGUgPSBtb2RlOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3ZhbGVuY2UoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF92YWxlbmNlKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYudmFsZW5jZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLnZhbGVuY2UpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfZGF0YUxvZ2ljYWxTaXplKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X2RhdGFMb2dpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9kYXRhUGh5c2ljYWxTaXplKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfZGF0YVBoeXNpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNMb2dpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF9yc3JjTG9naWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNDYXRhbG9nSW5mb19nZXRfcnNyY1BoeXNpY2FsU2l6ZShGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpOwogfQogCiBzdGF0aWMgaW50IEZTQ2F0YWxvZ0luZm9fc2V0X3JzcmNQaHlzaWNhbFNpemUoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY1BoeXNpY2FsU2l6ZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX2dldF9zaGFyaW5nRmxhZ3MoRlNDYXRhbG9nSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgRlNDYXRhbG9nSW5mb19zZXRfc2hhcmluZ0ZsYWdzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTQ2F0YWxvZ0luZm9fZ2V0X3VzZXJQcml2aWxlZ2VzKEZTQ2F0YWxvZ0luZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImIiLCBzZWxmLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJiIiwgc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKTsKIH0KIAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3NldF91c2VyUHJpdmlsZWdlcyhGU0NhdGFsb2dJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImIiLCAmc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKS0xOwotCXJldHVybiAwOworICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiYiIsICZzZWxmLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBGU0NhdGFsb2dJbmZvX2dldHNldGxpc3RbXSA9IHsKLQl7Im5vZGVGbGFncyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfbm9kZUZsYWdzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X25vZGVGbGFncywgTlVMTH0sCi0JeyJ2b2x1bWUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3ZvbHVtZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF92b2x1bWUsIE5VTEx9LAotCXsicGFyZW50RGlySUQiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3BhcmVudERpcklELCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3BhcmVudERpcklELCBOVUxMfSwKLQl7Im5vZGVJRCIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfbm9kZUlELCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X25vZGVJRCwgTlVMTH0sCi0JeyJjcmVhdGVEYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9jcmVhdGVEYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2NyZWF0ZURhdGUsIE5VTEx9LAotCXsiY29udGVudE1vZERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2NvbnRlbnRNb2REYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2NvbnRlbnRNb2REYXRlLCBOVUxMfSwKLQl7ImF0dHJpYnV0ZU1vZERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2F0dHJpYnV0ZU1vZERhdGUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfYXR0cmlidXRlTW9kRGF0ZSwgTlVMTH0sCi0JeyJhY2Nlc3NEYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9hY2Nlc3NEYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2FjY2Vzc0RhdGUsIE5VTEx9LAotCXsiYmFja3VwRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfYmFja3VwRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9iYWNrdXBEYXRlLCBOVUxMfSwKLQl7InBlcm1pc3Npb25zIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9wZXJtaXNzaW9ucywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9wZXJtaXNzaW9ucywgTlVMTH0sCi0JeyJ2YWxlbmNlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF92YWxlbmNlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3ZhbGVuY2UsIE5VTEx9LAotCXsiZGF0YUxvZ2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9kYXRhTG9naWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfZGF0YUxvZ2ljYWxTaXplLCBOVUxMfSwKLQl7ImRhdGFQaHlzaWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2RhdGFQaHlzaWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfZGF0YVBoeXNpY2FsU2l6ZSwgTlVMTH0sCi0JeyJyc3JjTG9naWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNMb2dpY2FsU2l6ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9yc3JjTG9naWNhbFNpemUsIE5VTEx9LAotCXsicnNyY1BoeXNpY2FsU2l6ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfcnNyY1BoeXNpY2FsU2l6ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9yc3JjUGh5c2ljYWxTaXplLCBOVUxMfSwKLQl7InNoYXJpbmdGbGFncyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfc2hhcmluZ0ZsYWdzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3NoYXJpbmdGbGFncywgTlVMTH0sCi0JeyJ1c2VyUHJpdmlsZWdlcyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfdXNlclByaXZpbGVnZXMsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfdXNlclByaXZpbGVnZXMsIE5VTEx9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7Im5vZGVGbGFncyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfbm9kZUZsYWdzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X25vZGVGbGFncywgTlVMTH0sCisgICAgeyJ2b2x1bWUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3ZvbHVtZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF92b2x1bWUsIE5VTEx9LAorICAgIHsicGFyZW50RGlySUQiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3BhcmVudERpcklELCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3BhcmVudERpcklELCBOVUxMfSwKKyAgICB7Im5vZGVJRCIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfbm9kZUlELCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X25vZGVJRCwgTlVMTH0sCisgICAgeyJjcmVhdGVEYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9jcmVhdGVEYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2NyZWF0ZURhdGUsIE5VTEx9LAorICAgIHsiY29udGVudE1vZERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2NvbnRlbnRNb2REYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2NvbnRlbnRNb2REYXRlLCBOVUxMfSwKKyAgICB7ImF0dHJpYnV0ZU1vZERhdGUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2F0dHJpYnV0ZU1vZERhdGUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfYXR0cmlidXRlTW9kRGF0ZSwgTlVMTH0sCisgICAgeyJhY2Nlc3NEYXRlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9hY2Nlc3NEYXRlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X2FjY2Vzc0RhdGUsIE5VTEx9LAorICAgIHsiYmFja3VwRGF0ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfYmFja3VwRGF0ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9iYWNrdXBEYXRlLCBOVUxMfSwKKyAgICB7InBlcm1pc3Npb25zIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9wZXJtaXNzaW9ucywgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9wZXJtaXNzaW9ucywgTlVMTH0sCisgICAgeyJ2YWxlbmNlIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF92YWxlbmNlLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3ZhbGVuY2UsIE5VTEx9LAorICAgIHsiZGF0YUxvZ2ljYWxTaXplIiwgKGdldHRlcilGU0NhdGFsb2dJbmZvX2dldF9kYXRhTG9naWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfZGF0YUxvZ2ljYWxTaXplLCBOVUxMfSwKKyAgICB7ImRhdGFQaHlzaWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X2RhdGFQaHlzaWNhbFNpemUsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfZGF0YVBoeXNpY2FsU2l6ZSwgTlVMTH0sCisgICAgeyJyc3JjTG9naWNhbFNpemUiLCAoZ2V0dGVyKUZTQ2F0YWxvZ0luZm9fZ2V0X3JzcmNMb2dpY2FsU2l6ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9yc3JjTG9naWNhbFNpemUsIE5VTEx9LAorICAgIHsicnNyY1BoeXNpY2FsU2l6ZSIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfcnNyY1BoeXNpY2FsU2l6ZSwgKHNldHRlcilGU0NhdGFsb2dJbmZvX3NldF9yc3JjUGh5c2ljYWxTaXplLCBOVUxMfSwKKyAgICB7InNoYXJpbmdGbGFncyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfc2hhcmluZ0ZsYWdzLCAoc2V0dGVyKUZTQ2F0YWxvZ0luZm9fc2V0X3NoYXJpbmdGbGFncywgTlVMTH0sCisgICAgeyJ1c2VyUHJpdmlsZWdlcyIsIChnZXR0ZXIpRlNDYXRhbG9nSW5mb19nZXRfdXNlclByaXZpbGVnZXMsIChzZXR0ZXIpRlNDYXRhbG9nSW5mb19zZXRfdXNlclByaXZpbGVnZXMsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtNDM2LDEwMyArNDM2LDEwMyBAQAogI2RlZmluZSBGU0NhdGFsb2dJbmZvX2hhc2ggTlVMTAogc3RhdGljIGludCBGU0NhdGFsb2dJbmZvX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlzdGF0aWMgY2hhciAqa3dbXSA9IHsKLQkgICAgICAgICAgICAibm9kZUZsYWdzIiwKLQkgICAgICAgICAgICAidm9sdW1lIiwKLQkgICAgICAgICAgICAicGFyZW50RGlySUQiLAotCSAgICAgICAgICAgICJub2RlSUQiLAotCSAgICAgICAgICAgICJjcmVhdGVEYXRlIiwKLQkgICAgICAgICAgICAiY29udGVudE1vZERhdGUiLAotCSAgICAgICAgICAgICJhdHJpYnV0ZU1vZERhdGUiLAotCSAgICAgICAgICAgICJhY2Nlc3NEYXRlIiwKLQkgICAgICAgICAgICAiYmFja3VwRGF0ZSIsCi0JICAgICAgICAgICAgInZhbGVuY2UiLAotCSAgICAgICAgICAgICJkYXRhTG9naWNhbFNpemUiLAotCSAgICAgICAgICAgICJkYXRhUGh5c2ljYWxTaXplIiwKLQkgICAgICAgICAgICAicnNyY0xvZ2ljYWxTaXplIiwKLQkgICAgICAgICAgICAicnNyY1BoeXNpY2FsU2l6ZSIsCi0JICAgICAgICAgICAgInNoYXJpbmdGbGFncyIsCi0JICAgICAgICAgICAgInVzZXJQcml2aWxlZ2VzIgotCSAgICAgICAgICAgICwgMH07CisgICAgc3RhdGljIGNoYXIgKmt3W10gPSB7CisgICAgICAgICAgICAgICAgIm5vZGVGbGFncyIsCisgICAgICAgICAgICAgICAgInZvbHVtZSIsCisgICAgICAgICAgICAgICAgInBhcmVudERpcklEIiwKKyAgICAgICAgICAgICAgICAibm9kZUlEIiwKKyAgICAgICAgICAgICAgICAiY3JlYXRlRGF0ZSIsCisgICAgICAgICAgICAgICAgImNvbnRlbnRNb2REYXRlIiwKKyAgICAgICAgICAgICAgICAiYXRyaWJ1dGVNb2REYXRlIiwKKyAgICAgICAgICAgICAgICAiYWNjZXNzRGF0ZSIsCisgICAgICAgICAgICAgICAgImJhY2t1cERhdGUiLAorICAgICAgICAgICAgICAgICJ2YWxlbmNlIiwKKyAgICAgICAgICAgICAgICAiZGF0YUxvZ2ljYWxTaXplIiwKKyAgICAgICAgICAgICAgICAiZGF0YVBoeXNpY2FsU2l6ZSIsCisgICAgICAgICAgICAgICAgInJzcmNMb2dpY2FsU2l6ZSIsCisgICAgICAgICAgICAgICAgInJzcmNQaHlzaWNhbFNpemUiLAorICAgICAgICAgICAgICAgICJzaGFyaW5nRmxhZ3MiLAorICAgICAgICAgICAgICAgICJ1c2VyUHJpdmlsZWdlcyIKKyAgICAgICAgICAgICAgICAsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifEhobGxPJk8mTyZPJk8mbGxsbGxsYiIsIGt3LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYubm9kZUZsYWdzLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi52b2x1bWUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnBhcmVudERpcklELAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5ub2RlSUQsCi0JICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmNyZWF0ZURhdGUsCi0JICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlLAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlLAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5hY2Nlc3NEYXRlLAotCSAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5iYWNrdXBEYXRlLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi52YWxlbmNlLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5kYXRhTG9naWNhbFNpemUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUsCi0JICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYucnNyY1BoeXNpY2FsU2l6ZSwKLQkgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzLAotCSAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcykpCi0JewotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxIaGxsTyZPJk8mTyZPJmxsbGxsbGIiLCBrdywgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLm5vZGVGbGFncywKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudm9sdW1lLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5wYXJlbnREaXJJRCwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYubm9kZUlELAorICAgICAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5jcmVhdGVEYXRlLAorICAgICAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSwKKyAgICAgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudmFsZW5jZSwKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplLAorICAgICAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUsCisgICAgICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncywKKyAgICAgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBGU0NhdGFsb2dJbmZvX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpGU0NhdGFsb2dJbmZvX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOwogCi0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCW1lbXNldCgmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTQ2F0YWxvZ0luZm8pKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLCAwLCBzaXplb2YoRlNDYXRhbG9nSW5mbykpOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEZTQ2F0YWxvZ0luZm9fdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZTQ2F0YWxvZ0luZm9fVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJDYXJib24uRmlsZS5GU0NhdGFsb2dJbmZvIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRlNDYXRhbG9nSW5mb09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEZTQ2F0YWxvZ0luZm9fZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgRlNDYXRhbG9nSW5mb19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRlNDYXRhbG9nSW5mb19yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRlNDYXRhbG9nSW5mb19oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlGU0NhdGFsb2dJbmZvX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUZTQ2F0YWxvZ0luZm9fZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRlNDYXRhbG9nSW5mb190cF9pbml0LCAvKiB0cF9pbml0ICovCi0JRlNDYXRhbG9nSW5mb190cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlGU0NhdGFsb2dJbmZvX3RwX25ldywgLyogdHBfbmV3ICovCi0JRlNDYXRhbG9nSW5mb190cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiQ2FyYm9uLkZpbGUuRlNDYXRhbG9nSW5mbyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEZTQ2F0YWxvZ0luZm9PYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBGU0NhdGFsb2dJbmZvX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEZTQ2F0YWxvZ0luZm9fY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEZTQ2F0YWxvZ0luZm9fcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEZTQ2F0YWxvZ0luZm9faGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgRlNDYXRhbG9nSW5mb19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBGU0NhdGFsb2dJbmZvX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEZTQ2F0YWxvZ0luZm9fdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEZTQ2F0YWxvZ0luZm9fdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRlNDYXRhbG9nSW5mb190cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEZTQ2F0YWxvZ0luZm9fdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEZTQ2F0YWxvZ0luZm8gLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC01NDcsMTAzICs1NDcsMTAzIEBACiAjZGVmaW5lIEZJbmZvX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkZJbmZvX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkZJbmZvX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBGSW5mb09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUZJbmZvIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRkluZm8gb2JfaXRzZWxmOwogfSBGSW5mb09iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpGSW5mb19OZXcoRkluZm8gKml0c2VsZikKIHsKLQlGSW5mb09iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEZJbmZvT2JqZWN0LCAmRkluZm9fVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSAqaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBGSW5mb09iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEZJbmZvT2JqZWN0LCAmRkluZm9fVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSAqaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIGludCBGSW5mb19Db252ZXJ0KFB5T2JqZWN0ICp2LCBGSW5mbyAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFGSW5mb19DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGSW5mbyByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChGSW5mb09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFGSW5mb19DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGSW5mbyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChGSW5mb09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEZJbmZvX2RlYWxsb2MoRkluZm9PYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgRkluZm9fbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpGSW5mb19nZXRfVHlwZShGSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZE9TVHlwZSwgc2VsZi0+b2JfaXRzZWxmLmZkVHlwZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpOwogfQogCiBzdGF0aWMgaW50IEZJbmZvX3NldF9UeXBlKEZJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZi0+b2JfaXRzZWxmLmZkVHlwZSktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZi0+b2JfaXRzZWxmLmZkVHlwZSktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGSW5mb19nZXRfQ3JlYXRvcihGSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZE9TVHlwZSwgc2VsZi0+b2JfaXRzZWxmLmZkQ3JlYXRvcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpOwogfQogCiBzdGF0aWMgaW50IEZJbmZvX3NldF9DcmVhdG9yKEZJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZi0+b2JfaXRzZWxmLmZkQ3JlYXRvciktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZi0+b2JfaXRzZWxmLmZkQ3JlYXRvciktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGSW5mb19nZXRfRmxhZ3MoRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkgiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIkgiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgRkluZm9fc2V0X0ZsYWdzKEZJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmc2VsZi0+b2JfaXRzZWxmLmZkRmxhZ3MpLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJIIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsYWdzKS0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZJbmZvX2dldF9Mb2NhdGlvbihGSW5mb09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCBzZWxmLT5vYl9pdHNlbGYuZmRMb2NhdGlvbik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRQb2ludCwgc2VsZi0+b2JfaXRzZWxmLmZkTG9jYXRpb24pOwogfQogCiBzdGF0aWMgaW50IEZJbmZvX3NldF9Mb2NhdGlvbihGSW5mb09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldFBvaW50LCAmc2VsZi0+b2JfaXRzZWxmLmZkTG9jYXRpb24pLTE7Ci0JcmV0dXJuIDA7CisgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJPJiIsIFB5TWFjX0dldFBvaW50LCAmc2VsZi0+b2JfaXRzZWxmLmZkTG9jYXRpb24pLTE7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRkluZm9fZ2V0X0ZsZHIoRkluZm9PYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGRyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpOwogfQogCiBzdGF0aWMgaW50IEZJbmZvX3NldF9GbGRyKEZJbmZvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgImgiLCAmc2VsZi0+b2JfaXRzZWxmLmZkRmxkciktMTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgImgiLCAmc2VsZi0+b2JfaXRzZWxmLmZkRmxkciktMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5R2V0U2V0RGVmIEZJbmZvX2dldHNldGxpc3RbXSA9IHsKLQl7IlR5cGUiLCAoZ2V0dGVyKUZJbmZvX2dldF9UeXBlLCAoc2V0dGVyKUZJbmZvX3NldF9UeXBlLCAiNC1jaGFyIGZpbGUgdHlwZSJ9LAotCXsiQ3JlYXRvciIsIChnZXR0ZXIpRkluZm9fZ2V0X0NyZWF0b3IsIChzZXR0ZXIpRkluZm9fc2V0X0NyZWF0b3IsICI0LWNoYXIgZmlsZSBjcmVhdG9yIn0sCi0JeyJGbGFncyIsIChnZXR0ZXIpRkluZm9fZ2V0X0ZsYWdzLCAoc2V0dGVyKUZJbmZvX3NldF9GbGFncywgIkZpbmRlciBmbGFnIGJpdHMifSwKLQl7IkxvY2F0aW9uIiwgKGdldHRlcilGSW5mb19nZXRfTG9jYXRpb24sIChzZXR0ZXIpRkluZm9fc2V0X0xvY2F0aW9uLCAiKHgsIHkpIGxvY2F0aW9uIG9mIHRoZSBmaWxlJ3MgaWNvbiBpbiBpdHMgcGFyZW50IGZpbmRlciB3aW5kb3cifSwKLQl7IkZsZHIiLCAoZ2V0dGVyKUZJbmZvX2dldF9GbGRyLCAoc2V0dGVyKUZJbmZvX3NldF9GbGRyLCAiT3JpZ2luYWwgZm9sZGVyLCBmb3IgJ3B1dCBhd2F5JyJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7IlR5cGUiLCAoZ2V0dGVyKUZJbmZvX2dldF9UeXBlLCAoc2V0dGVyKUZJbmZvX3NldF9UeXBlLCAiNC1jaGFyIGZpbGUgdHlwZSJ9LAorICAgIHsiQ3JlYXRvciIsIChnZXR0ZXIpRkluZm9fZ2V0X0NyZWF0b3IsIChzZXR0ZXIpRkluZm9fc2V0X0NyZWF0b3IsICI0LWNoYXIgZmlsZSBjcmVhdG9yIn0sCisgICAgeyJGbGFncyIsIChnZXR0ZXIpRkluZm9fZ2V0X0ZsYWdzLCAoc2V0dGVyKUZJbmZvX3NldF9GbGFncywgIkZpbmRlciBmbGFnIGJpdHMifSwKKyAgICB7IkxvY2F0aW9uIiwgKGdldHRlcilGSW5mb19nZXRfTG9jYXRpb24sIChzZXR0ZXIpRkluZm9fc2V0X0xvY2F0aW9uLCAiKHgsIHkpIGxvY2F0aW9uIG9mIHRoZSBmaWxlJ3MgaWNvbiBpbiBpdHMgcGFyZW50IGZpbmRlciB3aW5kb3cifSwKKyAgICB7IkZsZHIiLCAoZ2V0dGVyKUZJbmZvX2dldF9GbGRyLCAoc2V0dGVyKUZJbmZvX3NldF9GbGRyLCAiT3JpZ2luYWwgZm9sZGVyLCBmb3IgJ3B1dCBhd2F5JyJ9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtNjU0LDczICs2NTQsNzMgQEAKICNkZWZpbmUgRkluZm9faGFzaCBOVUxMCiBzdGF0aWMgaW50IEZJbmZvX3RwX2luaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlGSW5mbyAqaXRzZWxmID0gTlVMTDsKLQlzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgRkluZm8gKml0c2VsZiA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8TyYiLCBrdywgRkluZm9fQ29udmVydCwgJml0c2VsZikpCi0JewotCQlpZiAoaXRzZWxmKSBtZW1jcHkoJigoRkluZm9PYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgaXRzZWxmLCBzaXplb2YoRkluZm8pKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtMTsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPJiIsIGt3LCBGSW5mb19Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgIGlmIChpdHNlbGYpIG1lbWNweSgmKChGSW5mb09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLCBpdHNlbGYsIHNpemVvZihGSW5mbykpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIEZJbmZvX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpGSW5mb190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQltZW1zZXQoJigoRkluZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLCAwLCBzaXplb2YoRkluZm8pKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCYoKEZJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZJbmZvKSk7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgRkluZm9fdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZJbmZvX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiQ2FyYm9uLkZpbGUuRkluZm8iLCAvKnRwX25hbWUqLwotCXNpemVvZihGSW5mb09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEZJbmZvX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEZJbmZvX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBGSW5mb19yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRkluZm9faGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRkluZm9fbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRkluZm9fZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRkluZm9fdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUZJbmZvX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUZJbmZvX3RwX25ldywgLyogdHBfbmV3ICovCi0JRkluZm9fdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIkNhcmJvbi5GaWxlLkZJbmZvIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRkluZm9PYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBGSW5mb19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBGSW5mb19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRkluZm9fcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEZJbmZvX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEZJbmZvX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEZJbmZvX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEZJbmZvX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBGSW5mb190cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBGSW5mb190cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEZJbmZvX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KQEAgLTczNCwyNDQgKzczNCwyNDQgQEAKICNkZWZpbmUgQWxpYXNfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmQWxpYXNfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmQWxpYXNfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEFsaWFzT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQWxpYXNIYW5kbGUgb2JfaXRzZWxmOwotCXZvaWQgKCpvYl9mcmVlaXQpKEFsaWFzSGFuZGxlIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEFsaWFzSGFuZGxlIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShBbGlhc0hhbmRsZSBwdHIpOwogfSBBbGlhc09iamVjdDsKIAogc3RhdGljIFB5T2JqZWN0ICpBbGlhc19OZXcoQWxpYXNIYW5kbGUgaXRzZWxmKQogewotCUFsaWFzT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoQWxpYXNPYmplY3QsICZBbGlhc19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgQWxpYXNPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhBbGlhc09iamVjdCwgJkFsaWFzX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGl0LT5vYl9mcmVlaXQgPSBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIGludCBBbGlhc19Db252ZXJ0KFB5T2JqZWN0ICp2LCBBbGlhc0hhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFBbGlhc19DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJBbGlhcyByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChBbGlhc09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFBbGlhc19DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJBbGlhcyByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChBbGlhc09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIEFsaWFzX2RlYWxsb2MoQWxpYXNPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsKLQl9Ci0Jc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7CisgICAgfQorICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpBbGlhc19SZXNvbHZlQWxpYXMoQWxpYXNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzb2x2ZUFsaWFzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjIHRhcmdldDsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc29sdmVBbGlhcyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBbGlhc19HZXRBbGlhc0luZm8oQWxpYXNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQWxpYXNJbmZvVHlwZSBpbmRleDsKLQlTdHI2MyB0aGVTdHJpbmc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRBbGlhc0luZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRoZVN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQWxpYXNJbmZvVHlwZSBpbmRleDsKKyAgICBTdHI2MyB0aGVTdHJpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRBbGlhc0luZm8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRoZVN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoQWxpYXNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQl1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1NwZWMgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1NwZWMgdGFyZ2V0OworICAgIEJvb2xlYW4gd2FzQ2hhbmdlZDsKKyAgICB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfRm9sbG93RmluZGVyQWxpYXMoQWxpYXNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKLQlCb29sZWFuIGxvZ29uOwotCUZTU3BlYyB0YXJnZXQ7Ci0JQm9vbGVhbiB3YXNDaGFuZ2VkOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2dvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGb2xsb3dGaW5kZXJBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbG9nb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1NwZWMgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBCb29sZWFuIGxvZ29uOworICAgIEZTU3BlYyB0YXJnZXQ7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyLCAmZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2dvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGb2xsb3dGaW5kZXJBbGlhcyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyhBbGlhc09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKLQlGU1JlZiB0YXJnZXQ7Ci0JQm9vbGVhbiB3YXNDaGFuZ2VkOwotCXVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50RmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTUmVmIHRhcmdldDsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfRlNSZXNvbHZlQWxpYXMoQWxpYXNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU1Jlc29sdmVBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTUmVmIHRhcmdldDsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNSZXNvbHZlQWxpYXMoZnJvbUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpBbGlhc19GU0ZvbGxvd0ZpbmRlckFsaWFzKEFsaWFzT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTUmVmIGZyb21GaWxlOwotCUJvb2xlYW4gbG9nb247Ci0JRlNSZWYgdGFyZ2V0OwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxvZ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRm9sbG93RmluZGVyQWxpYXMoJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBmcm9tRmlsZTsKKyAgICBCb29sZWFuIGxvZ29uOworICAgIEZTUmVmIHRhcmdldDsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2dvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0ZvbGxvd0ZpbmRlckFsaWFzKCZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBBbGlhc19tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJSZXNvbHZlQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfUmVzb2x2ZUFsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUpIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiR2V0QWxpYXNJbmZvIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0dldEFsaWFzSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQWxpYXNJbmZvVHlwZSBpbmRleCkgLT4gKFN0cjYzIHRoZVN0cmluZykiKX0sCi0JeyJSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilBbGlhc19SZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlLCB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3MpIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXsiRm9sbG93RmluZGVyQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRm9sbG93RmluZGVyQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgQm9vbGVhbiBsb2dvbikgLT4gKEZTU3BlYyB0YXJnZXQsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAgeyJSZXNvbHZlQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfUmVzb2x2ZUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZnJvbUZpbGUpIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiR2V0QWxpYXNJbmZvIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0dldEFsaWFzSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQWxpYXNJbmZvVHlwZSBpbmRleCkgLT4gKFN0cjYzIHRoZVN0cmluZykiKX0sCisgICAgeyJSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilBbGlhc19SZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlLCB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3MpIC0+IChGU1NwZWMgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiRm9sbG93RmluZGVyQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRm9sbG93RmluZGVyQWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgQm9vbGVhbiBsb2dvbikgLT4gKEZTU3BlYyB0YXJnZXQsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JeyJGU1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZTUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3MpIC0+IChGU1JlZiB0YXJnZXQsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCi0JeyJGU1Jlc29sdmVBbGlhcyIsIChQeUNGdW5jdGlvbilBbGlhc19GU1Jlc29sdmVBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgZnJvbUZpbGUpIC0+IChGU1JlZiB0YXJnZXQsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCi0JeyJGU0ZvbGxvd0ZpbmRlckFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUFsaWFzX0ZTRm9sbG93RmluZGVyQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gbG9nb24pIC0+IChGU1JlZiBmcm9tRmlsZSwgRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiRlNSZXNvbHZlQWxpYXNXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilBbGlhc19GU1Jlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBmcm9tRmlsZSwgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiRlNSZXNvbHZlQWxpYXMiLCAoUHlDRnVuY3Rpb24pQWxpYXNfRlNSZXNvbHZlQWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlKSAtPiAoRlNSZWYgdGFyZ2V0LCBCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiRlNGb2xsb3dGaW5kZXJBbGlhcyIsIChQeUNGdW5jdGlvbilBbGlhc19GU0ZvbGxvd0ZpbmRlckFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGxvZ29uKSAtPiAoRlNSZWYgZnJvbUZpbGUsIEZTUmVmIHRhcmdldCwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqQWxpYXNfZ2V0X2RhdGEoQWxpYXNPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaW50IHNpemU7Ci0JICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcnY7CisgICAgaW50IHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcnY7CiAKLQkgICAgICAgICAgICAgICAgICAgIHNpemUgPSBHZXRIYW5kbGVTaXplKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAgICAgICAgIEhMb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAgICAgICAgIHJ2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKihIYW5kbGUpc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKLQkgICAgICAgICAgICAgICAgICAgIEhVbmxvY2soKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ2OwotCSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IEdldEhhbmRsZVNpemUoKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgSExvY2soKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgqKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYsIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgSFVubG9jaygoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnY7CisKIH0KIAogI2RlZmluZSBBbGlhc19zZXRfZGF0YSBOVUxMCiAKIHN0YXRpYyBQeUdldFNldERlZiBBbGlhc19nZXRzZXRsaXN0W10gPSB7Ci0JeyJkYXRhIiwgKGdldHRlcilBbGlhc19nZXRfZGF0YSwgKHNldHRlcilBbGlhc19zZXRfZGF0YSwgIlJhdyBkYXRhIG9mIHRoZSBhbGlhcyBvYmplY3QifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJkYXRhIiwgKGdldHRlcilBbGlhc19nZXRfZGF0YSwgKHNldHRlcilBbGlhc19zZXRfZGF0YSwgIlJhdyBkYXRhIG9mIHRoZSBhbGlhcyBvYmplY3QifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTk4Miw5NyArOTgyLDk3IEBACiAjZGVmaW5lIEFsaWFzX2hhc2ggTlVMTAogc3RhdGljIGludCBBbGlhc190cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JQWxpYXNIYW5kbGUgaXRzZWxmID0gTlVMTDsKLQljaGFyICpyYXdkYXRhID0gTlVMTDsKLQlpbnQgcmF3ZGF0YWxlbiA9IDA7Ci0JSGFuZGxlIGg7Ci0Jc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsICJyYXdkYXRhIiwgMH07CisgICAgQWxpYXNIYW5kbGUgaXRzZWxmID0gTlVMTDsKKyAgICBjaGFyICpyYXdkYXRhID0gTlVMTDsKKyAgICBpbnQgcmF3ZGF0YWxlbiA9IDA7CisgICAgSGFuZGxlIGg7CisgICAgc3RhdGljIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsICJyYXdkYXRhIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8TyZzIyIsIGt3LCBBbGlhc19Db252ZXJ0LCAmaXRzZWxmLCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKQotCXJldHVybiAtMTsKLQlpZiAoaXRzZWxmICYmIHJhd2RhdGEpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICghaXRzZWxmICYmICFyYXdkYXRhKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChyYXdkYXRhKQotCXsKLQkJaWYgKChoID0gTmV3SGFuZGxlKHJhd2RhdGFsZW4pKSA9PSBOVUxMKQotCQl7Ci0JCQlQeUVycl9Ob01lbW9yeSgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUhMb2NrKGgpOwotCQltZW1jcHkoKGNoYXIgKikqaCwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7Ci0JCUhVbmxvY2soaCk7Ci0JCSgoQWxpYXNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IChBbGlhc0hhbmRsZSloOwotCQlyZXR1cm4gMDsKLQl9Ci0JKChBbGlhc09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPJnMjIiwga3csIEFsaWFzX0NvbnZlcnQsICZpdHNlbGYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpCisgICAgcmV0dXJuIC0xOworICAgIGlmIChpdHNlbGYgJiYgcmF3ZGF0YSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmx5IG9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtYXkgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFpdHNlbGYgJiYgIXJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJhd2RhdGEpCisgICAgeworICAgICAgICBpZiAoKGggPSBOZXdIYW5kbGUocmF3ZGF0YWxlbikpID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgSExvY2soaCk7CisgICAgICAgIG1lbWNweSgoY2hhciAqKSpoLCByYXdkYXRhLCByYXdkYXRhbGVuKTsKKyAgICAgICAgSFVubG9jayhoKTsKKyAgICAgICAgKChBbGlhc09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gKEFsaWFzSGFuZGxlKWg7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAoKEFsaWFzT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIDA7CiB9CiAKICNkZWZpbmUgQWxpYXNfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkFsaWFzX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOwogCi0JaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoQWxpYXNPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsKLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChBbGlhc09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEFsaWFzX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBBbGlhc19UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIkNhcmJvbi5GaWxlLkFsaWFzIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQWxpYXNPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBBbGlhc19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBBbGlhc19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgQWxpYXNfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEFsaWFzX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCUFsaWFzX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUFsaWFzX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUFsaWFzX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlBbGlhc190cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlBbGlhc190cF9uZXcsIC8qIHRwX25ldyAqLwotCUFsaWFzX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJDYXJib24uRmlsZS5BbGlhcyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEFsaWFzT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgQWxpYXNfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgQWxpYXNfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEFsaWFzX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBBbGlhc19oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBBbGlhc19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBBbGlhc19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBBbGlhc190cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgQWxpYXNfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgQWxpYXNfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBBbGlhc190cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIEFsaWFzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEwODYsMzQ3ICsxMDg2LDM0NyBAQAogI2RlZmluZSBGU1NwZWNfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmRlNTcGVjX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkZTU3BlY19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRlNTcGVjT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JRlNTcGVjIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRlNTcGVjIG9iX2l0c2VsZjsKIH0gRlNTcGVjT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19OZXcoRlNTcGVjICppdHNlbGYpCiB7Ci0JRlNTcGVjT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoRlNTcGVjT2JqZWN0LCAmRlNTcGVjX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRlNTcGVjT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoRlNTcGVjT2JqZWN0LCAmRlNTcGVjX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyB2b2lkIEZTU3BlY19kZWFsbG9jKEZTU3BlY09iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcE9wZW5ERihGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDggcGVybWlzc2lvbjsKLQlzaG9ydCByZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcE9wZW5ERigmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQ4IHBlcm1pc3Npb247CisgICAgc2hvcnQgcmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BPcGVuREYoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwT3BlblJGKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50OCBwZXJtaXNzaW9uOwotCXNob3J0IHJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwT3BlblJGKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgICAgICZyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDggcGVybWlzc2lvbjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcE9wZW5SRigmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BDcmVhdGUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcENyZWF0ZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwQ3JlYXRlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwRGlyQ3JlYXRlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZWREaXJJRDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BEaXJDcmVhdGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlySUQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGxvbmcgY3JlYXRlZERpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcERpckNyZWF0ZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWREaXJJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcERlbGV0ZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BEZWxldGUoJl9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwRGVsZXRlKCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwR2V0RkluZm8oRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZJbmZvIGZuZHJJbmZvOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwR2V0RkluZm8oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZmbmRySW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEZJbmZvX05ldywgJmZuZHJJbmZvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGSW5mbyBmbmRySW5mbzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcEdldEZJbmZvKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmZm5kckluZm8pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSW5mb19OZXcsICZmbmRySW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcFNldEZJbmZvKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGSW5mbyBmbmRySW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZJbmZvX0NvbnZlcnQsICZmbmRySW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BTZXRGSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGSW5mbyBmbmRySW5mbzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJbmZvX0NvbnZlcnQsICZmbmRySW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BTZXRGSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwU2V0RkxvY2soRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwU2V0RkxvY2soJl9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwU2V0RkxvY2soJl9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BSc3RGTG9jayhGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BSc3RGTG9jaygmX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BSc3RGTG9jaygmX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcFJlbmFtZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyMjU1IG5ld05hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5ld05hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNwUmVuYW1lKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgbmV3TmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyMjU1IG5ld05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5ld05hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNwUmVuYW1lKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0ZTcENhdE1vdmUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBkZXN0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZkZXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcENhdE1vdmUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgJmRlc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBkZXN0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZkZXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcENhdE1vdmUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJmRlc3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19GU3BFeGNoYW5nZUZpbGVzKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZGVzdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmZGVzdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BFeGNoYW5nZUZpbGVzKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZGVzdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmZGVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BFeGNoYW5nZUZpbGVzKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfRlNwTWFrZUZTUmVmKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBuZXdSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU3BNYWtlRlNSZWYoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBuZXdSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU3BNYWtlRlNSZWYoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfTmV3QWxpYXNNaW5pbWFsKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0FsaWFzTWluaW1hbCgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFsaWFzSGFuZGxlIGFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3QWxpYXNNaW5pbWFsKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBhbGlhcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNTcGVjX0lzQWxpYXNGaWxlKEZTU3BlY09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlCb29sZWFuIGFsaWFzRmlsZUZsYWc7Ci0JQm9vbGVhbiBmb2xkZXJGbGFnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSXNBbGlhc0ZpbGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZhbGlhc0ZpbGVGbGFnLAotCSAgICAgICAgICAgICAgICAgICAmZm9sZGVyRmxhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIGFsaWFzRmlsZUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgZm9sZGVyRmxhZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQm9vbGVhbiBhbGlhc0ZpbGVGbGFnOworICAgIEJvb2xlYW4gZm9sZGVyRmxhZzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElzQWxpYXNGaWxlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmYWxpYXNGaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgJmZvbGRlckZsYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc0ZpbGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlckZsYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY19hc19wYXRobmFtZShGU1NwZWNPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWNoYXIgc3RyYnVmWzEwMjRdOwotCU9TRXJyIGVycjsKKyAgICBjaGFyIHN0cmJ1ZlsxMDI0XTsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWVyciA9IF9QeU1hY19HZXRGdWxsUGF0aG5hbWUoJl9zZWxmLT5vYl9pdHNlbGYsIHN0cmJ1Ziwgc2l6ZW9mKHN0cmJ1ZikpOwotCWlmICggZXJyICkgewotCSAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKLQkgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQlfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZyhzdHJidWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBlcnIgPSBfUHlNYWNfR2V0RnVsbFBhdGhuYW1lKCZfc2VsZi0+b2JfaXRzZWxmLCBzdHJidWYsIHNpemVvZihzdHJidWYpKTsKKyAgICBpZiAoIGVyciApIHsKKyAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIF9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKHN0cmJ1Zik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfYXNfdHVwbGUoRlNTcGVjT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCIoaWlzIykiLCBfc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sIF9zZWxmLT5vYl9pdHNlbGYucGFySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMV0sIF9zZWxmLT5vYl9pdHNlbGYubmFtZVswXSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCIoaWlzIykiLCBfc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sIF9zZWxmLT5vYl9pdHNlbGYucGFySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMV0sIF9zZWxmLT5vYl9pdHNlbGYubmFtZVswXSk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZTU3BlY19tZXRob2RzW10gPSB7Ci0JeyJGU3BPcGVuREYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE9wZW5ERiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCi0JeyJGU3BPcGVuUkYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE9wZW5SRiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCi0JeyJGU3BDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcENyZWF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IE5vbmUiKX0sCi0JeyJGU3BEaXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcERpckNyZWF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChsb25nIGNyZWF0ZWREaXJJRCkiKX0sCi0JeyJGU3BEZWxldGUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcERlbGV0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRlNwR2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcEdldEZJbmZvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGSW5mbyBmbmRySW5mbykiKX0sCi0JeyJGU3BTZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwU2V0RkluZm8sIDEsCi0JIFB5RG9jX1NUUigiKEZJbmZvIGZuZHJJbmZvKSAtPiBOb25lIil9LAotCXsiRlNwU2V0RkxvY2siLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcFNldEZMb2NrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJGU3BSc3RGTG9jayIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwUnN0RkxvY2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkZTcFJlbmFtZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwUmVuYW1lLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgbmV3TmFtZSkgLT4gTm9uZSIpfSwKLQl7IkZTcENhdE1vdmUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcENhdE1vdmUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBkZXN0KSAtPiBOb25lIil9LAotCXsiRlNwRXhjaGFuZ2VGaWxlcyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwRXhjaGFuZ2VGaWxlcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGRlc3QpIC0+IE5vbmUiKX0sCi0JeyJGU3BNYWtlRlNSZWYiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX0ZTcE1ha2VGU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRlNSZWYgbmV3UmVmKSIpfSwKLQl7Ik5ld0FsaWFzTWluaW1hbCIsIChQeUNGdW5jdGlvbilGU1NwZWNfTmV3QWxpYXNNaW5pbWFsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCi0JeyJJc0FsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfSXNBbGlhc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gYWxpYXNGaWxlRmxhZywgQm9vbGVhbiBmb2xkZXJGbGFnKSIpfSwKLQl7ImFzX3BhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19hc19wYXRobmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBzdHJpbmciKX0sCi0JeyJhc190dXBsZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfYXNfdHVwbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHZSZWZOdW0sIGRpcklELCBuYW1lKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTcE9wZW5ERiIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwT3BlbkRGLCAxLAorICAgICBQeURvY19TVFIoIihTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKKyAgICB7IkZTcE9wZW5SRiIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwT3BlblJGLCAxLAorICAgICBQeURvY19TVFIoIihTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKKyAgICB7IkZTcENyZWF0ZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwQ3JlYXRlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGZpbGVUeXBlLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gTm9uZSIpfSwKKyAgICB7IkZTcERpckNyZWF0ZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwRGlyQ3JlYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gKGxvbmcgY3JlYXRlZERpcklEKSIpfSwKKyAgICB7IkZTcERlbGV0ZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwRGVsZXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BHZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwR2V0RkluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZJbmZvIGZuZHJJbmZvKSIpfSwKKyAgICB7IkZTcFNldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BTZXRGSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRkluZm8gZm5kckluZm8pIC0+IE5vbmUiKX0sCisgICAgeyJGU3BTZXRGTG9jayIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwU2V0RkxvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcFJzdEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BSc3RGTG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRlNwUmVuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BSZW5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBuZXdOYW1lKSAtPiBOb25lIil9LAorICAgIHsiRlNwQ2F0TW92ZSIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwQ2F0TW92ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGRlc3QpIC0+IE5vbmUiKX0sCisgICAgeyJGU3BFeGNoYW5nZUZpbGVzIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19GU3BFeGNoYW5nZUZpbGVzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZGVzdCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcE1ha2VGU1JlZiIsIChQeUNGdW5jdGlvbilGU1NwZWNfRlNwTWFrZUZTUmVmLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGU1JlZiBuZXdSZWYpIil9LAorICAgIHsiTmV3QWxpYXNNaW5pbWFsIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19OZXdBbGlhc01pbmltYWwsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKKyAgICB7IklzQWxpYXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19Jc0FsaWFzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBhbGlhc0ZpbGVGbGFnLCBCb29sZWFuIGZvbGRlckZsYWcpIil9LAorICAgIHsiYXNfcGF0aG5hbWUiLCAoUHlDRnVuY3Rpb24pRlNTcGVjX2FzX3BhdGhuYW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IHN0cmluZyIpfSwKKyAgICB7ImFzX3R1cGxlIiwgKFB5Q0Z1bmN0aW9uKUZTU3BlY19hc190dXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAodlJlZk51bSwgZGlySUQsIG5hbWUpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpGU1NwZWNfZ2V0X2RhdGEoRlNTcGVjT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihzZWxmLT5vYl9pdHNlbGYpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7CiB9CiAKICNkZWZpbmUgRlNTcGVjX3NldF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEZTU3BlY19nZXRzZXRsaXN0W10gPSB7Ci0JeyJkYXRhIiwgKGdldHRlcilGU1NwZWNfZ2V0X2RhdGEsIChzZXR0ZXIpRlNTcGVjX3NldF9kYXRhLCAiUmF3IGRhdGEgb2YgdGhlIEZTU3BlYyBvYmplY3QifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJkYXRhIiwgKGdldHRlcilGU1NwZWNfZ2V0X2RhdGEsIChzZXR0ZXIpRlNTcGVjX3NldF9kYXRhLCAiUmF3IGRhdGEgb2YgdGhlIEZTU3BlYyBvYmplY3QifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTE0MzQsMTA1ICsxNDM0LDEwNSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKiBGU1NwZWNfcmVwcihGU1NwZWNPYmplY3QgKnNlbGYpCiB7Ci0JY2hhciBidWZbNTEyXTsKLQlQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcygoJWQsICVsZCwgJyUuKnMnKSkiLAotCSAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKLQkgICAgICAgIHNlbGYtPm9iX2l0c2VsZi52UmVmTnVtLAotCSAgICAgICAgc2VsZi0+b2JfaXRzZWxmLnBhcklELAotCSAgICAgICAgc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0sIHNlbGYtPm9iX2l0c2VsZi5uYW1lKzEpOwotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgICAgY2hhciBidWZbNTEyXTsKKyAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcygoJWQsICVsZCwgJyUuKnMnKSkiLAorICAgICAgICBzZWxmLT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICBzZWxmLT5vYl9pdHNlbGYudlJlZk51bSwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLnBhcklELAorICAgICAgICBzZWxmLT5vYl9pdHNlbGYubmFtZVswXSwgc2VsZi0+b2JfaXRzZWxmLm5hbWUrMSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKIH0KIAogI2RlZmluZSBGU1NwZWNfaGFzaCBOVUxMCiBzdGF0aWMgaW50IEZTU3BlY190cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnYgPSBOVUxMOwotCWNoYXIgKnJhd2RhdGEgPSBOVUxMOwotCWludCByYXdkYXRhbGVuID0gMDsKLQlzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgInJhd2RhdGEiLCAwfTsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEw7CisgICAgY2hhciAqcmF3ZGF0YSA9IE5VTEw7CisgICAgaW50IHJhd2RhdGFsZW4gPSAwOworICAgIHN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAicmF3ZGF0YSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE9zIyIsIGt3LCAmdiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkKLQlyZXR1cm4gLTE7Ci0JaWYgKHYgJiYgcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmx5IG9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtYXkgYmUgc3BlY2lmaWVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCF2ICYmICFyYXdkYXRhKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChyYXdkYXRhKQotCXsKLQkJaWYgKHJhd2RhdGFsZW4gIT0gc2l6ZW9mKEZTU3BlYykpCi0JCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU1NwZWMgcmF3ZGF0YSBpbmNvcnJlY3Qgc2l6ZSIpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCW1lbWNweSgmKChGU1NwZWNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoUHlNYWNfR2V0RlNTcGVjKHYsICYoKEZTU3BlY09iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmKSkgcmV0dXJuIDA7Ci0JcmV0dXJuIC0xOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxPcyMiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpCisgICAgcmV0dXJuIC0xOworICAgIGlmICh2ICYmIHJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghdiAmJiAhcmF3ZGF0YSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocmF3ZGF0YSkKKyAgICB7CisgICAgICAgIGlmIChyYXdkYXRhbGVuICE9IHNpemVvZihGU1NwZWMpKQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRlNTcGVjIHJhd2RhdGEgaW5jb3JyZWN0IHNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoJigoRlNTcGVjT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYsIHJhd2RhdGEsIHJhd2RhdGFsZW4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKFB5TWFjX0dldEZTU3BlYyh2LCAmKChGU1NwZWNPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBGU1NwZWNfdHBfYWxsb2MgUHlUeXBlX0dlbmVyaWNBbGxvYwogCiBzdGF0aWMgUHlPYmplY3QgKkZTU3BlY190cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQltZW1zZXQoJigoRlNTcGVjT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTU3BlYykpOwotCXJldHVybiBzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBtZW1zZXQoJigoRlNTcGVjT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTU3BlYykpOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIEZTU3BlY190cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgRlNTcGVjX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiQ2FyYm9uLkZpbGUuRlNTcGVjIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoRlNTcGVjT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgRlNTcGVjX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEZTU3BlY19jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgRlNTcGVjX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBGU1NwZWNfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRlNTcGVjX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUZTU3BlY19nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlGU1NwZWNfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUZTU3BlY190cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlGU1NwZWNfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlGU1NwZWNfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIkNhcmJvbi5GaWxlLkZTU3BlYyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEZTU3BlY09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEZTU3BlY19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBGU1NwZWNfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIEZTU3BlY19yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgRlNTcGVjX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEZTU3BlY19tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBGU1NwZWNfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgRlNTcGVjX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBGU1NwZWNfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgRlNTcGVjX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgRlNTcGVjX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KQEAgLTE1NDYsNDgzICsxNTQ2LDQ4MyBAQAogI2RlZmluZSBGU1JlZl9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZGU1JlZl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZGU1JlZl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRlNSZWZPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlGU1JlZiBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZTUmVmIG9iX2l0c2VsZjsKIH0gRlNSZWZPYmplY3Q7CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfTmV3KEZTUmVmICppdHNlbGYpCiB7Ci0JRlNSZWZPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhGU1JlZk9iamVjdCwgJkZTUmVmX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgRlNSZWZPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhGU1JlZk9iamVjdCwgJkZTUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gKml0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyB2b2lkIEZTUmVmX2RlYWxsb2MoRlNSZWZPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTTWFrZUZTUmVmVW5pY29kZShGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JVGV4dEVuY29kaW5nIHRleHRFbmNvZGluZ0hpbnQ7Ci0JRlNSZWYgbmV3UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RW5jb2RpbmdIaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNNYWtlRlNSZWZVbmljb2RlKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUxlbmd0aF9fbGVuX18sIG5hbWVMZW5ndGhfX2luX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RW5jb2RpbmdIaW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187CisgICAgaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIFRleHRFbmNvZGluZyB0ZXh0RW5jb2RpbmdIaW50OworICAgIEZTUmVmIG5ld1JlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nSGludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgX2VyciA9IEZTTWFrZUZTUmVmVW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nSGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTQ29tcGFyZUZTUmVmcyhGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiByZWYyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnJlZjIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNDb21wYXJlRlNSZWZzKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnJlZjIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIHJlZjI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmcmVmMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0NvbXBhcmVGU1JlZnMoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmMik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNDcmVhdGVGaWxlVW5pY29kZShGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVbmlDaGFyICpuYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBuYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm87Ci0JRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbzsKLQlGU1JlZiBuZXdSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187CisgICAgaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOworICAgIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87CisgICAgRlNSZWYgbmV3UmVmOwogI2lmbmRlZiBfX0xQNjRfXwotCUZTU3BlYyBuZXdTcGVjOworICAgIEZTU3BlYyBuZXdTcGVjOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX0NvbnZlcnQsICZjYXRhbG9nSW5mbykpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTQ3JlYXRlRmlsZVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUxlbmd0aF9fbGVuX18sIG5hbWVMZW5ndGhfX2luX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZUZpbGVVbmljb2RlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2F0YWxvZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZiwKICNpZm5kZWYgX19MUDY0X18KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYwotI2Vsc2UJLyogX19MUDY0X18gKi8KLQkJCQkgICBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NwZWMKKyNlbHNlICAgLyogX19MUDY0X18gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCiAjZW5kaWYgLyogX19MUDY0X18qLwotCQkJCSAgKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmbmV3U3BlYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmbmV3U3BlYyk7CiAjZWxzZSAvKiBfX0xQNjRfXyAqLwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8iLCBGU1JlZl9OZXcsICZuZXdSZWYsIFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8iLCBGU1JlZl9OZXcsICZuZXdSZWYsIFB5X05vbmUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCUZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOwotCUZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87Ci0JRlNSZWYgbmV3UmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbzsKKyAgICBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvOworICAgIEZTUmVmIG5ld1JlZjsKICNpZm5kZWYgX19MUDY0X18KLQlGU1NwZWMgbmV3U3BlYzsKKyAgICBGU1NwZWMgbmV3U3BlYzsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQlVSW50MzIgbmV3RGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX0NvbnZlcnQsICZjYXRhbG9nSW5mbykpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTQ3JlYXRlRGlyZWN0b3J5VW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZiwKKyAgICBVSW50MzIgbmV3RGlySUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX0NvbnZlcnQsICZjYXRhbG9nSW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgX2VyciA9IEZTQ3JlYXRlRGlyZWN0b3J5VW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1JlZiwKICNpZm5kZWYgX19MUDY0X18KLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NwZWMsCiAjZWxzZSAvKiAhX19MUDY0X18gKi8KLQkJCQkJTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3RGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3RGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiAKICNpZm5kZWYgX19MUDY0X18KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJm5ld1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmbmV3U3BlYywKLQkgICAgICAgICAgICAgICAgICAgICBuZXdEaXJJRCk7Ci0jZWxzZQkvKiBfX0xQNjRfXyAqLwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk9sIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwKLQkgICAgICAgICAgICAgICAgICAgICBuZXdEaXJJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJm5ld1NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGlySUQpOworI2Vsc2UgICAvKiBfX0xQNjRfXyAqLworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk9sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXdEaXJJRCk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0RlbGV0ZU9iamVjdChGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRGVsZXRlT2JqZWN0KCZfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTRGVsZXRlT2JqZWN0KCZfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU01vdmVPYmplY3QoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZGVzdERpcmVjdG9yeTsKLQlGU1JlZiBuZXdSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmZGVzdERpcmVjdG9yeSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU01vdmVPYmplY3QoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmZGVzdERpcmVjdG9yeSwKLQkgICAgICAgICAgICAgICAgICAgICZuZXdSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIGRlc3REaXJlY3Rvcnk7CisgICAgRlNSZWYgbmV3UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJmRlc3REaXJlY3RvcnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNNb3ZlT2JqZWN0KCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3REaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0V4Y2hhbmdlT2JqZWN0cyhGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBkZXN0UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJmRlc3RSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNFeGNoYW5nZU9iamVjdHMoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1JlZiBkZXN0UmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJmRlc3RSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNFeGNoYW5nZU9iamVjdHMoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU1JlbmFtZVVuaWNvZGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCVRleHRFbmNvZGluZyB0ZXh0RW5jb2RpbmdIaW50OwotCUZTUmVmIG5ld1JlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1I2wiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZUxlbmd0aF9faW5fXywgJm5hbWVMZW5ndGhfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEVuY29kaW5nSGludCkpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTUmVuYW1lVW5pY29kZSgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgdGV4dEVuY29kaW5nSGludCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZuZXdSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludDsKKyAgICBGU1JlZiBuZXdSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRFbmNvZGluZ0hpbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBuYW1lTGVuZ3RoX19sZW5fXyA9IG5hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU1JlbmFtZVVuaWNvZGUoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmNvZGluZ0hpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmbmV3UmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0dldENhdGFsb2dJbmZvKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOwotCUZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87Ci0JSEZTVW5pU3RyMjU1IG91dE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm87CisgICAgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbzsKKyAgICBIRlNVbmlTdHIyNTUgb3V0TmFtZTsKICNpZm5kZWYgX19MUDY0X18KLQlGU1NwZWMgZnNTcGVjOworICAgIEZTU3BlYyBmc1NwZWM7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JRlNSZWYgcGFyZW50UmVmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZjYXRhbG9nSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmFtZSwKKyAgICBGU1JlZiBwYXJlbnRSZWY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROYW1lLAogI2lmbmRlZiBfX0xQNjRfXwotCSAgICAgICAgICAgICAgICAgICAgICAgICZmc1NwZWMsCi0jZWxzZQkvKiBfX0xQNjRfXyAqLwotCQkJCU5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzU3BlYywKKyNlbHNlICAgLyogX19MUDY0X18gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudFJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50UmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCiAjaWZuZGVmIF9fTFA2NF9fCi0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX05ldywgJmNhdGFsb2dJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmb3V0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmZnNTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnBhcmVudFJlZik7Ci0jZWxzZQkvKiBfX0xQNjRfXyAqLwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mT08mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX05ldywgJmNhdGFsb2dJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmb3V0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnBhcmVudFJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX05ldywgJmNhdGFsb2dJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmb3V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmZnNTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnBhcmVudFJlZik7CisjZWxzZSAgIC8qIF9fTFA2NF9fICovCisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyZPTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTQ2F0YWxvZ0luZm9fTmV3LCAmY2F0YWxvZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRIRlNVbmlTdHIyNTUsICZvdXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmcGFyZW50UmVmKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTU2V0Q2F0YWxvZ0luZm8oRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm87Ci0JRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICBGU0NhdGFsb2dJbmZvX0NvbnZlcnQsICZjYXRhbG9nSW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU1NldENhdGFsb2dJbmZvKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmY2F0YWxvZ0luZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvOworICAgIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNDYXRhbG9nSW5mb19Db252ZXJ0LCAmY2F0YWxvZ0luZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNTZXRDYXRhbG9nSW5mbygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhdGFsb2dJbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU0NyZWF0ZUZvcmsoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU0NyZWF0ZUZvcmsoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgX2VyciA9IEZTQ3JlYXRlRm9yaygmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTRGVsZXRlRm9yayhGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOwotCWludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTRGVsZXRlRm9yaygmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187CisgICAgaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBfZXJyID0gRlNEZWxldGVGb3JrKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fLCBmb3JrTmFtZUxlbmd0aF9faW5fXyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRlNPcGVuRm9yayhGU1JlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOwotCWludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187Ci0JU0ludDggcGVybWlzc2lvbnM7Ci0JRlNJT1JlZk51bSBmb3JrUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCV9lcnIgPSBGU09wZW5Gb3JrKCZfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCi0JICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsCi0JICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIGZvcmtSZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187CisgICAgaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBTSW50OCBwZXJtaXNzaW9uczsKKyAgICBGU0lPUmVmTnVtIGZvcmtSZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAidSNiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgX2VyciA9IEZTT3BlbkZvcmsoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fLCBmb3JrTmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9ya1JlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRlNSZWZfRk5Ob3RpZnkoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRk5NZXNzYWdlIG1lc3NhZ2U7Ci0JT3B0aW9uQml0cyBmbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRk5Ob3RpZnkoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGTk1lc3NhZ2UgbWVzc2FnZTsKKyAgICBPcHRpb25CaXRzIGZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGTk5vdGlmeSgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTTmV3QWxpYXNNaW5pbWFsKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUFsaWFzSGFuZGxlIGluQWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU05ld0FsaWFzTWluaW1hbCgmX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmluQWxpYXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGluQWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEFsaWFzSGFuZGxlIGluQWxpYXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU05ld0FsaWFzTWluaW1hbCgmX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQWxpYXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGluQWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX0ZTSXNBbGlhc0ZpbGUoRlNSZWZPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQm9vbGVhbiBhbGlhc0ZpbGVGbGFnOwotCUJvb2xlYW4gZm9sZGVyRmxhZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTSXNBbGlhc0ZpbGUoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJmFsaWFzRmlsZUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgJmZvbGRlckZsYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBhbGlhc0ZpbGVGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgIGZvbGRlckZsYWcpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEJvb2xlYW4gYWxpYXNGaWxlRmxhZzsKKyAgICBCb29sZWFuIGZvbGRlckZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0lzQWxpYXNGaWxlKCZfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhc0ZpbGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICZmb2xkZXJGbGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNGaWxlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl9GU1JlZk1ha2VQYXRoKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlPU1N0YXR1cyBfZXJyOworICAgIE9TU3RhdHVzIF9lcnI7CiAjZGVmaW5lIE1BWFBBVEhOQU1FIDEwMjQKLQlVSW50OCBwYXRoW01BWFBBVEhOQU1FXTsKLQlVSW50MzIgbWF4UGF0aFNpemUgPSBNQVhQQVRITkFNRTsKKyAgICBVSW50OCBwYXRoW01BWFBBVEhOQU1FXTsKKyAgICBVSW50MzIgbWF4UGF0aFNpemUgPSBNQVhQQVRITkFNRTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTUmVmTWFrZVBhdGgoJl9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGF0aFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMiLCBwYXRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVmTWFrZVBhdGgoJl9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UGF0aFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMiLCBwYXRoKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX2FzX3BhdGhuYW1lKEZTUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9yZXMgPSBGU1JlZl9GU1JlZk1ha2VQYXRoKF9zZWxmLCBfYXJncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9yZXMgPSBGU1JlZl9GU1JlZk1ha2VQYXRoKF9zZWxmLCBfYXJncyk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZTUmVmX21ldGhvZHNbXSA9IHsKLQl7IkZTTWFrZUZTUmVmVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU01ha2VGU1JlZlVuaWNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCi0JeyJGU0NvbXBhcmVGU1JlZnMiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDb21wYXJlRlNSZWZzLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiByZWYyKSAtPiBOb25lIil9LAotCXsiRlNDcmVhdGVGaWxlVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZUZpbGVVbmljb2RlLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgbmFtZUxlbmd0aCwgRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8sIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8pIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKLQl7IkZTQ3JlYXRlRGlyZWN0b3J5VW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NyZWF0ZURpcmVjdG9yeVVuaWNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbywgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbykgLT4gKEZTUmVmIG5ld1JlZiwgRlNTcGVjIG5ld1NwZWMsIFVJbnQzMiBuZXdEaXJJRCkiKX0sCi0JeyJGU0RlbGV0ZU9iamVjdCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0RlbGV0ZU9iamVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRlNNb3ZlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTTW92ZU9iamVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgZGVzdERpcmVjdG9yeSkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCi0JeyJGU0V4Y2hhbmdlT2JqZWN0cyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0V4Y2hhbmdlT2JqZWN0cywgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgZGVzdFJlZikgLT4gTm9uZSIpfSwKLQl7IkZTUmVuYW1lVW5pY29kZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU1JlbmFtZVVuaWNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBUZXh0RW5jb2RpbmcgdGV4dEVuY29kaW5nSGludCkgLT4gKEZTUmVmIG5ld1JlZikiKX0sCi0JeyJGU0dldENhdGFsb2dJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTR2V0Q2F0YWxvZ0luZm8sIDEsCi0JIFB5RG9jX1NUUigiKEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvKSAtPiAoRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbywgSEZTVW5pU3RyMjU1IG91dE5hbWUsIEZTU3BlYyBmc1NwZWMsIEZTUmVmIHBhcmVudFJlZikiKX0sCi0JeyJGU1NldENhdGFsb2dJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTU2V0Q2F0YWxvZ0luZm8sIDEsCi0JIFB5RG9jX1NUUigiKEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvLCBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvKSAtPiBOb25lIil9LAotCXsiRlNDcmVhdGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ3JlYXRlRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiBOb25lIil9LAotCXsiRlNEZWxldGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTRGVsZXRlRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiBOb25lIil9LAotCXsiRlNPcGVuRm9yayIsIChQeUNGdW5jdGlvbilGU1JlZl9GU09wZW5Gb3JrLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgZm9ya05hbWVMZW5ndGgsIFNJbnQ4IHBlcm1pc3Npb25zKSAtPiAoU0ludDE2IGZvcmtSZWZOdW0pIil9LAotCXsiRk5Ob3RpZnkiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRk5Ob3RpZnksIDEsCi0JIFB5RG9jX1NUUigiKEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAotCXsiRlNOZXdBbGlhc01pbmltYWwiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNOZXdBbGlhc01pbmltYWwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFsaWFzSGFuZGxlIGluQWxpYXMpIil9LAotCXsiRlNJc0FsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0lzQWxpYXNGaWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIGFsaWFzRmlsZUZsYWcsIEJvb2xlYW4gZm9sZGVyRmxhZykiKX0sCi0JeyJGU1JlZk1ha2VQYXRoIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTUmVmTWFrZVBhdGgsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAotCXsiYXNfcGF0aG5hbWUiLCAoUHlDRnVuY3Rpb24pRlNSZWZfYXNfcGF0aG5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gc3RyaW5nIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiRlNNYWtlRlNSZWZVbmljb2RlIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTTWFrZUZTUmVmVW5pY29kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIG5hbWVMZW5ndGgsIFRleHRFbmNvZGluZyB0ZXh0RW5jb2RpbmdIaW50KSAtPiAoRlNSZWYgbmV3UmVmKSIpfSwKKyAgICB7IkZTQ29tcGFyZUZTUmVmcyIsIChQeUNGdW5jdGlvbilGU1JlZl9GU0NvbXBhcmVGU1JlZnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIHJlZjIpIC0+IE5vbmUiKX0sCisgICAgeyJGU0NyZWF0ZUZpbGVVbmljb2RlIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ3JlYXRlRmlsZVVuaWNvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBuYW1lTGVuZ3RoLCBGU0NhdGFsb2dJbmZvQml0bWFwIHdoaWNoSW5mbywgRlNDYXRhbG9nSW5mbyBjYXRhbG9nSW5mbykgLT4gKEZTUmVmIG5ld1JlZiwgRlNTcGVjIG5ld1NwZWMpIil9LAorICAgIHsiRlNDcmVhdGVEaXJlY3RvcnlVbmljb2RlIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTQ3JlYXRlRGlyZWN0b3J5VW5pY29kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIG5hbWVMZW5ndGgsIEZTQ2F0YWxvZ0luZm9CaXRtYXAgd2hpY2hJbmZvLCBGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYywgVUludDMyIG5ld0RpcklEKSIpfSwKKyAgICB7IkZTRGVsZXRlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTRGVsZXRlT2JqZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJGU01vdmVPYmplY3QiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNNb3ZlT2JqZWN0LCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBkZXN0RGlyZWN0b3J5KSAtPiAoRlNSZWYgbmV3UmVmKSIpfSwKKyAgICB7IkZTRXhjaGFuZ2VPYmplY3RzIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTRXhjaGFuZ2VPYmplY3RzLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBkZXN0UmVmKSAtPiBOb25lIil9LAorICAgIHsiRlNSZW5hbWVVbmljb2RlIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTUmVuYW1lVW5pY29kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIG5hbWVMZW5ndGgsIFRleHRFbmNvZGluZyB0ZXh0RW5jb2RpbmdIaW50KSAtPiAoRlNSZWYgbmV3UmVmKSIpfSwKKyAgICB7IkZTR2V0Q2F0YWxvZ0luZm8iLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNHZXRDYXRhbG9nSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8pIC0+IChGU0NhdGFsb2dJbmZvIGNhdGFsb2dJbmZvLCBIRlNVbmlTdHIyNTUgb3V0TmFtZSwgRlNTcGVjIGZzU3BlYywgRlNSZWYgcGFyZW50UmVmKSIpfSwKKyAgICB7IkZTU2V0Q2F0YWxvZ0luZm8iLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNTZXRDYXRhbG9nSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNDYXRhbG9nSW5mb0JpdG1hcCB3aGljaEluZm8sIEZTQ2F0YWxvZ0luZm8gY2F0YWxvZ0luZm8pIC0+IE5vbmUiKX0sCisgICAgeyJGU0NyZWF0ZUZvcmsiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNDcmVhdGVGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZm9ya05hbWVMZW5ndGgpIC0+IE5vbmUiKX0sCisgICAgeyJGU0RlbGV0ZUZvcmsiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNEZWxldGVGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihCdWZmZXIgZm9ya05hbWVMZW5ndGgpIC0+IE5vbmUiKX0sCisgICAgeyJGU09wZW5Gb3JrIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTT3BlbkZvcmssIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCwgU0ludDggcGVybWlzc2lvbnMpIC0+IChTSW50MTYgZm9ya1JlZk51bSkiKX0sCisgICAgeyJGTk5vdGlmeSIsIChQeUNGdW5jdGlvbilGU1JlZl9GTk5vdGlmeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRk5NZXNzYWdlIG1lc3NhZ2UsIE9wdGlvbkJpdHMgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJGU05ld0FsaWFzTWluaW1hbCIsIChQeUNGdW5jdGlvbilGU1JlZl9GU05ld0FsaWFzTWluaW1hbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQWxpYXNIYW5kbGUgaW5BbGlhcykiKX0sCisgICAgeyJGU0lzQWxpYXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUZTUmVmX0ZTSXNBbGlhc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gYWxpYXNGaWxlRmxhZywgQm9vbGVhbiBmb2xkZXJGbGFnKSIpfSwKKyAgICB7IkZTUmVmTWFrZVBhdGgiLCAoUHlDRnVuY3Rpb24pRlNSZWZfRlNSZWZNYWtlUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBzdHJpbmciKX0sCisgICAgeyJhc19wYXRobmFtZSIsIChQeUNGdW5jdGlvbilGU1JlZl9hc19wYXRobmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBzdHJpbmciKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkZTUmVmX2dldF9kYXRhKEZTUmVmT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihzZWxmLT5vYl9pdHNlbGYpKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7CiB9CiAKICNkZWZpbmUgRlNSZWZfc2V0X2RhdGEgTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgRlNSZWZfZ2V0c2V0bGlzdFtdID0gewotCXsiZGF0YSIsIChnZXR0ZXIpRlNSZWZfZ2V0X2RhdGEsIChzZXR0ZXIpRlNSZWZfc2V0X2RhdGEsICJSYXcgZGF0YSBvZiB0aGUgRlNSZWYgb2JqZWN0In0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGF0YSIsIChnZXR0ZXIpRlNSZWZfZ2V0X2RhdGEsIChzZXR0ZXIpRlNSZWZfc2V0X2RhdGEsICJSYXcgZGF0YSBvZiB0aGUgRlNSZWYgb2JqZWN0In0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0yMDMzLDkzICsyMDMzLDkzIEBACiAjZGVmaW5lIEZTUmVmX2hhc2ggTlVMTAogc3RhdGljIGludCBGU1JlZl90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKnYgPSBOVUxMOwotCWNoYXIgKnJhd2RhdGEgPSBOVUxMOwotCWludCByYXdkYXRhbGVuID0gMDsKLQlzdGF0aWMgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgInJhd2RhdGEiLCAwfTsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEw7CisgICAgY2hhciAqcmF3ZGF0YSA9IE5VTEw7CisgICAgaW50IHJhd2RhdGFsZW4gPSAwOworICAgIHN0YXRpYyBjaGFyICprd1tdID0geyJpdHNlbGYiLCAicmF3ZGF0YSIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifE9zIyIsIGt3LCAmdiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkKLQlyZXR1cm4gLTE7Ci0JaWYgKHYgJiYgcmF3ZGF0YSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPbmx5IG9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtYXkgYmUgc3BlY2lmaWVkIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKCF2ICYmICFyYXdkYXRhKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChyYXdkYXRhKQotCXsKLQkJaWYgKHJhd2RhdGFsZW4gIT0gc2l6ZW9mKEZTUmVmKSkKLQkJewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZTUmVmIHJhd2RhdGEgaW5jb3JyZWN0IHNpemUiKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQltZW1jcHkoJigoRlNSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoUHlNYWNfR2V0RlNSZWYodiwgJigoRlNSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOwotCXJldHVybiAtMTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJ8T3MjIiwga3csICZ2LCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKQorICAgIHJldHVybiAtMTsKKyAgICBpZiAodiAmJiByYXdkYXRhKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXYgJiYgIXJhd2RhdGEpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHJhd2RhdGEpCisgICAgeworICAgICAgICBpZiAocmF3ZGF0YWxlbiAhPSBzaXplb2YoRlNSZWYpKQorICAgICAgICB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRlNSZWYgcmF3ZGF0YSBpbmNvcnJlY3Qgc2l6ZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbWNweSgmKChGU1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmLCByYXdkYXRhLCByYXdkYXRhbGVuKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChQeU1hY19HZXRGU1JlZih2LCAmKChGU1JlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmKSkgcmV0dXJuIDA7CisgICAgcmV0dXJuIC0xOwogfQogCiAjZGVmaW5lIEZTUmVmX3RwX2FsbG9jIFB5VHlwZV9HZW5lcmljQWxsb2MKIAogc3RhdGljIFB5T2JqZWN0ICpGU1JlZl90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqc2VsZjsKIAotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQltZW1zZXQoJigoRlNSZWZPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLCAwLCBzaXplb2YoRlNSZWYpKTsKLQlyZXR1cm4gc2VsZjsKKyAgICBpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgbWVtc2V0KCYoKEZTUmVmT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKEZTUmVmKSk7CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKICNkZWZpbmUgRlNSZWZfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEZTUmVmX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiQ2FyYm9uLkZpbGUuRlNSZWYiLCAvKnRwX25hbWUqLwotCXNpemVvZihGU1JlZk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIEZTUmVmX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEZTUmVmX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBGU1JlZl9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgRlNSZWZfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JRlNSZWZfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JRlNSZWZfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JRlNSZWZfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUZTUmVmX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUZTUmVmX3RwX25ldywgLyogdHBfbmV3ICovCi0JRlNSZWZfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIkNhcmJvbi5GaWxlLkZTUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoRlNSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBGU1JlZl9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBGU1JlZl9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgRlNSZWZfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIEZTUmVmX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEZTUmVmX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEZTUmVmX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIEZTUmVmX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBGU1JlZl90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBGU1JlZl90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIEZTUmVmX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgRlNSZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjEyNywxMTIzICsyMTI3LDExMjMgQEAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9Vbm1vdW50Vm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjYzIHZvbE5hbWU7Ci0Jc2hvcnQgdlJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHZvbE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVubW91bnRWb2wodm9sTmFtZSwKLQkgICAgICAgICAgICAgICAgICB2UmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHI2MyB2b2xOYW1lOworICAgIHNob3J0IHZSZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVbm1vdW50Vm9sKHZvbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GbHVzaFZvbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHI2MyB2b2xOYW1lOwotCXNob3J0IHZSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB2b2xOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGbHVzaFZvbCh2b2xOYW1lLAotCSAgICAgICAgICAgICAgICB2UmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHI2MyB2b2xOYW1lOworICAgIHNob3J0IHZSZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGbHVzaFZvbCh2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgICB2UmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hTZXRWb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyNjMgdm9sTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIU2V0Vm9sKHZvbE5hbWUsCi0JICAgICAgICAgICAgICAgdlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU3RyNjMgdm9sTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdm9sTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIU2V0Vm9sKHZvbE5hbWUsCisgICAgICAgICAgICAgICAgICAgdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU0Nsb3NlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0Nsb3NlKHJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTQ2xvc2UocmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0FsbG9jYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlZk51bTsKLQlsb25nIGNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFsbG9jYXRlKHJlZk51bSwKLQkgICAgICAgICAgICAgICAgJmNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmTnVtOworICAgIGxvbmcgY291bnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWxsb2NhdGUocmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAmY291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0dldEVPRihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JbG9uZyBsb2dFT0Y7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RU9GKHJlZk51bSwKLQkgICAgICAgICAgICAgICZsb2dFT0YpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGxvZ0VPRik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmTnVtOworICAgIGxvbmcgbG9nRU9GOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEVPRihyZWZOdW0sCisgICAgICAgICAgICAgICAgICAmbG9nRU9GKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb2dFT0YpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfU2V0RU9GKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlZk51bTsKLQlsb25nIGxvZ0VPRjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2dFT0YpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RU9GKHJlZk51bSwKLQkgICAgICAgICAgICAgIGxvZ0VPRik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmTnVtOworICAgIGxvbmcgbG9nRU9GOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvZ0VPRikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRFT0YocmVmTnVtLAorICAgICAgICAgICAgICAgICAgbG9nRU9GKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0dldEZQb3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgZmlsZVBvczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGUG9zKHJlZk51bSwKLQkgICAgICAgICAgICAgICAmZmlsZVBvcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgZmlsZVBvcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVmTnVtOworICAgIGxvbmcgZmlsZVBvczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGUG9zKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAmZmlsZVBvcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBvcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9TZXRGUG9zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlZk51bTsKLQlzaG9ydCBwb3NNb2RlOwotCWxvbmcgcG9zT2ZmOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3NNb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zT2ZmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldEZQb3MocmVmTnVtLAotCSAgICAgICAgICAgICAgIHBvc01vZGUsCi0JICAgICAgICAgICAgICAgcG9zT2ZmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZWZOdW07CisgICAgc2hvcnQgcG9zTW9kZTsKKyAgICBsb25nIHBvc09mZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc09mZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRGUG9zKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBwb3NNb2RlLAorICAgICAgICAgICAgICAgICAgIHBvc09mZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9HZXRWUmVmTnVtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGZpbGVSZWZOdW07Ci0Jc2hvcnQgdlJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpbGVSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VlJlZk51bShmaWxlUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICZ2UmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBmaWxlUmVmTnVtOworICAgIHNob3J0IHZSZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFZSZWZOdW0oZmlsZVJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IR2V0Vm9sKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cmluZ1B0ciB2b2xOYW1lOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgJnZvbE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSEdldFZvbCh2b2xOYW1lLAotCSAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICZkaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgZGlySUQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cmluZ1B0ciB2b2xOYW1lOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgJnZvbE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSEdldFZvbCh2b2xOYW1lLAorICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICZkaXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlySUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSE9wZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlTSW50OCBwZXJtaXNzaW9uOwotCXNob3J0IHJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhPcGVuKHZSZWZOdW0sCi0JICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgJnJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIFNJbnQ4IHBlcm1pc3Npb247CisgICAgc2hvcnQgcmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE9wZW4odlJlZk51bSwKKyAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSE9wZW5ERihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOwotCVNJbnQ4IHBlcm1pc3Npb247Ci0Jc2hvcnQgcmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE9wZW5ERih2UmVmTnVtLAotCSAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCi0JICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIFNJbnQ4IHBlcm1pc3Npb247CisgICAgc2hvcnQgcmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE9wZW5ERih2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24sCisgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hPcGVuUkYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlTSW50OCBwZXJtaXNzaW9uOwotCXNob3J0IHJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhPcGVuUkYodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICZyZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOworICAgIHNob3J0IHJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhPcGVuUkYodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9BbGxvY0NvbnRpZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZWZOdW07Ci0JbG9uZyBjb3VudDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBbGxvY0NvbnRpZyhyZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICZjb3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIGNvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFsbG9jQ29udGlnKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IQ3JlYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSENyZWF0ZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgZmlsZVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSENyZWF0ZSh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRGlyQ3JlYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBwYXJlbnREaXJJRDsKLQlTdHIyNTUgZGlyZWN0b3J5TmFtZTsKLQlsb25nIGNyZWF0ZWREaXJJRDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnREaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkaXJlY3RvcnlOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpckNyZWF0ZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgcGFyZW50RGlySUQsCi0JICAgICAgICAgICAgICAgICBkaXJlY3RvcnlOYW1lLAotCSAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZERpcklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgcGFyZW50RGlySUQ7CisgICAgU3RyMjU1IGRpcmVjdG9yeU5hbWU7CisgICAgbG9uZyBjcmVhdGVkRGlySUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50RGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZGlyZWN0b3J5TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEaXJDcmVhdGUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudERpcklELAorICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlySUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWREaXJJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IRGVsZXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSERlbGV0ZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhEZWxldGUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IR2V0RkluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlGSW5mbyBmbmRySW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIR2V0RkluZm8odlJlZk51bSwKLQkgICAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAmZm5kckluZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBGSW5mb19OZXcsICZmbmRySW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBGSW5mbyBmbmRySW5mbzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIR2V0RkluZm8odlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAmZm5kckluZm8pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSW5mb19OZXcsICZmbmRySW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IU2V0RkluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlGSW5mbyBmbmRySW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBGSW5mb19Db252ZXJ0LCAmZm5kckluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSFNldEZJbmZvKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgJmZuZHJJbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIEZJbmZvIGZuZHJJbmZvOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJbmZvX0NvbnZlcnQsICZmbmRySW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIU2V0RkluZm8odlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAmZm5kckluZm8pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfSFNldEZMb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSFNldEZMb2NrKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhTZXRGTG9jayh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9IUnN0RkxvY2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIUnN0RkxvY2sodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgZmlsZU5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSFJzdEZMb2NrKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0hSZW5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBvbGROYW1lOwotCVN0cjI1NSBuZXdOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgb2xkTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuZXdOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhSZW5hbWUodlJlZk51bSwKLQkgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICBvbGROYW1lLAotCSAgICAgICAgICAgICAgIG5ld05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgbG9uZyBkaXJJRDsKKyAgICBTdHIyNTUgb2xkTmFtZTsKKyAgICBTdHIyNTUgbmV3TmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG9sZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmV3TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIUmVuYW1lKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgb2xkTmFtZSwKKyAgICAgICAgICAgICAgICAgICBuZXdOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0NhdE1vdmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBvbGROYW1lOwotCWxvbmcgbmV3RGlySUQ7Ci0JU3RyMjU1IG5ld05hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgb2xkTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld0RpcklELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5ld05hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2F0TW92ZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgIG9sZE5hbWUsCi0JICAgICAgICAgICAgICAgbmV3RGlySUQsCi0JICAgICAgICAgICAgICAgbmV3TmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBvbGROYW1lOworICAgIGxvbmcgbmV3RGlySUQ7CisgICAgU3RyMjU1IG5ld05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgb2xkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0RpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5ld05hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2F0TW92ZSh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgIG9sZE5hbWUsCisgICAgICAgICAgICAgICAgICAgbmV3RGlySUQsCisgICAgICAgICAgICAgICAgICAgbmV3TmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU01ha2VGU1NwZWMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgdlJlZk51bTsKLQlsb25nIGRpcklEOwotCVN0cjI1NSBmaWxlTmFtZTsKLQlGU1NwZWMgc3BlYzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU01ha2VGU1NwZWModlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgIGRpcklELAotCSAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAmc3BlYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZzcGVjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOworICAgIEZTU3BlYyBzcGVjOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGZpbGVOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTTWFrZUZTU3BlYyh2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzcGVjKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX05ldywgJnNwZWMpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNHZXRGb3JrUG9zaXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JU0ludDY0IHBvc2l0aW9uOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0dldEZvcmtQb3NpdGlvbihmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkwiLAotCSAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgZm9ya1JlZk51bTsKKyAgICBTSW50NjQgcG9zaXRpb247CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTR2V0Rm9ya1Bvc2l0aW9uKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNTZXRGb3JrUG9zaXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JVUludDE2IHBvc2l0aW9uTW9kZTsKLQlTSW50NjQgcG9zaXRpb25PZmZzZXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhMIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU1NldEZvcmtQb3NpdGlvbihmb3JrUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgZm9ya1JlZk51bTsKKyAgICBVSW50MTYgcG9zaXRpb25Nb2RlOworICAgIFNJbnQ2NCBwb3NpdGlvbk9mZnNldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoSEwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTU2V0Rm9ya1Bvc2l0aW9uKGZvcmtSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25PZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNHZXRGb3JrU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgZm9ya1JlZk51bTsKLQlTSW50NjQgZm9ya1NpemU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTR2V0Rm9ya1NpemUoZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAmZm9ya1NpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkwiLAotCSAgICAgICAgICAgICAgICAgICAgIGZvcmtTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgZm9ya1JlZk51bTsKKyAgICBTSW50NjQgZm9ya1NpemU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTR2V0Rm9ya1NpemUoZm9ya1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1NpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTU2V0Rm9ya1NpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JVUludDE2IHBvc2l0aW9uTW9kZTsKLQlTSW50NjQgcG9zaXRpb25PZmZzZXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhMIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3NpdGlvbk9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU1NldEZvcmtTaXplKGZvcmtSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uT2Zmc2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgZm9ya1JlZk51bTsKKyAgICBVSW50MTYgcG9zaXRpb25Nb2RlOworICAgIFNJbnQ2NCBwb3NpdGlvbk9mZnNldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoSEwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvc2l0aW9uT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTU2V0Rm9ya1NpemUoZm9ya1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25PZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNBbGxvY2F0ZUZvcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JRlNBbGxvY2F0aW9uRmxhZ3MgZmxhZ3M7Ci0JVUludDE2IHBvc2l0aW9uTW9kZTsKLQlTSW50NjQgcG9zaXRpb25PZmZzZXQ7Ci0JVUludDY0IHJlcXVlc3RDb3VudDsKLQlVSW50NjQgYWN0dWFsQ291bnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhITEwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25Nb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0Q291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNBbGxvY2F0ZUZvcmsoZm9ya1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbENvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKLQkgICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgRlNBbGxvY2F0aW9uRmxhZ3MgZmxhZ3M7CisgICAgVUludDE2IHBvc2l0aW9uTW9kZTsKKyAgICBTSW50NjQgcG9zaXRpb25PZmZzZXQ7CisgICAgVUludDY0IHJlcXVlc3RDb3VudDsKKyAgICBVSW50NjQgYWN0dWFsQ291bnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEhITEwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb25PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0Q291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNBbGxvY2F0ZUZvcmsoZm9ya1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbENvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU0ZsdXNoRm9yayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgZm9ya1JlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNGbHVzaEZvcmsoZm9ya1JlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGZvcmtSZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTRmx1c2hGb3JrKGZvcmtSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNDbG9zZUZvcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGZvcmtSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb3JrUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTQ2xvc2VGb3JrKGZvcmtSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBmb3JrUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ya1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0Nsb3NlRm9yayhmb3JrUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTR2V0RGF0YUZvcmtOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhGU1VuaVN0cjI1NSBkYXRhRm9ya05hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU0dldERhdGFGb3JrTmFtZSgmZGF0YUZvcmtOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRIRlNVbmlTdHIyNTUsICZkYXRhRm9ya05hbWUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhGU1VuaVN0cjI1NSBkYXRhRm9ya05hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU0dldERhdGFGb3JrTmFtZSgmZGF0YUZvcmtOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRIRlNVbmlTdHIyNTUsICZkYXRhRm9ya05hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNHZXRSZXNvdXJjZUZvcmtOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhGU1VuaVN0cjI1NSByZXNvdXJjZUZvcmtOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNHZXRSZXNvdXJjZUZvcmtOYW1lKCZyZXNvdXJjZUZvcmtOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRIRlNVbmlTdHIyNTUsICZyZXNvdXJjZUZvcmtOYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIRlNVbmlTdHIyNTUgcmVzb3VyY2VGb3JrTmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgmcmVzb3VyY2VGb3JrTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1LCAmcmVzb3VyY2VGb3JrTmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU1BhdGhNYWtlUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQ4ICogcGF0aDsKLQlGU1JlZiByZWY7Ci0JQm9vbGVhbiBpc0RpcmVjdG9yeTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNQYXRoTWFrZVJlZihwYXRoLAotCSAgICAgICAgICAgICAgICAgICAgICZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgJmlzRGlyZWN0b3J5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBpc0RpcmVjdG9yeSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDggKiBwYXRoOworICAgIEZTUmVmIHJlZjsKKyAgICBCb29sZWFuIGlzRGlyZWN0b3J5OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU1BhdGhNYWtlUmVmKHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaXNEaXJlY3RvcnkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGlyZWN0b3J5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZOTm90aWZ5QnlQYXRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQ4ICogcGF0aDsKLQlGTk1lc3NhZ2UgbWVzc2FnZTsKLQlPcHRpb25CaXRzIGZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZOTm90aWZ5QnlQYXRoKHBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50OCAqIHBhdGg7CisgICAgRk5NZXNzYWdlIG1lc3NhZ2U7CisgICAgT3B0aW9uQml0cyBmbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGTk5vdGlmeUJ5UGF0aChwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GTk5vdGlmeUFsbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGTk1lc3NhZ2UgbWVzc2FnZTsKLQlPcHRpb25CaXRzIGZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGTk5vdGlmeUFsbChtZXNzYWdlLAotCSAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRk5NZXNzYWdlIG1lc3NhZ2U7CisgICAgT3B0aW9uQml0cyBmbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRk5Ob3RpZnlBbGwobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfTmV3QWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgdGFyZ2V0OwotCUFsaWFzSGFuZGxlIGFsaWFzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRhcmdldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBOZXdBbGlhcyhmcm9tRmlsZSwKLQkgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgJmFsaWFzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBhbGlhcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1NwZWMgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKKyAgICBGU1NwZWMgdGFyZ2V0OworICAgIEFsaWFzSGFuZGxlIGFsaWFzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRhcmdldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdBbGlhcyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgJmFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBhbGlhcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9OZXdBbGlhc01pbmltYWxGcm9tRnVsbFBhdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JY2hhciAqZnVsbFBhdGhfX2luX187Ci0JaW50IGZ1bGxQYXRoX19sZW5fXzsKLQlpbnQgZnVsbFBhdGhfX2luX2xlbl9fOwotCVN0cjMyIHpvbmVOYW1lOwotCVN0cjMxIHNlcnZlck5hbWU7Ci0JQWxpYXNIYW5kbGUgYWxpYXM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxQYXRoX19pbl9fLCAmZnVsbFBhdGhfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHpvbmVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNlcnZlck5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlmdWxsUGF0aF9fbGVuX18gPSBmdWxsUGF0aF9faW5fbGVuX187Ci0JX2VyciA9IE5ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aChmdWxsUGF0aF9fbGVuX18sIGZ1bGxQYXRoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9uZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBhbGlhcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgY2hhciAqZnVsbFBhdGhfX2luX187CisgICAgaW50IGZ1bGxQYXRoX19sZW5fXzsKKyAgICBpbnQgZnVsbFBhdGhfX2luX2xlbl9fOworICAgIFN0cjMyIHpvbmVOYW1lOworICAgIFN0cjMxIHNlcnZlck5hbWU7CisgICAgQWxpYXNIYW5kbGUgYWxpYXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxQYXRoX19pbl9fLCAmZnVsbFBhdGhfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHpvbmVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNlcnZlck5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmdWxsUGF0aF9fbGVuX18gPSBmdWxsUGF0aF9faW5fbGVuX187CisgICAgX2VyciA9IE5ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aChmdWxsUGF0aF9fbGVuX18sIGZ1bGxQYXRoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9uZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfTmV3LCBhbGlhcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9SZXNvbHZlQWxpYXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyB0aGVTcGVjOwotCUJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOwotCUJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7Ci0JQm9vbGVhbiB3YXNBbGlhc2VkOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZXNvbHZlQWxpYXNGaWxlKCZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyB0aGVTcGVjOworICAgIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOworICAgIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7CisgICAgQm9vbGVhbiB3YXNBbGlhc2VkOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXNvbHZlQWxpYXNGaWxlKCZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyB0aGVTcGVjOwotCUJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOwotCUJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7Ci0JQm9vbGVhbiB3YXNBbGlhc2VkOwotCXVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW91bnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MoJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50RmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0aGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyB0aGVTcGVjOworICAgIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOworICAgIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7CisgICAgQm9vbGVhbiB3YXNBbGlhc2VkOworICAgIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW91bnRGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MoJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50RmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfVXBkYXRlQWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKLQlGU1NwZWMgdGFyZ2V0OwotCUFsaWFzSGFuZGxlIGFsaWFzOwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTU3BlY1B0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAgICAgQWxpYXNfQ29udmVydCwgJmFsaWFzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZUFsaWFzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAotCSAgICAgICAgICAgICAgICAgICBhbGlhcywKLQkgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNTcGVjIHRhcmdldDsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1NwZWNQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjX0NvbnZlcnQsICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX0NvbnZlcnQsICZhbGlhcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVBbGlhcyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHRoZVNwZWM7Ci0JQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnM7Ci0JQm9vbGVhbiB0YXJnZXRJc0ZvbGRlcjsKLQlCb29sZWFuIHdhc0FsaWFzZWQ7Ci0JdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfQ29udmVydCwgJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3VudEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUkoJnRoZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1NwZWNfTmV3LCAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlU3BlYzsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19Db252ZXJ0LCAmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzTm9VSSgmdGhlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50RmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlY19OZXcsICZ0aGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNOZXdBbGlhcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgKmZyb21GaWxlID0gJmZyb21GaWxlX19idWZfXzsKLQlGU1JlZiB0YXJnZXQ7Ci0JQWxpYXNIYW5kbGUgaW5BbGlhczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTTmV3QWxpYXMoZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgJnRhcmdldCwKLQkgICAgICAgICAgICAgICAgICAmaW5BbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFsaWFzX05ldywgaW5BbGlhcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187CisgICAgRlNSZWYgdGFyZ2V0OworICAgIEFsaWFzSGFuZGxlIGluQWxpYXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIsICZmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRhcmdldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGU05ld0FsaWFzKGZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgJmluQWxpYXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc19OZXcsIGluQWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgdGhlUmVmOwotCUJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOwotCUJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7Ci0JQm9vbGVhbiB3YXNBbGlhc2VkOwotCXVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRoZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MoJnRoZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgd2FzQWxpYXNlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgdGhlUmVmOworICAgIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOworICAgIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7CisgICAgQm9vbGVhbiB3YXNBbGlhc2VkOworICAgIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWZfQ29udmVydCwgJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVBbGlhc0NoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MoJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNBbGlhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9OZXcsICZ0aGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0SXNGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQWxpYXNlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRmlsZV9GU1Jlc29sdmVBbGlhc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgdGhlUmVmOwotCUJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zOwotCUJvb2xlYW4gdGFyZ2V0SXNGb2xkZXI7Ci0JQm9vbGVhbiB3YXNBbGlhc2VkOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlQWxpYXNDaGFpbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRlNSZXNvbHZlQWxpYXNGaWxlKCZ0aGVSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlQWxpYXNDaGFpbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0SXNGb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQWxpYXNlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgRlNSZWZfTmV3LCAmdGhlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIHRhcmdldElzRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0FsaWFzZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIHRoZVJlZjsKKyAgICBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWluczsKKyAgICBCb29sZWFuIHRhcmdldElzRm9sZGVyOworICAgIEJvb2xlYW4gd2FzQWxpYXNlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGhlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZUFsaWFzQ2hhaW5zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTUmVzb2x2ZUFsaWFzRmlsZSgmdGhlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUFsaWFzQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldElzRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0FsaWFzZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX05ldywgJnRoZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRJc0ZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNBbGlhc2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX0ZTVXBkYXRlQWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNSZWYgZnJvbUZpbGVfX2J1Zl9fOwotCUZTUmVmICpmcm9tRmlsZSA9ICZmcm9tRmlsZV9fYnVmX187Ci0JRlNSZWYgdGFyZ2V0OwotCUFsaWFzSGFuZGxlIGFsaWFzOwotCUJvb2xlYW4gd2FzQ2hhbmdlZDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBteVB5TWFjX0dldE9wdEZTUmVmUHRyLCAmZnJvbUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIEZTUmVmX0NvbnZlcnQsICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIEFsaWFzX0NvbnZlcnQsICZhbGlhcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGU1VwZGF0ZUFsaWFzKGZyb21GaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQsCi0JICAgICAgICAgICAgICAgICAgICAgYWxpYXMsCi0JICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIHdhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTUmVmIGZyb21GaWxlX19idWZfXzsKKyAgICBGU1JlZiAqZnJvbUZpbGUgPSAmZnJvbUZpbGVfX2J1Zl9fOworICAgIEZTUmVmIHRhcmdldDsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBCb29sZWFuIHdhc0NoYW5nZWQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXlQeU1hY19HZXRPcHRGU1JlZlB0ciwgJmZyb21GaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGU1JlZl9Db252ZXJ0LCAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc19Db252ZXJ0LCAmYWxpYXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNVcGRhdGVBbGlhcyhmcm9tRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGaWxlX3BhdGhuYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlQeU9iamVjdCAqb2JqOworICAgIFB5T2JqZWN0ICpvYmo7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPIiwgJm9iaikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkgewotCSAgICAgICAgUHlfSU5DUkVGKG9iaik7Ci0JICAgICAgICByZXR1cm4gb2JqOwotCX0KLQlpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpCi0JICAgICAgICByZXR1cm4gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhvYmosICJ1dGY4IiwgInN0cmljdCIpOwotCV9yZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgImFzX3BhdGhuYW1lIiwgTlVMTCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyIsICZvYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkgeworICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhvYmosICJ1dGY4IiwgInN0cmljdCIpOworICAgIF9yZXMgPSBQeU9iamVjdF9DYWxsTWV0aG9kKG9iaiwgImFzX3BhdGhuYW1lIiwgTlVMTCk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZpbGVfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiVW5tb3VudFZvbCIsIChQeUNGdW5jdGlvbilGaWxlX1VubW91bnRWb2wsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjYzIHZvbE5hbWUsIHNob3J0IHZSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJGbHVzaFZvbCIsIChQeUNGdW5jdGlvbilGaWxlX0ZsdXNoVm9sLCAxLAotCSBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtKSAtPiBOb25lIil9LAotCXsiSFNldFZvbCIsIChQeUNGdW5jdGlvbilGaWxlX0hTZXRWb2wsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjYzIHZvbE5hbWUsIHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIC0+IE5vbmUiKX0sCi0JeyJGU0Nsb3NlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNDbG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAotCXsiQWxsb2NhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9BbGxvY2F0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBjb3VudCkiKX0sCi0JeyJHZXRFT0YiLCAoUHlDRnVuY3Rpb24pRmlsZV9HZXRFT0YsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgbG9nRU9GKSIpfSwKLQl7IlNldEVPRiIsIChQeUNGdW5jdGlvbilGaWxlX1NldEVPRiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtLCBsb25nIGxvZ0VPRikgLT4gTm9uZSIpfSwKLQl7IkdldEZQb3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9HZXRGUG9zLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGZpbGVQb3MpIil9LAotCXsiU2V0RlBvcyIsIChQeUNGdW5jdGlvbilGaWxlX1NldEZQb3MsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgc2hvcnQgcG9zTW9kZSwgbG9uZyBwb3NPZmYpIC0+IE5vbmUiKX0sCi0JeyJHZXRWUmVmTnVtIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0VlJlZk51bSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmlsZVJlZk51bSkgLT4gKHNob3J0IHZSZWZOdW0pIil9LAotCXsiSEdldFZvbCIsIChQeUNGdW5jdGlvbilGaWxlX0hHZXRWb2wsIDEsCi0JIFB5RG9jX1NUUigiKFN0cmluZ1B0ciB2b2xOYW1lKSAtPiAoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCkiKX0sCi0JeyJIT3BlbiIsIChQeUNGdW5jdGlvbilGaWxlX0hPcGVuLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAotCXsiSE9wZW5ERiIsIChQeUNGdW5jdGlvbilGaWxlX0hPcGVuREYsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCi0JeyJIT3BlblJGIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSE9wZW5SRiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKLQl7IkFsbG9jQ29udGlnIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQWxsb2NDb250aWcsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgY291bnQpIil9LAotCXsiSENyZWF0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0hDcmVhdGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkRpckNyZWF0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0RpckNyZWF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBwYXJlbnREaXJJRCwgU3RyMjU1IGRpcmVjdG9yeU5hbWUpIC0+IChsb25nIGNyZWF0ZWREaXJJRCkiKX0sCi0JeyJIRGVsZXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSERlbGV0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiBOb25lIil9LAotCXsiSEdldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSEdldEZJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IChGSW5mbyBmbmRySW5mbykiKX0sCi0JeyJIU2V0RkluZm8iLCAoUHlDRnVuY3Rpb24pRmlsZV9IU2V0RkluZm8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgRkluZm8gZm5kckluZm8pIC0+IE5vbmUiKX0sCi0JeyJIU2V0RkxvY2siLCAoUHlDRnVuY3Rpb24pRmlsZV9IU2V0RkxvY2ssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IkhSc3RGTG9jayIsIChQeUNGdW5jdGlvbilGaWxlX0hSc3RGTG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiBOb25lIil9LAotCXsiSFJlbmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX0hSZW5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBvbGROYW1lLCBTdHIyNTUgbmV3TmFtZSkgLT4gTm9uZSIpfSwKLQl7IkNhdE1vdmUiLCAoUHlDRnVuY3Rpb24pRmlsZV9DYXRNb3ZlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgb2xkTmFtZSwgbG9uZyBuZXdEaXJJRCwgU3RyMjU1IG5ld05hbWUpIC0+IE5vbmUiKX0sCi0JeyJGU01ha2VGU1NwZWMiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU01ha2VGU1NwZWMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gKEZTU3BlYyBzcGVjKSIpfSwKKyAgICB7IlVubW91bnRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9Vbm1vdW50Vm9sLCAxLAorICAgICBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiRmx1c2hWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9GbHVzaFZvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyNjMgdm9sTmFtZSwgc2hvcnQgdlJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkhTZXRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9IU2V0Vm9sLCAxLAorICAgICBQeURvY19TVFIoIihTdHI2MyB2b2xOYW1lLCBzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklEKSAtPiBOb25lIil9LAorICAgIHsiRlNDbG9zZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQ2xvc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkFsbG9jYXRlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQWxsb2NhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSkgLT4gKGxvbmcgY291bnQpIil9LAorICAgIHsiR2V0RU9GIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0RU9GLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGxvZ0VPRikiKX0sCisgICAgeyJTZXRFT0YiLCAoUHlDRnVuY3Rpb24pRmlsZV9TZXRFT0YsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgbG9uZyBsb2dFT0YpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRGUG9zIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfR2V0RlBvcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAobG9uZyBmaWxlUG9zKSIpfSwKKyAgICB7IlNldEZQb3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9TZXRGUG9zLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIHNob3J0IHBvc01vZGUsIGxvbmcgcG9zT2ZmKSAtPiBOb25lIil9LAorICAgIHsiR2V0VlJlZk51bSIsIChQeUNGdW5jdGlvbilGaWxlX0dldFZSZWZOdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGZpbGVSZWZOdW0pIC0+IChzaG9ydCB2UmVmTnVtKSIpfSwKKyAgICB7IkhHZXRWb2wiLCAoUHlDRnVuY3Rpb24pRmlsZV9IR2V0Vm9sLCAxLAorICAgICBQeURvY19TVFIoIihTdHJpbmdQdHIgdm9sTmFtZSkgLT4gKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIil9LAorICAgIHsiSE9wZW4iLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lLCBTSW50OCBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgcmVmTnVtKSIpfSwKKyAgICB7IkhPcGVuREYiLCAoUHlDRnVuY3Rpb24pRmlsZV9IT3BlbkRGLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZWZOdW0pIil9LAorICAgIHsiSE9wZW5SRiIsIChQeUNGdW5jdGlvbilGaWxlX0hPcGVuUkYsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlZk51bSkiKX0sCisgICAgeyJBbGxvY0NvbnRpZyIsIChQeUNGdW5jdGlvbilGaWxlX0FsbG9jQ29udGlnLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChsb25nIGNvdW50KSIpfSwKKyAgICB7IkhDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IQ3JlYXRlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJEaXJDcmVhdGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9EaXJDcmVhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgcGFyZW50RGlySUQsIFN0cjI1NSBkaXJlY3RvcnlOYW1lKSAtPiAobG9uZyBjcmVhdGVkRGlySUQpIil9LAorICAgIHsiSERlbGV0ZSIsIChQeUNGdW5jdGlvbilGaWxlX0hEZWxldGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkhHZXRGSW5mbyIsIChQeUNGdW5jdGlvbilGaWxlX0hHZXRGSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiAoRkluZm8gZm5kckluZm8pIil9LAorICAgIHsiSFNldEZJbmZvIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldEZJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIEZJbmZvIGZuZHJJbmZvKSAtPiBOb25lIil9LAorICAgIHsiSFNldEZMb2NrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfSFNldEZMb2NrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJIUnN0RkxvY2siLCAoUHlDRnVuY3Rpb24pRmlsZV9IUnN0RkxvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkhSZW5hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9IUmVuYW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgb2xkTmFtZSwgU3RyMjU1IG5ld05hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJDYXRNb3ZlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfQ2F0TW92ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IG9sZE5hbWUsIGxvbmcgbmV3RGlySUQsIFN0cjI1NSBuZXdOYW1lKSAtPiBOb25lIil9LAorICAgIHsiRlNNYWtlRlNTcGVjIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNNYWtlRlNTcGVjLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUpIC0+IChGU1NwZWMgc3BlYykiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fKi8KLQl7IkZTR2V0Rm9ya1Bvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRGb3JrUG9zaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiAoU0ludDY0IHBvc2l0aW9uKSIpfSwKLQl7IkZTU2V0Rm9ya1Bvc2l0aW9uIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNTZXRGb3JrUG9zaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQpIC0+IE5vbmUiKX0sCi0JeyJGU0dldEZvcmtTaXplIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNHZXRGb3JrU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IChTSW50NjQgZm9ya1NpemUpIil9LAotCXsiRlNTZXRGb3JrU2l6ZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTU2V0Rm9ya1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBVSW50MTYgcG9zaXRpb25Nb2RlLCBTSW50NjQgcG9zaXRpb25PZmZzZXQpIC0+IE5vbmUiKX0sCi0JeyJGU0FsbG9jYXRlRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTQWxsb2NhdGVGb3JrLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSwgRlNBbGxvY2F0aW9uRmxhZ3MgZmxhZ3MsIFVJbnQxNiBwb3NpdGlvbk1vZGUsIFNJbnQ2NCBwb3NpdGlvbk9mZnNldCwgVUludDY0IHJlcXVlc3RDb3VudCkgLT4gKFVJbnQ2NCBhY3R1YWxDb3VudCkiKX0sCi0JeyJGU0ZsdXNoRm9yayIsIChQeUNGdW5jdGlvbilGaWxlX0ZTRmx1c2hGb3JrLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gTm9uZSIpfSwKLQl7IkZTQ2xvc2VGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNDbG9zZUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiBOb25lIil9LAotCXsiRlNHZXREYXRhRm9ya05hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldERhdGFGb3JrTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSEZTVW5pU3RyMjU1IGRhdGFGb3JrTmFtZSkiKX0sCi0JeyJGU0dldFJlc291cmNlRm9ya05hbWUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldFJlc291cmNlRm9ya05hbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhGU1VuaVN0cjI1NSByZXNvdXJjZUZvcmtOYW1lKSIpfSwKLQl7IkZTUGF0aE1ha2VSZWYiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1BhdGhNYWtlUmVmLCAxLAotCSBQeURvY19TVFIoIihVSW50OCAqIHBhdGgpIC0+IChGU1JlZiByZWYsIEJvb2xlYW4gaXNEaXJlY3RvcnkpIil9LAotCXsiRk5Ob3RpZnlCeVBhdGgiLCAoUHlDRnVuY3Rpb24pRmlsZV9GTk5vdGlmeUJ5UGF0aCwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDggKiBwYXRoLCBGTk1lc3NhZ2UgbWVzc2FnZSwgT3B0aW9uQml0cyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkZOTm90aWZ5QWxsIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRk5Ob3RpZnlBbGwsIDEsCi0JIFB5RG9jX1NUUigiKEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiRlNHZXRGb3JrUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldEZvcmtQb3NpdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IChTSW50NjQgcG9zaXRpb24pIil9LAorICAgIHsiRlNTZXRGb3JrUG9zaXRpb24iLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1NldEZvcmtQb3NpdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0sIFVJbnQxNiBwb3NpdGlvbk1vZGUsIFNJbnQ2NCBwb3NpdGlvbk9mZnNldCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTR2V0Rm9ya1NpemUiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0dldEZvcmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgZm9ya1JlZk51bSkgLT4gKFNJbnQ2NCBmb3JrU2l6ZSkiKX0sCisgICAgeyJGU1NldEZvcmtTaXplIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNTZXRGb3JrU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0sIFVJbnQxNiBwb3NpdGlvbk1vZGUsIFNJbnQ2NCBwb3NpdGlvbk9mZnNldCkgLT4gTm9uZSIpfSwKKyAgICB7IkZTQWxsb2NhdGVGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNBbGxvY2F0ZUZvcmssIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtLCBGU0FsbG9jYXRpb25GbGFncyBmbGFncywgVUludDE2IHBvc2l0aW9uTW9kZSwgU0ludDY0IHBvc2l0aW9uT2Zmc2V0LCBVSW50NjQgcmVxdWVzdENvdW50KSAtPiAoVUludDY0IGFjdHVhbENvdW50KSIpfSwKKyAgICB7IkZTRmx1c2hGb3JrIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNGbHVzaEZvcmssIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBmb3JrUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiRlNDbG9zZUZvcmsiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU0Nsb3NlRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGZvcmtSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJGU0dldERhdGFGb3JrTmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTR2V0RGF0YUZvcmtOYW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIRlNVbmlTdHIyNTUgZGF0YUZvcmtOYW1lKSIpfSwKKyAgICB7IkZTR2V0UmVzb3VyY2VGb3JrTmFtZSIsIChQeUNGdW5jdGlvbilGaWxlX0ZTR2V0UmVzb3VyY2VGb3JrTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSEZTVW5pU3RyMjU1IHJlc291cmNlRm9ya05hbWUpIil9LAorICAgIHsiRlNQYXRoTWFrZVJlZiIsIChQeUNGdW5jdGlvbilGaWxlX0ZTUGF0aE1ha2VSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQ4ICogcGF0aCkgLT4gKEZTUmVmIHJlZiwgQm9vbGVhbiBpc0RpcmVjdG9yeSkiKX0sCisgICAgeyJGTk5vdGlmeUJ5UGF0aCIsIChQeUNGdW5jdGlvbilGaWxlX0ZOTm90aWZ5QnlQYXRoLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCAqIHBhdGgsIEZOTWVzc2FnZSBtZXNzYWdlLCBPcHRpb25CaXRzIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiRk5Ob3RpZnlBbGwiLCAoUHlDRnVuY3Rpb24pRmlsZV9GTk5vdGlmeUFsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRk5NZXNzYWdlIG1lc3NhZ2UsIE9wdGlvbkJpdHMgZmxhZ3MpIC0+IE5vbmUiKX0sCiAjaWZuZGVmICBfX0xQNjRfXwotCXsiTmV3QWxpYXMiLCAoUHlDRnVuY3Rpb24pRmlsZV9OZXdBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlLCBGU1NwZWMgdGFyZ2V0KSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAotCXsiTmV3QWxpYXNNaW5pbWFsRnJvbUZ1bGxQYXRoIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfTmV3QWxpYXNNaW5pbWFsRnJvbUZ1bGxQYXRoLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgZnVsbFBhdGgsIFN0cjMyIHpvbmVOYW1lLCBTdHIzMSBzZXJ2ZXJOYW1lKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAotCXsiUmVzb2x2ZUFsaWFzRmlsZSIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucykgLT4gKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAotCXsiUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMsIHVuc2lnbmVkIGxvbmcgbW91bnRGbGFncykgLT4gKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAotCXsiVXBkYXRlQWxpYXMiLCAoUHlDRnVuY3Rpb24pRmlsZV9VcGRhdGVBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZyb21GaWxlLCBGU1NwZWMgdGFyZ2V0LCBBbGlhc0hhbmRsZSBhbGlhcykgLT4gKEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCi0JeyJSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3NOb1VJIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzTm9VSSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zLCB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3MpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7Ik5ld0FsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfTmV3QWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgRlNTcGVjIHRhcmdldCkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKKyAgICB7Ik5ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aCIsIChQeUNGdW5jdGlvbilGaWxlX05ld0FsaWFzTWluaW1hbEZyb21GdWxsUGF0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGZ1bGxQYXRoLCBTdHIzMiB6b25lTmFtZSwgU3RyMzEgc2VydmVyTmFtZSkgLT4gKEFsaWFzSGFuZGxlIGFsaWFzKSIpfSwKKyAgICB7IlJlc29sdmVBbGlhc0ZpbGUiLCAoUHlDRnVuY3Rpb24pRmlsZV9SZXNvbHZlQWxpYXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiByZXNvbHZlQWxpYXNDaGFpbnMpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7IlJlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncyIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zLCB1bnNpZ25lZCBsb25nIG1vdW50RmxhZ3MpIC0+IChGU1NwZWMgdGhlU3BlYywgQm9vbGVhbiB0YXJnZXRJc0ZvbGRlciwgQm9vbGVhbiB3YXNBbGlhc2VkKSIpfSwKKyAgICB7IlVwZGF0ZUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfVXBkYXRlQWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmcm9tRmlsZSwgRlNTcGVjIHRhcmdldCwgQWxpYXNIYW5kbGUgYWxpYXMpIC0+IChCb29sZWFuIHdhc0NoYW5nZWQpIil9LAorICAgIHsiUmVzb2x2ZUFsaWFzRmlsZVdpdGhNb3VudEZsYWdzTm9VSSIsIChQeUNGdW5jdGlvbilGaWxlX1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFnc05vVUksIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVTcGVjLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNTcGVjIHRoZVNwZWMsIEJvb2xlYW4gdGFyZ2V0SXNGb2xkZXIsIEJvb2xlYW4gd2FzQWxpYXNlZCkiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JeyJGU05ld0FsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNOZXdBbGlhcywgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgZnJvbUZpbGUsIEZTUmVmIHRhcmdldCkgLT4gKEFsaWFzSGFuZGxlIGluQWxpYXMpIil9LAotCXsiRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAotCXsiRlNSZXNvbHZlQWxpYXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiB0aGVSZWYsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zKSAtPiAoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAotCXsiRlNVcGRhdGVBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTVXBkYXRlQWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQsIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7InBhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfcGF0aG5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKHN0cnx1bmljb2RlfEZTU3BlY3xGU3JlZikgLT4gcGF0aG5hbWUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJGU05ld0FsaWFzIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNOZXdBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgZnJvbUZpbGUsIEZTUmVmIHRhcmdldCkgLT4gKEFsaWFzSGFuZGxlIGluQWxpYXMpIil9LAorICAgIHsiRlNSZXNvbHZlQWxpYXNGaWxlV2l0aE1vdW50RmxhZ3MiLCAoUHlDRnVuY3Rpb24pRmlsZV9GU1Jlc29sdmVBbGlhc0ZpbGVXaXRoTW91bnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHJlc29sdmVBbGlhc0NoYWlucywgdW5zaWduZWQgbG9uZyBtb3VudEZsYWdzKSAtPiAoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAorICAgIHsiRlNSZXNvbHZlQWxpYXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfRlNSZXNvbHZlQWxpYXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiB0aGVSZWYsIEJvb2xlYW4gcmVzb2x2ZUFsaWFzQ2hhaW5zKSAtPiAoRlNSZWYgdGhlUmVmLCBCb29sZWFuIHRhcmdldElzRm9sZGVyLCBCb29sZWFuIHdhc0FsaWFzZWQpIil9LAorICAgIHsiRlNVcGRhdGVBbGlhcyIsIChQeUNGdW5jdGlvbilGaWxlX0ZTVXBkYXRlQWxpYXMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGZyb21GaWxlLCBGU1JlZiB0YXJnZXQsIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKKyAgICB7InBhdGhuYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbGVfcGF0aG5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKHN0cnx1bmljb2RlfEZTU3BlY3xGU3JlZikgLT4gcGF0aG5hbWUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTMyNTEsMTU5ICszMjUxLDE1OSBAQAogaW50CiBQeU1hY19HZXRGU1NwZWMoUHlPYmplY3QgKnYsIEZTU3BlYyAqc3BlYykKIHsKLSAgICAgICAgU3RyMjU1IHBhdGg7Ci0gICAgICAgIHNob3J0IHJlZm51bTsKLSAgICAgICAgbG9uZyBwYXJpZDsKLSAgICAgICAgT1NFcnIgZXJyOwotICAgICAgICBGU1JlZiBmc3I7CisgICAgU3RyMjU1IHBhdGg7CisgICAgc2hvcnQgcmVmbnVtOworICAgIGxvbmcgcGFyaWQ7CisgICAgT1NFcnIgZXJyOworICAgIEZTUmVmIGZzcjsKIAotICAgICAgICBpZiAoRlNTcGVjX0NoZWNrKHYpKSB7Ci0gICAgICAgICAgICAgICAgKnNwZWMgPSAoKEZTU3BlY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KKyAgICBpZiAoRlNTcGVjX0NoZWNrKHYpKSB7CisgICAgICAgICpzcGVjID0gKChGU1NwZWNPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLSAgICAgICAgaWYgKFB5QXJnX1BhcnNlKHYsICIoaGxPJikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZm51bSwgJnBhcmlkLCBQeU1hY19HZXRTdHIyNTUsICZwYXRoKSkgewotICAgICAgICAgICAgICAgIGVyciA9IEZTTWFrZUZTU3BlYyhyZWZudW0sIHBhcmlkLCBwYXRoLCBzcGVjKTsKLSAgICAgICAgICAgICAgICBpZiAoIGVyciAmJiBlcnIgIT0gZm5mRXJyICkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoUHlBcmdfUGFyc2UodiwgIihobE8mKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZudW0sICZwYXJpZCwgUHlNYWNfR2V0U3RyMjU1LCAmcGF0aCkpIHsKKyAgICAgICAgZXJyID0gRlNNYWtlRlNTcGVjKHJlZm51bSwgcGFyaWQsIHBhdGgsIHNwZWMpOworICAgICAgICBpZiAoIGVyciAmJiBlcnIgIT0gZm5mRXJyICkgeworICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIC8qIE90aGVyd2lzZSB3ZSB0cnkgdG8gZ28gdmlhIGFuIEZTUmVmLiBPbiBPU1ggd2UgZ28gYWxsIHRoZSB3YXksCi0gICAgICAgICoqIG9uIE9TOSB3ZSBhY2NlcHQgb25seSBhIHJlYWwgRlNSZWYgb2JqZWN0Ci0gICAgICAgICovCi0gICAgICAgIGlmICggUHlNYWNfR2V0RlNSZWYodiwgJmZzcikgKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmZnNyLCBrRlNDYXRJbmZvTm9uZSwgTlVMTCwgTlVMTCwgc3BlYywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciAhPSBub0VycikgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgLyogT3RoZXJ3aXNlIHdlIHRyeSB0byBnbyB2aWEgYW4gRlNSZWYuIE9uIE9TWCB3ZSBnbyBhbGwgdGhlIHdheSwKKyAgICAqKiBvbiBPUzkgd2UgYWNjZXB0IG9ubHkgYSByZWFsIEZTUmVmIG9iamVjdAorICAgICovCisgICAgaWYgKCBQeU1hY19HZXRGU1JlZih2LCAmZnNyKSApIHsKKyAgICAgICAgZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmZnNyLCBrRlNDYXRJbmZvTm9uZSwgTlVMTCwgTlVMTCwgc3BlYywgTlVMTCk7CisgICAgICAgIGlmIChlcnIgIT0gbm9FcnIpIHsKKyAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBpbnQKIFB5TWFjX0dldEZTUmVmKFB5T2JqZWN0ICp2LCBGU1JlZiAqZnNyKQogewotICAgICAgICBPU1N0YXR1cyBlcnI7CisgICAgT1NTdGF0dXMgZXJyOwogI2lmbmRlZiBfX0xQNjRfXwotICAgICAgICBGU1NwZWMgZnNzOworICAgIEZTU3BlYyBmc3M7CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKLSAgICAgICAgaWYgKEZTUmVmX0NoZWNrKHYpKSB7Ci0gICAgICAgICAgICAgICAgKmZzciA9ICgoRlNSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9CisgICAgaWYgKEZTUmVmX0NoZWNrKHYpKSB7CisgICAgICAgICpmc3IgPSAoKEZTUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogCi0gICAgICAgIC8qIE9uIE9TWCB3ZSBub3cgdHJ5IGEgcGF0aG5hbWUgKi8KLSAgICAgICAgaWYgKCBQeVN0cmluZ19DaGVjayh2KSB8fCBQeVVuaWNvZGVfQ2hlY2sodikpIHsKLSAgICAgICAgICAgICAgICBjaGFyICpwYXRoID0gTlVMTDsKLSAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJldCIsIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcsICZwYXRoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGlmICggKGVycj1GU1BhdGhNYWtlUmVmKCh1bnNpZ25lZCBjaGFyKilwYXRoLCBmc3IsIE5VTEwpKSApCi0gICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUocGF0aCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFlcnI7Ci0gICAgICAgIH0KLSAgICAgICAgLyogWFhYWCBTaG91bGQgdHJ5IHVuaWNvZGUgaGVyZSB0b28gKi8KKyAgICAvKiBPbiBPU1ggd2Ugbm93IHRyeSBhIHBhdGhuYW1lICovCisgICAgaWYgKCBQeVN0cmluZ19DaGVjayh2KSB8fCBQeVVuaWNvZGVfQ2hlY2sodikpIHsKKyAgICAgICAgY2hhciAqcGF0aCA9IE5VTEw7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UodiwgImV0IiwgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZywgJnBhdGgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggKGVycj1GU1BhdGhNYWtlUmVmKCh1bnNpZ25lZCBjaGFyKilwYXRoLCBmc3IsIE5VTEwpKSApCisgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICBQeU1lbV9GcmVlKHBhdGgpOworICAgICAgICByZXR1cm4gIWVycjsKKyAgICB9CisgICAgLyogWFhYWCBTaG91bGQgdHJ5IHVuaWNvZGUgaGVyZSB0b28gKi8KIAogI2lmbmRlZiBfX0xQNjRfXwotICAgICAgICAvKiBPdGhlcndpc2Ugd2UgdHJ5IHRvIGdvIHZpYSBhbiBGU1NwZWMgKi8KLSAgICAgICAgaWYgKEZTU3BlY19DaGVjayh2KSkgewotICAgICAgICAgICAgICAgIGZzcyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgICAgICAgICBpZiAoKGVycj1GU3BNYWtlRlNSZWYoJmZzcywgZnNyKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRlNSZWYsIEZTU3BlYyBvciBwYXRobmFtZSByZXF1aXJlZCIpOworICAgIC8qIE90aGVyd2lzZSB3ZSB0cnkgdG8gZ28gdmlhIGFuIEZTU3BlYyAqLworICAgIGlmIChGU1NwZWNfQ2hlY2sodikpIHsKKyAgICAgICAgZnNzID0gKChGU1NwZWNPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICBpZiAoKGVycj1GU3BNYWtlRlNSZWYoJmZzcywgZnNyKSkgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBQeU1hY19FcnJvcihlcnIpOwogICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRlNSZWYsIEZTU3BlYyBvciBwYXRobmFtZSByZXF1aXJlZCIpOworICAgIHJldHVybiAwOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBleHRlcm4gUHlPYmplY3QgKgogUHlNYWNfQnVpbGRGU1NwZWMoRlNTcGVjICpzcGVjKQogewotICAgICAgICByZXR1cm4gRlNTcGVjX05ldyhzcGVjKTsKKyAgICByZXR1cm4gRlNTcGVjX05ldyhzcGVjKTsKIH0KICNlbmRpZiAvKiAhX19MUDY0X18gKi8KIAogZXh0ZXJuIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkRlNSZWYoRlNSZWYgKnNwZWMpCiB7Ci0gICAgICAgIHJldHVybiBGU1JlZl9OZXcoc3BlYyk7CisgICAgcmV0dXJuIEZTUmVmX05ldyhzcGVjKTsKIH0KIAogCiB2b2lkIGluaXRfRmlsZSh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKICNpZm5kZWYgX19MUDY0X18KLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhGU1NwZWMgKiwgUHlNYWNfQnVpbGRGU1NwZWMpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChGU1NwZWMsIFB5TWFjX0dldEZTU3BlYyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRlNTcGVjICosIFB5TWFjX0J1aWxkRlNTcGVjKTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRlNTcGVjLCBQeU1hY19HZXRGU1NwZWMpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRlNSZWYgKiwgUHlNYWNfQnVpbGRGU1JlZik7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEZTUmVmLCBQeU1hY19HZXRGU1JlZik7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRlNSZWYgKiwgUHlNYWNfQnVpbGRGU1JlZik7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEZTUmVmLCBQeU1hY19HZXRGU1JlZik7CiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfRmlsZSIsIEZpbGVfbWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRmlsZV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEZpbGVfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBGaWxlX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JRlNDYXRhbG9nSW5mb19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRlNDYXRhbG9nSW5mb19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkZTQ2F0YWxvZ0luZm9fVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU0NhdGFsb2dJbmZvIiwgKFB5T2JqZWN0ICopJkZTQ2F0YWxvZ0luZm9fVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZGU0NhdGFsb2dJbmZvX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNDYXRhbG9nSW5mb1R5cGUiLCAoUHlPYmplY3QgKikmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0ZpbGUiLCBGaWxlX21ldGhvZHMpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEZpbGVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChGaWxlX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRmlsZV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIEZTQ2F0YWxvZ0luZm9fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkZTQ2F0YWxvZ0luZm9fVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZGU0NhdGFsb2dJbmZvX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNDYXRhbG9nSW5mbyIsIChQeU9iamVjdCAqKSZGU0NhdGFsb2dJbmZvX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmRlNDYXRhbG9nSW5mb19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTQ2F0YWxvZ0luZm9UeXBlIiwgKFB5T2JqZWN0ICopJkZTQ2F0YWxvZ0luZm9fVHlwZSk7CiAKICNpZm5kZWYgX19MUDY0X18KLQlGSW5mb19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRkluZm9fVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZGSW5mb19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZJbmZvIiwgKFB5T2JqZWN0ICopJkZJbmZvX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRkluZm9fVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGSW5mb1R5cGUiLCAoUHlPYmplY3QgKikmRkluZm9fVHlwZSk7CisgICAgRkluZm9fVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkZJbmZvX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRkluZm9fVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGSW5mbyIsIChQeU9iamVjdCAqKSZGSW5mb19UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkZJbmZvX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRkluZm9UeXBlIiwgKFB5T2JqZWN0ICopJkZJbmZvX1R5cGUpOwogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCUFsaWFzX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZBbGlhc19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkFsaWFzX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQWxpYXMiLCAoUHlPYmplY3QgKikmQWxpYXNfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZBbGlhc19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFsaWFzVHlwZSIsIChQeU9iamVjdCAqKSZBbGlhc19UeXBlKTsKKyAgICBBbGlhc19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmQWxpYXNfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZBbGlhc19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkFsaWFzIiwgKFB5T2JqZWN0ICopJkFsaWFzX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmQWxpYXNfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJBbGlhc1R5cGUiLCAoUHlPYmplY3QgKikmQWxpYXNfVHlwZSk7CiAKICNpZm5kZWYgX19MUDY0X18KLQlGU1NwZWNfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkZTU3BlY19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJkZTU3BlY19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTU3BlYyIsIChQeU9iamVjdCAqKSZGU1NwZWNfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZGU1NwZWNfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1NwZWNUeXBlIiwgKFB5T2JqZWN0ICopJkZTU3BlY19UeXBlKTsKKyAgICBGU1NwZWNfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkZTU3BlY19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkZTU3BlY19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTU3BlYyIsIChQeU9iamVjdCAqKSZGU1NwZWNfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZGU1NwZWNfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1NwZWNUeXBlIiwgKFB5T2JqZWN0ICopJkZTU3BlY19UeXBlKTsKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQlGU1JlZl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmRlNSZWZfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZGU1JlZl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZTUmVmIiwgKFB5T2JqZWN0ICopJkZTUmVmX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmRlNSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1JlZlR5cGUiLCAoUHlPYmplY3QgKikmRlNSZWZfVHlwZSk7CisgICAgRlNSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkZTUmVmX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmRlNSZWZfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJGU1JlZiIsIChQeU9iamVjdCAqKSZGU1JlZl9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkZTUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlNSZWZUeXBlIiwgKFB5T2JqZWN0ICopJkZTUmVmX1R5cGUpOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfRmlsZSA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ZtL19GbW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZm0vX0ZtbW9kdWxlLmMKaW5kZXggYjk4MmNjMy4uYWRjNDdhYSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm0vX0ZtbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvZm0vX0ZtbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTI2LDEyICsyNiwxMiBAQAogRk1SZWNfTmV3KEZNZXRyaWNSZWMgKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mTyZPJiIsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT5hc2NlbnQsCi0gICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT5kZXNjZW50LAotICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+bGVhZGluZywKLSAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPndpZE1heCwKLSAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpdHNlbGYtPndUYWJIYW5kbGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJk8mIiwKKyAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT5hc2NlbnQsCisgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+ZGVzY2VudCwKKyAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT5sZWFkaW5nLAorICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPndpZE1heCwKKyAgICAgICAgUmVzT2JqX05ldywgaXRzZWxmLT53VGFiSGFuZGxlKTsKIH0KIAogI2lmIDAKQEAgLTM5LDEyICszOSwxMiBAQAogc3RhdGljIGludAogRk1SZWNfQ29udmVydChQeU9iamVjdCAqdiwgRk1ldHJpY1JlYyAqcF9pdHNlbGYpCiB7Ci0gICAgICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJPJk8mTyZPJk8mIiwKLSAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+YXNjZW50LAotICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5kZXNjZW50LAotICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5sZWFkaW5nLAotICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT53aWRNYXgsCi0gICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdHNlbGYtPndUYWJIYW5kbGUpOworICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJPJk8mTyZPJk8mIiwKKyAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmFzY2VudCwKKyAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5sZWFkaW5nLAorICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+d2lkTWF4LAorICAgICAgICBSZXNPYmpfQ29udmVydCwgJml0c2VsZi0+d1RhYkhhbmRsZSk7CiB9CiAjZW5kaWYKIApAQCAtNTMsMzE0ICs1MywzMTQgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpGbV9HZXRGb250TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgZmFtaWx5SUQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGZhbWlseUlEOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBHZXRGb250TmFtZQotCVB5TWFjX1BSRUNIRUNLKEdldEZvbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGb250TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZhbWlseUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Rm9udE5hbWUoZmFtaWx5SUQsCi0JICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmYW1pbHlJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEZvbnROYW1lKGZhbWlseUlELAorICAgICAgICAgICAgICAgIG5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0dldEZOdW0oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBuYW1lOwotCXNob3J0IGZhbWlseUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBzaG9ydCBmYW1pbHlJRDsKICNpZm5kZWYgR2V0Rk51bQotCVB5TWFjX1BSRUNIRUNLKEdldEZOdW0pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZOdW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRGTnVtKG5hbWUsCi0JICAgICAgICAmZmFtaWx5SUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBmYW1pbHlJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGTnVtKG5hbWUsCisgICAgICAgICZmYW1pbHlJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9SZWFsRm9udChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0Jc2hvcnQgZm9udE51bTsKLQlzaG9ydCBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBzaG9ydCBmb250TnVtOworICAgIHNob3J0IHNpemU7CiAjaWZuZGVmIFJlYWxGb250Ci0JUHlNYWNfUFJFQ0hFQ0soUmVhbEZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlYWxGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbnROdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVhbEZvbnQoZm9udE51bSwKLQkgICAgICAgICAgICAgICBzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlYWxGb250KGZvbnROdW0sCisgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fU2V0RlNjYWxlRGlzYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBmc2NhbGVEaXNhYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGZzY2FsZURpc2FibGU7CiAjaWZuZGVmIFNldEZTY2FsZURpc2FibGUKLQlQeU1hY19QUkVDSEVDSyhTZXRGU2NhbGVEaXNhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRGU2NhbGVEaXNhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnNjYWxlRGlzYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldEZTY2FsZURpc2FibGUoZnNjYWxlRGlzYWJsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNjYWxlRGlzYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEZTY2FsZURpc2FibGUoZnNjYWxlRGlzYWJsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX0ZvbnRNZXRyaWNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGTWV0cmljUmVjIHRoZU1ldHJpY3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZNZXRyaWNSZWMgdGhlTWV0cmljczsKICNpZm5kZWYgRm9udE1ldHJpY3MKLQlQeU1hY19QUkVDSEVDSyhGb250TWV0cmljcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRm9udE1ldHJpY3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUZvbnRNZXRyaWNzKCZ0aGVNZXRyaWNzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEZNUmVjX05ldywgJnRoZU1ldHJpY3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGb250TWV0cmljcygmdGhlTWV0cmljcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGTVJlY19OZXcsICZ0aGVNZXRyaWNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9TZXRGcmFjdEVuYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBmcmFjdEVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmcmFjdEVuYWJsZTsKICNpZm5kZWYgU2V0RnJhY3RFbmFibGUKLQlQeU1hY19QUkVDSEVDSyhTZXRGcmFjdEVuYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RnJhY3RFbmFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcmFjdEVuYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldEZyYWN0RW5hYmxlKGZyYWN0RW5hYmxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFjdEVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEZyYWN0RW5hYmxlKGZyYWN0RW5hYmxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0RGVmRm9udFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXREZWZGb250U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldERlZkZvbnRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXREZWZGb250U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGVmRm9udFNpemUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGVmRm9udFNpemUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9Jc091dGxpbmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IG51bWVyOwotCVBvaW50IGRlbm9tOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBudW1lcjsKKyAgICBQb2ludCBkZW5vbTsKICNpZm5kZWYgSXNPdXRsaW5lCi0JUHlNYWNfUFJFQ0hFQ0soSXNPdXRsaW5lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc091dGxpbmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbnVtZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmZGVub20pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc091dGxpbmUobnVtZXIsCi0JICAgICAgICAgICAgICAgIGRlbm9tKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZudW1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkZW5vbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzT3V0bGluZShudW1lciwKKyAgICAgICAgICAgICAgICAgICAgZGVub20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX1NldE91dGxpbmVQcmVmZXJyZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gb3V0bGluZVByZWZlcnJlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBvdXRsaW5lUHJlZmVycmVkOwogI2lmbmRlZiBTZXRPdXRsaW5lUHJlZmVycmVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0T3V0bGluZVByZWZlcnJlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0T3V0bGluZVByZWZlcnJlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm91dGxpbmVQcmVmZXJyZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRPdXRsaW5lUHJlZmVycmVkKG91dGxpbmVQcmVmZXJyZWQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGxpbmVQcmVmZXJyZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRPdXRsaW5lUHJlZmVycmVkKG91dGxpbmVQcmVmZXJyZWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9HZXRPdXRsaW5lUHJlZmVycmVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldE91dGxpbmVQcmVmZXJyZWQKLQlQeU1hY19QUkVDSEVDSyhHZXRPdXRsaW5lUHJlZmVycmVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRPdXRsaW5lUHJlZmVycmVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRPdXRsaW5lUHJlZmVycmVkKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE91dGxpbmVQcmVmZXJyZWQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9TZXRQcmVzZXJ2ZUdseXBoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIHByZXNlcnZlR2x5cGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gcHJlc2VydmVHbHlwaDsKICNpZm5kZWYgU2V0UHJlc2VydmVHbHlwaAotCVB5TWFjX1BSRUNIRUNLKFNldFByZXNlcnZlR2x5cGgpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFByZXNlcnZlR2x5cGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVzZXJ2ZUdseXBoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UHJlc2VydmVHbHlwaChwcmVzZXJ2ZUdseXBoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVzZXJ2ZUdseXBoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UHJlc2VydmVHbHlwaChwcmVzZXJ2ZUdseXBoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0UHJlc2VydmVHbHlwaChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRQcmVzZXJ2ZUdseXBoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UHJlc2VydmVHbHlwaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UHJlc2VydmVHbHlwaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UHJlc2VydmVHbHlwaCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQcmVzZXJ2ZUdseXBoKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm1fR2V0U3lzRm9udChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFN5c0ZvbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRTeXNGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRTeXNGb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRTeXNGb250KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFN5c0ZvbnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGbV9HZXRBcHBGb250KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0QXBwRm9udAotCVB5TWFjX1BSRUNIRUNLKEdldEFwcEZvbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEFwcEZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEFwcEZvbnQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0QXBwRm9udCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkZtX1FEVGV4dEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqaW5UZXh0X19pbl9fOwotCWludCBpblRleHRfX2xlbl9fOwotCWludCBpblRleHRfX2luX2xlbl9fOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICppblRleHRfX2luX187CisgICAgaW50IGluVGV4dF9fbGVuX187CisgICAgaW50IGluVGV4dF9faW5fbGVuX187CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFFEVGV4dEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFFEVGV4dEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURUZXh0Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluVGV4dF9faW5fXywgJmluVGV4dF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpblRleHRfX2xlbl9fID0gaW5UZXh0X19pbl9sZW5fXzsKLQlRRFRleHRCb3VuZHMoaW5UZXh0X19sZW5fXywgaW5UZXh0X19pbl9fLAotCSAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UZXh0X19pbl9fLCAmaW5UZXh0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGluVGV4dF9fbGVuX18gPSBpblRleHRfX2luX2xlbl9fOworICAgIFFEVGV4dEJvdW5kcyhpblRleHRfX2xlbl9fLCBpblRleHRfX2luX18sCisgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZtX21ldGhvZHNbXSA9IHsKLQl7IkdldEZvbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEZvbnROYW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBmYW1pbHlJRCkgLT4gKFN0cjI1NSBuYW1lKSIpfSwKLQl7IkdldEZOdW0iLCAoUHlDRnVuY3Rpb24pRm1fR2V0Rk51bSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IG5hbWUpIC0+IChzaG9ydCBmYW1pbHlJRCkiKX0sCi0JeyJSZWFsRm9udCIsIChQeUNGdW5jdGlvbilGbV9SZWFsRm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZm9udE51bSwgc2hvcnQgc2l6ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldEZTY2FsZURpc2FibGUiLCAoUHlDRnVuY3Rpb24pRm1fU2V0RlNjYWxlRGlzYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBmc2NhbGVEaXNhYmxlKSAtPiBOb25lIil9LAotCXsiRm9udE1ldHJpY3MiLCAoUHlDRnVuY3Rpb24pRm1fRm9udE1ldHJpY3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZNZXRyaWNSZWMgdGhlTWV0cmljcykiKX0sCi0JeyJTZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilGbV9TZXRGcmFjdEVuYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBmcmFjdEVuYWJsZSkgLT4gTm9uZSIpfSwKLQl7IkdldERlZkZvbnRTaXplIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldERlZkZvbnRTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiSXNPdXRsaW5lIiwgKFB5Q0Z1bmN0aW9uKUZtX0lzT3V0bGluZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgbnVtZXIsIFBvaW50IGRlbm9tKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0T3V0bGluZVByZWZlcnJlZCIsIChQeUNGdW5jdGlvbilGbV9TZXRPdXRsaW5lUHJlZmVycmVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIG91dGxpbmVQcmVmZXJyZWQpIC0+IE5vbmUiKX0sCi0JeyJHZXRPdXRsaW5lUHJlZmVycmVkIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldE91dGxpbmVQcmVmZXJyZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldFByZXNlcnZlR2x5cGgiLCAoUHlDRnVuY3Rpb24pRm1fU2V0UHJlc2VydmVHbHlwaCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBwcmVzZXJ2ZUdseXBoKSAtPiBOb25lIil9LAotCXsiR2V0UHJlc2VydmVHbHlwaCIsIChQeUNGdW5jdGlvbilGbV9HZXRQcmVzZXJ2ZUdseXBoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRTeXNGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX0dldFN5c0ZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRBcHBGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX0dldEFwcEZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJRRFRleHRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pRm1fUURUZXh0Qm91bmRzLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgaW5UZXh0KSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0Rm9udE5hbWUiLCAoUHlDRnVuY3Rpb24pRm1fR2V0Rm9udE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGZhbWlseUlEKSAtPiAoU3RyMjU1IG5hbWUpIil9LAorICAgIHsiR2V0Rk51bSIsIChQeUNGdW5jdGlvbilGbV9HZXRGTnVtLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgbmFtZSkgLT4gKHNob3J0IGZhbWlseUlEKSIpfSwKKyAgICB7IlJlYWxGb250IiwgKFB5Q0Z1bmN0aW9uKUZtX1JlYWxGb250LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmb250TnVtLCBzaG9ydCBzaXplKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0RlNjYWxlRGlzYWJsZSIsIChQeUNGdW5jdGlvbilGbV9TZXRGU2NhbGVEaXNhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGZzY2FsZURpc2FibGUpIC0+IE5vbmUiKX0sCisgICAgeyJGb250TWV0cmljcyIsIChQeUNGdW5jdGlvbilGbV9Gb250TWV0cmljcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRk1ldHJpY1JlYyB0aGVNZXRyaWNzKSIpfSwKKyAgICB7IlNldEZyYWN0RW5hYmxlIiwgKFB5Q0Z1bmN0aW9uKUZtX1NldEZyYWN0RW5hYmxlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGZyYWN0RW5hYmxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGVmRm9udFNpemUiLCAoUHlDRnVuY3Rpb24pRm1fR2V0RGVmRm9udFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJJc091dGxpbmUiLCAoUHlDRnVuY3Rpb24pRm1fSXNPdXRsaW5lLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBudW1lciwgUG9pbnQgZGVub20pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRPdXRsaW5lUHJlZmVycmVkIiwgKFB5Q0Z1bmN0aW9uKUZtX1NldE91dGxpbmVQcmVmZXJyZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gb3V0bGluZVByZWZlcnJlZCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE91dGxpbmVQcmVmZXJyZWQiLCAoUHlDRnVuY3Rpb24pRm1fR2V0T3V0bGluZVByZWZlcnJlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0UHJlc2VydmVHbHlwaCIsIChQeUNGdW5jdGlvbilGbV9TZXRQcmVzZXJ2ZUdseXBoLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHByZXNlcnZlR2x5cGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRQcmVzZXJ2ZUdseXBoIiwgKFB5Q0Z1bmN0aW9uKUZtX0dldFByZXNlcnZlR2x5cGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldFN5c0ZvbnQiLCAoUHlDRnVuY3Rpb24pRm1fR2V0U3lzRm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldEFwcEZvbnQiLCAoUHlDRnVuY3Rpb24pRm1fR2V0QXBwRm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlFEVGV4dEJvdW5kcyIsIChQeUNGdW5jdGlvbilGbV9RRFRleHRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBpblRleHQpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZWxzZSAgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIEZtX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNlbmRpZiAgLyogX19MUDY0X18gKi8KIAogdm9pZCBpbml0X0ZtKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgIC8qIF9fTFA2NF9fICovCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0ZtIiwgRm1fbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9GbSIsIEZtX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUZtX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoRm1fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBGbV9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEZtX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRm1fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBGbV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogI2VuZGlmICAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9mb2xkZXIvX0ZvbGRlcm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZm9sZGVyL19Gb2xkZXJtb2R1bGUuYwppbmRleCAwMzVkYWI4Li4xMDU5N2Y1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9mb2xkZXIvX0ZvbGRlcm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ZvbGRlci9fRm9sZGVybW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yMiwzMDEgKzIyLDMwMSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9GaW5kRm9sZGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JT1NUeXBlIGZvbGRlclR5cGU7Ci0JQm9vbGVhbiBjcmVhdGVGb2xkZXI7Ci0JRlNWb2x1bWVSZWZOdW0gIGZvdW5kVlJlZk51bTsKLQlTSW50MzIgZm91bmREaXJJRDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRlclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVGb2xkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmluZEZvbGRlcih2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgIGZvbGRlclR5cGUsCi0JICAgICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICZmb3VuZFZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgJmZvdW5kRGlySUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3VuZFZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgZm91bmREaXJJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBPU1R5cGUgZm9sZGVyVHlwZTsKKyAgICBCb29sZWFuIGNyZWF0ZUZvbGRlcjsKKyAgICBGU1ZvbHVtZVJlZk51bSAgZm91bmRWUmVmTnVtOworICAgIFNJbnQzMiBmb3VuZERpcklEOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZUZvbGRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGaW5kRm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgJmZvdW5kVlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAmZm91bmREaXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZERpcklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfUmVsZWFzZUZvbGRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCU9TVHlwZSBmb2xkZXJUeXBlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbGVhc2VGb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICBmb2xkZXJUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIE9TVHlwZSBmb2xkZXJUeXBlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbGVhc2VGb2xkZXIodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfRlNGaW5kRm9sZGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JT1NUeXBlIGZvbGRlclR5cGU7Ci0JQm9vbGVhbiBjcmVhdGVGb2xkZXI7Ci0JRlNSZWYgZm91bmRSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkZXJUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlRm9sZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTRmluZEZvbGRlcih2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgZm9sZGVyVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICZmb3VuZFJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZmb3VuZFJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBPU1R5cGUgZm9sZGVyVHlwZTsKKyAgICBCb29sZWFuIGNyZWF0ZUZvbGRlcjsKKyAgICBGU1JlZiBmb3VuZFJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVGb2xkZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRlNGaW5kRm9sZGVyKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICBmb2xkZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZvdW5kUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJmZvdW5kUmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfQWRkRm9sZGVyRGVzY3JpcHRvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGb2xkZXJUeXBlIGZvbGRUeXBlOwotCUZvbGRlckRlc2NGbGFncyBmbGFnczsKLQlGb2xkZXJDbGFzcyBmb2xkQ2xhc3M7Ci0JRm9sZGVyTG9jYXRpb24gZm9sZExvY2F0aW9uOwotCU9TVHlwZSBiYWRnZVNpZ25hdHVyZTsKLQlPU1R5cGUgYmFkZ2VUeXBlOwotCVN0cjI1NSBuYW1lOwotCUJvb2xlYW4gcmVwbGFjZUZsYWc7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJk8mTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRMb2NhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmYmFkZ2VTaWduYXR1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmJhZGdlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVwbGFjZUZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkRm9sZGVyRGVzY3JpcHRvcihmb2xkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExvY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZGdlU2lnbmF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZGdlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGb2xkZXJUeXBlIGZvbGRUeXBlOworICAgIEZvbGRlckRlc2NGbGFncyBmbGFnczsKKyAgICBGb2xkZXJDbGFzcyBmb2xkQ2xhc3M7CisgICAgRm9sZGVyTG9jYXRpb24gZm9sZExvY2F0aW9uOworICAgIE9TVHlwZSBiYWRnZVNpZ25hdHVyZTsKKyAgICBPU1R5cGUgYmFkZ2VUeXBlOworICAgIFN0cjI1NSBuYW1lOworICAgIEJvb2xlYW4gcmVwbGFjZUZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJk8mTyZPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmYmFkZ2VTaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmJhZGdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbGFjZUZsYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkRm9sZGVyRGVzY3JpcHRvcihmb2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZExvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZGdlU2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZGdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VGbGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfR2V0Rm9sZGVyVHlwZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVUludDMyIHJlcXVlc3RlZFR5cGVDb3VudDsKLQlVSW50MzIgdG90YWxUeXBlQ291bnQ7Ci0JRm9sZGVyVHlwZSB0aGVUeXBlczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZFR5cGVDb3VudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGb2xkZXJUeXBlcyhyZXF1ZXN0ZWRUeXBlQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbFR5cGVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZVR5cGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIHRvdGFsVHlwZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVUludDMyIHJlcXVlc3RlZFR5cGVDb3VudDsKKyAgICBVSW50MzIgdG90YWxUeXBlQ291bnQ7CisgICAgRm9sZGVyVHlwZSB0aGVUeXBlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZFR5cGVDb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGb2xkZXJUeXBlcyhyZXF1ZXN0ZWRUeXBlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbFR5cGVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVR5cGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsVHlwZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX1JlbW92ZUZvbGRlckRlc2NyaXB0b3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRm9sZGVyVHlwZSBmb2xkVHlwZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZvbGRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUZvbGRlckRlc2NyaXB0b3IoZm9sZFR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZvbGRlclR5cGUgZm9sZFR5cGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVGb2xkZXJEZXNjcmlwdG9yKGZvbGRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfR2V0Rm9sZGVyTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB2UmVmTnVtOwotCU9TVHlwZSBmb2xkVHlwZTsKLQlzaG9ydCBmb3VuZFZSZWZOdW07Ci0JU3RyMjU1IG5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9sZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGb2xkZXJOYW1lKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgZm9sZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgJmZvdW5kVlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3VuZFZSZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHZSZWZOdW07CisgICAgT1NUeXBlIGZvbGRUeXBlOworICAgIHNob3J0IGZvdW5kVlJlZk51bTsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEZvbGRlck5hbWUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb2xkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZm91bmRWUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVlJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0FkZEZvbGRlclJvdXRpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCUZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyOwotCUZvbGRlclR5cGUgcm91dGVUb0ZvbGRlcjsKLQlSb3V0aW5nRmxhZ3MgZmxhZ3M7Ci0JQm9vbGVhbiByZXBsYWNlRmxhZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZUZyb21Gb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlVG9Gb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlcGxhY2VGbGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEZvbGRlclJvdXRpbmcoZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVGcm9tRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlVG9Gb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUZsYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcjsKKyAgICBGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXI7CisgICAgUm91dGluZ0ZsYWdzIGZsYWdzOworICAgIEJvb2xlYW4gcmVwbGFjZUZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZVRvRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBsYWNlRmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRGb2xkZXJSb3V0aW5nKGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlRnJvbUZvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZVRvRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VGbGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpGb2xkZXJfUmVtb3ZlRm9sZGVyUm91dGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyb3V0ZUZyb21Gb2xkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlRm9sZGVyUm91dGluZyhmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJvdXRlRnJvbUZvbGRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVGb2xkZXJSb3V0aW5nKGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlRnJvbUZvbGRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0ZpbmRGb2xkZXJSb3V0aW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcjsKLQlGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXI7Ci0JUm91dGluZ0ZsYWdzIGZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZpbmRGb2xkZXJSb3V0aW5nKGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyb3V0ZVRvRm9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHJvdXRlVG9Gb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcjsKKyAgICBGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXI7CisgICAgUm91dGluZ0ZsYWdzIGZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcm91dGVGcm9tRm9sZGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZpbmRGb2xkZXJSb3V0aW5nKGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUZyb21Gb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3V0ZVRvRm9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHJvdXRlVG9Gb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKkZvbGRlcl9JbnZhbGlkYXRlRm9sZGVyRGVzY3JpcHRvckNhY2hlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW52YWxpZGF0ZUZvbGRlckRlc2NyaXB0b3JDYWNoZSh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEludmFsaWRhdGVGb2xkZXJEZXNjcmlwdG9yQ2FjaGUodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRm9sZGVyX0lkZW50aWZ5Rm9sZGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlGb2xkZXJUeXBlIGZvbGRUeXBlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJZGVudGlmeUZvbGRlcih2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbGRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZvbGRUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgRm9sZGVyVHlwZSBmb2xkVHlwZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSWRlbnRpZnlGb2xkZXIodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb2xkVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmb2xkVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBGb2xkZXJfbWV0aG9kc1tdID0gewotCXsiRmluZEZvbGRlciIsIChQeUNGdW5jdGlvbilGb2xkZXJfRmluZEZvbGRlciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRlclR5cGUsIEJvb2xlYW4gY3JlYXRlRm9sZGVyKSAtPiAoc2hvcnQgZm91bmRWUmVmTnVtLCBsb25nIGZvdW5kRGlySUQpIil9LAotCXsiUmVsZWFzZUZvbGRlciIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVsZWFzZUZvbGRlciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRlclR5cGUpIC0+IE5vbmUiKX0sCi0JeyJGU0ZpbmRGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZTRmluZEZvbGRlciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRlclR5cGUsIEJvb2xlYW4gY3JlYXRlRm9sZGVyKSAtPiAoRlNSZWYgZm91bmRSZWYpIil9LAotCXsiQWRkRm9sZGVyRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilGb2xkZXJfQWRkRm9sZGVyRGVzY3JpcHRvciwgMSwKLQkgUHlEb2NfU1RSKCIoRm9sZGVyVHlwZSBmb2xkVHlwZSwgRm9sZGVyRGVzY0ZsYWdzIGZsYWdzLCBGb2xkZXJDbGFzcyBmb2xkQ2xhc3MsIEZvbGRlckxvY2F0aW9uIGZvbGRMb2NhdGlvbiwgT1NUeXBlIGJhZGdlU2lnbmF0dXJlLCBPU1R5cGUgYmFkZ2VUeXBlLCBTdHIyNTUgbmFtZSwgQm9vbGVhbiByZXBsYWNlRmxhZykgLT4gTm9uZSIpfSwKLQl7IkdldEZvbGRlclR5cGVzIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9HZXRGb2xkZXJUeXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIHJlcXVlc3RlZFR5cGVDb3VudCkgLT4gKFVJbnQzMiB0b3RhbFR5cGVDb3VudCwgRm9sZGVyVHlwZSB0aGVUeXBlcykiKX0sCi0JeyJSZW1vdmVGb2xkZXJEZXNjcmlwdG9yIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9SZW1vdmVGb2xkZXJEZXNjcmlwdG9yLCAxLAotCSBQeURvY19TVFIoIihGb2xkZXJUeXBlIGZvbGRUeXBlKSAtPiBOb25lIil9LAorICAgIHsiRmluZEZvbGRlciIsIChQeUNGdW5jdGlvbilGb2xkZXJfRmluZEZvbGRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRlclR5cGUsIEJvb2xlYW4gY3JlYXRlRm9sZGVyKSAtPiAoc2hvcnQgZm91bmRWUmVmTnVtLCBsb25nIGZvdW5kRGlySUQpIil9LAorICAgIHsiUmVsZWFzZUZvbGRlciIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVsZWFzZUZvbGRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRlclR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJGU0ZpbmRGb2xkZXIiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ZTRmluZEZvbGRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRlclR5cGUsIEJvb2xlYW4gY3JlYXRlRm9sZGVyKSAtPiAoRlNSZWYgZm91bmRSZWYpIil9LAorICAgIHsiQWRkRm9sZGVyRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilGb2xkZXJfQWRkRm9sZGVyRGVzY3JpcHRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRm9sZGVyVHlwZSBmb2xkVHlwZSwgRm9sZGVyRGVzY0ZsYWdzIGZsYWdzLCBGb2xkZXJDbGFzcyBmb2xkQ2xhc3MsIEZvbGRlckxvY2F0aW9uIGZvbGRMb2NhdGlvbiwgT1NUeXBlIGJhZGdlU2lnbmF0dXJlLCBPU1R5cGUgYmFkZ2VUeXBlLCBTdHIyNTUgbmFtZSwgQm9vbGVhbiByZXBsYWNlRmxhZykgLT4gTm9uZSIpfSwKKyAgICB7IkdldEZvbGRlclR5cGVzIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9HZXRGb2xkZXJUeXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIHJlcXVlc3RlZFR5cGVDb3VudCkgLT4gKFVJbnQzMiB0b3RhbFR5cGVDb3VudCwgRm9sZGVyVHlwZSB0aGVUeXBlcykiKX0sCisgICAgeyJSZW1vdmVGb2xkZXJEZXNjcmlwdG9yIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9SZW1vdmVGb2xkZXJEZXNjcmlwdG9yLCAxLAorICAgICBQeURvY19TVFIoIihGb2xkZXJUeXBlIGZvbGRUeXBlKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Rm9sZGVyTmFtZSIsIChQeUNGdW5jdGlvbilGb2xkZXJfR2V0Rm9sZGVyTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgT1NUeXBlIGZvbGRUeXBlLCBTdHIyNTUgbmFtZSkgLT4gKHNob3J0IGZvdW5kVlJlZk51bSkiKX0sCi0JeyJBZGRGb2xkZXJSb3V0aW5nIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9BZGRGb2xkZXJSb3V0aW5nLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZVR5cGUsIEZvbGRlclR5cGUgcm91dGVGcm9tRm9sZGVyLCBGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXIsIFJvdXRpbmdGbGFncyBmbGFncywgQm9vbGVhbiByZXBsYWNlRmxhZykgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZUZvbGRlclJvdXRpbmciLCAoUHlDRnVuY3Rpb24pRm9sZGVyX1JlbW92ZUZvbGRlclJvdXRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIpIC0+IE5vbmUiKX0sCi0JeyJGaW5kRm9sZGVyUm91dGluZyIsIChQeUNGdW5jdGlvbilGb2xkZXJfRmluZEZvbGRlclJvdXRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIpIC0+IChGb2xkZXJUeXBlIHJvdXRlVG9Gb2xkZXIsIFJvdXRpbmdGbGFncyBmbGFncykiKX0sCisgICAgeyJHZXRGb2xkZXJOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9HZXRGb2xkZXJOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBPU1R5cGUgZm9sZFR5cGUsIFN0cjI1NSBuYW1lKSAtPiAoc2hvcnQgZm91bmRWUmVmTnVtKSIpfSwKKyAgICB7IkFkZEZvbGRlclJvdXRpbmciLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0FkZEZvbGRlclJvdXRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBmaWxlVHlwZSwgRm9sZGVyVHlwZSByb3V0ZUZyb21Gb2xkZXIsIEZvbGRlclR5cGUgcm91dGVUb0ZvbGRlciwgUm91dGluZ0ZsYWdzIGZsYWdzLCBCb29sZWFuIHJlcGxhY2VGbGFnKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlRm9sZGVyUm91dGluZyIsIChQeUNGdW5jdGlvbilGb2xkZXJfUmVtb3ZlRm9sZGVyUm91dGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlLCBGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcikgLT4gTm9uZSIpfSwKKyAgICB7IkZpbmRGb2xkZXJSb3V0aW5nIiwgKFB5Q0Z1bmN0aW9uKUZvbGRlcl9GaW5kRm9sZGVyUm91dGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVUeXBlLCBGb2xkZXJUeXBlIHJvdXRlRnJvbUZvbGRlcikgLT4gKEZvbGRlclR5cGUgcm91dGVUb0ZvbGRlciwgUm91dGluZ0ZsYWdzIGZsYWdzKSIpfSwKICNlbmRpZiAvKiAhX19MUDY0X18gKi8KLQl7IkludmFsaWRhdGVGb2xkZXJEZXNjcmlwdG9yQ2FjaGUiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ludmFsaWRhdGVGb2xkZXJEZXNjcmlwdG9yQ2FjaGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIC0+IE5vbmUiKX0sCi0JeyJJZGVudGlmeUZvbGRlciIsIChQeUNGdW5jdGlvbilGb2xkZXJfSWRlbnRpZnlGb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIC0+IChGb2xkZXJUeXBlIGZvbGRUeXBlKSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkludmFsaWRhdGVGb2xkZXJEZXNjcmlwdG9yQ2FjaGUiLCAoUHlDRnVuY3Rpb24pRm9sZGVyX0ludmFsaWRhdGVGb2xkZXJEZXNjcmlwdG9yQ2FjaGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIC0+IE5vbmUiKX0sCisgICAgeyJJZGVudGlmeUZvbGRlciIsIChQeUNGdW5jdGlvbilGb2xkZXJfSWRlbnRpZnlGb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQpIC0+IChGb2xkZXJUeXBlIGZvbGRUeXBlKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMzI0LDE4ICszMjQsMTggQEAKIAogdm9pZCBpbml0X0ZvbGRlcih2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9Gb2xkZXIiLCBGb2xkZXJfbWV0aG9kcyk7Ci0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JRm9sZGVyX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoRm9sZGVyX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRm9sZGVyX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9Gb2xkZXIiLCBGb2xkZXJfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgRm9sZGVyX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoRm9sZGVyX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRm9sZGVyX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CiB9CiAKIC8qID09PT09PT09PT09PT09PT09PT09PT09IEVuZCBtb2R1bGUgX0ZvbGRlciA9PT09PT09PT09PT09PT09PT09PT09PSAqLwpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZ2VzdGFsdG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvZ2VzdGFsdG1vZHVsZS5jCmluZGV4IGZhMWM5M2MuLjU2NzU3YWIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2dlc3RhbHRtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9nZXN0YWx0bW9kdWxlLmMKQEAgLTQsMTAgKzQsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAogCi1QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIAorUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCitkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gCitib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIFN0aWNodGluZyBNYXRoZW1hdGlzY2gKIENlbnRydW0gb3IgQ1dJIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCiBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KQEAgLTMyLDI0ICszMiwyNCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdlc3RhbHRfZ2VzdGFsdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NFcnIgaUVycjsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0JU0ludDMyIHJlc3BvbnNlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCWlFcnIgPSBHZXN0YWx0ICggc2VsZWN0b3IsICZyZXNwb25zZSApOwotCWlmIChpRXJyICE9IDApIAotCQlyZXR1cm4gUHlNYWNfRXJyb3IoaUVycik7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlc3BvbnNlKTsKKyAgICBPU0VyciBpRXJyOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICBTSW50MzIgcmVzcG9uc2U7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaUVyciA9IEdlc3RhbHQgKCBzZWxlY3RvciwgJnJlc3BvbnNlICk7CisgICAgaWYgKGlFcnIgIT0gMCkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGlFcnIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhyZXNwb25zZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgZ2VzdGFsdF9tZXRob2RzW10gPSB7Ci0JeyJnZXN0YWx0IiwgZ2VzdGFsdF9nZXN0YWx0LCBNRVRIX1ZBUkFSR1N9LAotCXtOVUxMLCBOVUxMfSAvKiBTZW50aW5lbCAqLworICAgIHsiZ2VzdGFsdCIsIGdlc3RhbHRfZ2VzdGFsdCwgTUVUSF9WQVJBUkdTfSwKKyAgICB7TlVMTCwgTlVMTH0gLyogU2VudGluZWwgKi8KIH07CiAKIHZvaWQKIGluaXRnZXN0YWx0KHZvaWQpCiB7Ci0JUHlfSW5pdE1vZHVsZSgiZ2VzdGFsdCIsIGdlc3RhbHRfbWV0aG9kcyk7CisgICAgUHlfSW5pdE1vZHVsZSgiZ2VzdGFsdCIsIGdlc3RhbHRfbWV0aG9kcyk7CiB9CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9oZWxwL19IZWxwbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9oZWxwL19IZWxwbW9kdWxlLmMKaW5kZXggYTZlY2NmMy4uZWFhMmU4YSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvaGVscC9fSGVscG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2hlbHAvX0hlbHBtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMjIsMTUxICsyMiwxNTEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNR2V0SGVscE1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudVJlZiBvdXRIZWxwTWVudTsKLQlNZW51SXRlbUluZGV4IG91dEZpcnN0Q3VzdG9tSXRlbUluZGV4OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1HZXRIZWxwTWVudSgmb3V0SGVscE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgJm91dEZpcnN0Q3VzdG9tSXRlbUluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRIZWxwTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudVJlZiBvdXRIZWxwTWVudTsKKyAgICBNZW51SXRlbUluZGV4IG91dEZpcnN0Q3VzdG9tSXRlbUluZGV4OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1HZXRIZWxwTWVudSgmb3V0SGVscE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZpcnN0Q3VzdG9tSXRlbUluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRIZWxwTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGaXJzdEN1c3RvbUl0ZW1JbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITUFyZUhlbHBUYWdzRGlzcGxheWVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSE1BcmVIZWxwVGFnc0Rpc3BsYXllZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSE1BcmVIZWxwVGFnc0Rpc3BsYXllZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1TZXRIZWxwVGFnc0Rpc3BsYXllZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGluRGlzcGxheVRhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkRpc3BsYXlUYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNU2V0SGVscFRhZ3NEaXNwbGF5ZWQoaW5EaXNwbGF5VGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBpbkRpc3BsYXlUYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5EaXNwbGF5VGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBITVNldEhlbHBUYWdzRGlzcGxheWVkKGluRGlzcGxheVRhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1TZXRUYWdEZWxheShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEdXJhdGlvbiBpbkRlbGF5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5EZWxheSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBITVNldFRhZ0RlbGF5KGluRGVsYXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIER1cmF0aW9uIGluRGVsYXk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkRlbGF5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNU2V0VGFnRGVsYXkoaW5EZWxheSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITUdldFRhZ0RlbGF5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUR1cmF0aW9uIG91dERlbGF5OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1HZXRUYWdEZWxheSgmb3V0RGVsYXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dERlbGF5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEdXJhdGlvbiBvdXREZWxheTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEhNR2V0VGFnRGVsYXkoJm91dERlbGF5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXREZWxheSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSGVscF9ITVNldE1lbnVIZWxwRnJvbUJhbGxvb25Sc3JjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVSZWYgaW5NZW51OwotCVNJbnQxNiBpbkhtbnVSc3JjSUQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IbW51UnNyY0lEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEhNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSG1udVJzcmNJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudVJlZiBpbk1lbnU7CisgICAgU0ludDE2IGluSG1udVJzcmNJRDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhtbnVSc3JjSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYyhpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IbW51UnNyY0lEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpIZWxwX0hNU2V0RGlhbG9nSGVscEZyb21CYWxsb29uUnNyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlEaWFsb2dQdHIgaW5EaWFsb2c7Ci0JU0ludDE2IGluSGRsZ1JzcmNJRDsKLQlTSW50MTYgaW5JdGVtU3RhcnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmaW5EaWFsb2csCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhkbGdSc3JjSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1TdGFydCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBITVNldERpYWxvZ0hlbHBGcm9tQmFsbG9vblJzcmMoaW5EaWFsb2csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhkbGdSc3JjSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1TdGFydCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRGlhbG9nUHRyIGluRGlhbG9nOworICAgIFNJbnQxNiBpbkhkbGdSc3JjSUQ7CisgICAgU0ludDE2IGluSXRlbVN0YXJ0OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmluRGlhbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IZGxnUnNyY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtU3RhcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjKGluRGlhbG9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZGxnUnNyY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtU3RhcnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkhlbHBfSE1IaWRlVGFnKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSE1IaWRlVGFnKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBITUhpZGVUYWcoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBIZWxwX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkhNR2V0SGVscE1lbnUiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUdldEhlbHBNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51UmVmIG91dEhlbHBNZW51LCBNZW51SXRlbUluZGV4IG91dEZpcnN0Q3VzdG9tSXRlbUluZGV4KSIpfSwKLQl7IkhNQXJlSGVscFRhZ3NEaXNwbGF5ZWQiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUFyZUhlbHBUYWdzRGlzcGxheWVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJITVNldEhlbHBUYWdzRGlzcGxheWVkIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXRIZWxwVGFnc0Rpc3BsYXllZCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpbkRpc3BsYXlUYWdzKSAtPiBOb25lIil9LAotCXsiSE1TZXRUYWdEZWxheSIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0VGFnRGVsYXksIDEsCi0JIFB5RG9jX1NUUigiKER1cmF0aW9uIGluRGVsYXkpIC0+IE5vbmUiKX0sCi0JeyJITUdldFRhZ0RlbGF5IiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1HZXRUYWdEZWxheSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRHVyYXRpb24gb3V0RGVsYXkpIil9LAotCXsiSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYyIsIChQeUNGdW5jdGlvbilIZWxwX0hNU2V0TWVudUhlbHBGcm9tQmFsbG9vblJzcmMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVSZWYgaW5NZW51LCBTSW50MTYgaW5IbW51UnNyY0lEKSAtPiBOb25lIil9LAotCXsiSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXREaWFsb2dIZWxwRnJvbUJhbGxvb25Sc3JjLCAxLAotCSBQeURvY19TVFIoIihEaWFsb2dQdHIgaW5EaWFsb2csIFNJbnQxNiBpbkhkbGdSc3JjSUQsIFNJbnQxNiBpbkl0ZW1TdGFydCkgLT4gTm9uZSIpfSwKLQl7IkhNSGlkZVRhZyIsIChQeUNGdW5jdGlvbilIZWxwX0hNSGlkZVRhZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSE1HZXRIZWxwTWVudSIsIChQeUNGdW5jdGlvbilIZWxwX0hNR2V0SGVscE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVSZWYgb3V0SGVscE1lbnUsIE1lbnVJdGVtSW5kZXggb3V0Rmlyc3RDdXN0b21JdGVtSW5kZXgpIil9LAorICAgIHsiSE1BcmVIZWxwVGFnc0Rpc3BsYXllZCIsIChQeUNGdW5jdGlvbilIZWxwX0hNQXJlSGVscFRhZ3NEaXNwbGF5ZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkhNU2V0SGVscFRhZ3NEaXNwbGF5ZWQiLCAoUHlDRnVuY3Rpb24pSGVscF9ITVNldEhlbHBUYWdzRGlzcGxheWVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluRGlzcGxheVRhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJITVNldFRhZ0RlbGF5IiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXRUYWdEZWxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRHVyYXRpb24gaW5EZWxheSkgLT4gTm9uZSIpfSwKKyAgICB7IkhNR2V0VGFnRGVsYXkiLCAoUHlDRnVuY3Rpb24pSGVscF9ITUdldFRhZ0RlbGF5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChEdXJhdGlvbiBvdXREZWxheSkiKX0sCisgICAgeyJITVNldE1lbnVIZWxwRnJvbUJhbGxvb25Sc3JjIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1TZXRNZW51SGVscEZyb21CYWxsb29uUnNyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudVJlZiBpbk1lbnUsIFNJbnQxNiBpbkhtbnVSc3JjSUQpIC0+IE5vbmUiKX0sCisgICAgeyJITVNldERpYWxvZ0hlbHBGcm9tQmFsbG9vblJzcmMiLCAoUHlDRnVuY3Rpb24pSGVscF9ITVNldERpYWxvZ0hlbHBGcm9tQmFsbG9vblJzcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKERpYWxvZ1B0ciBpbkRpYWxvZywgU0ludDE2IGluSGRsZ1JzcmNJRCwgU0ludDE2IGluSXRlbVN0YXJ0KSAtPiBOb25lIil9LAorICAgIHsiSE1IaWRlVGFnIiwgKFB5Q0Z1bmN0aW9uKUhlbHBfSE1IaWRlVGFnLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTc0LDIxICsxNzQsMjEgQEAKIAogdm9pZCBpbml0X0hlbHAodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9IZWxwIiwgSGVscF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0hlbHAiLCBIZWxwX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUhlbHBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChIZWxwX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgSGVscF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEhlbHBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChIZWxwX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgSGVscF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2liY2FyYm9uL19JQkNhcmJvbi5jIGIvTWFjL01vZHVsZXMvaWJjYXJib24vX0lCQ2FyYm9uLmMKaW5kZXggYzdjODE5Yy4uMmE2NWY0MiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvaWJjYXJib24vX0lCQ2FyYm9uLmMKKysrIGIvTWFjL01vZHVsZXMvaWJjYXJib24vX0lCQ2FyYm9uLmMKQEAgLTIzLDExNiArMjMsMTE2IEBACiAjZGVmaW5lIElCTmliUmVmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJklCTmliUmVmX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJklCTmliUmVmX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBJQk5pYlJlZk9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUlCTmliUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgSUJOaWJSZWYgb2JfaXRzZWxmOwogfSBJQk5pYlJlZk9iamVjdDsKIAogUHlPYmplY3QgKklCTmliUmVmT2JqX05ldyhJQk5pYlJlZiBpdHNlbGYpCiB7Ci0JSUJOaWJSZWZPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKElCTmliUmVmT2JqZWN0LCAmSUJOaWJSZWZfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIElCTmliUmVmT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhJQk5pYlJlZk9iamVjdCwgJklCTmliUmVmX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IElCTmliUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIElCTmliUmVmICpwX2l0c2VsZikKIHsKLQlpZiAoIUlCTmliUmVmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIklCTmliUmVmIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKElCTmliUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUlCTmliUmVmT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIklCTmliUmVmIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKElCTmliUmVmT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgSUJOaWJSZWZPYmpfZGVhbGxvYyhJQk5pYlJlZk9iamVjdCAqc2VsZikKIHsKLQlEaXNwb3NlTmliUmVmZXJlbmNlKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBEaXNwb3NlTmliUmVmZXJlbmNlKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9DcmVhdGVXaW5kb3dGcm9tTmliKElCTmliUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluTmFtZTsKLQlXaW5kb3dQdHIgb3V0V2luZG93OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVXaW5kb3dGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBvdXRXaW5kb3cpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBXaW5kb3dQdHIgb3V0V2luZG93OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVXaW5kb3dGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBvdXRXaW5kb3cpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKklCTmliUmVmT2JqX0NyZWF0ZU1lbnVGcm9tTmliKElCTmliUmVmT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluTmFtZTsKLQlNZW51SGFuZGxlIG91dE1lbnVSZWY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU1lbnVGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudVJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5OYW1lOworICAgIE1lbnVIYW5kbGUgb3V0TWVudVJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTWVudUZyb21OaWIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWVudVJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51UmVmKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9DcmVhdGVNZW51QmFyRnJvbU5pYihJQk5pYlJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JSGFuZGxlIG91dE1lbnVCYXI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU1lbnVCYXJGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVCYXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXRNZW51QmFyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpbk5hbWU7CisgICAgSGFuZGxlIG91dE1lbnVCYXI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU1lbnVCYXJGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVCYXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvdXRNZW51QmFyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJQk5pYlJlZk9ial9TZXRNZW51QmFyRnJvbU5pYihJQk5pYlJlZk9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpbk5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5OYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVCYXJGcm9tTmliKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluTmFtZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5OYW1lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51QmFyRnJvbU5pYihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgSUJOaWJSZWZPYmpfbWV0aG9kc1tdID0gewotCXsiQ3JlYXRlV2luZG93RnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9DcmVhdGVXaW5kb3dGcm9tTmliLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKLQl7IkNyZWF0ZU1lbnVGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX0NyZWF0ZU1lbnVGcm9tTmliLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChNZW51SGFuZGxlIG91dE1lbnVSZWYpIil9LAotCXsiQ3JlYXRlTWVudUJhckZyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfQ3JlYXRlTWVudUJhckZyb21OaWIsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluTmFtZSkgLT4gKEhhbmRsZSBvdXRNZW51QmFyKSIpfSwKLQl7IlNldE1lbnVCYXJGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX1NldE1lbnVCYXJGcm9tTmliLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJDcmVhdGVXaW5kb3dGcm9tTmliIiwgKFB5Q0Z1bmN0aW9uKUlCTmliUmVmT2JqX0NyZWF0ZVdpbmRvd0Zyb21OaWIsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluTmFtZSkgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3cpIil9LAorICAgIHsiQ3JlYXRlTWVudUZyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfQ3JlYXRlTWVudUZyb21OaWIsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluTmFtZSkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudVJlZikiKX0sCisgICAgeyJDcmVhdGVNZW51QmFyRnJvbU5pYiIsIChQeUNGdW5jdGlvbilJQk5pYlJlZk9ial9DcmVhdGVNZW51QmFyRnJvbU5pYiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5OYW1lKSAtPiAoSGFuZGxlIG91dE1lbnVCYXIpIil9LAorICAgIHsiU2V0TWVudUJhckZyb21OaWIiLCAoUHlDRnVuY3Rpb24pSUJOaWJSZWZPYmpfU2V0TWVudUJhckZyb21OaWIsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluTmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgSUJOaWJSZWZPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xNDksNjEgKzE0OSw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKklCTmliUmVmT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlJQk5pYlJlZiBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIElCTmliUmVmIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIElCTmliUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoSUJOaWJSZWZPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgSUJOaWJSZWZPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChJQk5pYlJlZk9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBJQk5pYlJlZk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBJQk5pYlJlZl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9JQkNhcmJvbi5JQk5pYlJlZiIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKElCTmliUmVmT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgSUJOaWJSZWZPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgSUJOaWJSZWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIElCTmliUmVmT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBJQk5pYlJlZk9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlJQk5pYlJlZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlJQk5pYlJlZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlJQk5pYlJlZk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JSUJOaWJSZWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JSUJOaWJSZWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlJQk5pYlJlZk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0lCQ2FyYm9uLklCTmliUmVmIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoSUJOaWJSZWZPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBJQk5pYlJlZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBJQk5pYlJlZk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgSUJOaWJSZWZPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIElCTmliUmVmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIElCTmliUmVmT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIElCTmliUmVmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIElCTmliUmVmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBJQk5pYlJlZk9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBJQk5pYlJlZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIElCTmliUmVmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBJQk5pYlJlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjExLDI4ICsyMTEsMjggQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJQkNhcmJvbl9DcmVhdGVOaWJSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5OaWJOYW1lOwotCUlCTmliUmVmIG91dE5pYlJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5pYk5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTmliUmVmZXJlbmNlKGluTmliTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROaWJSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBJQk5pYlJlZk9ial9OZXcsIG91dE5pYlJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5OaWJOYW1lOworICAgIElCTmliUmVmIG91dE5pYlJlZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5pYk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTmliUmVmZXJlbmNlKGluTmliTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROaWJSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJQk5pYlJlZk9ial9OZXcsIG91dE5pYlJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIElCQ2FyYm9uX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkNyZWF0ZU5pYlJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilJQkNhcmJvbl9DcmVhdGVOaWJSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluTmliTmFtZSkgLT4gKElCTmliUmVmIG91dE5pYlJlZikiKX0sCisgICAgeyJDcmVhdGVOaWJSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pSUJDYXJib25fQ3JlYXRlTmliUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpbk5pYk5hbWUpIC0+IChJQk5pYlJlZiBvdXROaWJSZWYpIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTI0MCwyOSArMjQwLDI5IEBACiAKIHZvaWQgaW5pdF9JQkNhcmJvbih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfSUJDYXJib24iLCBJQkNhcmJvbl9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0lCQ2FyYm9uIiwgSUJDYXJib25fbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JSUJDYXJib25fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChJQkNhcmJvbl9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIElCQ2FyYm9uX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JSUJOaWJSZWZfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJklCTmliUmVmX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmSUJOaWJSZWZfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJQk5pYlJlZiIsIChQeU9iamVjdCAqKSZJQk5pYlJlZl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJklCTmliUmVmX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSUJOaWJSZWZUeXBlIiwgKFB5T2JqZWN0ICopJklCTmliUmVmX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIElCQ2FyYm9uX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoSUJDYXJib25fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJQkNhcmJvbl9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIElCTmliUmVmX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZJQk5pYlJlZl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJklCTmliUmVmX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiSUJOaWJSZWYiLCAoUHlPYmplY3QgKikmSUJOaWJSZWZfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZJQk5pYlJlZl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklCTmliUmVmVHlwZSIsIChQeU9iamVjdCAqKSZJQk5pYlJlZl9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pY2dsdWVtb2R1bGUuYyBiL01hYy9Nb2R1bGVzL2ljZ2x1ZW1vZHVsZS5jCmluZGV4IDcwY2ExZTMuLjRkMTdiZjcgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ljZ2x1ZW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ljZ2x1ZW1vZHVsZS5jCkBAIC00Myw4ICs0Myw4IEBACiAvKiBEZWNsYXJhdGlvbnMgZm9yIG9iamVjdHMgb2YgdHlwZSBpY19pbnN0YW5jZSAqLwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUlDSW5zdGFuY2UgaW5zdDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgSUNJbnN0YW5jZSBpbnN0OwogfSBpY2lvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgSWNpdHlwZTsKQEAgLTU0LDMwMyArNTQsMzAzIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIAotc3RhdGljIGNoYXIgaWNpX0lDR2V0U2VlZF9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDR2V0U2VlZF9fZG9jX19bXSA9CiAiKCktPmludDsgUmV0dXJucyBpbnQgdGhhdCBjaGFuZ2VzIHdoZW4gY29uZmlndXJhdGlvbiBkb2VzIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDR2V0U2VlZChpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlsb25nIHNlZWQ7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNHZXRTZWVkKHNlbGYtPmluc3QsICZzZWVkKSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgKGludClzZWVkKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgbG9uZyBzZWVkOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNHZXRTZWVkKHNlbGYtPmluc3QsICZzZWVkKSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgKGludClzZWVkKTsKIH0KIAogCi1zdGF0aWMgY2hhciBpY2lfSUNCZWdpbl9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDQmVnaW5fX2RvY19fW10gPQogIihwZXJtKS0+Tm9uZTsgTG9jayBjb25maWcgZmlsZSBmb3IgcmVhZC93cml0ZSIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0JlZ2luKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCWludCBwZXJtOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZwZXJtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNCZWdpbihzZWxmLT5pbnN0LCAoSUNQZXJtKXBlcm0pKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBpbnQgcGVybTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZwZXJtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNCZWdpbihzZWxmLT5pbnN0LCAoSUNQZXJtKXBlcm0pKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ0ZpbmRQcmVmSGFuZGxlX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNGaW5kUHJlZkhhbmRsZV9fZG9jX19bXSA9CiAiKGtleSwgaGFuZGxlKS0+YXR0cnM7IExvb2t1cCBrZXksIHN0b3JlIHJlc3VsdCBpbiBoYW5kbGUsIHJldHVybiBhdHRyaWJ1dGVzIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDRmluZFByZWZIYW5kbGUoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGtleTsKLQlJQ0F0dHIgYXR0cjsKLQlIYW5kbGUgaDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyYiLCBQeU1hY19HZXRTdHIyNTUsICZrZXksIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDRmluZFByZWZIYW5kbGUoc2VsZi0+aW5zdCwga2V5LCAmYXR0ciwgaCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpYXR0cik7CisgICAgT1NTdGF0dXMgZXJyOworICAgIFN0cjI1NSBrZXk7CisgICAgSUNBdHRyIGF0dHI7CisgICAgSGFuZGxlIGg7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyYiLCBQeU1hY19HZXRTdHIyNTUsICZrZXksIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDRmluZFByZWZIYW5kbGUoc2VsZi0+aW5zdCwga2V5LCAmYXR0ciwgaCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpYXR0cik7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDU2V0UHJlZl9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDU2V0UHJlZl9fZG9jX19bXSA9CiAiKGtleSwgYXR0ciwgZGF0YSktPk5vbmU7IFNldCBwcmVmZXJlbmNlIGtleSB0byBkYXRhIHdpdGggYXR0cmlidXRlcyIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ1NldFByZWYoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGtleTsKLQlpbnQgYXR0cjsKLQljaGFyICpkYXRhOwotCWludCBkYXRhbGVuOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpcyMiLCBQeU1hY19HZXRTdHIyNTUsICZrZXksICZhdHRyLCAKLQkJCQkJJmRhdGEsICZkYXRhbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNTZXRQcmVmKHNlbGYtPmluc3QsIGtleSwgKElDQXR0cilhdHRyLCAoUHRyKWRhdGEsIAotCQkJKGxvbmcpZGF0YWxlbikpICE9IDApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGtleTsKKyAgICBpbnQgYXR0cjsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBkYXRhbGVuOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmlzIyIsIFB5TWFjX0dldFN0cjI1NSwgJmtleSwgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgJmRhdGFsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ1NldFByZWYoc2VsZi0+aW5zdCwga2V5LCAoSUNBdHRyKWF0dHIsIChQdHIpZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcpZGF0YWxlbikpICE9IDApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogCi1zdGF0aWMgY2hhciBpY2lfSUNDb3VudFByZWZfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ0NvdW50UHJlZl9fZG9jX19bXSA9CiAiKCktPmludDsgUmV0dXJuIG51bWJlciBvZiBwcmVmZXJlbmNlcyIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ0NvdW50UHJlZihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlsb25nIGNvdW50OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDQ291bnRQcmVmKHNlbGYtPmluc3QsICZjb3VudCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIChpbnQpY291bnQpOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBsb25nIGNvdW50OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNDb3VudFByZWYoc2VsZi0+aW5zdCwgJmNvdW50KSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJpIiwgKGludCljb3VudCk7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDR2V0SW5kUHJlZl9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDR2V0SW5kUHJlZl9fZG9jX19bXSA9CiAiKG51bSktPmtleTsgUmV0dXJuIGtleSBvZiBwcmVmZXJlbmNlIHdpdGggZ2l2ZW4gaW5kZXgiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNHZXRJbmRQcmVmKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCWxvbmcgbnVtOwotCVN0cjI1NSBrZXk7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJm51bSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDR2V0SW5kUHJlZihzZWxmLT5pbnN0LCBudW0sIGtleSkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFN0cjI1NSwga2V5KTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgbG9uZyBudW07CisgICAgU3RyMjU1IGtleTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZudW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ0dldEluZFByZWYoc2VsZi0+aW5zdCwgbnVtLCBrZXkpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRTdHIyNTUsIGtleSk7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDRGVsZXRlUHJlZl9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgaWNpX0lDRGVsZXRlUHJlZl9fZG9jX19bXSA9CiAiKGtleSktPk5vbmU7IERlbGV0ZSBwcmVmZXJlbmNlIgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDRGVsZXRlUHJlZihpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlTdHIyNTUga2V5OworICAgIE9TU3RhdHVzIGVycjsKKyAgICBTdHIyNTUga2V5OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwga2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNEZWxldGVQcmVmKHNlbGYtPmluc3QsIGtleSkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwga2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNEZWxldGVQcmVmKHNlbGYtPmluc3QsIGtleSkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDRW5kX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNFbmRfX2RvY19fW10gPQogIigpLT5Ob25lOyBVbmxvY2sgZmlsZSBhZnRlciBJQ0JlZ2luIGNhbGwiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNFbmQoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNFbmQoc2VsZi0+aW5zdCkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgT1NTdGF0dXMgZXJyOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNFbmQoc2VsZi0+aW5zdCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDRWRpdFByZWZlcmVuY2VzX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNFZGl0UHJlZmVyZW5jZXNfX2RvY19fW10gPQogIihrZXkpLT5Ob25lOyBBc2sgdXNlciB0byBlZGl0IHByZWZlcmVuY2VzLCBzdGFyaW5nIHdpdGgga2V5IgogOwogCiBzdGF0aWMgUHlPYmplY3QgKgogaWNpX0lDRWRpdFByZWZlcmVuY2VzKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCVN0cjI1NSBrZXk7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJiIsIFB5TWFjX0dldFN0cjI1NSwga2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKChlcnI9SUNFZGl0UHJlZmVyZW5jZXMoc2VsZi0+aW5zdCwga2V5KSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGtleTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDRWRpdFByZWZlcmVuY2VzKHNlbGYtPmluc3QsIGtleSkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDUGFyc2VVUkxfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ1BhcnNlVVJMX19kb2NfX1tdID0KICIoaGludCwgZGF0YSwgc2VsU3RhcnQsIHNlbEVuZCwgaGFuZGxlKS0+c2VsU3RhcnQsIHNlbEVuZDsgRmluZCBhbiBVUkwsIHJldHVybiBpbiBoYW5kbGUiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNQYXJzZVVSTChpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlTdHIyNTUgaGludDsKLQljaGFyICpkYXRhOwotCWludCBkYXRhbGVuOwotCWxvbmcgc2VsU3RhcnQsIHNlbEVuZDsKLQlIYW5kbGUgaDsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mcyNsbE8mIiwgUHlNYWNfR2V0U3RyMjU1LCBoaW50LCAmZGF0YSwgJmRhdGFsZW4sCi0JCQkJJnNlbFN0YXJ0LCAmc2VsRW5kLCBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ1BhcnNlVVJMKHNlbGYtPmluc3QsIGhpbnQsIChQdHIpZGF0YSwgKGxvbmcpZGF0YWxlbiwKLQkJCQkmc2VsU3RhcnQsICZzZWxFbmQsIGgpKSAhPSAwICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgKGludClzZWxTdGFydCwgKGludClzZWxFbmQpOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBTdHIyNTUgaGludDsKKyAgICBjaGFyICpkYXRhOworICAgIGludCBkYXRhbGVuOworICAgIGxvbmcgc2VsU3RhcnQsIHNlbEVuZDsKKyAgICBIYW5kbGUgaDsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZzI2xsTyYiLCBQeU1hY19HZXRTdHIyNTUsIGhpbnQsICZkYXRhLCAmZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsICZzZWxFbmQsIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDUGFyc2VVUkwoc2VsZi0+aW5zdCwgaGludCwgKFB0cilkYXRhLCAobG9uZylkYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxTdGFydCwgJnNlbEVuZCwgaCkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWkiLCAoaW50KXNlbFN0YXJ0LCAoaW50KXNlbEVuZCk7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDTGF1bmNoVVJMX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNMYXVuY2hVUkxfX2RvY19fW10gPQogIihoaW50LCBkYXRhLCBzZWxTdGFydCwgc2VsRW5kKS0+Tm9uZTsgRmluZCBhbiBVUkwgYW5kIGxhdW5jaCB0aGUgY29ycmVjdCBhcHAiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNMYXVuY2hVUkwoaWNpb2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JU3RyMjU1IGhpbnQ7Ci0JY2hhciAqZGF0YTsKLQlpbnQgZGF0YWxlbjsKLQlsb25nIHNlbFN0YXJ0LCBzZWxFbmQ7Ci0JCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnMjbGwiLCBQeU1hY19HZXRTdHIyNTUsIGhpbnQsICZkYXRhLCAmZGF0YWxlbiwKLQkJCQkmc2VsU3RhcnQsICZzZWxFbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGVycj1JQ0xhdW5jaFVSTChzZWxmLT5pbnN0LCBoaW50LCAoUHRyKWRhdGEsIChsb25nKWRhdGFsZW4sCi0JCQkJJnNlbFN0YXJ0LCAmc2VsRW5kKSkgIT0gMCApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaSIsIChpbnQpc2VsU3RhcnQsIChpbnQpc2VsRW5kKTsKKyAgICBPU1N0YXR1cyBlcnI7CisgICAgU3RyMjU1IGhpbnQ7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgZGF0YWxlbjsKKyAgICBsb25nIHNlbFN0YXJ0LCBzZWxFbmQ7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mcyNsbCIsIFB5TWFjX0dldFN0cjI1NSwgaGludCwgJmRhdGEsICZkYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxTdGFydCwgJnNlbEVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDTGF1bmNoVVJMKHNlbGYtPmluc3QsIGhpbnQsIChQdHIpZGF0YSwgKGxvbmcpZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsICZzZWxFbmQpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpIiwgKGludClzZWxTdGFydCwgKGludClzZWxFbmQpOwogfQogCiAKLXN0YXRpYyBjaGFyIGljaV9JQ01hcEZpbGVuYW1lX19kb2NfX1tdID0gCitzdGF0aWMgY2hhciBpY2lfSUNNYXBGaWxlbmFtZV9fZG9jX19bXSA9CiAiKGZpbGVuYW1lKS0+bWFwaW5mbzsgR2V0IGZpbGVtYXAgaW5mbyBmb3IgZ2l2ZW4gZmlsZW5hbWUiCiA7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfSUNNYXBGaWxlbmFtZShpY2lvYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCU9TU3RhdHVzIGVycjsKLQlTdHIyNTUgZmlsZW5hbWU7Ci0JSUNNYXBFbnRyeSBlbnRyeTsKLQkKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0U3RyMjU1LCBmaWxlbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDTWFwRmlsZW5hbWUoc2VsZi0+aW5zdCwgZmlsZW5hbWUsICZlbnRyeSkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8mTyZPJmxPJk8mTyZPJk8mIiwgZW50cnkudmVyc2lvbiwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlVHlwZSwKLQkJUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVDcmVhdG9yLCAKLQkJUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LnBvc3RDcmVhdG9yLCAKLQkJZW50cnkuZmxhZ3MsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5leHRlbnNpb24sCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5jcmVhdG9yQXBwTmFtZSwKLQkJUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LnBvc3RBcHBOYW1lLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuTUlNRVR5cGUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5lbnRyeU5hbWUpOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBTdHIyNTUgZmlsZW5hbWU7CisgICAgSUNNYXBFbnRyeSBlbnRyeTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRTdHIyNTUsIGZpbGVuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChlcnI9SUNNYXBGaWxlbmFtZShzZWxmLT5pbnN0LCBmaWxlbmFtZSwgJmVudHJ5KSkgIT0gMCApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoTyZPJk8mbE8mTyZPJk8mTyYiLCBlbnRyeS52ZXJzaW9uLAorICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZVR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlQ3JlYXRvciwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LnBvc3RDcmVhdG9yLAorICAgICAgICBlbnRyeS5mbGFncywKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LmV4dGVuc2lvbiwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LmNyZWF0b3JBcHBOYW1lLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkucG9zdEFwcE5hbWUsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5NSU1FVHlwZSwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LmVudHJ5TmFtZSk7CiB9CiAKIAotc3RhdGljIGNoYXIgaWNpX0lDTWFwVHlwZUNyZWF0b3JfX2RvY19fW10gPSAKK3N0YXRpYyBjaGFyIGljaV9JQ01hcFR5cGVDcmVhdG9yX19kb2NfX1tdID0KICIodHlwZSwgY3JlYXRvciwgZmlsZW5hbWUpLT5tYXBpbmZvOyBHZXQgZmlsZW1hcCBpbmZvIGZvciBnaXZlbiB0cC9jci9maWxlbmFtZSIKIDsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGljaV9JQ01hcFR5cGVDcmVhdG9yKGljaW9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0JT1NTdGF0dXMgZXJyOwotCU9TVHlwZSB0eXBlLCBjcmVhdG9yOwotCVN0cjI1NSBmaWxlbmFtZTsKLQlJQ01hcEVudHJ5IGVudHJ5OwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJk8mIiwKLQkJCVB5TWFjX0dldE9TVHlwZSwgJnR5cGUsCi0JCQlQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCQkJUHlNYWNfR2V0U3RyMjU1LCBmaWxlbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDTWFwVHlwZUNyZWF0b3Ioc2VsZi0+aW5zdCwgdHlwZSwgY3JlYXRvciwgZmlsZW5hbWUsICZlbnRyeSkpICE9IDAgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8mTyZPJmxPJk8mTyZPJk8mIiwgZW50cnkudmVyc2lvbiwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5maWxlVHlwZSwKLQkJUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVDcmVhdG9yLCAKLQkJUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LnBvc3RDcmVhdG9yLCAKLQkJZW50cnkuZmxhZ3MsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5leHRlbnNpb24sCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5jcmVhdG9yQXBwTmFtZSwKLQkJUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LnBvc3RBcHBOYW1lLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuTUlNRVR5cGUsCi0JCVB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5lbnRyeU5hbWUpOworICAgIE9TU3RhdHVzIGVycjsKKyAgICBPU1R5cGUgdHlwZSwgY3JlYXRvcjsKKyAgICBTdHIyNTUgZmlsZW5hbWU7CisgICAgSUNNYXBFbnRyeSBlbnRyeTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICgoZXJyPUlDTWFwVHlwZUNyZWF0b3Ioc2VsZi0+aW5zdCwgdHlwZSwgY3JlYXRvciwgZmlsZW5hbWUsICZlbnRyeSkpICE9IDAgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8mTyZPJmxPJk8mTyZPJk8mIiwgZW50cnkudmVyc2lvbiwKKyAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGVudHJ5LmZpbGVUeXBlLAorICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZW50cnkuZmlsZUNyZWF0b3IsCisgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBlbnRyeS5wb3N0Q3JlYXRvciwKKyAgICAgICAgZW50cnkuZmxhZ3MsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5leHRlbnNpb24sCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5jcmVhdG9yQXBwTmFtZSwKKyAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIGVudHJ5LnBvc3RBcHBOYW1lLAorICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZW50cnkuTUlNRVR5cGUsCisgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBlbnRyeS5lbnRyeU5hbWUpOwogfQogCiAKIHN0YXRpYyBzdHJ1Y3QgUHlNZXRob2REZWYgaWNpX21ldGhvZHNbXSA9IHsKLSB7IklDR2V0U2VlZCIsCShQeUNGdW5jdGlvbilpY2lfSUNHZXRTZWVkLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0dldFNlZWRfX2RvY19ffSwKLSB7IklDQmVnaW4iLAkoUHlDRnVuY3Rpb24paWNpX0lDQmVnaW4sCU1FVEhfVkFSQVJHUywJaWNpX0lDQmVnaW5fX2RvY19ffSwKLSB7IklDRmluZFByZWZIYW5kbGUiLAkoUHlDRnVuY3Rpb24paWNpX0lDRmluZFByZWZIYW5kbGUsCU1FVEhfVkFSQVJHUywJaWNpX0lDRmluZFByZWZIYW5kbGVfX2RvY19ffSwKLSB7IklDU2V0UHJlZiIsCShQeUNGdW5jdGlvbilpY2lfSUNTZXRQcmVmLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ1NldFByZWZfX2RvY19ffSwKLSB7IklDQ291bnRQcmVmIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0NvdW50UHJlZiwJTUVUSF9WQVJBUkdTLAlpY2lfSUNDb3VudFByZWZfX2RvY19ffSwKLSB7IklDR2V0SW5kUHJlZiIsCShQeUNGdW5jdGlvbilpY2lfSUNHZXRJbmRQcmVmLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0dldEluZFByZWZfX2RvY19ffSwKLSB7IklDRGVsZXRlUHJlZiIsCShQeUNGdW5jdGlvbilpY2lfSUNEZWxldGVQcmVmLAlNRVRIX1ZBUkFSR1MsCWljaV9JQ0RlbGV0ZVByZWZfX2RvY19ffSwKLSB7IklDRW5kIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0VuZCwJTUVUSF9WQVJBUkdTLAlpY2lfSUNFbmRfX2RvY19ffSwKLSB7IklDRWRpdFByZWZlcmVuY2VzIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0VkaXRQcmVmZXJlbmNlcywJTUVUSF9WQVJBUkdTLAlpY2lfSUNFZGl0UHJlZmVyZW5jZXNfX2RvY19ffSwKLSB7IklDUGFyc2VVUkwiLAkoUHlDRnVuY3Rpb24paWNpX0lDUGFyc2VVUkwsCU1FVEhfVkFSQVJHUywJaWNpX0lDUGFyc2VVUkxfX2RvY19ffSwKLSB7IklDTGF1bmNoVVJMIiwJKFB5Q0Z1bmN0aW9uKWljaV9JQ0xhdW5jaFVSTCwJTUVUSF9WQVJBUkdTLAlpY2lfSUNMYXVuY2hVUkxfX2RvY19ffSwKLSB7IklDTWFwRmlsZW5hbWUiLAkoUHlDRnVuY3Rpb24paWNpX0lDTWFwRmlsZW5hbWUsCU1FVEhfVkFSQVJHUywJaWNpX0lDTWFwRmlsZW5hbWVfX2RvY19ffSwKLSB7IklDTWFwVHlwZUNyZWF0b3IiLAkoUHlDRnVuY3Rpb24paWNpX0lDTWFwVHlwZUNyZWF0b3IsCU1FVEhfVkFSQVJHUywJaWNpX0lDTWFwVHlwZUNyZWF0b3JfX2RvY19ffSwKLSAKLQl7TlVMTCwJCU5VTEx9CQkvKiBzZW50aW5lbCAqLworIHsiSUNHZXRTZWVkIiwgIChQeUNGdW5jdGlvbilpY2lfSUNHZXRTZWVkLCAgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0dldFNlZWRfX2RvY19ffSwKKyB7IklDQmVnaW4iLCAgICAoUHlDRnVuY3Rpb24paWNpX0lDQmVnaW4sICAgICAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNCZWdpbl9fZG9jX199LAorIHsiSUNGaW5kUHJlZkhhbmRsZSIsICAgKFB5Q0Z1bmN0aW9uKWljaV9JQ0ZpbmRQcmVmSGFuZGxlLCAgICAgIE1FVEhfVkFSQVJHUywgICBpY2lfSUNGaW5kUHJlZkhhbmRsZV9fZG9jX199LAorIHsiSUNTZXRQcmVmIiwgIChQeUNGdW5jdGlvbilpY2lfSUNTZXRQcmVmLCAgICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ1NldFByZWZfX2RvY19ffSwKKyB7IklDQ291bnRQcmVmIiwgICAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNDb3VudFByZWYsICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0NvdW50UHJlZl9fZG9jX199LAorIHsiSUNHZXRJbmRQcmVmIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWljaV9JQ0dldEluZFByZWYsICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDR2V0SW5kUHJlZl9fZG9jX199LAorIHsiSUNEZWxldGVQcmVmIiwgICAgICAgKFB5Q0Z1bmN0aW9uKWljaV9JQ0RlbGV0ZVByZWYsICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDRGVsZXRlUHJlZl9fZG9jX199LAorIHsiSUNFbmQiLCAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNFbmQsIE1FVEhfVkFSQVJHUywgICBpY2lfSUNFbmRfX2RvY19ffSwKKyB7IklDRWRpdFByZWZlcmVuY2VzIiwgIChQeUNGdW5jdGlvbilpY2lfSUNFZGl0UHJlZmVyZW5jZXMsICAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDRWRpdFByZWZlcmVuY2VzX19kb2NfX30sCisgeyJJQ1BhcnNlVVJMIiwgKFB5Q0Z1bmN0aW9uKWljaV9JQ1BhcnNlVVJMLCAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDUGFyc2VVUkxfX2RvY19ffSwKKyB7IklDTGF1bmNoVVJMIiwgICAgICAgIChQeUNGdW5jdGlvbilpY2lfSUNMYXVuY2hVUkwsICAgTUVUSF9WQVJBUkdTLCAgIGljaV9JQ0xhdW5jaFVSTF9fZG9jX199LAorIHsiSUNNYXBGaWxlbmFtZSIsICAgICAgKFB5Q0Z1bmN0aW9uKWljaV9JQ01hcEZpbGVuYW1lLCBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDTWFwRmlsZW5hbWVfX2RvY19ffSwKKyB7IklDTWFwVHlwZUNyZWF0b3IiLCAgIChQeUNGdW5jdGlvbilpY2lfSUNNYXBUeXBlQ3JlYXRvciwgICAgICBNRVRIX1ZBUkFSR1MsICAgaWNpX0lDTWFwVHlwZUNyZWF0b3JfX2RvY19ffSwKKworICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAvKiAtLS0tLS0tLS0tICovCkBAIC0zNTksNjEgKzM1OSw2MSBAQAogc3RhdGljIGljaW9iamVjdCAqCiBuZXdpY2lvYmplY3QoT1NUeXBlIGNyZWF0b3IpCiB7Ci0JaWNpb2JqZWN0ICpzZWxmOwotCU9TU3RhdHVzIGVycjsKLQkKLQlzZWxmID0gUHlPYmplY3RfTkVXKGljaW9iamVjdCwgJkljaXR5cGUpOwotCWlmIChzZWxmID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWlmICgoZXJyPUlDU3RhcnQoJnNlbGYtPmluc3QsIGNyZWF0b3IpKSAhPSAwICkgewotCQkodm9pZClQeU1hY19FcnJvcihlcnIpOwotCQlQeU9iamVjdF9ERUwoc2VsZik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gc2VsZjsKKyAgICBpY2lvYmplY3QgKnNlbGY7CisgICAgT1NTdGF0dXMgZXJyOworCisgICAgc2VsZiA9IFB5T2JqZWN0X05FVyhpY2lvYmplY3QsICZJY2l0eXBlKTsKKyAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoKGVycj1JQ1N0YXJ0KCZzZWxmLT5pbnN0LCBjcmVhdG9yKSkgIT0gMCApIHsKKyAgICAgICAgKHZvaWQpUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgUHlPYmplY3RfREVMKHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7CiB9CiAKIAogc3RhdGljIHZvaWQKIGljaV9kZWFsbG9jKGljaW9iamVjdCAqc2VsZikKIHsKLQkodm9pZClJQ1N0b3Aoc2VsZi0+aW5zdCk7Ci0JUHlPYmplY3RfREVMKHNlbGYpOworICAgICh2b2lkKUlDU3RvcChzZWxmLT5pbnN0KTsKKyAgICBQeU9iamVjdF9ERUwoc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY2lfZ2V0YXR0cihpY2lvYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2QoaWNpX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKGljaV9tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKIH0KIAotc3RhdGljIGNoYXIgSWNpdHlwZV9fZG9jX19bXSA9IAorc3RhdGljIGNoYXIgSWNpdHlwZV9fZG9jX19bXSA9CiAiSW50ZXJuZXQgQ29uZmlnIGluc3RhbmNlIgogOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IEljaXR5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKLQkwLAkJCQkvKm9iX3NpemUqLwotCSJpY2dsdWUuaWNfaW5zdGFuY2UiLAkJLyp0cF9uYW1lKi8KLQlzaXplb2YoaWNpb2JqZWN0KSwJCS8qdHBfYmFzaWNzaXplKi8KLQkwLAkJCQkvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpaWNpX2RlYWxsb2MsCS8qdHBfZGVhbGxvYyovCi0JKHByaW50ZnVuYykwLAkJLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKWljaV9nZXRhdHRyLAkvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLAkvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKTAsCQkvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykwLAkJLyp0cF9yZXByKi8KLQkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KLQkwLAkJLyp0cF9hc19zZXF1ZW5jZSovCi0JMCwJCS8qdHBfYXNfbWFwcGluZyovCi0JKGhhc2hmdW5jKTAsCQkvKnRwX2hhc2gqLwotCSh0ZXJuYXJ5ZnVuYykwLAkJLyp0cF9jYWxsKi8KLQkocmVwcmZ1bmMpMCwJCS8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb2Jfc2l6ZSovCisgICAgImljZ2x1ZS5pY19pbnN0YW5jZSIsICAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoaWNpb2JqZWN0KSwgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKWljaV9kZWFsbG9jLCAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgKHByaW50ZnVuYykwLCAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylpY2lfZ2V0YXR0ciwgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsICAgICAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKTAsICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykwLCAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgKHRlcm5hcnlmdW5jKTAsICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgKHJlcHJmdW5jKTAsICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KIAotCS8qIFNwYWNlIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCi0JMEwsMEwsMEwsMEwsCi0JSWNpdHlwZV9fZG9jX18gLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKyAgICAvKiBTcGFjZSBmb3IgZnV0dXJlIGV4cGFuc2lvbiAqLworICAgIDBMLDBMLDBMLDBMLAorICAgIEljaXR5cGVfX2RvY19fIC8qIERvY3VtZW50YXRpb24gc3RyaW5nICovCiB9OwogCiAvKiBFbmQgb2YgY29kZSBmb3IgaWNfaW5zdGFuY2Ugb2JqZWN0cyAqLwpAQCAtNDI3LDUyICs0MjcsNTIgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpY19JQ1N0YXJ0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQlPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgY3JlYXRvcjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyYiLCBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKW5ld2ljaW9iamVjdChjcmVhdG9yKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mIiwgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdpY2lvYmplY3QoY3JlYXRvcik7CiB9CiAKIC8qIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KIAogc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBpY19tZXRob2RzW10gPSB7Ci0JeyJJQ1N0YXJ0IiwJKFB5Q0Z1bmN0aW9uKWljX0lDU3RhcnQsCU1FVEhfVkFSQVJHUywJaWNfSUNTdGFydF9fZG9jX199LAotIAotCXtOVUxMLAkgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9CQkvKiBzZW50aW5lbCAqLworICAgIHsiSUNTdGFydCIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKWljX0lDU3RhcnQsICAgICAgICBNRVRIX1ZBUkFSR1MsICAgaWNfSUNTdGFydF9fZG9jX199LAorCisgICAge05VTEwsICAgICAgIChQeUNGdW5jdGlvbilOVUxMLCAwLCBOVUxMfSAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiAKIC8qIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbW9kdWxlICgqbXVzdCogYmUgY2FsbGVkIGluaXRpY2dsdWUpICovCiAKLXN0YXRpYyBjaGFyIGljZ2x1ZV9tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0gCitzdGF0aWMgY2hhciBpY2dsdWVfbW9kdWxlX2RvY3VtZW50YXRpb25bXSA9CiAiSW1wbGVtZW50cyBsb3ctbGV2ZWwgSW50ZXJuZXQgQ29uZmlnIGludGVyZmFjZSIKIDsKIAogdm9pZAogaW5pdGljZ2x1ZSh2b2lkKQogewotCVB5T2JqZWN0ICptLCAqZDsKLQkKLQlpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIGljZ2x1ZSBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSkKLQkJcmV0dXJuOworICAgIFB5T2JqZWN0ICptLCAqZDsKIAotCS8qIENyZWF0ZSB0aGUgbW9kdWxlIGFuZCBhZGQgdGhlIGZ1bmN0aW9ucyAqLwotCW0gPSBQeV9Jbml0TW9kdWxlNCgiaWNnbHVlIiwgaWNfbWV0aG9kcywKLQkJaWNnbHVlX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICBpZiAoUHlFcnJfV2FyblB5M2soIkluIDMueCwgdGhlIGljZ2x1ZSBtb2R1bGUgaXMgcmVtb3ZlZC4iLCAxKSkKKyAgICAgICAgcmV0dXJuOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKEVycm9yT2JqZWN0ID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpICE9IDApCi0JCXJldHVybjsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoImljZ2x1ZSIsIGljX21ldGhvZHMsCisgICAgICAgIGljZ2x1ZV9tb2R1bGVfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgKFB5T2JqZWN0KilOVUxMLFBZVEhPTl9BUElfVkVSU0lPTik7CiAKLQkvKiBYWFhYIEFkZCBjb25zdGFudHMgaGVyZSAqLwotCQotCS8qIENoZWNrIGZvciBlcnJvcnMgKi8KLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBtb2R1bGUgaWNnbHVlIik7CisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBFcnJvck9iamVjdCA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKEVycm9yT2JqZWN0ID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpICE9IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBDaGVjayBmb3IgZXJyb3JzICovCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIGljZ2x1ZSIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pY24vX0ljbm1vZHVsZS5jIGIvTWFjL01vZHVsZXMvaWNuL19JY25tb2R1bGUuYwppbmRleCA4MDIwMWEyLi42OTY3YWU0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pY24vX0ljbm1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2ljbi9fSWNubW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIzLDE1NjEgKzIzLDE1NjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0Q0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNJY29uSGFuZGxlIF9ydjsKLQlTSW50MTYgaWNvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDSWNvbkhhbmRsZSBfcnY7CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgR2V0Q0ljb24KLQlQeU1hY19QUkVDSEVDSyhHZXRDSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDSWNvbihpY29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENJY29uKGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90Q0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgdGhlUmVjdDsKLQlDSWNvbkhhbmRsZSB0aGVJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgQ0ljb25IYW5kbGUgdGhlSWNvbjsKICNpZm5kZWYgUGxvdENJY29uCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdENJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90Q0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb24pKQotCQlyZXR1cm4gTlVMTDsKLQlQbG90Q0ljb24oJnRoZVJlY3QsCi0JICAgICAgICAgIHRoZUljb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBsb3RDSWNvbigmdGhlUmVjdCwKKyAgICAgICAgICAgICAgdGhlSWNvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9EaXNwb3NlQ0ljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNJY29uSGFuZGxlIHRoZUljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENJY29uSGFuZGxlIHRoZUljb247CiAjaWZuZGVmIERpc3Bvc2VDSWNvbgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZUNJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZUNJY29uKHRoZUljb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDSWNvbih0aGVJY29uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBTSW50MTYgaWNvbklEOwogI2lmbmRlZiBHZXRJY29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEljb24oaWNvbklEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRJY29uKGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCB0aGVSZWN0OwotCUhhbmRsZSB0aGVJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgSGFuZGxlIHRoZUljb247CiAjaWZuZGVmIFBsb3RJY29uCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdEljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFBsb3RJY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGxvdEljb24oJnRoZVJlY3QsCi0JICAgICAgICAgdGhlSWNvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGxvdEljb24oJnRoZVJlY3QsCisgICAgICAgICAgICAgdGhlSWNvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JU0ludDE2IHRoZVJlc0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgU0ludDE2IHRoZVJlc0lEOwogI2lmbmRlZiBQbG90SWNvbklECi0JUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25JRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25JRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90SWNvbklEKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICB0aGVSZXNJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlUmVzSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25JRCgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgdGhlUmVzSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9OZXdJY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOwogI2lmbmRlZiBOZXdJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhOZXdJY29uU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld0ljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0ljb25TdWl0ZSgmdGhlSWNvblN1aXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblN1aXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld0ljb25TdWl0ZSgmdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblN1aXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fQWRkSWNvblRvU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHRoZUljb25EYXRhOwotCUljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKLQlSZXNUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHRoZUljb25EYXRhOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEFkZEljb25Ub1N1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soQWRkSWNvblRvU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEljb25Ub1N1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbkRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkSWNvblRvU3VpdGUodGhlSWNvbkRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZEljb25Ub1N1aXRlKHRoZUljb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25Gcm9tU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHRoZUljb25EYXRhOwotCUljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKLQlSZXNUeXBlIHRoZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHRoZUljb25EYXRhOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEdldEljb25Gcm9tU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uRnJvbVN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uRnJvbVN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25Gcm9tU3VpdGUoJnRoZUljb25EYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZVR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvbkZyb21TdWl0ZSgmdGhlSWNvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25EYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7Ci0JU0ludDE2IHRoZVJlc0lEOwotCUljb25TZWxlY3RvclZhbHVlIHNlbGVjdG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgU0ludDE2IHRoZVJlc0lEOworICAgIEljb25TZWxlY3RvclZhbHVlIHNlbGVjdG9yOwogI2lmbmRlZiBHZXRJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uU3VpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25TdWl0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVSZXNJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25TdWl0ZSgmdGhlSWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgdGhlUmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25TdWl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlUmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uU3VpdGUoJnRoZUljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZVJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uU3VpdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9EaXNwb3NlSWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7Ci0JQm9vbGVhbiBkaXNwb3NlRGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOworICAgIEJvb2xlYW4gZGlzcG9zZURhdGE7CiAjaWZuZGVmIERpc3Bvc2VJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcG9zZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGlzcG9zZUljb25TdWl0ZSh0aGVJY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZURhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcG9zZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGlzcG9zZUljb25TdWl0ZSh0aGVJY29uU3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZURhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvblN1aXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CiAjaWZuZGVmIFBsb3RJY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhQbG90SWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90SWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBsb3RJY29uU3VpdGUoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25TdWl0ZSgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fTG9hZEljb25DYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBJY29uQ2FjaGVSZWYgdGhlSWNvbkNhY2hlOwogI2lmbmRlZiBMb2FkSWNvbkNhY2hlCi0JUHlNYWNfUFJFQ0hFQ0soTG9hZEljb25DYWNoZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9hZEljb25DYWNoZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25DYWNoZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkSWNvbkNhY2hlKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICB0aGVJY29uQ2FjaGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvbkNhY2hlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRJY29uQ2FjaGUoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25DYWNoZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldExhYmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBsYWJlbE51bWJlcjsKLQlSR0JDb2xvciBsYWJlbENvbG9yOwotCVN0cjI1NSBsYWJlbFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgbGFiZWxOdW1iZXI7CisgICAgUkdCQ29sb3IgbGFiZWxDb2xvcjsKKyAgICBTdHIyNTUgbGFiZWxTdHJpbmc7CiAjaWZuZGVmIEdldExhYmVsCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TGFiZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldExhYmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsYWJlbE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBsYWJlbFN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRMYWJlbChsYWJlbE51bWJlciwKLQkgICAgICAgICAgICAgICAgJmxhYmVsQ29sb3IsCi0JICAgICAgICAgICAgICAgIGxhYmVsU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbGFiZWxDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxhYmVsTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGxhYmVsU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldExhYmVsKGxhYmVsTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAmbGFiZWxDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgbGFiZWxTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZsYWJlbENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUHRJbkljb25JRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGVzdFB0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGVzdFB0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgUHRJbkljb25JRAotCVB5TWFjX1BSRUNIRUNLKFB0SW5JY29uSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5JY29uSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJbkljb25JRCh0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgIGljb25JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJbkljb25JRCh0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgIGljb25JRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1B0SW5JY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHRlc3RQdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRlc3RQdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGU7CiAjaWZuZGVmIFB0SW5JY29uU3VpdGUKLQlQeU1hY19QUkVDSEVDSyhQdEluSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJbkljb25TdWl0ZSh0ZXN0UHQsCi0JICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25TdWl0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGVzdFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBQdEluSWNvblN1aXRlKHRlc3RQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVjdEluSWNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHRlc3RSZWN0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmVjdCB0ZXN0UmVjdDsKKyAgICBSZWN0IGljb25SZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIFNJbnQxNiBpY29uSUQ7CiAjaWZuZGVmIFJlY3RJbkljb25JRAotCVB5TWFjX1BSRUNIRUNLKFJlY3RJbkljb25JRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvbklEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWN0SW5JY29uSUQoJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICBpY29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5JY29uSUQoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICBpY29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWN0SW5JY29uU3VpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgdGVzdFJlY3Q7Ci0JUmVjdCBpY29uUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHRlc3RSZWN0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKICNpZm5kZWYgUmVjdEluSWNvblN1aXRlCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblN1aXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWN0SW5JY29uU3VpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVjdEluSWNvblN1aXRlKCZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5JY29uU3VpdGUoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uU3VpdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uSURUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JU0ludDE2IGljb25JRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgU0ludDE2IGljb25JRDsKICNpZm5kZWYgSWNvbklEVG9SZ24KLQlQeU1hY19QUkVDSEVDSyhJY29uSURUb1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvbklEVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvbklEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25JRFRvUmduKHRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgaWNvbklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSWNvbklEVG9SZ24odGhlUmduLAorICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICBpY29uSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uU3VpdGVUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZTsKICNpZm5kZWYgSWNvblN1aXRlVG9SZ24KLQlQeU1hY19QUkVDSEVDSyhJY29uU3VpdGVUb1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvblN1aXRlVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uU3VpdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblN1aXRlVG9SZ24odGhlUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uU3VpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25TdWl0ZVRvUmduKHRoZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fU2V0U3VpdGVMYWJlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uU3VpdGVSZWYgdGhlU3VpdGU7Ci0JU0ludDE2IHRoZUxhYmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKKyAgICBTSW50MTYgdGhlTGFiZWw7CiAjaWZuZGVmIFNldFN1aXRlTGFiZWwKLQlQeU1hY19QUkVDSEVDSyhTZXRTdWl0ZUxhYmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRTdWl0ZUxhYmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRTdWl0ZUxhYmVsKHRoZVN1aXRlLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldFN1aXRlTGFiZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7Ci0JSWNvblN1aXRlUmVmIHRoZVN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OworICAgIEljb25TdWl0ZVJlZiB0aGVTdWl0ZTsKICNpZm5kZWYgR2V0U3VpdGVMYWJlbAotCVB5TWFjX1BSRUNIRUNLKEdldFN1aXRlTGFiZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1aXRlTGFiZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVN1aXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0U3VpdGVMYWJlbCh0aGVTdWl0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1Bsb3RJY29uSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JSGFuZGxlIHRoZUljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBIYW5kbGUgdGhlSWNvbjsKICNpZm5kZWYgUGxvdEljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhQbG90SWNvbkhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGxvdEljb25IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFBsb3RJY29uSGFuZGxlKCZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAotCSAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25IYW5kbGUoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90U0lDTkhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUhhbmRsZSB0aGVTSUNOOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFJlY3QgdGhlUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07CisgICAgSGFuZGxlIHRoZVNJQ047CiAjaWZuZGVmIFBsb3RTSUNOSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdFNJQ05IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBsb3RTSUNOSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlU0lDTikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90U0lDTkhhbmRsZSgmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlU0lDTik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVTSUNOKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RTSUNOSGFuZGxlKCZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVTSUNOKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUGxvdENJY29uSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJlY3QgdGhlUmVjdDsKLQlJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKLQlJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm07Ci0JQ0ljb25IYW5kbGUgdGhlQ0ljb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBDSWNvbkhhbmRsZSB0aGVDSWNvbjsKICNpZm5kZWYgUGxvdENJY29uSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUGxvdENJY29uSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90Q0ljb25IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDSWNvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90Q0ljb25IYW5kbGUoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNJY29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFBsb3RDSWNvbkhhbmRsZSgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ0ljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9JY29uUmVmVG9JY29uRmFtaWx5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKLQlJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOwotCUljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CiAjaWZuZGVmIEljb25SZWZUb0ljb25GYW1pbHkKLQlQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9JY29uRmFtaWx5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9JY29uRmFtaWx5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblJlZlRvSWNvbkZhbWlseSh0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25SZWZUb0ljb25GYW1pbHkodGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ljb25GYW1pbHlUb0ljb25TdWl0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKLQlJY29uU3VpdGVSZWYgaWNvblN1aXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOworICAgIEljb25TdWl0ZVJlZiBpY29uU3VpdGU7CiAjaWZuZGVmIEljb25GYW1pbHlUb0ljb25TdWl0ZQotCVB5TWFjX1BSRUNIRUNLKEljb25GYW1pbHlUb0ljb25TdWl0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSWNvbkZhbWlseVRvSWNvblN1aXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvbkZhbWlseVRvSWNvblN1aXRlKGljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TdWl0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25TdWl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hJY29ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJY29uRmFtaWx5VG9JY29uU3VpdGUoaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblN1aXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvblN1aXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25TdWl0ZVJlZiBpY29uU3VpdGU7Ci0JSWNvblNlbGVjdG9yVmFsdWUgd2hpY2hJY29uczsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblN1aXRlUmVmIGljb25TdWl0ZTsKKyAgICBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKICNpZm5kZWYgSWNvblN1aXRlVG9JY29uRmFtaWx5Ci0JUHlNYWNfUFJFQ0hFQ0soSWNvblN1aXRlVG9JY29uRmFtaWx5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uU3VpdGVUb0ljb25GYW1pbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaEljb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEljb25TdWl0ZVRvSWNvbkZhbWlseShpY29uU3VpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEljb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoSWNvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSWNvblN1aXRlVG9JY29uRmFtaWx5KGljb25TdWl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoSWNvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9TZXRJY29uRmFtaWx5RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JT1NUeXBlIGljb25UeXBlOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIFNldEljb25GYW1pbHlEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SWNvbkZhbWlseURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEljb25GYW1pbHlEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRJY29uRmFtaWx5RGF0YShpY29uRmFtaWx5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldEljb25GYW1pbHlEYXRhKGljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvbkZhbWlseURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCU9TVHlwZSBpY29uVHlwZTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgT1NUeXBlIGljb25UeXBlOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBHZXRJY29uRmFtaWx5RGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldEljb25GYW1pbHlEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uRmFtaWx5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvbkZhbWlseURhdGEoaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uRmFtaWx5RGF0YShpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZPd25lcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOwotCVVJbnQxNiBvd25lcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOworICAgIFVJbnQxNiBvd25lcnM7CiAjaWZuZGVmIEdldEljb25SZWZPd25lcnMKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmT3duZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmT3duZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEljb25SZWZPd25lcnModGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3duZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvd25lcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25SZWZPd25lcnModGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3duZXJzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcnMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9BY3F1aXJlSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBBY3F1aXJlSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKEFjcXVpcmVJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3F1aXJlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBY3F1aXJlSWNvblJlZih0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBY3F1aXJlSWNvblJlZih0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVsZWFzZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVsZWFzZUljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhSZWxlYXNlSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVsZWFzZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVsZWFzZUljb25SZWYodGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZUljb25SZWYodGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZGcm9tRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgdGhlRmlsZTsKLQlJY29uUmVmIHRoZUljb25SZWY7Ci0JU0ludDE2IHRoZUxhYmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKKyAgICBTSW50MTYgdGhlTGFiZWw7CiAjaWZuZGVmIEdldEljb25SZWZGcm9tRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZGcm9tRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZkZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uUmVmRnJvbUZpbGUoJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvblJlZkZyb21GaWxlKCZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTGFiZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHZSZWZOdW07Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBHZXRJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJY29uUmVmKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEljb25SZWYodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEljb25SZWZGcm9tRm9sZGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiB2UmVmTnVtOwotCVNJbnQzMiBwYXJlbnRGb2xkZXJJRDsKLQlTSW50MzIgZm9sZGVySUQ7Ci0JU0ludDggYXR0cmlidXRlczsKLQlTSW50OCBhY2Nlc3NQcml2aWxlZ2VzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBTSW50MzIgcGFyZW50Rm9sZGVySUQ7CisgICAgU0ludDMyIGZvbGRlcklEOworICAgIFNJbnQ4IGF0dHJpYnV0ZXM7CisgICAgU0ludDggYWNjZXNzUHJpdmlsZWdlczsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIEdldEljb25SZWZGcm9tRm9sZGVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZkZyb21Gb2xkZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25SZWZGcm9tRm9sZGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsbGJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRGb2xkZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbGRlcklELAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjY2Vzc1ByaXZpbGVnZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvblJlZkZyb21Gb2xkZXIodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlcklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQcml2aWxlZ2VzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsbGJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRGb2xkZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbGRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjY2Vzc1ByaXZpbGVnZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SWNvblJlZkZyb21Gb2xkZXIodlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Rm9sZGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGRlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NQcml2aWxlZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7Ci0JSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgaWNvblR5cGU7CisgICAgSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkKLQlQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbkZhbWlseSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseShjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVJY29uUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpY29uRmFtaWx5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmFtaWx5KGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uRmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGljb25UeXBlOwotCUZTU3BlYyByZXNvdXJjZUZpbGU7Ci0JU0ludDE2IHJlc291cmNlSUQ7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1NwZWMgcmVzb3VyY2VGaWxlOworICAgIFNJbnQxNiByZXNvdXJjZUlEOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZShjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZShjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb3VyY2VGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlZ2lzdGVySWNvblJlZkZyb21GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7Ci0JRlNSZWYgaWNvbkZpbGU7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1JlZiBpY29uRmlsZTsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZgotCVB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZihjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21GU1JlZihjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9VbnJlZ2lzdGVySWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGljb25UeXBlOwogI2lmbmRlZiBVbnJlZ2lzdGVySWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFVucmVnaXN0ZXJJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbnJlZ2lzdGVySWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5yZWdpc3Rlckljb25SZWYoY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVbnJlZ2lzdGVySWNvblJlZihjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1VwZGF0ZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgVXBkYXRlSWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZUljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlSWNvblJlZih0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVJY29uUmVmKHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9PdmVycmlkZUljb25SZWZGcm9tUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiB0aGVJY29uUmVmOwotCUZTU3BlYyByZXNvdXJjZUZpbGU7Ci0JU0ludDE2IHJlc291cmNlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOworICAgIEZTU3BlYyByZXNvdXJjZUZpbGU7CisgICAgU0ludDE2IHJlc291cmNlSUQ7CiAjaWZuZGVmIE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSh0aGVJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSh0aGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9PdmVycmlkZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBvbGRJY29uUmVmOwotCUljb25SZWYgbmV3SWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIG9sZEljb25SZWY7CisgICAgSWNvblJlZiBuZXdJY29uUmVmOwogI2lmbmRlZiBPdmVycmlkZUljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhPdmVycmlkZUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE92ZXJyaWRlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvbGRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0ljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT3ZlcnJpZGVJY29uUmVmKG9sZEljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICBuZXdJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvbGRJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0ljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT3ZlcnJpZGVJY29uUmVmKG9sZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVtb3ZlSWNvblJlZk92ZXJyaWRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIFJlbW92ZUljb25SZWZPdmVycmlkZQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZUljb25SZWZPdmVycmlkZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlSWNvblJlZk92ZXJyaWRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbW92ZUljb25SZWZPdmVycmlkZSh0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVJY29uUmVmT3ZlcnJpZGUodGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0NvbXBvc2l0ZUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBiYWNrZ3JvdW5kSWNvblJlZjsKLQlJY29uUmVmIGZvcmVncm91bmRJY29uUmVmOwotCUljb25SZWYgY29tcG9zaXRlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIGJhY2tncm91bmRJY29uUmVmOworICAgIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWY7CisgICAgSWNvblJlZiBjb21wb3NpdGVJY29uUmVmOwogI2lmbmRlZiBDb21wb3NpdGVJY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcG9zaXRlSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcG9zaXRlSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZiYWNrZ3JvdW5kSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZmb3JlZ3JvdW5kSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb21wb3NpdGVJY29uUmVmKGJhY2tncm91bmRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVncm91bmRJY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZjb21wb3NpdGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29tcG9zaXRlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja2dyb3VuZEljb25SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZm9yZWdyb3VuZEljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29tcG9zaXRlSWNvblJlZihiYWNrZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9zaXRlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGNvbXBvc2l0ZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9Jc0ljb25SZWZDb21wb3NpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblJlZiBjb21wb3NpdGVJY29uUmVmOwotCUljb25SZWYgYmFja2dyb3VuZEljb25SZWY7Ci0JSWNvblJlZiBmb3JlZ3JvdW5kSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJY29uUmVmIGNvbXBvc2l0ZUljb25SZWY7CisgICAgSWNvblJlZiBiYWNrZ3JvdW5kSWNvblJlZjsKKyAgICBJY29uUmVmIGZvcmVncm91bmRJY29uUmVmOwogI2lmbmRlZiBJc0ljb25SZWZDb21wb3NpdGUKLQlQeU1hY19QUkVDSEVDSyhJc0ljb25SZWZDb21wb3NpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzSWNvblJlZkNvbXBvc2l0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29tcG9zaXRlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJc0ljb25SZWZDb21wb3NpdGUoY29tcG9zaXRlSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrZ3JvdW5kSWNvblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JlZ3JvdW5kSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYmFja2dyb3VuZEljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZm9yZWdyb3VuZEljb25SZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wb3NpdGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IElzSWNvblJlZkNvbXBvc2l0ZShjb21wb3NpdGVJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tncm91bmRJY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmVncm91bmRJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWNrZ3JvdW5kSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBmb3JlZ3JvdW5kSWNvblJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0lzVmFsaWRJY29uUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgSXNWYWxpZEljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZEljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1ZhbGlkSWNvblJlZih0aGVJY29uUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzVmFsaWRJY29uUmVmKHRoZUljb25SZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QbG90SWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZWN0IHRoZVJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmVjdCB0aGVSZWN0OworICAgIEljb25BbGlnbm1lbnRUeXBlIGFsaWduOworICAgIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybTsKKyAgICBJY29uU2VydmljZXNVc2FnZUZsYWdzIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBQbG90SWNvblJlZgotCVB5TWFjX1BSRUNIRUNLKFBsb3RJY29uUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQbG90SWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRoZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQbG90SWNvblJlZigmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSwKLQkgICAgICAgICAgICAgICAgICAgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGxvdEljb25SZWYoJnRoZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9QdEluSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGVzdFB0OwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGVzdFB0OworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgUHRJbkljb25SZWYKLQlQeU1hY19QUkVDSEVDSyhQdEluSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRJbkljb25SZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRlc3RQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluSWNvblJlZigmdGVzdFB0LAotCSAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICBhbGlnbiwKLQkgICAgICAgICAgICAgICAgICB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0ZXN0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJbkljb25SZWYoJnRlc3RQdCwKKyAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVjdEluSWNvblJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlSZWN0IGljb25SZWN0OwotCUljb25BbGlnbm1lbnRUeXBlIGFsaWduOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgUmVjdCBpY29uUmVjdDsKKyAgICBJY29uQWxpZ25tZW50VHlwZSBhbGlnbjsKKyAgICBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3M7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBSZWN0SW5JY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdEluSWNvblJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZWN0SW5JY29uUmVmKCZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlY3RJbkljb25SZWYoJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgJmljb25SZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICBpY29uU2VydmljZXNVc2FnZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0ljb25SZWZUb1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlSZ25IYW5kbGUgdGhlUmduOwotCVJlY3QgaWNvblJlY3Q7Ci0JSWNvbkFsaWdubWVudFR5cGUgYWxpZ247Ci0JSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzOwotCUljb25SZWYgdGhlSWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgdGhlUmduOworICAgIFJlY3QgaWNvblJlY3Q7CisgICAgSWNvbkFsaWdubWVudFR5cGUgYWxpZ247CisgICAgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyBpY29uU2VydmljZXNVc2FnZUZsYWdzOworICAgIEljb25SZWYgdGhlSWNvblJlZjsKICNpZm5kZWYgSWNvblJlZlRvUmduCi0JUHlNYWNfUFJFQ0hFQ0soSWNvblJlZlRvUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJY29uUmVmVG9SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmljb25SZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSWNvblJlZlRvUmduKHRoZVJnbiwKLQkgICAgICAgICAgICAgICAgICAgICZpY29uUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgIGFsaWduLAotCSAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKLQkgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpY29uUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVJY29uUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEljb25SZWZUb1Jnbih0aGVSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAmaWNvblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVJY29uUmVmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblNpemVzRnJvbUljb25SZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQ7Ci0JSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyOwotCUljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKLQlJY29uUmVmIHRoZUljb25SZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQ7CisgICAgSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyOworICAgIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFnczsKKyAgICBJY29uUmVmIHRoZUljb25SZWY7CiAjaWZuZGVmIEdldEljb25TaXplc0Zyb21JY29uUmVmCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblNpemVzRnJvbUljb25SZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEljb25TaXplc0Zyb21JY29uUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWNvblNlbGVjdG9ySW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VydmljZXNVc2FnZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUljb25SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SWNvblNpemVzRnJvbUljb25SZWYoaWNvblNlbGVjdG9ySW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VsZWN0b3JPdXRwdXRQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUljb25SZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGljb25TZWxlY3Rvck91dHB1dFB0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uU2VsZWN0b3JJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlSWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJY29uU2l6ZXNGcm9tSWNvblJlZihpY29uU2VsZWN0b3JJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25TZWxlY3Rvck91dHB1dFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblNlbGVjdG9yT3V0cHV0UHRyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fRmx1c2hJY29uUmVmcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgY3JlYXRvcjsKLQlPU1R5cGUgaWNvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgT1NUeXBlIGljb25UeXBlOwogI2lmbmRlZiBGbHVzaEljb25SZWZzCi0JUHlNYWNfUFJFQ0hFQ0soRmx1c2hJY29uUmVmcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmx1c2hJY29uUmVmcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hJY29uUmVmcyhjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmx1c2hJY29uUmVmcyhjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGljb25UeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fRmx1c2hJY29uUmVmc0J5Vm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiB2UmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiB2UmVmTnVtOwogI2lmbmRlZiBGbHVzaEljb25SZWZzQnlWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhGbHVzaEljb25SZWZzQnlWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsdXNoSWNvblJlZnNCeVZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRmx1c2hJY29uUmVmc0J5Vm9sdW1lKHZSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBGbHVzaEljb25SZWZzQnlWb2x1bWUodlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgdlJlZk51bTsKLQlCb29sZWFuIGVuYWJsZUN1c3RvbUljb25zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiB2UmVmTnVtOworICAgIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnM7CiAjaWZuZGVmIFNldEN1c3RvbUljb25zRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKFNldEN1c3RvbUljb25zRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q3VzdG9tSWNvbnNFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVDdXN0b21JY29ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRDdXN0b21JY29uc0VuYWJsZWQodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUN1c3RvbUljb25zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlQ3VzdG9tSWNvbnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0Q3VzdG9tSWNvbnNFbmFibGVkKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVDdXN0b21JY29ucyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgdlJlZk51bTsKLQlCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgdlJlZk51bTsKKyAgICBCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZDsKICNpZm5kZWYgR2V0Q3VzdG9tSWNvbnNFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3VzdG9tSWNvbnNFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDdXN0b21JY29uc0VuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEN1c3RvbUljb25zRW5hYmxlZCh2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1c3RvbUljb25zRW5hYmxlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY3VzdG9tSWNvbnNFbmFibGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q3VzdG9tSWNvbnNFbmFibGVkKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VzdG9tSWNvbnNFbmFibGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21JY29uc0VuYWJsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9Jc0ljb25SZWZNYXNrRW1wdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUljb25SZWYgaWNvblJlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgSWNvblJlZiBpY29uUmVmOwogI2lmbmRlZiBJc0ljb25SZWZNYXNrRW1wdHkKLQlQeU1hY19QUkVDSEVDSyhJc0ljb25SZWZNYXNrRW1wdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKElzSWNvblJlZk1hc2tFbXB0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvblJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzSWNvblJlZk1hc2tFbXB0eShpY29uUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzSWNvblJlZk1hc2tFbXB0eShpY29uUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fR2V0SWNvblJlZlZhcmlhbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUljb25SZWYgX3J2OwotCUljb25SZWYgaW5JY29uUmVmOwotCU9TVHlwZSBpblZhcmlhbnQ7Ci0JSWNvblRyYW5zZm9ybVR5cGUgb3V0VHJhbnNmb3JtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJY29uUmVmIF9ydjsKKyAgICBJY29uUmVmIGluSWNvblJlZjsKKyAgICBPU1R5cGUgaW5WYXJpYW50OworICAgIEljb25UcmFuc2Zvcm1UeXBlIG91dFRyYW5zZm9ybTsKICNpZm5kZWYgR2V0SWNvblJlZlZhcmlhbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRJY29uUmVmVmFyaWFudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SWNvblJlZlZhcmlhbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JY29uUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblZhcmlhbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRJY29uUmVmVmFyaWFudChpbkljb25SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5WYXJpYW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRUcmFuc2Zvcm0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUcmFuc2Zvcm0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSWNvblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5WYXJpYW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0SWNvblJlZlZhcmlhbnQoaW5JY29uUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VHJhbnNmb3JtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VHJhbnNmb3JtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBjcmVhdG9yOwotCU9TVHlwZSBpY29uVHlwZTsKLQlGU1NwZWMgaWNvbkZpbGU7Ci0JSWNvblJlZiB0aGVJY29uUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIE9TVHlwZSBpY29uVHlwZTsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CisgICAgSWNvblJlZiB0aGVJY29uUmVmOwogI2lmbmRlZiBSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaWNvbkZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlKGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJY29uUmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlSWNvblJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlZ2lzdGVySWNvblJlZkZyb21JY29uRmlsZShjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSWNvblJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUljb25SZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkljbl9SZWFkSWNvbkZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGljb25GaWxlOwotCUljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CisgICAgSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5OwogI2lmbmRlZiBSZWFkSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhSZWFkSWNvbkZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlYWRJY29uRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlYWRJY29uRmlsZSgmaWNvbkZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaWNvbkZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVhZEljb25GaWxlKCZpY29uRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpY29uRmFtaWx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaWNvbkZhbWlseSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqSWNuX1JlYWRJY29uRnJvbUZTUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIHJlZjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgcmVmOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKICNpZm5kZWYgUmVhZEljb25Gcm9tRlNSZWYKLQlQeU1hY19QUkVDSEVDSyhSZWFkSWNvbkZyb21GU1JlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVhZEljb25Gcm9tRlNSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWFkSWNvbkZyb21GU1JlZigmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZhbWlseSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGljb25GYW1pbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVhZEljb25Gcm9tRlNSZWYoJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25GYW1pbHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpY29uRmFtaWx5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpJY25fV3JpdGVJY29uRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHk7Ci0JRlNTcGVjIGljb25GaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseTsKKyAgICBGU1NwZWMgaWNvbkZpbGU7CiAjaWZuZGVmIFdyaXRlSWNvbkZpbGUKLQlQeU1hY19QUkVDSEVDSyhXcml0ZUljb25GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhXcml0ZUljb25GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFdyaXRlSWNvbkZpbGUoaWNvbkZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb25GYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmljb25GaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFdyaXRlSWNvbkZpbGUoaWNvbkZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaWNvbkZpbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJY25fbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0Q0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldENJY29uLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaWNvbklEKSAtPiAoQ0ljb25IYW5kbGUgX3J2KSIpfSwKLQl7IlBsb3RDSWNvbiIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIENJY29uSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlQ0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VDSWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoQ0ljb25IYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IkdldEljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb24sIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpY29uSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlBsb3RJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IlBsb3RJY29uSUQiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RJY29uSUQsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgU0ludDE2IHRoZVJlc0lEKSAtPiBOb25lIil9LAotCXsiTmV3SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9OZXdJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIil9LAotCXsiQWRkSWNvblRvU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0FkZEljb25Ub1N1aXRlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdGhlSWNvbkRhdGEsIEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAotCXsiR2V0SWNvbkZyb21TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvbkZyb21TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBSZXNUeXBlIHRoZVR5cGUpIC0+IChIYW5kbGUgdGhlSWNvbkRhdGEpIil9LAotCXsiR2V0SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB0aGVSZXNJRCwgSWNvblNlbGVjdG9yVmFsdWUgc2VsZWN0b3IpIC0+IChJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSIpfSwKLQl7IkRpc3Bvc2VJY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VJY29uU3VpdGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUsIEJvb2xlYW4gZGlzcG9zZURhdGEpIC0+IE5vbmUiKX0sCi0JeyJQbG90SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IE5vbmUiKX0sCi0JeyJMb2FkSWNvbkNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Mb2FkSWNvbkNhY2hlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fR2V0TGFiZWwsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBsYWJlbE51bWJlciwgU3RyMjU1IGxhYmVsU3RyaW5nKSAtPiAoUkdCQ29sb3IgbGFiZWxDb2xvcikiKX0sCi0JeyJQdEluSWNvbklEIiwgKFB5Q0Z1bmN0aW9uKUljbl9QdEluSWNvbklELCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0ZXN0UHQsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBTSW50MTYgaWNvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUHRJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25TdWl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFB0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlJlY3RJbkljb25JRCIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvbklELCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgU0ludDE2IGljb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlJlY3RJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ikljb25JRFRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uSURUb1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbiwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIFNJbnQxNiBpY29uSUQpIC0+IE5vbmUiKX0sCi0JeyJJY29uU3VpdGVUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSAtPiBOb25lIil9LAotCXsiU2V0U3VpdGVMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fU2V0U3VpdGVMYWJlbCwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBTSW50MTYgdGhlTGFiZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXRTdWl0ZUxhYmVsIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRTdWl0ZUxhYmVsLCAxLAotCSBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgdGhlU3VpdGUpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlBsb3RJY29uSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbkhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKLQl7IlBsb3RTSUNOSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90U0lDTkhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlU0lDTikgLT4gTm9uZSIpfSwKLQl7IlBsb3RDSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIENJY29uSGFuZGxlIHRoZUNJY29uKSAtPiBOb25lIil9LAotCXsiSWNvblJlZlRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblJlZlRvSWNvbkZhbWlseSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7Ikljb25GYW1pbHlUb0ljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fSWNvbkZhbWlseVRvSWNvblN1aXRlLCAxLAotCSBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIEljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnMpIC0+IChJY29uU3VpdGVSZWYgaWNvblN1aXRlKSIpfSwKLQl7Ikljb25TdWl0ZVRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5LCAxLAotCSBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgaWNvblN1aXRlLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IlNldEljb25GYW1pbHlEYXRhIiwgKFB5Q0Z1bmN0aW9uKUljbl9TZXRJY29uRmFtaWx5RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBPU1R5cGUgaWNvblR5cGUsIEhhbmRsZSBoKSAtPiBOb25lIil9LAotCXsiR2V0SWNvbkZhbWlseURhdGEiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25GYW1pbHlEYXRhLCAxLAotCSBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIE9TVHlwZSBpY29uVHlwZSwgSGFuZGxlIGgpIC0+IE5vbmUiKX0sCi0JeyJHZXRJY29uUmVmT3duZXJzIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmT3duZXJzLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChVSW50MTYgb3duZXJzKSIpfSwKLQl7IkFjcXVpcmVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9BY3F1aXJlSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAotCXsiUmVsZWFzZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1JlbGVhc2VJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJHZXRJY29uUmVmRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZGcm9tRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYsIFNJbnQxNiB0aGVMYWJlbCkiKX0sCi0JeyJHZXRJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgdlJlZk51bSwgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJHZXRJY29uUmVmRnJvbUZvbGRlciIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZkZyb21Gb2xkZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtLCBTSW50MzIgcGFyZW50Rm9sZGVySUQsIFNJbnQzMiBmb2xkZXJJRCwgU0ludDggYXR0cmlidXRlcywgU0ludDggYWNjZXNzUHJpdmlsZWdlcykgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHksIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pSWNuX1JlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSwgRlNTcGVjIHJlc291cmNlRmlsZSwgU0ludDE2IHJlc291cmNlSUQpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAotCXsiUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tRlNSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTUmVmIGljb25GaWxlKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmKSIpfSwKLQl7IlVucmVnaXN0ZXJJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9VbnJlZ2lzdGVySWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1VwZGF0ZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7Ik92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilJY25fT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYsIEZTU3BlYyByZXNvdXJjZUZpbGUsIFNJbnQxNiByZXNvdXJjZUlEKSAtPiBOb25lIil9LAotCXsiT3ZlcnJpZGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9PdmVycmlkZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgb2xkSWNvblJlZiwgSWNvblJlZiBuZXdJY29uUmVmKSAtPiBOb25lIil9LAotCXsiUmVtb3ZlSWNvblJlZk92ZXJyaWRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZW1vdmVJY29uUmVmT3ZlcnJpZGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7IkNvbXBvc2l0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0NvbXBvc2l0ZUljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIC0+IChJY29uUmVmIGNvbXBvc2l0ZUljb25SZWYpIil9LAotCXsiSXNJY29uUmVmQ29tcG9zaXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc0ljb25SZWZDb21wb3NpdGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25SZWYgY29tcG9zaXRlSWNvblJlZikgLT4gKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIil9LAotCXsiSXNWYWxpZEljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0lzVmFsaWRJY29uUmVmLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQbG90SWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLCBJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCi0JeyJQdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25SZWYsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiUmVjdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSWNvblJlZlRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uUmVmVG9SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKLQl7IkdldEljb25TaXplc0Zyb21JY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU2l6ZXNGcm9tSWNvblJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQsIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyKSIpfSwKLQl7IkZsdXNoSWNvblJlZnMiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IE5vbmUiKX0sCi0JeyJGbHVzaEljb25SZWZzQnlWb2x1bWUiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnNCeVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0sIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnMpIC0+IE5vbmUiKX0sCi0JeyJHZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IChCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZCkiKX0sCi0JeyJJc0ljb25SZWZNYXNrRW1wdHkiLCAoUHlDRnVuY3Rpb24pSWNuX0lzSWNvblJlZk1hc2tFbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0SWNvblJlZlZhcmlhbnQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZWYXJpYW50LCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIGluSWNvblJlZiwgT1NUeXBlIGluVmFyaWFudCkgLT4gKEljb25SZWYgX3J2LCBJY29uVHJhbnNmb3JtVHlwZSBvdXRUcmFuc2Zvcm0pIil9LAotCXsiUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTU3BlYyBpY29uRmlsZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCi0JeyJSZWFkSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1JlYWRJY29uRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGljb25GaWxlKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IlJlYWRJY29uRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWFkSWNvbkZyb21GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKLQl7IldyaXRlSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1dyaXRlSWNvbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSwgRlNTcGVjIGljb25GaWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldENJY29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaWNvbklEKSAtPiAoQ0ljb25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBsb3RDSWNvbiIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIENJY29uSGFuZGxlIHRoZUljb24pIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlQ0ljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VDSWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ljb25IYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEljb24iLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpY29uSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBsb3RJY29uIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RJY29uSUQiLCAoUHlDRnVuY3Rpb24pSWNuX1Bsb3RJY29uSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgU0ludDE2IHRoZVJlc0lEKSAtPiBOb25lIil9LAorICAgIHsiTmV3SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9OZXdJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIil9LAorICAgIHsiQWRkSWNvblRvU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0FkZEljb25Ub1N1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgdGhlSWNvbkRhdGEsIEljb25TdWl0ZVJlZiB0aGVTdWl0ZSwgUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SWNvbkZyb21TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvbkZyb21TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBSZXNUeXBlIHRoZVR5cGUpIC0+IChIYW5kbGUgdGhlSWNvbkRhdGEpIil9LAorICAgIHsiR2V0SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB0aGVSZXNJRCwgSWNvblNlbGVjdG9yVmFsdWUgc2VsZWN0b3IpIC0+IChJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSIpfSwKKyAgICB7IkRpc3Bvc2VJY29uU3VpdGUiLCAoUHlDRnVuY3Rpb24pSWNuX0Rpc3Bvc2VJY29uU3VpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUsIEJvb2xlYW4gZGlzcG9zZURhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJQbG90SWNvblN1aXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25TdWl0ZVJlZiB0aGVJY29uU3VpdGUpIC0+IE5vbmUiKX0sCisgICAgeyJMb2FkSWNvbkNhY2hlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Mb2FkSWNvbkNhY2hlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIEljb25DYWNoZVJlZiB0aGVJY29uQ2FjaGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fR2V0TGFiZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBsYWJlbE51bWJlciwgU3RyMjU1IGxhYmVsU3RyaW5nKSAtPiAoUkdCQ29sb3IgbGFiZWxDb2xvcikiKX0sCisgICAgeyJQdEluSWNvbklEIiwgKFB5Q0Z1bmN0aW9uKUljbl9QdEluSWNvbklELCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0ZXN0UHQsIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBTSW50MTYgaWNvbklEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHRJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25TdWl0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGVzdFB0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlJlY3RJbkljb25JRCIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvbklELCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgU0ludDE2IGljb25JRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlJlY3RJbkljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRlc3RSZWN0LCBSZWN0IGljb25SZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblN1aXRlUmVmIHRoZUljb25TdWl0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ikljb25JRFRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uSURUb1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbiwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIFNJbnQxNiBpY29uSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJY29uU3VpdGVUb1JnbiIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU3VpdGVSZWYgdGhlSWNvblN1aXRlKSAtPiBOb25lIil9LAorICAgIHsiU2V0U3VpdGVMYWJlbCIsIChQeUNGdW5jdGlvbilJY25fU2V0U3VpdGVMYWJlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblN1aXRlUmVmIHRoZVN1aXRlLCBTSW50MTYgdGhlTGFiZWwpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRTdWl0ZUxhYmVsIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRTdWl0ZUxhYmVsLCAxLAorICAgICBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgdGhlU3VpdGUpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IlBsb3RJY29uSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90SWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlSWNvbikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RTSUNOSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9QbG90U0lDTkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0aGVSZWN0LCBJY29uQWxpZ25tZW50VHlwZSBhbGlnbiwgSWNvblRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtLCBIYW5kbGUgdGhlU0lDTikgLT4gTm9uZSIpfSwKKyAgICB7IlBsb3RDSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilJY25fUGxvdENJY29uSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uVHJhbnNmb3JtVHlwZSB0cmFuc2Zvcm0sIENJY29uSGFuZGxlIHRoZUNJY29uKSAtPiBOb25lIil9LAorICAgIHsiSWNvblJlZlRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblJlZlRvSWNvbkZhbWlseSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7Ikljb25GYW1pbHlUb0ljb25TdWl0ZSIsIChQeUNGdW5jdGlvbilJY25fSWNvbkZhbWlseVRvSWNvblN1aXRlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIEljb25TZWxlY3RvclZhbHVlIHdoaWNoSWNvbnMpIC0+IChJY29uU3VpdGVSZWYgaWNvblN1aXRlKSIpfSwKKyAgICB7Ikljb25TdWl0ZVRvSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fSWNvblN1aXRlVG9JY29uRmFtaWx5LCAxLAorICAgICBQeURvY19TVFIoIihJY29uU3VpdGVSZWYgaWNvblN1aXRlLCBJY29uU2VsZWN0b3JWYWx1ZSB3aGljaEljb25zKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IlNldEljb25GYW1pbHlEYXRhIiwgKFB5Q0Z1bmN0aW9uKUljbl9TZXRJY29uRmFtaWx5RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5LCBPU1R5cGUgaWNvblR5cGUsIEhhbmRsZSBoKSAtPiBOb25lIil9LAorICAgIHsiR2V0SWNvbkZhbWlseURhdGEiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25GYW1pbHlEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihJY29uRmFtaWx5SGFuZGxlIGljb25GYW1pbHksIE9TVHlwZSBpY29uVHlwZSwgSGFuZGxlIGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJY29uUmVmT3duZXJzIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmT3duZXJzLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChVSW50MTYgb3duZXJzKSIpfSwKKyAgICB7IkFjcXVpcmVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9BY3F1aXJlSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiB0aGVJY29uUmVmKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1JlbGVhc2VJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRJY29uUmVmRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChJY29uUmVmIHRoZUljb25SZWYsIFNJbnQxNiB0aGVMYWJlbCkiKX0sCisgICAgeyJHZXRJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdlJlZk51bSwgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJHZXRJY29uUmVmRnJvbUZvbGRlciIsIChQeUNGdW5jdGlvbilJY25fR2V0SWNvblJlZkZyb21Gb2xkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2UmVmTnVtLCBTSW50MzIgcGFyZW50Rm9sZGVySUQsIFNJbnQzMiBmb2xkZXJJRCwgU0ludDggYXR0cmlidXRlcywgU0ludDggYWNjZXNzUHJpdmlsZWdlcykgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWdpc3Rlckljb25SZWZGcm9tSWNvbkZhbWlseSIsIChQeUNGdW5jdGlvbilJY25fUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GYW1pbHksIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWdpc3Rlckljb25SZWZGcm9tUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pSWNuX1JlZ2lzdGVySWNvblJlZkZyb21SZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSwgRlNTcGVjIHJlc291cmNlRmlsZSwgU0ludDE2IHJlc291cmNlSUQpIC0+IChJY29uUmVmIHRoZUljb25SZWYpIil9LAorICAgIHsiUmVnaXN0ZXJJY29uUmVmRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tRlNSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTUmVmIGljb25GaWxlKSAtPiAoSWNvblJlZiB0aGVJY29uUmVmKSIpfSwKKyAgICB7IlVucmVnaXN0ZXJJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9VbnJlZ2lzdGVySWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBpY29uVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IlVwZGF0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX1VwZGF0ZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7Ik92ZXJyaWRlSWNvblJlZkZyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilJY25fT3ZlcnJpZGVJY29uUmVmRnJvbVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYsIEZTU3BlYyByZXNvdXJjZUZpbGUsIFNJbnQxNiByZXNvdXJjZUlEKSAtPiBOb25lIil9LAorICAgIHsiT3ZlcnJpZGVJY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9PdmVycmlkZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgb2xkSWNvblJlZiwgSWNvblJlZiBuZXdJY29uUmVmKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlSWNvblJlZk92ZXJyaWRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZW1vdmVJY29uUmVmT3ZlcnJpZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXBvc2l0ZUljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0NvbXBvc2l0ZUljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIC0+IChJY29uUmVmIGNvbXBvc2l0ZUljb25SZWYpIil9LAorICAgIHsiSXNJY29uUmVmQ29tcG9zaXRlIiwgKFB5Q0Z1bmN0aW9uKUljbl9Jc0ljb25SZWZDb21wb3NpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25SZWYgY29tcG9zaXRlSWNvblJlZikgLT4gKEljb25SZWYgYmFja2dyb3VuZEljb25SZWYsIEljb25SZWYgZm9yZWdyb3VuZEljb25SZWYpIil9LAorICAgIHsiSXNWYWxpZEljb25SZWYiLCAoUHlDRnVuY3Rpb24pSWNuX0lzVmFsaWRJY29uUmVmLCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIHRoZUljb25SZWYpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJQbG90SWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUGxvdEljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25UcmFuc2Zvcm1UeXBlIHRyYW5zZm9ybSwgSWNvblNlcnZpY2VzVXNhZ2VGbGFncyB0aGVJY29uU2VydmljZXNVc2FnZUZsYWdzLCBJY29uUmVmIHRoZUljb25SZWYpIC0+IE5vbmUiKX0sCisgICAgeyJQdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUHRJbkljb25SZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRlc3RQdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgdGhlSWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUmVjdEluSWNvblJlZiIsIChQeUNGdW5jdGlvbilJY25fUmVjdEluSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCB0ZXN0UmVjdCwgUmVjdCBpY29uUmVjdCwgSWNvbkFsaWdubWVudFR5cGUgYWxpZ24sIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSWNvblJlZlRvUmduIiwgKFB5Q0Z1bmN0aW9uKUljbl9JY29uUmVmVG9SZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVSZ24sIFJlY3QgaWNvblJlY3QsIEljb25BbGlnbm1lbnRUeXBlIGFsaWduLCBJY29uU2VydmljZXNVc2FnZUZsYWdzIGljb25TZXJ2aWNlc1VzYWdlRmxhZ3MsIEljb25SZWYgdGhlSWNvblJlZikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEljb25TaXplc0Zyb21JY29uUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9HZXRJY29uU2l6ZXNGcm9tSWNvblJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9ySW5wdXQsIEljb25TZXJ2aWNlc1VzYWdlRmxhZ3MgaWNvblNlcnZpY2VzVXNhZ2VGbGFncywgSWNvblJlZiB0aGVJY29uUmVmKSAtPiAoSWNvblNlbGVjdG9yVmFsdWUgaWNvblNlbGVjdG9yT3V0cHV0UHRyKSIpfSwKKyAgICB7IkZsdXNoSWNvblJlZnMiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJGbHVzaEljb25SZWZzQnlWb2x1bWUiLCAoUHlDRnVuY3Rpb24pSWNuX0ZsdXNoSWNvblJlZnNCeVZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX1NldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0sIEJvb2xlYW4gZW5hYmxlQ3VzdG9tSWNvbnMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDdXN0b21JY29uc0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEN1c3RvbUljb25zRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IHZSZWZOdW0pIC0+IChCb29sZWFuIGN1c3RvbUljb25zRW5hYmxlZCkiKX0sCisgICAgeyJJc0ljb25SZWZNYXNrRW1wdHkiLCAoUHlDRnVuY3Rpb24pSWNuX0lzSWNvblJlZk1hc2tFbXB0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uUmVmKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0SWNvblJlZlZhcmlhbnQiLCAoUHlDRnVuY3Rpb24pSWNuX0dldEljb25SZWZWYXJpYW50LCAxLAorICAgICBQeURvY19TVFIoIihJY29uUmVmIGluSWNvblJlZiwgT1NUeXBlIGluVmFyaWFudCkgLT4gKEljb25SZWYgX3J2LCBJY29uVHJhbnNmb3JtVHlwZSBvdXRUcmFuc2Zvcm0pIil9LAorICAgIHsiUmVnaXN0ZXJJY29uUmVmRnJvbUljb25GaWxlIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWdpc3Rlckljb25SZWZGcm9tSWNvbkZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjcmVhdG9yLCBPU1R5cGUgaWNvblR5cGUsIEZTU3BlYyBpY29uRmlsZSkgLT4gKEljb25SZWYgdGhlSWNvblJlZikiKX0sCisgICAgeyJSZWFkSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1JlYWRJY29uRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGljb25GaWxlKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IlJlYWRJY29uRnJvbUZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUljbl9SZWFkSWNvbkZyb21GU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcmVmKSAtPiAoSWNvbkZhbWlseUhhbmRsZSBpY29uRmFtaWx5KSIpfSwKKyAgICB7IldyaXRlSWNvbkZpbGUiLCAoUHlDRnVuY3Rpb24pSWNuX1dyaXRlSWNvbkZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEljb25GYW1pbHlIYW5kbGUgaWNvbkZhbWlseSwgRlNTcGVjIGljb25GaWxlKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTE1ODUsMjEgKzE1ODUsMjEgQEAKIAogdm9pZCBpbml0X0ljbih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0ljbiIsIEljbl9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0ljbiIsIEljbl9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlJY25fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChJY25fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJY25fRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBJY25fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChJY25fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBJY25fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9sYXVuY2gvX0xhdW5jaG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbGF1bmNoL19MYXVuY2htb2R1bGUuYwppbmRleCBmYTIxZWNlLi44ODkxMmIyIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9sYXVuY2gvX0xhdW5jaG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2xhdW5jaC9fTGF1bmNobW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0yNywyMSArMjcsMjEgQEAKIHN0YXRpYyBpbnQKIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGU3RyaW5nUmVmICpzcGVjKQogewotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICAgICAgKnNwZWMgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KHYsIHNwZWMpOworICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgKnNwZWMgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQodiwgc3BlYyk7CiB9CiAKIFB5T2JqZWN0ICoKIE9wdENGU3RyaW5nUmVmT2JqX05ldyhDRlN0cmluZ1JlZiBpdCkKIHsKLSAgICAgICAgaWYgKGl0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldyhpdCk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICB9CisgICAgcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldyhpdCk7CiB9CiAKIC8qCkBAIC01MSwxOSArNTEsMTkgQEAKIExTSXRlbUluZm9SZWNvcmRfTmV3KExTSXRlbUluZm9SZWNvcmQgKml0KQogewogI2lmbmRlZiBfX0xQNjRfXwotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJnM6TyZzOml9IiwKLSAgICAgICAgICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKLSAgICAgICAgICAgICAgICAiY3JlYXRvciIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+Y3JlYXRvciwKLSAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICJpY29uRmlsZU5hbWUiLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5pY29uRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgImtpbmRJRCIsIGl0LT5raW5kSUQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ7czppczpPJnM6TyZzOk8mczpPJnM6aX0iLAorICAgICAgICAiZmxhZ3MiLCBpdC0+ZmxhZ3MsCisgICAgICAgICJmaWxldHlwZSIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+ZmlsZXR5cGUsCisgICAgICAgICJjcmVhdG9yIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5jcmVhdG9yLAorICAgICAgICAiZXh0ZW5zaW9uIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+ZXh0ZW5zaW9uLAorICAgICAgICAiaWNvbkZpbGVOYW1lIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+aWNvbkZpbGVOYW1lLAorICAgICAgICAia2luZElEIiwgaXQtPmtpbmRJRCk7CiAjZWxzZQotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJn0iLAotICAgICAgICAgICAgICAgICJmbGFncyIsIGl0LT5mbGFncywKLSAgICAgICAgICAgICAgICAiZmlsZXR5cGUiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmZpbGV0eXBlLAotICAgICAgICAgICAgICAgICJjcmVhdG9yIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5jcmVhdG9yLAotICAgICAgICAgICAgICAgICJleHRlbnNpb24iLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5leHRlbnNpb24pOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ7czppczpPJnM6TyZzOk8mfSIsCisgICAgICAgICJmbGFncyIsIGl0LT5mbGFncywKKyAgICAgICAgImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKKyAgICAgICAgImNyZWF0b3IiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmNyZWF0b3IsCisgICAgICAgICJleHRlbnNpb24iLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5leHRlbnNpb24pOwogI2VuZGlmCiB9CiAKQEAgLTcxLDM5MSArNzEsMzkxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluSXRlbVJlZjsKLQlMU1JlcXVlc3RlZEluZm8gaW5XaGljaEluZm87Ci0JTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluSXRlbVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2hpY2hJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weUl0ZW1JbmZvRm9yUmVmKCZpbkl0ZW1SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hpY2hJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SXRlbUluZm8pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBMU0l0ZW1JbmZvUmVjb3JkX05ldywgJm91dEl0ZW1JbmZvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkl0ZW1SZWY7CisgICAgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvOworICAgIExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkl0ZW1SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldoaWNoSW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NvcHlJdGVtSW5mb0ZvclJlZigmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoaWNoSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEl0ZW1JbmZvKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFNJdGVtSW5mb1JlY29yZF9OZXcsICZvdXRJdGVtSW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUxTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbzsKLQlMU0l0ZW1JbmZvUmVjb3JkIG91dEl0ZW1JbmZvOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2hpY2hJbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weUl0ZW1JbmZvRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldoaWNoSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEl0ZW1JbmZvKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTFNJdGVtSW5mb1JlY29yZF9OZXcsICZvdXRJdGVtSW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvOworICAgIExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm87CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaGljaEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNDb3B5SXRlbUluZm9Gb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2hpY2hJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SXRlbUluZm8pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMU0l0ZW1JbmZvUmVjb3JkX05ldywgJm91dEl0ZW1JbmZvKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNHZXRFeHRlbnNpb25JbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVuaUNoYXIgKmluTmFtZUxlbl9faW5fXzsKLQlVbmlDaGFyQ291bnQgaW5OYW1lTGVuX19sZW5fXzsKLQlpbnQgaW5OYW1lTGVuX19pbl9sZW5fXzsKLQlVbmlDaGFyQ291bnQgb3V0RXh0U3RhcnRJbmRleDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ1IyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk5hbWVMZW5fX2luX18sICZpbk5hbWVMZW5fX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaW5OYW1lTGVuX19sZW5fXyA9IGluTmFtZUxlbl9faW5fbGVuX187Ci0JX2VyciA9IExTR2V0RXh0ZW5zaW9uSW5mbyhpbk5hbWVMZW5fX2xlbl9fLCBpbk5hbWVMZW5fX2luX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RXh0U3RhcnRJbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RXh0U3RhcnRJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVW5pQ2hhciAqaW5OYW1lTGVuX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBpbk5hbWVMZW5fX2xlbl9fOworICAgIGludCBpbk5hbWVMZW5fX2luX2xlbl9fOworICAgIFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInUjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTmFtZUxlbl9faW5fXywgJmluTmFtZUxlbl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpbk5hbWVMZW5fX2xlbl9fID0gaW5OYW1lTGVuX19pbl9sZW5fXzsKKyAgICBfZXJyID0gTFNHZXRFeHRlbnNpb25JbmZvKGluTmFtZUxlbl9fbGVuX18sIGluTmFtZUxlbl9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRFeHRTdGFydEluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFeHRTdGFydEluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNSZWYgaW5SZWY7Ci0JQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yUmVmKCZpblJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5SZWY7CisgICAgQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yUmVmKCZpblJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weURpc3BsYXlOYW1lRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUNGU3RyaW5nUmVmIG91dERpc3BsYXlOYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTQ29weURpc3BsYXlOYW1lRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGlzcGxheU5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dERpc3BsYXlOYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0NvcHlEaXNwbGF5TmFtZUZvclVSTChpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERpc3BsYXlOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXREaXNwbGF5TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluUmVmOwotCUJvb2xlYW4gaW5IaWRlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYoJmluUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGluUmVmOworICAgIEJvb2xlYW4gaW5IaWRlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYoJmluUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpblVSTDsKLQlCb29sZWFuIGluSGlkZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhpZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwoaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGlkZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5VUkw7CisgICAgQm9vbGVhbiBpbkhpZGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IaWRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yVVJMKGluVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NvcHlLaW5kU3RyaW5nRm9yUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTUmVmIGluRlNSZWY7Ci0JQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5GU1JlZikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlLaW5kU3RyaW5nRm9yUmVmKCZpbkZTUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLaW5kU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRLaW5kU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkZTUmVmOworICAgIENGU3RyaW5nUmVmIG91dEtpbmRTdHJpbmc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluRlNSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNDb3B5S2luZFN0cmluZ0ZvclJlZigmaW5GU1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0S2luZFN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0S2luZFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZVUkxSZWYgaW5VUkw7Ci0JQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0NvcHlLaW5kU3RyaW5nRm9yVVJMKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLaW5kU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRLaW5kU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ29weUtpbmRTdHJpbmdGb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEtpbmRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dEtpbmRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySXRlbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpbkl0ZW1SZWY7Ci0JTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKLQlGU1JlZiBvdXRBcHBSZWY7Ci0JQ0ZVUkxSZWYgb3V0QXBwVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5JdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSgmaW5JdGVtUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1JlZiBpbkl0ZW1SZWY7CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSgmaW5JdGVtUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGluVHlwZTsKLQlPU1R5cGUgaW5DcmVhdG9yOwotCUNGU3RyaW5nUmVmIGluRXh0ZW5zaW9uOwotCUxTUm9sZXNNYXNrIGluUm9sZU1hc2s7Ci0JRlNSZWYgb3V0QXBwUmVmOwotCUNGVVJMUmVmIG91dEFwcFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbkNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbkV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNHZXRBcHBsaWNhdGlvbkZvckluZm8oaW5UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwVVJMKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX05ldywgb3V0QXBwVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgaW5UeXBlOworICAgIE9TVHlwZSBpbkNyZWF0b3I7CisgICAgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb247CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU0dldEFwcGxpY2F0aW9uRm9ySW5mbyhpblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUxTUm9sZXNNYXNrIGluUm9sZU1hc2s7Ci0JRlNSZWYgb3V0QXBwUmVmOwotCUNGVVJMUmVmIG91dEFwcFVSTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTR2V0QXBwbGljYXRpb25Gb3JVUkwoaW5VUkwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGVVJMUmVmIGluVVJMOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgRlNSZWYgb3V0QXBwUmVmOworICAgIENGVVJMUmVmIG91dEFwcFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9Db252ZXJ0LCAmaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJvbGVNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTR2V0QXBwbGljYXRpb25Gb3JVUkwoaW5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBcHBVUkwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRBcHBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRBcHBVUkwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0ZpbmRBcHBsaWNhdGlvbkZvckluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGluQ3JlYXRvcjsKLQlDRlN0cmluZ1JlZiBpbkJ1bmRsZUlEOwotCUNGU3RyaW5nUmVmIGluTmFtZTsKLQlGU1JlZiBvdXRBcHBSZWY7Ci0JQ0ZVUkxSZWYgb3V0QXBwVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluQnVuZGxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvKGluQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVuZGxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIGluQ3JlYXRvcjsKKyAgICBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlEOworICAgIENGU3RyaW5nUmVmIGluTmFtZTsKKyAgICBGU1JlZiBvdXRBcHBSZWY7CisgICAgQ0ZVUkxSZWYgb3V0QXBwVVJMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0Q0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluQnVuZGxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpbk5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvKGluQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVuZGxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXBwUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFwcFVSTCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm91dEFwcFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dEFwcFVSTCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpbkl0ZW1GU1JlZjsKLQlGU1JlZiBpblRhcmdldFJlZjsKLQlMU1JvbGVzTWFzayBpblJvbGVNYXNrOwotCUxTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3M7Ci0JQm9vbGVhbiBvdXRBY2NlcHRzSXRlbTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluSXRlbUZTUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJmluVGFyZ2V0UmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNDYW5SZWZBY2NlcHRJdGVtKCZpbkl0ZW1GU1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZpblRhcmdldFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFjY2VwdHNJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBY2NlcHRzSXRlbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRlNSZWYgaW5JdGVtRlNSZWY7CisgICAgRlNSZWYgaW5UYXJnZXRSZWY7CisgICAgTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKKyAgICBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzOworICAgIEJvb2xlYW4gb3V0QWNjZXB0c0l0ZW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpbkl0ZW1GU1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblRhcmdldFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ2FuUmVmQWNjZXB0SXRlbSgmaW5JdGVtRlNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5UYXJnZXRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJvbGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBY2NlcHRzSXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QWNjZXB0c0l0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU0NhblVSTEFjY2VwdFVSTChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlVSTFJlZiBpbkl0ZW1VUkw7Ci0JQ0ZVUkxSZWYgaW5UYXJnZXRVUkw7Ci0JTFNSb2xlc01hc2sgaW5Sb2xlTWFzazsKLQlMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzOwotCUJvb2xlYW4gb3V0QWNjZXB0c0l0ZW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluSXRlbVVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVGFyZ2V0VVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNDYW5VUkxBY2NlcHRVUkwoaW5JdGVtVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblRhcmdldFVSTCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Sb2xlTWFzaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEFjY2VwdHNJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBY2NlcHRzSXRlbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZVUkxSZWYgaW5JdGVtVVJMOworICAgIENGVVJMUmVmIGluVGFyZ2V0VVJMOworICAgIExTUm9sZXNNYXNrIGluUm9sZU1hc2s7CisgICAgTFNBY2NlcHRhbmNlRmxhZ3MgaW5GbGFnczsKKyAgICBCb29sZWFuIG91dEFjY2VwdHNJdGVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpbkl0ZW1VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblRhcmdldFVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExTQ2FuVVJMQWNjZXB0VVJMKGluSXRlbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UYXJnZXRVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUm9sZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBY2NlcHRzSXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QWNjZXB0c0l0ZW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxhdW5jaF9MU09wZW5GU1JlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlGU1JlZiBpblJlZjsKLQlGU1JlZiBvdXRMYXVuY2hlZFJlZjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmaW5SZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTFNPcGVuRlNSZWYoJmluUmVmLAotCSAgICAgICAgICAgICAgICAgICAmb3V0TGF1bmNoZWRSZWYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmb3V0TGF1bmNoZWRSZWYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTUmVmIGluUmVmOworICAgIEZTUmVmIG91dExhdW5jaGVkUmVmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZpblJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU09wZW5GU1JlZigmaW5SZWYsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXRMYXVuY2hlZFJlZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNSZWYsICZvdXRMYXVuY2hlZFJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGF1bmNoX0xTT3BlbkNGVVJMUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGVVJMUmVmIGluVVJMOwotCUNGVVJMUmVmIG91dExhdW5jaGVkVVJMOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfQ29udmVydCwgJmluVVJMKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IExTT3BlbkNGVVJMUmVmKGluVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0TGF1bmNoZWRVUkwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlVSTFJlZk9ial9OZXcsIG91dExhdW5jaGVkVVJMKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlVSTFJlZiBpblVSTDsKKyAgICBDRlVSTFJlZiBvdXRMYXVuY2hlZFVSTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGVVJMUmVmT2JqX0NvbnZlcnQsICZpblVSTCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBMU09wZW5DRlVSTFJlZihpblVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dExhdW5jaGVkVVJMKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZVUkxSZWZPYmpfTmV3LCBvdXRMYXVuY2hlZFVSTCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBMYXVuY2hfbWV0aG9kc1tdID0gewotCXsiTFNDb3B5SXRlbUluZm9Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBpbkl0ZW1SZWYsIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbykgLT4gKExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm8pIil9LAotCXsiTFNDb3B5SXRlbUluZm9Gb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvKSAtPiAoTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbykiKX0sCi0JeyJMU0dldEV4dGVuc2lvbkluZm8iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTR2V0RXh0ZW5zaW9uSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGluTmFtZUxlbikgLT4gKFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4KSIpfSwKLQl7IkxTQ29weURpc3BsYXlOYW1lRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlEaXNwbGF5TmFtZUZvclJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZSkiKX0sCi0JeyJMU0NvcHlEaXNwbGF5TmFtZUZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWUpIil9LAotCXsiTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBpblJlZiwgQm9vbGVhbiBpbkhpZGUpIC0+IE5vbmUiKX0sCi0JeyJMU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMLCBCb29sZWFuIGluSGlkZSkgLT4gTm9uZSIpfSwKLQl7IkxTQ29weUtpbmRTdHJpbmdGb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JSZWYsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluRlNSZWYpIC0+IChDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nKSIpfSwKLQl7IkxTQ29weUtpbmRTdHJpbmdGb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZykiKX0sCi0JeyJMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIGluSXRlbVJlZiwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKLQl7IkxTR2V0QXBwbGljYXRpb25Gb3JJbmZvIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluVHlwZSwgT1NUeXBlIGluQ3JlYXRvciwgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb24sIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCi0JeyJMU0dldEFwcGxpY2F0aW9uRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMLCAxLAotCSBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKLQl7IkxTRmluZEFwcGxpY2F0aW9uRm9ySW5mbyIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgaW5DcmVhdG9yLCBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlELCBDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCi0JeyJMU0NhblJlZkFjY2VwdEl0ZW0iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5JdGVtRlNSZWYsIEZTUmVmIGluVGFyZ2V0UmVmLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrLCBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRBY2NlcHRzSXRlbSkiKX0sCi0JeyJMU0NhblVSTEFjY2VwdFVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDYW5VUkxBY2NlcHRVUkwsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluSXRlbVVSTCwgQ0ZVUkxSZWYgaW5UYXJnZXRVUkwsIExTUm9sZXNNYXNrIGluUm9sZU1hc2ssIExTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dEFjY2VwdHNJdGVtKSIpfSwKLQl7IkxTT3BlbkZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU09wZW5GU1JlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChGU1JlZiBvdXRMYXVuY2hlZFJlZikiKX0sCi0JeyJMU09wZW5DRlVSTFJlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNPcGVuQ0ZVUkxSZWYsIDEsCi0JIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZVUkxSZWYgb3V0TGF1bmNoZWRVUkwpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTFNDb3B5SXRlbUluZm9Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBpbkl0ZW1SZWYsIExTUmVxdWVzdGVkSW5mbyBpbldoaWNoSW5mbykgLT4gKExTSXRlbUluZm9SZWNvcmQgb3V0SXRlbUluZm8pIil9LAorICAgIHsiTFNDb3B5SXRlbUluZm9Gb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUl0ZW1JbmZvRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSZXF1ZXN0ZWRJbmZvIGluV2hpY2hJbmZvKSAtPiAoTFNJdGVtSW5mb1JlY29yZCBvdXRJdGVtSW5mbykiKX0sCisgICAgeyJMU0dldEV4dGVuc2lvbkluZm8iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTR2V0RXh0ZW5zaW9uSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGluTmFtZUxlbikgLT4gKFVuaUNoYXJDb3VudCBvdXRFeHRTdGFydEluZGV4KSIpfSwKKyAgICB7IkxTQ29weURpc3BsYXlOYW1lRm9yUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0NvcHlEaXNwbGF5TmFtZUZvclJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChDRlN0cmluZ1JlZiBvdXREaXNwbGF5TmFtZSkiKX0sCisgICAgeyJMU0NvcHlEaXNwbGF5TmFtZUZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDb3B5RGlzcGxheU5hbWVGb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0RGlzcGxheU5hbWUpIil9LAorICAgIHsiTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTU2V0RXh0ZW5zaW9uSGlkZGVuRm9yUmVmLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBpblJlZiwgQm9vbGVhbiBpbkhpZGUpIC0+IE5vbmUiKX0sCisgICAgeyJMU1NldEV4dGVuc2lvbkhpZGRlbkZvclVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNTZXRFeHRlbnNpb25IaWRkZW5Gb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMLCBCb29sZWFuIGluSGlkZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxTQ29weUtpbmRTdHJpbmdGb3JSZWYiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluRlNSZWYpIC0+IChDRlN0cmluZ1JlZiBvdXRLaW5kU3RyaW5nKSIpfSwKKyAgICB7IkxTQ29weUtpbmRTdHJpbmdGb3JVUkwiLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ29weUtpbmRTdHJpbmdGb3JVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0S2luZFN0cmluZykiKX0sCisgICAgeyJMU0dldEFwcGxpY2F0aW9uRm9ySXRlbSIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNHZXRBcHBsaWNhdGlvbkZvckl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTUmVmIGluSXRlbVJlZiwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKKyAgICB7IkxTR2V0QXBwbGljYXRpb25Gb3JJbmZvIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9ySW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGluVHlwZSwgT1NUeXBlIGluQ3JlYXRvciwgQ0ZTdHJpbmdSZWYgaW5FeHRlbnNpb24sIExTUm9sZXNNYXNrIGluUm9sZU1hc2spIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCisgICAgeyJMU0dldEFwcGxpY2F0aW9uRm9yVVJMIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU0dldEFwcGxpY2F0aW9uRm9yVVJMLCAxLAorICAgICBQeURvY19TVFIoIihDRlVSTFJlZiBpblVSTCwgTFNSb2xlc01hc2sgaW5Sb2xlTWFzaykgLT4gKEZTUmVmIG91dEFwcFJlZiwgQ0ZVUkxSZWYgb3V0QXBwVVJMKSIpfSwKKyAgICB7IkxTRmluZEFwcGxpY2F0aW9uRm9ySW5mbyIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNGaW5kQXBwbGljYXRpb25Gb3JJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgaW5DcmVhdG9yLCBDRlN0cmluZ1JlZiBpbkJ1bmRsZUlELCBDRlN0cmluZ1JlZiBpbk5hbWUpIC0+IChGU1JlZiBvdXRBcHBSZWYsIENGVVJMUmVmIG91dEFwcFVSTCkiKX0sCisgICAgeyJMU0NhblJlZkFjY2VwdEl0ZW0iLCAoUHlDRnVuY3Rpb24pTGF1bmNoX0xTQ2FuUmVmQWNjZXB0SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5JdGVtRlNSZWYsIEZTUmVmIGluVGFyZ2V0UmVmLCBMU1JvbGVzTWFzayBpblJvbGVNYXNrLCBMU0FjY2VwdGFuY2VGbGFncyBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRBY2NlcHRzSXRlbSkiKX0sCisgICAgeyJMU0NhblVSTEFjY2VwdFVSTCIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNDYW5VUkxBY2NlcHRVUkwsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluSXRlbVVSTCwgQ0ZVUkxSZWYgaW5UYXJnZXRVUkwsIExTUm9sZXNNYXNrIGluUm9sZU1hc2ssIExTQWNjZXB0YW5jZUZsYWdzIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dEFjY2VwdHNJdGVtKSIpfSwKKyAgICB7IkxTT3BlbkZTUmVmIiwgKFB5Q0Z1bmN0aW9uKUxhdW5jaF9MU09wZW5GU1JlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgaW5SZWYpIC0+IChGU1JlZiBvdXRMYXVuY2hlZFJlZikiKX0sCisgICAgeyJMU09wZW5DRlVSTFJlZiIsIChQeUNGdW5jdGlvbilMYXVuY2hfTFNPcGVuQ0ZVUkxSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKENGVVJMUmVmIGluVVJMKSAtPiAoQ0ZVUkxSZWYgb3V0TGF1bmNoZWRVUkwpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC00NjMsMTggKzQ2MywxOCBAQAogCiB2b2lkIGluaXRfTGF1bmNoKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX0xhdW5jaCIsIExhdW5jaF9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlMYXVuY2hfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChMYXVuY2hfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMYXVuY2hfRXJyb3IpICE9IDApCi0JCXJldHVybjsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0xhdW5jaCIsIExhdW5jaF9tZXRob2RzKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBMYXVuY2hfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChMYXVuY2hfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMYXVuY2hfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKIH0KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfTGF1bmNoID09PT09PT09PT09PT09PT09PT09PT09ICovCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9saXN0L19MaXN0bW9kdWxlLmMKaW5kZXggMDc5NzQwNC4uM2Y0M2IwNiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGlzdC9fTGlzdG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL2xpc3QvX0xpc3Rtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtNDEsNjkzICs0MSw2OTMgQEAKICNkZWZpbmUgTGlzdE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZMaXN0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkxpc3RfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IExpc3RPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlMaXN0SGFuZGxlIG9iX2l0c2VsZjsKLQlQeU9iamVjdCAqb2JfbGRlZl9mdW5jOwotCWludCBvYl9tdXN0X2JlX2Rpc3Bvc2VkOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBMaXN0SGFuZGxlIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqb2JfbGRlZl9mdW5jOworICAgIGludCBvYl9tdXN0X2JlX2Rpc3Bvc2VkOwogfSBMaXN0T2JqZWN0OwogCiBQeU9iamVjdCAqTGlzdE9ial9OZXcoTGlzdEhhbmRsZSBpdHNlbGYpCiB7Ci0JTGlzdE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTGlzdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIExpc3QiKTsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQlpdCA9IFB5T2JqZWN0X05FVyhMaXN0T2JqZWN0LCAmTGlzdF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfbGRlZl9mdW5jID0gTlVMTDsKLQlpdC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDE7Ci0JU2V0TGlzdFJlZkNvbihpdHNlbGYsIChsb25nKWl0KTsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTGlzdE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTGlzdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIExpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhMaXN0T2JqZWN0LCAmTGlzdF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfbGRlZl9mdW5jID0gTlVMTDsKKyAgICBpdC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDE7CisgICAgU2V0TGlzdFJlZkNvbihpdHNlbGYsIChsb25nKWl0KTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBMaXN0T2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIExpc3RIYW5kbGUgKnBfaXRzZWxmKQogewotCWlmICghTGlzdE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJMaXN0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKExpc3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghTGlzdE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJMaXN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKExpc3RPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBMaXN0T2JqX2RlYWxsb2MoTGlzdE9iamVjdCAqc2VsZikKIHsKLQlQeV9YREVDUkVGKHNlbGYtPm9iX2xkZWZfZnVuYyk7Ci0Jc2VsZi0+b2JfbGRlZl9mdW5jID0gTlVMTDsKLQlTZXRMaXN0UmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgKGxvbmcpMCk7Ci0JaWYgKHNlbGYtPm9iX211c3RfYmVfZGlzcG9zZWQgJiYgc2VsZi0+b2JfaXRzZWxmKSBMRGlzcG9zZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9sZGVmX2Z1bmMpOworICAgIHNlbGYtPm9iX2xkZWZfZnVuYyA9IE5VTEw7CisgICAgU2V0TGlzdFJlZkNvbihzZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOworICAgIGlmIChzZWxmLT5vYl9tdXN0X2JlX2Rpc3Bvc2VkICYmIHNlbGYtPm9iX2l0c2VsZikgTERpc3Bvc2Uoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEFkZENvbHVtbihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0Jc2hvcnQgY291bnQ7Ci0Jc2hvcnQgY29sTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTEFkZENvbHVtbihjb3VudCwKLQkgICAgICAgICAgICAgICAgIGNvbE51bSwKLQkgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgY291bnQ7CisgICAgc2hvcnQgY29sTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEFkZENvbHVtbihjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbE51bSwKKyAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEFkZFJvdyhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0Jc2hvcnQgY291bnQ7Ci0Jc2hvcnQgcm93TnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmcm93TnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTEFkZFJvdyhjb3VudCwKLQkgICAgICAgICAgICAgIHJvd051bSwKLQkgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgY291bnQ7CisgICAgc2hvcnQgcm93TnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcm93TnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEFkZFJvdyhjb3VudCwKKyAgICAgICAgICAgICAgICAgIHJvd051bSwKKyAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTERlbENvbHVtbihMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKLQlzaG9ydCBjb2xOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlMRGVsQ29sdW1uKGNvdW50LAotCSAgICAgICAgICAgY29sTnVtLAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBjb3VudDsKKyAgICBzaG9ydCBjb2xOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMRGVsQ29sdW1uKGNvdW50LAorICAgICAgICAgICAgICAgY29sTnVtLAorICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTERlbFJvdyhMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKLQlzaG9ydCByb3dOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyb3dOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlMRGVsUm93KGNvdW50LAotCSAgICAgICAgcm93TnVtLAotCSAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBjb3VudDsKKyAgICBzaG9ydCByb3dOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3dOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMRGVsUm93KGNvdW50LAorICAgICAgICByb3dOdW0sCisgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xHZXRTZWxlY3QoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiBuZXh0OwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5leHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExHZXRTZWxlY3QobmV4dCwKLQkgICAgICAgICAgICAgICAgICZ0aGVDZWxsLAotCSAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIG5leHQ7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTEdldFNlbGVjdChuZXh0LAorICAgICAgICAgICAgICAgICAgICAgJnRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgdGhlQ2VsbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MTGFzdENsaWNrKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTExhc3RDbGljayhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTExhc3RDbGljayhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MTmV4dENlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQm9vbGVhbiBoTmV4dDsKLQlCb29sZWFuIHZOZXh0OwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoTmV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZOZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTmV4dENlbGwoaE5leHQsCi0JICAgICAgICAgICAgICAgIHZOZXh0LAotCSAgICAgICAgICAgICAgICAmdGhlQ2VsbCwKLQkgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBCb29sZWFuIGhOZXh0OworICAgIEJvb2xlYW4gdk5leHQ7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhOZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdk5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExOZXh0Q2VsbChoTmV4dCwKKyAgICAgICAgICAgICAgICAgICAgdk5leHQsCisgICAgICAgICAgICAgICAgICAgICZ0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgdGhlQ2VsbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MU2l6ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsaXN0V2lkdGg7Ci0Jc2hvcnQgbGlzdEhlaWdodDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXN0V2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsaXN0SGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTFNpemUobGlzdFdpZHRoLAotCSAgICAgIGxpc3RIZWlnaHQsCi0JICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBsaXN0V2lkdGg7CisgICAgc2hvcnQgbGlzdEhlaWdodDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0SGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTFNpemUobGlzdFdpZHRoLAorICAgICAgICAgIGxpc3RIZWlnaHQsCisgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTFNldERyYXdpbmdNb2RlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZHJhd0l0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHJhd0l0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTFNldERyYXdpbmdNb2RlKGRyYXdJdCwKLQkgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdJdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExTZXREcmF3aW5nTW9kZShkcmF3SXQsCisgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xTY3JvbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgZENvbHM7Ci0Jc2hvcnQgZFJvd3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZENvbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZkUm93cykpCi0JCXJldHVybiBOVUxMOwotCUxTY3JvbGwoZENvbHMsCi0JICAgICAgICBkUm93cywKLQkgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZENvbHM7CisgICAgc2hvcnQgZFJvd3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZENvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkUm93cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExTY3JvbGwoZENvbHMsCisgICAgICAgIGRSb3dzLAorICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQXV0b1Njcm9sbChMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTEF1dG9TY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTEF1dG9TY3JvbGwoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTFVwZGF0ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgdGhlUmduOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlMVXBkYXRlKHRoZVJnbiwKLQkgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHRoZVJnbjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTFVwZGF0ZSh0aGVSZ24sCisgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xBY3RpdmF0ZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGFjdDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdCkpCi0JCXJldHVybiBOVUxMOwotCUxBY3RpdmF0ZShhY3QsCi0JICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBhY3Q7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMQWN0aXZhdGUoYWN0LAorICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MQ2VsbFNpemUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgY1NpemU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTENlbGxTaXplKGNTaXplLAotCSAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IGNTaXplOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZjU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExDZWxsU2l6ZShjU2l6ZSwKKyAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTENsaWNrKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OwotCUV2ZW50TW9kaWZpZXJzIG1vZGlmaWVyczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTENsaWNrKHB0LAotCSAgICAgICAgICAgICBtb2RpZmllcnMsCi0JICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBwdDsKKyAgICBFdmVudE1vZGlmaWVycyBtb2RpZmllcnM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExDbGljayhwdCwKKyAgICAgICAgICAgICAgICAgbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xBZGRUb0NlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqZGF0YVB0cl9faW5fXzsKLQlzaG9ydCBkYXRhUHRyX19sZW5fXzsKLQlpbnQgZGF0YVB0cl9faW5fbGVuX187Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlMQWRkVG9DZWxsKGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgICAgdGhlQ2VsbCwKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqZGF0YVB0cl9faW5fXzsKKyAgICBzaG9ydCBkYXRhUHRyX19sZW5fXzsKKyAgICBpbnQgZGF0YVB0cl9faW5fbGVuX187CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX18sICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBMQWRkVG9DZWxsKGRhdGFQdHJfX2luX18sIGRhdGFQdHJfX2xlbl9fLAorICAgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xDbHJDZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlMQ2xyQ2VsbCh0aGVDZWxsLAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExDbHJDZWxsKHRoZUNlbGwsCisgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEdldENlbGwoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqZGF0YVB0cl9fb3V0X187Ci0Jc2hvcnQgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaU8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHJfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAoKGRhdGFQdHJfX291dF9fID0gbWFsbG9jKGRhdGFQdHJfX2luX2xlbl9fKSkgPT0gTlVMTCkKLQl7Ci0JCVB5RXJyX05vTWVtb3J5KCk7Ci0JCWdvdG8gZGF0YVB0cl9fZXJyb3JfXzsKLQl9Ci0JZGF0YVB0cl9fbGVuX18gPSBkYXRhUHRyX19pbl9sZW5fXzsKLQlMR2V0Q2VsbChkYXRhUHRyX19vdXRfXywgJmRhdGFQdHJfX2xlbl9fLAotCSAgICAgICAgIHRoZUNlbGwsCi0JICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyX19vdXRfXywgKGludClkYXRhUHRyX19sZW5fXyk7Ci0JZnJlZShkYXRhUHRyX19vdXRfXyk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKmRhdGFQdHJfX291dF9fOworICAgIHNob3J0IGRhdGFQdHJfX2xlbl9fOworICAgIGludCBkYXRhUHRyX19pbl9sZW5fXzsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkYXRhUHRyX19vdXRfXyA9IG1hbGxvYyhkYXRhUHRyX19pbl9sZW5fXykpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICBnb3RvIGRhdGFQdHJfX2Vycm9yX187CisgICAgfQorICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgTEdldENlbGwoZGF0YVB0cl9fb3V0X18sICZkYXRhUHRyX19sZW5fXywKKyAgICAgICAgICAgICB0aGVDZWxsLAorICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0cl9fb3V0X18sIChpbnQpZGF0YVB0cl9fbGVuX18pOworICAgIGZyZWUoZGF0YVB0cl9fb3V0X18pOwogIGRhdGFQdHJfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xSZWN0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgY2VsbFJlY3Q7Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCUxSZWN0KCZjZWxsUmVjdCwKLQkgICAgICB0aGVDZWxsLAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY2VsbFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGNlbGxSZWN0OworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMUmVjdCgmY2VsbFJlY3QsCisgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNlbGxSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xTZXRDZWxsKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKmRhdGFQdHJfX2luX187Ci0Jc2hvcnQgZGF0YVB0cl9fbGVuX187Ci0JaW50IGRhdGFQdHJfX2luX2xlbl9fOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCWRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187Ci0JTFNldENlbGwoZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCi0JICAgICAgICAgdGhlQ2VsbCwKLQkgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKmRhdGFQdHJfX2luX187CisgICAgc2hvcnQgZGF0YVB0cl9fbGVuX187CisgICAgaW50IGRhdGFQdHJfX2luX2xlbl9fOworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyX19pbl9fLCAmZGF0YVB0cl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGFQdHJfX2xlbl9fID0gZGF0YVB0cl9faW5fbGVuX187CisgICAgTFNldENlbGwoZGF0YVB0cl9faW5fXywgZGF0YVB0cl9fbGVuX18sCisgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9MU2V0U2VsZWN0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gc2V0SXQ7Ci0JUG9pbnQgdGhlQ2VsbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0SXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCi0JCXJldHVybiBOVUxMOwotCUxTZXRTZWxlY3Qoc2V0SXQsCi0JICAgICAgICAgICB0aGVDZWxsLAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIHNldEl0OworICAgIFBvaW50IHRoZUNlbGw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldEl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMU2V0U2VsZWN0KHNldEl0LAorICAgICAgICAgICAgICAgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0xEcmF3KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHRoZUNlbGw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZUNlbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlMRHJhdyh0aGVDZWxsLAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgdGhlQ2VsbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlQ2VsbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExEcmF3KHRoZUNlbGwsCisgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfTEdldENlbGxEYXRhTG9jYXRpb24oTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgb2Zmc2V0OwotCXNob3J0IGxlbjsKLQlQb2ludCB0aGVDZWxsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTEdldENlbGxEYXRhTG9jYXRpb24oJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAmbGVuLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUNlbGwsCi0JICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgb2Zmc2V0OworICAgIHNob3J0IGxlbjsKKyAgICBQb2ludCB0aGVDZWxsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVDZWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTEdldENlbGxEYXRhTG9jYXRpb24oJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RQb3J0KExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdFZlcnRpY2FsU2Nyb2xsQmFyKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xIYW5kbGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0VmVydGljYWxTY3JvbGxCYXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb250cm9sSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdFZlcnRpY2FsU2Nyb2xsQmFyKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3RsT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RIb3Jpem9udGFsU2Nyb2xsQmFyKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbnRyb2xIYW5kbGUgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbnRyb2xIYW5kbGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0QWN0aXZlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0QWN0aXZlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdEFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RDbGlja1RpbWUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdENsaWNrVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdENsaWNrVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3RSZWZDb24oTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDMyIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFJlZkNvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdFJlZkNvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX0dldExpc3REZWZpbml0aW9uKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3REZWZpbml0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdERlZmluaXRpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdFVzZXJIYW5kbGUoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdFVzZXJIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0VXNlckhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0RGF0YUhhbmRsZShMaXN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlEYXRhSGFuZGxlIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TGlzdERhdGFIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBEYXRhSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TGlzdERhdGFIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfR2V0TGlzdEZsYWdzKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9wdGlvbkJpdHMgX3J2OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRMaXN0RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9wdGlvbkJpdHMgX3J2OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRMaXN0RmxhZ3MoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdE9ial9HZXRMaXN0U2VsZWN0aW9uRmxhZ3MoTGlzdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT3B0aW9uQml0cyBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldExpc3RTZWxlY3Rpb25GbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT3B0aW9uQml0cyBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldExpc3RTZWxlY3Rpb25GbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2FzX1Jlc291cmNlKExpc3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgTGlzdE9ial9tZXRob2RzW10gPSB7Ci0JeyJMQWRkQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZENvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJMQWRkUm93IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZFJvdywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IHJvd051bSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJMRGVsQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERlbENvbHVtbiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gTm9uZSIpfSwKLQl7IkxEZWxSb3ciLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MRGVsUm93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjb3VudCwgc2hvcnQgcm93TnVtKSAtPiBOb25lIil9LAotCXsiTEdldFNlbGVjdCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRTZWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gbmV4dCwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJvb2xlYW4gX3J2LCBQb2ludCB0aGVDZWxsKSIpfSwKLQl7IkxMYXN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MTGFzdENsaWNrLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQb2ludCBfcnYpIil9LAotCXsiTE5leHRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTE5leHRDZWxsLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGhOZXh0LCBCb29sZWFuIHZOZXh0LCBQb2ludCB0aGVDZWxsKSAtPiAoQm9vbGVhbiBfcnYsIFBvaW50IHRoZUNlbGwpIil9LAotCXsiTFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGlzdFdpZHRoLCBzaG9ydCBsaXN0SGVpZ2h0KSAtPiBOb25lIil9LAotCXsiTFNldERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldERyYXdpbmdNb2RlLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGRyYXdJdCkgLT4gTm9uZSIpfSwKLQl7IkxTY3JvbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkQ29scywgc2hvcnQgZFJvd3MpIC0+IE5vbmUiKX0sCi0JeyJMQXV0b1Njcm9sbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBdXRvU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJMVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFVwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbikgLT4gTm9uZSIpfSwKLQl7IkxBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBY3RpdmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3QpIC0+IE5vbmUiKX0sCi0JeyJMQ2VsbFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2VsbFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGNTaXplKSAtPiBOb25lIil9LAotCXsiTENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTEFkZFRvQ2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRUb0NlbGwsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAotCXsiTENsckNlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2xyQ2VsbCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKLQl7IkxHZXRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEdldENlbGwsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiAoQnVmZmVyIGRhdGFQdHIpIil9LAotCXsiTFJlY3QiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gKFJlY3QgY2VsbFJlY3QpIil9LAotCXsiTFNldENlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2V0Q2VsbCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIGRhdGFQdHIsIFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCi0JeyJMU2V0U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldFNlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBzZXRJdCwgUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKLQl7IkxEcmF3IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERyYXcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCi0JeyJMR2V0Q2VsbERhdGFMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRDZWxsRGF0YUxvY2F0aW9uLCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVDZWxsKSAtPiAoc2hvcnQgb2Zmc2V0LCBzaG9ydCBsZW4pIil9LAotCXsiR2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7IkdldExpc3RWZXJ0aWNhbFNjcm9sbEJhciIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RWZXJ0aWNhbFNjcm9sbEJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdEFjdGl2ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldExpc3RDbGlja1RpbWUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0Q2xpY2tUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldExpc3REZWZpbml0aW9uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdERlZmluaXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0TGlzdFVzZXJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0VXNlckhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRMaXN0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3REYXRhSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChEYXRhSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRMaXN0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9wdGlvbkJpdHMgX3J2KSIpfSwKLQl7IkdldExpc3RTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RTZWxlY3Rpb25GbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoT3B0aW9uQml0cyBfcnYpIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9hc19SZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJMQWRkQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZENvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJMQWRkUm93IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEFkZFJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IHJvd051bSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJMRGVsQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERlbENvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQsIHNob3J0IGNvbE51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkxEZWxSb3ciLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MRGVsUm93LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCwgc2hvcnQgcm93TnVtKSAtPiBOb25lIil9LAorICAgIHsiTEdldFNlbGVjdCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gbmV4dCwgUG9pbnQgdGhlQ2VsbCkgLT4gKEJvb2xlYW4gX3J2LCBQb2ludCB0aGVDZWxsKSIpfSwKKyAgICB7IkxMYXN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MTGFzdENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQb2ludCBfcnYpIil9LAorICAgIHsiTE5leHRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTE5leHRDZWxsLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhOZXh0LCBCb29sZWFuIHZOZXh0LCBQb2ludCB0aGVDZWxsKSAtPiAoQm9vbGVhbiBfcnYsIFBvaW50IHRoZUNlbGwpIil9LAorICAgIHsiTFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGlzdFdpZHRoLCBzaG9ydCBsaXN0SGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiTFNldERyYXdpbmdNb2RlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldERyYXdpbmdNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGRyYXdJdCkgLT4gTm9uZSIpfSwKKyAgICB7IkxTY3JvbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkQ29scywgc2hvcnQgZFJvd3MpIC0+IE5vbmUiKX0sCisgICAgeyJMQXV0b1Njcm9sbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBdXRvU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJMVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZVJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkxBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBY3RpdmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBhY3QpIC0+IE5vbmUiKX0sCisgICAgeyJMQ2VsbFNpemUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2VsbFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IGNTaXplKSAtPiBOb25lIil9LAorICAgIHsiTENsaWNrIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTEFkZFRvQ2VsbCIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xBZGRUb0NlbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiBOb25lIil9LAorICAgIHsiTENsckNlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MQ2xyQ2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKKyAgICB7IkxHZXRDZWxsIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTEdldENlbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciBkYXRhUHRyLCBQb2ludCB0aGVDZWxsKSAtPiAoQnVmZmVyIGRhdGFQdHIpIil9LAorICAgIHsiTFJlY3QiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlQ2VsbCkgLT4gKFJlY3QgY2VsbFJlY3QpIil9LAorICAgIHsiTFNldENlbGwiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9MU2V0Q2VsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIGRhdGFQdHIsIFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCisgICAgeyJMU2V0U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTFNldFNlbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBzZXRJdCwgUG9pbnQgdGhlQ2VsbCkgLT4gTm9uZSIpfSwKKyAgICB7IkxEcmF3IiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfTERyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZUNlbGwpIC0+IE5vbmUiKX0sCisgICAgeyJMR2V0Q2VsbERhdGFMb2NhdGlvbiIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0xHZXRDZWxsRGF0YUxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVDZWxsKSAtPiAoc2hvcnQgb2Zmc2V0LCBzaG9ydCBsZW4pIil9LAorICAgIHsiR2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IkdldExpc3RWZXJ0aWNhbFNjcm9sbEJhciIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RWZXJ0aWNhbFNjcm9sbEJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdEhvcml6b250YWxTY3JvbGxCYXIiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0SG9yaXpvbnRhbFNjcm9sbEJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29udHJvbEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdEFjdGl2ZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldExpc3RDbGlja1RpbWUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0Q2xpY2tUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkdldExpc3REZWZpbml0aW9uIiwgKFB5Q0Z1bmN0aW9uKUxpc3RPYmpfR2V0TGlzdERlZmluaXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TGlzdFVzZXJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0VXNlckhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRMaXN0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3REYXRhSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChEYXRhSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRMaXN0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9HZXRMaXN0RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE9wdGlvbkJpdHMgX3J2KSIpfSwKKyAgICB7IkdldExpc3RTZWxlY3Rpb25GbGFncyIsIChQeUNGdW5jdGlvbilMaXN0T2JqX0dldExpc3RTZWxlY3Rpb25GbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoT3B0aW9uQml0cyBfcnYpIil9LAorICAgIHsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTGlzdE9ial9hc19SZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RPYmpfZ2V0X2xpc3RGbGFncyhMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpR2V0TGlzdEZsYWdzKHNlbGYtPm9iX2l0c2VsZikgJiAweGZmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RGbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7CiB9CiAKIHN0YXRpYyBpbnQgTGlzdE9ial9zZXRfbGlzdEZsYWdzKExpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWlmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5saXN0RmxhZ3MpKSByZXR1cm4gLTE7Ci0JcmV0dXJuIDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPmxpc3RGbGFncykpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2dldF9zZWxGbGFncyhMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgKGxvbmcpR2V0TGlzdFNlbGVjdGlvbkZsYWdzKHNlbGYtPm9iX2l0c2VsZikgJiAweGZmKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RTZWxlY3Rpb25GbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7CiB9CiAKIHN0YXRpYyBpbnQgTGlzdE9ial9zZXRfc2VsRmxhZ3MoTGlzdE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbEZsYWdzKSkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxGbGFncykpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX2dldF9jZWxsU2l6ZShMaXN0T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsICgqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUG9pbnQsICgqc2VsZi0+b2JfaXRzZWxmKS0+Y2VsbFNpemUpOwogfQogCiBzdGF0aWMgaW50IExpc3RPYmpfc2V0X2NlbGxTaXplKExpc3RPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2LCB2b2lkICpjbG9zdXJlKQogewotCWlmICghUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICYoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKSkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICghUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICYoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKSkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlHZXRTZXREZWYgTGlzdE9ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJsaXN0RmxhZ3MiLCAoZ2V0dGVyKUxpc3RPYmpfZ2V0X2xpc3RGbGFncywgKHNldHRlcilMaXN0T2JqX3NldF9saXN0RmxhZ3MsIE5VTEx9LAotCXsic2VsRmxhZ3MiLCAoZ2V0dGVyKUxpc3RPYmpfZ2V0X3NlbEZsYWdzLCAoc2V0dGVyKUxpc3RPYmpfc2V0X3NlbEZsYWdzLCBOVUxMfSwKLQl7ImNlbGxTaXplIiwgKGdldHRlcilMaXN0T2JqX2dldF9jZWxsU2l6ZSwgKHNldHRlcilMaXN0T2JqX3NldF9jZWxsU2l6ZSwgTlVMTH0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsibGlzdEZsYWdzIiwgKGdldHRlcilMaXN0T2JqX2dldF9saXN0RmxhZ3MsIChzZXR0ZXIpTGlzdE9ial9zZXRfbGlzdEZsYWdzLCBOVUxMfSwKKyAgICB7InNlbEZsYWdzIiwgKGdldHRlcilMaXN0T2JqX2dldF9zZWxGbGFncywgKHNldHRlcilMaXN0T2JqX3NldF9zZWxGbGFncywgTlVMTH0sCisgICAgeyJjZWxsU2l6ZSIsIChnZXR0ZXIpTGlzdE9ial9nZXRfY2VsbFNpemUsIChzZXR0ZXIpTGlzdE9ial9zZXRfY2VsbFNpemUsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtNzQyLDYxICs3NDIsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlMaXN0SGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTGlzdEhhbmRsZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBMaXN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTGlzdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBMaXN0T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTGlzdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBMaXN0T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IExpc3RfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfTGlzdC5MaXN0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTGlzdE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIExpc3RPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTGlzdE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTGlzdE9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgTGlzdE9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlMaXN0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUxpc3RPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JTGlzdE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTGlzdE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlMaXN0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JTGlzdE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX0xpc3QuTGlzdCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKExpc3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBMaXN0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIExpc3RPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIExpc3RPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIExpc3RPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTGlzdE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBMaXN0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIExpc3RPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIExpc3RPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTGlzdE9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIExpc3RPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC04MDQsMjYzICs4MDQsMjYzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9DcmVhdGVDdXN0b21MaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJWaWV3OwotCVJlY3QgZGF0YUJvdW5kczsKLQlQb2ludCBjZWxsU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByVmlldzsKKyAgICBSZWN0IGRhdGFCb3VuZHM7CisgICAgUG9pbnQgY2VsbFNpemU7CiAKLQlQeU9iamVjdCAqbGlzdERlZkZ1bmM7Ci0JTGlzdERlZlNwZWMgdGhlU3BlYzsKLQlXaW5kb3dQdHIgdGhlV2luZG93OwotCUJvb2xlYW4gZHJhd0l0OwotCUJvb2xlYW4gaGFzR3JvdzsKLQlCb29sZWFuIHNjcm9sbEhvcml6OwotCUJvb2xlYW4gc2Nyb2xsVmVydDsKLQlMaXN0SGFuZGxlIG91dExpc3Q7CisgICAgUHlPYmplY3QgKmxpc3REZWZGdW5jOworICAgIExpc3REZWZTcGVjIHRoZVNwZWM7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBCb29sZWFuIGhhc0dyb3c7CisgICAgQm9vbGVhbiBzY3JvbGxIb3JpejsKKyAgICBCb29sZWFuIHNjcm9sbFZlcnQ7CisgICAgTGlzdEhhbmRsZSBvdXRMaXN0OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mKGlPKU8mYmJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVmlldywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRhdGFCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmY2VsbFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVTcGVjLmRlZlR5cGUsICZsaXN0RGVmRnVuYywKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZkcmF3SXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYXNHcm93LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxWZXJ0KSkKLQkgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJihpTylPJmJiYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkYXRhQm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNlbGxTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlU3BlYy5kZWZUeXBlLCAmbGlzdERlZkZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJhd0l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzR3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbEhvcml6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsVmVydCkpCisgICAgICAgIHJldHVybiBOVUxMOwogCiAKLQkvKiBDYXJib24gYXBwbGljYXRpb25zIHVzZSB0aGUgQ3JlYXRlQ3VzdG9tTGlzdCBBUEkgKi8KLQl0aGVTcGVjLnUudXNlclByb2MgPSBteUxpc3REZWZGdW5jdGlvblVQUDsKLQlDcmVhdGVDdXN0b21MaXN0KCZyVmlldywKLQkgICAgICAgICAgICAgICAgICZkYXRhQm91bmRzLAotCSAgICAgICAgICAgICAgICAgY2VsbFNpemUsCi0JICAgICAgICAgICAgICAgICAmdGhlU3BlYywKLQkgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgIGRyYXdJdCwKLQkgICAgICAgICAgICAgICAgIGhhc0dyb3csCi0JICAgICAgICAgICAgICAgICBzY3JvbGxIb3JpeiwKLQkgICAgICAgICAgICAgICAgIHNjcm9sbFZlcnQsCi0JICAgICAgICAgICAgICAgICAmb3V0TGlzdCk7CisgICAgLyogQ2FyYm9uIGFwcGxpY2F0aW9ucyB1c2UgdGhlIENyZWF0ZUN1c3RvbUxpc3QgQVBJICovCisgICAgdGhlU3BlYy51LnVzZXJQcm9jID0gbXlMaXN0RGVmRnVuY3Rpb25VUFA7CisgICAgQ3JlYXRlQ3VzdG9tTGlzdCgmclZpZXcsCisgICAgICAgICAgICAgICAgICAgICAmZGF0YUJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgIGNlbGxTaXplLAorICAgICAgICAgICAgICAgICAgICAgJnRoZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICBkcmF3SXQsCisgICAgICAgICAgICAgICAgICAgICBoYXNHcm93LAorICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSG9yaXosCisgICAgICAgICAgICAgICAgICAgICBzY3JvbGxWZXJ0LAorICAgICAgICAgICAgICAgICAgICAgJm91dExpc3QpOwogCiAKLQlfcmVzID0gTGlzdE9ial9OZXcob3V0TGlzdCk7Ci0JaWYgKF9yZXMgPT0gTlVMTCkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCVB5X0lOQ1JFRihsaXN0RGVmRnVuYyk7Ci0JKChMaXN0T2JqZWN0KilfcmVzKS0+b2JfbGRlZl9mdW5jID0gbGlzdERlZkZ1bmM7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IExpc3RPYmpfTmV3KG91dExpc3QpOworICAgIGlmIChfcmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihsaXN0RGVmRnVuYyk7CisgICAgKChMaXN0T2JqZWN0KilfcmVzKS0+b2JfbGRlZl9mdW5jID0gbGlzdERlZkZ1bmM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9MTmV3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIF9ydjsKLQlSZWN0IHJWaWV3OwotCVJlY3QgZGF0YUJvdW5kczsKLQlQb2ludCBjU2l6ZTsKLQlzaG9ydCB0aGVQcm9jOwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7Ci0JQm9vbGVhbiBkcmF3SXQ7Ci0JQm9vbGVhbiBoYXNHcm93OwotCUJvb2xlYW4gc2Nyb2xsSG9yaXo7Ci0JQm9vbGVhbiBzY3JvbGxWZXJ0OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJmJiYmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmclZpZXcsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkYXRhQm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlUHJvYywKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZkcmF3SXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoYXNHcm93LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsSG9yaXosCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxWZXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE5ldygmclZpZXcsCi0JICAgICAgICAgICAmZGF0YUJvdW5kcywKLQkgICAgICAgICAgIGNTaXplLAotCSAgICAgICAgICAgdGhlUHJvYywKLQkgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgIGRyYXdJdCwKLQkgICAgICAgICAgIGhhc0dyb3csCi0JICAgICAgICAgICBzY3JvbGxIb3JpeiwKLQkgICAgICAgICAgIHNjcm9sbFZlcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgX3J2OworICAgIFJlY3QgclZpZXc7CisgICAgUmVjdCBkYXRhQm91bmRzOworICAgIFBvaW50IGNTaXplOworICAgIHNob3J0IHRoZVByb2M7CisgICAgV2luZG93UHRyIHRoZVdpbmRvdzsKKyAgICBCb29sZWFuIGRyYXdJdDsKKyAgICBCb29sZWFuIGhhc0dyb3c7CisgICAgQm9vbGVhbiBzY3JvbGxIb3JpejsKKyAgICBCb29sZWFuIHNjcm9sbFZlcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maE8mYmJiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRhdGFCb3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdJdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc0dyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxIb3JpeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbFZlcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTmV3KCZyVmlldywKKyAgICAgICAgICAgICAgICZkYXRhQm91bmRzLAorICAgICAgICAgICAgICAgY1NpemUsCisgICAgICAgICAgICAgICB0aGVQcm9jLAorICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgZHJhd0l0LAorICAgICAgICAgICAgICAgaGFzR3JvdywKKyAgICAgICAgICAgICAgIHNjcm9sbEhvcml6LAorICAgICAgICAgICAgICAgc2Nyb2xsVmVydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RWaWV3Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JUmVjdCB2aWV3OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdmlldykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RWaWV3Qm91bmRzKGxpc3QsCi0JICAgICAgICAgICAgICAgICAgJnZpZXcpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIFJlY3QgdmlldzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0Vmlld0JvdW5kcyhsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICZ2aWV3KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0UG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCUNHcmFmUHRyIHBvcnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRMaXN0UG9ydChsaXN0LAotCSAgICAgICAgICAgIHBvcnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0UG9ydChsaXN0LAorICAgICAgICAgICAgICAgIHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RDZWxsSW5kZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JUG9pbnQgaW5kZW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluZGVudCkpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RDZWxsSW5kZW50KGxpc3QsCi0JICAgICAgICAgICAgICAgICAgJmluZGVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgUG9pbnQgaW5kZW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmluZGVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldExpc3RDZWxsSW5kZW50KGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgJmluZGVudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdENsaWNrVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTGlzdEhhbmRsZSBsaXN0OwotCVNJbnQzMiB0aW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TGlzdENsaWNrVGltZShsaXN0LAotCSAgICAgICAgICAgICAgICAgdGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgU0ludDMyIHRpbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0Q2xpY2tUaW1lKGxpc3QsCisgICAgICAgICAgICAgICAgICAgICB0aW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0UmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JU0ludDMyIHJlZkNvbjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TGlzdFJlZkNvbihsaXN0LAotCSAgICAgICAgICAgICAgcmVmQ29uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIExpc3RIYW5kbGUgbGlzdDsKKyAgICBTSW50MzIgcmVmQ29uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0UmVmQ29uKGxpc3QsCisgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X1NldExpc3RVc2VySGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JSGFuZGxlIHVzZXJIYW5kbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXNlckhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RVc2VySGFuZGxlKGxpc3QsCi0JICAgICAgICAgICAgICAgICAgdXNlckhhbmRsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgSGFuZGxlIHVzZXJIYW5kbGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXNlckhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldExpc3RVc2VySGFuZGxlKGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgdXNlckhhbmRsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkxpc3RfU2V0TGlzdEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlMaXN0SGFuZGxlIGxpc3Q7Ci0JT3B0aW9uQml0cyBsaXN0RmxhZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTGlzdE9ial9Db252ZXJ0LCAmbGlzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpc3RGbGFncykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RGbGFncyhsaXN0LAotCSAgICAgICAgICAgICBsaXN0RmxhZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTGlzdEhhbmRsZSBsaXN0OworICAgIE9wdGlvbkJpdHMgbGlzdEZsYWdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXN0RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0RmxhZ3MobGlzdCwKKyAgICAgICAgICAgICAgICAgbGlzdEZsYWdzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTGlzdF9TZXRMaXN0U2VsZWN0aW9uRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUxpc3RIYW5kbGUgbGlzdDsKLQlPcHRpb25CaXRzIHNlbGVjdGlvbkZsYWdzOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIExpc3RPYmpfQ29udmVydCwgJmxpc3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3Rpb25GbGFncykpCi0JCXJldHVybiBOVUxMOwotCVNldExpc3RTZWxlY3Rpb25GbGFncyhsaXN0LAotCSAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25GbGFncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBMaXN0SGFuZGxlIGxpc3Q7CisgICAgT3B0aW9uQml0cyBzZWxlY3Rpb25GbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0T2JqX0NvbnZlcnQsICZsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRMaXN0U2VsZWN0aW9uRmxhZ3MobGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpMaXN0X2FzX0xpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCUhhbmRsZSBoOwotCUxpc3RPYmplY3QgKmw7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBSZXNPYmpfQ29udmVydCwgJmgpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JbCA9IChMaXN0T2JqZWN0ICopTGlzdE9ial9OZXcoYXNfTGlzdChoKSk7Ci0JbC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDA7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLCBsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBIYW5kbGUgaDsKKyAgICBMaXN0T2JqZWN0ICpsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgbCA9IChMaXN0T2JqZWN0ICopTGlzdE9ial9OZXcoYXNfTGlzdChoKSk7CisgICAgbC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDA7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8iLCBsKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBMaXN0X21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkNyZWF0ZUN1c3RvbUxpc3QiLCAoUHlDRnVuY3Rpb24pTGlzdF9DcmVhdGVDdXN0b21MaXN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHJWaWV3LCBSZWN0IGRhdGFCb3VuZHMsIFBvaW50IGNlbGxTaXplLCBMaXN0RGVmU3BlYyB0aGVTcGVjLCBXaW5kb3dQdHIgdGhlV2luZG93LCBCb29sZWFuIGRyYXdJdCwgQm9vbGVhbiBoYXNHcm93LCBCb29sZWFuIHNjcm9sbEhvcml6LCBCb29sZWFuIHNjcm9sbFZlcnQpIC0+IChMaXN0SGFuZGxlIG91dExpc3QpIil9LAotCXsiTE5ldyIsIChQeUNGdW5jdGlvbilMaXN0X0xOZXcsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgclZpZXcsIFJlY3QgZGF0YUJvdW5kcywgUG9pbnQgY1NpemUsIHNob3J0IHRoZVByb2MsIFdpbmRvd1B0ciB0aGVXaW5kb3csIEJvb2xlYW4gZHJhd0l0LCBCb29sZWFuIGhhc0dyb3csIEJvb2xlYW4gc2Nyb2xsSG9yaXosIEJvb2xlYW4gc2Nyb2xsVmVydCkgLT4gKExpc3RIYW5kbGUgX3J2KSIpfSwKLQl7IlNldExpc3RWaWV3Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFZpZXdCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgUmVjdCB2aWV3KSAtPiBOb25lIil9LAotCXsiU2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAotCXsiU2V0TGlzdENlbGxJbmRlbnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0Q2VsbEluZGVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBQb2ludCBpbmRlbnQpIC0+IE5vbmUiKX0sCi0JeyJTZXRMaXN0Q2xpY2tUaW1lIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdENsaWNrVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBTSW50MzIgdGltZSkgLT4gTm9uZSIpfSwKLQl7IlNldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIFNJbnQzMiByZWZDb24pIC0+IE5vbmUiKX0sCi0JeyJTZXRMaXN0VXNlckhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RVc2VySGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIEhhbmRsZSB1c2VySGFuZGxlKSAtPiBOb25lIil9LAotCXsiU2V0TGlzdEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgbGlzdEZsYWdzKSAtPiBOb25lIil9LAotCXsiU2V0TGlzdFNlbGVjdGlvbkZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFNlbGVjdGlvbkZsYWdzLCAxLAotCSBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgc2VsZWN0aW9uRmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJhc19MaXN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfYXNfTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzb3VyY2UpLT5MaXN0LlxuUmV0dXJucyBMaXN0IG9iamVjdCAod2hpY2ggaXMgbm90IGF1dG8tZnJlZWQhKSIpfSwKKyAgICB7IkNyZWF0ZUN1c3RvbUxpc3QiLCAoUHlDRnVuY3Rpb24pTGlzdF9DcmVhdGVDdXN0b21MaXN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJWaWV3LCBSZWN0IGRhdGFCb3VuZHMsIFBvaW50IGNlbGxTaXplLCBMaXN0RGVmU3BlYyB0aGVTcGVjLCBXaW5kb3dQdHIgdGhlV2luZG93LCBCb29sZWFuIGRyYXdJdCwgQm9vbGVhbiBoYXNHcm93LCBCb29sZWFuIHNjcm9sbEhvcml6LCBCb29sZWFuIHNjcm9sbFZlcnQpIC0+IChMaXN0SGFuZGxlIG91dExpc3QpIil9LAorICAgIHsiTE5ldyIsIChQeUNGdW5jdGlvbilMaXN0X0xOZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgclZpZXcsIFJlY3QgZGF0YUJvdW5kcywgUG9pbnQgY1NpemUsIHNob3J0IHRoZVByb2MsIFdpbmRvd1B0ciB0aGVXaW5kb3csIEJvb2xlYW4gZHJhd0l0LCBCb29sZWFuIGhhc0dyb3csIEJvb2xlYW4gc2Nyb2xsSG9yaXosIEJvb2xlYW4gc2Nyb2xsVmVydCkgLT4gKExpc3RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldExpc3RWaWV3Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFZpZXdCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKExpc3RIYW5kbGUgbGlzdCwgUmVjdCB2aWV3KSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdFBvcnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBDR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdENlbGxJbmRlbnQiLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0Q2VsbEluZGVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBQb2ludCBpbmRlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRMaXN0Q2xpY2tUaW1lIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdENsaWNrVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTGlzdEhhbmRsZSBsaXN0LCBTSW50MzIgdGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldExpc3RSZWZDb24iLCAoUHlDRnVuY3Rpb24pTGlzdF9TZXRMaXN0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIFNJbnQzMiByZWZDb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRMaXN0VXNlckhhbmRsZSIsIChQeUNGdW5jdGlvbilMaXN0X1NldExpc3RVc2VySGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIEhhbmRsZSB1c2VySGFuZGxlKSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgbGlzdEZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiU2V0TGlzdFNlbGVjdGlvbkZsYWdzIiwgKFB5Q0Z1bmN0aW9uKUxpc3RfU2V0TGlzdFNlbGVjdGlvbkZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihMaXN0SGFuZGxlIGxpc3QsIE9wdGlvbkJpdHMgc2VsZWN0aW9uRmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJhc19MaXN0IiwgKFB5Q0Z1bmN0aW9uKUxpc3RfYXNfTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzb3VyY2UpLT5MaXN0LlxuUmV0dXJucyBMaXN0IG9iamVjdCAod2hpY2ggaXMgbm90IGF1dG8tZnJlZWQhKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2lmbmRlZiBfX0xQNjRfXwpAQCAtMTA3NCw2NSArMTA3NCw2NSBAQAogICAgICAgICAgICAgICAgICAgICAgICBTSW50MTYgZGF0YUxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgTGlzdEhhbmRsZSB0aGVMaXN0KQogewotICAgICAgICBQeU9iamVjdCAqbGlzdERlZkZ1bmMsICphcmdzLCAqcnY9TlVMTDsKLSAgICAgICAgTGlzdE9iamVjdCAqc2VsZjsKKyAgICBQeU9iamVjdCAqbGlzdERlZkZ1bmMsICphcmdzLCAqcnY9TlVMTDsKKyAgICBMaXN0T2JqZWN0ICpzZWxmOwogCi0gICAgICAgIHNlbGYgPSAoTGlzdE9iamVjdCopR2V0TGlzdFJlZkNvbih0aGVMaXN0KTsKLSAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5vYl9pdHNlbGYgIT0gdGhlTGlzdCkKLSAgICAgICAgICAgICAgICByZXR1cm47ICAvKiBub3RoaW5nIHdlIGNhbiBkbyAqLwotICAgICAgICBsaXN0RGVmRnVuYyA9IHNlbGYtPm9iX2xkZWZfZnVuYzsKLSAgICAgICAgaWYgKGxpc3REZWZGdW5jID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KLSAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoImhiTyZPJmhoTyIsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgY2VsbFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB0aGVDZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKLSAgICAgICAgaWYgKGFyZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QobGlzdERlZkZ1bmMsIGFyZ3MpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJlcnJvciBpbiBsaXN0IGRlZmluaXRpb24gY2FsbGJhY2s6XG4iKTsKLSAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIH0KKyAgICBzZWxmID0gKExpc3RPYmplY3QqKUdldExpc3RSZWZDb24odGhlTGlzdCk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5vYl9pdHNlbGYgIT0gdGhlTGlzdCkKKyAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICBsaXN0RGVmRnVuYyA9IHNlbGYtPm9iX2xkZWZfZnVuYzsKKyAgICBpZiAobGlzdERlZkZ1bmMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiaGJPJk8maGhPIiwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgY2VsbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOworICAgIGlmIChhcmdzICE9IE5VTEwpIHsKKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChsaXN0RGVmRnVuYywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICB9CisgICAgaWYgKHJ2ID09IE5VTEwpIHsKKyAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoImVycm9yIGluIGxpc3QgZGVmaW5pdGlvbiBjYWxsYmFjazpcbiIpOworICAgICAgICBQeUVycl9QcmludCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgfQogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAogdm9pZCBpbml0X0xpc3Qodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQlteUxpc3REZWZGdW5jdGlvblVQUCA9IE5ld0xpc3REZWZVUFAoKExpc3REZWZQcm9jUHRyKW15TGlzdERlZkZ1bmN0aW9uKTsKKyAgICBteUxpc3REZWZGdW5jdGlvblVQUCA9IE5ld0xpc3REZWZVUFAoKExpc3REZWZQcm9jUHRyKW15TGlzdERlZkZ1bmN0aW9uKTsKIAotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKExpc3RIYW5kbGUsIExpc3RPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTGlzdEhhbmRsZSwgTGlzdE9ial9Db252ZXJ0KTsKKyAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhMaXN0SGFuZGxlLCBMaXN0T2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKExpc3RIYW5kbGUsIExpc3RPYmpfQ29udmVydCk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9MaXN0IiwgTGlzdF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX0xpc3QiLCBMaXN0X21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCUxpc3RfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChMaXN0X0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTGlzdF9FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUxpc3RfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkxpc3RfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZMaXN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTGlzdCIsIChQeU9iamVjdCAqKSZMaXN0X1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmTGlzdF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkxpc3RUeXBlIiwgKFB5T2JqZWN0ICopJkxpc3RfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgTGlzdF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKExpc3RfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBMaXN0X0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgTGlzdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTGlzdF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkxpc3RfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJMaXN0IiwgKFB5T2JqZWN0ICopJkxpc3RfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZMaXN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTGlzdFR5cGUiLCAoUHlPYmplY3QgKikmTGlzdF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9tZW51L19NZW51bW9kdWxlLmMgYi9NYWMvTW9kdWxlcy9tZW51L19NZW51bW9kdWxlLmMKaW5kZXggNjZlYmY3OS4uZGJiMDc1YyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbWVudS9fTWVudW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL21lbnUvX01lbnVtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzUsMjEgKzM1LDIxIEBACiAvKiBBbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIE1lbnVPYmpfTmV3LCB3aGljaCByZXR1cm5zIE5vbmUgZm9yIE5VTEwgYXJndW1lbnQgKi8KIFB5T2JqZWN0ICpPcHRNZW51T2JqX05ldyhNZW51UmVmIGl0c2VsZikKIHsKLSAgICAgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZW51T2JqX05ldyhpdHNlbGYpOworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gTWVudU9ial9OZXcoaXRzZWxmKTsKIH0KIAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBNZW51T2JqX0NvbnZlcnQsIHdoaWNoIHJldHVybnMgTlVMTCBmb3IgYSBOb25lIGFyZ3VtZW50ICovCiBpbnQgT3B0TWVudU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNZW51UmVmICpwX2l0c2VsZikKIHsKLSAgICAgICAgaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0gICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVudU9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKKyAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBNZW51T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRXJyb3I7CkBAIC02MSwyNDY5ICs2MSwyNDY5IEBACiAjZGVmaW5lIE1lbnVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmTWVudV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZNZW51X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNZW51T2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JTWVudUhhbmRsZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIE1lbnVIYW5kbGUgb2JfaXRzZWxmOwogfSBNZW51T2JqZWN0OwogCiBQeU9iamVjdCAqTWVudU9ial9OZXcoTWVudUhhbmRsZSBpdHNlbGYpCiB7Ci0JTWVudU9iamVjdCAqaXQ7Ci0JaXQgPSBQeU9iamVjdF9ORVcoTWVudU9iamVjdCwgJk1lbnVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE1lbnVPYmplY3QgKml0OworICAgIGl0ID0gUHlPYmplY3RfTkVXKE1lbnVPYmplY3QsICZNZW51X1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IE1lbnVPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTWVudUhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFNZW51T2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lbnUgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoTWVudU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFNZW51T2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lbnUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoTWVudU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIE1lbnVPYmpfZGVhbGxvYyhNZW51T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc3Bvc2VNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlzcG9zZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZU1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ2FsY01lbnVTaXplKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2FsY01lbnVTaXplCi0JUHlNYWNfUFJFQ0hFQ0soQ2FsY01lbnVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYWxjTWVudVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNhbGNNZW51U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENhbGNNZW51U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Db3VudE1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MTYgX3J2OwogI2lmbmRlZiBDb3VudE1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50TWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUZvbnQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgb3V0Rm9udElEOwotCVVJbnQxNiBvdXRGb250U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgb3V0Rm9udElEOworICAgIFVJbnQxNiBvdXRGb250U2l6ZTsKICNpZm5kZWYgR2V0TWVudUZvbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51Rm9udChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmb3V0Rm9udElELAotCSAgICAgICAgICAgICAgICAgICAmb3V0Rm9udFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRGb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Rm9udFNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dEZvbnRTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Rm9udElELAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVGb250KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGluRm9udElEOwotCVVJbnQxNiBpbkZvbnRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNJbnQxNiBpbkZvbnRJRDsKKyAgICBVSW50MTYgaW5Gb250U2l6ZTsKICNpZm5kZWYgU2V0TWVudUZvbnQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51Rm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaEgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Gb250SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVGb250KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGluRm9udElELAotCSAgICAgICAgICAgICAgICAgICBpbkZvbnRTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZvbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQsCisgICAgICAgICAgICAgICAgICAgICAgIGluRm9udFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4KLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gZXhjbHVkZXNNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gZXhjbHVkZXNNYXJrOwogI2lmbmRlZiBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmV4Y2x1ZGVzTWFyaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXNNYXJrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4Y2x1ZGVzTWFyaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZXNNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0lzVmFsaWRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNWYWxpZE1lbnUKLQlQeU1hY19QUkVDSEVDSyhJc1ZhbGlkTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzVmFsaWRNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1ZhbGlkTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVSZXRhaW5Db3VudChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OwogI2lmbmRlZiBHZXRNZW51UmV0YWluQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51UmV0YWluQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVSZXRhaW5Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudVJldGFpbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9SZXRhaW5NZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJldGFpbk1lbnUKLQlQeU1hY19QUkVDSEVDSyhSZXRhaW5NZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXRhaW5NZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV0YWluTWVudShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJldGFpbk1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9SZWxlYXNlTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBSZWxlYXNlTWVudQotCVB5TWFjX1BSRUNIRUNLKFJlbGVhc2VNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZWxlYXNlTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFJlbGVhc2VNZW51KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZU1lbnUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EdXBsaWNhdGVNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBvdXRNZW51OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgb3V0TWVudTsKICNpZm5kZWYgRHVwbGljYXRlTWVudQotCVB5TWFjX1BSRUNIRUNLKER1cGxpY2F0ZU1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKER1cGxpY2F0ZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEdXBsaWNhdGVNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEdXBsaWNhdGVNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Db3B5TWVudVRpdGxlQXNDRlN0cmluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIG91dFN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CiAjaWZuZGVmIENvcHlNZW51VGl0bGVBc0NGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlNZW51VGl0bGVBc0NGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlNZW51VGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKICNpZm5kZWYgU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnZhbGlkYXRlTWVudVNpemUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSW52YWxpZGF0ZU1lbnVTaXplCi0JUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1lbnVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnZhbGlkYXRlTWVudVNpemUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbGlkYXRlTWVudVNpemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVTaXplSW52YWxpZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzTWVudVNpemVJbnZhbGlkCi0JUHlNYWNfUFJFQ0hFQ0soSXNNZW51U2l6ZUludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudVNpemVJbnZhbGlkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVTaXplSW52YWxpZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51U2l6ZUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNBcHBlbmRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgZGF0YTsKICNpZm5kZWYgTWFjQXBwZW5kTWVudQotCVB5TWFjX1BSRUNIRUNLKE1hY0FwcGVuZE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0FwcGVuZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRSZXNNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlc1R5cGUgdGhlVHlwZTsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBhZnRlckl0ZW07CiAjaWZuZGVmIEluc2VydFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRSZXNNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhZnRlckl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlJbnNlcnRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0FwcGVuZFJlc01lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CiAjaWZuZGVmIEFwcGVuZFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRSZXNNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBcHBlbmRSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCUFwcGVuZFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHRoZVR5cGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICB0aGVUeXBlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNJbnNlcnRNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgaXRlbVN0cmluZzsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBpdGVtU3RyaW5nOworICAgIHNob3J0IGFmdGVySXRlbTsKICNpZm5kZWYgTWFjSW5zZXJ0TWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhNYWNJbnNlcnRNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjSW5zZXJ0TWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0luc2VydE1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0RlbGV0ZU1lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CiAjaWZuZGVmIERlbGV0ZU1lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURlbGV0ZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgaXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0Rm9udFJlc01lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOwotCXNob3J0IHNjcmlwdEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgYWZ0ZXJJdGVtOworICAgIHNob3J0IHNjcmlwdEZpbHRlcjsKICNpZm5kZWYgSW5zZXJ0Rm9udFJlc01lbnUKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRGb250UmVzTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0Rm9udFJlc01lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0Rm9udFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCi0JICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5zZXJ0Rm9udFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRJbnRsUmVzTWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgYWZ0ZXJJdGVtOwotCXNob3J0IHNjcmlwdEZpbHRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IGFmdGVySXRlbTsKKyAgICBzaG9ydCBzY3JpcHRGaWx0ZXI7CiAjaWZuZGVmIEluc2VydEludGxSZXNNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0SW50bFJlc01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydEludGxSZXNNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RmlsdGVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0SW50bFJlc01lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgIGFmdGVySXRlbSwKLQkgICAgICAgICAgICAgICAgICBzY3JpcHRGaWx0ZXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdEZpbHRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydEludGxSZXNNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0RmlsdGVyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9BcHBlbmRNZW51SXRlbVRleHQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTdHIyNTUgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU3RyMjU1IGluU3RyaW5nOwogI2lmbmRlZiBBcHBlbmRNZW51SXRlbVRleHQKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51SXRlbVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnVJdGVtVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwZW5kTWVudUl0ZW1UZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFwcGVuZE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW5zZXJ0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU3RyMjU1IGluU3RyaW5nOwotCU1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFN0cjI1NSBpblN0cmluZzsKKyAgICBNZW51SXRlbUluZGV4IGFmdGVySXRlbTsKICNpZm5kZWYgSW5zZXJ0TWVudUl0ZW1UZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW1UZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbVRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBJbnNlcnRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluc2VydE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ29weU1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07Ci0JSXRlbUNvdW50IGluTnVtSXRlbXM7Ci0JTWVudUhhbmRsZSBpbkRlc3RNZW51OwotCU1lbnVJdGVtSW5kZXggaW5JbnNlcnRBZnRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOworICAgIEl0ZW1Db3VudCBpbk51bUl0ZW1zOworICAgIE1lbnVIYW5kbGUgaW5EZXN0TWVudTsKKyAgICBNZW51SXRlbUluZGV4IGluSW5zZXJ0QWZ0ZXI7CiAjaWZuZGVmIENvcHlNZW51SXRlbXMKLQlQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1JdGVtcywKLQkgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5EZXN0TWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSW5zZXJ0QWZ0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgIGluTnVtSXRlbXMsCi0JICAgICAgICAgICAgICAgICAgICAgaW5EZXN0TWVudSwKLQkgICAgICAgICAgICAgICAgICAgICBpbkluc2VydEFmdGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtSXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmluRGVzdE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkluc2VydEFmdGVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluRGVzdE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbnNlcnRBZnRlcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EZWxldGVNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtOwotCUl0ZW1Db3VudCBpbk51bUl0ZW1zOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07CisgICAgSXRlbUNvdW50IGluTnVtSXRlbXM7CiAjaWZuZGVmIERlbGV0ZU1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTWVudUl0ZW1zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5OdW1JdGVtcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBEZWxldGVNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5OdW1JdGVtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk51bUl0ZW1zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GaXJzdEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUNGU3RyaW5nUmVmIGluU3RyaW5nOwotCU1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIGluU3RyaW5nOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtOwogI2lmbmRlZiBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0l0ZW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE5ld0l0ZW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TmV3SXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmV3SXRlbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKLQlNZW51SXRlbUluZGV4IGluQWZ0ZXJJdGVtOwotCU1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXM7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgTWVudUl0ZW1JbmRleCBpbkFmdGVySXRlbTsKKyAgICBNZW51SXRlbUF0dHJpYnV0ZXMgaW5BdHRyaWJ1dGVzOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5BZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BZnRlckl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Qb3BVcE1lbnVTZWxlY3QoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0Jc2hvcnQgdG9wOwotCXNob3J0IGxlZnQ7Ci0Jc2hvcnQgcG9wVXBJdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCBwb3BVcEl0ZW07CiAjaWZuZGVmIFBvcFVwTWVudVNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKFBvcFVwTWVudVNlbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9wVXBNZW51U2VsZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9wVXBJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUG9wVXBNZW51U2VsZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgcG9wVXBJdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcFVwSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFBvcFVwTWVudVNlbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcFVwSXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnZhbGlkYXRlTWVudUVuYWJsaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIEludmFsaWRhdGVNZW51RW5hYmxpbmcKLQlQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudUVuYWJsaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbGlkYXRlTWVudUVuYWJsaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW52YWxpZGF0ZU1lbnVFbmFibGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEludmFsaWRhdGVNZW51RW5hYmxpbmcoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVCYXJJbnZhbGlkKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNNZW51QmFySW52YWxpZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUJhckludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUJhckludmFsaWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUJhckludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUJhckludmFsaWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNJbnNlcnRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBiZWZvcmVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUlEIGJlZm9yZUlEOwogI2lmbmRlZiBNYWNJbnNlcnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXJ0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJlZm9yZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjSW5zZXJ0TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgYmVmb3JlSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJlZm9yZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjSW5zZXJ0TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgYmVmb3JlSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldFJvb3RNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFNldFJvb3RNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0Um9vdE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJvb3RNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0Um9vdE1lbnUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRSb290TWVudShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX01hY0NoZWNrTWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaXRlbTsKLQlCb29sZWFuIGNoZWNrZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQm9vbGVhbiBjaGVja2VkOwogI2lmbmRlZiBNYWNDaGVja01lbnVJdGVtCi0JUHlNYWNfUFJFQ0hFQ0soTWFjQ2hlY2tNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjQ2hlY2tNZW51SXRlbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2hlY2tlZCkpCi0JCXJldHVybiBOVUxMOwotCU1hY0NoZWNrTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICBjaGVja2VkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNDaGVja01lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JU3RyMjU1IGl0ZW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3RyMjU1IGl0ZW1TdHJpbmc7CiAjaWZuZGVmIFNldE1lbnVJdGVtVGV4dAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGl0ZW1TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGl0ZW1TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JU3RyMjU1IGl0ZW1TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3RyMjU1IGl0ZW1TdHJpbmc7CiAjaWZuZGVmIEdldE1lbnVJdGVtVGV4dAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1UZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUdldE1lbnVJdGVtVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICBpdGVtU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBpdGVtU3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZW51SXRlbVRleHQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgaXRlbVN0cmluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRJdGVtTWFyayhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgbWFya0NoYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcjsKICNpZm5kZWYgU2V0SXRlbU1hcmsKLQlQeU1hY19QUkVDSEVDSyhTZXRJdGVtTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbU1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1hcmtDaGFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgIG1hcmtDaGFyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmtDaGFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgIG1hcmtDaGFyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJdGVtTWFyayhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgbWFya0NoYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcjsKICNpZm5kZWYgR2V0SXRlbU1hcmsKLQlQeU1hY19QUkVDSEVDSyhHZXRJdGVtTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbU1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbU1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICZtYXJrQ2hhcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG1hcmtDaGFyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRJdGVtTWFyayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgJm1hcmtDaGFyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFya0NoYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0SXRlbUNtZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCUNoYXJQYXJhbWV0ZXIgY21kQ2hhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBDaGFyUGFyYW1ldGVyIGNtZENoYXI7CiAjaWZuZGVmIFNldEl0ZW1DbWQKLQlQeU1hY19QUkVDSEVDSyhTZXRJdGVtQ21kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJdGVtQ21kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZjbWRDaGFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgIGNtZENoYXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY21kQ2hhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEl0ZW1DbWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICBjbWRDaGFyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRJdGVtQ21kKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JQ2hhclBhcmFtZXRlciBjbWRDaGFyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIENoYXJQYXJhbWV0ZXIgY21kQ2hhcjsKICNpZm5kZWYgR2V0SXRlbUNtZAotCVB5TWFjX1BSRUNIRUNLKEdldEl0ZW1DbWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEl0ZW1DbWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICZjbWRDaGFyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgY21kQ2hhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SXRlbUNtZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICZjbWRDaGFyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY21kQ2hhcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRJdGVtSWNvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCXNob3J0IGljb25JbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaXRlbTsKKyAgICBzaG9ydCBpY29uSW5kZXg7CiAjaWZuZGVmIFNldEl0ZW1JY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbUljb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpY29uSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgaWNvbkluZGV4KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmljb25JbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICBpY29uSW5kZXgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEl0ZW1JY29uKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0Jc2hvcnQgaWNvbkluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIHNob3J0IGljb25JbmRleDsKICNpZm5kZWYgR2V0SXRlbUljb24KLQlQeU1hY19QUkVDSEVDSyhHZXRJdGVtSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICZpY29uSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpY29uSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAmaWNvbkluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbkluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldEl0ZW1TdHlsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCVN0eWxlUGFyYW1ldGVyIGNoU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3R5bGVQYXJhbWV0ZXIgY2hTdHlsZTsKICNpZm5kZWYgU2V0SXRlbVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SXRlbVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRJdGVtU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoU3R5bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRJdGVtU3R5bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgY2hTdHlsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaFN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgIGNoU3R5bGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEl0ZW1TdHlsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpdGVtOwotCVN0eWxlIGNoU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGl0ZW07CisgICAgU3R5bGUgY2hTdHlsZTsKICNpZm5kZWYgR2V0SXRlbVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0SXRlbVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJdGVtU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICZjaFN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgY2hTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SXRlbVN0eWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICZjaFN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1Db21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUNvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Db21tYW5kSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEOwogI2lmbmRlZiBHZXRNZW51SXRlbUNvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQ29tbWFuZElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUNvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUNvbW1hbmRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDb21tYW5kSUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENvbW1hbmRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Db21tYW5kSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Q29tbWFuZElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb21tYW5kSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1Nb2RpZmllcnMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQ4IGluTW9kaWZpZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgVUludDggaW5Nb2RpZmllcnM7CiAjaWZuZGVmIFNldE1lbnVJdGVtTW9kaWZpZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Nb2RpZmllcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtTW9kaWZpZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Nb2RpZmllcnMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Nb2RpZmllcnMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQ4IG91dE1vZGlmaWVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQ4IG91dE1vZGlmaWVyczsKICNpZm5kZWYgR2V0TWVudUl0ZW1Nb2RpZmllcnMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbU1vZGlmaWVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Nb2RpZmllcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Nb2RpZmllcnMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TW9kaWZpZXJzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNb2RpZmllcnMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtTW9kaWZpZXJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1vZGlmaWVycyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TW9kaWZpZXJzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSWNvbkhhbmRsZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVUludDggaW5JY29uVHlwZTsKLQlIYW5kbGUgaW5JY29uSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgVUludDggaW5JY29uVHlwZTsKKyAgICBIYW5kbGUgaW5JY29uSGFuZGxlOwogI2lmbmRlZiBTZXRNZW51SXRlbUljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUljb25IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSWNvbkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSWNvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5JY29uSGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtSWNvbkhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSWNvbkhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluSWNvbkhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUljb25IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkljb25IYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1JY29uSGFuZGxlKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlVSW50OCBvdXRJY29uVHlwZTsKLQlIYW5kbGUgb3V0SWNvbkhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQ4IG91dEljb25UeXBlOworICAgIEhhbmRsZSBvdXRJY29uSGFuZGxlOwogI2lmbmRlZiBHZXRNZW51SXRlbUljb25IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUljb25IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSWNvbkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUljb25IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uSGFuZGxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEljb25UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEljb25IYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSWNvbkhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEljb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEljb25IYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWNvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbkhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbVRleHRFbmNvZGluZyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVGV4dEVuY29kaW5nIGluU2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBUZXh0RW5jb2RpbmcgaW5TY3JpcHRJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbVRleHRFbmNvZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbVRleHRFbmNvZGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyaXB0SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVJdGVtVGV4dEVuY29kaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQ7CiAjaWZuZGVmIEdldE1lbnVJdGVtVGV4dEVuY29kaW5nCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtVGV4dEVuY29kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtVGV4dEVuY29kaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2NyaXB0SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFNjcmlwdElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCU1lbnVJRCBpbkhpZXJJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIE1lbnVJRCBpbkhpZXJJRDsKICNpZm5kZWYgU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IaWVySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZXJJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5IaWVySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhpZXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlNZW51SUQgb3V0SGllcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgTWVudUlEIG91dEhpZXJJRDsKICNpZm5kZWYgR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllcklEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIaWVySUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhpZXJJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SGllcklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtRm9udElEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlTSW50MTYgaW5Gb250SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBTSW50MTYgaW5Gb250SUQ7CiAjaWZuZGVmIFNldE1lbnVJdGVtRm9udElECi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Gb250SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtRm9udElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtRm9udElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRm9udElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVJdGVtRm9udElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Gb250SUQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1Gb250SUQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVNJbnQxNiBvdXRGb250SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IGluSXRlbTsKKyAgICBTSW50MTYgb3V0Rm9udElEOwogI2lmbmRlZiBHZXRNZW51SXRlbUZvbnRJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtRm9udElEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUZvbnRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUZvbnRJRChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGb250SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Gb250SUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGb250SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1SZWZDb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgaW5JdGVtOwotCVVJbnQzMiBpblJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQzMiBpblJlZkNvbjsKICNpZm5kZWYgU2V0TWVudUl0ZW1SZWZDb24KLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbVJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1SZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1SZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1SZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZkNvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbVJlZkNvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JVUludDMyIG91dFJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFVJbnQzMiBvdXRSZWZDb247CiAjaWZuZGVmIEdldE1lbnVJdGVtUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1SZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVJdGVtUmVmQ29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlZkNvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UmVmQ29uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbVJlZkNvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZWZDb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUtleUdseXBoKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IGluSXRlbTsKLQlTSW50MTYgaW5HbHlwaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgaW5JdGVtOworICAgIFNJbnQxNiBpbkdseXBoOwogI2lmbmRlZiBTZXRNZW51SXRlbUtleUdseXBoCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1LZXlHbHlwaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1LZXlHbHlwaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkdseXBoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtS2V5R2x5cGgoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5HbHlwaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5HbHlwaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUtleUdseXBoKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR2x5cGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1LZXlHbHlwaChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiBpbkl0ZW07Ci0JU0ludDE2IG91dEdseXBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBpbkl0ZW07CisgICAgU0ludDE2IG91dEdseXBoOwogI2lmbmRlZiBHZXRNZW51SXRlbUtleUdseXBoCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1LZXlHbHlwaCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1LZXlHbHlwaCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUtleUdseXBoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHbHlwaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0R2x5cGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtS2V5R2x5cGgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdseXBoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRHbHlwaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NYWNFbmFibGVNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SXRlbUluZGV4IGl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJdGVtSW5kZXggaXRlbTsKICNpZm5kZWYgTWFjRW5hYmxlTWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhNYWNFbmFibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRW5hYmxlTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNhYmxlTWVudUl0ZW0oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIERpc2FibGVNZW51SXRlbQotCVB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZU1lbnVJdGVtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzYWJsZU1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0lzTWVudUl0ZW1FbmFibGVkKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU1lbnVJdGVtSW5kZXggaXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOwogI2lmbmRlZiBJc01lbnVJdGVtRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1FbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVJdGVtRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVJdGVtRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUl0ZW1FbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9FbmFibGVNZW51SXRlbUljb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIEVuYWJsZU1lbnVJdGVtSWNvbgotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVJdGVtSWNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZU1lbnVJdGVtSWNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5hYmxlTWVudUl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc2FibGVNZW51SXRlbUljb24oTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIERpc2FibGVNZW51SXRlbUljb24KLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUl0ZW1JY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUl0ZW1JY29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51SXRlbUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNhYmxlTWVudUl0ZW1JY29uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVJdGVtSWNvbkVuYWJsZWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JTWVudUl0ZW1JbmRleCBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CiAjaWZuZGVmIElzTWVudUl0ZW1JY29uRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1JY29uRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNNZW51SXRlbUljb25FbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUl0ZW1JY29uRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc01lbnVJdGVtSWNvbkVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlNZW51SGFuZGxlIGluSGllck1lbnU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgTWVudUhhbmRsZSBpbkhpZXJNZW51OwogI2lmbmRlZiBTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZpbkhpZXJNZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IaWVyTWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaW5IaWVyTWVudSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSGllck1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JTWVudUhhbmRsZSBvdXRIaWVyTWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBNZW51SGFuZGxlIG91dEhpZXJNZW51OwogI2lmbmRlZiBHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUhpZXJhcmNoaWNhbE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfTmV3LCBvdXRIaWVyTWVudSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SGllck1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX05ldywgb3V0SGllck1lbnUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlDRlN0cmluZ1JlZiBvdXRTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOwogI2lmbmRlZiBDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFN0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgQ0ZTdHJpbmdSZWYgaW5TdHJpbmc7CiAjaWZuZGVmIFNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblN0cmluZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUluZGVudChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCVVJbnQzMiBvdXRJbmRlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CisgICAgVUludDMyIG91dEluZGVudDsKICNpZm5kZWYgR2V0TWVudUl0ZW1JbmRlbnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUluZGVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1JbmRlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRJbmRlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtSW5kZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtSW5kZW50KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUl0ZW1JbmRleCBpbkl0ZW07Ci0JVUludDMyIGluSW5kZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIFVJbnQzMiBpbkluZGVudDsKICNpZm5kZWYgU2V0TWVudUl0ZW1JbmRlbnQKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51SXRlbUluZGVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1JbmRlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JbmRlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZGVudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JbmRlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1JbmRlbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkluZGVudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRLZXkoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKLQlCb29sZWFuIGluR2V0VmlydHVhbEtleTsKLQlVSW50MTYgb3V0S2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggaW5JdGVtOworICAgIEJvb2xlYW4gaW5HZXRWaXJ0dWFsS2V5OworICAgIFVJbnQxNiBvdXRLZXk7CiAjaWZuZGVmIEdldE1lbnVJdGVtQ29tbWFuZEtleQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQ29tbWFuZEtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Db21tYW5kS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluR2V0VmlydHVhbEtleSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51SXRlbUNvbW1hbmRLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluR2V0VmlydHVhbEtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRLZXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIkgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEtleSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5HZXRWaXJ0dWFsS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVJdGVtQ29tbWFuZEtleShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5HZXRWaXJ0dWFsS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEtleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0S2V5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1NldE1lbnVJdGVtQ29tbWFuZEtleShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5JdGVtOwotCUJvb2xlYW4gaW5TZXRWaXJ0dWFsS2V5OwotCVVJbnQxNiBpbktleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBCb29sZWFuIGluU2V0VmlydHVhbEtleTsKKyAgICBVSW50MTYgaW5LZXk7CiAjaWZuZGVmIFNldE1lbnVJdGVtQ29tbWFuZEtleQotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJdGVtQ29tbWFuZEtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUl0ZW1Db21tYW5kS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpblNldFZpcnR1YWxLZXksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbktleSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZW51SXRlbUNvbW1hbmRLZXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2V0VmlydHVhbEtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluS2V5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TZXRWaXJ0dWFsS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5LZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVudUl0ZW1Db21tYW5kS2V5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNldFZpcnR1YWxLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbktleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CisgICAgT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgcHJvcGVydHlUYWc7CisgICAgVUludDMyIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgcHJvcGVydHlUYWc7Ci0JVUludDMyIGF0dHJpYnV0ZXNUb1NldDsKLQlVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIHByb3BlcnR5VGFnOworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQ7CisgICAgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyOwogI2lmbmRlZiBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKENoYW5nZU1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzVG9DbGVhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNUb0NsZWFyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVBdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZW51QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRBdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NoYW5nZU1lbnVBdHRyaWJ1dGVzKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzOwotCU1lbnVBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKKyAgICBNZW51QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlczsKICNpZm5kZWYgQ2hhbmdlTWVudUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlTWVudUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0VGhlc2VBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2xlYXJUaGVzZUF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2hhbmdlTWVudUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlc2VBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRoZXNlQXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0VGhlc2VBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xlYXJUaGVzZUF0dHJpYnV0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ2hhbmdlTWVudUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGhlc2VBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRoZXNlQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SXRlbUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JTWVudUl0ZW1BdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZW51SXRlbUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SXRlbUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVJdGVtQXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUl0ZW1BdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEF0dHJpYnV0ZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51SXRlbUF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QXR0cmlidXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9DaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SXRlbUluZGV4IGl0ZW07Ci0JTWVudUl0ZW1BdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKLQlNZW51SXRlbUF0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpdGVtOworICAgIE1lbnVJdGVtQXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXM7CisgICAgTWVudUl0ZW1BdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOwogI2lmbmRlZiBDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZU1lbnVJdGVtQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0Rpc2FibGVBbGxNZW51SXRlbXMoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEaXNhYmxlQWxsTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUFsbE1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzYWJsZUFsbE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc2FibGVBbGxNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRW5hYmxlQWxsTWVudUl0ZW1zKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRW5hYmxlQWxsTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlQWxsTWVudUl0ZW1zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmFibGVBbGxNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUVuYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEVuYWJsZUFsbE1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9NZW51SGFzRW5hYmxlZEl0ZW1zKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgTWVudUhhc0VuYWJsZWRJdGVtcwotCVB5TWFjX1BSRUNIRUNLKE1lbnVIYXNFbmFibGVkSXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVIYXNFbmFibGVkSXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lbnVIYXNFbmFibGVkSXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVIYXNFbmFibGVkSXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51VHlwZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQxNiBvdXRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQxNiBvdXRUeXBlOwogI2lmbmRlZiBHZXRNZW51VHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51VHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZvdXRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZvdXRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCVVJbnQzMiBpbkl0ZW1JbmRleDsKLQlNZW51SGFuZGxlIG91dE1lbnU7Ci0JTWVudUl0ZW1JbmRleCBvdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBVSW50MzIgaW5JdGVtSW5kZXg7CisgICAgTWVudUhhbmRsZSBvdXRNZW51OworICAgIE1lbnVJdGVtSW5kZXggb3V0SW5kZXg7CiAjaWZuZGVmIEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRAotCVB5TWFjX1BSRUNIRUNLKEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0SW5kTWVudUl0ZW1XaXRoQ29tbWFuZElEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSXRlbUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfRW5hYmxlTWVudUNvbW1hbmQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBFbmFibGVNZW51Q29tbWFuZAotCVB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVDb21tYW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUNvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmFibGVNZW51Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9EaXNhYmxlTWVudUNvbW1hbmQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBEaXNhYmxlTWVudUNvbW1hbmQKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzYWJsZU1lbnVDb21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc2FibGVNZW51Q29tbWFuZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSXNNZW51Q29tbWFuZEVuYWJsZWQoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBJc01lbnVDb21tYW5kRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKElzTWVudUNvbW1hbmRFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc01lbnVDb21tYW5kRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51Q29tbWFuZEVuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzTWVudUNvbW1hbmRFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUNvbW1hbmRNYXJrKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBpbk1hcms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgVW5pQ2hhciBpbk1hcms7CiAjaWZuZGVmIFNldE1lbnVDb21tYW5kTWFyawotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVDb21tYW5kTWFyayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUNvbW1hbmRNYXJrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1hcmspOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUNvbW1hbmRNYXJrKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBvdXRNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFVuaUNoYXIgb3V0TWFyazsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZW51Q29tbWFuZE1hcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hcmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVudUNvbW1hbmRNYXJrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNYXJrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBpblByb3BlcnR5VGFnOwotCUJ5dGVDb3VudCBvdXRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKKyAgICBCeXRlQ291bnQgb3V0U2l6ZTsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5Q3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1JlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7Ci0JT1NUeXBlIGluUHJvcGVydHlUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBpblByb3BlcnR5VGFnOwogI2lmbmRlZiBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9Jc01lbnVJdGVtSW52YWxpZChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlNZW51SXRlbUluZGV4IGluSXRlbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgTWVudUl0ZW1JbmRleCBpbkl0ZW07CiAjaWZuZGVmIElzTWVudUl0ZW1JbnZhbGlkCi0JUHlNYWNfUFJFQ0hFQ0soSXNNZW51SXRlbUludmFsaWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUl0ZW1JbnZhbGlkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNNZW51SXRlbUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51SXRlbUludmFsaWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfSW52YWxpZGF0ZU1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW07Ci0JSXRlbUNvdW50IGluTnVtSXRlbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbTsKKyAgICBJdGVtQ291bnQgaW5OdW1JdGVtczsKICNpZm5kZWYgSW52YWxpZGF0ZU1lbnVJdGVtcwotCVB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNZW51SXRlbXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNZW51SXRlbXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GaXJzdEl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk51bUl0ZW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZpcnN0SXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk51bUl0ZW1zKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZpcnN0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTnVtSXRlbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxpZGF0ZU1lbnVJdGVtcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmlyc3RJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTnVtSXRlbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfVXBkYXRlSW52YWxpZE1lbnVJdGVtcyhNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBVcGRhdGVJbnZhbGlkTWVudUl0ZW1zCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlSW52YWxpZE1lbnVJdGVtcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlSW52YWxpZE1lbnVJdGVtcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFVwZGF0ZUludmFsaWRNZW51SXRlbXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVJbnZhbGlkTWVudUl0ZW1zKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfQ3JlYXRlU3RhbmRhcmRGb250TWVudShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOwotCU1lbnVJRCBmaXJzdEhpZXJNZW51SUQ7Ci0JT3B0aW9uQml0cyBvcHRpb25zOwotCUl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVJdGVtSW5kZXggYWZ0ZXJJdGVtOworICAgIE1lbnVJRCBmaXJzdEhpZXJNZW51SUQ7CisgICAgT3B0aW9uQml0cyBvcHRpb25zOworICAgIEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50OwogI2lmbmRlZiBDcmVhdGVTdGFuZGFyZEZvbnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRGb250TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRGb250TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RIaWVyTWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SGllck1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RIaWVyTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SGllck1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX1VwZGF0ZVN0YW5kYXJkRm9udE1lbnUoTWVudU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudDsKICNpZm5kZWYgVXBkYXRlU3RhbmRhcmRGb250TWVudQotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZVN0YW5kYXJkRm9udE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZVN0YW5kYXJkRm9udE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVTdGFuZGFyZEZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEhpZXJNZW51Q291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhpZXJNZW51Q291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVXBkYXRlU3RhbmRhcmRGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWVyTWVudUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIaWVyTWVudUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbihNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVJdGVtSW5kZXggaXRlbTsKLQlGTUZvbnRGYW1pbHkgb3V0Rm9udEZhbWlseTsKLQlGTUZvbnRTdHlsZSBvdXRTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SXRlbUluZGV4IGl0ZW07CisgICAgRk1Gb250RmFtaWx5IG91dEZvbnRGYW1pbHk7CisgICAgRk1Gb250U3R5bGUgb3V0U3R5bGU7CiAjaWZuZGVmIEdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udEZhbWlseUZyb21NZW51U2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udEZhbWlseSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHlsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRGYW1pbHksCi0JICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0Rm9udEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHlsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZvbnRGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfR2V0TWVudUlEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBfcnY7CiAjaWZuZGVmIEdldE1lbnVJRAotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51SUQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lbnVJRChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0dldE1lbnVXaWR0aChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgX3J2OwogI2lmbmRlZiBHZXRNZW51V2lkdGgKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51V2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVudVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51V2lkdGgoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9HZXRNZW51SGVpZ2h0KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBfcnY7CiAjaWZuZGVmIEdldE1lbnVIZWlnaHQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZW51SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51SGVpZ2h0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZW51SGVpZ2h0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUlEKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CiAjaWZuZGVmIFNldE1lbnVJRAotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUlEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudUlEKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgIG1lbnVJRCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVudUlEKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgIG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudVdpZHRoKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB3aWR0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHdpZHRoOwogI2lmbmRlZiBTZXRNZW51V2lkdGgKLQlQeU1hY19QUkVDSEVDSyhTZXRNZW51V2lkdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TWVudVdpZHRoKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIHdpZHRoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lbnVXaWR0aChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVPYmpfU2V0TWVudUhlaWdodChNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MTYgaGVpZ2h0OwogI2lmbmRlZiBTZXRNZW51SGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lbnVIZWlnaHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVudUhlaWdodChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9hc19SZXNvdXJjZShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBhc19SZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKGFzX1Jlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19SZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19SZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9BcHBlbmRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSBkYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgZGF0YTsKICNpZm5kZWYgQXBwZW5kTWVudQotCVB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFwcGVuZE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBkYXRhKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBcHBlbmRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51KE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGJlZm9yZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBiZWZvcmVJRDsKICNpZm5kZWYgSW5zZXJ0TWVudQotCVB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2VydE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZiZWZvcmVJRCkpCi0JCXJldHVybiBOVUxMOwotCUluc2VydE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGJlZm9yZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiZWZvcmVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydE1lbnUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGJlZm9yZUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9JbnNlcnRNZW51SXRlbShNZW51T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHIyNTUgaXRlbVN0cmluZzsKLQlzaG9ydCBhZnRlckl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBpdGVtU3RyaW5nOworICAgIHNob3J0IGFmdGVySXRlbTsKICNpZm5kZWYgSW5zZXJ0TWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWZ0ZXJJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXJ0TWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtU3RyaW5nLAotCSAgICAgICAgICAgICAgIGFmdGVySXRlbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmdGVySXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2VydE1lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaXRlbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICBhZnRlckl0ZW0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX0VuYWJsZU1lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQxNiBpdGVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MTYgaXRlbTsKICNpZm5kZWYgRW5hYmxlTWVudUl0ZW0KLQlQeU1hY19QUkVDSEVDSyhFbmFibGVNZW51SXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpdGVtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRW5hYmxlTWVudUl0ZW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBpdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudU9ial9DaGVja01lbnVJdGVtKE1lbnVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGl0ZW07Ci0JQm9vbGVhbiBjaGVja2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpdGVtOworICAgIEJvb2xlYW4gY2hlY2tlZDsKICNpZm5kZWYgQ2hlY2tNZW51SXRlbQotCVB5TWFjX1BSRUNIRUNLKENoZWNrTWVudUl0ZW0pOworICAgIFB5TWFjX1BSRUNIRUNLKENoZWNrTWVudUl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGVja01lbnVJdGVtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBpdGVtLAotCSAgICAgICAgICAgICAgY2hlY2tlZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGVja2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2hlY2tNZW51SXRlbShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgIGNoZWNrZWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE1lbnVPYmpfbWV0aG9kc1tdID0gewotCXsiRGlzcG9zZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNwb3NlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ2FsY01lbnVTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2FsY01lbnVTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDb3VudE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvdW50TWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgX3J2KSIpfSwKLQl7IkdldE1lbnVGb250IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUZvbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBvdXRGb250SUQsIFVJbnQxNiBvdXRGb250U2l6ZSkiKX0sCi0JeyJTZXRNZW51Rm9udCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVGb250LCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5Gb250SUQsIFVJbnQxNiBpbkZvbnRTaXplKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGV4Y2x1ZGVzTWFyaykgLT4gTm9uZSIpfSwKLQl7IklzVmFsaWRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNWYWxpZE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldE1lbnVSZXRhaW5Db3VudCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVSZXRhaW5Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJSZXRhaW5NZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmV0YWluTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUmVsZWFzZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZWxlYXNlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRHVwbGljYXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0R1cGxpY2F0ZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSkiKX0sCi0JeyJDb3B5TWVudVRpdGxlQXNDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvcHlNZW51VGl0bGVBc0NGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAotCXsiU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudVRpdGxlV2l0aENGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkludmFsaWRhdGVNZW51U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSXNNZW51U2l6ZUludmFsaWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVTaXplSW52YWxpZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjQXBwZW5kTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0FwcGVuZE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBkYXRhKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0UmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydFJlc01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgYWZ0ZXJJdGVtKSAtPiBOb25lIil9LAotCXsiQXBwZW5kUmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZFJlc01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gTm9uZSIpfSwKLQl7Ik1hY0luc2VydE1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjSW5zZXJ0TWVudUl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpdGVtU3RyaW5nLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJEZWxldGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0RlbGV0ZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0Rm9udFJlc01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRGb250UmVzTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgYWZ0ZXJJdGVtLCBzaG9ydCBzY3JpcHRGaWx0ZXIpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRJbnRsUmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydEludGxSZXNNZW51LCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGFmdGVySXRlbSwgc2hvcnQgc2NyaXB0RmlsdGVyKSAtPiBOb25lIil9LAotCXsiQXBwZW5kTWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kTWVudUl0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCi0JeyJJbnNlcnRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51SXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpblN0cmluZywgTWVudUl0ZW1JbmRleCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJDb3B5TWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVJdGVtcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkZpcnN0SXRlbSwgSXRlbUNvdW50IGluTnVtSXRlbXMsIE1lbnVIYW5kbGUgaW5EZXN0TWVudSwgTWVudUl0ZW1JbmRleCBpbkluc2VydEFmdGVyKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGVsZXRlTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcykgLT4gTm9uZSIpfSwKLQl7IkFwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXMsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoTWVudUl0ZW1JbmRleCBvdXROZXdJdGVtKSIpfSwKLQl7Ikluc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcsIE1lbnVJdGVtSW5kZXggaW5BZnRlckl0ZW0sIE1lbnVJdGVtQXR0cmlidXRlcyBpbkF0dHJpYnV0ZXMsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiUG9wVXBNZW51U2VsZWN0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUG9wVXBNZW51U2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0b3AsIHNob3J0IGxlZnQsIHNob3J0IHBvcFVwSXRlbSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkludmFsaWRhdGVNZW51RW5hYmxpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudUVuYWJsaW5nLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVCYXJJbnZhbGlkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51QmFySW52YWxpZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjSW5zZXJ0TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0luc2VydE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBiZWZvcmVJRCkgLT4gTm9uZSIpfSwKLQl7IlNldFJvb3RNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0Um9vdE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1hY0NoZWNrTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNDaGVja01lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBCb29sZWFuIGNoZWNrZWQpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIFN0cjI1NSBpdGVtU3RyaW5nKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1UZXh0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoU3RyMjU1IGl0ZW1TdHJpbmcpIil9LAotCXsiU2V0SXRlbU1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtTWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgQ2hhclBhcmFtZXRlciBtYXJrQ2hhcikgLT4gTm9uZSIpfSwKLQl7IkdldEl0ZW1NYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbU1hcmssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChDaGFyUGFyYW1ldGVyIG1hcmtDaGFyKSIpfSwKLQl7IlNldEl0ZW1DbWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRJdGVtQ21kLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBDaGFyUGFyYW1ldGVyIGNtZENoYXIpIC0+IE5vbmUiKX0sCi0JeyJHZXRJdGVtQ21kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbUNtZCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKENoYXJQYXJhbWV0ZXIgY21kQ2hhcikiKX0sCi0JeyJTZXRJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBzaG9ydCBpY29uSW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJHZXRJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoc2hvcnQgaWNvbkluZGV4KSIpfSwKLQl7IlNldEl0ZW1TdHlsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1TdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgU3R5bGVQYXJhbWV0ZXIgY2hTdHlsZSkgLT4gTm9uZSIpfSwKLQl7IkdldEl0ZW1TdHlsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEl0ZW1TdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKFN0eWxlIGNoU3R5bGUpIil9LAotCXsiU2V0TWVudUl0ZW1Db21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUNvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQ29tbWFuZElELCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoTWVudUNvbW1hbmQgb3V0Q29tbWFuZElEKSIpfSwKLQl7IlNldE1lbnVJdGVtTW9kaWZpZXJzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Nb2RpZmllcnMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQ4IGluTW9kaWZpZXJzKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1Nb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbU1vZGlmaWVycywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQ4IG91dE1vZGlmaWVycykiKX0sCi0JeyJTZXRNZW51SXRlbUljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUljb25IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFVJbnQ4IGluSWNvblR5cGUsIEhhbmRsZSBpbkljb25IYW5kbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUljb25IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUljb25IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChVSW50OCBvdXRJY29uVHlwZSwgSGFuZGxlIG91dEljb25IYW5kbGUpIil9LAotCXsiU2V0TWVudUl0ZW1UZXh0RW5jb2RpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVRleHRFbmNvZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVGV4dEVuY29kaW5nIGluU2NyaXB0SUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbVRleHRFbmNvZGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtVGV4dEVuY29kaW5nLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVGV4dEVuY29kaW5nIG91dFNjcmlwdElEKSIpfSwKLQl7IlNldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUhpZXJhcmNoaWNhbElELCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBNZW51SUQgaW5IaWVySUQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUhpZXJhcmNoaWNhbElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKE1lbnVJRCBvdXRIaWVySUQpIil9LAotCXsiU2V0TWVudUl0ZW1Gb250SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUZvbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgU0ludDE2IGluRm9udElEKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1Gb250SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUZvbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFNJbnQxNiBvdXRGb250SUQpIil9LAotCXsiU2V0TWVudUl0ZW1SZWZDb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbVJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDMyIGluUmVmQ29uKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1SZWZDb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQzMiBvdXRSZWZDb24pIil9LAotCXsiU2V0TWVudUl0ZW1LZXlHbHlwaCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtS2V5R2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIFNJbnQxNiBpbkdseXBoKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1LZXlHbHlwaCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtS2V5R2x5cGgsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChTSW50MTYgb3V0R2x5cGgpIil9LAotCXsiTWFjRW5hYmxlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNFbmFibGVNZW51SXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAotCXsiRGlzYWJsZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGlzYWJsZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1FbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbmFibGVNZW51SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51SXRlbUljb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVNZW51SXRlbUljb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUl0ZW1JY29uLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtSWNvbkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVJdGVtSWNvbkVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIE1lbnVIYW5kbGUgaW5IaWVyTWVudSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSGllcmFyY2hpY2FsTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChNZW51SGFuZGxlIG91dEhpZXJNZW51KSIpfSwKLQl7IkNvcHlNZW51SXRlbVRleHRBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nKSIpfSwKLQl7IlNldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dFdpdGhDRlN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUl0ZW1JbmRlbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUluZGVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChVSW50MzIgb3V0SW5kZW50KSIpfSwKLQl7IlNldE1lbnVJdGVtSW5kZW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1JbmRlbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBVSW50MzIgaW5JbmRlbnQpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZW51SXRlbUNvbW1hbmRLZXkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUNvbW1hbmRLZXksIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBCb29sZWFuIGluR2V0VmlydHVhbEtleSkgLT4gKFVJbnQxNiBvdXRLZXkpIil9LAotCXsiU2V0TWVudUl0ZW1Db21tYW5kS2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1Db21tYW5kS2V5LCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgQm9vbGVhbiBpblNldFZpcnR1YWxLZXksIFVJbnQxNiBpbktleSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSwgT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnKSAtPiAoVUludDMyIGF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtLCBPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUF0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzLCBNZW51QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVJdGVtQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoTWVudUl0ZW1BdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXMpIil9LAotCXsiQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ2hhbmdlTWVudUl0ZW1BdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0sIE1lbnVJdGVtQXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXMsIE1lbnVJdGVtQXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVBbGxNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlQWxsTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVBbGxNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVBbGxNZW51SXRlbXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1lbnVIYXNFbmFibGVkSXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NZW51SGFzRW5hYmxlZEl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRNZW51VHlwZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVUeXBlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MTYgb3V0VHlwZSkiKX0sCi0JeyJDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVSW50MzIgaW5JdGVtSW5kZXgpIC0+IChNZW51SGFuZGxlIG91dE1lbnUsIE1lbnVJdGVtSW5kZXggb3V0SW5kZXgpIil9LAotCXsiRW5hYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9FbmFibGVNZW51Q29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCi0JeyJEaXNhYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUNvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiSXNNZW51Q29tbWFuZEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVDb21tYW5kRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51Q29tbWFuZE1hcmssIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVbmlDaGFyIGluTWFyaykgLT4gTm9uZSIpfSwKLQl7IkdldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVDb21tYW5kTWFyaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChVbmlDaGFyIG91dE1hcmspIil9LAotCXsiR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IChCeXRlQ291bnQgb3V0U2l6ZSkiKX0sCi0JeyJSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVJdGVtSW52YWxpZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1JbnZhbGlkLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkludmFsaWRhdGVNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnZhbGlkYXRlTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcykgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUludmFsaWRNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9VcGRhdGVJbnZhbGlkTWVudUl0ZW1zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDcmVhdGVTdGFuZGFyZEZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ3JlYXRlU3RhbmRhcmRGb250TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBhZnRlckl0ZW0sIE1lbnVJRCBmaXJzdEhpZXJNZW51SUQsIE9wdGlvbkJpdHMgb3B0aW9ucykgLT4gKEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50KSIpfSwKLQl7IlVwZGF0ZVN0YW5kYXJkRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9VcGRhdGVTdGFuZGFyZEZvbnRNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgb3V0SGllck1lbnVDb3VudCkiKX0sCi0JeyJHZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRGb250RmFtaWx5RnJvbU1lbnVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEZNRm9udEZhbWlseSBvdXRGb250RmFtaWx5LCBGTUZvbnRTdHlsZSBvdXRTdHlsZSkiKX0sCi0JeyJHZXRNZW51SUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVJRCBfcnYpIil9LAotCXsiR2V0TWVudVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVdpZHRoLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkdldE1lbnVIZWlnaHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SGVpZ2h0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IlNldE1lbnVJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IlNldE1lbnVXaWR0aCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVXaWR0aCwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHdpZHRoKSAtPiBOb25lIil9LAotCXsiU2V0TWVudUhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJhc19SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX2FzX1Jlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkFwcGVuZE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRNZW51LCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgZGF0YSkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBiZWZvcmVJRCkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudUl0ZW0sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBpdGVtU3RyaW5nLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihVSW50MTYgaXRlbSkgLT4gTm9uZSIpfSwKLQl7IkNoZWNrTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGVja01lbnVJdGVtLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBCb29sZWFuIGNoZWNrZWQpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEaXNwb3NlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc3Bvc2VNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjTWVudVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DYWxjTWVudVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvdW50TWVudUl0ZW1zIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ291bnRNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBfcnYpIil9LAorICAgIHsiR2V0TWVudUZvbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IG91dEZvbnRJRCwgVUludDE2IG91dEZvbnRTaXplKSIpfSwKKyAgICB7IlNldE1lbnVGb250IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkZvbnRJRCwgVUludDE2IGluRm9udFNpemUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51RXhjbHVkZXNNYXJrQ29sdW1uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TWVudUV4Y2x1ZGVzTWFya0NvbHVtbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVFeGNsdWRlc01hcmtDb2x1bW4sIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gZXhjbHVkZXNNYXJrKSAtPiBOb25lIil9LAorICAgIHsiSXNWYWxpZE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc1ZhbGlkTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0TWVudVJldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVJldGFpbkNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IlJldGFpbk1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZXRhaW5NZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJSZWxlYXNlTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1JlbGVhc2VNZW51LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJEdXBsaWNhdGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRHVwbGljYXRlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51KSIpfSwKKyAgICB7IkNvcHlNZW51VGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQ29weU1lbnVUaXRsZUFzQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCisgICAgeyJTZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51VGl0bGVXaXRoQ0ZTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKENGU3RyaW5nUmVmIGluU3RyaW5nKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW52YWxpZGF0ZU1lbnVTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVTaXplSW52YWxpZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudVNpemVJbnZhbGlkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNBcHBlbmRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjQXBwZW5kTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGRhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0UmVzTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCBhZnRlckl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJBcHBlbmRSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kUmVzTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiBOb25lIil9LAorICAgIHsiTWFjSW5zZXJ0TWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9NYWNJbnNlcnRNZW51SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGl0ZW1TdHJpbmcsIHNob3J0IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRGVsZXRlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJJbnNlcnRGb250UmVzTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydEZvbnRSZXNNZW51LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBhZnRlckl0ZW0sIHNob3J0IHNjcmlwdEZpbHRlcikgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydEludGxSZXNNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0SW50bFJlc01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgYWZ0ZXJJdGVtLCBzaG9ydCBzY3JpcHRGaWx0ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJBcHBlbmRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9BcHBlbmRNZW51SXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBpblN0cmluZykgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydE1lbnVJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnVJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGluU3RyaW5nLCBNZW51SXRlbUluZGV4IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3B5TWVudUl0ZW1zLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluRmlyc3RJdGVtLCBJdGVtQ291bnQgaW5OdW1JdGVtcywgTWVudUhhbmRsZSBpbkRlc3RNZW51LCBNZW51SXRlbUluZGV4IGluSW5zZXJ0QWZ0ZXIpIC0+IE5vbmUiKX0sCisgICAgeyJEZWxldGVNZW51SXRlbXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EZWxldGVNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW0sIEl0ZW1Db3VudCBpbk51bUl0ZW1zKSAtPiBOb25lIil9LAorICAgIHsiQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgTWVudUl0ZW1BdHRyaWJ1dGVzIGluQXR0cmlidXRlcywgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChNZW51SXRlbUluZGV4IG91dE5ld0l0ZW0pIil9LAorICAgIHsiSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSW5zZXJ0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZywgTWVudUl0ZW1JbmRleCBpbkFmdGVySXRlbSwgTWVudUl0ZW1BdHRyaWJ1dGVzIGluQXR0cmlidXRlcywgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJQb3BVcE1lbnVTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Qb3BVcE1lbnVTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHRvcCwgc2hvcnQgbGVmdCwgc2hvcnQgcG9wVXBJdGVtKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVFbmFibGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51RW5hYmxpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUJhckludmFsaWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Jc01lbnVCYXJJbnZhbGlkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNJbnNlcnRNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfTWFjSW5zZXJ0TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIGJlZm9yZUlEKSAtPiBOb25lIil9LAorICAgIHsiU2V0Um9vdE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRSb290TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWFjQ2hlY2tNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0NoZWNrTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIEJvb2xlYW4gY2hlY2tlZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1lbnVJdGVtVGV4dCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSwgU3RyMjU1IGl0ZW1TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbVRleHQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChTdHIyNTUgaXRlbVN0cmluZykiKX0sCisgICAgeyJTZXRJdGVtTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1NYXJrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBDaGFyUGFyYW1ldGVyIG1hcmtDaGFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0SXRlbU1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJdGVtTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaXRlbSkgLT4gKENoYXJQYXJhbWV0ZXIgbWFya0NoYXIpIil9LAorICAgIHsiU2V0SXRlbUNtZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldEl0ZW1DbWQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIENoYXJQYXJhbWV0ZXIgY21kQ2hhcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldEl0ZW1DbWQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRJdGVtQ21kLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoQ2hhclBhcmFtZXRlciBjbWRDaGFyKSIpfSwKKyAgICB7IlNldEl0ZW1JY29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIHNob3J0IGljb25JbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEl0ZW1JY29uIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0pIC0+IChzaG9ydCBpY29uSW5kZXgpIil9LAorICAgIHsiU2V0SXRlbVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0SXRlbVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtLCBTdHlsZVBhcmFtZXRlciBjaFN0eWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SXRlbVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0SXRlbVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpdGVtKSAtPiAoU3R5bGUgY2hTdHlsZSkiKX0sCisgICAgeyJTZXRNZW51SXRlbUNvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtQ29tbWFuZElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1Db21tYW5kSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChNZW51Q29tbWFuZCBvdXRDb21tYW5kSUQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1Nb2RpZmllcnMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbU1vZGlmaWVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDggaW5Nb2RpZmllcnMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbU1vZGlmaWVycyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtTW9kaWZpZXJzLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVUludDggb3V0TW9kaWZpZXJzKSIpfSwKKyAgICB7IlNldE1lbnVJdGVtSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgVUludDggaW5JY29uVHlwZSwgSGFuZGxlIGluSWNvbkhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtSWNvbkhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSWNvbkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFVJbnQ4IG91dEljb25UeXBlLCBIYW5kbGUgb3V0SWNvbkhhbmRsZSkiKX0sCisgICAgeyJTZXRNZW51SXRlbVRleHRFbmNvZGluZyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtVGV4dEVuY29kaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBUZXh0RW5jb2RpbmcgaW5TY3JpcHRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtVGV4dEVuY29kaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1UZXh0RW5jb2RpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0pIC0+IChUZXh0RW5jb2Rpbmcgb3V0U2NyaXB0SUQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiBpbkl0ZW0sIE1lbnVJRCBpbkhpZXJJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtSGllcmFyY2hpY2FsSUQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbUhpZXJhcmNoaWNhbElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoTWVudUlEIG91dEhpZXJJRCkiKX0sCisgICAgeyJTZXRNZW51SXRlbUZvbnRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtRm9udElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBTSW50MTYgaW5Gb250SUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUZvbnRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtRm9udElELCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoU0ludDE2IG91dEZvbnRJRCkiKX0sCisgICAgeyJTZXRNZW51SXRlbVJlZkNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVJdGVtUmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtLCBVSW50MzIgaW5SZWZDb24pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbVJlZkNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtUmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaW5JdGVtKSAtPiAoVUludDMyIG91dFJlZkNvbikiKX0sCisgICAgeyJTZXRNZW51SXRlbUtleUdseXBoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1LZXlHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSwgU0ludDE2IGluR2x5cGgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUtleUdseXBoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1LZXlHbHlwaCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGluSXRlbSkgLT4gKFNJbnQxNiBvdXRHbHlwaCkiKX0sCisgICAgeyJNYWNFbmFibGVNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX01hY0VuYWJsZU1lbnVJdGVtLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJEaXNhYmxlTWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9EaXNhYmxlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1FbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51SXRlbUVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkVuYWJsZU1lbnVJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVJdGVtSWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZU1lbnVJdGVtSWNvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVNZW51SXRlbUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1JY29uRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUl0ZW1JY29uRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgTWVudUhhbmRsZSBpbkhpZXJNZW51KSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1IaWVyYXJjaGljYWxNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKE1lbnVIYW5kbGUgb3V0SGllck1lbnUpIil9LAorICAgIHsiQ29weU1lbnVJdGVtVGV4dEFzQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pTWVudU9ial9Db3B5TWVudUl0ZW1UZXh0QXNDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0pIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAorICAgIHsiU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSwgQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SXRlbUluZGVudCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtSW5kZW50LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGluSXRlbSkgLT4gKFVJbnQzMiBvdXRJbmRlbnQpIil9LAorICAgIHsiU2V0TWVudUl0ZW1JbmRlbnQiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUluZGVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIFVJbnQzMiBpbkluZGVudCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lbnVJdGVtQ29tbWFuZEtleSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJdGVtQ29tbWFuZEtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpbkl0ZW0sIEJvb2xlYW4gaW5HZXRWaXJ0dWFsS2V5KSAtPiAoVUludDE2IG91dEtleSkiKX0sCisgICAgeyJTZXRNZW51SXRlbUNvbW1hbmRLZXkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9TZXRNZW51SXRlbUNvbW1hbmRLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtLCBCb29sZWFuIGluU2V0VmlydHVhbEtleSwgVUludDE2IGluS2V5KSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1Qcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtLCBPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51SXRlbVByb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoYW5nZU1lbnVJdGVtUHJvcGVydHlBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0sIE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZywgVUludDMyIGF0dHJpYnV0ZXNUb1NldCwgVUludDMyIGF0dHJpYnV0ZXNUb0NsZWFyKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoYW5nZU1lbnVBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51QXR0cmlidXRlcyBzZXRUaGVzZUF0dHJpYnV0ZXMsIE1lbnVBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUl0ZW1BdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUl0ZW1BdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGl0ZW0pIC0+IChNZW51SXRlbUF0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DaGFuZ2VNZW51SXRlbUF0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaXRlbSwgTWVudUl0ZW1BdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlcywgTWVudUl0ZW1BdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZUFsbE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVBbGxNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZUFsbE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZUFsbE1lbnVJdGVtcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWVudUhhc0VuYWJsZWRJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX01lbnVIYXNFbmFibGVkSXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldE1lbnVUeXBlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQxNiBvdXRUeXBlKSIpfSwKKyAgICB7IkNvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVJbnQzMiBpbkl0ZW1JbmRleCkgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSwgTWVudUl0ZW1JbmRleCBvdXRJbmRleCkiKX0sCisgICAgeyJFbmFibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0VuYWJsZU1lbnVDb21tYW5kLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKKyAgICB7IkRpc2FibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0Rpc2FibGVNZW51Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVDb21tYW5kRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0lzTWVudUNvbW1hbmRFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNldE1lbnVDb21tYW5kTWFyayIsIChQeUNGdW5jdGlvbilNZW51T2JqX1NldE1lbnVDb21tYW5kTWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVuaUNoYXIgaW5NYXJrKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfR2V0TWVudUNvbW1hbmRNYXJrLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKFVuaUNoYXIgb3V0TWFyaykiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplLCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gKEJ5dGVDb3VudCBvdXRTaXplKSIpfSwKKyAgICB7IlJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9SZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUl0ZW1JbnZhbGlkIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfSXNNZW51SXRlbUludmFsaWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5JdGVtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSW52YWxpZGF0ZU1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX0ludmFsaWRhdGVNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJdGVtSW5kZXggaW5GaXJzdEl0ZW0sIEl0ZW1Db3VudCBpbk51bUl0ZW1zKSAtPiBOb25lIil9LAorICAgIHsiVXBkYXRlSW52YWxpZE1lbnVJdGVtcyIsIChQeUNGdW5jdGlvbilNZW51T2JqX1VwZGF0ZUludmFsaWRNZW51SXRlbXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVN0YW5kYXJkRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9DcmVhdGVTdGFuZGFyZEZvbnRNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SXRlbUluZGV4IGFmdGVySXRlbSwgTWVudUlEIGZpcnN0SGllck1lbnVJRCwgT3B0aW9uQml0cyBvcHRpb25zKSAtPiAoSXRlbUNvdW50IG91dEhpZXJNZW51Q291bnQpIil9LAorICAgIHsiVXBkYXRlU3RhbmRhcmRGb250TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX1VwZGF0ZVN0YW5kYXJkRm9udE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBvdXRIaWVyTWVudUNvdW50KSIpfSwKKyAgICB7IkdldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldEZvbnRGYW1pbHlGcm9tTWVudVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUl0ZW1JbmRleCBpdGVtKSAtPiAoRk1Gb250RmFtaWx5IG91dEZvbnRGYW1pbHksIEZNRm9udFN0eWxlIG91dFN0eWxlKSIpfSwKKyAgICB7IkdldE1lbnVJRCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVudUlEIF9ydikiKX0sCisgICAgeyJHZXRNZW51V2lkdGgiLCAoUHlDRnVuY3Rpb24pTWVudU9ial9HZXRNZW51V2lkdGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiR2V0TWVudUhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51T2JqX0dldE1lbnVIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiU2V0TWVudUlEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUlELCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVudVdpZHRoIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudVdpZHRoLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgd2lkdGgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZW51SGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfU2V0TWVudUhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7ImFzX1Jlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiQXBwZW5kTWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0FwcGVuZE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0TWVudSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0luc2VydE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGJlZm9yZUlEKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0TWVudUl0ZW0iLCAoUHlDRnVuY3Rpb24pTWVudU9ial9JbnNlcnRNZW51SXRlbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IGl0ZW1TdHJpbmcsIHNob3J0IGFmdGVySXRlbSkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZU1lbnVJdGVtIiwgKFB5Q0Z1bmN0aW9uKU1lbnVPYmpfRW5hYmxlTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQxNiBpdGVtKSAtPiBOb25lIil9LAorICAgIHsiQ2hlY2tNZW51SXRlbSIsIChQeUNGdW5jdGlvbilNZW51T2JqX0NoZWNrTWVudUl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGl0ZW0sIEJvb2xlYW4gY2hlY2tlZCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTWVudU9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI1NDAsNjEgKzI1NDAsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNZW51T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlNZW51SGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTWVudUhhbmRsZSBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTWVudU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTWVudU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBNZW51T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1lbnVfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfTWVudS5NZW51IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTWVudU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIE1lbnVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgTWVudU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTWVudU9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgTWVudU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlNZW51T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1lbnVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JTWVudU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JTWVudU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNZW51T2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JTWVudU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX01lbnUuTWVudSIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKE1lbnVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBNZW51T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1lbnVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE1lbnVPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIE1lbnVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTWVudU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBNZW51T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIE1lbnVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1lbnVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTWVudU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIE1lbnVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgTWVudSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNjAyLDg0MiArMjYwMiw4NDIgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X05ld01lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OwotCU1lbnVJRCBtZW51SUQ7Ci0JU3RyMjU1IG1lbnVUaXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBfcnY7CisgICAgTWVudUlEIG1lbnVJRDsKKyAgICBTdHIyNTUgbWVudVRpdGxlOwogI2lmbmRlZiBOZXdNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTmV3TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG1lbnVUaXRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01lbnUobWVudUlELAotCSAgICAgICAgICAgICAgbWVudVRpdGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbWVudVRpdGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3TWVudShtZW51SUQsCisgICAgICAgICAgICAgICAgICBtZW51VGl0bGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNHZXRNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlzaG9ydCByZXNvdXJjZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBzaG9ydCByZXNvdXJjZUlEOwogI2lmbmRlZiBNYWNHZXRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjR2V0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjR2V0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXRNZW51KHJlc291cmNlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0TWVudShyZXNvdXJjZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ3JlYXRlTmV3TWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SUQgaW5NZW51SUQ7Ci0JTWVudUF0dHJpYnV0ZXMgaW5NZW51QXR0cmlidXRlczsKLQlNZW51SGFuZGxlIG91dE1lbnVSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUlEIGluTWVudUlEOworICAgIE1lbnVBdHRyaWJ1dGVzIGluTWVudUF0dHJpYnV0ZXM7CisgICAgTWVudUhhbmRsZSBvdXRNZW51UmVmOwogI2lmbmRlZiBDcmVhdGVOZXdNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluTWVudUF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTmV3TWVudShpbk1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICBpbk1lbnVBdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIG91dE1lbnVSZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NZW51QXR0cmlidXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVOZXdNZW51KGluTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIGluTWVudUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZWYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NZW51S2V5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlDaGFyUGFyYW1ldGVyIGNoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBDaGFyUGFyYW1ldGVyIGNoOwogI2lmbmRlZiBNZW51S2V5Ci0JUHlNYWNfUFJFQ0hFQ0soTWVudUtleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVudUtleSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVudUtleShjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lbnVLZXkoY2gpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWVudVNlbGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgc3RhcnRQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUG9pbnQgc3RhcnRQdDsKICNpZm5kZWYgTWVudVNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKE1lbnVTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZW51U2VsZWN0KHN0YXJ0UHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudVNlbGVjdChzdGFydFB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X01lbnVDaG9pY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgTWVudUNob2ljZQotCVB5TWFjX1BSRUNIRUNLKE1lbnVDaG9pY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lbnVDaG9pY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lbnVDaG9pY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudUNob2ljZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfTWVudUV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OwotCUV2ZW50UmVjb3JkIGluRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQzMiBfcnY7CisgICAgRXZlbnRSZWNvcmQgaW5FdmVudDsKICNpZm5kZWYgTWVudUV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTWVudUV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZW51RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmluRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZW51RXZlbnQoJmluRXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpbkV2ZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVudUV2ZW50KCZpbkV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1CYXJIZWlnaHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRNQmFySGVpZ2h0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TUJhckhlaWdodCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TUJhckhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TUJhckhlaWdodCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNQmFySGVpZ2h0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNEcmF3TWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNEcmF3TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKE1hY0RyYXdNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNEcmF3TWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjRHJhd01lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0RyYXdNZW51QmFyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfSW52YWxNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEludmFsTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKEludmFsTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZhbE1lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEludmFsTWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0hpbGl0ZU1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CiAjaWZuZGVmIEhpbGl0ZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWxpdGVNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlsaXRlTWVudShtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZU1lbnUobWVudUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXROZXdNQmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51QmFySGFuZGxlIF9ydjsKLQlzaG9ydCBtZW51QmFySUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVCYXJIYW5kbGUgX3J2OworICAgIHNob3J0IG1lbnVCYXJJRDsKICNpZm5kZWYgR2V0TmV3TUJhcgotCVB5TWFjX1BSRUNIRUNLKEdldE5ld01CYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5ld01CYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZW51QmFySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXdNQmFyKG1lbnVCYXJJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUJhcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3TUJhcihtZW51QmFySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVCYXJIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51QmFySGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKEdldE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVCYXIoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lbnVCYXIoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9TZXRNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51QmFySGFuZGxlIG1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVCYXJIYW5kbGUgbWJhcjsKICNpZm5kZWYgU2V0TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKFNldE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1iYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51QmFyKG1iYXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWJhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1lbnVCYXIobWJhcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRHVwbGljYXRlTWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51QmFySGFuZGxlIGluTWJhcjsKLQlNZW51QmFySGFuZGxlIG91dE1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUJhckhhbmRsZSBpbk1iYXI7CisgICAgTWVudUJhckhhbmRsZSBvdXRNYmFyOwogI2lmbmRlZiBEdXBsaWNhdGVNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soRHVwbGljYXRlTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHVwbGljYXRlTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5NYmFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IER1cGxpY2F0ZU1lbnVCYXIoaW5NYmFyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0TWJhcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluTWJhcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEdXBsaWNhdGVNZW51QmFyKGluTWJhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWJhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dE1iYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRGlzcG9zZU1lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUJhckhhbmRsZSBpbk1iYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUJhckhhbmRsZSBpbk1iYXI7CiAjaWZuZGVmIERpc3Bvc2VNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbk1iYXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGlzcG9zZU1lbnVCYXIoaW5NYmFyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5NYmFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERpc3Bvc2VNZW51QmFyKGluTWJhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51SGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBHZXRNZW51SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lbnVIYW5kbGUobWVudUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudUhhbmRsZShtZW51SUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9NYWNEZWxldGVNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBNYWNEZWxldGVNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRGVsZXRlTWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRGVsZXRlTWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCU1hY0RlbGV0ZU1lbnUobWVudUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNEZWxldGVNZW51KG1lbnVJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ2xlYXJNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKENsZWFyTWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xlYXJNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsZWFyTWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X1NldE1lbnVGbGFzaENvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgY291bnQ7CiAjaWZuZGVmIFNldE1lbnVGbGFzaENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUZsYXNoQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lbnVGbGFzaENvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZW51Rmxhc2hDb3VudChjb3VudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZW51Rmxhc2hDb3VudChjb3VudCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRmxhc2hNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SUQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SUQgbWVudUlEOwogI2lmbmRlZiBGbGFzaE1lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCi0JCXJldHVybiBOVUxMOwotCUZsYXNoTWVudUJhcihtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZsYXNoTWVudUJhcihtZW51SUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0lzTWVudUJhclZpc2libGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNNZW51QmFyVmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKElzTWVudUJhclZpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTWVudUJhclZpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzTWVudUJhclZpc2libGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51QmFyVmlzaWJsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfU2hvd01lbnVCYXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd01lbnVCYXIKLQlQeU1hY19QUkVDSEVDSyhTaG93TWVudUJhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd01lbnVCYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dNZW51QmFyKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaG93TWVudUJhcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0hpZGVNZW51QmFyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVNZW51QmFyCi0JUHlNYWNfUFJFQ0hFQ0soSGlkZU1lbnVCYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVNZW51QmFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlTWVudUJhcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSGlkZU1lbnVCYXIoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9BY3F1aXJlUm9vdE1lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKICNpZm5kZWYgQWNxdWlyZVJvb3RNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soQWNxdWlyZVJvb3RNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhBY3F1aXJlUm9vdE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFjcXVpcmVSb290TWVudSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEFjcXVpcmVSb290TWVudSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9EZWxldGVNQ0VudHJpZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVJRCBtZW51SUQ7Ci0Jc2hvcnQgbWVudUl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVJRCBtZW51SUQ7CisgICAgc2hvcnQgbWVudUl0ZW07CiAjaWZuZGVmIERlbGV0ZU1DRW50cmllcwotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1DRW50cmllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTUNFbnRyaWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJdGVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGVsZXRlTUNFbnRyaWVzKG1lbnVJRCwKLQkgICAgICAgICAgICAgICAgbWVudUl0ZW0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZW51SXRlbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1DRW50cmllcyhtZW51SUQsCisgICAgICAgICAgICAgICAgICAgIG1lbnVJdGVtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9Jbml0Q29udGV4dHVhbE1lbnVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBJbml0Q29udGV4dHVhbE1lbnVzCi0JUHlNYWNfUFJFQ0hFQ0soSW5pdENvbnRleHR1YWxNZW51cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5pdENvbnRleHR1YWxNZW51cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluaXRDb250ZXh0dWFsTWVudXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEluaXRDb250ZXh0dWFsTWVudXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0lzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGluRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVjb3JkIGluRXZlbnQ7CiAjaWZuZGVmIElzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpbkV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNTaG93Q29udGV4dHVhbE1lbnVDbGljaygmaW5FdmVudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmluRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrKCZpbkV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0xNR2V0VGhlTWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRUaGVNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRUaGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFRoZU1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0VGhlTWVudSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFRoZU1lbnUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X2FzX01lbnUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lbnVIYW5kbGUgX3J2OwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgYXNfTWVudQotCVB5TWFjX1BSRUNIRUNLKGFzX01lbnUpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX01lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19NZW51KGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19NZW51KGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIF9ydjsKLQlzaG9ydCByZXNvdXJjZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZW51SGFuZGxlIF9ydjsKKyAgICBzaG9ydCByZXNvdXJjZUlEOwogI2lmbmRlZiBHZXRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVudSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlc291cmNlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZW51KHJlc291cmNlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvdXJjZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVudShyZXNvdXJjZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfRGVsZXRlTWVudShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbWVudUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtZW51SUQ7CiAjaWZuZGVmIERlbGV0ZU1lbnUKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGVsZXRlTWVudShtZW51SUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lbnVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERlbGV0ZU1lbnUobWVudUlEKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9EcmF3TWVudUJhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBEcmF3TWVudUJhcgotCVB5TWFjX1BSRUNIRUNLKERyYXdNZW51QmFyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3TWVudUJhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRHJhd01lbnVCYXIoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdNZW51QmFyKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlJdGVtQ291bnQgX3J2OwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBJdGVtQ291bnQgX3J2OworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhDb3VudE1lbnVJdGVtc1dpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRChpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlVSW50MzIgaW5JdGVtSW5kZXg7Ci0JTWVudUhhbmRsZSBvdXRNZW51OwotCU1lbnVJdGVtSW5kZXggb3V0SW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgVUludDMyIGluSXRlbUluZGV4OworICAgIE1lbnVIYW5kbGUgb3V0TWVudTsKKyAgICBNZW51SXRlbUluZGV4IG91dEluZGV4OwogI2lmbmRlZiBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1JbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51LAotCSAgICAgICAgICAgICAgICAgICAgIG91dEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkl0ZW1JbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkl0ZW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0VuYWJsZU1lbnVDb21tYW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVudUhhbmRsZSBpbk1lbnU7CisgICAgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CiAjaWZuZGVmIEVuYWJsZU1lbnVDb21tYW5kCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuYWJsZU1lbnVDb21tYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRW5hYmxlTWVudUNvbW1hbmQoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmFibGVNZW51Q29tbWFuZChpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0Rpc2FibGVNZW51Q29tbWFuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOwogI2lmbmRlZiBEaXNhYmxlTWVudUNvbW1hbmQKLQlQeU1hY19QUkVDSEVDSyhEaXNhYmxlTWVudUNvbW1hbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc2FibGVNZW51Q29tbWFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCkpCi0JCXJldHVybiBOVUxMOwotCURpc2FibGVNZW51Q29tbWFuZChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNhYmxlTWVudUNvbW1hbmQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lbnVfSXNNZW51Q29tbWFuZEVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKICNpZm5kZWYgSXNNZW51Q29tbWFuZEVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhJc01lbnVDb21tYW5kRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNNZW51Q29tbWFuZEVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01lbnVDb21tYW5kRW5hYmxlZChpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNZW51Q29tbWFuZEVuYWJsZWQoaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X1NldE1lbnVDb21tYW5kTWFyayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlNZW51SGFuZGxlIGluTWVudTsKLQlNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKLQlVbmlDaGFyIGluTWFyazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBVbmlDaGFyIGluTWFyazsKICNpZm5kZWYgU2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWFyayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5NYXJrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluTWFyayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9HZXRNZW51Q29tbWFuZE1hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBpbk1lbnU7Ci0JTWVudUNvbW1hbmQgaW5Db21tYW5kSUQ7Ci0JVW5pQ2hhciBvdXRNYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgaW5NZW51OworICAgIE1lbnVDb21tYW5kIGluQ29tbWFuZElEOworICAgIFVuaUNoYXIgb3V0TWFyazsKICNpZm5kZWYgR2V0TWVudUNvbW1hbmRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZW51Q29tbWFuZE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUNvbW1hbmRNYXJrKGluTWVudSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29tbWFuZElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1hcmspOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1hcmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVDb21tYW5kTWFyayhpbk1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNYXJrKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNYXJrKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZW51X0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCU9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKLQlCeXRlQ291bnQgb3V0U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIGluUHJvcGVydHlUYWc7CisgICAgQnl0ZUNvdW50IG91dFNpemU7CiAjaWZuZGVmIEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUoaW5NZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0TWVudU9ial9Db252ZXJ0LCAmaW5NZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lbnVDb21tYW5kUHJvcGVydHlTaXplKGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0U2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVudV9SZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgaW5NZW51OwotCU1lbnVDb21tYW5kIGluQ29tbWFuZElEOwotCU9TVHlwZSBpblByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgaW5Qcm9wZXJ0eVRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBNZW51SGFuZGxlIGluTWVudTsKKyAgICBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRDsKKyAgICBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3I7CisgICAgT1NUeXBlIGluUHJvcGVydHlUYWc7CiAjaWZuZGVmIFJlbW92ZU1lbnVDb21tYW5kUHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRNZW51T2JqX0NvbnZlcnQsICZpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkNvbW1hbmRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUHJvcGVydHlUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eShpbk1lbnUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Db21tYW5kSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Qcm9wZXJ0eVRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdE1lbnVPYmpfQ29udmVydCwgJmluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ29tbWFuZElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5Qcm9wZXJ0eVRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5KGluTWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNvbW1hbmRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblByb3BlcnR5VGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgTWVudV9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJOZXdNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTmV3TWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCwgU3RyMjU1IG1lbnVUaXRsZSkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKLQl7Ik1hY0dldE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9NYWNHZXRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNvdXJjZUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiQ3JlYXRlTmV3TWVudSIsIChQeUNGdW5jdGlvbilNZW51X0NyZWF0ZU5ld01lbnUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBpbk1lbnVJRCwgTWVudUF0dHJpYnV0ZXMgaW5NZW51QXR0cmlidXRlcykgLT4gKE1lbnVIYW5kbGUgb3V0TWVudVJlZikiKX0sCi0JeyJNZW51S2V5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUtleSwgMSwKLQkgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik1lbnVTZWxlY3QiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51U2VsZWN0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0KSAtPiAobG9uZyBfcnYpIil9LAotCXsiTWVudUNob2ljZSIsIChQeUNGdW5jdGlvbilNZW51X01lbnVDaG9pY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik1lbnVFdmVudCIsIChQeUNGdW5jdGlvbilNZW51X01lbnVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaW5FdmVudCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiR2V0TUJhckhlaWdodCIsIChQeUNGdW5jdGlvbilNZW51X0dldE1CYXJIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJNYWNEcmF3TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X01hY0RyYXdNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJbnZhbE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9JbnZhbE1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpbGl0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9IaWxpdGVNZW51LCAxLAotCSBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAotCXsiR2V0TmV3TUJhciIsIChQeUNGdW5jdGlvbilNZW51X0dldE5ld01CYXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1lbnVCYXJJRCkgLT4gKE1lbnVCYXJIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51QmFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51QmFySGFuZGxlIF9ydikiKX0sCi0JeyJTZXRNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBtYmFyKSAtPiBOb25lIil9LAotCXsiRHVwbGljYXRlTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0R1cGxpY2F0ZU1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgaW5NYmFyKSAtPiAoTWVudUJhckhhbmRsZSBvdXRNYmFyKSIpfSwKLQl7IkRpc3Bvc2VNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGlzcG9zZU1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVCYXJIYW5kbGUgaW5NYmFyKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUhhbmRsZSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJNYWNEZWxldGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWFjRGVsZXRlTWVudSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IkNsZWFyTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0NsZWFyTWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0TWVudUZsYXNoQ291bnQiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51Rmxhc2hDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY291bnQpIC0+IE5vbmUiKX0sCi0JeyJGbGFzaE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9GbGFzaE1lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCi0JeyJJc01lbnVCYXJWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSXNNZW51QmFyVmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2hvd01lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9TaG93TWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiSGlkZU1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9IaWRlTWVudUJhciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQWNxdWlyZVJvb3RNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQWNxdWlyZVJvb3RNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCi0JeyJEZWxldGVNQ0VudHJpZXMiLCAoUHlDRnVuY3Rpb24pTWVudV9EZWxldGVNQ0VudHJpZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQsIHNob3J0IG1lbnVJdGVtKSAtPiBOb25lIil9LAotCXsiSW5pdENvbnRleHR1YWxNZW51cyIsIChQeUNGdW5jdGlvbilNZW51X0luaXRDb250ZXh0dWFsTWVudXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IklzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2siLCAoUHlDRnVuY3Rpb24pTWVudV9Jc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihFdmVudFJlY29yZCBpbkV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTE1HZXRUaGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTE1HZXRUaGVNZW51LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7ImFzX01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9hc19NZW51LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNvdXJjZUlEKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAotCXsiRGVsZXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X0RlbGV0ZU1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1lbnVJRCkgLT4gTm9uZSIpfSwKLQl7IkRyYXdNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRHJhd01lbnVCYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51X0NvdW50TWVudUl0ZW1zV2l0aENvbW1hbmRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJHZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRJbmRNZW51SXRlbVdpdGhDb21tYW5kSUQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVUludDMyIGluSXRlbUluZGV4KSAtPiAoTWVudUhhbmRsZSBvdXRNZW51LCBNZW51SXRlbUluZGV4IG91dEluZGV4KSIpfSwKLQl7IkVuYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRW5hYmxlTWVudUNvbW1hbmQsIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gTm9uZSIpfSwKLQl7IkRpc2FibGVNZW51Q29tbWFuZCIsIChQeUNGdW5jdGlvbilNZW51X0Rpc2FibGVNZW51Q29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAotCXsiSXNNZW51Q29tbWFuZEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTWVudV9Jc01lbnVDb21tYW5kRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfU2V0TWVudUNvbW1hbmRNYXJrLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIFVuaUNoYXIgaW5NYXJrKSAtPiBOb25lIil9LAotCXsiR2V0TWVudUNvbW1hbmRNYXJrIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUNvbW1hbmRNYXJrLCAxLAotCSBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChVbmlDaGFyIG91dE1hcmspIil9LAotCXsiR2V0TWVudUNvbW1hbmRQcm9wZXJ0eVNpemUiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiAoQnl0ZUNvdW50IG91dFNpemUpIil9LAotCXsiUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilNZW51X1JlbW92ZU1lbnVDb21tYW5kUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgT1NUeXBlIGluUHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgaW5Qcm9wZXJ0eVRhZykgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld01lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9OZXdNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlELCBTdHIyNTUgbWVudVRpdGxlKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAorICAgIHsiTWFjR2V0TWVudSIsIChQeUNGdW5jdGlvbilNZW51X01hY0dldE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc291cmNlSUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJDcmVhdGVOZXdNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ3JlYXRlTmV3TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIGluTWVudUlELCBNZW51QXR0cmlidXRlcyBpbk1lbnVBdHRyaWJ1dGVzKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51UmVmKSIpfSwKKyAgICB7Ik1lbnVLZXkiLCAoUHlDRnVuY3Rpb24pTWVudV9NZW51S2V5LCAxLAorICAgICBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTWVudVNlbGVjdCIsIChQeUNGdW5jdGlvbilNZW51X01lbnVTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJNZW51Q2hvaWNlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUNob2ljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiTWVudUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWVudUV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpbkV2ZW50KSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJHZXRNQmFySGVpZ2h0IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TUJhckhlaWdodCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7Ik1hY0RyYXdNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfTWFjRHJhd01lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0ludmFsTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlsaXRlTWVudSIsIChQeUNGdW5jdGlvbilNZW51X0hpbGl0ZU1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVJRCBtZW51SUQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXdNQmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TmV3TUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbWVudUJhcklEKSAtPiAoTWVudUJhckhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVCYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVCYXJIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIihNZW51QmFySGFuZGxlIG1iYXIpIC0+IE5vbmUiKX0sCisgICAgeyJEdXBsaWNhdGVNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRHVwbGljYXRlTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBpbk1iYXIpIC0+IChNZW51QmFySGFuZGxlIG91dE1iYXIpIil9LAorICAgIHsiRGlzcG9zZU1lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9EaXNwb3NlTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUJhckhhbmRsZSBpbk1iYXIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfR2V0TWVudUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1hY0RlbGV0ZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9NYWNEZWxldGVNZW51LCAxLAorICAgICBQeURvY19TVFIoIihNZW51SUQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiQ2xlYXJNZW51QmFyIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ2xlYXJNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZW51Rmxhc2hDb3VudCIsIChQeUNGdW5jdGlvbilNZW51X1NldE1lbnVGbGFzaENvdW50LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCkgLT4gTm9uZSIpfSwKKyAgICB7IkZsYXNoTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0ZsYXNoTWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IklzTWVudUJhclZpc2libGUiLCAoUHlDRnVuY3Rpb24pTWVudV9Jc01lbnVCYXJWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTaG93TWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X1Nob3dNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlTWVudUJhciIsIChQeUNGdW5jdGlvbilNZW51X0hpZGVNZW51QmFyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJBY3F1aXJlUm9vdE1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9BY3F1aXJlUm9vdE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRlbGV0ZU1DRW50cmllcyIsIChQeUNGdW5jdGlvbilNZW51X0RlbGV0ZU1DRW50cmllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUlEIG1lbnVJRCwgc2hvcnQgbWVudUl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJJbml0Q29udGV4dHVhbE1lbnVzIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfSW5pdENvbnRleHR1YWxNZW51cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSXNTaG93Q29udGV4dHVhbE1lbnVDbGljayIsIChQeUNGdW5jdGlvbilNZW51X0lzU2hvd0NvbnRleHR1YWxNZW51Q2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGluRXZlbnQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJMTUdldFRoZU1lbnUiLCAoUHlDRnVuY3Rpb24pTWVudV9MTUdldFRoZU1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAorICAgIHsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilNZW51X2FzX01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoTWVudUhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0TWVudSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc291cmNlSUQpIC0+IChNZW51SGFuZGxlIF9ydikiKX0sCisgICAgeyJEZWxldGVNZW51IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGVsZXRlTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbWVudUlEKSAtPiBOb25lIil9LAorICAgIHsiRHJhd01lbnVCYXIiLCAoUHlDRnVuY3Rpb24pTWVudV9EcmF3TWVudUJhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElEIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfQ291bnRNZW51SXRlbXNXaXRoQ29tbWFuZElELCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IkdldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCIsIChQeUNGdW5jdGlvbilNZW51X0dldEluZE1lbnVJdGVtV2l0aENvbW1hbmRJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBVSW50MzIgaW5JdGVtSW5kZXgpIC0+IChNZW51SGFuZGxlIG91dE1lbnUsIE1lbnVJdGVtSW5kZXggb3V0SW5kZXgpIil9LAorICAgIHsiRW5hYmxlTWVudUNvbW1hbmQiLCAoUHlDRnVuY3Rpb24pTWVudV9FbmFibGVNZW51Q29tbWFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElEKSAtPiBOb25lIil9LAorICAgIHsiRGlzYWJsZU1lbnVDb21tYW5kIiwgKFB5Q0Z1bmN0aW9uKU1lbnVfRGlzYWJsZU1lbnVDb21tYW5kLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IE5vbmUiKX0sCisgICAgeyJJc01lbnVDb21tYW5kRW5hYmxlZCIsIChQeUNGdW5jdGlvbilNZW51X0lzTWVudUNvbW1hbmRFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudV9TZXRNZW51Q29tbWFuZE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCwgVW5pQ2hhciBpbk1hcmspIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZE1hcmsiLCAoUHlDRnVuY3Rpb24pTWVudV9HZXRNZW51Q29tbWFuZE1hcmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgaW5NZW51LCBNZW51Q29tbWFuZCBpbkNvbW1hbmRJRCkgLT4gKFVuaUNoYXIgb3V0TWFyaykiKX0sCisgICAgeyJHZXRNZW51Q29tbWFuZFByb3BlcnR5U2l6ZSIsIChQeUNGdW5jdGlvbilNZW51X0dldE1lbnVDb21tYW5kUHJvcGVydHlTaXplLCAxLAorICAgICBQeURvY19TVFIoIihNZW51SGFuZGxlIGluTWVudSwgTWVudUNvbW1hbmQgaW5Db21tYW5kSUQsIE9TVHlwZSBpblByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIGluUHJvcGVydHlUYWcpIC0+IChCeXRlQ291bnQgb3V0U2l6ZSkiKX0sCisgICAgeyJSZW1vdmVNZW51Q29tbWFuZFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKU1lbnVfUmVtb3ZlTWVudUNvbW1hbmRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpbk1lbnUsIE1lbnVDb21tYW5kIGluQ29tbWFuZElELCBPU1R5cGUgaW5Qcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBpblByb3BlcnR5VGFnKSAtPiBOb25lIil9LAogI2VuZGlmIC8qIF9fTFA2NF9fICovCi0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAKQEAgLTM0NDUsMzEgKzM0NDUsMzEgQEAKIAogdm9pZCBpbml0X01lbnUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lbnVIYW5kbGUsIE1lbnVPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZW51SGFuZGxlLCBNZW51T2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZW51SGFuZGxlLCBNZW51T2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZW51SGFuZGxlLCBNZW51T2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfTWVudSIsIE1lbnVfbWV0aG9kcyk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9NZW51IiwgTWVudV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlNZW51X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKLQlpZiAoTWVudV9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIE1lbnVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlNZW51X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZNZW51X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTWVudV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lbnUiLCAoUHlPYmplY3QgKikmTWVudV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1lbnVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZW51VHlwZSIsIChQeU9iamVjdCAqKSZNZW51X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIE1lbnVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNZW51X0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWVudV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIE1lbnVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1lbnVfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZNZW51X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVudSIsIChQeU9iamVjdCAqKSZNZW51X1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmTWVudV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lbnVUeXBlIiwgKFB5T2JqZWN0ICopJk1lbnVfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvbWx0ZS9fTWx0ZW1vZHVsZS5jCmluZGV4IDFhNmI2YTQuLmNkNjk4ZjQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21sdGUvX01sdGVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy9tbHRlL19NbHRlbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM5LDE0ICszOSwxNCBAQAogc3RhdGljIGludAogT3B0RlNTcGVjUHRyX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZTU3BlYyAqKnBfaXRzZWxmKQogewotICAgICAgICBzdGF0aWMgRlNTcGVjIGZzczsKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgKnBfaXRzZWxmID0gJmZzczsKLSAgICAgICAgcmV0dXJuIFB5TWFjX0dldEZTU3BlYyh2LCAqcF9pdHNlbGYpOworICAgIHN0YXRpYyBGU1NwZWMgZnNzOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gJmZzczsKKyAgICByZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpwX2l0c2VsZik7CiB9CiAKIC8qCkBAIC01NSwxMiArNTUsMTIgQEAKIHN0YXRpYyBpbnQKIE9wdEdXb3JsZE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBHV29ybGRQdHIgKnBfaXRzZWxmKQogewotICAgICAgICBpZiAodiA9PSBQeV9Ob25lKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gR1dvcmxkT2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpOworICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIEdXb3JsZE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KIAogCkBAIC03MywxMTU5ICs3MywxMTU5IEBACiAjZGVmaW5lIFRYTk9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUWE5PYmplY3RfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVFhOT2JqZWN0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBUWE5PYmplY3RPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUWE5PYmplY3Qgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUWE5PYmplY3Qgb2JfaXRzZWxmOwogfSBUWE5PYmplY3RPYmplY3Q7CiAKIFB5T2JqZWN0ICpUWE5PYmpfTmV3KFRYTk9iamVjdCBpdHNlbGYpCiB7Ci0JVFhOT2JqZWN0T2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7Ci0JaXQgPSBQeU9iamVjdF9ORVcoVFhOT2JqZWN0T2JqZWN0LCAmVFhOT2JqZWN0X1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBUWE5PYmplY3RPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhUWE5PYmplY3RPYmplY3QsICZUWE5PYmplY3RfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVFhOT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRYTk9iamVjdCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFUWE5PYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVFhOT2JqZWN0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFRYTk9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFUWE5PYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVFhOT2JqZWN0IHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRYTk9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRYTk9ial9kZWFsbG9jKFRYTk9iamVjdE9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRlbGV0ZU9iamVjdChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhORGVsZXRlT2JqZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhORGVsZXRlT2JqZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5EZWxldGVPYmplY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTkRlbGV0ZU9iamVjdChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkRlbGV0ZU9iamVjdChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJlc2l6ZUZyYW1lKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDMyIGlXaWR0aDsKLQlVSW50MzIgaUhlaWdodDsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgaVdpZHRoOworICAgIFVJbnQzMiBpSGVpZ2h0OworICAgIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7CiAjaWZuZGVmIFRYTlJlc2l6ZUZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soVFhOUmVzaXplRnJhbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlJlc2l6ZUZyYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpSGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5SZXNpemVGcmFtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIGlXaWR0aCwKLQkgICAgICAgICAgICAgICBpSGVpZ2h0LAotCSAgICAgICAgICAgICAgIGlUWE5GcmFtZUlEKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlJlc2l6ZUZyYW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgaVdpZHRoLAorICAgICAgICAgICAgICAgICAgIGlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOU2V0RnJhbWVCb3VuZHMoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgaVRvcDsKLQlTSW50MzIgaUxlZnQ7Ci0JU0ludDMyIGlCb3R0b207Ci0JU0ludDMyIGlSaWdodDsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgaVRvcDsKKyAgICBTSW50MzIgaUxlZnQ7CisgICAgU0ludDMyIGlCb3R0b207CisgICAgU0ludDMyIGlSaWdodDsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOwogI2lmbmRlZiBUWE5TZXRGcmFtZUJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFRYTlNldEZyYW1lQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5TZXRGcmFtZUJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpVG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQm90dG9tLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5TZXRGcmFtZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGlUb3AsCi0JICAgICAgICAgICAgICAgICAgaUxlZnQsCi0JICAgICAgICAgICAgICAgICAgaUJvdHRvbSwKLQkgICAgICAgICAgICAgICAgICBpUmlnaHQsCi0JICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5TZXRGcmFtZUJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGlUb3AsCisgICAgICAgICAgICAgICAgICAgICAgaUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgaUJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICBpUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOS2V5RG93bihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UmVjb3JkIGlFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWNvcmQgaUV2ZW50OwogI2lmbmRlZiBUWE5LZXlEb3duCi0JUHlNYWNfUFJFQ0hFQ0soVFhOS2V5RG93bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOS2V5RG93bik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOS2V5RG93bihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5LZXlEb3duKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAmaUV2ZW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkFkanVzdEN1cnNvcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBpb0N1cnNvclJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGlvQ3Vyc29yUmduOwogI2lmbmRlZiBUWE5BZGp1c3RDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhUWE5BZGp1c3RDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkFkanVzdEN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaW9DdXJzb3JSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5BZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaW9DdXJzb3JSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmaW9DdXJzb3JSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5BZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaW9DdXJzb3JSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ2xpY2soVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlFdmVudFJlY29yZCBpRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEV2ZW50UmVjb3JkIGlFdmVudDsKICNpZm5kZWYgVFhOQ2xpY2sKLQlQeU1hY19QUkVDSEVDSyhUWE5DbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmlFdmVudCkpCi0JCXJldHVybiBOVUxMOwotCVRYTkNsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5DbGljayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICZpRXZlbnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOU2VsZWN0QWxsKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5TZWxlY3RBbGwKLQlQeU1hY19QUkVDSEVDSyhUWE5TZWxlY3RBbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNlbGVjdEFsbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2VsZWN0QWxsKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2VsZWN0QWxsKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhORm9jdXMoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGlCZWNvbWluZ0ZvY3VzZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gaUJlY29taW5nRm9jdXNlZDsKICNpZm5kZWYgVFhORm9jdXMKLQlQeU1hY19QUkVDSEVDSyhUWE5Gb2N1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORm9jdXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQmVjb21pbmdGb2N1c2VkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORm9jdXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICBpQmVjb21pbmdGb2N1c2VkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQmVjb21pbmdGb2N1c2VkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhORm9jdXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICBpQmVjb21pbmdGb2N1c2VkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlVwZGF0ZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOVXBkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5VcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTlVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRyYXcoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRQdHIgaURyYXdQb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHV29ybGRQdHIgaURyYXdQb3J0OwogI2lmbmRlZiBUWE5EcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soVFhORHJhdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORHJhdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdEdXb3JsZE9ial9Db252ZXJ0LCAmaURyYXdQb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORHJhdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgaURyYXdQb3J0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRHV29ybGRPYmpfQ29udmVydCwgJmlEcmF3UG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkRyYXcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgaURyYXdQb3J0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkZvcmNlVXBkYXRlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5Gb3JjZVVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKFRYTkZvcmNlVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Gb3JjZVVwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhORm9yY2VVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5Gb3JjZVVwZGF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldFNsZWVwVGlja3MoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50MzIgX3J2OwogI2lmbmRlZiBUWE5HZXRTbGVlcFRpY2tzCi0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2xlZXBUaWNrcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2xlZXBUaWNrcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVFhOR2V0U2xlZXBUaWNrcyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOR2V0U2xlZXBUaWNrcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSWRsZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOSWRsZQotCVB5TWFjX1BSRUNIRUNLKFRYTklkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTklkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTklkbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5JZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR3Jvd1dpbmRvdyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUV2ZW50UmVjb3JkIGlFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRXZlbnRSZWNvcmQgaUV2ZW50OwogI2lmbmRlZiBUWE5Hcm93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOR3Jvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR3Jvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmaUV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOR3Jvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgJmlFdmVudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZpRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5Hcm93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAmaUV2ZW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlpvb21XaW5kb3coVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MTYgaVBhcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQxNiBpUGFydDsKICNpZm5kZWYgVFhOWm9vbVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRYTlpvb21XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlpvb21XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGFydCkpCi0JCXJldHVybiBOVUxMOwotCVRYTlpvb21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGlQYXJ0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpUGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlpvb21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGlQYXJ0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkNhblVuZG8oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXk7CiAjaWZuZGVmIFRYTkNhblVuZG8KLQlQeU1hY19QUkVDSEVDSyhUWE5DYW5VbmRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5DYW5VbmRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5DYW5VbmRvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmb1RYTkFjdGlvbktleSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb1RYTkFjdGlvbktleSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTkNhblVuZG8oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZvVFhOQWN0aW9uS2V5KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvVFhOQWN0aW9uS2V5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOVW5kbyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVFhOVW5kbwotCVB5TWFjX1BSRUNIRUNLKFRYTlVuZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlVuZG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTlVuZG8oX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5VbmRvKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ2FuUmVkbyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleTsKICNpZm5kZWYgVFhOQ2FuUmVkbwotCVB5TWFjX1BSRUNIRUNLKFRYTkNhblJlZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNhblJlZG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTkNhblJlZG8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZvVFhOQWN0aW9uS2V5KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvVFhOQWN0aW9uS2V5KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOQ2FuUmVkbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJm9UWE5BY3Rpb25LZXkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9UWE5BY3Rpb25LZXkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5SZWRvKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBUWE5SZWRvCi0JUHlNYWNfUFJFQ0hFQ0soVFhOUmVkbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUmVkbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOUmVkbyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTlJlZG8oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5DdXQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5DdXQKLQlQeU1hY19QUkVDSEVDSyhUWE5DdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkN1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkN1dChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkN1dChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOQ29weShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNvcHkKLQlQeU1hY19QUkVDSEVDSyhUWE5Db3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Db3B5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkNvcHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlBhc3RlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhUWE5QYXN0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUGFzdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5QYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlBhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5DbGVhcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNsZWFyCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ2xlYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkNsZWFyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ2xlYXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5DbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0U2VsZWN0aW9uKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVFhOT2Zmc2V0IG9TdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgb0VuZE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVFhOT2Zmc2V0IG9TdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgb0VuZE9mZnNldDsKICNpZm5kZWYgVFhOR2V0U2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0U2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRYTkdldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAmb1N0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAmb0VuZE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgb0VuZE9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkdldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAmb1N0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAmb0VuZE9mZnNldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb0VuZE9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNob3dTZWxlY3Rpb24oVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGlTaG93RW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGlTaG93RW5kOwogI2lmbmRlZiBUWE5TaG93U2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOU2hvd1NlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2hvd1NlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTaG93RW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2hvd1NlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgaVNob3dFbmQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTaG93RW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2hvd1NlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgaVNob3dFbmQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSXNTZWxlY3Rpb25FbXB0eShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgVFhOSXNTZWxlY3Rpb25FbXB0eQotCVB5TWFjX1BSRUNIRUNLKFRYTklzU2VsZWN0aW9uRW1wdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTklzU2VsZWN0aW9uRW1wdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTklzU2VsZWN0aW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTklzU2VsZWN0aW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNldFNlbGVjdGlvbihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OworICAgIFRYTk9mZnNldCBpRW5kT2Zmc2V0OwogI2lmbmRlZiBUWE5TZXRTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5TZXRTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlNldFNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNldFNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5TZXRTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5Db3VudFJ1bnNJblJhbmdlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OwotCVRYTk9mZnNldCBpRW5kT2Zmc2V0OwotCUl0ZW1Db3VudCBvUnVuQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBJdGVtQ291bnQgb1J1bkNvdW50OwogI2lmbmRlZiBUWE5Db3VudFJ1bnNJblJhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOQ291bnRSdW5zSW5SYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ291bnRSdW5zSW5SYW5nZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkNvdW50UnVuc0luUmFuZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb1J1bkNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvUnVuQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ291bnRSdW5zSW5SYW5nZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvUnVuQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9SdW5Db3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkRhdGFTaXplKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQnl0ZUNvdW50IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQnl0ZUNvdW50IF9ydjsKICNpZm5kZWYgVFhORGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhUWE5EYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTkRhdGFTaXplKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUWE5EYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0RGF0YShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKLQlUWE5PZmZzZXQgaUVuZE9mZnNldDsKLQlIYW5kbGUgb0RhdGFIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBIYW5kbGUgb0RhdGFIYW5kbGU7CiAjaWZuZGVmIFRYTkdldERhdGEKLQlQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOR2V0RGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICBpRW5kT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICZvRGF0YUhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9EYXRhSGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAmb0RhdGFIYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvRGF0YUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldERhdGFFbmNvZGVkKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0OwotCVRYTk9mZnNldCBpRW5kT2Zmc2V0OwotCUhhbmRsZSBvRGF0YUhhbmRsZTsKLQlUWE5EYXRhVHlwZSBpRW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhOT2Zmc2V0IGlTdGFydE9mZnNldDsKKyAgICBUWE5PZmZzZXQgaUVuZE9mZnNldDsKKyAgICBIYW5kbGUgb0RhdGFIYW5kbGU7CisgICAgVFhORGF0YVR5cGUgaUVuY29kaW5nOwogI2lmbmRlZiBUWE5HZXREYXRhRW5jb2RlZAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldERhdGFFbmNvZGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXREYXRhRW5jb2RlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlFbmRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlFbmNvZGluZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5HZXREYXRhRW5jb2RlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvRGF0YUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaUVuY29kaW5nKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb0RhdGFIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldERhdGFFbmNvZGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9EYXRhSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRW5jb2RpbmcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvRGF0YUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNldERhdGFGcm9tRmlsZShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU0ludDE2IGlGaWxlUmVmTnVtOwotCU9TVHlwZSBpRmlsZVR5cGU7Ci0JQnl0ZUNvdW50IGlGaWxlTGVuZ3RoOwotCVRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7Ci0JVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU0ludDE2IGlGaWxlUmVmTnVtOworICAgIE9TVHlwZSBpRmlsZVR5cGU7CisgICAgQnl0ZUNvdW50IGlGaWxlTGVuZ3RoOworICAgIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQ7CisgICAgVFhOT2Zmc2V0IGlFbmRPZmZzZXQ7CiAjaWZuZGVmIFRYTlNldERhdGFGcm9tRmlsZQotCVB5TWFjX1BSRUNIRUNLKFRYTlNldERhdGFGcm9tRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2V0RGF0YUZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRmlsZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUZpbGVMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNldERhdGFGcm9tRmlsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZUxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRmlsZVJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUZpbGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5kT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlNldERhdGFGcm9tRmlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRmlsZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlFbmRPZmZzZXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5HZXRDaGFuZ2VDb3VudChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUl0ZW1Db3VudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEl0ZW1Db3VudCBfcnY7CiAjaWZuZGVmIFRYTkdldENoYW5nZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOR2V0Q2hhbmdlQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkdldENoYW5nZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5HZXRDaGFuZ2VDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOR2V0Q2hhbmdlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlNhdmUoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTkZpbGVUeXBlIGlUeXBlOwotCU9TVHlwZSBpUmVzVHlwZTsKLQlUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZzsKLQlGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uOwotCVNJbnQxNiBpRGF0YVJlZmVyZW5jZTsKLQlTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTkZpbGVUeXBlIGlUeXBlOworICAgIE9TVHlwZSBpUmVzVHlwZTsKKyAgICBUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZzsKKyAgICBGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uOworICAgIFNJbnQxNiBpRGF0YVJlZmVyZW5jZTsKKyAgICBTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlOwogI2lmbmRlZiBUWE5TYXZlCi0JUHlNYWNfUFJFQ0hFQ0soVFhOU2F2ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2F2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaVJlc1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmlGaWxlU3BlY2lmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlEYXRhUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVJlc291cmNlUmVmZXJlbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlNhdmUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBpVHlwZSwKLQkgICAgICAgICAgICAgICBpUmVzVHlwZSwKLQkgICAgICAgICAgICAgICBpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgJmlGaWxlU3BlY2lmaWNhdGlvbiwKLQkgICAgICAgICAgICAgICBpRGF0YVJlZmVyZW5jZSwKLQkgICAgICAgICAgICAgICBpUmVzb3VyY2VSZWZlcmVuY2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpUmVzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlQZXJtYW5lbnRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmaUZpbGVTcGVjaWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaURhdGFSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpUmVzb3VyY2VSZWZlcmVuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOU2F2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGlUeXBlLAorICAgICAgICAgICAgICAgICAgIGlSZXNUeXBlLAorICAgICAgICAgICAgICAgICAgIGlQZXJtYW5lbnRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAmaUZpbGVTcGVjaWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgIGlEYXRhUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgIGlSZXNvdXJjZVJlZmVyZW5jZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJldmVydChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTlJldmVydAotCVB5TWFjX1BSRUNIRUNLKFRYTlJldmVydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUmV2ZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOUmV2ZXJ0KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUmV2ZXJ0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5QYWdlU2V0dXAoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5QYWdlU2V0dXAKLQlQeU1hY19QUkVDSEVDSyhUWE5QYWdlU2V0dXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTlBhZ2VTZXR1cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlBhZ2VTZXR1cChfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTlBhZ2VTZXR1cChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOUHJpbnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBUWE5QcmludAotCVB5TWFjX1BSRUNIRUNLKFRYTlByaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5QcmludCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlByaW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUHJpbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldFZpZXdSZWN0KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBvVmlld1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3Qgb1ZpZXdSZWN0OwogI2lmbmRlZiBUWE5HZXRWaWV3UmVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldFZpZXdSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRWaWV3UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOR2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmb1ZpZXdSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm9WaWV3UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRYTkdldFZpZXdSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgJm9WaWV3UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvVmlld1JlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5TZXRWaWV3UmVjdChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgaVZpZXdSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGlWaWV3UmVjdDsKICNpZm5kZWYgVFhOU2V0Vmlld1JlY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5TZXRWaWV3UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOU2V0Vmlld1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaVZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVFhOU2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmaVZpZXdSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaVZpZXdSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOU2V0Vmlld1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmaVZpZXdSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkF0dGFjaE9iamVjdFRvV2luZG93KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlHV29ybGRQdHIgaVdpbmRvdzsKLQlCb29sZWFuIGlJc0FjdHVhbFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBHV29ybGRQdHIgaVdpbmRvdzsKKyAgICBCb29sZWFuIGlJc0FjdHVhbFdpbmRvdzsKICNpZm5kZWYgVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhUWE5BdHRhY2hPYmplY3RUb1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAmaUlzQWN0dWFsV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkF0dGFjaE9iamVjdFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJc0FjdHVhbFdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUlzQWN0dWFsV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkF0dGFjaE9iamVjdFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJc0FjdHVhbFdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyhUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EcmFnVHJhY2tlcihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVFhORnJhbWVJRCBpVFhORnJhbWVJRDsKLQlEcmFnVHJhY2tpbmdNZXNzYWdlIGlNZXNzYWdlOwotCVdpbmRvd1B0ciBpV2luZG93OwotCURyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2U7Ci0JQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIERyYWdUcmFja2luZ01lc3NhZ2UgaU1lc3NhZ2U7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKKyAgICBCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OwogI2lmbmRlZiBUWE5EcmFnVHJhY2tlcgotCVB5TWFjX1BSRUNIRUNLKFRYTkRyYWdUcmFja2VyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5EcmFnVHJhY2tlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaE8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmaU1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaURyYWdSZWZlcmVuY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5EcmFnVHJhY2tlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBpVFhORnJhbWVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgaU1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIGlEcmFnUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGhPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfQ29udmVydCwgJmlEcmFnUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORHJhZ1RyYWNrZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpRHJhZ1JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5EcmFnUmVjZWl2ZXIoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7Ci0JV2luZG93UHRyIGlXaW5kb3c7Ci0JRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKLQlCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQ7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZTsKKyAgICBCb29sZWFuIGlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93OwogI2lmbmRlZiBUWE5EcmFnUmVjZWl2ZXIKLQlQeU1hY19QUkVDSEVDSyhUWE5EcmFnUmVjZWl2ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFRYTkRyYWdSZWNlaXZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmaURyYWdSZWZlcmVuY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5EcmFnUmVjZWl2ZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlUWE5GcmFtZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgIGlEcmFnUmVmZXJlbmNlLAotCSAgICAgICAgICAgICAgICAgICAgICAgaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVFhORnJhbWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBEcmFnT2JqX0NvbnZlcnQsICZpRHJhZ1JlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlEaWZmZXJlbnRPYmplY3RTYW1lV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkRyYWdSZWNlaXZlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaURyYWdSZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkFjdGl2YXRlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOwotCVRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEOworICAgIFRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZTsKICNpZm5kZWYgVFhOQWN0aXZhdGUKLQlQeU1hY19QUkVDSEVDSyhUWE5BY3RpdmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQWN0aXZhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpQWN0aXZlU3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCi0JICAgICAgICAgICAgICAgICAgIGlBY3RpdmVTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpQWN0aXZlU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgIGlBY3RpdmVTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkVjaG9Nb2RlKFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVbmlDaGFyIGlFY2hvQ2hhcmFjdGVyOwotCVRleHRFbmNvZGluZyBpRW5jb2Rpbmc7Ci0JQm9vbGVhbiBpT247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVW5pQ2hhciBpRWNob0NoYXJhY3RlcjsKKyAgICBUZXh0RW5jb2RpbmcgaUVuY29kaW5nOworICAgIEJvb2xlYW4gaU9uOwogI2lmbmRlZiBUWE5FY2hvTW9kZQotCVB5TWFjX1BSRUNIRUNLKFRYTkVjaG9Nb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5FY2hvTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaUVjaG9DaGFyYWN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICZpT24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORWNob01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaUVjaG9DaGFyYWN0ZXIsCi0JICAgICAgICAgICAgICAgICAgIGlFbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgaU9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUVjaG9DaGFyYWN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpT24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORWNob01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaUVjaG9DaGFyYWN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGlFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgaU9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhORG9Gb250TWVudVNlbGVjdGlvbihUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OwotCVNJbnQxNiBpTWVudUlEOwotCVNJbnQxNiBpTWVudUl0ZW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OworICAgIFNJbnQxNiBpTWVudUlEOworICAgIFNJbnQxNiBpTWVudUl0ZW07CiAjaWZuZGVmIFRYTkRvRm9udE1lbnVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBUWE5Gb250TWVudU9ial9Db252ZXJ0LCAmaVRYTkZvbnRNZW51T2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaU1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SXRlbSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZvbnRNZW51T2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbnVJdGVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVFhORm9udE1lbnVPYmpfQ29udmVydCwgJmlUWE5Gb250TWVudU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpTWVudUl0ZW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORG9Gb250TWVudVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUWE5Gb250TWVudU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW51SXRlbSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlByZXBhcmVGb250TWVudShUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdDsKICNpZm5kZWYgVFhOUHJlcGFyZUZvbnRNZW51Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOUHJlcGFyZUZvbnRNZW51KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5QcmVwYXJlRm9udE1lbnUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUWE5Gb250TWVudU9ial9Db252ZXJ0LCAmaVRYTkZvbnRNZW51T2JqZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlByZXBhcmVGb250TWVudShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaVRYTkZvbnRNZW51T2JqZWN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRYTkZvbnRNZW51T2JqX0NvbnZlcnQsICZpVFhORm9udE1lbnVPYmplY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUHJlcGFyZUZvbnRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVFhORm9udE1lbnVPYmplY3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial9UWE5Qb2ludFRvT2Zmc2V0KFRYTk9iamVjdE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlQb2ludCBpUG9pbnQ7Ci0JVFhOT2Zmc2V0IG9PZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgaVBvaW50OworICAgIFRYTk9mZnNldCBvT2Zmc2V0OwogI2lmbmRlZiBUWE5Qb2ludFRvT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soVFhOUG9pbnRUb09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOUG9pbnRUb09mZnNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaVBvaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTlBvaW50VG9PZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpUG9pbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm9PZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG9PZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOUG9pbnRUb09mZnNldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb09mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb09mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTk9mZnNldFRvUG9pbnQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVRYTk9mZnNldCBpT2Zmc2V0OwotCVBvaW50IG9Qb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBUWE5PZmZzZXQgaU9mZnNldDsKKyAgICBQb2ludCBvUG9pbnQ7CiAjaWZuZGVmIFRYTk9mZnNldFRvUG9pbnQKLQlQeU1hY19QUkVDSEVDSyhUWE5PZmZzZXRUb1BvaW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5PZmZzZXRUb1BvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaU9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5PZmZzZXRUb1BvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb1BvaW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgb1BvaW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlPZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOT2Zmc2V0VG9Qb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9Qb2ludCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIG9Qb2ludCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTkdldExpbmVDb3VudChUWE5PYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSXRlbUNvdW50IG9MaW5lVG90YWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgSXRlbUNvdW50IG9MaW5lVG90YWw7CiAjaWZuZGVmIFRYTkdldExpbmVDb3VudAotCVB5TWFjX1BSRUNIRUNLKFRYTkdldExpbmVDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOR2V0TGluZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOR2V0TGluZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVUb3RhbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb0xpbmVUb3RhbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUWE5HZXRMaW5lQ291bnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvTGluZVRvdGFsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvTGluZVRvdGFsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOR2V0TGluZU1ldHJpY3MoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpTGluZU51bWJlcjsKLQlGaXhlZCBvTGluZVdpZHRoOwotCUZpeGVkIG9MaW5lSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBpTGluZU51bWJlcjsKKyAgICBGaXhlZCBvTGluZVdpZHRoOworICAgIEZpeGVkIG9MaW5lSGVpZ2h0OwogI2lmbmRlZiBUWE5HZXRMaW5lTWV0cmljcwotCVB5TWFjX1BSRUNIRUNLKFRYTkdldExpbmVNZXRyaWNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRMaW5lTWV0cmljcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlMaW5lTnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkdldExpbmVNZXRyaWNzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlMaW5lTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lSGVpZ2h0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBvTGluZVdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIG9MaW5lSGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlMaW5lTnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldExpbmVNZXRyaWNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0xpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9MaW5lSGVpZ2h0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBvTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIG9MaW5lSGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5PYmpfVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3coVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpV2luZG93OwotCUJvb2xlYW4gb0F0dGFjaGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpV2luZG93OworICAgIEJvb2xlYW4gb0F0dGFjaGVkOwogI2lmbmRlZiBUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb0F0dGFjaGVkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvQXR0YWNoZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpV2luZG93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvQXR0YWNoZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9BdHRhY2hlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVFhOT2JqX1RYTlJlY2FsY1RleHRMYXlvdXQoVFhOT2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTlJlY2FsY1RleHRMYXlvdXQKLQlQeU1hY19QUkVDSEVDSyhUWE5SZWNhbGNUZXh0TGF5b3V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5SZWNhbGNUZXh0TGF5b3V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5SZWNhbGNUZXh0TGF5b3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVFhOUmVjYWxjVGV4dExheW91dChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUWE5PYmpfbWV0aG9kc1tdID0gewotCXsiVFhORGVsZXRlT2JqZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EZWxldGVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTlJlc2l6ZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZXNpemVGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDMyIGlXaWR0aCwgVUludDMyIGlIZWlnaHQsIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQpIC0+IE5vbmUiKX0sCi0JeyJUWE5TZXRGcmFtZUJvdW5kcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0RnJhbWVCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQzMiBpVG9wLCBTSW50MzIgaUxlZnQsIFNJbnQzMiBpQm90dG9tLCBTSW50MzIgaVJpZ2h0LCBUWE5GcmFtZUlEIGlUWE5GcmFtZUlEKSAtPiBOb25lIil9LAotCXsiVFhOS2V5RG93biIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOS2V5RG93biwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOQWRqdXN0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BZGp1c3RDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpb0N1cnNvclJnbikgLT4gTm9uZSIpfSwKLQl7IlRYTkNsaWNrIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DbGljaywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOU2VsZWN0QWxsIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZWxlY3RBbGwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkZvY3VzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Gb2N1cywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBpQmVjb21pbmdGb2N1c2VkKSAtPiBOb25lIil9LAotCXsiVFhOVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5VcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkRyYXciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYXcsIDEsCi0JIFB5RG9jX1NUUigiKEdXb3JsZFB0ciBpRHJhd1BvcnQpIC0+IE5vbmUiKX0sCi0JeyJUWE5Gb3JjZVVwZGF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORm9yY2VVcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFNsZWVwVGlja3MiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldFNsZWVwVGlja3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBfcnYpIil9LAotCXsiVFhOSWRsZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOR3Jvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR3Jvd1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgaUV2ZW50KSAtPiBOb25lIil9LAotCXsiVFhOWm9vbVdpbmRvdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOWm9vbVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IGlQYXJ0KSAtPiBOb25lIil9LAotCXsiVFhOQ2FuVW5kbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2FuVW5kbywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIFRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5KSIpfSwKLQl7IlRYTlVuZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlVuZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkNhblJlZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNhblJlZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2LCBUWE5BY3Rpb25LZXkgb1RYTkFjdGlvbktleSkiKX0sCi0JeyJUWE5SZWRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZWRvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5DdXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkN1dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOQ29weSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOUGFzdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBhc3RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5DbGVhciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2xlYXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUWE5PZmZzZXQgb1N0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgb0VuZE9mZnNldCkiKX0sCi0JeyJUWE5TaG93U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TaG93U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGlTaG93RW5kKSAtPiBOb25lIil9LAotCXsiVFhOSXNTZWxlY3Rpb25FbXB0eSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOSXNTZWxlY3Rpb25FbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVFhOU2V0U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXRTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiBOb25lIil9LAotCXsiVFhOQ291bnRSdW5zSW5SYW5nZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ291bnRSdW5zSW5SYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IChJdGVtQ291bnQgb1J1bkNvdW50KSIpfSwKLQl7IlRYTkRhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQnl0ZUNvdW50IF9ydikiKX0sCi0JeyJUWE5HZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXREYXRhLCAxLAotCSBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gKEhhbmRsZSBvRGF0YUhhbmRsZSkiKX0sCi0JeyJUWE5HZXREYXRhRW5jb2RlZCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0RGF0YUVuY29kZWQsIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0LCBUWE5EYXRhVHlwZSBpRW5jb2RpbmcpIC0+IChIYW5kbGUgb0RhdGFIYW5kbGUpIil9LAotCXsiVFhOU2V0RGF0YUZyb21GaWxlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXREYXRhRnJvbUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBpRmlsZVJlZk51bSwgT1NUeXBlIGlGaWxlVHlwZSwgQnl0ZUNvdW50IGlGaWxlTGVuZ3RoLCBUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldENoYW5nZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRDaGFuZ2VDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCi0JeyJUWE5TYXZlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TYXZlLCAxLAotCSBQeURvY19TVFIoIihUWE5GaWxlVHlwZSBpVHlwZSwgT1NUeXBlIGlSZXNUeXBlLCBUWE5QZXJtYW5lbnRUZXh0RW5jb2RpbmdUeXBlIGlQZXJtYW5lbnRFbmNvZGluZywgRlNTcGVjIGlGaWxlU3BlY2lmaWNhdGlvbiwgU0ludDE2IGlEYXRhUmVmZXJlbmNlLCBTSW50MTYgaVJlc291cmNlUmVmZXJlbmNlKSAtPiBOb25lIil9LAotCXsiVFhOUmV2ZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZXZlcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTlBhZ2VTZXR1cCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUGFnZVNldHVwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5QcmludCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUHJpbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRYTkdldFZpZXdSZWN0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRWaWV3UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvVmlld1JlY3QpIil9LAotCXsiVFhOU2V0Vmlld1JlY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldFZpZXdSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGlWaWV3UmVjdCkgLT4gTm9uZSIpfSwKLQl7IlRYTkF0dGFjaE9iamVjdFRvV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BdHRhY2hPYmplY3RUb1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoR1dvcmxkUHRyIGlXaW5kb3csIEJvb2xlYW4gaUlzQWN0dWFsV2luZG93KSAtPiBOb25lIil9LAotCXsiVFhOSXNPYmplY3RBdHRhY2hlZFRvV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlRYTkRyYWdUcmFja2VyIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5EcmFnVHJhY2tlciwgMSwKLQkgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgRHJhZ1RyYWNraW5nTWVzc2FnZSBpTWVzc2FnZSwgV2luZG93UHRyIGlXaW5kb3csIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2UsIEJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJUWE5EcmFnUmVjZWl2ZXIiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYWdSZWNlaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgV2luZG93UHRyIGlXaW5kb3csIERyYWdSZWZlcmVuY2UgaURyYWdSZWZlcmVuY2UsIEJvb2xlYW4gaURpZmZlcmVudE9iamVjdFNhbWVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJUWE5BY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQWN0aXZhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQsIFRYTlNjcm9sbEJhclN0YXRlIGlBY3RpdmVTdGF0ZSkgLT4gTm9uZSIpfSwKLQl7IlRYTkVjaG9Nb2RlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5FY2hvTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoVW5pQ2hhciBpRWNob0NoYXJhY3RlciwgVGV4dEVuY29kaW5nIGlFbmNvZGluZywgQm9vbGVhbiBpT24pIC0+IE5vbmUiKX0sCi0JeyJUWE5Eb0ZvbnRNZW51U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Eb0ZvbnRNZW51U2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihUWE5Gb250TWVudU9iamVjdCBpVFhORm9udE1lbnVPYmplY3QsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaU1lbnVJdGVtKSAtPiBOb25lIil9LAotCXsiVFhOUHJlcGFyZUZvbnRNZW51IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QcmVwYXJlRm9udE1lbnUsIDEsCi0JIFB5RG9jX1NUUigiKFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdCkgLT4gTm9uZSIpfSwKLQl7IlRYTlBvaW50VG9PZmZzZXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlBvaW50VG9PZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGlQb2ludCkgLT4gKFRYTk9mZnNldCBvT2Zmc2V0KSIpfSwKLQl7IlRYTk9mZnNldFRvUG9pbnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTk9mZnNldFRvUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpT2Zmc2V0KSAtPiAoUG9pbnQgb1BvaW50KSIpfSwKLQl7IlRYTkdldExpbmVDb3VudCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0TGluZUNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgb0xpbmVUb3RhbCkiKX0sCi0JeyJUWE5HZXRMaW5lTWV0cmljcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0TGluZU1ldHJpY3MsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQzMiBpTGluZU51bWJlcikgLT4gKEZpeGVkIG9MaW5lV2lkdGgsIEZpeGVkIG9MaW5lSGVpZ2h0KSIpfSwKLQl7IlRYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc09iamVjdEF0dGFjaGVkVG9TcGVjaWZpY1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGlXaW5kb3cpIC0+IChCb29sZWFuIG9BdHRhY2hlZCkiKX0sCi0JeyJUWE5SZWNhbGNUZXh0TGF5b3V0IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5SZWNhbGNUZXh0TGF5b3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJUWE5EZWxldGVPYmplY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRlbGV0ZU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOUmVzaXplRnJhbWUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlc2l6ZUZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihVSW50MzIgaVdpZHRoLCBVSW50MzIgaUhlaWdodCwgVFhORnJhbWVJRCBpVFhORnJhbWVJRCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlNldEZyYW1lQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5TZXRGcmFtZUJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIGlUb3AsIFNJbnQzMiBpTGVmdCwgU0ludDMyIGlCb3R0b20sIFNJbnQzMiBpUmlnaHQsIFRYTkZyYW1lSUQgaVRYTkZyYW1lSUQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5LZXlEb3duIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5LZXlEb3duLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5BZGp1c3RDdXJzb3IiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkFkanVzdEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGlvQ3Vyc29yUmduKSAtPiBOb25lIil9LAorICAgIHsiVFhOQ2xpY2siLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkNsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5TZWxlY3RBbGwiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNlbGVjdEFsbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhORm9jdXMiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkZvY3VzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGlCZWNvbWluZ0ZvY3VzZWQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5VcGRhdGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhORHJhdyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORHJhdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR1dvcmxkUHRyIGlEcmF3UG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkZvcmNlVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Gb3JjZVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0U2xlZXBUaWNrcyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOR2V0U2xlZXBUaWNrcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIF9ydikiKX0sCisgICAgeyJUWE5JZGxlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5JZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Hcm93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Hcm93V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBpRXZlbnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5ab29tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5ab29tV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgaVBhcnQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5DYW5VbmRvIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DYW5VbmRvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgVFhOQWN0aW9uS2V5IG9UWE5BY3Rpb25LZXkpIil9LAorICAgIHsiVFhOVW5kbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOVW5kbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOQ2FuUmVkbyIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ2FuUmVkbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIFRYTkFjdGlvbktleSBvVFhOQWN0aW9uS2V5KSIpfSwKKyAgICB7IlRYTlJlZG8iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlZG8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkN1dCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOQ3V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db3B5IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Db3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5QYXN0ZSIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkNsZWFyIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5DbGVhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0U2VsZWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRYTk9mZnNldCBvU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBvRW5kT2Zmc2V0KSIpfSwKKyAgICB7IlRYTlNob3dTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNob3dTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gaVNob3dFbmQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Jc1NlbGVjdGlvbkVtcHR5IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Jc1NlbGVjdGlvbkVtcHR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJUWE5TZXRTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldFNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db3VudFJ1bnNJblJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5Db3VudFJ1bnNJblJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihUWE5PZmZzZXQgaVN0YXJ0T2Zmc2V0LCBUWE5PZmZzZXQgaUVuZE9mZnNldCkgLT4gKEl0ZW1Db3VudCBvUnVuQ291bnQpIil9LAorICAgIHsiVFhORGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCeXRlQ291bnQgX3J2KSIpfSwKKyAgICB7IlRYTkdldERhdGEiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiAoSGFuZGxlIG9EYXRhSGFuZGxlKSIpfSwKKyAgICB7IlRYTkdldERhdGFFbmNvZGVkIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXREYXRhRW5jb2RlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlTdGFydE9mZnNldCwgVFhOT2Zmc2V0IGlFbmRPZmZzZXQsIFRYTkRhdGFUeXBlIGlFbmNvZGluZykgLT4gKEhhbmRsZSBvRGF0YUhhbmRsZSkiKX0sCisgICAgeyJUWE5TZXREYXRhRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNldERhdGFGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGlGaWxlUmVmTnVtLCBPU1R5cGUgaUZpbGVUeXBlLCBCeXRlQ291bnQgaUZpbGVMZW5ndGgsIFRYTk9mZnNldCBpU3RhcnRPZmZzZXQsIFRYTk9mZnNldCBpRW5kT2Zmc2V0KSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0Q2hhbmdlQ291bnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldENoYW5nZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKKyAgICB7IlRYTlNhdmUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlNhdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkZpbGVUeXBlIGlUeXBlLCBPU1R5cGUgaVJlc1R5cGUsIFRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nLCBGU1NwZWMgaUZpbGVTcGVjaWZpY2F0aW9uLCBTSW50MTYgaURhdGFSZWZlcmVuY2UsIFNJbnQxNiBpUmVzb3VyY2VSZWZlcmVuY2UpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5SZXZlcnQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJldmVydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOUGFnZVNldHVwIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QYWdlU2V0dXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRYTlByaW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5QcmludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOR2V0Vmlld1JlY3QiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkdldFZpZXdSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG9WaWV3UmVjdCkiKX0sCisgICAgeyJUWE5TZXRWaWV3UmVjdCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOU2V0Vmlld1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgaVZpZXdSZWN0KSAtPiBOb25lIil9LAorICAgIHsiVFhOQXR0YWNoT2JqZWN0VG9XaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkF0dGFjaE9iamVjdFRvV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihHV29ybGRQdHIgaVdpbmRvdywgQm9vbGVhbiBpSXNBY3R1YWxXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Jc09iamVjdEF0dGFjaGVkVG9XaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiVFhORHJhZ1RyYWNrZXIiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRyYWdUcmFja2VyLCAxLAorICAgICBQeURvY19TVFIoIihUWE5GcmFtZUlEIGlUWE5GcmFtZUlELCBEcmFnVHJhY2tpbmdNZXNzYWdlIGlNZXNzYWdlLCBXaW5kb3dQdHIgaVdpbmRvdywgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZSwgQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkRyYWdSZWNlaXZlciIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhORHJhZ1JlY2VpdmVyLCAxLAorICAgICBQeURvY19TVFIoIihUWE5GcmFtZUlEIGlUWE5GcmFtZUlELCBXaW5kb3dQdHIgaVdpbmRvdywgRHJhZ1JlZmVyZW5jZSBpRHJhZ1JlZmVyZW5jZSwgQm9vbGVhbiBpRGlmZmVyZW50T2JqZWN0U2FtZVdpbmRvdykgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkFjdGl2YXRlIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5BY3RpdmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhORnJhbWVJRCBpVFhORnJhbWVJRCwgVFhOU2Nyb2xsQmFyU3RhdGUgaUFjdGl2ZVN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiVFhORWNob01vZGUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkVjaG9Nb2RlLCAxLAorICAgICBQeURvY19TVFIoIihVbmlDaGFyIGlFY2hvQ2hhcmFjdGVyLCBUZXh0RW5jb2RpbmcgaUVuY29kaW5nLCBCb29sZWFuIGlPbikgLT4gTm9uZSIpfSwKKyAgICB7IlRYTkRvRm9udE1lbnVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTkRvRm9udE1lbnVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRYTkZvbnRNZW51T2JqZWN0IGlUWE5Gb250TWVudU9iamVjdCwgU0ludDE2IGlNZW51SUQsIFNJbnQxNiBpTWVudUl0ZW0pIC0+IE5vbmUiKX0sCisgICAgeyJUWE5QcmVwYXJlRm9udE1lbnUiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlByZXBhcmVGb250TWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhORm9udE1lbnVPYmplY3QgaVRYTkZvbnRNZW51T2JqZWN0KSAtPiBOb25lIil9LAorICAgIHsiVFhOUG9pbnRUb09mZnNldCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOUG9pbnRUb09mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaVBvaW50KSAtPiAoVFhOT2Zmc2V0IG9PZmZzZXQpIil9LAorICAgIHsiVFhOT2Zmc2V0VG9Qb2ludCIsIChQeUNGdW5jdGlvbilUWE5PYmpfVFhOT2Zmc2V0VG9Qb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOT2Zmc2V0IGlPZmZzZXQpIC0+IChQb2ludCBvUG9pbnQpIil9LAorICAgIHsiVFhOR2V0TGluZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRMaW5lQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEl0ZW1Db3VudCBvTGluZVRvdGFsKSIpfSwKKyAgICB7IlRYTkdldExpbmVNZXRyaWNzIiwgKFB5Q0Z1bmN0aW9uKVRYTk9ial9UWE5HZXRMaW5lTWV0cmljcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVUludDMyIGlMaW5lTnVtYmVyKSAtPiAoRml4ZWQgb0xpbmVXaWR0aCwgRml4ZWQgb0xpbmVIZWlnaHQpIil9LAorICAgIHsiVFhOSXNPYmplY3RBdHRhY2hlZFRvU3BlY2lmaWNXaW5kb3ciLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTklzT2JqZWN0QXR0YWNoZWRUb1NwZWNpZmljV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaVdpbmRvdykgLT4gKEJvb2xlYW4gb0F0dGFjaGVkKSIpfSwKKyAgICB7IlRYTlJlY2FsY1RleHRMYXlvdXQiLCAoUHlDRnVuY3Rpb24pVFhOT2JqX1RYTlJlY2FsY1RleHRMYXlvdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgVFhOT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTI0Miw2MSArMTI0Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRYTk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVFhOT2JqZWN0IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVFhOT2JqZWN0IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRYTk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRYTk9iamVjdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUWE5PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUWE5PYmplY3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVFhOT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRYTk9iamVjdF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9NbHRlLlRYTk9iamVjdCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRYTk9iamVjdE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFRYTk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBUWE5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRYTk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgVFhOT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRYTk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUWE5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JVFhOT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlUWE5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVFhOT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JVFhOT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfTWx0ZS5UWE5PYmplY3QiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihUWE5PYmplY3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBUWE5PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVFhOT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBUWE5PYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFRYTk9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUWE5PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVFhOT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFRYTk9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVFhOT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFRYTk9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFRYTk9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBUWE5PYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzMDksNzcgKzEzMDksNzcgQEAKICNkZWZpbmUgVFhORm9udE1lbnVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVFhORm9udE1lbnVPYmplY3RfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVFhORm9udE1lbnVPYmplY3RfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVFhORm9udE1lbnVPYmplY3Qgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBUWE5Gb250TWVudU9iamVjdCBvYl9pdHNlbGY7CiB9IFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0OwogCiBQeU9iamVjdCAqVFhORm9udE1lbnVPYmpfTmV3KFRYTkZvbnRNZW51T2JqZWN0IGl0c2VsZikKIHsKLQlUWE5Gb250TWVudU9iamVjdE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0LCAmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVFhORm9udE1lbnVPYmplY3RPYmplY3QsICZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBUWE5Gb250TWVudU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBUWE5Gb250TWVudU9iamVjdCAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFUWE5Gb250TWVudU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUWE5Gb250TWVudU9iamVjdCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFUWE5Gb250TWVudU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUWE5Gb250TWVudU9iamVjdCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRYTkZvbnRNZW51T2JqX2RlYWxsb2MoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRYTkZvbnRNZW51T2JqX1RYTkdldEZvbnRNZW51SGFuZGxlKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlOwogI2lmbmRlZiBUWE5HZXRGb250TWVudUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRYTkdldEZvbnRNZW51SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5HZXRGb250TWVudUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTkdldEZvbnRNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvRm9udE1lbnVIYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb0ZvbnRNZW51SGFuZGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTkdldEZvbnRNZW51SGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvRm9udE1lbnVIYW5kbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb0ZvbnRNZW51SGFuZGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUWE5Gb250TWVudU9ial9UWE5EaXNwb3NlRm9udE1lbnVPYmplY3QoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkRpc3Bvc2VGb250TWVudU9iamVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTkRpc3Bvc2VGb250TWVudU9iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVFhORm9udE1lbnVPYmpfbWV0aG9kc1tdID0gewotCXsiVFhOR2V0Rm9udE1lbnVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVFhORm9udE1lbnVPYmpfVFhOR2V0Rm9udE1lbnVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lbnVIYW5kbGUgb0ZvbnRNZW51SGFuZGxlKSIpfSwKLQl7IlRYTkRpc3Bvc2VGb250TWVudU9iamVjdCIsIChQeUNGdW5jdGlvbilUWE5Gb250TWVudU9ial9UWE5EaXNwb3NlRm9udE1lbnVPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlRYTkdldEZvbnRNZW51SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRYTkZvbnRNZW51T2JqX1RYTkdldEZvbnRNZW51SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZW51SGFuZGxlIG9Gb250TWVudUhhbmRsZSkiKX0sCisgICAgeyJUWE5EaXNwb3NlRm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pVFhORm9udE1lbnVPYmpfVFhORGlzcG9zZUZvbnRNZW51T2JqZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFRYTkZvbnRNZW51T2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTM5Niw2MSArMTM5Niw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRYTkZvbnRNZW51T2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlUWE5Gb250TWVudU9iamVjdCBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFRYTkZvbnRNZW51T2JqZWN0IGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRYTkZvbnRNZW51T2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoVFhORm9udE1lbnVPYmplY3RPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVFhORm9udE1lbnVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUWE5Gb250TWVudU9iamVjdE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBUWE5Gb250TWVudU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBUWE5Gb250TWVudU9iamVjdF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9NbHRlLlRYTkZvbnRNZW51T2JqZWN0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVFhORm9udE1lbnVPYmplY3RPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBUWE5Gb250TWVudU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBUWE5Gb250TWVudU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVFhORm9udE1lbnVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRYTkZvbnRNZW51T2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRYTkZvbnRNZW51T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVRYTkZvbnRNZW51T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRYTkZvbnRNZW51T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlUWE5Gb250TWVudU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlUWE5Gb250TWVudU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRYTkZvbnRNZW51T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfTWx0ZS5UWE5Gb250TWVudU9iamVjdCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRYTkZvbnRNZW51T2JqZWN0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVFhORm9udE1lbnVPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVFhORm9udE1lbnVPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRYTkZvbnRNZW51T2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUWE5Gb250TWVudU9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUWE5Gb250TWVudU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUWE5Gb250TWVudU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUWE5Gb250TWVudU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVFhORm9udE1lbnVPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVFhORm9udE1lbnVPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUWE5Gb250TWVudU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRYTkZvbnRNZW51T2JqZWN0IC0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTE0NTgsMTY4ICsxNDU4LDE2OCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOTmV3T2JqZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTU3BlYyAqIGlGaWxlU3BlYzsKLQlXaW5kb3dQdHIgaVdpbmRvdzsKLQlSZWN0IGlGcmFtZTsKLQlUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9uczsKLQlUWE5GcmFtZVR5cGUgaUZyYW1lVHlwZTsKLQlUWE5GaWxlVHlwZSBpRmlsZVR5cGU7Ci0JVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2Rpbmc7Ci0JVFhOT2JqZWN0IG9UWE5PYmplY3Q7Ci0JVFhORnJhbWVJRCBvVFhORnJhbWVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1NwZWMgKiBpRmlsZVNwZWM7CisgICAgV2luZG93UHRyIGlXaW5kb3c7CisgICAgUmVjdCBpRnJhbWU7CisgICAgVFhORnJhbWVPcHRpb25zIGlGcmFtZU9wdGlvbnM7CisgICAgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGU7CisgICAgVFhORmlsZVR5cGUgaUZpbGVUeXBlOworICAgIFRYTlBlcm1hbmVudFRleHRFbmNvZGluZ1R5cGUgaVBlcm1hbmVudEVuY29kaW5nOworICAgIFRYTk9iamVjdCBvVFhOT2JqZWN0OworICAgIFRYTkZyYW1lSUQgb1RYTkZyYW1lSUQ7CiAjaWZuZGVmIFRYTk5ld09iamVjdAotCVB5TWFjX1BSRUNIRUNLKFRYTk5ld09iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOTmV3T2JqZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0RlNTcGVjUHRyX0NvbnZlcnQsICZpRmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmlGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlGcmFtZU9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpRnJhbWVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpUGVybWFuZW50RW5jb2RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOTmV3T2JqZWN0KGlGaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgIGlXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAmaUZyYW1lLAotCSAgICAgICAgICAgICAgICAgICAgaUZyYW1lT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgIGlGcmFtZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBpRmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICBpUGVybWFuZW50RW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAmb1RYTk9iamVjdCwKLQkgICAgICAgICAgICAgICAgICAgICZvVFhORnJhbWVJRCwKLQkgICAgICAgICAgICAgICAgICAgIChUWE5PYmplY3RSZWZjb24pMCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBUWE5PYmpfTmV3LCBvVFhOT2JqZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIG9UWE5GcmFtZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsbE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdEZTU3BlY1B0cl9Db252ZXJ0LCAmaUZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmlXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpRnJhbWVPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaUZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaVBlcm1hbmVudEVuY29kaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRYTk5ld09iamVjdChpRmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBpV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgJmlGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlGcmFtZU9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBpRnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaUZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaVBlcm1hbmVudEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgJm9UWE5PYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAmb1RYTkZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAoVFhOT2JqZWN0UmVmY29uKTApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFhOT2JqX05ldywgb1RYTk9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvVFhORnJhbWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRYTlRlcm1pbmF0ZVRleHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIFRYTklzU2NyYXBQYXN0YWJsZQotCVB5TWFjX1BSRUNIRUNLKFRYTklzU2NyYXBQYXN0YWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOSXNTY3JhcFBhc3RhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUWE5Jc1NjcmFwUGFzdGFibGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVFhOSXNTY3JhcFBhc3RhYmxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5Db252ZXJ0VG9QdWJsaWNTY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgVFhOQ29udmVydFRvUHVibGljU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOQ29udmVydFRvUHVibGljU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ29udmVydFRvUHVibGljU2NyYXAoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNbHRlX1RYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFRYTkNvbnZlcnRGcm9tUHVibGljU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOTmV3Rm9udE1lbnVPYmplY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGU7Ci0JU0ludDE2IGlNZW51SUQ7Ci0JU0ludDE2IGlTdGFydEhpZXJNZW51SUQ7Ci0JVFhORm9udE1lbnVPYmplY3Qgb1RYTkZvbnRNZW51T2JqZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgaUZvbnRNZW51SGFuZGxlOworICAgIFNJbnQxNiBpTWVudUlEOworICAgIFNJbnQxNiBpU3RhcnRIaWVyTWVudUlEOworICAgIFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdDsKICNpZm5kZWYgVFhOTmV3Rm9udE1lbnVPYmplY3QKLQlQeU1hY19QUkVDSEVDSyhUWE5OZXdGb250TWVudU9iamVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOTmV3Rm9udE1lbnVPYmplY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJmlGb250TWVudUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlNZW51SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnRIaWVyTWVudUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRYTk5ld0ZvbnRNZW51T2JqZWN0KGlGb250TWVudUhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0SGllck1lbnVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9UWE5Gb250TWVudU9iamVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRYTkZvbnRNZW51T2JqX05ldywgb1RYTkZvbnRNZW51T2JqZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVudU9ial9Db252ZXJ0LCAmaUZvbnRNZW51SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaU1lbnVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydEhpZXJNZW51SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOTmV3Rm9udE1lbnVPYmplY3QoaUZvbnRNZW51SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnRIaWVyTWVudUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb1RYTkZvbnRNZW51T2JqZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVFhORm9udE1lbnVPYmpfTmV3LCBvVFhORm9udE1lbnVPYmplY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1sdGVfVFhOVmVyc2lvbkluZm9ybWF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUWE5WZXJzaW9uVmFsdWUgX3J2OwotCVRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRYTlZlcnNpb25WYWx1ZSBfcnY7CisgICAgVFhORmVhdHVyZUJpdHMgb0ZlYXR1cmVGbGFnczsKICNpZm5kZWYgVFhOVmVyc2lvbkluZm9ybWF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soVFhOVmVyc2lvbkluZm9ybWF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUWE5WZXJzaW9uSW5mb3JtYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRYTlZlcnNpb25JbmZvcm1hdGlvbigmb0ZlYXR1cmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb0ZlYXR1cmVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRYTlZlcnNpb25JbmZvcm1hdGlvbigmb0ZlYXR1cmVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb0ZlYXR1cmVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JT1NTdGF0dXMgX2VycjsKLQlUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbiAqIGlEZWZhdWx0Rm9udHMgPSBOVUxMOwotCUl0ZW1Db3VudCBpQ291bnREZWZhdWx0Rm9udHMgPSAwOwotCVRYTkluaXRPcHRpb25zIGlVc2FnZUZsYWdzOwotCVB5TWFjX1BSRUNIRUNLKFRYTkluaXRUZXh0ZW5zaW9uKTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwgJmlVc2FnZUZsYWdzKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCV9lcnIgPSBUWE5Jbml0VGV4dGVuc2lvbihpRGVmYXVsdEZvbnRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnREZWZhdWx0Rm9udHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlVc2FnZUZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFRYTk1hY09TUHJlZmVycmVkRm9udERlc2NyaXB0aW9uICogaURlZmF1bHRGb250cyA9IE5VTEw7CisgICAgSXRlbUNvdW50IGlDb3VudERlZmF1bHRGb250cyA9IDA7CisgICAgVFhOSW5pdE9wdGlvbnMgaVVzYWdlRmxhZ3M7CisgICAgUHlNYWNfUFJFQ0hFQ0soVFhOSW5pdFRleHRlbnNpb24pOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLCAmaVVzYWdlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVFhOSW5pdFRleHRlbnNpb24oaURlZmF1bHRGb250cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvdW50RGVmYXVsdEZvbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVXNhZ2VGbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIApAQCAtMTYyNywyNCArMTYyNywyNCBAQAogCiBzdGF0aWMgUHlNZXRob2REZWYgTWx0ZV9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJUWE5OZXdPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdPYmplY3QsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyAqIGlGaWxlU3BlYywgV2luZG93UHRyIGlXaW5kb3csIFJlY3QgaUZyYW1lLCBUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9ucywgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGUsIFRYTkZpbGVUeXBlIGlGaWxlVHlwZSwgVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2RpbmcpIC0+IChUWE5PYmplY3Qgb1RYTk9iamVjdCwgVFhORnJhbWVJRCBvVFhORnJhbWVJRCkiKX0sCi0JeyJUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOVGVybWluYXRlVGV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOSXNTY3JhcFBhc3RhYmxlIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCIsIChQeUNGdW5jdGlvbilNbHRlX1RYTkNvbnZlcnRUb1B1YmxpY1NjcmFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVFhOTmV3Rm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdGb250TWVudU9iamVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGUsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaVN0YXJ0SGllck1lbnVJRCkgLT4gKFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdCkiKX0sCi0JeyJUWE5WZXJzaW9uSW5mb3JtYXRpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5WZXJzaW9uSW5mb3JtYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRYTlZlcnNpb25WYWx1ZSBfcnYsIFRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3MpIil9LAotCXsiVFhOSW5pdFRleHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVFhOSW5pdE9wdGlvbnMpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5OZXdPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdPYmplY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyAqIGlGaWxlU3BlYywgV2luZG93UHRyIGlXaW5kb3csIFJlY3QgaUZyYW1lLCBUWE5GcmFtZU9wdGlvbnMgaUZyYW1lT3B0aW9ucywgVFhORnJhbWVUeXBlIGlGcmFtZVR5cGUsIFRYTkZpbGVUeXBlIGlGaWxlVHlwZSwgVFhOUGVybWFuZW50VGV4dEVuY29kaW5nVHlwZSBpUGVybWFuZW50RW5jb2RpbmcpIC0+IChUWE5PYmplY3Qgb1RYTk9iamVjdCwgVFhORnJhbWVJRCBvVFhORnJhbWVJRCkiKX0sCisgICAgeyJUWE5UZXJtaW5hdGVUZXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOVGVybWluYXRlVGV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOSXNTY3JhcFBhc3RhYmxlIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOSXNTY3JhcFBhc3RhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJUWE5Db252ZXJ0VG9QdWJsaWNTY3JhcCIsIChQeUNGdW5jdGlvbilNbHRlX1RYTkNvbnZlcnRUb1B1YmxpY1NjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJUWE5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKU1sdGVfVFhOQ29udmVydEZyb21QdWJsaWNTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVFhOTmV3Rm9udE1lbnVPYmplY3QiLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5OZXdGb250TWVudU9iamVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBpRm9udE1lbnVIYW5kbGUsIFNJbnQxNiBpTWVudUlELCBTSW50MTYgaVN0YXJ0SGllck1lbnVJRCkgLT4gKFRYTkZvbnRNZW51T2JqZWN0IG9UWE5Gb250TWVudU9iamVjdCkiKX0sCisgICAgeyJUWE5WZXJzaW9uSW5mb3JtYXRpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5WZXJzaW9uSW5mb3JtYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRYTlZlcnNpb25WYWx1ZSBfcnYsIFRYTkZlYXR1cmVCaXRzIG9GZWF0dXJlRmxhZ3MpIil9LAorICAgIHsiVFhOSW5pdFRleHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pTWx0ZV9UWE5Jbml0VGV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVFhOSW5pdE9wdGlvbnMpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTY1MiwzNyArMTY1MiwzNyBAQAogCiB2b2lkIGluaXRfTWx0ZSh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCS8vICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoeHh4eCk7CisgICAgLy8gICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyh4eHh4KTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX01sdGUiLCBNbHRlX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfTWx0ZSIsIE1sdGVfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JTWx0ZV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKE1sdGVfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBNbHRlX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JVFhOT2JqZWN0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUWE5PYmplY3RfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZUWE5PYmplY3RfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUWE5PYmplY3QiLCAoUHlPYmplY3QgKikmVFhOT2JqZWN0X1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVFhOT2JqZWN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhOT2JqZWN0VHlwZSIsIChQeU9iamVjdCAqKSZUWE5PYmplY3RfVHlwZSk7Ci0JVFhORm9udE1lbnVPYmplY3RfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUWE5Gb250TWVudU9iamVjdCIsIChQeU9iamVjdCAqKSZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhORm9udE1lbnVPYmplY3RUeXBlIiwgKFB5T2JqZWN0ICopJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIE1sdGVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChNbHRlX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgTWx0ZV9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFRYTk9iamVjdF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVFhOT2JqZWN0X1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVFhOT2JqZWN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhOT2JqZWN0IiwgKFB5T2JqZWN0ICopJlRYTk9iamVjdF9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRYTk9iamVjdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTk9iamVjdFR5cGUiLCAoUHlPYmplY3QgKikmVFhOT2JqZWN0X1R5cGUpOworICAgIFRYTkZvbnRNZW51T2JqZWN0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZUWE5Gb250TWVudU9iamVjdF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlRYTkZvbnRNZW51T2JqZWN0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVFhORm9udE1lbnVPYmplY3QiLCAoUHlPYmplY3QgKikmVFhORm9udE1lbnVPYmplY3RfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRYTkZvbnRNZW51T2JqZWN0VHlwZSIsIChQeU9iamVjdCAqKSZUWE5Gb250TWVudU9iamVjdF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9vc2EvX09TQW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvb3NhL19PU0Ftb2R1bGUuYwppbmRleCBhYjMwMzIwLi4xMGRkMGZmIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9vc2EvX09TQW1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL29zYS9fT1NBbW9kdWxlLmMKQEAgLTksOSArOSw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zNyw3NTMgKzM3LDc1MyBAQAogI2RlZmluZSBPU0FPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JQ29tcG9uZW50SW5zdGFuY2Ugb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBDb21wb25lbnRJbnN0YW5jZSBvYl9pdHNlbGY7CiB9IE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0OwogCiBQeU9iamVjdCAqT1NBT2JqX05ldyhDb21wb25lbnRJbnN0YW5jZSBpdHNlbGYpCiB7Ci0JT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE9TQV9FcnJvciwiTlVMTCBDb21wb25lbnRJbnN0YW5jZSIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0LCAmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPU0FfRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCwgJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IE9TQU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb21wb25lbnRJbnN0YW5jZSAqcF9pdHNlbGYpCiB7CiAKLQkgICAgICAgICAgICAgICAgaWYgKENtcEluc3RPYmpfQ29udmVydCh2LCBwX2l0c2VsZikpCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0JICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0JICAgICAgICAgICAgICAgIAotCWlmICghT1NBT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk9TQUNvbXBvbmVudEluc3RhbmNlIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDbXBJbnN0T2JqX0NvbnZlcnQodiwgcF9pdHNlbGYpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisKKyAgICBpZiAoIU9TQU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJPU0FDb21wb25lbnRJbnN0YW5jZSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIE9TQU9ial9kZWFsbG9jKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTG9hZChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2Mgc2NyaXB0RGF0YTsKLQlsb25nIG1vZGVGbGFnczsKLQlPU0FJRCByZXN1bHRpbmdTY3JpcHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBRURlc2Mgc2NyaXB0RGF0YTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBPU0FJRCByZXN1bHRpbmdTY3JpcHRJRDsKICNpZm5kZWYgT1NBTG9hZAotCVB5TWFjX1BSRUNIRUNLKE9TQUxvYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUxvYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUxvYWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKLQkgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUxvYWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVN0b3JlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIHNjcmlwdElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCWxvbmcgbW9kZUZsYWdzOwotCUFFRGVzYyByZXN1bHRpbmdTY3JpcHREYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIHNjcmlwdElEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIEFFRGVzYyByZXN1bHRpbmdTY3JpcHREYXRhOwogI2lmbmRlZiBPU0FTdG9yZQotCVB5TWFjX1BSRUNIRUNLKE9TQVN0b3JlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTdG9yZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdG9yZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdERhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nU2NyaXB0RGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU3RvcmUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHREYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdERhdGEpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FFeGVjdXRlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIGNvbXBpbGVkU2NyaXB0SUQ7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgY29tcGlsZWRTY3JpcHRJRDsKKyAgICBPU0FJRCBjb250ZXh0SUQ7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRDsKICNpZm5kZWYgT1NBRXhlY3V0ZQotCVB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQURpc3BsYXkoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0VmFsdWVJRDsKLQlEZXNjVHlwZSBkZXNpcmVkVHlwZTsKLQlsb25nIG1vZGVGbGFnczsKLQlBRURlc2MgcmVzdWx0aW5nVGV4dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRWYWx1ZUlEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIEFFRGVzYyByZXN1bHRpbmdUZXh0OwogI2lmbmRlZiBPU0FEaXNwbGF5Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBRGlzcGxheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRGlzcGxheSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFZhbHVlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQURpc3BsYXkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBzY3JpcHRWYWx1ZUlELAotCSAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFZhbHVlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQURpc3BsYXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRWYWx1ZUlELAorICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU2NyaXB0RXJyb3IoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFRGVzYyByZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBBRURlc2MgcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbjsKICNpZm5kZWYgT1NBU2NyaXB0RXJyb3IKLQlQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2NyaXB0RXJyb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTY3JpcHRFcnJvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2NyaXB0RXJyb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdFcnJvckRlc2NyaXB0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRGlzcG9zZShPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKICNpZm5kZWYgT1NBRGlzcG9zZQotCVB5TWFjX1BSRUNIRUNLKE9TQURpc3Bvc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQURpc3Bvc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEaXNwb3NlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRGlzcG9zZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU2V0U2NyaXB0SW5mbyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0JbG9uZyB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKKyAgICBPU1R5cGUgc2VsZWN0b3I7CisgICAgbG9uZyB2YWx1ZTsKICNpZm5kZWYgT1NBU2V0U2NyaXB0SW5mbwotCVB5TWFjX1BSRUNIRUNLKE9TQVNldFNjcmlwdEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQVNldFNjcmlwdEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTZXRTY3JpcHRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2V0U2NyaXB0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBR2V0U2NyaXB0SW5mbyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBzY3JpcHRJRDsKLQlPU1R5cGUgc2VsZWN0b3I7Ci0JbG9uZyByZXN1bHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgT1NBSUQgc2NyaXB0SUQ7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIGxvbmcgcmVzdWx0OwogI2lmbmRlZiBPU0FHZXRTY3JpcHRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soT1NBR2V0U2NyaXB0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBR2V0U2NyaXB0SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldFNjcmlwdEluZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZWN0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0U2NyaXB0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWU7CiAjaWZuZGVmIE9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUKLQlQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FDb21waWxlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzb3VyY2VEYXRhOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNvdXJjZURhdGE7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgT1NBSUQgcHJldmlvdXNBbmRSZXN1bHRpbmdTY3JpcHRJRDsKICNpZm5kZWYgT1NBQ29tcGlsZQotCVB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzb3VyY2VEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUNvbXBpbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKLQkgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgJnByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb21waWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICZwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0FuZFJlc3VsdGluZ1NjcmlwdElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBQ29weUlEKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIGZyb21JRDsKLQlPU0FJRCB0b0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGZyb21JRDsKKyAgICBPU0FJRCB0b0lEOwogI2lmbmRlZiBPU0FDb3B5SUQKLQlQeU1hY19QUkVDSEVDSyhPU0FDb3B5SUQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvcHlJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyb21JRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FDb3B5SUQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGZyb21JRCwKLQkgICAgICAgICAgICAgICAgICZ0b0lEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICB0b0lEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb21JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb3B5SUQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGZyb21JRCwKKyAgICAgICAgICAgICAgICAgICAgICZ0b0lEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b0lEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBR2V0U291cmNlKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCU9TQUlEIHNjcmlwdElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCUFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIHNjcmlwdElEOworICAgIERlc2NUeXBlIGRlc2lyZWRUeXBlOworICAgIEFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhOwogI2lmbmRlZiBPU0FHZXRTb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhPU0FHZXRTb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUdldFNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldFNvdXJjZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgc2NyaXB0SUQsCi0JICAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTb3VyY2VEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1NvdXJjZURhdGEpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0U291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NvdXJjZURhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nU291cmNlRGF0YSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUNvZXJjZUZyb21EZXNjKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyBzY3JpcHREYXRhOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzY3JpcHREYXRhOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdElEOwogI2lmbmRlZiBPU0FDb2VyY2VGcm9tRGVzYwotCVB5TWFjX1BSRUNIRUNLKE9TQUNvZXJjZUZyb21EZXNjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FDb2VyY2VGcm9tRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQ29lcmNlRnJvbURlc2MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ1NjcmlwdElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUNvZXJjZUZyb21EZXNjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0SUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FDb2VyY2VUb0Rlc2MoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgc2NyaXB0SUQ7Ci0JRGVzY1R5cGUgZGVzaXJlZFR5cGU7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JQUVEZXNjIHJlc3VsdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBPU0FJRCBzY3JpcHRJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBBRURlc2MgcmVzdWx0OwogI2lmbmRlZiBPU0FDb2VyY2VUb0Rlc2MKLQlQeU1hY19QUkVDSEVDSyhPU0FDb2VyY2VUb0Rlc2MpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvZXJjZVRvRGVzYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FDb2VyY2VUb0Rlc2MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdElELAotCSAgICAgICAgICAgICAgICAgICAgICAgZGVzaXJlZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGVzaXJlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBQ29lcmNlVG9EZXNjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FTZXREZWZhdWx0VGFyZ2V0KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFQWRkcmVzc0Rlc2MgdGFyZ2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFQWRkcmVzc0Rlc2MgdGFyZ2V0OwogI2lmbmRlZiBPU0FTZXREZWZhdWx0VGFyZ2V0Ci0JUHlNYWNfUFJFQ0hFQ0soT1NBU2V0RGVmYXVsdFRhcmdldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2V0RGVmYXVsdFRhcmdldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQVNldERlZmF1bHRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGFyZ2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVNldERlZmF1bHRUYXJnZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU3RhcnRSZWNvcmRpbmcoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JT1NBSUQgY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRDsKICNpZm5kZWYgT1NBU3RhcnRSZWNvcmRpbmcKLQlQeU1hY19QUkVDSEVDSyhPU0FTdGFydFJlY29yZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU3RhcnRSZWNvcmRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdGFydFJlY29yZGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBU3RhcnRSZWNvcmRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHRUb01vZGlmeUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBU3RvcFJlY29yZGluZyhPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlPU0FJRCBjb21waWxlZFNjcmlwdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIE9TQUlEIGNvbXBpbGVkU2NyaXB0SUQ7CiAjaWZuZGVmIE9TQVN0b3BSZWNvcmRpbmcKLQlQeU1hY19QUkVDSEVDSyhPU0FTdG9wUmVjb3JkaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FTdG9wUmVjb3JkaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcGlsZWRTY3JpcHRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTdG9wUmVjb3JkaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHRJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21waWxlZFNjcmlwdElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQVN0b3BSZWNvcmRpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFNjcmlwdElEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTG9hZEV4ZWN1dGUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNjcmlwdERhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNjcmlwdERhdGE7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUxvYWRFeGVjdXRlCi0JUHlNYWNfUFJFQ0hFQ0soT1NBTG9hZEV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUxvYWRFeGVjdXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBTG9hZEV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdERhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FMb2FkRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBQ29tcGlsZUV4ZWN1dGUoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNvdXJjZURhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCWxvbmcgbW9kZUZsYWdzOwotCU9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHNvdXJjZURhdGE7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUNvbXBpbGVFeGVjdXRlCi0JUHlNYWNfUFJFQ0hFQ0soT1NBQ29tcGlsZUV4ZWN1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQUNvbXBpbGVFeGVjdXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNvdXJjZURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQ29tcGlsZUV4ZWN1dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZURhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FDb21waWxlRXhlY3V0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRG9TY3JpcHQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIHNvdXJjZURhdGE7Ci0JT1NBSUQgY29udGV4dElEOwotCURlc2NUeXBlIGRlc2lyZWRUeXBlOwotCWxvbmcgbW9kZUZsYWdzOwotCUFFRGVzYyByZXN1bHRpbmdUZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBzb3VyY2VEYXRhOworICAgIE9TQUlEIGNvbnRleHRJRDsKKyAgICBEZXNjVHlwZSBkZXNpcmVkVHlwZTsKKyAgICBsb25nIG1vZGVGbGFnczsKKyAgICBBRURlc2MgcmVzdWx0aW5nVGV4dDsKICNpZm5kZWYgT1NBRG9TY3JpcHQKLQlQeU1hY19QUkVDSEVDSyhPU0FEb1NjcmlwdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRG9TY3JpcHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZzb3VyY2VEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEb1NjcmlwdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmc291cmNlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgICBkZXNpcmVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgbW9kZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nVGV4dCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdUZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnNvdXJjZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQURvU2NyaXB0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdUZXh0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ1RleHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk9TQU9ial9PU0FTZXRDdXJyZW50RGlhbGVjdChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlzaG9ydCBkaWFsZWN0Q29kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBzaG9ydCBkaWFsZWN0Q29kZTsKICNpZm5kZWYgT1NBU2V0Q3VycmVudERpYWxlY3QKLQlQeU1hY19QUkVDSEVDSyhPU0FTZXRDdXJyZW50RGlhbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBU2V0Q3VycmVudERpYWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0Q29kZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FTZXRDdXJyZW50RGlhbGVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaWFsZWN0Q29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FTZXRDdXJyZW50RGlhbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUdldEN1cnJlbnREaWFsZWN0KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCXNob3J0IHJlc3VsdGluZ0RpYWxlY3RDb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIHNob3J0IHJlc3VsdGluZ0RpYWxlY3RDb2RlOwogI2lmbmRlZiBPU0FHZXRDdXJyZW50RGlhbGVjdAotCVB5TWFjX1BSRUNIRUNLKE9TQUdldEN1cnJlbnREaWFsZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPU0FHZXRDdXJyZW50RGlhbGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE9TQUdldEN1cnJlbnREaWFsZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0Q29kZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nRGlhbGVjdENvZGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBR2V0Q3VycmVudERpYWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0RpYWxlY3RDb2RlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdEaWFsZWN0Q29kZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RzKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdDsKICNpZm5kZWYgT1NBQXZhaWxhYmxlRGlhbGVjdHMKLQlQeU1hY19QUkVDSEVDSyhPU0FBdmFpbGFibGVEaWFsZWN0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBQXZhaWxhYmxlRGlhbGVjdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RJbmZvTGlzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUdldERpYWxlY3RJbmZvKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCXNob3J0IGRpYWxlY3RDb2RlOwotCU9TVHlwZSBzZWxlY3RvcjsKLQlBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TQUVycm9yIF9lcnI7CisgICAgc2hvcnQgZGlhbGVjdENvZGU7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mbzsKICNpZm5kZWYgT1NBR2V0RGlhbGVjdEluZm8KLQlQeU1hY19QUkVDSEVDSyhPU0FHZXREaWFsZWN0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBR2V0RGlhbGVjdEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpYWxlY3RDb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FHZXREaWFsZWN0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpYWxlY3RDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FHZXREaWFsZWN0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsZWN0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19OZXcsICZyZXN1bHRpbmdEaWFsZWN0SW5mbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdChPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NBRXJyb3IgX2VycjsKLQlBRURlc2MgcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0Q29kZUxpc3Q7CiAjaWZuZGVmIE9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdAotCVB5TWFjX1BSRUNIRUNLKE9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdEaWFsZWN0Q29kZUxpc3QpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBRXhlY3V0ZUV2ZW50KE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0FFcnJvciBfZXJyOwotCUFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudDsKLQlPU0FJRCBjb250ZXh0SUQ7Ci0JbG9uZyBtb2RlRmxhZ3M7Ci0JT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NBRXJyb3IgX2VycjsKKyAgICBBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQ7CisgICAgT1NBSUQgY29udGV4dElEOworICAgIGxvbmcgbW9kZUZsYWdzOworICAgIE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQ7CiAjaWZuZGVmIE9TQUV4ZWN1dGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKE9TQUV4ZWN1dGVFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBRXhlY3V0ZUV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFwcGxlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBRXhlY3V0ZUV2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmdGhlQXBwbGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZ0aGVBcHBsZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQUV4ZWN1dGVFdmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUFwcGxlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqT1NBT2JqX09TQURvRXZlbnQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50OwotCU9TQUlEIGNvbnRleHRJRDsKLQlsb25nIG1vZGVGbGFnczsKLQlBcHBsZUV2ZW50IHJlcGx5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudDsKKyAgICBPU0FJRCBjb250ZXh0SUQ7CisgICAgbG9uZyBtb2RlRmxhZ3M7CisgICAgQXBwbGVFdmVudCByZXBseTsKICNpZm5kZWYgT1NBRG9FdmVudAotCVB5TWFjX1BSRUNIRUNLKE9TQURvRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE9TQURvRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmdGhlQXBwbGVFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPU0FEb0V2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgJnRoZUFwcGxlRXZlbnQsCi0JICAgICAgICAgICAgICAgICAgY29udGV4dElELAotCSAgICAgICAgICAgICAgICAgIG1vZGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBBRURlc2NfTmV3LCAmcmVwbHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBRURlc2NfQ29udmVydCwgJnRoZUFwcGxlRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gT1NBRG9FdmVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICZ0aGVBcHBsZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICBtb2RlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX05ldywgJnJlcGx5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfT1NBTWFrZUNvbnRleHQoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TQUVycm9yIF9lcnI7Ci0JQUVEZXNjIGNvbnRleHROYW1lOwotCU9TQUlEIHBhcmVudENvbnRleHQ7Ci0JT1NBSUQgcmVzdWx0aW5nQ29udGV4dElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0FFcnJvciBfZXJyOworICAgIEFFRGVzYyBjb250ZXh0TmFtZTsKKyAgICBPU0FJRCBwYXJlbnRDb250ZXh0OworICAgIE9TQUlEIHJlc3VsdGluZ0NvbnRleHRJRDsKICNpZm5kZWYgT1NBTWFrZUNvbnRleHQKLQlQeU1hY19QUkVDSEVDSyhPU0FNYWtlQ29udGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT1NBTWFrZUNvbnRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQUVEZXNjX0NvbnZlcnQsICZjb250ZXh0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmVudENvbnRleHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT1NBTWFrZUNvbnRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0aW5nQ29udGV4dElEKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXN1bHRpbmdDb250ZXh0SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFFRGVzY19Db252ZXJ0LCAmY29udGV4dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJlbnRDb250ZXh0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE9TQU1ha2VDb250ZXh0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZXh0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdGluZ0NvbnRleHRJRCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nQ29udGV4dElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE9TQU9ial9tZXRob2RzW10gPSB7Ci0JeyJPU0FMb2FkIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FMb2FkLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FTdG9yZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RvcmUsIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nU2NyaXB0RGF0YSkiKX0sCi0JeyJPU0FFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBjb21waWxlZFNjcmlwdElELCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCi0JeyJPU0FEaXNwbGF5IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEaXNwbGF5LCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRWYWx1ZUlELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nVGV4dCkiKX0sCi0JeyJPU0FTY3JpcHRFcnJvciIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2NyaXB0RXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3RvciwgRGVzY1R5cGUgZGVzaXJlZFR5cGUpIC0+IChBRURlc2MgcmVzdWx0aW5nRXJyb3JEZXNjcmlwdGlvbikiKX0sCi0JeyJPU0FEaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEaXNwb3NlLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCkgLT4gTm9uZSIpfSwKLQl7Ik9TQVNldFNjcmlwdEluZm8iLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldFNjcmlwdEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBPU1R5cGUgc2VsZWN0b3IsIGxvbmcgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJPU0FHZXRTY3JpcHRJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRTY3JpcHRJbmZvLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgT1NUeXBlIHNlbGVjdG9yKSAtPiAobG9uZyByZXN1bHQpIil9LAotCXsiT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2NyaXB0aW5nQ29tcG9uZW50TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NjcmlwdGluZ0NvbXBvbmVudE5hbWUpIil9LAotCXsiT1NBQ29tcGlsZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQ29tcGlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcHJldmlvdXNBbmRSZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FDb3B5SUQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvcHlJRCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgZnJvbUlEKSAtPiAoT1NBSUQgdG9JRCkiKX0sCi0JeyJPU0FHZXRTb3VyY2UiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldFNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NvdXJjZURhdGEpIil9LAotCXsiT1NBQ29lcmNlRnJvbURlc2MiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvZXJjZUZyb21EZXNjLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRJRCkiKX0sCi0JeyJPU0FDb2VyY2VUb0Rlc2MiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvZXJjZVRvRGVzYywgMSwKLQkgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIERlc2NUeXBlIGRlc2lyZWRUeXBlLCBsb25nIG1vZGVGbGFncykgLT4gKEFFRGVzYyByZXN1bHQpIil9LAotCXsiT1NBU2V0RGVmYXVsdFRhcmdldCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2V0RGVmYXVsdFRhcmdldCwgMSwKLQkgUHlEb2NfU1RSKCIoQUVBZGRyZXNzRGVzYyB0YXJnZXQpIC0+IE5vbmUiKX0sCi0JeyJPU0FTdGFydFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RhcnRSZWNvcmRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE9TQUlEIGNvbXBpbGVkU2NyaXB0VG9Nb2RpZnlJRCkiKX0sCi0JeyJPU0FTdG9wUmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTdG9wUmVjb3JkaW5nLCAxLAotCSBQeURvY19TVFIoIihPU0FJRCBjb21waWxlZFNjcmlwdElEKSAtPiBOb25lIil9LAotCXsiT1NBTG9hZEV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUxvYWRFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc2NyaXB0RGF0YSwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAotCXsiT1NBQ29tcGlsZUV4ZWN1dGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvbXBpbGVFeGVjdXRlLCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc291cmNlRGF0YSwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAotCXsiT1NBRG9TY3JpcHQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQURvU2NyaXB0LCAxLAotCSBQeURvY19TVFIoIihBRURlc2Mgc291cmNlRGF0YSwgT1NBSUQgY29udGV4dElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0aW5nVGV4dCkiKX0sCi0JeyJPU0FTZXRDdXJyZW50RGlhbGVjdCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU2V0Q3VycmVudERpYWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRpYWxlY3RDb2RlKSAtPiBOb25lIil9LAotCXsiT1NBR2V0Q3VycmVudERpYWxlY3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldEN1cnJlbnREaWFsZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCByZXN1bHRpbmdEaWFsZWN0Q29kZSkiKX0sCi0JeyJPU0FBdmFpbGFibGVEaWFsZWN0cyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQXZhaWxhYmxlRGlhbGVjdHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mb0xpc3QpIil9LAotCXsiT1NBR2V0RGlhbGVjdEluZm8iLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUdldERpYWxlY3RJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaWFsZWN0Q29kZSwgT1NUeXBlIHNlbGVjdG9yKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RJbmZvKSIpfSwKLQl7Ik9TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBQXZhaWxhYmxlRGlhbGVjdENvZGVMaXN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0aW5nRGlhbGVjdENvZGVMaXN0KSIpfSwKLQl7Ik9TQUV4ZWN1dGVFdmVudCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRXhlY3V0ZUV2ZW50LCAxLAotCSBQeURvY19TVFIoIihBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKLQl7Ik9TQURvRXZlbnQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQURvRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKEFwcGxlRXZlbnQgdGhlQXBwbGVFdmVudCwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKEFwcGxlRXZlbnQgcmVwbHkpIil9LAotCXsiT1NBTWFrZUNvbnRleHQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQU1ha2VDb250ZXh0LCAxLAotCSBQeURvY19TVFIoIihBRURlc2MgY29udGV4dE5hbWUsIE9TQUlEIHBhcmVudENvbnRleHQpIC0+IChPU0FJRCByZXN1bHRpbmdDb250ZXh0SUQpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiT1NBTG9hZCIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBTG9hZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBU3RvcmUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0b3JlLCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1NjcmlwdERhdGEpIil9LAorICAgIHsiT1NBRXhlY3V0ZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgY29tcGlsZWRTY3JpcHRJRCwgT1NBSUQgY29udGV4dElELCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHJlc3VsdGluZ1NjcmlwdFZhbHVlSUQpIil9LAorICAgIHsiT1NBRGlzcGxheSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRGlzcGxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0VmFsdWVJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1RleHQpIil9LAorICAgIHsiT1NBU2NyaXB0RXJyb3IiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNjcmlwdEVycm9yLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgc2VsZWN0b3IsIERlc2NUeXBlIGRlc2lyZWRUeXBlKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0Vycm9yRGVzY3JpcHRpb24pIil9LAorICAgIHsiT1NBRGlzcG9zZSIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBRGlzcG9zZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQpIC0+IE5vbmUiKX0sCisgICAgeyJPU0FTZXRTY3JpcHRJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FTZXRTY3JpcHRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihPU0FJRCBzY3JpcHRJRCwgT1NUeXBlIHNlbGVjdG9yLCBsb25nIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiT1NBR2V0U2NyaXB0SW5mbyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBR2V0U2NyaXB0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgc2NyaXB0SUQsIE9TVHlwZSBzZWxlY3RvcikgLT4gKGxvbmcgcmVzdWx0KSIpfSwKKyAgICB7Ik9TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNjcmlwdGluZ0NvbXBvbmVudE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEFFRGVzYyByZXN1bHRpbmdTY3JpcHRpbmdDb21wb25lbnROYW1lKSIpfSwKKyAgICB7Ik9TQUNvbXBpbGUiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUNvbXBpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFRGVzYyBzb3VyY2VEYXRhLCBsb25nIG1vZGVGbGFncykgLT4gKE9TQUlEIHByZXZpb3VzQW5kUmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBQ29weUlEIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb3B5SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIGZyb21JRCkgLT4gKE9TQUlEIHRvSUQpIil9LAorICAgIHsiT1NBR2V0U291cmNlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRTb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSkgLT4gKEFFRGVzYyByZXN1bHRpbmdTb3VyY2VEYXRhKSIpfSwKKyAgICB7Ik9TQUNvZXJjZUZyb21EZXNjIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb2VyY2VGcm9tRGVzYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0SUQpIil9LAorICAgIHsiT1NBQ29lcmNlVG9EZXNjIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb2VyY2VUb0Rlc2MsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TQUlEIHNjcmlwdElELCBEZXNjVHlwZSBkZXNpcmVkVHlwZSwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBRURlc2MgcmVzdWx0KSIpfSwKKyAgICB7Ik9TQVNldERlZmF1bHRUYXJnZXQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldERlZmF1bHRUYXJnZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEFFQWRkcmVzc0Rlc2MgdGFyZ2V0KSAtPiBOb25lIil9LAorICAgIHsiT1NBU3RhcnRSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVN0YXJ0UmVjb3JkaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChPU0FJRCBjb21waWxlZFNjcmlwdFRvTW9kaWZ5SUQpIil9LAorICAgIHsiT1NBU3RvcFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilPU0FPYmpfT1NBU3RvcFJlY29yZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NBSUQgY29tcGlsZWRTY3JpcHRJRCkgLT4gTm9uZSIpfSwKKyAgICB7Ik9TQUxvYWRFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FMb2FkRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNjcmlwdERhdGEsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKKyAgICB7Ik9TQUNvbXBpbGVFeGVjdXRlIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FDb21waWxlRXhlY3V0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChPU0FJRCByZXN1bHRpbmdTY3JpcHRWYWx1ZUlEKSIpfSwKKyAgICB7Ik9TQURvU2NyaXB0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEb1NjcmlwdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIHNvdXJjZURhdGEsIE9TQUlEIGNvbnRleHRJRCwgRGVzY1R5cGUgZGVzaXJlZFR5cGUsIGxvbmcgbW9kZUZsYWdzKSAtPiAoQUVEZXNjIHJlc3VsdGluZ1RleHQpIil9LAorICAgIHsiT1NBU2V0Q3VycmVudERpYWxlY3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQVNldEN1cnJlbnREaWFsZWN0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaWFsZWN0Q29kZSkgLT4gTm9uZSIpfSwKKyAgICB7Ik9TQUdldEN1cnJlbnREaWFsZWN0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXRDdXJyZW50RGlhbGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgcmVzdWx0aW5nRGlhbGVjdENvZGUpIil9LAorICAgIHsiT1NBQXZhaWxhYmxlRGlhbGVjdHMiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChBRURlc2MgcmVzdWx0aW5nRGlhbGVjdEluZm9MaXN0KSIpfSwKKyAgICB7Ik9TQUdldERpYWxlY3RJbmZvIiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FHZXREaWFsZWN0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGlhbGVjdENvZGUsIE9TVHlwZSBzZWxlY3RvcikgLT4gKEFFRGVzYyByZXN1bHRpbmdEaWFsZWN0SW5mbykiKX0sCisgICAgeyJPU0FBdmFpbGFibGVEaWFsZWN0Q29kZUxpc3QiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQUVEZXNjIHJlc3VsdGluZ0RpYWxlY3RDb2RlTGlzdCkiKX0sCisgICAgeyJPU0FFeGVjdXRlRXZlbnQiLCAoUHlDRnVuY3Rpb24pT1NBT2JqX09TQUV4ZWN1dGVFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQXBwbGVFdmVudCB0aGVBcHBsZUV2ZW50LCBPU0FJRCBjb250ZXh0SUQsIGxvbmcgbW9kZUZsYWdzKSAtPiAoT1NBSUQgcmVzdWx0aW5nU2NyaXB0VmFsdWVJRCkiKX0sCisgICAgeyJPU0FEb0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FEb0V2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihBcHBsZUV2ZW50IHRoZUFwcGxlRXZlbnQsIE9TQUlEIGNvbnRleHRJRCwgbG9uZyBtb2RlRmxhZ3MpIC0+IChBcHBsZUV2ZW50IHJlcGx5KSIpfSwKKyAgICB7Ik9TQU1ha2VDb250ZXh0IiwgKFB5Q0Z1bmN0aW9uKU9TQU9ial9PU0FNYWtlQ29udGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQUVEZXNjIGNvbnRleHROYW1lLCBPU0FJRCBwYXJlbnRDb250ZXh0KSAtPiAoT1NBSUQgcmVzdWx0aW5nQ29udGV4dElEKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgT1NBT2JqX2dldHNldGxpc3QgTlVMTApAQCAtODAwLDY4ICs4MDAsNjggQEAKIAogc3RhdGljIFB5T2JqZWN0ICpPU0FPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUNvbXBvbmVudEluc3RhbmNlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgT1NBT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgT1NBT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoT1NBQ29tcG9uZW50SW5zdGFuY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgT1NBT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX09TQS5PU0FDb21wb25lbnRJbnN0YW5jZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKE9TQUNvbXBvbmVudEluc3RhbmNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgT1NBT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIE9TQU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgT1NBT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBPU0FPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JT1NBT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU9TQU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlPU0FPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCU9TQU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlPU0FPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlPU0FPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9PU0EuT1NBQ29tcG9uZW50SW5zdGFuY2UiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihPU0FDb21wb25lbnRJbnN0YW5jZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE9TQU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBPU0FPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE9TQU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgT1NBT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIE9TQU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBPU0FPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgT1NBT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBPU0FPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgT1NBT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgT1NBT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBPU0FDb21wb25lbnRJbnN0YW5jZSAtLS0tLS0tLS0tLS0tLSAqLwogCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBPU0FfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC04NjksMzAgKzg2OSwzMCBAQAogCiB2b2lkIGluaXRfT1NBKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07Ci0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JLyoKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBPU0FPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnRJbnN0YW5jZSwgT1NBT2JqX0NvbnZlcnQpOwotCSovCisgICAgLyoKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIE9TQU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50SW5zdGFuY2UsIE9TQU9ial9Db252ZXJ0KTsKKyAgICAqLwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX09TQSIsIE9TQV9tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlPU0FfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChPU0FfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBPU0FfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk9TQUNvbXBvbmVudEluc3RhbmNlIiwgKFB5T2JqZWN0ICopJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJPU0FDb21wb25lbnRJbnN0YW5jZVR5cGUiLCAoUHlPYmplY3QgKikmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9PU0EiLCBPU0FfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgT1NBX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoT1NBX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgT1NBX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmT1NBQ29tcG9uZW50SW5zdGFuY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJPU0FDb21wb25lbnRJbnN0YW5jZSIsIChQeU9iamVjdCAqKSZPU0FDb21wb25lbnRJbnN0YW5jZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiT1NBQ29tcG9uZW50SW5zdGFuY2VUeXBlIiwgKFB5T2JqZWN0ICopJk9TQUNvbXBvbmVudEluc3RhbmNlX1R5cGUpOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfT1NBID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3FkL19RZG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKaW5kZXggOGM5OGZhMS4uYzc1OTRiOSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvcWQvX1FkbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTQyLDE5ICs0MiwxOSBAQAogUHlPYmplY3QgKlFkUkdCX05ldyhSR0JDb2xvclB0ciBpdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbCIsIChsb25nKWl0c2VsZi0+cmVkLCAobG9uZylpdHNlbGYtPmdyZWVuLCAobG9uZylpdHNlbGYtPmJsdWUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGwiLCAobG9uZylpdHNlbGYtPnJlZCwgKGxvbmcpaXRzZWxmLT5ncmVlbiwgKGxvbmcpaXRzZWxmLT5ibHVlKTsKIH0KIAogaW50IFFkUkdCX0NvbnZlcnQoUHlPYmplY3QgKnYsIFJHQkNvbG9yUHRyIHBfaXRzZWxmKQogewotICAgICAgICBsb25nIHJlZCwgZ3JlZW4sIGJsdWU7CisgICAgbG9uZyByZWQsIGdyZWVuLCBibHVlOwogCi0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGxsIiwgJnJlZCwgJmdyZWVuLCAmYmx1ZSkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwX2l0c2VsZi0+cmVkID0gKHVuc2lnbmVkIHNob3J0KXJlZDsKLSAgICAgICAgcF9pdHNlbGYtPmdyZWVuID0gKHVuc2lnbmVkIHNob3J0KWdyZWVuOwotICAgICAgICBwX2l0c2VsZi0+Ymx1ZSA9ICh1bnNpZ25lZCBzaG9ydClibHVlOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbCIsICZyZWQsICZncmVlbiwgJmJsdWUpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcF9pdHNlbGYtPnJlZCA9ICh1bnNpZ25lZCBzaG9ydClyZWQ7CisgICAgcF9pdHNlbGYtPmdyZWVuID0gKHVuc2lnbmVkIHNob3J0KWdyZWVuOworICAgIHBfaXRzZWxmLT5ibHVlID0gKHVuc2lnbmVkIHNob3J0KWJsdWU7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC02NCw4ICs2NCw4IEBACiBQeU9iamVjdCAqUWRGSV9OZXcoRm9udEluZm8gKml0c2VsZikKIHsKIAotICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaCIsIGl0c2VsZi0+YXNjZW50LCBpdHNlbGYtPmRlc2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPndpZE1heCwgaXRzZWxmLT5sZWFkaW5nKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaCIsIGl0c2VsZi0+YXNjZW50LCBpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+d2lkTWF4LCBpdHNlbGYtPmxlYWRpbmcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Vycm9yOwpAQCAtNzcsMTI2MCArNzcsMTI2MCBAQAogI2RlZmluZSBHcmFmT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkdyYWZQb3J0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkdyYWZQb3J0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBHcmFmUG9ydE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUdyYWZQdHIgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBHcmFmUHRyIG9iX2l0c2VsZjsKIH0gR3JhZlBvcnRPYmplY3Q7CiAKIFB5T2JqZWN0ICpHcmFmT2JqX05ldyhHcmFmUHRyIGl0c2VsZikKIHsKLQlHcmFmUG9ydE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEdyYWZQb3J0T2JqZWN0LCAmR3JhZlBvcnRfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEdyYWZQb3J0T2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoR3JhZlBvcnRPYmplY3QsICZHcmFmUG9ydF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBHcmFmT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEdyYWZQdHIgKnBfaXRzZWxmKQogewogI2lmIDEKLQl7Ci0JCVdpbmRvd1JlZiB3aW47Ci0JCWlmIChXaW5PYmpfQ29udmVydCh2LCAmd2luKSAmJiB2KSB7Ci0JCQkqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQlQeUVycl9DbGVhcigpOwotCX0KKyAgICB7CisgICAgICAgIFdpbmRvd1JlZiB3aW47CisgICAgICAgIGlmIChXaW5PYmpfQ29udmVydCh2LCAmd2luKSAmJiB2KSB7CisgICAgICAgICAgICAqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KICNlbHNlCi0JaWYgKERsZ09ial9DaGVjayh2KSkgewotCQlEaWFsb2dSZWYgZGxnID0gKERpYWxvZ1JlZikoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQkJKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydChHZXREaWFsb2dXaW5kb3coZGxnKSk7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoV2luT2JqX0NoZWNrKHYpKSB7Ci0JCVdpbmRvd1JlZiB3aW4gPSAoV2luZG93UmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCQkqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7Ci0JCXJldHVybiAxOwotCX0KKyAgICBpZiAoRGxnT2JqX0NoZWNrKHYpKSB7CisgICAgICAgIERpYWxvZ1JlZiBkbGcgPSAoRGlhbG9nUmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICAqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KEdldERpYWxvZ1dpbmRvdyhkbGcpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChXaW5PYmpfQ2hlY2sodikpIHsKKyAgICAgICAgV2luZG93UmVmIHdpbiA9IChXaW5kb3dSZWYpKChHcmFmUG9ydE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgICpwX2l0c2VsZiA9IChHcmFmUHRyKUdldFdpbmRvd1BvcnQod2luKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQogI2VuZGlmCi0JaWYgKCFHcmFmT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdyYWZQb3J0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAoIUdyYWZPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiR3JhZlBvcnQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBHcmFmT2JqX2RlYWxsb2MoR3JhZlBvcnRPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfTWFjU2V0UG9ydChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNTZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURTd2FwUG9ydChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JQ0dyYWZQdHIgb3V0T2xkUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgQ0dyYWZQdHIgb3V0T2xkUG9ydDsKICNpZm5kZWYgUURTd2FwUG9ydAotCVB5TWFjX1BSRUNIRUNLKFFEU3dhcFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFEU3dhcFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFEU3dhcFBvcnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZvdXRPbGRQb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIG91dE9sZFBvcnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRRFN3YXBQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAmb3V0T2xkUG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBvdXRPbGRQb3J0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzVmFsaWRQb3J0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzVmFsaWRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soSXNWYWxpZFBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzVmFsaWRQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1ZhbGlkUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNWYWxpZFBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGl4TWFwKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRQb3J0UGl4TWFwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQaXhNYXAoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljb25zdCBCaXRNYXAgKiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNvbnN0IEJpdE1hcCAqIF9ydjsKICNpZm5kZWYgR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEJNT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJvdW5kcyhHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldFBvcnRCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAmcmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgJnJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0Rm9yZUNvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBmb3JlQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGZvcmVDb2xvcjsKICNpZm5kZWYgR2V0UG9ydEZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRGb3JlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnRGb3JlQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICZmb3JlQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmZm9yZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydEZvcmVDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgJmZvcmVDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZmb3JlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEJhY2tDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgYmFja0NvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBiYWNrQ29sb3I7CiAjaWZuZGVmIEdldFBvcnRCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0QmFja0NvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0QmFja0NvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAmYmFja0NvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRCYWNrQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICZiYWNrQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRPcENvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBHZXRQb3J0T3BDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRPcENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0T3BDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmb3BDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRIaWxpdGVDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZUNvbG9yOwogI2lmbmRlZiBHZXRQb3J0SGlsaXRlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0SGlsaXRlQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRIaWxpdGVDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydEhpbGl0ZUNvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZoaWxpdGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZoaWxpdGVDb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRIaWxpdGVDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmaGlsaXRlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRGb250KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRGb250Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dEZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0Rm9udChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRGb250KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRGYWNlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHlsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0eWxlIF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRGYWNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dEZhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0RmFjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRGYWNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRNb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dE1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRNb2RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFRleHRTaXplKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0UG9ydFRleHRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFRleHRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0VGV4dFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFRleHRTaXplKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydENoRXh0cmEoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRQb3J0Q2hFeHRyYQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRDaEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0Q2hFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydENoRXh0cmEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRDaEV4dHJhKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRGcmFjSFBlbkxvY2F0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFNwRXh0cmEoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OwogI2lmbmRlZiBHZXRQb3J0U3BFeHRyYQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRTcEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0U3BFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFNwRXh0cmEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0U3BFeHRyYShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuVmlzaWJpbGl0eShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFBvcnRQZW5WaXNpYmlsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblZpc2liaWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5WaXNpYmlsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0UGVuVmlzaWJpbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UG9ydFBlblZpc2liaWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0VmlzaWJsZVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlSZ25IYW5kbGUgdmlzUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFJnbkhhbmRsZSB2aXNSZ247CiAjaWZuZGVmIEdldFBvcnRWaXNpYmxlUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFZpc2libGVSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRWaXNpYmxlUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2aXNSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1Jnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2aXNSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc1Jnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydENsaXBSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIGNsaXBSZ247CiAjaWZuZGVmIEdldFBvcnRDbGlwUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydENsaXBSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRDbGlwUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0Q2xpcFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRCYWNrUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm47CiAjaWZuZGVmIEdldFBvcnRCYWNrUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEJhY2tQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRCYWNrUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZiYWNrUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRCYWNrUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgYmFja1BhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja1BhdHRlcm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0QmFja1BpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tQYXR0ZXJuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgX3J2OworICAgIFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOwogI2lmbmRlZiBHZXRQb3J0UGVuUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRQZW5QaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQZW5QaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRGaWxsUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgX3J2OwotCVBpeFBhdEhhbmRsZSBmaWxsUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQaXhQYXRIYW5kbGUgZmlsbFBhdHRlcm47CiAjaWZuZGVmIEdldFBvcnRGaWxsUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydEZpbGxQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBvcnRGaWxsUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZmaWxsUGF0dGVybikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBvcnRGaWxsUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFBhdHRlcm4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZmlsbFBhdHRlcm4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRQb3J0RmlsbFBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxQYXR0ZXJuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9HZXRQb3J0UGVuU2l6ZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcGVuU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcGVuU2l6ZTsKICNpZm5kZWYgR2V0UG9ydFBlblNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlblNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBlblNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQb3J0UGVuU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICZwZW5TaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBlblNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5TaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9ydFBlblNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmcGVuU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwZW5TaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0dldFBvcnRQZW5Nb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTSW50MzIgX3J2OwogI2lmbmRlZiBHZXRQb3J0UGVuTW9kZQotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5Nb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3J0UGVuTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UG9ydFBlbk1vZGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfR2V0UG9ydFBlbkxvY2F0aW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwZW5Mb2NhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcGVuTG9jYXRpb247CiAjaWZuZGVmIEdldFBvcnRQZW5Mb2NhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldFBvcnRQZW5Mb2NhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydFBlbkxvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5Mb2NhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvcnRQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAmcGVuTG9jYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcGVuTG9jYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5Mb2NhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnRQZW5Mb2NhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcGVuTG9jYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcGVuTG9jYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZAotCVB5TWFjX1BSRUNIRUNLKElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydFJlZ2lvbkJlaW5nRGVmaW5lZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNQb3J0UGljdHVyZUJlaW5nRGVmaW5lZAotCVB5TWFjX1BSRUNIRUNLKElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1BvcnRQb2x5QmVpbmdEZWZpbmVkKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydFBvbHlCZWluZ0RlZmluZWQKLQlQeU1hY19QUkVDSEVDSyhJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1BvcnRQb2x5QmVpbmdEZWZpbmVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0T2Zmc2NyZWVuKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydE9mZnNjcmVlbgotCVB5TWFjX1BSRUNIRUNLKElzUG9ydE9mZnNjcmVlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0T2Zmc2NyZWVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRPZmZzY3JlZW4oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydE9mZnNjcmVlbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX0lzUG9ydENvbG9yKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydENvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSXNQb3J0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUG9ydENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRDb2xvcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNQb3J0Q29sb3IoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Jc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5Ci0JUHlNYWNfUFJFQ0hFQ0soSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUG9ydFZpc2libGVSZWdpb25FbXB0eShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzUG9ydENsaXBSZWdpb25FbXB0eQotCVB5TWFjX1BSRUNIRUNLKElzUG9ydENsaXBSZWdpb25FbXB0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNQb3J0Q2xpcFJlZ2lvbkVtcHR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1BvcnRDbGlwUmVnaW9uRW1wdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzUG9ydENsaXBSZWdpb25FbXB0eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBpb1JlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGlvUmVnaW9uOwogI2lmbmRlZiBTZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW9SZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb1JlZ2lvbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpb1JlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvUmVnaW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgaW9SZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBpb1JlZ2lvbjsKICNpZm5kZWYgU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlvUmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9SZWdpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW9SZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb1JlZ2lvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU3dhcFBvcnRQaWNTYXZlSGFuZGxlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCUhhbmRsZSBpblBpY1NhdmVIZGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGluUGljU2F2ZUhkbDsKICNpZm5kZWYgU3dhcFBvcnRQaWNTYXZlSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU3dhcFBvcnRQaWNTYXZlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFBpY1NhdmVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUGljU2F2ZUhkbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN3YXBQb3J0UGljU2F2ZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBpY1NhdmVIZGwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5QaWNTYXZlSGRsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3dhcFBvcnRQaWNTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGljU2F2ZUhkbCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlIYW5kbGUgaW5Qb2x5U2F2ZUhkbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaW5Qb2x5U2F2ZUhkbDsKICNpZm5kZWYgU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UG9seVNhdmVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UG9seVNhdmVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUG9seVNhdmVIZGwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTd2FwUG9ydFBvbHlTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBvbHlTYXZlSGRsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluUG9seVNhdmVIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTd2FwUG9ydFBvbHlTYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBvbHlTYXZlSGRsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9Td2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JSGFuZGxlIGluUmVnaW9uU2F2ZUhkbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBIYW5kbGUgaW5SZWdpb25TYXZlSGRsOwogI2lmbmRlZiBTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5SZWdpb25TYXZlSGRsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uU2F2ZUhkbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpblJlZ2lvblNhdmVIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTd2FwUG9ydFJlZ2lvblNhdmVIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25TYXZlSGRsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0Qm91bmRzKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgU2V0UG9ydEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0T3BDb2xvcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3Igb3BDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgU2V0UG9ydE9wQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0T3BDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydE9wQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmb3BDb2xvcikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRPcENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydE9wQ29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFRleHRGb250KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB0eEZvbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHR4Rm9udDsKICNpZm5kZWYgU2V0UG9ydFRleHRGb250Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dEZvbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0eEZvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0VGV4dEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgdHhGb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eEZvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VGV4dEZvbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdHhGb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0VGV4dFNpemUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHR4U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdHhTaXplOwogI2lmbmRlZiBTZXRQb3J0VGV4dFNpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRUZXh0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnR4U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0eFNpemUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnR4U2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRUZXh0U2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICB0eFNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRUZXh0RmFjZShHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3R5bGVQYXJhbWV0ZXIgZmFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3R5bGVQYXJhbWV0ZXIgZmFjZTsKICNpZm5kZWYgU2V0UG9ydFRleHRGYWNlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dEZhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFRleHRGYWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIGZhY2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0VGV4dEZhY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgZmFjZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFRleHRNb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBTZXRQb3J0VGV4dE1vZGUKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VGV4dE1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRUZXh0TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0VGV4dE1vZGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgbW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRUZXh0TW9kZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0VmlzaWJsZVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHZpc1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHZpc1JnbjsKICNpZm5kZWYgU2V0UG9ydFZpc2libGVSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0VmlzaWJsZVJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFZpc2libGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZpc1JnbikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdmlzUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZpc1JnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRWaXNpYmxlUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlzUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0Q2xpcFJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBjbGlwUmduOwogI2lmbmRlZiBTZXRQb3J0Q2xpcFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRDbGlwUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0Q2xpcFJlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJnbikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRDbGlwUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgY2xpcFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydENsaXBSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9TZXRQb3J0UGVuUGl4UGF0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBlblBhdHRlcm47CiAjaWZuZGVmIFNldFBvcnRQZW5QaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0UGVuUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0UGVuUGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwZW5QYXR0ZXJuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFBlblBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwZW5QYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFBlblBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEZpbGxQaXhQYXQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhQYXRIYW5kbGUgcGVuUGF0dGVybjsKICNpZm5kZWYgU2V0UG9ydEZpbGxQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0RmlsbFBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEZpbGxQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBlblBhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0RmlsbFBpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHBlblBhdHRlcm4pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGVuUGF0dGVybikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRGaWxsUGl4UGF0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgcGVuUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEJhY2tQaXhQYXQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuOwogI2lmbmRlZiBTZXRQb3J0QmFja1BpeFBhdAotCVB5TWFjX1BSRUNIRUNLKFNldFBvcnRCYWNrUGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQb3J0QmFja1BpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYmFja1BhdHRlcm4pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0QmFja1BpeFBhdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGJhY2tQYXR0ZXJuKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmJhY2tQYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydEJhY2tQaXhQYXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBiYWNrUGF0dGVybik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydFBlblNpemUoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHBlblNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHBlblNpemU7CiAjaWZuZGVmIFNldFBvcnRQZW5TaXplCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBlblNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRQZW5TaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwZW5TaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UG9ydFBlblNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICBwZW5TaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBlblNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0UGVuU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHBlblNpemUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1NldFBvcnRQZW5Nb2RlKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgcGVuTW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDMyIHBlbk1vZGU7CiAjaWZuZGVmIFNldFBvcnRQZW5Nb2RlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBlbk1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRQZW5Nb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVuTW9kZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgcGVuTW9kZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVuTW9kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRQZW5Nb2RlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgcGVuTW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24oR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHBuTG9jSEZyYWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHBuTG9jSEZyYWM7CiAjaWZuZGVmIFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG5Mb2NIRnJhYykpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcG5Mb2NIRnJhYyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG5Mb2NIRnJhYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFBvcnRGcmFjSFBlbkxvY2F0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5Mb2NIRnJhYyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfRGlzcG9zZVBvcnQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGlzcG9zZVBvcnQKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVBvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUG9pbnQoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHBvaW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwb2ludDsKICNpZm5kZWYgUURMb2NhbFRvR2xvYmFsUG9pbnQKLQlQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxQb2ludCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnBvaW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUURMb2NhbFRvR2xvYmFsUG9pbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAmcG9pbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcG9pbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwb2ludCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFETG9jYWxUb0dsb2JhbFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBvaW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFBvaW50KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwb2ludDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcG9pbnQ7CiAjaWZuZGVmIFFER2xvYmFsVG9Mb2NhbFBvaW50Ci0JUHlNYWNfUFJFQ0hFQ0soUURHbG9iYWxUb0xvY2FsUG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFBvaW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwb2ludCkpCi0JCXJldHVybiBOVUxMOwotCVFER2xvYmFsVG9Mb2NhbFBvaW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJnBvaW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHBvaW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBRREdsb2JhbFRvTG9jYWxQb2ludChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwb2ludCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWN0KEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFFETG9jYWxUb0dsb2JhbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlRRExvY2FsVG9HbG9iYWxSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFETG9jYWxUb0dsb2JhbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFJlY3QoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgUURHbG9iYWxUb0xvY2FsUmVjdAotCVB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2xvYmFsVG9Mb2NhbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVFER2xvYmFsVG9Mb2NhbFJlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUURHbG9iYWxUb0xvY2FsUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURMb2NhbFRvR2xvYmFsUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUURMb2NhbFRvR2xvYmFsUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRExvY2FsVG9HbG9iYWxSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFETG9jYWxUb0dsb2JhbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURMb2NhbFRvR2xvYmFsUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURHbG9iYWxUb0xvY2FsUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUURHbG9iYWxUb0xvY2FsUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREdsb2JhbFRvTG9jYWxSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFER2xvYmFsVG9Mb2NhbFJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURHbG9iYWxUb0xvY2FsUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURJc1BvcnRCdWZmZXJlZChHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBRRElzUG9ydEJ1ZmZlcmVkCi0JUHlNYWNfUFJFQ0hFQ0soUURJc1BvcnRCdWZmZXJlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURJc1BvcnRCdWZmZXJlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUURJc1BvcnRCdWZmZXJlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUURJc1BvcnRCdWZmZXJlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHcmFmT2JqX1FESXNQb3J0QnVmZmVyRGlydHkoR3JhZlBvcnRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgUURJc1BvcnRCdWZmZXJEaXJ0eQotCVB5TWFjX1BSRUNIRUNLKFFESXNQb3J0QnVmZmVyRGlydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFESXNQb3J0QnVmZmVyRGlydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFESXNQb3J0QnVmZmVyRGlydHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFESXNQb3J0QnVmZmVyRGlydHkoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RREZsdXNoUG9ydEJ1ZmZlcihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgUURGbHVzaFBvcnRCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhRREZsdXNoUG9ydEJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUURGbHVzaFBvcnRCdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCVFERmx1c2hQb3J0QnVmZmVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFFERmx1c2hQb3J0QnVmZmVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9RREdldERpcnR5UmVnaW9uKEdyYWZQb3J0T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgUURHZXREaXJ0eVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKFFER2V0RGlydHlSZWdpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFER2V0RGlydHlSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRREdldERpcnR5UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFER2V0RGlydHlSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfUURTZXREaXJ0eVJlZ2lvbihHcmFmUG9ydE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIFFEU2V0RGlydHlSZWdpb24KLQlQeU1hY19QUkVDSEVDSyhRRFNldERpcnR5UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRRFNldERpcnR5UmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUURTZXREaXJ0eVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRRFNldERpcnR5UmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEdyYWZPYmpfbWV0aG9kc1tdID0gewotCXsiTWFjU2V0UG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX01hY1NldFBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlFEU3dhcFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRFN3YXBQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgQ0dyYWZQdHIgb3V0T2xkUG9ydCkiKX0sCi0JeyJJc1ZhbGlkUG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzVmFsaWRQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJHZXRQb3J0UGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGl4TWFwSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGNvbnN0IEJpdE1hcCAqIF9ydikiKX0sCi0JeyJHZXRQb3J0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKLQl7IkdldFBvcnRGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Rm9yZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBmb3JlQ29sb3IpIil9LAotCXsiR2V0UG9ydEJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCYWNrQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGJhY2tDb2xvcikiKX0sCi0JeyJHZXRQb3J0T3BDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRPcENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBvcENvbG9yKSIpfSwKLQl7IkdldFBvcnRIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRIaWxpdGVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgaGlsaXRlQ29sb3IpIil9LAotCXsiR2V0UG9ydFRleHRGb250IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRGb250LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRGYWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTdHlsZSBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRNb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydFRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFRleHRTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UG9ydENoRXh0cmEiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0Q2hFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRGcmFjSFBlbkxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZyYWNIUGVuTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRQb3J0U3BFeHRyYSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRTcEV4dHJhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiR2V0UG9ydFBlblZpc2liaWxpdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuVmlzaWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFBvcnRWaXNpYmxlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFZpc2libGVSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB2aXNSZ24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IkdldFBvcnRDbGlwUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydENsaXBSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbGlwUmduKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0QmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCYWNrUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm4pIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFBvcnRQZW5QaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGVuUGF0dGVybikgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAotCXsiR2V0UG9ydEZpbGxQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0RmlsbFBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIGZpbGxQYXR0ZXJuKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQb3J0UGVuU2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5TaXplLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwZW5TaXplKSAtPiAoUG9pbnQgcGVuU2l6ZSkiKX0sCi0JeyJHZXRQb3J0UGVuTW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5Nb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKLQl7IkdldFBvcnRQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQZW5Mb2NhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcGVuTG9jYXRpb24pIC0+IChQb2ludCBwZW5Mb2NhdGlvbikiKX0sCi0JeyJJc1BvcnRSZWdpb25CZWluZ0RlZmluZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRSZWdpb25CZWluZ0RlZmluZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzUG9ydFBpY3R1cmVCZWluZ0RlZmluZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRQb2x5QmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UG9seUJlaW5nRGVmaW5lZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiSXNQb3J0T2Zmc2NyZWVuIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0T2Zmc2NyZWVuLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRDb2xvciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRWaXNpYmxlUmVnaW9uRW1wdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzUG9ydENsaXBSZWdpb25FbXB0eSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydENsaXBSZWdpb25FbXB0eSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2VjdFJlZ2lvbldpdGhQb3J0Q2xpcFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpb1JlZ2lvbikgLT4gTm9uZSIpfSwKLQl7IlNlY3RSZWdpb25XaXRoUG9ydFZpc2libGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgaW9SZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJTd2FwUG9ydFBpY1NhdmVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Td2FwUG9ydFBpY1NhdmVIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBpblBpY1NhdmVIZGwpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlN3YXBQb3J0UG9seVNhdmVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Td2FwUG9ydFBvbHlTYXZlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaW5Qb2x5U2F2ZUhkbCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRSZWdpb25TYXZlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaW5SZWdpb25TYXZlSGRsKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRQb3J0Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiU2V0UG9ydE9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0T3BDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3Igb3BDb2xvcikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0Rm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdHhGb250KSAtPiBOb25lIil9LAotCXsiU2V0UG9ydFRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRTaXplLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0eFNpemUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VGV4dEZhY2UiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dEZhY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0eWxlUGFyYW1ldGVyIGZhY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VGV4dE1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dE1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0VmlzaWJsZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRWaXNpYmxlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdmlzUmduKSAtPiBOb25lIil9LAotCXsiU2V0UG9ydENsaXBSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0Q2xpcFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsaXBSZ24pIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0UGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFBlblBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0RmlsbFBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRGaWxsUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGVuUGF0dGVybikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRCYWNrUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEJhY2tQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBiYWNrUGF0dGVybikgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRQZW5TaXplIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFBlblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHBlblNpemUpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0UGVuTW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5Nb2RlLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgcGVuTW9kZSkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRGcmFjSFBlbkxvY2F0aW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydEZyYWNIUGVuTG9jYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBuTG9jSEZyYWMpIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlUG9ydCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0Rpc3Bvc2VQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJRRExvY2FsVG9HbG9iYWxQb2ludCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFBvaW50LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwb2ludCkgLT4gKFBvaW50IHBvaW50KSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFBvaW50IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUG9pbnQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHBvaW50KSAtPiAoUG9pbnQgcG9pbnQpIil9LAotCXsiUURMb2NhbFRvR2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FETG9jYWxUb0dsb2JhbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFJlY3QiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdsb2JhbFRvTG9jYWxSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCi0JeyJRRExvY2FsVG9HbG9iYWxSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlFER2xvYmFsVG9Mb2NhbFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiUURJc1BvcnRCdWZmZXJlZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FESXNQb3J0QnVmZmVyZWQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlFESXNQb3J0QnVmZmVyRGlydHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRElzUG9ydEJ1ZmZlckRpcnR5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJRREZsdXNoUG9ydEJ1ZmZlciIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FERmx1c2hQb3J0QnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAotCXsiUURHZXREaXJ0eVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2V0RGlydHlSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJRRFNldERpcnR5UmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURTZXREaXJ0eVJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1hY1NldFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9NYWNTZXRQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJRRFN3YXBQb3J0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURTd2FwUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIENHcmFmUHRyIG91dE9sZFBvcnQpIil9LAorICAgIHsiSXNWYWxpZFBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1ZhbGlkUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0UG9ydFBpeE1hcCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEJpdE1hcEZvckNvcHlCaXRzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChjb25zdCBCaXRNYXAgKiBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCisgICAgeyJHZXRQb3J0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZvcmVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgZm9yZUNvbG9yKSIpfSwKKyAgICB7IkdldFBvcnRCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0QmFja0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBiYWNrQ29sb3IpIil9LAorICAgIHsiR2V0UG9ydE9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0T3BDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3Igb3BDb2xvcikiKX0sCisgICAgeyJHZXRQb3J0SGlsaXRlQ29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0SGlsaXRlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGhpbGl0ZUNvbG9yKSIpfSwKKyAgICB7IkdldFBvcnRUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0RmFjZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0RmFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3R5bGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0TW9kZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRUZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRDaEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydENoRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRGcmFjSFBlbkxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UG9ydFNwRXh0cmEiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0U3BFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRQZW5WaXNpYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblZpc2liaWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRQb3J0VmlzaWJsZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRWaXNpYmxlUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgdmlzUmduKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRQb3J0Q2xpcFJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0dldFBvcnRDbGlwUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xpcFJnbikgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydEJhY2tQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0QmFja1BpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIGJhY2tQYXR0ZXJuKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRQb3J0UGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydFBlblBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IChQaXhQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFBvcnRGaWxsUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfR2V0UG9ydEZpbGxQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBmaWxsUGF0dGVybikgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UG9ydFBlblNpemUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcGVuU2l6ZSkgLT4gKFBvaW50IHBlblNpemUpIil9LAorICAgIHsiR2V0UG9ydFBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDMyIF9ydikiKX0sCisgICAgeyJHZXRQb3J0UGVuTG9jYXRpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9HZXRQb3J0UGVuTG9jYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHBlbkxvY2F0aW9uKSAtPiAoUG9pbnQgcGVuTG9jYXRpb24pIil9LAorICAgIHsiSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UmVnaW9uQmVpbmdEZWZpbmVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1BvcnRQaWN0dXJlQmVpbmdEZWZpbmVkIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0UGljdHVyZUJlaW5nRGVmaW5lZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0UG9seUJlaW5nRGVmaW5lZCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydFBvbHlCZWluZ0RlZmluZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IklzUG9ydE9mZnNjcmVlbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX0lzUG9ydE9mZnNjcmVlbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0Q29sb3IiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfSXNQb3J0VmlzaWJsZVJlZ2lvbkVtcHR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1BvcnRDbGlwUmVnaW9uRW1wdHkiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9Jc1BvcnRDbGlwUmVnaW9uRW1wdHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNlY3RSZWdpb25XaXRoUG9ydENsaXBSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZWN0UmVnaW9uV2l0aFBvcnRDbGlwUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgaW9SZWdpb24pIC0+IE5vbmUiKX0sCisgICAgeyJTZWN0UmVnaW9uV2l0aFBvcnRWaXNpYmxlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2VjdFJlZ2lvbldpdGhQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGlvUmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiU3dhcFBvcnRQaWNTYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRQaWNTYXZlSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaW5QaWNTYXZlSGRsKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJTd2FwUG9ydFBvbHlTYXZlSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU3dhcFBvcnRQb2x5U2F2ZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGluUG9seVNhdmVIZGwpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlN3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1N3YXBQb3J0UmVnaW9uU2F2ZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGluUmVnaW9uU2F2ZUhkbCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRPcENvbG9yIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydE9wQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIG9wQ29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0VGV4dEZvbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VGV4dEZvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHR4Rm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRUZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdHhTaXplKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRGYWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHlsZVBhcmFtZXRlciBmYWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFRleHRNb2RlIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydFRleHRNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFZpc2libGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0VmlzaWJsZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHZpc1JnbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFBvcnRDbGlwUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfU2V0UG9ydENsaXBSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbGlwUmduKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFBlblBpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5QaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwZW5QYXR0ZXJuKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydEZpbGxQaXhQYXQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0RmlsbFBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBlblBhdHRlcm4pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0QmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRCYWNrUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgYmFja1BhdHRlcm4pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0UGVuU2l6ZSIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRQZW5TaXplLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwZW5TaXplKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydFBlbk1vZGUiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9TZXRQb3J0UGVuTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIHBlbk1vZGUpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0RnJhY0hQZW5Mb2NhdGlvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1NldFBvcnRGcmFjSFBlbkxvY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwbkxvY0hGcmFjKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZVBvcnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9EaXNwb3NlUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUURMb2NhbFRvR2xvYmFsUG9pbnQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcG9pbnQpIC0+IChQb2ludCBwb2ludCkiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxQb2ludCIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FER2xvYmFsVG9Mb2NhbFBvaW50LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwb2ludCkgLT4gKFBvaW50IHBvaW50KSIpfSwKKyAgICB7IlFETG9jYWxUb0dsb2JhbFJlY3QiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRExvY2FsVG9HbG9iYWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURHbG9iYWxUb0xvY2FsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAorICAgIHsiUURMb2NhbFRvR2xvYmFsUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURMb2NhbFRvR2xvYmFsUmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJRREdsb2JhbFRvTG9jYWxSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdsb2JhbFRvTG9jYWxSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlFESXNQb3J0QnVmZmVyZWQiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RRElzUG9ydEJ1ZmZlcmVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJRRElzUG9ydEJ1ZmZlckRpcnR5IiwgKFB5Q0Z1bmN0aW9uKUdyYWZPYmpfUURJc1BvcnRCdWZmZXJEaXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUURGbHVzaFBvcnRCdWZmZXIiLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREZsdXNoUG9ydEJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gTm9uZSIpfSwKKyAgICB7IlFER2V0RGlydHlSZWdpb24iLCAoUHlDRnVuY3Rpb24pR3JhZk9ial9RREdldERpcnR5UmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiUURTZXREaXJ0eVJlZ2lvbiIsIChQeUNGdW5jdGlvbilHcmFmT2JqX1FEU2V0RGlydHlSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkdyYWZPYmpfZ2V0X3Zpc1JnbihHcmFmUG9ydE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KLQkgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRWaXNpYmxlUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOwotCSAgICAgICAgICAgIAorICAgIFJnbkhhbmRsZSBoPU5ld1JnbigpOyAvKiBYWFhYIHdyb25nIGRpc3Bvc2Ugcm91dGluZSAqLworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0VmlzaWJsZVJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKKwogfQogCiAjZGVmaW5lIEdyYWZPYmpfc2V0X3Zpc1JnbiBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial9nZXRfY2xpcFJnbihHcmFmUG9ydE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlSZ25IYW5kbGUgaD1OZXdSZ24oKTsgLyogWFhYWCB3cm9uZyBkaXNwb3NlIHJvdXRpbmUgKi8KLQkgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRDbGlwUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOwotCSAgICAgICAgICAgIAorICAgIFJnbkhhbmRsZSBoPU5ld1JnbigpOyAvKiBYWFhYIHdyb25nIGRpc3Bvc2Ugcm91dGluZSAqLworICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgKEhhbmRsZSlHZXRQb3J0Q2xpcFJlZ2lvbihzZWxmLT5vYl9pdHNlbGYsIGgpKTsKKwogfQogCiAjZGVmaW5lIEdyYWZPYmpfc2V0X2NsaXBSZ24gTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgR3JhZk9ial9nZXRzZXRsaXN0W10gPSB7Ci0JeyJ2aXNSZ24iLCAoZ2V0dGVyKUdyYWZPYmpfZ2V0X3Zpc1JnbiwgKHNldHRlcilHcmFmT2JqX3NldF92aXNSZ24sICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIHZpc2libGUgcmVnaW9uIn0sCi0JeyJjbGlwUmduIiwgKGdldHRlcilHcmFmT2JqX2dldF9jbGlwUmduLCAoc2V0dGVyKUdyYWZPYmpfc2V0X2NsaXBSZ24sICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIGNsaXBwaW5nIHJlZ2lvbiJ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKKyAgICB7InZpc1JnbiIsIChnZXR0ZXIpR3JhZk9ial9nZXRfdmlzUmduLCAoc2V0dGVyKUdyYWZPYmpfc2V0X3Zpc1JnbiwgIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgdmlzaWJsZSByZWdpb24ifSwKKyAgICB7ImNsaXBSZ24iLCAoZ2V0dGVyKUdyYWZPYmpfZ2V0X2NsaXBSZ24sIChzZXR0ZXIpR3JhZk9ial9zZXRfY2xpcFJnbiwgIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgY2xpcHBpbmcgcmVnaW9uIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xMzQ1LDYxICsxMzQ1LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqR3JhZk9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JR3JhZlB0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEdyYWZQdHIgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgR3JhZk9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEdyYWZQb3J0T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEdyYWZPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChHcmFmUG9ydE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBHcmFmT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEdyYWZQb3J0X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1FkLkdyYWZQb3J0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoR3JhZlBvcnRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBHcmFmT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEdyYWZPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEdyYWZPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIEdyYWZPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JR3JhZk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlHcmFmT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCUdyYWZPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUdyYWZPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JR3JhZk9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCUdyYWZPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RZC5HcmFmUG9ydCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEdyYWZQb3J0T2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgR3JhZk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBHcmFmT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBHcmFmT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBHcmFmT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIEdyYWZPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgR3JhZk9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBHcmFmT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBHcmFmT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEdyYWZPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBHcmFmT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBHcmFmUG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTQxMiwxMjQgKzE0MTIsMTI0IEBACiAjZGVmaW5lIEJNT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJkJpdE1hcF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZCaXRNYXBfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IEJpdE1hcE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCUJpdE1hcFB0ciBvYl9pdHNlbGY7Ci0JUHlPYmplY3QgKnJlZmVycmVkX29iamVjdDsKLQlCaXRNYXAgKnJlZmVycmVkX2JpdG1hcDsKKyAgICBQeU9iamVjdF9IRUFECisgICAgQml0TWFwUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdCAqcmVmZXJyZWRfb2JqZWN0OworICAgIEJpdE1hcCAqcmVmZXJyZWRfYml0bWFwOwogfSBCaXRNYXBPYmplY3Q7CiAKIFB5T2JqZWN0ICpCTU9ial9OZXcoQml0TWFwUHRyIGl0c2VsZikKIHsKLQlCaXRNYXBPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhCaXRNYXBPYmplY3QsICZCaXRNYXBfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JaXQtPnJlZmVycmVkX29iamVjdCA9IE5VTEw7Ci0JaXQtPnJlZmVycmVkX2JpdG1hcCA9IE5VTEw7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIEJpdE1hcE9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKEJpdE1hcE9iamVjdCwgJkJpdE1hcF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+cmVmZXJyZWRfb2JqZWN0ID0gTlVMTDsKKyAgICBpdC0+cmVmZXJyZWRfYml0bWFwID0gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBCTU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBCaXRNYXBQdHIgKnBfaXRzZWxmKQogewotCWlmICghQk1PYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQml0TWFwIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKEJpdE1hcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFCTU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJCaXRNYXAgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoQml0TWFwT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgQk1PYmpfZGVhbGxvYyhCaXRNYXBPYmplY3QgKnNlbGYpCiB7Ci0JUHlfWERFQ1JFRihzZWxmLT5yZWZlcnJlZF9vYmplY3QpOwotCWlmIChzZWxmLT5yZWZlcnJlZF9iaXRtYXApIGZyZWUoc2VsZi0+cmVmZXJyZWRfYml0bWFwKTsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIFB5X1hERUNSRUYoc2VsZi0+cmVmZXJyZWRfb2JqZWN0KTsKKyAgICBpZiAoc2VsZi0+cmVmZXJyZWRfYml0bWFwKSBmcmVlKHNlbGYtPnJlZmVycmVkX2JpdG1hcCk7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpCTU9ial9nZXRkYXRhKEJpdE1hcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IGZyb20sIGxlbmd0aDsKLQljaGFyICpjcDsKKyAgICBpbnQgZnJvbSwgbGVuZ3RoOworICAgIGNoYXIgKmNwOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlpIiwgJmZyb20sICZsZW5ndGgpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKLQlfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY3AsIGxlbmd0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlpIiwgJmZyb20sICZsZW5ndGgpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY3AgPSBfc2VsZi0+b2JfaXRzZWxmLT5iYXNlQWRkcitmcm9tOworICAgIF9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX3B1dGRhdGEoQml0TWFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlpbnQgZnJvbSwgbGVuZ3RoOwotCWNoYXIgKmNwLCAqaWNwOworICAgIGludCBmcm9tLCBsZW5ndGg7CisgICAgY2hhciAqY3AsICppY3A7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaXMjIiwgJmZyb20sICZpY3AsICZsZW5ndGgpICkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKLQltZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlzIyIsICZmcm9tLCAmaWNwLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKKyAgICBtZW1jcHkoY3AsIGljcCwgbGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEJNT2JqX21ldGhvZHNbXSA9IHsKLQl7ImdldGRhdGEiLCAoUHlDRnVuY3Rpb24pQk1PYmpfZ2V0ZGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgLT4gc3RyaW5nLiBSZXR1cm4gYnl0ZXMgZnJvbSB0aGUgYml0bWFwIil9LAotCXsicHV0ZGF0YSIsIChQeUNGdW5jdGlvbilCTU9ial9wdXRkYXRhLCAxLAotCSBQeURvY19TVFIoIihpbnQgc3RhcnQsIHN0cmluZyBkYXRhKS4gU3RvcmUgYnl0ZXMgaW50byB0aGUgYml0bWFwIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiZ2V0ZGF0YSIsIChQeUNGdW5jdGlvbilCTU9ial9nZXRkYXRhLCAxLAorICAgICBQeURvY19TVFIoIihpbnQgc3RhcnQsIGludCBzaXplKSAtPiBzdHJpbmcuIFJldHVybiBieXRlcyBmcm9tIHRoZSBiaXRtYXAiKX0sCisgICAgeyJwdXRkYXRhIiwgKFB5Q0Z1bmN0aW9uKUJNT2JqX3B1dGRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKGludCBzdGFydCwgc3RyaW5nIGRhdGEpLiBTdG9yZSBieXRlcyBpbnRvIHRoZSBiaXRtYXAiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9iYXNlQWRkcihCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPmJhc2VBZGRyKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfYmFzZUFkZHIgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9yb3dCeXRlcyhCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+cm93Qnl0ZXMpOworICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPnJvd0J5dGVzKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfcm93Qnl0ZXMgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9ib3VuZHMoQml0TWFwT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJnNlbGYtPm9iX2l0c2VsZi0+Ym91bmRzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICZzZWxmLT5vYl9pdHNlbGYtPmJvdW5kcyk7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X2JvdW5kcyBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqQk1PYmpfZ2V0X2JpdG1hcF9kYXRhKEJpdE1hcE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihCaXRNYXApKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihCaXRNYXApKTsKIH0KIAogI2RlZmluZSBCTU9ial9zZXRfYml0bWFwX2RhdGEgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKkJNT2JqX2dldF9waXhtYXBfZGF0YShCaXRNYXBPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoUGl4TWFwKSk7CisgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoUGl4TWFwKSk7CiB9CiAKICNkZWZpbmUgQk1PYmpfc2V0X3BpeG1hcF9kYXRhIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIEJNT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImJhc2VBZGRyIiwgKGdldHRlcilCTU9ial9nZXRfYmFzZUFkZHIsIChzZXR0ZXIpQk1PYmpfc2V0X2Jhc2VBZGRyLCBOVUxMfSwKLQl7InJvd0J5dGVzIiwgKGdldHRlcilCTU9ial9nZXRfcm93Qnl0ZXMsIChzZXR0ZXIpQk1PYmpfc2V0X3Jvd0J5dGVzLCBOVUxMfSwKLQl7ImJvdW5kcyIsIChnZXR0ZXIpQk1PYmpfZ2V0X2JvdW5kcywgKHNldHRlcilCTU9ial9zZXRfYm91bmRzLCBOVUxMfSwKLQl7ImJpdG1hcF9kYXRhIiwgKGdldHRlcilCTU9ial9nZXRfYml0bWFwX2RhdGEsIChzZXR0ZXIpQk1PYmpfc2V0X2JpdG1hcF9kYXRhLCBOVUxMfSwKLQl7InBpeG1hcF9kYXRhIiwgKGdldHRlcilCTU9ial9nZXRfcGl4bWFwX2RhdGEsIChzZXR0ZXIpQk1PYmpfc2V0X3BpeG1hcF9kYXRhLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJiYXNlQWRkciIsIChnZXR0ZXIpQk1PYmpfZ2V0X2Jhc2VBZGRyLCAoc2V0dGVyKUJNT2JqX3NldF9iYXNlQWRkciwgTlVMTH0sCisgICAgeyJyb3dCeXRlcyIsIChnZXR0ZXIpQk1PYmpfZ2V0X3Jvd0J5dGVzLCAoc2V0dGVyKUJNT2JqX3NldF9yb3dCeXRlcywgTlVMTH0sCisgICAgeyJib3VuZHMiLCAoZ2V0dGVyKUJNT2JqX2dldF9ib3VuZHMsIChzZXR0ZXIpQk1PYmpfc2V0X2JvdW5kcywgTlVMTH0sCisgICAgeyJiaXRtYXBfZGF0YSIsIChnZXR0ZXIpQk1PYmpfZ2V0X2JpdG1hcF9kYXRhLCAoc2V0dGVyKUJNT2JqX3NldF9iaXRtYXBfZGF0YSwgTlVMTH0sCisgICAgeyJwaXhtYXBfZGF0YSIsIChnZXR0ZXIpQk1PYmpfZ2V0X3BpeG1hcF9kYXRhLCAoc2V0dGVyKUJNT2JqX3NldF9waXhtYXBfZGF0YSwgTlVMTH0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC0xNTQ0LDYxICsxNTQ0LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQk1PYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCUJpdE1hcFB0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIEJpdE1hcFB0ciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBCTU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEJpdE1hcE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBCTU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKEJpdE1hcE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBCTU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBCaXRNYXBfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUWQuQml0TWFwIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoQml0TWFwT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgQk1PYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgQk1PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIEJNT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBCTU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlCTU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlCTU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlCTU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JQk1PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JQk1PYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlCTU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1FkLkJpdE1hcCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKEJpdE1hcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIEJNT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEJNT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBCTU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgQk1PYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgQk1PYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgQk1PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgQk1PYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEJNT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIEJNT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgQk1PYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBCaXRNYXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xNjA2LDU0ODUgKzE2MDYsNTQ4NSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdyYWZQdHIgcG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciBwb3J0OwogI2lmbmRlZiBHZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UG9ydCgmcG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFBvcnQoJnBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dyYWZEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgZGV2aWNlOwogI2lmbmRlZiBHcmFmRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhZkRldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhZkRldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCUdyYWZEZXZpY2UoZGV2aWNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHcmFmRGV2aWNlKGRldmljZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnRCaXRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCaXRNYXBQdHIgYm07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBibTsKICNpZm5kZWYgU2V0UG9ydEJpdHMKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0Qml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydEJpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmYm0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0Qml0cyhibSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmJtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydEJpdHMoYm0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Qb3J0U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgd2lkdGg7Ci0Jc2hvcnQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB3aWR0aDsKKyAgICBzaG9ydCBoZWlnaHQ7CiAjaWZuZGVmIFBvcnRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soUG9ydFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBvcnRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUG9ydFNpemUod2lkdGgsCi0JICAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQb3J0U2l6ZSh3aWR0aCwKKyAgICAgICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Nb3ZlUG9ydFRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsZWZ0R2xvYmFsOwotCXNob3J0IHRvcEdsb2JhbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbGVmdEdsb2JhbDsKKyAgICBzaG9ydCB0b3BHbG9iYWw7CiAjaWZuZGVmIE1vdmVQb3J0VG8KLQlQeU1hY19QUkVDSEVDSyhNb3ZlUG9ydFRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZlUG9ydFRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnRHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3BHbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlNb3ZlUG9ydFRvKGxlZnRHbG9iYWwsCi0JICAgICAgICAgICB0b3BHbG9iYWwpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wR2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTW92ZVBvcnRUbyhsZWZ0R2xvYmFsLAorICAgICAgICAgICAgICAgdG9wR2xvYmFsKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0T3JpZ2luKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgU2V0T3JpZ2luCi0JUHlNYWNfUFJFQ0hFQ0soU2V0T3JpZ2luKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRPcmlnaW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRPcmlnaW4oaCwKLQkgICAgICAgICAgdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0T3JpZ2luKGgsCisgICAgICAgICAgICAgIHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBTZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0Q2xpcChyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0Q2xpcChyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBHZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0Q2xpcChyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0Q2xpcChyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbGlwUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIENsaXBSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soQ2xpcFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKENsaXBSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGlwUmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGlwUmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0JhY2tQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBCYWNrUGF0Ci0JUHlNYWNfUFJFQ0hFQ0soQmFja1BhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmFja1BhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JQmFja1BhdChwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgQmFja1BhdChwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Jbml0Q3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEluaXRDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhJbml0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbml0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbml0Q3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbml0Q3Vyc29yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1NldEN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yICpjcnNyX19pbl9fOwotCWludCBjcnNyX19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc29yICpjcnNyX19pbl9fOworICAgIGludCBjcnNyX19pbl9sZW5fXzsKICNpZm5kZWYgTWFjU2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTWFjU2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmY3Jzcl9faW5fXywgJmNyc3JfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGNyc3JfX2luX2xlbl9fICE9IHNpemVvZihDdXJzb3IpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihDdXJzb3IpIik7Ci0JCWdvdG8gY3Jzcl9fZXJyb3JfXzsKLQl9Ci0JTWFjU2V0Q3Vyc29yKGNyc3JfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZjcnNyX19pbl9fLCAmY3Jzcl9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoY3Jzcl9faW5fbGVuX18gIT0gc2l6ZW9mKEN1cnNvcikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKEN1cnNvcikiKTsKKyAgICAgICAgZ290byBjcnNyX19lcnJvcl9fOworICAgIH0KKyAgICBNYWNTZXRDdXJzb3IoY3Jzcl9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIGNyc3JfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9IaWRlQ3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhIaWRlQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlQ3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlQ3Vyc29yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1Nob3dDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjU2hvd0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKE1hY1Nob3dDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1Nob3dDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY1Nob3dDdXJzb3IoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1Nob3dDdXJzb3IoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT2JzY3VyZUN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBPYnNjdXJlQ3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soT2JzY3VyZUN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soT2JzY3VyZUN1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JT2JzY3VyZUN1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgT2JzY3VyZUN1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9IaWRlUGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEhpZGVQZW4KLQlQeU1hY19QUkVDSEVDSyhIaWRlUGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlUGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWRlUGVuKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBIaWRlUGVuKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Nob3dQZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd1BlbgotCVB5TWFjX1BSRUNIRUNLKFNob3dQZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dQZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dQZW4oKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dQZW4oKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CiAjaWZuZGVmIEdldFBlbgotCVB5TWFjX1BSRUNIRUNLKEdldFBlbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGVuKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRQZW4oJnB0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGVuKCZwdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGVuU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBlblN0YXRlIHBuU3RhdGVfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQZW5TdGF0ZSBwblN0YXRlX19vdXRfXzsKICNpZm5kZWYgR2V0UGVuU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRQZW5TdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGVuU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBlblN0YXRlKCZwblN0YXRlX19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZwblN0YXRlX19vdXRfXywgKGludClzaXplb2YoUGVuU3RhdGUpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UGVuU3RhdGUoJnBuU3RhdGVfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnBuU3RhdGVfX291dF9fLCAoaW50KXNpemVvZihQZW5TdGF0ZSkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBlblN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQZW5TdGF0ZSAqcG5TdGF0ZV9faW5fXzsKLQlpbnQgcG5TdGF0ZV9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBlblN0YXRlICpwblN0YXRlX19pbl9fOworICAgIGludCBwblN0YXRlX19pbl9sZW5fXzsKICNpZm5kZWYgU2V0UGVuU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRQZW5TdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UGVuU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcG5TdGF0ZV9faW5fXywgJnBuU3RhdGVfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBuU3RhdGVfX2luX2xlbl9fICE9IHNpemVvZihQZW5TdGF0ZSkpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBlblN0YXRlKSIpOwotCQlnb3RvIHBuU3RhdGVfX2Vycm9yX187Ci0JfQotCVNldFBlblN0YXRlKHBuU3RhdGVfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwblN0YXRlX19pbl9fLCAmcG5TdGF0ZV9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocG5TdGF0ZV9faW5fbGVuX18gIT0gc2l6ZW9mKFBlblN0YXRlKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGVuU3RhdGUpIik7CisgICAgICAgIGdvdG8gcG5TdGF0ZV9fZXJyb3JfXzsKKyAgICB9CisgICAgU2V0UGVuU3RhdGUocG5TdGF0ZV9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBuU3RhdGVfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5TaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3aWR0aDsKLQlzaG9ydCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHdpZHRoOworICAgIHNob3J0IGhlaWdodDsKICNpZm5kZWYgUGVuU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFBlblNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5TaXplKHdpZHRoLAotCSAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5TaXplKHdpZHRoLAorICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5Nb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBQZW5Nb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUGVuTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGVuTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5Nb2RlKG1vZGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5Nb2RlKG1vZGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5QYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBQZW5QYXQKLQlQeU1hY19QUkVDSEVDSyhQZW5QYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JUGVuUGF0KHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBQZW5QYXQocGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGVuTm9ybWFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFBlbk5vcm1hbAotCVB5TWFjX1BSRUNIRUNLKFBlbk5vcm1hbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGVuTm9ybWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5Ob3JtYWwoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBlbk5vcm1hbCgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Nb3ZlVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBNb3ZlVG8KLQlQeU1hY19QUkVDSEVDSyhNb3ZlVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmVUbyhoLAotCSAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlVG8oaCwKKyAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01vdmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTW92ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU1vdmUoZGgsCi0JICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlKGRoLAorICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNMaW5lVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBNYWNMaW5lVG8KLQlQeU1hY19QUkVDSEVDSyhNYWNMaW5lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0xpbmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCU1hY0xpbmVUbyhoLAotCSAgICAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNMaW5lVG8oaCwKKyAgICAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xpbmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTGluZQotCVB5TWFjX1BSRUNIRUNLKExpbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKExpbmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCUxpbmUoZGgsCi0JICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMaW5lKGRoLAorICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Gb3JlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgY29sb3I7CiAjaWZuZGVmIEZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEZvcmVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlGb3JlQ29sb3IoY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRm9yZUNvbG9yKGNvbG9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQmFja0NvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGNvbG9yOwogI2lmbmRlZiBCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhCYWNrQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEJhY2tDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQmFja0NvbG9yKGNvbG9yKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJhY2tDb2xvcihjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvbG9yQml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3aGljaEJpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgd2hpY2hCaXQ7CiAjaWZuZGVmIENvbG9yQml0Ci0JUHlNYWNfUFJFQ0hFQ0soQ29sb3JCaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbG9yQml0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hCaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlDb2xvckJpdCh3aGljaEJpdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hCaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb2xvckJpdCh3aGljaEJpdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY1NldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIE1hY1NldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UmVjdCgmciwKLQkgICAgICAgICAgIGxlZnQsCi0JICAgICAgICAgICB0b3AsCi0JICAgICAgICAgICByaWdodCwKLQkgICAgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFJlY3QoJnIsCisgICAgICAgICAgICAgICBsZWZ0LAorICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICBib3R0b20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjT2Zmc2V0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE1hY09mZnNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNPZmZzZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNPZmZzZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNPZmZzZXRSZWN0KCZyLAotCSAgICAgICAgICAgICAgZGgsCi0JICAgICAgICAgICAgICBkdik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjT2Zmc2V0UmVjdCgmciwKKyAgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICAgZHYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjSW5zZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgTWFjSW5zZXRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjSW5zZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNJbnNldFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU1hY0luc2V0UmVjdCgmciwKLQkgICAgICAgICAgICAgZGgsCi0JICAgICAgICAgICAgIGR2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNJbnNldFJlY3QoJnIsCisgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICBkdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZWN0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCBzcmMxOwotCVJlY3Qgc3JjMjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3Qgc3JjMTsKKyAgICBSZWN0IHNyYzI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBTZWN0UmVjdAotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZWN0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU2VjdFJlY3QoJnNyYzEsCi0JICAgICAgICAgICAgICAgJnNyYzIsCi0JICAgICAgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU2VjdFJlY3QoJnNyYzEsCisgICAgICAgICAgICAgICAgICAgJnNyYzIsCisgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNVbmlvblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3Qgc3JjMTsKLQlSZWN0IHNyYzI7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHNyYzE7CisgICAgUmVjdCBzcmMyOworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFjVW5pb25SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjVW5pb25SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNVbmlvblJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCi0JCXJldHVybiBOVUxMOwotCU1hY1VuaW9uUmVjdCgmc3JjMSwKLQkgICAgICAgICAgICAgJnNyYzIsCi0JICAgICAgICAgICAgICZkc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNVbmlvblJlY3QoJnNyYzEsCisgICAgICAgICAgICAgICAgICZzcmMyLAorICAgICAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNFcXVhbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJlY3QgcmVjdDE7Ci0JUmVjdCByZWN0MjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmVjdCByZWN0MTsKKyAgICBSZWN0IHJlY3QyOwogI2lmbmRlZiBNYWNFcXVhbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNFcXVhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0VxdWFsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QxLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNFcXVhbFJlY3QoJnJlY3QxLAotCSAgICAgICAgICAgICAgICAgICAmcmVjdDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1hY0VxdWFsUmVjdCgmcmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICZyZWN0Mik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRW1wdHlSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgcjsKICNpZm5kZWYgRW1wdHlSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRW1wdHlSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbXB0eVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEVtcHR5UmVjdCgmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEVtcHR5UmVjdCgmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRnJhbWVSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgTWFjRnJhbWVSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRnJhbWVSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNGcmFtZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCU1hY0ZyYW1lUmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNGcmFtZVJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QYWludFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBQYWludFJlY3QKLQlQeU1hY19QUkVDSEVDSyhQYWludFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFBhaW50UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50UmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VyYXNlUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIEVyYXNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKEVyYXNlUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXJhc2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZVJlY3QoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VSZWN0KCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjSW52ZXJ0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIE1hY0ludmVydFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNJbnZlcnRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNJbnZlcnRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNJbnZlcnRSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0ludmVydFJlY3QoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGaWxsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgTWFjRmlsbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRmlsbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCU1hY0ZpbGxSZWN0KCZyLAotCSAgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBNYWNGaWxsUmVjdCgmciwKKyAgICAgICAgICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZU92YWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBGcmFtZU92YWwKLQlQeU1hY19QUkVDSEVDSyhGcmFtZU92YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVPdmFsKCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lT3ZhbCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50T3ZhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIFBhaW50T3ZhbAotCVB5TWFjX1BSRUNIRUNLKFBhaW50T3ZhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRPdmFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlQYWludE92YWwoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRPdmFsKCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXJhc2VPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgRXJhc2VPdmFsCi0JUHlNYWNfUFJFQ0hFQ0soRXJhc2VPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcmFzZU92YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlT3ZhbCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZU92YWwoJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnZlcnRPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKICNpZm5kZWYgSW52ZXJ0T3ZhbAotCVB5TWFjX1BSRUNIRUNLKEludmVydE92YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydE92YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCUludmVydE92YWwoJnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0T3ZhbCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsT3ZhbAotCVB5TWFjX1BSRUNIRUNLKEZpbGxPdmFsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbE92YWwoJnIsCi0JICAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxPdmFsKCZyLAorICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUm91bmRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgb3ZhbFdpZHRoOwotCXNob3J0IG92YWxIZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBvdmFsV2lkdGg7CisgICAgc2hvcnQgb3ZhbEhlaWdodDsKICNpZm5kZWYgRnJhbWVSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhGcmFtZVJvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJhbWVSb3VuZFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lUm91bmRSZWN0KCZyLAotCSAgICAgICAgICAgICAgIG92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICBvdmFsSGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBvdmFsSGVpZ2h0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRSb3VuZFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBvdmFsV2lkdGg7Ci0Jc2hvcnQgb3ZhbEhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IG92YWxXaWR0aDsKKyAgICBzaG9ydCBvdmFsSGVpZ2h0OwogI2lmbmRlZiBQYWludFJvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKFBhaW50Um91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFJvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSb3VuZFJlY3QoJnIsCi0JICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdmFsSGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRSb3VuZFJlY3QoJnIsCisgICAgICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgIG92YWxIZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVJvdW5kUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IG92YWxXaWR0aDsKLQlzaG9ydCBvdmFsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CiAjaWZuZGVmIEVyYXNlUm91bmRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRXJhc2VSb3VuZFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEVyYXNlUm91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZVJvdW5kUmVjdCgmciwKLQkgICAgICAgICAgICAgICBvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVJvdW5kUmVjdCgmciwKKyAgICAgICAgICAgICAgICAgICBvdmFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJvdW5kUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IG92YWxXaWR0aDsKLQlzaG9ydCBvdmFsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CiAjaWZuZGVmIEludmVydFJvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKEludmVydFJvdW5kUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0Um91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRSb3VuZFJlY3QoJnIsCi0JICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnZlcnRSb3VuZFJlY3QoJnIsCisgICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxSb3VuZFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBvdmFsV2lkdGg7Ci0Jc2hvcnQgb3ZhbEhlaWdodDsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBvdmFsV2lkdGg7CisgICAgc2hvcnQgb3ZhbEhlaWdodDsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxSb3VuZFJlY3QKLQlQeU1hY19QUkVDSEVDSyhGaWxsUm91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsUm91bmRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsUm91bmRSZWN0KCZyLAotCSAgICAgICAgICAgICAgb3ZhbFdpZHRoLAotCSAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBGaWxsUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lQXJjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgc3RhcnRBbmdsZTsKLQlzaG9ydCBhcmNBbmdsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CiAjaWZuZGVmIEZyYW1lQXJjCi0JUHlNYWNfUFJFQ0hFQ0soRnJhbWVBcmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lQXJjKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCi0JCXJldHVybiBOVUxMOwotCUZyYW1lQXJjKCZyLAotCSAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgYXJjQW5nbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGcmFtZUFyYygmciwKKyAgICAgICAgICAgICBzdGFydEFuZ2xlLAorICAgICAgICAgICAgIGFyY0FuZ2xlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgc3RhcnRBbmdsZTsKKyAgICBzaG9ydCBhcmNBbmdsZTsKICNpZm5kZWYgUGFpbnRBcmMKLQlQeU1hY19QUkVDSEVDSyhQYWludEFyYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRBcmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRBcmMoJnIsCi0JICAgICAgICAgc3RhcnRBbmdsZSwKLQkgICAgICAgICBhcmNBbmdsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50QXJjKCZyLAorICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgYXJjQW5nbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZUFyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IHN0YXJ0QW5nbGU7Ci0Jc2hvcnQgYXJjQW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOwogI2lmbmRlZiBFcmFzZUFyYwotCVB5TWFjX1BSRUNIRUNLKEVyYXNlQXJjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcmFzZUFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlFcmFzZUFyYygmciwKLQkgICAgICAgICBzdGFydEFuZ2xlLAotCSAgICAgICAgIGFyY0FuZ2xlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXJhc2VBcmMoJnIsCisgICAgICAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICBhcmNBbmdsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydEFyYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCXNob3J0IHN0YXJ0QW5nbGU7Ci0Jc2hvcnQgYXJjQW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBzdGFydEFuZ2xlOworICAgIHNob3J0IGFyY0FuZ2xlOwogI2lmbmRlZiBJbnZlcnRBcmMKLQlQeU1hY19QUkVDSEVDSyhJbnZlcnRBcmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydEFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRBcmMoJnIsCi0JICAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgIGFyY0FuZ2xlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyY0FuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0QXJjKCZyLAorICAgICAgICAgICAgICBzdGFydEFuZ2xlLAorICAgICAgICAgICAgICBhcmNBbmdsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CisgICAgUGF0dGVybiAqcGF0X19pbl9fOworICAgIGludCBwYXRfX2luX2xlbl9fOwogI2lmbmRlZiBGaWxsQXJjCi0JUHlNYWNfUFJFQ0hFQ0soRmlsbEFyYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbEFyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhocyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsQXJjKCZyLAotCSAgICAgICAgc3RhcnRBbmdsZSwKLQkgICAgICAgIGFyY0FuZ2xlLAotCSAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaHMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydEFuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJjQW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgRmlsbEFyYygmciwKKyAgICAgICAgc3RhcnRBbmdsZSwKKyAgICAgICAgYXJjQW5nbGUsCisgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX05ld1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgTmV3UmduCi0JUHlNYWNfUFJFQ0hFQ0soTmV3UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld1JnbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3UmduKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09wZW5SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgT3BlblJnbgotCVB5TWFjX1BSRUNIRUNLKE9wZW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU9wZW5SZ24oKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE9wZW5SZ24oKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ2xvc2VSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIENsb3NlUmduCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDbG9zZVJnbihkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VSZ24oZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQml0TWFwVG9SZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKLQlCaXRNYXBQdHIgYk1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIEJpdE1hcFB0ciBiTWFwOwogI2lmbmRlZiBCaXRNYXBUb1JlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEJpdE1hcFRvUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCaXRNYXBUb1JlZ2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZiTWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJpdE1hcFRvUmVnaW9uKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgYk1hcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmYk1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCaXRNYXBUb1JlZ2lvbihyZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJNYXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JnblRvSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCUhhbmRsZSBmbGF0dGVuZWRSZ25EYXRhSGRsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIEhhbmRsZSBmbGF0dGVuZWRSZ25EYXRhSGRsOwogI2lmbmRlZiBSZ25Ub0hhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFJnblRvSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZ25Ub0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZmxhdHRlbmVkUmduRGF0YUhkbCkpCi0JCXJldHVybiBOVUxMOwotCVJnblRvSGFuZGxlKHJlZ2lvbiwKLQkgICAgICAgICAgICBmbGF0dGVuZWRSZ25EYXRhSGRsKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmZsYXR0ZW5lZFJnbkRhdGFIZGwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZ25Ub0hhbmRsZShyZWdpb24sCisgICAgICAgICAgICAgICAgZmxhdHRlbmVkUmduRGF0YUhkbCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIERpc3Bvc2VSZ24KLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlUmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0NvcHlSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ247Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBNYWNDb3B5UmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjQ29weVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjQ29weVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjQ29weVJnbihzcmNSZ24sCi0JICAgICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjQ29weVJnbihzcmNSZ24sCisgICAgICAgICAgICAgICBkc3RSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRFbXB0eVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgU2V0RW1wdHlSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRFbXB0eVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0RW1wdHlSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCVNldEVtcHR5UmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRFbXB0eVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNTZXRSZWN0UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCXNob3J0IGxlZnQ7Ci0Jc2hvcnQgdG9wOwotCXNob3J0IHJpZ2h0OwotCXNob3J0IGJvdHRvbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIE1hY1NldFJlY3RSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNTZXRSZWN0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2V0UmVjdFJnbihyZ24sCi0JICAgICAgICAgICAgICBsZWZ0LAotCSAgICAgICAgICAgICAgdG9wLAotCSAgICAgICAgICAgICAgcmlnaHQsCi0JICAgICAgICAgICAgICBib3R0b20pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1NldFJlY3RSZ24ocmduLAorICAgICAgICAgICAgICAgICAgbGVmdCwKKyAgICAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgYm90dG9tKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgUmVjdCByOwogI2lmbmRlZiBSZWN0UmduCi0JUHlNYWNfUFJFQ0hFQ0soUmVjdFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVjdFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVjdFJnbihyZ24sCi0JICAgICAgICAmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZWN0UmduKHJnbiwKKyAgICAgICAgJnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNPZmZzZXRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE1hY09mZnNldFJnbgotCVB5TWFjX1BSRUNIRUNLKE1hY09mZnNldFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjT2Zmc2V0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNPZmZzZXRSZ24ocmduLAotCSAgICAgICAgICAgICBkaCwKLQkgICAgICAgICAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjT2Zmc2V0UmduKHJnbiwKKyAgICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5zZXRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIEluc2V0UmduCi0JUHlNYWNfUFJFQ0hFQ0soSW5zZXRSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2V0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHYpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnNldFJnbihyZ24sCi0JICAgICAgICAgZGgsCi0JICAgICAgICAgZHYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5zZXRSZ24ocmduLAorICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgIGR2KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2VjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgU2VjdFJnbgotCVB5TWFjX1BSRUNIRUNLKFNlY3RSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNlY3RSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VjdFJnbihzcmNSZ25BLAotCSAgICAgICAgc3JjUmduQiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNlY3RSZ24oc3JjUmduQSwKKyAgICAgICAgc3JjUmduQiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjVW5pb25SZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIE1hY1VuaW9uUmduCi0JUHlNYWNfUFJFQ0hFQ0soTWFjVW5pb25SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1VuaW9uUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY1VuaW9uUmduKHNyY1JnbkEsCi0JICAgICAgICAgICAgc3JjUmduQiwKLQkgICAgICAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNVbmlvblJnbihzcmNSZ25BLAorICAgICAgICAgICAgICAgIHNyY1JnbkIsCisgICAgICAgICAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlmZlJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgRGlmZlJnbgotCVB5TWFjX1BSRUNIRUNLKERpZmZSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKERpZmZSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlmZlJnbihzcmNSZ25BLAotCSAgICAgICAgc3JjUmduQiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpZmZSZ24oc3JjUmduQSwKKyAgICAgICAgc3JjUmduQiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjWG9yUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgc3JjUmduQTsKLQlSZ25IYW5kbGUgc3JjUmduQjsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgc3JjUmduQTsKKyAgICBSZ25IYW5kbGUgc3JjUmduQjsKKyAgICBSZ25IYW5kbGUgZHN0UmduOwogI2lmbmRlZiBNYWNYb3JSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNYb3JSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1hvclJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNYb3JSZ24oc3JjUmduQSwKLQkgICAgICAgICAgc3JjUmduQiwKLQkgICAgICAgICAgZHN0UmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFjWG9yUmduKHNyY1JnbkEsCisgICAgICAgICAgICAgIHNyY1JnbkIsCisgICAgICAgICAgICAgIGRzdFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JlY3RJblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCByOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFJlY3QgcjsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBSZWN0SW5SZ24KLQlQeU1hY19QUkVDSEVDSyhSZWN0SW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFJlY3RJblJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVjdEluUmduKCZyLAotCSAgICAgICAgICAgICAgICByZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWN0SW5SZ24oJnIsCisgICAgICAgICAgICAgICAgICAgIHJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRXF1YWxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJnbkhhbmRsZSByZ25BOwotCVJnbkhhbmRsZSByZ25COworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduQTsKKyAgICBSZ25IYW5kbGUgcmduQjsKICNpZm5kZWYgTWFjRXF1YWxSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNFcXVhbFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRXF1YWxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25CKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjRXF1YWxSZ24ocmduQSwKLQkgICAgICAgICAgICAgICAgICByZ25CKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbkIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNFcXVhbFJnbihyZ25BLAorICAgICAgICAgICAgICAgICAgICAgIHJnbkIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VtcHR5UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBFbXB0eVJnbgotCVB5TWFjX1BSRUNIRUNLKEVtcHR5UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhFbXB0eVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRW1wdHlSZ24ocmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRW1wdHlSZ24ocmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGcmFtZVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgTWFjRnJhbWVSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNGcmFtZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRnJhbWVSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY0ZyYW1lUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNGcmFtZVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNQYWludFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgTWFjUGFpbnRSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNQYWludFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjUGFpbnRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCU1hY1BhaW50UmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNQYWludFJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgRXJhc2VSZ24KLQlQeU1hY19QUkVDSEVDSyhFcmFzZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXJhc2VSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlUmduKHJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNJbnZlcnRSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIE1hY0ludmVydFJnbgotCVB5TWFjX1BSRUNIRUNLKE1hY0ludmVydFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjSW52ZXJ0UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNJbnZlcnRSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0ludmVydFJnbihyZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNGaWxsUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOwotCVBhdHRlcm4gKnBhdF9faW5fXzsKLQlpbnQgcGF0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIE1hY0ZpbGxSZ24KLQlQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNGaWxsUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlNYWNGaWxsUmduKHJnbiwKLQkgICAgICAgICAgIHBhdF9faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7CisgICAgICAgIGdvdG8gcGF0X19lcnJvcl9fOworICAgIH0KKyAgICBNYWNGaWxsUmduKHJnbiwKKyAgICAgICAgICAgICAgIHBhdF9faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIHBhdF9fZXJyb3JfXzogOwotCXJldHVybiBfcmVzOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1Njcm9sbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKLQlSZ25IYW5kbGUgdXBkYXRlUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgU2Nyb2xsUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNjcm9sbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjcm9sbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCi0JCXJldHVybiBOVUxMOwotCVNjcm9sbFJlY3QoJnIsCi0JICAgICAgICAgICBkaCwKLQkgICAgICAgICAgIGR2LAotCSAgICAgICAgICAgdXBkYXRlUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNjcm9sbFJlY3QoJnIsCisgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgIGR2LAorICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weUJpdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBkc3RCaXRzOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgQml0TWFwUHRyIGRzdEJpdHM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBDb3B5Qml0cwotCVB5TWFjX1BSRUNIRUNLKENvcHlCaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5Qml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weUJpdHMoc3JjQml0cywKLQkgICAgICAgICBkc3RCaXRzLAotCSAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICZkc3RSZWN0LAotCSAgICAgICAgIG1vZGUsCi0JICAgICAgICAgbWFza1Jnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZkc3RCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1hc2tSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5Qml0cyhzcmNCaXRzLAorICAgICAgICAgICAgIGRzdEJpdHMsCisgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgJmRzdFJlY3QsCisgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICBtYXNrUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weU1hc2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBtYXNrQml0czsKLQlCaXRNYXBQdHIgZHN0Qml0czsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBtYXNrUmVjdDsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcFB0ciBzcmNCaXRzOworICAgIEJpdE1hcFB0ciBtYXNrQml0czsKKyAgICBCaXRNYXBQdHIgZHN0Qml0czsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBtYXNrUmVjdDsKKyAgICBSZWN0IGRzdFJlY3Q7CiAjaWZuZGVmIENvcHlNYXNrCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlNYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZzcmNCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmbWFza0JpdHMsCi0JICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZkc3RCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1hc2tSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCUNvcHlNYXNrKHNyY0JpdHMsCi0JICAgICAgICAgbWFza0JpdHMsCi0JICAgICAgICAgZHN0Qml0cywKLQkgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAmbWFza1JlY3QsCi0JICAgICAgICAgJmRzdFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJm1hc2tCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZtYXNrUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5TWFzayhzcmNCaXRzLAorICAgICAgICAgICAgIG1hc2tCaXRzLAorICAgICAgICAgICAgIGRzdEJpdHMsCisgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgJm1hc2tSZWN0LAorICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT3BlblBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7Ci0JUmVjdCBwaWNGcmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBSZWN0IHBpY0ZyYW1lOwogI2lmbmRlZiBPcGVuUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKE9wZW5QaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcGVuUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZwaWNGcmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5QaWN0dXJlKCZwaWNGcmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnBpY0ZyYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT3BlblBpY3R1cmUoJnBpY0ZyYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGljQ29tbWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQga2luZDsKLQlzaG9ydCBkYXRhU2l6ZTsKLQlIYW5kbGUgZGF0YUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQga2luZDsKKyAgICBzaG9ydCBkYXRhU2l6ZTsKKyAgICBIYW5kbGUgZGF0YUhhbmRsZTsKICNpZm5kZWYgUGljQ29tbWVudAotCVB5TWFjX1BSRUNIRUNLKFBpY0NvbW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBpY0NvbW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZraW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVBpY0NvbW1lbnQoa2luZCwKLQkgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgZGF0YUhhbmRsZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQaWNDb21tZW50KGtpbmQsCisgICAgICAgICAgICAgICBkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgIGRhdGFIYW5kbGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbG9zZVBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xvc2VQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZVBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUGljdHVyZSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VQaWN0dXJlKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RyYXdQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgbXlQaWN0dXJlOwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIG15UGljdHVyZTsKKyAgICBSZWN0IGRzdFJlY3Q7CiAjaWZuZGVmIERyYXdQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYXdQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm15UGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmF3UGljdHVyZShteVBpY3R1cmUsCi0JICAgICAgICAgICAgJmRzdFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteVBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd1BpY3R1cmUobXlQaWN0dXJlLAorICAgICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfS2lsbFBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBteVBpY3R1cmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBteVBpY3R1cmU7CiAjaWZuZGVmIEtpbGxQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soS2lsbFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEtpbGxQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteVBpY3R1cmUpKQotCQlyZXR1cm4gTlVMTDsKLQlLaWxsUGljdHVyZShteVBpY3R1cmUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlQaWN0dXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgS2lsbFBpY3R1cmUobXlQaWN0dXJlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT3BlblBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIF9ydjsKICNpZm5kZWYgT3BlblBvbHkKLQlQeU1hY19QUkVDSEVDSyhPcGVuUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3BlblBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5Qb2x5KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBPcGVuUG9seSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DbG9zZVBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xvc2VQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soQ2xvc2VQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9zZVBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUG9seSgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xvc2VQb2x5KCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0tpbGxQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKICNpZm5kZWYgS2lsbFBvbHkKLQlQeU1hY19QUkVDSEVDSyhLaWxsUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soS2lsbFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlLaWxsUG9seShwb2x5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBLaWxsUG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfT2Zmc2V0UG9seShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9seUhhbmRsZSBwb2x5OwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CisgICAgc2hvcnQgZGg7CisgICAgc2hvcnQgZHY7CiAjaWZuZGVmIE9mZnNldFBvbHkKLQlQeU1hY19QUkVDSEVDSyhPZmZzZXRQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhPZmZzZXRQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JT2Zmc2V0UG9seShwb2x5LAotCSAgICAgICAgICAgZGgsCi0JICAgICAgICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgT2Zmc2V0UG9seShwb2x5LAorICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICBkdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUG9seShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9seUhhbmRsZSBwb2x5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CiAjaWZuZGVmIEZyYW1lUG9seQotCVB5TWFjX1BSRUNIRUNLKEZyYW1lUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJhbWVQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVQb2x5KHBvbHkpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUGFpbnRQb2x5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2x5SGFuZGxlIHBvbHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKICNpZm5kZWYgUGFpbnRQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soUGFpbnRQb2x5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQotCQlyZXR1cm4gTlVMTDsKLQlQYWludFBvbHkocG9seSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGFpbnRQb2x5KHBvbHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9FcmFzZVBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OwogI2lmbmRlZiBFcmFzZVBvbHkKLQlQeU1hY19QUkVDSEVDSyhFcmFzZVBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEVyYXNlUG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCi0JCXJldHVybiBOVUxMOwotCUVyYXNlUG9seShwb2x5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFcmFzZVBvbHkocG9seSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9seUhhbmRsZSBwb2x5OwogI2lmbmRlZiBJbnZlcnRQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UG9seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG9seSkpCi0JCXJldHVybiBOVUxMOwotCUludmVydFBvbHkocG9seSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0UG9seShwb2x5KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxQb2x5Ci0JUHlNYWNfUFJFQ0hFQ0soRmlsbFBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOwotCQlnb3RvIHBhdF9fZXJyb3JfXzsKLQl9Ci0JRmlsbFBvbHkocG9seSwKLQkgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxQb2x5KHBvbHksCisgICAgICAgICAgICAgcGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0UHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBTZXRQdAotCVB5TWFjX1BSRUNIRUNLKFNldFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCVNldFB0KCZwdCwKLQkgICAgICBoLAotCSAgICAgIHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UHQoJnB0LAorICAgICAgICAgIGgsCisgICAgICAgICAgdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTG9jYWxUb0dsb2JhbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0OwogI2lmbmRlZiBMb2NhbFRvR2xvYmFsCi0JUHlNYWNfUFJFQ0hFQ0soTG9jYWxUb0dsb2JhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTG9jYWxUb0dsb2JhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQotCQlyZXR1cm4gTlVMTDsKLQlMb2NhbFRvR2xvYmFsKCZwdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTG9jYWxUb0dsb2JhbCgmcHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dsb2JhbFRvTG9jYWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKICNpZm5kZWYgR2xvYmFsVG9Mb2NhbAotCVB5TWFjX1BSRUNIRUNLKEdsb2JhbFRvTG9jYWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdsb2JhbFRvTG9jYWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2xvYmFsVG9Mb2NhbCgmcHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdsb2JhbFRvTG9jYWwoJnB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHB0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9SYW5kb20oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBSYW5kb20KLQlQeU1hY19QUkVDSEVDSyhSYW5kb20pOworICAgIFB5TWFjX1BSRUNIRUNLKFJhbmRvbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmFuZG9tKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJhbmRvbSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hY0dldFBpeGVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlzaG9ydCBoOwotCXNob3J0IHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKICNpZm5kZWYgTWFjR2V0UGl4ZWwKLQlQeU1hY19QUkVDSEVDSyhNYWNHZXRQaXhlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjR2V0UGl4ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXRQaXhlbChoLAotCSAgICAgICAgICAgICAgICAgIHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0UGl4ZWwoaCwKKyAgICAgICAgICAgICAgICAgICAgICB2KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TY2FsZVB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBTY2FsZVB0Ci0JUHlNYWNfUFJFQ0hFQ0soU2NhbGVQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTY2FsZVB0KCZwdCwKLQkgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNjYWxlUHQoJnB0LAorICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hcFB0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQb2ludCBwdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBQdAotCVB5TWFjX1BSRUNIRUNLKE1hcFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYXBQdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlNYXBQdCgmcHQsCi0JICAgICAgJnNyY1JlY3QsCi0JICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcHQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFB0KCZwdCwKKyAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBwdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFwUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFwUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFwUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFwUmVjdCgmciwKLQkgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFJlY3QoJnIsCisgICAgICAgICZzcmNSZWN0LAorICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYXBSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBNYXBSZ24KLQlQeU1hY19QUkVDSEVDSyhNYXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1hcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFwUmduKHJnbiwKLQkgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICZkc3RSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hcFJnbihyZ24sCisgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX01hcFBvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQb2x5SGFuZGxlIHBvbHk7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKICNpZm5kZWYgTWFwUG9seQotCVB5TWFjX1BSRUNIRUNLKE1hcFBvbHkpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hcFBvbHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlNYXBQb2x5KHBvbHksCi0JICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICZkc3RSZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYXBQb2x5KHBvbHksCisgICAgICAgICZzcmNSZWN0LAorICAgICAgICAmZHN0UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1N0ZEJpdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCVJlY3Qgc3JjUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBTdGRCaXRzCi0JUHlNYWNfUFJFQ0hFQ0soU3RkQml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RkQml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RkQml0cyhzcmNCaXRzLAotCSAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAmZHN0UmVjdCwKLQkgICAgICAgIG1vZGUsCi0JICAgICAgICBtYXNrUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmbWFza1JnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN0ZEJpdHMoc3JjQml0cywKKyAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICZkc3RSZWN0LAorICAgICAgICBtb2RlLAorICAgICAgICBtYXNrUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQWRkUHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHNyYzsKLQlQb2ludCBkc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHNyYzsKKyAgICBQb2ludCBkc3Q7CiAjaWZuZGVmIEFkZFB0Ci0JUHlNYWNfUFJFQ0hFQ0soQWRkUHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkc3QpKQotCQlyZXR1cm4gTlVMTDsKLQlBZGRQdChzcmMsCi0JICAgICAgJmRzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBZGRQdChzcmMsCisgICAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VxdWFsUHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0MTsKLQlQb2ludCBwdDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0MTsKKyAgICBQb2ludCBwdDI7CiAjaWZuZGVmIEVxdWFsUHQKLQlQeU1hY19QUkVDSEVDSyhFcXVhbFB0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhFcXVhbFB0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBFcXVhbFB0KHB0MSwKLQkgICAgICAgICAgICAgIHB0Mik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0MikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEVxdWFsUHQocHQxLAorICAgICAgICAgICAgICAgICAgcHQyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNQdEluUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQb2ludCBwdDsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIE1hY1B0SW5SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjUHRJblJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY1B0SW5SZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1hY1B0SW5SZWN0KHB0LAotCSAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNQdEluUmVjdChwdCwKKyAgICAgICAgICAgICAgICAgICAgICAmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHQyUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgcHQxOwotCVBvaW50IHB0MjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHB0MTsKKyAgICBQb2ludCBwdDI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBQdDJSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soUHQyUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHQyUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHQyUmVjdChwdDEsCi0JICAgICAgICBwdDIsCi0JICAgICAgICAmZHN0UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkc3RSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHQyUmVjdChwdDEsCisgICAgICAgIHB0MiwKKyAgICAgICAgJmRzdFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRUb0FuZ2xlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUG9pbnQgcHQ7Ci0Jc2hvcnQgYW5nbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQb2ludCBwdDsKKyAgICBzaG9ydCBhbmdsZTsKICNpZm5kZWYgUHRUb0FuZ2xlCi0JUHlNYWNfUFJFQ0hFQ0soUHRUb0FuZ2xlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdFRvQW5nbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHRUb0FuZ2xlKCZyLAotCSAgICAgICAgICBwdCwKLQkgICAgICAgICAgJmFuZ2xlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgYW5nbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB0VG9BbmdsZSgmciwKKyAgICAgICAgICAgICAgcHQsCisgICAgICAgICAgICAgICZhbmdsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TdWJQdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgc3JjOwotCVBvaW50IGRzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgc3JjOworICAgIFBvaW50IGRzdDsKICNpZm5kZWYgU3ViUHQKLQlQeU1hY19QUkVDSEVDSyhTdWJQdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ViUHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRzdCkpCi0JCXJldHVybiBOVUxMOwotCVN1YlB0KHNyYywKLQkgICAgICAmZHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN1YlB0KHNyYywKKyAgICAgICAgICAmZHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRJblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgUHRJblJnbgotCVB5TWFjX1BSRUNIRUNLKFB0SW5SZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHRJblJnbihwdCwKLQkgICAgICAgICAgICAgIHJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblJnbihwdCwKKyAgICAgICAgICAgICAgICAgIHJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTmV3UGl4TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgX3J2OwogI2lmbmRlZiBOZXdQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhOZXdQaXhNYXApOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1BpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3UGl4TWFwKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdQaXhNYXAoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlzcG9zZVBpeE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIERpc3Bvc2VQaXhNYXAKLQlQeU1hY19QUkVDSEVDSyhEaXNwb3NlUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlUGl4TWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VQaXhNYXAocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlUGl4TWFwKHBtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weVBpeE1hcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHNyY1BNOwotCVBpeE1hcEhhbmRsZSBkc3RQTTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHNyY1BNOworICAgIFBpeE1hcEhhbmRsZSBkc3RQTTsKICNpZm5kZWYgQ29weVBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKENvcHlQaXhNYXApOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUE0sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UE0pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5UGl4TWFwKHNyY1BNLAotCSAgICAgICAgICAgZHN0UE0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RQTSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvcHlQaXhNYXAoc3JjUE0sCisgICAgICAgICAgICAgICBkc3RQTSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX05ld1BpeFBhdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIF9ydjsKICNpZm5kZWYgTmV3UGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soTmV3UGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld1BpeFBhdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3UGl4UGF0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBEaXNwb3NlUGl4UGF0Ci0JUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlUGl4UGF0KHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGlzcG9zZVBpeFBhdChwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NvcHlQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBzcmNQUDsKLQlQaXhQYXRIYW5kbGUgZHN0UFA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBzcmNQUDsKKyAgICBQaXhQYXRIYW5kbGUgZHN0UFA7CiAjaWZuZGVmIENvcHlQaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhDb3B5UGl4UGF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5UGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BQLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBQKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29weVBpeFBhdChzcmNQUCwKLQkgICAgICAgICAgIGRzdFBQKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UFApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5UGl4UGF0KHNyY1BQLAorICAgICAgICAgICAgICAgZHN0UFApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9QZW5QaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBQZW5QaXhQYXQKLQlQeU1hY19QUkVDSEVDSyhQZW5QaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFBlblBpeFBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlQZW5QaXhQYXQocHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQZW5QaXhQYXQocHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9CYWNrUGl4UGF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcDsKICNpZm5kZWYgQmFja1BpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEJhY2tQaXhQYXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEJhY2tQaXhQYXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQmFja1BpeFBhdChwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEJhY2tQaXhQYXQocHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaXhQYXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeFBhdEhhbmRsZSBfcnY7Ci0Jc2hvcnQgcGF0SUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBfcnY7CisgICAgc2hvcnQgcGF0SUQ7CiAjaWZuZGVmIEdldFBpeFBhdAotCVB5TWFjX1BSRUNIRUNLKEdldFBpeFBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGl4UGF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhQYXQocGF0SUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdElEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4UGF0KHBhdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFrZVJHQlBhdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIHBwOwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcDsKKyAgICBSR0JDb2xvciBteUNvbG9yOwogI2lmbmRlZiBNYWtlUkdCUGF0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFrZVJHQlBhdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFrZVJHQlBhdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWtlUkdCUGF0KHBwLAotCSAgICAgICAgICAgJm15Q29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWtlUkdCUGF0KHBwLAorICAgICAgICAgICAgICAgJm15Q29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQaXhQYXRIYW5kbGUgcHA7CiAjaWZuZGVmIEZpbGxDUmVjdAotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCi0JCXJldHVybiBOVUxMOwotCUZpbGxDUmVjdCgmciwKLQkgICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGaWxsQ1JlY3QoJnIsCisgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENPdmFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ092YWwKLQlQeU1hY19QUkVDSEVDSyhGaWxsQ092YWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxDT3ZhbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ092YWwoJnIsCi0JICAgICAgICAgIHBwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmlsbENPdmFsKCZyLAorICAgICAgICAgICAgICBwcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxDUm91bmRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgb3ZhbFdpZHRoOwotCXNob3J0IG92YWxIZWlnaHQ7Ci0JUGl4UGF0SGFuZGxlIHBwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHI7CisgICAgc2hvcnQgb3ZhbFdpZHRoOworICAgIHNob3J0IG92YWxIZWlnaHQ7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ1JvdW5kUmVjdAotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUm91bmRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ1JvdW5kUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm92YWxIZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1JvdW5kUmVjdCgmciwKLQkgICAgICAgICAgICAgICBvdmFsV2lkdGgsCi0JICAgICAgICAgICAgICAgb3ZhbEhlaWdodCwKLQkgICAgICAgICAgICAgICBwcCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3ZhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZpbGxDUm91bmRSZWN0KCZyLAorICAgICAgICAgICAgICAgICAgIG92YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICBvdmFsSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbENBcmMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBzdGFydEFuZ2xlOwotCXNob3J0IGFyY0FuZ2xlOwotCVBpeFBhdEhhbmRsZSBwcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IHN0YXJ0QW5nbGU7CisgICAgc2hvcnQgYXJjQW5nbGU7CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ0FyYwotCVB5TWFjX1BSRUNIRUNLKEZpbGxDQXJjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ0FyYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCi0JCXJldHVybiBOVUxMOwotCUZpbGxDQXJjKCZyLAotCSAgICAgICAgIHN0YXJ0QW5nbGUsCi0JICAgICAgICAgYXJjQW5nbGUsCi0JICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmNBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZpbGxDQXJjKCZyLAorICAgICAgICAgICAgIHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgYXJjQW5nbGUsCisgICAgICAgICAgICAgcHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgUGl4UGF0SGFuZGxlIHBwOwogI2lmbmRlZiBGaWxsQ1JnbgotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaWxsQ1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1JnbihyZ24sCi0JICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGaWxsQ1JnbihyZ24sCisgICAgICAgICAgICAgcHApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GaWxsQ1BvbHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvbHlIYW5kbGUgcG9seTsKLQlQaXhQYXRIYW5kbGUgcHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvbHlIYW5kbGUgcG9seTsKKyAgICBQaXhQYXRIYW5kbGUgcHA7CiAjaWZuZGVmIEZpbGxDUG9seQotCVB5TWFjX1BSRUNIRUNLKEZpbGxDUG9seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmlsbENQb2x5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBvbHksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHApKQotCQlyZXR1cm4gTlVMTDsKLQlGaWxsQ1BvbHkocG9seSwKLQkgICAgICAgICAgcHApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmlsbENQb2x5KHBvbHksCisgICAgICAgICAgICAgIHBwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUkdCRm9yZUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFJHQkZvcmVDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFJHQkZvcmVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUkdCRm9yZUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUkdCRm9yZUNvbG9yKCZjb2xvcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUkdCRm9yZUNvbG9yKCZjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1JHQkJhY2tDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGNvbG9yOwogI2lmbmRlZiBSR0JCYWNrQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhSR0JCYWNrQ29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFJHQkJhY2tDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCi0JCXJldHVybiBOVUxMOwotCVJHQkJhY2tDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFJHQkJhY2tDb2xvcigmY29sb3IpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDUGl4ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKLQlSR0JDb2xvciBjUGl4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CisgICAgUkdCQ29sb3IgY1BpeDsKICNpZm5kZWYgU2V0Q1BpeGVsCi0JUHlNYWNfUFJFQ0hFQ0soU2V0Q1BpeGVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDUGl4ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNQaXgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRDUGl4ZWwoaCwKLQkgICAgICAgICAgdiwKLQkgICAgICAgICAgJmNQaXgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY1BpeCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENQaXhlbChoLAorICAgICAgICAgICAgICB2LAorICAgICAgICAgICAgICAmY1BpeCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnRQaXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBTZXRQb3J0UGl4Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBpeCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFBpeCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0UGl4KHBtKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFBpeChwbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldENQaXhlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaDsKLQlzaG9ydCB2OwotCVJHQkNvbG9yIGNQaXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGg7CisgICAgc2hvcnQgdjsKKyAgICBSR0JDb2xvciBjUGl4OwogI2lmbmRlZiBHZXRDUGl4ZWwKLQlQeU1hY19QUkVDSEVDSyhHZXRDUGl4ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENQaXhlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCUdldENQaXhlbChoLAotCSAgICAgICAgICB2LAotCSAgICAgICAgICAmY1BpeCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjUGl4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldENQaXhlbChoLAorICAgICAgICAgICAgICB2LAorICAgICAgICAgICAgICAmY1BpeCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjUGl4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRGb3JlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0Rm9yZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rm9yZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldEZvcmVDb2xvcigmY29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb3JlQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRCYWNrQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgR2V0QmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRCYWNrQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldEJhY2tDb2xvcigmY29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmY29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRCYWNrQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9PcENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIE9wQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhPcENvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPcENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JT3BDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE9wQ29sb3IoJmNvbG9yKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSGlsaXRlQ29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIGNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSR0JDb2xvciBjb2xvcjsKICNpZm5kZWYgSGlsaXRlQ29sb3IKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlsaXRlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVDb2xvcigmY29sb3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZUNvbG9yKCZjb2xvcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0Rpc3Bvc2VDVGFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNUYWJIYW5kbGUgY1RhYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIGNUYWJsZTsKICNpZm5kZWYgRGlzcG9zZUNUYWJsZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJsZSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VDVGFibGUoY1RhYmxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDVGFibGUoY1RhYmxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Q1RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDVGFiSGFuZGxlIF9ydjsKLQlzaG9ydCBjdElEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdElEOwogI2lmbmRlZiBHZXRDVGFibGUKLQlQeU1hY19QUkVDSEVDSyhHZXRDVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmN0SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDVGFibGUoY3RJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENUYWJsZShjdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Q0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0Nyc3JIYW5kbGUgX3J2OwotCXNob3J0IGNyc3JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0Nyc3JIYW5kbGUgX3J2OworICAgIHNob3J0IGNyc3JJRDsKICNpZm5kZWYgR2V0Q0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKEdldENDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcnNySUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRDQ3Vyc29yKGNyc3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JzcklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0Q0N1cnNvcihjcnNySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDQ3Vyc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDQ3JzckhhbmRsZSBjQ3JzcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0Nyc3JIYW5kbGUgY0Nyc3I7CiAjaWZuZGVmIFNldENDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhTZXRDQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRDQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjQ3JzcikpCi0JCXJldHVybiBOVUxMOwotCVNldENDdXJzb3IoY0Nyc3IpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY0Nyc3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRDQ3Vyc29yKGNDcnNyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQWxsb2NDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQWxsb2NDdXJzb3IKLQlQeU1hY19QUkVDSEVDSyhBbGxvY0N1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWxsb2NDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUFsbG9jQ3Vyc29yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBbGxvY0N1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EaXNwb3NlQ0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0Nyc3JIYW5kbGUgY0Nyc3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENDcnNySGFuZGxlIGNDcnNyOwogI2lmbmRlZiBEaXNwb3NlQ0N1cnNvcgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VDQ3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlQ0N1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY0Nyc3IpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlQ0N1cnNvcihjQ3Jzcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjQ3JzcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VDQ3Vyc29yKGNDcnNyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0TWF4RGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7Ci0JUmVjdCBnbG9iYWxSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CisgICAgUmVjdCBnbG9iYWxSZWN0OwogI2lmbmRlZiBHZXRNYXhEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1heERldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWF4RGV2aWNlKCZnbG9iYWxSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1heERldmljZSgmZ2xvYmFsUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldENUU2VlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRDVFNlZWQKLQlQeU1hY19QUkVDSEVDSyhHZXRDVFNlZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldENUU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0Q1RTZWVkKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldENUU2VlZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldERldmljZUxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXREZXZpY2VMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0RGV2aWNlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGV2aWNlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGV2aWNlTGlzdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RGV2aWNlTGlzdCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRNYWluRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TWFpbkRldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldE1haW5EZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1haW5EZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1haW5EZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1haW5EZXZpY2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0TmV4dERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OwotCUdESGFuZGxlIGN1ckRldmljZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OworICAgIEdESGFuZGxlIGN1ckRldmljZTsKICNpZm5kZWYgR2V0TmV4dERldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHREZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHREZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN1ckRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHREZXZpY2UoY3VyRGV2aWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN1ckRldmljZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHREZXZpY2UoY3VyRGV2aWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfVGVzdERldmljZUF0dHJpYnV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JR0RIYW5kbGUgZ2RoOwotCXNob3J0IGF0dHJpYnV0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIHNob3J0IGF0dHJpYnV0ZTsKICNpZm5kZWYgVGVzdERldmljZUF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKFRlc3REZXZpY2VBdHRyaWJ1dGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRlc3REZXZpY2VBdHRyaWJ1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXN0RGV2aWNlQXR0cmlidXRlKGdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXN0RGV2aWNlQXR0cmlidXRlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0RGV2aWNlQXR0cmlidXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBnZGg7Ci0Jc2hvcnQgYXR0cmlidXRlOwotCUJvb2xlYW4gdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBzaG9ydCBhdHRyaWJ1dGU7CisgICAgQm9vbGVhbiB2YWx1ZTsKICNpZm5kZWYgU2V0RGV2aWNlQXR0cmlidXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0RGV2aWNlQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXREZXZpY2VBdHRyaWJ1dGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXREZXZpY2VBdHRyaWJ1dGUoZ2RoLAotCSAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsCi0JICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXREZXZpY2VBdHRyaWJ1dGUoZ2RoLAorICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW5pdEdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHFkUmVmTnVtOwotCWxvbmcgbW9kZTsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHFkUmVmTnVtOworICAgIGxvbmcgbW9kZTsKKyAgICBHREhhbmRsZSBnZGg7CiAjaWZuZGVmIEluaXRHRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soSW5pdEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEluaXRHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcWRSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCkpCi0JCXJldHVybiBOVUxMOwotCUluaXRHRGV2aWNlKHFkUmVmTnVtLAotCSAgICAgICAgICAgIG1vZGUsCi0JICAgICAgICAgICAgZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxZFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW5pdEdEZXZpY2UocWRSZWZOdW0sCisgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICBnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9OZXdHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7Ci0Jc2hvcnQgcmVmTnVtOwotCWxvbmcgbW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OworICAgIHNob3J0IHJlZk51bTsKKyAgICBsb25nIG1vZGU7CiAjaWZuZGVmIE5ld0dEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhOZXdHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdHRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdHRGV2aWNlKHJlZk51bSwKLQkgICAgICAgICAgICAgICAgIG1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3R0RldmljZShyZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICBtb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGlzcG9zZUdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBEaXNwb3NlR0RldmljZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNwb3NlR0RldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRGlzcG9zZUdEZXZpY2UoZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VHRGV2aWNlKGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldEdEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBnZDsKICNpZm5kZWYgU2V0R0RldmljZQotCVB5TWFjX1BSRUNIRUNLKFNldEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmdkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0R0RldmljZShnZCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZnZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEdEZXZpY2UoZ2QpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R0RldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldEdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdEZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdEZXZpY2UoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29sb3IySW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFJHQkNvbG9yIG15Q29sb3I7CiAjaWZuZGVmIENvbG9yMkluZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soQ29sb3IySW5kZXgpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbG9yMkluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm15Q29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb2xvcjJJbmRleCgmbXlDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmbXlDb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENvbG9yMkluZGV4KCZteUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbmRleDJDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBpbmRleDsKLQlSR0JDb2xvciBhQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgaW5kZXg7CisgICAgUkdCQ29sb3IgYUNvbG9yOwogI2lmbmRlZiBJbmRleDJDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEluZGV4MkNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbmRleDJDb2xvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5kZXgyQ29sb3IoaW5kZXgsCi0JICAgICAgICAgICAgJmFDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZhQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbmRleDJDb2xvcihpbmRleCwKKyAgICAgICAgICAgICAgICAmYUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmFDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSW52ZXJ0Q29sb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJHQkNvbG9yIG15Q29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIG15Q29sb3I7CiAjaWZuZGVmIEludmVydENvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmVydENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlJbnZlcnRDb2xvcigmbXlDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZteUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0Q29sb3IoJm15Q29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmbXlDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVhbENvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlSR0JDb2xvciBjb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFJlYWxDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFJlYWxDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVhbENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUmVhbENvbG9yKCZjb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9Db252ZXJ0LCAmY29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBSZWFsQ29sb3IoJmNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRTdWJUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ1RhYkhhbmRsZSBteUNvbG9yczsKLQlzaG9ydCBpVGFiUmVzOwotCUNUYWJIYW5kbGUgdGFyZ2V0VGJsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDVGFiSGFuZGxlIG15Q29sb3JzOworICAgIHNob3J0IGlUYWJSZXM7CisgICAgQ1RhYkhhbmRsZSB0YXJnZXRUYmw7CiAjaWZuZGVmIEdldFN1YlRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0U3ViVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFN1YlRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZteUNvbG9ycywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlUYWJSZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGFyZ2V0VGJsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0U3ViVGFibGUobXlDb2xvcnMsCi0JICAgICAgICAgICAgaVRhYlJlcywKLQkgICAgICAgICAgICB0YXJnZXRUYmwpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbXlDb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpVGFiUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldFRibCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFN1YlRhYmxlKG15Q29sb3JzLAorICAgICAgICAgICAgICAgIGlUYWJSZXMsCisgICAgICAgICAgICAgICAgdGFyZ2V0VGJsKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFrZUlUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ1RhYkhhbmRsZSBjVGFiSDsKLQlJVGFiSGFuZGxlIGlUYWJIOwotCXNob3J0IHJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBjVGFiSDsKKyAgICBJVGFiSGFuZGxlIGlUYWJIOworICAgIHNob3J0IHJlczsKICNpZm5kZWYgTWFrZUlUYWJsZQotCVB5TWFjX1BSRUNIRUNLKE1ha2VJVGFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1ha2VJVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJILAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlUYWJILAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFrZUlUYWJsZShjVGFiSCwKLQkgICAgICAgICAgIGlUYWJILAotCSAgICAgICAgICAgcmVzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNUYWJILAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlUYWJILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTWFrZUlUYWJsZShjVGFiSCwKKyAgICAgICAgICAgICAgIGlUYWJILAorICAgICAgICAgICAgICAgcmVzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0Q2xpZW50SUQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgU2V0Q2xpZW50SUQKLQlQeU1hY19QUkVDSEVDSyhTZXRDbGllbnRJRCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q2xpZW50SUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZCkpCi0JCXJldHVybiBOVUxMOwotCVNldENsaWVudElEKGlkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldENsaWVudElEKGlkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHJvdGVjdEVudHJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbmRleDsKLQlCb29sZWFuIHByb3RlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGluZGV4OworICAgIEJvb2xlYW4gcHJvdGVjdDsKICNpZm5kZWYgUHJvdGVjdEVudHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soUHJvdGVjdEVudHJ5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcm90ZWN0RW50cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUHJvdGVjdEVudHJ5KGluZGV4LAotCSAgICAgICAgICAgICBwcm90ZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm90ZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHJvdGVjdEVudHJ5KGluZGV4LAorICAgICAgICAgICAgICAgICBwcm90ZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmVzZXJ2ZUVudHJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbmRleDsKLQlCb29sZWFuIHJlc2VydmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGluZGV4OworICAgIEJvb2xlYW4gcmVzZXJ2ZTsKICNpZm5kZWYgUmVzZXJ2ZUVudHJ5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVzZXJ2ZUVudHJ5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNlcnZlRW50cnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNlcnZlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVzZXJ2ZUVudHJ5KGluZGV4LAotCSAgICAgICAgICAgICByZXNlcnZlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNlcnZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmVzZXJ2ZUVudHJ5KGluZGV4LAorICAgICAgICAgICAgICAgICByZXNlcnZlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUURFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIFFERXJyb3IKLQlQeU1hY19QUkVDSEVDSyhRREVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRREVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRREVycm9yKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFERXJyb3IoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Db3B5RGVlcE1hc2soUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJpdE1hcFB0ciBzcmNCaXRzOwotCUJpdE1hcFB0ciBtYXNrQml0czsKLQlCaXRNYXBQdHIgZHN0Qml0czsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBtYXNrUmVjdDsKLQlSZWN0IGRzdFJlY3Q7Ci0Jc2hvcnQgbW9kZTsKLQlSZ25IYW5kbGUgbWFza1JnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQml0TWFwUHRyIHNyY0JpdHM7CisgICAgQml0TWFwUHRyIG1hc2tCaXRzOworICAgIEJpdE1hcFB0ciBkc3RCaXRzOworICAgIFJlY3Qgc3JjUmVjdDsKKyAgICBSZWN0IG1hc2tSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrUmduOwogI2lmbmRlZiBDb3B5RGVlcE1hc2sKLQlQeU1hY19QUkVDSEVDSyhDb3B5RGVlcE1hc2spOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlEZWVwTWFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmc3JjQml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJm1hc2tCaXRzLAotCSAgICAgICAgICAgICAgICAgICAgICBCTU9ial9Db252ZXJ0LCAmZHN0Qml0cywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZtYXNrUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJm1hc2tSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5RGVlcE1hc2soc3JjQml0cywKLQkgICAgICAgICAgICAgbWFza0JpdHMsCi0JICAgICAgICAgICAgIGRzdEJpdHMsCi0JICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAmbWFza1JlY3QsCi0JICAgICAgICAgICAgICZkc3RSZWN0LAotCSAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICBtYXNrUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJnNyY0JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJNT2JqX0NvbnZlcnQsICZtYXNrQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQk1PYmpfQ29udmVydCwgJmRzdEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbWFza1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZtYXNrUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29weURlZXBNYXNrKHNyY0JpdHMsCisgICAgICAgICAgICAgICAgIG1hc2tCaXRzLAorICAgICAgICAgICAgICAgICBkc3RCaXRzLAorICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgJm1hc2tSZWN0LAorICAgICAgICAgICAgICAgICAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgbWFza1Jnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFBhdHRlcm4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdEhhbmRsZSBfcnY7Ci0Jc2hvcnQgcGF0dGVybklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXRIYW5kbGUgX3J2OworICAgIHNob3J0IHBhdHRlcm5JRDsKICNpZm5kZWYgR2V0UGF0dGVybgotCVB5TWFjX1BSRUNIRUNLKEdldFBhdHRlcm4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXR0ZXJuSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQYXR0ZXJuKHBhdHRlcm5JRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybklEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGF0dGVybihwYXR0ZXJuSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9NYWNHZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNIYW5kbGUgX3J2OwotCXNob3J0IGN1cnNvcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdXJzb3JJRDsKICNpZm5kZWYgTWFjR2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTWFjR2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNHZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjdXJzb3JJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1hY0dldEN1cnNvcihjdXJzb3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29ySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNHZXRDdXJzb3IoY3Vyc29ySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaWNIYW5kbGUgX3J2OwotCXNob3J0IHBpY3R1cmVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBwaWN0dXJlSUQ7CiAjaWZuZGVmIEdldFBpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHZXRQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGljdHVyZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGljdHVyZShwaWN0dXJlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmVJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpY3R1cmUocGljdHVyZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRGVsdGFQb2ludChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgcHRBOwotCVBvaW50IHB0QjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUG9pbnQgcHRBOworICAgIFBvaW50IHB0QjsKICNpZm5kZWYgRGVsdGFQb2ludAotCVB5TWFjX1BSRUNIRUNLKERlbHRhUG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbHRhUG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRBLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0QikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERlbHRhUG9pbnQocHRBLAotCSAgICAgICAgICAgICAgICAgcHRCKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHRCKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGVsdGFQb2ludChwdEEsCisgICAgICAgICAgICAgICAgICAgICBwdEIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NoaWVsZEN1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBzaGllbGRSZWN0OwotCVBvaW50IG9mZnNldFB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHNoaWVsZFJlY3Q7CisgICAgUG9pbnQgb2Zmc2V0UHQ7CiAjaWZuZGVmIFNoaWVsZEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKFNoaWVsZEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hpZWxkQ3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc2hpZWxkUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZvZmZzZXRQdCkpCi0JCXJldHVybiBOVUxMOwotCVNoaWVsZEN1cnNvcigmc2hpZWxkUmVjdCwKLQkgICAgICAgICAgICAgb2Zmc2V0UHQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNoaWVsZFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmb2Zmc2V0UHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTaGllbGRDdXJzb3IoJnNoaWVsZFJlY3QsCisgICAgICAgICAgICAgICAgIG9mZnNldFB0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2NyZWVuUmVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBzY3JuSFJlczsKLQlzaG9ydCBzY3JuVlJlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgc2NybkhSZXM7CisgICAgc2hvcnQgc2NyblZSZXM7CiAjaWZuZGVmIFNjcmVlblJlcwotCVB5TWFjX1BSRUNIRUNLKFNjcmVlblJlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NyZWVuUmVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTY3JlZW5SZXMoJnNjcm5IUmVzLAotCSAgICAgICAgICAmc2NyblZSZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgc2NybkhSZXMsCi0JICAgICAgICAgICAgICAgICAgICAgc2NyblZSZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTY3JlZW5SZXMoJnNjcm5IUmVzLAorICAgICAgICAgICAgICAmc2NyblZSZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NybkhSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NyblZSZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldEluZFBhdHRlcm4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gdGhlUGF0X19vdXRfXzsKLQlzaG9ydCBwYXR0ZXJuTGlzdElEOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXR0ZXJuIHRoZVBhdF9fb3V0X187CisgICAgc2hvcnQgcGF0dGVybkxpc3RJRDsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0SW5kUGF0dGVybgotCVB5TWFjX1BSRUNIRUNLKEdldEluZFBhdHRlcm4pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybkxpc3RJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0SW5kUGF0dGVybigmdGhlUGF0X19vdXRfXywKLQkgICAgICAgICAgICAgIHBhdHRlcm5MaXN0SUQsCi0JICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVQYXRfX291dF9fLCAoaW50KXNpemVvZihQYXR0ZXJuKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0dGVybkxpc3RJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0SW5kUGF0dGVybigmdGhlUGF0X19vdXRfXywKKyAgICAgICAgICAgICAgICAgIHBhdHRlcm5MaXN0SUQsCisgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVQYXRfX291dF9fLCAoaW50KXNpemVvZihQYXR0ZXJuKSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2xvcGVGcm9tQW5nbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlzaG9ydCBhbmdsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIHNob3J0IGFuZ2xlOwogI2lmbmRlZiBTbG9wZUZyb21BbmdsZQotCVB5TWFjX1BSRUNIRUNLKFNsb3BlRnJvbUFuZ2xlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTbG9wZUZyb21BbmdsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU2xvcGVGcm9tQW5nbGUoYW5nbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuZ2xlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU2xvcGVGcm9tQW5nbGUoYW5nbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9BbmdsZUZyb21TbG9wZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCUZpeGVkIHNsb3BlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgRml4ZWQgc2xvcGU7CiAjaWZuZGVmIEFuZ2xlRnJvbVNsb3BlCi0JUHlNYWNfUFJFQ0hFQ0soQW5nbGVGcm9tU2xvcGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFuZ2xlRnJvbVNsb3BlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzbG9wZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFuZ2xlRnJvbVNsb3BlKHNsb3BlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc2xvcGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBBbmdsZUZyb21TbG9wZShzbG9wZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGl4Qm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgcGl4TWFwOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcGl4TWFwOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRQaXhCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBpeEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4TWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UGl4Qm91bmRzKHBpeE1hcCwKLQkgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhNYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRQaXhCb3VuZHMocGl4TWFwLAorICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UGl4RGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlQaXhNYXBIYW5kbGUgcGl4TWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBpeE1hcDsKICNpZm5kZWYgR2V0UGl4RGVwdGgKLQlQeU1hY19QUkVDSEVDSyhHZXRQaXhEZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UGl4RGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeE1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFBpeERlcHRoKHBpeE1hcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeERlcHRoKHBpeE1hcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UURHbG9iYWxzUmFuZG9tU2VlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRRREdsb2JhbHNSYW5kb21TZWVkCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UURHbG9iYWxzUmFuZG9tU2VlZCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRRREdsb2JhbHNSYW5kb21TZWVkKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UURHbG9iYWxzU2NyZWVuQml0cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQml0TWFwIHNjcmVlbkJpdHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJpdE1hcCBzY3JlZW5CaXRzOwogI2lmbmRlZiBHZXRRREdsb2JhbHNTY3JlZW5CaXRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzU2NyZWVuQml0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzU2NyZWVuQml0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UURHbG9iYWxzU2NyZWVuQml0cygmc2NyZWVuQml0cyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBCTU9ial9OZXdDb3BpZWQsICZzY3JlZW5CaXRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzU2NyZWVuQml0cygmc2NyZWVuQml0cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCTU9ial9OZXdDb3BpZWQsICZzY3JlZW5CaXRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRRREdsb2JhbHNBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yIGFycm93X19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ3Vyc29yIGFycm93X19vdXRfXzsKICNpZm5kZWYgR2V0UURHbG9iYWxzQXJyb3cKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNBcnJvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzQXJyb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFFER2xvYmFsc0Fycm93KCZhcnJvd19fb3V0X18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmYXJyb3dfX291dF9fLCAoaW50KXNpemVvZihDdXJzb3IpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzQXJyb3coJmFycm93X19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZhcnJvd19fb3V0X18sIChpbnQpc2l6ZW9mKEN1cnNvcikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0RhcmtHcmF5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIGRrR3JheV9fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gZGtHcmF5X19vdXRfXzsKICNpZm5kZWYgR2V0UURHbG9iYWxzRGFya0dyYXkKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNEYXJrR3JheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzRGFya0dyYXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFFER2xvYmFsc0RhcmtHcmF5KCZka0dyYXlfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmRrR3JheV9fb3V0X18sIChpbnQpc2l6ZW9mKFBhdHRlcm4pKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UURHbG9iYWxzRGFya0dyYXkoJmRrR3JheV9fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmZGtHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0xpZ2h0R3JheShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGF0dGVybiBsdEdyYXlfX291dF9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQYXR0ZXJuIGx0R3JheV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0xpZ2h0R3JheQotCVB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0xpZ2h0R3JheSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzTGlnaHRHcmF5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNMaWdodEdyYXkoJmx0R3JheV9fb3V0X18pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmbHRHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNMaWdodEdyYXkoJmx0R3JheV9fb3V0X18pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmbHRHcmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0dyYXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBhdHRlcm4gZ3JheV9fb3V0X187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBhdHRlcm4gZ3JheV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0dyYXkKLQlQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNHcmF5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRRREdsb2JhbHNHcmF5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNHcmF5KCZncmF5X19vdXRfXyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZncmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNHcmF5KCZncmF5X19vdXRfXyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZncmF5X19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc0JsYWNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIGJsYWNrX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiBibGFja19fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc0JsYWNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzQmxhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc0JsYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNCbGFjaygmYmxhY2tfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmJsYWNrX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNCbGFjaygmYmxhY2tfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmJsYWNrX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc1doaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQYXR0ZXJuIHdoaXRlX19vdXRfXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGF0dGVybiB3aGl0ZV9fb3V0X187CiAjaWZuZGVmIEdldFFER2xvYmFsc1doaXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzV2hpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFFER2xvYmFsc1doaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRRREdsb2JhbHNXaGl0ZSgmd2hpdGVfX291dF9fKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJndoaXRlX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRRREdsb2JhbHNXaGl0ZSgmd2hpdGVfX291dF9fKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJndoaXRlX19vdXRfXywgKGludClzaXplb2YoUGF0dGVybikpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0dldFFER2xvYmFsc1RoZVBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBHZXRRREdsb2JhbHNUaGVQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzVGhlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UURHbG9iYWxzVGhlUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UURHbG9iYWxzVGhlUG9ydCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFFER2xvYmFsc1RoZVBvcnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFFER2xvYmFsc1JhbmRvbVNlZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgcmFuZG9tU2VlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyByYW5kb21TZWVkOwogI2lmbmRlZiBTZXRRREdsb2JhbHNSYW5kb21TZWVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzUmFuZG9tU2VlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmRvbVNlZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRRREdsb2JhbHNSYW5kb21TZWVkKHJhbmRvbVNlZWQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhbmRvbVNlZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRRREdsb2JhbHNSYW5kb21TZWVkKHJhbmRvbVNlZWQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRRREdsb2JhbHNBcnJvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ3Vyc29yICphcnJvd19faW5fXzsKLQlpbnQgYXJyb3dfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzb3IgKmFycm93X19pbl9fOworICAgIGludCBhcnJvd19faW5fbGVuX187CiAjaWZuZGVmIFNldFFER2xvYmFsc0Fycm93Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UURHbG9iYWxzQXJyb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFFER2xvYmFsc0Fycm93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmFycm93X19pbl9fLCAmYXJyb3dfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFycm93X19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOwotCQlnb3RvIGFycm93X19lcnJvcl9fOwotCX0KLQlTZXRRREdsb2JhbHNBcnJvdyhhcnJvd19faW5fXyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmFycm93X19pbl9fLCAmYXJyb3dfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGFycm93X19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOworICAgICAgICBnb3RvIGFycm93X19lcnJvcl9fOworICAgIH0KKyAgICBTZXRRREdsb2JhbHNBcnJvdyhhcnJvd19faW5fXyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOwogIGFycm93X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0UmVnaW9uQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmVnaW9uOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRSZWdpb25Cb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHZXRSZWdpb25Cb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlZ2lvbkJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UmVnaW9uQm91bmRzKHJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRSZWdpb25Cb3VuZHMocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfSXNSZWdpb25SZWN0YW5ndWxhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgSXNSZWdpb25SZWN0YW5ndWxhcgotCVB5TWFjX1BSRUNIRUNLKElzUmVnaW9uUmVjdGFuZ3VsYXIpOworICAgIFB5TWFjX1BSRUNIRUNLKElzUmVnaW9uUmVjdGFuZ3VsYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzUmVnaW9uUmVjdGFuZ3VsYXIocmVnaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNSZWdpb25SZWN0YW5ndWxhcihyZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NyZWF0ZU5ld1BvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBDcmVhdGVOZXdQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ3JlYXRlTmV3UG9ydCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENyZWF0ZU5ld1BvcnQoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFFERXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogI2lmbmRlZiBTZXRRREVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UURFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UURFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVycikpCi0JCXJldHVybiBOVUxMOwotCVNldFFERXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRRREVycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0U2NyVlJlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRTY3JWUmVzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRTY3JWUmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFNjclZSZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0U2NyVlJlcygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFNjclZSZXMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFNjclZSZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldFNjclZSZXMKLQlQeU1hY19QUkVDSEVDSyhMTVNldFNjclZSZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0U2NyVlJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRTY3JWUmVzKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0U2NyVlJlcyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0U2NySFJlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU0ludDE2IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IF9ydjsKICNpZm5kZWYgTE1HZXRTY3JIUmVzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRTY3JIUmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFNjckhSZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0U2NySFJlcygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFNjckhSZXMoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFNjckhSZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQxNiB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU0ludDE2IHZhbHVlOwogI2lmbmRlZiBMTVNldFNjckhSZXMKLQlQeU1hY19QUkVDSEVDSyhMTVNldFNjckhSZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0U2NySFJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRTY3JIUmVzKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0U2NySFJlcyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TWFpbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0TWFpbkRldmljZQotCVB5TWFjX1BSRUNIRUNLKExNR2V0TWFpbkRldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRNYWluRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldE1haW5EZXZpY2UoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0TWFpbkRldmljZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldE1haW5EZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHREhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRNYWluRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRNYWluRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldE1haW5EZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRNYWluRGV2aWNlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRNYWluRGV2aWNlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXREZXZpY2VMaXN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgTE1HZXREZXZpY2VMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXREZXZpY2VMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldERldmljZUxpc3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0RGV2aWNlTGlzdCgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXREZXZpY2VMaXN0KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0RGV2aWNlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldERldmljZUxpc3QKLQlQeU1hY19QUkVDSEVDSyhMTVNldERldmljZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0RGV2aWNlTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldERldmljZUxpc3QodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldERldmljZUxpc3QodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFFEQ29sb3JzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBMTUdldFFEQ29sb3JzCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRRRENvbG9ycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRRRENvbG9ycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRRRENvbG9ycygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRRRENvbG9ycygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFFEQ29sb3JzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSB2YWx1ZTsKICNpZm5kZWYgTE1TZXRRRENvbG9ycwotCVB5TWFjX1BSRUNIRUNLKExNU2V0UURDb2xvcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0UURDb2xvcnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRRRENvbG9ycyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0UURDb2xvcnModmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldFdpZHRoTGlzdEhhbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0V2lkdGhMaXN0SGFuZAotCVB5TWFjX1BSRUNIRUNLKExNR2V0V2lkdGhMaXN0SGFuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRXaWR0aExpc3RIYW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFdpZHRoTGlzdEhhbmQoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0V2lkdGhMaXN0SGFuZCgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldFdpZHRoTGlzdEhhbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFdpZHRoTGlzdEhhbmQKLQlQeU1hY19QUkVDSEVDSyhMTVNldFdpZHRoTGlzdEhhbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0V2lkdGhMaXN0SGFuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFdpZHRoTGlzdEhhbmQodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFdpZHRoTGlzdEhhbmQodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldEhpbGl0ZU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEhpbGl0ZU1vZGUKLQlQeU1hY19QUkVDSEVDSyhMTUdldEhpbGl0ZU1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNR2V0SGlsaXRlTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRIaWxpdGVNb2RlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0SGlsaXRlTW9kZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0SGlsaXRlTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IHZhbHVlOwogI2lmbmRlZiBMTVNldEhpbGl0ZU1vZGUKLQlQeU1hY19QUkVDSEVDSyhMTVNldEhpbGl0ZU1vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0SGlsaXRlTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRIaWxpdGVNb2RlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIExNU2V0SGlsaXRlTW9kZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0V2lkdGhUYWJIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0V2lkdGhUYWJIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhMTUdldFdpZHRoVGFiSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFdpZHRoVGFiSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldFdpZHRoVGFiSGFuZGxlKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFdpZHRoVGFiSGFuZGxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0V2lkdGhUYWJIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFdpZHRoVGFiSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRXaWR0aFRhYkhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRXaWR0aFRhYkhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFdpZHRoVGFiSGFuZGxlKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRXaWR0aFRhYkhhbmRsZSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TGFzdFNQRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVNJbnQzMiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiBfcnY7CiAjaWZuZGVmIExNR2V0TGFzdFNQRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhMTUdldExhc3RTUEV4dHJhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldExhc3RTUEV4dHJhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldExhc3RTUEV4dHJhKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0TGFzdFNQRXh0cmEoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldExhc3RTUEV4dHJhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTSW50MzIgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFNJbnQzMiB2YWx1ZTsKICNpZm5kZWYgTE1TZXRMYXN0U1BFeHRyYQotCVB5TWFjX1BSRUNIRUNLKExNU2V0TGFzdFNQRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0TGFzdFNQRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0TGFzdFNQRXh0cmEodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRMYXN0U1BFeHRyYSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0TGFzdEZPTkQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CiAjaWZuZGVmIExNR2V0TGFzdEZPTkQKLQlQeU1hY19QUkVDSEVDSyhMTUdldExhc3RGT05EKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldExhc3RGT05EKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBMTUdldExhc3RGT05EKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldExhc3RGT05EKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0TGFzdEZPTkQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldExhc3RGT05ECi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRMYXN0Rk9ORCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRMYXN0Rk9ORCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldExhc3RGT05EKHZhbHVlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRMYXN0Rk9ORCh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNR2V0RnJhY3RFbmFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVUludDggX3J2OwogI2lmbmRlZiBMTUdldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRGcmFjdEVuYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRGcmFjdEVuYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTE1HZXRGcmFjdEVuYWJsZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldEZyYWN0RW5hYmxlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRGcmFjdEVuYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVUludDggdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IHZhbHVlOwogI2lmbmRlZiBMTVNldEZyYWN0RW5hYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRGcmFjdEVuYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1TZXRGcmFjdEVuYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1TZXRGcmFjdEVuYWJsZSh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEZyYWN0RW5hYmxlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRUaGVHRGV2aWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHREhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIF9ydjsKICNpZm5kZWYgTE1HZXRUaGVHRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRUaGVHRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFRoZUdEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0VGhlR0RldmljZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTE1HZXRUaGVHRGV2aWNlKCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0xNU2V0VGhlR0RldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JR0RIYW5kbGUgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdESGFuZGxlIHZhbHVlOwogI2lmbmRlZiBMTVNldFRoZUdEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhMTVNldFRoZUdEZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0VGhlR0RldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldFRoZUdEZXZpY2UodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFRoZUdEZXZpY2UodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTUdldEhpbGl0ZVJHQihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlOwogI2lmbmRlZiBMTUdldEhpbGl0ZVJHQgotCVB5TWFjX1BSRUNIRUNLKExNR2V0SGlsaXRlUkdCKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldEhpbGl0ZVJHQik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTE1HZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmhpbGl0ZVJHQlZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1HZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MTVNldEhpbGl0ZVJHQihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlOwogI2lmbmRlZiBMTVNldEhpbGl0ZVJHQgotCVB5TWFjX1BSRUNIRUNLKExNU2V0SGlsaXRlUkdCKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldEhpbGl0ZVJHQik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZoaWxpdGVSR0JWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0SGlsaXRlUkdCKCZoaWxpdGVSR0JWYWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmhpbGl0ZVJHQlZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTE1TZXRIaWxpdGVSR0IoJmhpbGl0ZVJHQlZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1HZXRDdXJzb3JOZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgTE1HZXRDdXJzb3JOZXcKLQlQeU1hY19QUkVDSEVDSyhMTUdldEN1cnNvck5ldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTE1HZXRDdXJzb3JOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0Q3Vyc29yTmV3KCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExNR2V0Q3Vyc29yTmV3KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTE1TZXRDdXJzb3JOZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gdmFsdWU7CiAjaWZuZGVmIExNU2V0Q3Vyc29yTmV3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRDdXJzb3JOZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKExNU2V0Q3Vyc29yTmV3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlMTVNldEN1cnNvck5ldyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldEN1cnNvck5ldyh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRGb250KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBmb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBmb250OwogI2lmbmRlZiBUZXh0Rm9udAotCVB5TWFjX1BSRUNIRUNLKFRleHRGb250KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0Rm9udCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0Rm9udChmb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dEZvbnQoZm9udCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRGYWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlTdHlsZVBhcmFtZXRlciBmYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHlsZVBhcmFtZXRlciBmYWNlOwogI2lmbmRlZiBUZXh0RmFjZQotCVB5TWFjX1BSRUNIRUNLKFRleHRGYWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RmFjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZhY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0RmFjZShmYWNlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dEZhY2UoZmFjZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOwogI2lmbmRlZiBUZXh0TW9kZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0TW9kZShtb2RlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dE1vZGUobW9kZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1RleHRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBzaXplOwogI2lmbmRlZiBUZXh0U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFRleHRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlUZXh0U2l6ZShzaXplKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVGV4dFNpemUoc2l6ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NwYWNlRXh0cmEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIGV4dHJhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBleHRyYTsKICNpZm5kZWYgU3BhY2VFeHRyYQotCVB5TWFjX1BSRUNIRUNLKFNwYWNlRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwYWNlRXh0cmEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmV4dHJhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3BhY2VFeHRyYShleHRyYSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZleHRyYSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNwYWNlRXh0cmEoZXh0cmEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9EcmF3Q2hhcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ2hhclBhcmFtZXRlciBjaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ2hhclBhcmFtZXRlciBjaDsKICNpZm5kZWYgRHJhd0NoYXIKLQlQeU1hY19QUkVDSEVDSyhEcmF3Q2hhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd0NoYXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaCkpCi0JCXJldHVybiBOVUxMOwotCURyYXdDaGFyKGNoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdDaGFyKGNoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRHJhd1N0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFN0cjI1NSBzOwogI2lmbmRlZiBEcmF3U3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhd1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcykpCi0JCXJldHVybiBOVUxMOwotCURyYXdTdHJpbmcocyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhd1N0cmluZyhzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfTWFjRHJhd1RleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWNoYXIgKnRleHRCdWZfX2luX187Ci0JaW50IHRleHRCdWZfX2luX2xlbl9fOwotCXNob3J0IGZpcnN0Qnl0ZTsKLQlzaG9ydCBieXRlQ291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKnRleHRCdWZfX2luX187CisgICAgaW50IHRleHRCdWZfX2luX2xlbl9fOworICAgIHNob3J0IGZpcnN0Qnl0ZTsKKyAgICBzaG9ydCBieXRlQ291bnQ7CiAjaWZuZGVmIE1hY0RyYXdUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRHJhd1RleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0RyYXdUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLwotCXRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187Ci0JTWFjRHJhd1RleHQodGV4dEJ1Zl9faW5fXywKLQkgICAgICAgICAgICBmaXJzdEJ5dGUsCi0JICAgICAgICAgICAgYnl0ZUNvdW50KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0QnVmX19pbl9fLCAmdGV4dEJ1Zl9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmaXJzdEJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiBGb29sIGNvbXBpbGVyIHdhcm5pbmdzICovCisgICAgdGV4dEJ1Zl9faW5fbGVuX18gPSB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBNYWNEcmF3VGV4dCh0ZXh0QnVmX19pbl9fLAorICAgICAgICAgICAgICAgIGZpcnN0Qnl0ZSwKKyAgICAgICAgICAgICAgICBieXRlQ291bnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9DaGFyV2lkdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlDaGFyUGFyYW1ldGVyIGNoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgQ2hhclBhcmFtZXRlciBjaDsKICNpZm5kZWYgQ2hhcldpZHRoCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhcldpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFyV2lkdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENoYXJXaWR0aChjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENoYXJXaWR0aChjaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU3RyaW5nV2lkdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlTdHIyNTUgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFN0cjI1NSBzOwogI2lmbmRlZiBTdHJpbmdXaWR0aAotCVB5TWFjX1BSRUNIRUNLKFN0cmluZ1dpZHRoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdHJpbmdXaWR0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFN0cmluZ1dpZHRoKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3RyaW5nV2lkdGgocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfVGV4dFdpZHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JY2hhciAqdGV4dEJ1Zl9faW5fXzsKLQlpbnQgdGV4dEJ1Zl9faW5fbGVuX187Ci0Jc2hvcnQgZmlyc3RCeXRlOwotCXNob3J0IGJ5dGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIGNoYXIgKnRleHRCdWZfX2luX187CisgICAgaW50IHRleHRCdWZfX2luX2xlbl9fOworICAgIHNob3J0IGZpcnN0Qnl0ZTsKKyAgICBzaG9ydCBieXRlQ291bnQ7CiAjaWZuZGVmIFRleHRXaWR0aAotCVB5TWFjX1BSRUNIRUNLKFRleHRXaWR0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dFdpZHRoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLwotCXRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187Ci0JX3J2ID0gVGV4dFdpZHRoKHRleHRCdWZfX2luX18sCi0JICAgICAgICAgICAgICAgIGZpcnN0Qnl0ZSwKLQkgICAgICAgICAgICAgICAgYnl0ZUNvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIC8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICB0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOworICAgIF9ydiA9IFRleHRXaWR0aCh0ZXh0QnVmX19pbl9fLAorICAgICAgICAgICAgICAgICAgICBmaXJzdEJ5dGUsCisgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfR2V0Rm9udEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZvbnRJbmZvIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZvbnRJbmZvIGluZm87CiAjaWZuZGVmIEdldEZvbnRJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Rm9udEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEZvbnRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRGb250SW5mbygmaW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZEZJX05ldywgJmluZm8pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRGb250SW5mbygmaW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZEZJX05ldywgJmluZm8pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0NoYXJFeHRyYShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgZXh0cmE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIGV4dHJhOwogI2lmbmRlZiBDaGFyRXh0cmEKLQlQeU1hY19QUkVDSEVDSyhDaGFyRXh0cmEpOworICAgIFB5TWFjX1BSRUNIRUNLKENoYXJFeHRyYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXh0cmEpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGFyRXh0cmEoZXh0cmEpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXh0cmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDaGFyRXh0cmEoZXh0cmEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9UcnVuY1N0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCXNob3J0IHdpZHRoOwotCVN0cjI1NSB0aGVTdHJpbmc7Ci0JVHJ1bmNDb2RlIHRydW5jV2hlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBzaG9ydCB3aWR0aDsKKyAgICBTdHIyNTUgdGhlU3RyaW5nOworICAgIFRydW5jQ29kZSB0cnVuY1doZXJlOwogI2lmbmRlZiBUcnVuY1N0cmluZwotCVB5TWFjX1BSRUNIRUNLKFRydW5jU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcnVuY1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRoZVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRydW5jV2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcnVuY1N0cmluZyh3aWR0aCwKLQkgICAgICAgICAgICAgICAgICB0aGVTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgdHJ1bmNXaGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY1doZXJlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHJ1bmNTdHJpbmcod2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgdGhlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIHRydW5jV2hlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFBvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdyYWZQdHIgdGhlUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciB0aGVQb3J0OwogI2lmbmRlZiBTZXRQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVBvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3J0KHRoZVBvcnQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRQb3J0KHRoZVBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNIYW5kbGUgX3J2OwotCXNob3J0IGN1cnNvcklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDdXJzSGFuZGxlIF9ydjsKKyAgICBzaG9ydCBjdXJzb3JJRDsKICNpZm5kZWYgR2V0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soR2V0Q3Vyc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRDdXJzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjdXJzb3JJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEN1cnNvcihjdXJzb3JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3Vyc29ySUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRDdXJzb3IoY3Vyc29ySUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9TZXRDdXJzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUN1cnNvciAqY3Jzcl9faW5fXzsKLQlpbnQgY3Jzcl9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEN1cnNvciAqY3Jzcl9faW5fXzsKKyAgICBpbnQgY3Jzcl9faW5fbGVuX187CiAjaWZuZGVmIFNldEN1cnNvcgotCVB5TWFjX1BSRUNIRUNLKFNldEN1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJmNyc3JfX2luX18sICZjcnNyX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChjcnNyX19pbl9sZW5fXyAhPSBzaXplb2YoQ3Vyc29yKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoQ3Vyc29yKSIpOwotCQlnb3RvIGNyc3JfX2Vycm9yX187Ci0JfQotCVNldEN1cnNvcihjcnNyX19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmY3Jzcl9faW5fXywgJmNyc3JfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKGNyc3JfX2luX2xlbl9fICE9IHNpemVvZihDdXJzb3IpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihDdXJzb3IpIik7CisgICAgICAgIGdvdG8gY3Jzcl9fZXJyb3JfXzsKKyAgICB9CisgICAgU2V0Q3Vyc29yKGNyc3JfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBjcnNyX19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2hvd0N1cnNvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTaG93Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0N1cnNvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0N1cnNvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2hvd0N1cnNvcigpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd0N1cnNvcigpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9MaW5lVG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGg7Ci0Jc2hvcnQgdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaDsKKyAgICBzaG9ydCB2OwogI2lmbmRlZiBMaW5lVG8KLQlQeU1hY19QUkVDSEVDSyhMaW5lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKExpbmVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdikpCi0JCXJldHVybiBOVUxMOwotCUxpbmVUbyhoLAotCSAgICAgICB2KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMaW5lVG8oaCwKKyAgICAgICAgICAgdik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1NldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBsZWZ0OworICAgIHNob3J0IHRvcDsKKyAgICBzaG9ydCByaWdodDsKKyAgICBzaG9ydCBib3R0b207CiAjaWZuZGVmIFNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhTZXRSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVjdCgmciwKLQkgICAgICAgIGxlZnQsCi0JICAgICAgICB0b3AsCi0JICAgICAgICByaWdodCwKLQkgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlY3QoJnIsCisgICAgICAgIGxlZnQsCisgICAgICAgIHRvcCwKKyAgICAgICAgcmlnaHQsCisgICAgICAgIGJvdHRvbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9PZmZzZXRSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHI7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgT2Zmc2V0UmVjdAotCVB5TWFjX1BSRUNIRUNLKE9mZnNldFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE9mZnNldFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU9mZnNldFJlY3QoJnIsCi0JICAgICAgICAgICBkaCwKLQkgICAgICAgICAgIGR2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBPZmZzZXRSZWN0KCZyLAorICAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgICBkdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9JbnNldFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBJbnNldFJlY3QKLQlQeU1hY19QUkVDSEVDSyhJbnNldFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEluc2V0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW5zZXRSZWN0KCZyLAotCSAgICAgICAgICBkaCwKLQkgICAgICAgICAgZHYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEluc2V0UmVjdCgmciwKKyAgICAgICAgICAgICAgZGgsCisgICAgICAgICAgICAgIGR2KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1VuaW9uUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBzcmMxOwotCVJlY3Qgc3JjMjsKLQlSZWN0IGRzdFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3Qgc3JjMTsKKyAgICBSZWN0IHNyYzI7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBVbmlvblJlY3QKLQlQeU1hY19QUkVDSEVDSyhVbmlvblJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuaW9uUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyYzEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVW5pb25SZWN0KCZzcmMxLAotCSAgICAgICAgICAmc3JjMiwKLQkgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZHN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFVuaW9uUmVjdCgmc3JjMSwKKyAgICAgICAgICAgICAgJnNyYzIsCisgICAgICAgICAgICAgICZkc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0VxdWFsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUmVjdCByZWN0MTsKLQlSZWN0IHJlY3QyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZWN0IHJlY3QxOworICAgIFJlY3QgcmVjdDI7CiAjaWZuZGVmIEVxdWFsUmVjdAotCVB5TWFjX1BSRUNIRUNLKEVxdWFsUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXF1YWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdDEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEVxdWFsUmVjdCgmcmVjdDEsCi0JICAgICAgICAgICAgICAgICZyZWN0Mik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJlY3QyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRXF1YWxSZWN0KCZyZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgJnJlY3QyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9GcmFtZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBGcmFtZVJlY3QKLQlQeU1hY19QUkVDSEVDSyhGcmFtZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyYW1lUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVSZWN0KCZyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUmVjdCgmcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByOwogI2lmbmRlZiBJbnZlcnRSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSW52ZXJ0UmVjdCgmcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBJbnZlcnRSZWN0KCZyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRmlsbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcjsKLQlQYXR0ZXJuICpwYXRfX2luX187Ci0JaW50IHBhdF9faW5fbGVuX187CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcjsKKyAgICBQYXR0ZXJuICpwYXRfX2luX187CisgICAgaW50IHBhdF9faW5fbGVuX187CiAjaWZuZGVmIEZpbGxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRmlsbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmciwKLQkgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiopJnBhdF9faW5fXywgJnBhdF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAocGF0X19pbl9sZW5fXyAhPSBzaXplb2YoUGF0dGVybikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGxlbmd0aCBzaG91bGQgYmUgc2l6ZW9mKFBhdHRlcm4pIik7Ci0JCWdvdG8gcGF0X19lcnJvcl9fOwotCX0KLQlGaWxsUmVjdCgmciwKLQkgICAgICAgICBwYXRfX2luX18pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICoqKSZwYXRfX2luX18sICZwYXRfX2luX2xlbl9fKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHBhdF9faW5fbGVuX18gIT0gc2l6ZW9mKFBhdHRlcm4pKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImJ1ZmZlciBsZW5ndGggc2hvdWxkIGJlIHNpemVvZihQYXR0ZXJuKSIpOworICAgICAgICBnb3RvIHBhdF9fZXJyb3JfXzsKKyAgICB9CisgICAgRmlsbFJlY3QoJnIsCisgICAgICAgICAgICAgcGF0X19pbl9fKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CiAgcGF0X19lcnJvcl9fOiA7Ci0JcmV0dXJuIF9yZXM7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQ29weVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbjsKLQlSZ25IYW5kbGUgZHN0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgc3JjUmduOworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIENvcHlSZ24KLQlQeU1hY19QUkVDSEVDSyhDb3B5UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlDb3B5UmduKHNyY1JnbiwKLQkgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb3B5UmduKHNyY1JnbiwKKyAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfU2V0UmVjdFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlzaG9ydCBsZWZ0OwotCXNob3J0IHRvcDsKLQlzaG9ydCByaWdodDsKLQlzaG9ydCBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSByZ247CisgICAgc2hvcnQgbGVmdDsKKyAgICBzaG9ydCB0b3A7CisgICAgc2hvcnQgcmlnaHQ7CisgICAgc2hvcnQgYm90dG9tOwogI2lmbmRlZiBTZXRSZWN0UmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVjdFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVjdFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJvdHRvbSkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlY3RSZ24ocmduLAotCSAgICAgICAgICAgbGVmdCwKLQkgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgIHJpZ2h0LAotCSAgICAgICAgICAgYm90dG9tKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRSZWN0UmduKHJnbiwKKyAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICB0b3AsCisgICAgICAgICAgICAgICByaWdodCwKKyAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX09mZnNldFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKLQlzaG9ydCBkaDsKLQlzaG9ydCBkdjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgT2Zmc2V0UmduCi0JUHlNYWNfUFJFQ0hFQ0soT2Zmc2V0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhPZmZzZXRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCU9mZnNldFJnbihyZ24sCi0JICAgICAgICAgIGRoLAotCSAgICAgICAgICBkdik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBPZmZzZXRSZ24ocmduLAorICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgZHYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9VbmlvblJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHNyY1JnbkE7Ci0JUmduSGFuZGxlIHNyY1JnbkI7Ci0JUmduSGFuZGxlIGRzdFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHNyY1JnbkE7CisgICAgUmduSGFuZGxlIHNyY1JnbkI7CisgICAgUmduSGFuZGxlIGRzdFJnbjsKICNpZm5kZWYgVW5pb25SZ24KLQlQeU1hY19QUkVDSEVDSyhVbmlvblJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5pb25SZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25BLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVW5pb25SZ24oc3JjUmduQSwKLQkgICAgICAgICBzcmNSZ25CLAotCSAgICAgICAgIGRzdFJnbik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFVuaW9uUmduKHNyY1JnbkEsCisgICAgICAgICAgICAgc3JjUmduQiwKKyAgICAgICAgICAgICBkc3RSZ24pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9Yb3JSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBzcmNSZ25BOwotCVJnbkhhbmRsZSBzcmNSZ25COwotCVJnbkhhbmRsZSBkc3RSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBzcmNSZ25BOworICAgIFJnbkhhbmRsZSBzcmNSZ25COworICAgIFJnbkhhbmRsZSBkc3RSZ247CiAjaWZuZGVmIFhvclJnbgotCVB5TWFjX1BSRUNIRUNLKFhvclJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soWG9yUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNSZ25CLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFJnbikpCi0JCXJldHVybiBOVUxMOwotCVhvclJnbihzcmNSZ25BLAotCSAgICAgICBzcmNSZ25CLAotCSAgICAgICBkc3RSZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1JnbkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUmduQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBYb3JSZ24oc3JjUmduQSwKKyAgICAgICAgICAgc3JjUmduQiwKKyAgICAgICAgICAgZHN0UmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfRXF1YWxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVJnbkhhbmRsZSByZ25BOwotCVJnbkhhbmRsZSByZ25COworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBSZ25IYW5kbGUgcmduQTsKKyAgICBSZ25IYW5kbGUgcmduQjsKICNpZm5kZWYgRXF1YWxSZ24KLQlQeU1hY19QUkVDSEVDSyhFcXVhbFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXF1YWxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduQSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25CKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRXF1YWxSZ24ocmduQSwKLQkgICAgICAgICAgICAgICByZ25CKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ25BLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbkIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBFcXVhbFJnbihyZ25BLAorICAgICAgICAgICAgICAgICAgIHJnbkIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZyYW1lUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBGcmFtZVJnbgotCVB5TWFjX1BSRUNIRUNLKEZyYW1lUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGcmFtZVJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRnJhbWVSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEZyYW1lUmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX1BhaW50UmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOwogI2lmbmRlZiBQYWludFJnbgotCVB5TWFjX1BSRUNIRUNLKFBhaW50UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQYWludFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUGFpbnRSZ24ocmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50UmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ludmVydFJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHJnbjsKICNpZm5kZWYgSW52ZXJ0UmduCi0JUHlNYWNfUFJFQ0hFQ0soSW52ZXJ0UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZlcnRSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCi0JCXJldHVybiBOVUxMOwotCUludmVydFJnbihyZ24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgSW52ZXJ0UmduKHJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0ZpbGxSZ24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSByZ247Ci0JUGF0dGVybiAqcGF0X19pbl9fOwotCWludCBwYXRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgcmduOworICAgIFBhdHRlcm4gKnBhdF9faW5fXzsKKyAgICBpbnQgcGF0X19pbl9sZW5fXzsKICNpZm5kZWYgRmlsbFJnbgotCVB5TWFjX1BSRUNIRUNLKEZpbGxSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbGxSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAotCSAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCWlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKLQkJZ290byBwYXRfX2Vycm9yX187Ci0JfQotCUZpbGxSZ24ocmduLAotCSAgICAgICAgcGF0X19pbl9fKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKikmcGF0X19pbl9fLCAmcGF0X19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChwYXRfX2luX2xlbl9fICE9IHNpemVvZihQYXR0ZXJuKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJidWZmZXIgbGVuZ3RoIHNob3VsZCBiZSBzaXplb2YoUGF0dGVybikiKTsKKyAgICAgICAgZ290byBwYXRfX2Vycm9yX187CisgICAgfQorICAgIEZpbGxSZ24ocmduLAorICAgICAgICBwYXRfX2luX18pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKICBwYXRfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZF9HZXRQaXhlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0Jc2hvcnQgaDsKLQlzaG9ydCB2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBzaG9ydCBoOworICAgIHNob3J0IHY7CiAjaWZuZGVmIEdldFBpeGVsCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UGl4ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFBpeGVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UGl4ZWwoaCwKLQkgICAgICAgICAgICAgICB2KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFBpeGVsKGgsCisgICAgICAgICAgICAgICAgICAgdik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUHRJblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBvaW50IHB0OwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CisgICAgUmVjdCByOwogI2lmbmRlZiBQdEluUmVjdAotCVB5TWFjX1BSRUNIRUNLKFB0SW5SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdEluUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluUmVjdChwdCwKLQkgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblJlY3QocHQsCisgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkX0RyYXdUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0QnVmX19pbl9fOwotCWludCB0ZXh0QnVmX19pbl9sZW5fXzsKLQlzaG9ydCBmaXJzdEJ5dGU7Ci0Jc2hvcnQgYnl0ZUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0QnVmX19pbl9fOworICAgIGludCB0ZXh0QnVmX19pbl9sZW5fXzsKKyAgICBzaG9ydCBmaXJzdEJ5dGU7CisgICAgc2hvcnQgYnl0ZUNvdW50OwogI2lmbmRlZiBEcmF3VGV4dAotCVB5TWFjX1BSRUNIRUNLKERyYXdUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3VGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI2hoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRCdWZfX2luX18sICZ0ZXh0QnVmX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0Qnl0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCkpCi0JCXJldHVybiBOVUxMOwotCS8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8KLQl0ZXh0QnVmX19pbl9sZW5fXyA9IHRleHRCdWZfX2luX2xlbl9fOwotCURyYXdUZXh0KHRleHRCdWZfX2luX18sCi0JICAgICAgICAgZmlyc3RCeXRlLAotCSAgICAgICAgIGJ5dGVDb3VudCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dEJ1Zl9faW5fXywgJnRleHRCdWZfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RCeXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogRm9vbCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHRleHRCdWZfX2luX2xlbl9fID0gdGV4dEJ1Zl9faW5fbGVuX187CisgICAgRHJhd1RleHQodGV4dEJ1Zl9faW5fXywKKyAgICAgICAgICAgICBmaXJzdEJ5dGUsCisgICAgICAgICAgICAgYnl0ZUNvdW50KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfQml0TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlCaXRNYXAgKnB0cjsKLQlQeU9iamVjdCAqc291cmNlOwotCVJlY3QgYm91bmRzOwotCWludCByb3dieXRlczsKLQljaGFyICpkYXRhOworICAgIEJpdE1hcCAqcHRyOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CisgICAgUmVjdCBib3VuZHM7CisgICAgaW50IHJvd2J5dGVzOworICAgIGNoYXIgKmRhdGE7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyFpTyYiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSwgJnJvd2J5dGVzLCBQeU1hY19HZXRSZWN0LAotCSAgICAgICAgICAgICAgICAmYm91bmRzKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKLQlpZiAoKHB0cj0oQml0TWFwICopbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCApCi0JICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQlwdHItPmJhc2VBZGRyID0gKFB0cilkYXRhOwotCXB0ci0+cm93Qnl0ZXMgPSByb3dieXRlczsKLQlwdHItPmJvdW5kcyA9IGJvdW5kczsKLQlpZiAoIChfcmVzID0gQk1PYmpfTmV3KHB0cikpID09IE5VTEwgKSB7Ci0JICAgICAgICBmcmVlKHB0cik7Ci0JICAgICAgICByZXR1cm4gTlVMTDsKLQl9Ci0JKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfb2JqZWN0ID0gc291cmNlOwotCVB5X0lOQ1JFRihzb3VyY2UpOwotCSgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX2JpdG1hcCA9IHB0cjsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyFpTyYiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSwgJnJvd2J5dGVzLCBQeU1hY19HZXRSZWN0LAorICAgICAgICAgICAgICAgICAgICAmYm91bmRzKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyhzb3VyY2UpOworICAgIGlmICgocHRyPShCaXRNYXAgKiltYWxsb2Moc2l6ZW9mKEJpdE1hcCkpKSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcHRyLT5iYXNlQWRkciA9IChQdHIpZGF0YTsKKyAgICBwdHItPnJvd0J5dGVzID0gcm93Ynl0ZXM7CisgICAgcHRyLT5ib3VuZHMgPSBib3VuZHM7CisgICAgaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgeworICAgICAgICBmcmVlKHB0cik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7CisgICAgUHlfSU5DUkVGKHNvdXJjZSk7CisgICAgKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfYml0bWFwID0gcHRyOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRfUmF3Qml0TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlCaXRNYXAgKnB0cjsKLQlQeU9iamVjdCAqc291cmNlOworICAgIEJpdE1hcCAqcHRyOworICAgIFB5T2JqZWN0ICpzb3VyY2U7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyEiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSkgKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKCBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKEJpdE1hcCkgJiYgUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihQaXhNYXApICkgewotCSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkgICAgICAgICAgICAgICAgIkFyZ3VtZW50IHNpemUgd2FzICVsZCwgc2hvdWxkIGJlICVsdSAoc2l6ZW9mIEJpdE1hcCkgb3IgJWx1IChzaXplb2YgUGl4TWFwKSIsCi0JICAgICAgICAgICAgICAgIFB5U3RyaW5nX1NpemUoc291cmNlKSwgc2l6ZW9mKEJpdE1hcCksIHNpemVvZihQaXhNYXApKTsKLQkgICAgICAgIHJldHVybiBOVUxMOwotCX0KLQlwdHIgPSAoQml0TWFwUHRyKVB5U3RyaW5nX0FzU3RyaW5nKHNvdXJjZSk7Ci0JaWYgKCAoX3JlcyA9IEJNT2JqX05ldyhwdHIpKSA9PSBOVUxMICkgewotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCSgoQml0TWFwT2JqZWN0ICopX3JlcyktPnJlZmVycmVkX29iamVjdCA9IHNvdXJjZTsKLQlQeV9JTkNSRUYoc291cmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyEiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoIFB5U3RyaW5nX1NpemUoc291cmNlKSAhPSBzaXplb2YoQml0TWFwKSAmJiBQeVN0cmluZ19TaXplKHNvdXJjZSkgIT0gc2l6ZW9mKFBpeE1hcCkgKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAiQXJndW1lbnQgc2l6ZSB3YXMgJWxkLCBzaG91bGQgYmUgJWx1IChzaXplb2YgQml0TWFwKSBvciAlbHUgKHNpemVvZiBQaXhNYXApIiwKKyAgICAgICAgICAgIFB5U3RyaW5nX1NpemUoc291cmNlKSwgc2l6ZW9mKEJpdE1hcCksIHNpemVvZihQaXhNYXApKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHB0ciA9IChCaXRNYXBQdHIpUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKKyAgICBpZiAoIChfcmVzID0gQk1PYmpfTmV3KHB0cikpID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7CisgICAgUHlfSU5DUkVGKHNvdXJjZSk7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgUWRfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiR2V0UG9ydCIsIChQeUNGdW5jdGlvbilRZF9HZXRQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHcmFmUHRyIHBvcnQpIil9LAotCXsiR3JhZkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9HcmFmRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkZXZpY2UpIC0+IE5vbmUiKX0sCi0JeyJTZXRQb3J0Qml0cyIsIChQeUNGdW5jdGlvbilRZF9TZXRQb3J0Qml0cywgMSwKLQkgUHlEb2NfU1RSKCIoQml0TWFwUHRyIGJtKSAtPiBOb25lIil9LAotCXsiUG9ydFNpemUiLCAoUHlDRnVuY3Rpb24pUWRfUG9ydFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBzaG9ydCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJNb3ZlUG9ydFRvIiwgKFB5Q0Z1bmN0aW9uKVFkX01vdmVQb3J0VG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGxlZnRHbG9iYWwsIHNob3J0IHRvcEdsb2JhbCkgLT4gTm9uZSIpfSwKLQl7IlNldE9yaWdpbiIsIChQeUNGdW5jdGlvbilRZF9TZXRPcmlnaW4sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJTZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJDbGlwUmVjdCIsIChQeUNGdW5jdGlvbilRZF9DbGlwUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiQmFja1BhdCIsIChQeUNGdW5jdGlvbilRZF9CYWNrUGF0LCAxLAotCSBQeURvY19TVFIoIihQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IkluaXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfSW5pdEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiTWFjU2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1NldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ3Vyc29yIGNyc3IpIC0+IE5vbmUiKX0sCi0JeyJIaWRlQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpZGVDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1hY1Nob3dDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2hvd0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiT2JzY3VyZUN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9PYnNjdXJlQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJIaWRlUGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpZGVQZW4sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlNob3dQZW4iLCAoUHlDRnVuY3Rpb24pUWRfU2hvd1BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0UGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9pbnQgcHQpIil9LAotCXsiR2V0UGVuU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGVuU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBlblN0YXRlIHBuU3RhdGUpIil9LAotCXsiU2V0UGVuU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UGVuU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBlblN0YXRlIHBuU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJQZW5TaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBzaG9ydCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJQZW5Nb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX1Blbk1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCi0JeyJQZW5QYXQiLCAoUHlDRnVuY3Rpb24pUWRfUGVuUGF0LCAxLAotCSBQeURvY19TVFIoIihQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IlBlbk5vcm1hbCIsIChQeUNGdW5jdGlvbilRZF9QZW5Ob3JtYWwsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmVUbyIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlVG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJNb3ZlIiwgKFB5Q0Z1bmN0aW9uKVFkX01vdmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7Ik1hY0xpbmVUbyIsIChQeUNGdW5jdGlvbilRZF9NYWNMaW5lVG8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCi0JeyJMaW5lIiwgKFB5Q0Z1bmN0aW9uKVFkX0xpbmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IkZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9Gb3JlQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgY29sb3IpIC0+IE5vbmUiKX0sCi0JeyJCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfQmFja0NvbG9yLCAxLAotCSBQeURvY19TVFIoIihsb25nIGNvbG9yKSAtPiBOb25lIil9LAotCXsiQ29sb3JCaXQiLCAoUHlDRnVuY3Rpb24pUWRfQ29sb3JCaXQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdoaWNoQml0KSAtPiBOb25lIil9LAotCXsiTWFjU2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IChSZWN0IHIpIil9LAotCXsiTWFjT2Zmc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNPZmZzZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gKFJlY3QgcikiKX0sCi0JeyJNYWNJbnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjSW5zZXRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gKFJlY3QgcikiKX0sCi0JeyJTZWN0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9TZWN0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzcmMxLCBSZWN0IHNyYzIpIC0+IChCb29sZWFuIF9ydiwgUmVjdCBkc3RSZWN0KSIpfSwKLQl7Ik1hY1VuaW9uUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNVbmlvblJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKLQl7Ik1hY0VxdWFsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNFcXVhbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdDEsIFJlY3QgcmVjdDIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbXB0eVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRW1wdHlSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJNYWNGcmFtZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRnJhbWVSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJQYWludFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJNYWNJbnZlcnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ludmVydFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7Ik1hY0ZpbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZpbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiRnJhbWVPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiUGFpbnRPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50T3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiRXJhc2VPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiSW52ZXJ0T3ZhbCIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRPdmFsLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCi0JeyJGaWxsT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GaWxsT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7IkZyYW1lUm91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IlBhaW50Um91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50Um91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkVyYXNlUm91bmRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKLQl7IkludmVydFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRSb3VuZFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0KSAtPiBOb25lIil9LAotCXsiRmlsbFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsUm91bmRSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJGcmFtZUFyYyIsIChQeUNGdW5jdGlvbilRZF9GcmFtZUFyYywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKLQl7IlBhaW50QXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50QXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAotCXsiRXJhc2VBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VBcmMsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRBcmMiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0QXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAotCXsiRmlsbEFyYyIsIChQeUNGdW5jdGlvbilRZF9GaWxsQXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKLQl7Ik5ld1JnbiIsIChQeUNGdW5jdGlvbilRZF9OZXdSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiT3BlblJnbiIsIChQeUNGdW5jdGlvbilRZF9PcGVuUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDbG9zZVJnbiIsIChQeUNGdW5jdGlvbilRZF9DbG9zZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IkJpdE1hcFRvUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVFkX0JpdE1hcFRvUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBCaXRNYXBQdHIgYk1hcCkgLT4gTm9uZSIpfSwKLQl7IlJnblRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVFkX1JnblRvSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uLCBIYW5kbGUgZmxhdHRlbmVkUmduRGF0YUhkbCkgLT4gTm9uZSIpfSwKLQl7IkRpc3Bvc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY0NvcHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjQ29weVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IlNldEVtcHR5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEVtcHR5UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiTWFjU2V0UmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRSZWN0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IE5vbmUiKX0sCi0JeyJSZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1JlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7Ik1hY09mZnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNPZmZzZXRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7Ikluc2V0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0luc2V0UmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJTZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY1VuaW9uUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1VuaW9uUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJEaWZmUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0RpZmZSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY1hvclJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNYb3JSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ25BLCBSZ25IYW5kbGUgc3JjUmduQiwgUmduSGFuZGxlIGRzdFJnbikgLT4gTm9uZSIpfSwKLQl7IlJlY3RJblJnbiIsIChQeUNGdW5jdGlvbilRZF9SZWN0SW5SZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0VxdWFsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0VxdWFsUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduQSwgUmduSGFuZGxlIHJnbkIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJFbXB0eVJnbiIsIChQeUNGdW5jdGlvbilRZF9FbXB0eVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik1hY0ZyYW1lUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZyYW1lUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAotCXsiTWFjUGFpbnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjUGFpbnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVJnbiIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7Ik1hY0ludmVydFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNJbnZlcnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJNYWNGaWxsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZpbGxSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiU2Nyb2xsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9TY3JvbGxSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IGRoLCBzaG9ydCBkdiwgUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gTm9uZSIpfSwKLQl7IkNvcHlCaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlCaXRzLCAxLAotCSBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIGRzdEJpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0LCBzaG9ydCBtb2RlLCBSZ25IYW5kbGUgbWFza1JnbikgLT4gTm9uZSIpfSwKLQl7IkNvcHlNYXNrIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlNYXNrLCAxLAotCSBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIG1hc2tCaXRzLCBCaXRNYXBQdHIgZHN0Qml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IG1hc2tSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCi0JeyJPcGVuUGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9PcGVuUGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBwaWNGcmFtZSkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiUGljQ29tbWVudCIsIChQeUNGdW5jdGlvbilRZF9QaWNDb21tZW50LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBraW5kLCBzaG9ydCBkYXRhU2l6ZSwgSGFuZGxlIGRhdGFIYW5kbGUpIC0+IE5vbmUiKX0sCi0JeyJDbG9zZVBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfQ2xvc2VQaWN0dXJlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEcmF3UGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9EcmF3UGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIG15UGljdHVyZSwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAotCXsiS2lsbFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfS2lsbFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBteVBpY3R1cmUpIC0+IE5vbmUiKX0sCi0JeyJPcGVuUG9seSIsIChQeUNGdW5jdGlvbilRZF9PcGVuUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUG9seUhhbmRsZSBfcnYpIil9LAotCXsiQ2xvc2VQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0Nsb3NlUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiS2lsbFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfS2lsbFBvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKLQl7Ik9mZnNldFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJGcmFtZVBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJQYWludFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJFcmFzZVBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCi0JeyJJbnZlcnRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFBvbHksIDEsCi0JIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSkgLT4gTm9uZSIpfSwKLQl7IkZpbGxQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxQb2x5LCAxLAotCSBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHksIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiU2V0UHQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UHQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChQb2ludCBwdCkiKX0sCi0JeyJMb2NhbFRvR2xvYmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0xvY2FsVG9HbG9iYWwsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0KSAtPiAoUG9pbnQgcHQpIil9LAotCXsiR2xvYmFsVG9Mb2NhbCIsIChQeUNGdW5jdGlvbilRZF9HbG9iYWxUb0xvY2FsLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7IlJhbmRvbSIsIChQeUNGdW5jdGlvbilRZF9SYW5kb20sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJNYWNHZXRQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9NYWNHZXRQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNjYWxlUHQiLCAoUHlDRnVuY3Rpb24pUWRfU2NhbGVQdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoUG9pbnQgcHQpIil9LAotCXsiTWFwUHQiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUHQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFBvaW50IHB0KSIpfSwKLQl7Ik1hcFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFJlY3QgcikiKX0sCi0JeyJNYXBSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFwUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1hcFBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfTWFwUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKLQl7IlN0ZEJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfU3RkQml0cywgMSwKLQkgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0LCBzaG9ydCBtb2RlLCBSZ25IYW5kbGUgbWFza1JnbikgLT4gTm9uZSIpfSwKLQl7IkFkZFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX0FkZFB0LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzcmMsIFBvaW50IGRzdCkgLT4gKFBvaW50IGRzdCkiKX0sCi0JeyJFcXVhbFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VxdWFsUHQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0MSwgUG9pbnQgcHQyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjUHRJblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjUHRJblJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQdDJSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1B0MlJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHB0MSwgUG9pbnQgcHQyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKLQl7IlB0VG9BbmdsZSIsIChQeUNGdW5jdGlvbilRZF9QdFRvQW5nbGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUG9pbnQgcHQpIC0+IChzaG9ydCBhbmdsZSkiKX0sCi0JeyJTdWJQdCIsIChQeUNGdW5jdGlvbilRZF9TdWJQdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgc3JjLCBQb2ludCBkc3QpIC0+IChQb2ludCBkc3QpIil9LAotCXsiUHRJblJnbiIsIChQeUNGdW5jdGlvbilRZF9QdEluUmduLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgUmduSGFuZGxlIHJnbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7Ik5ld1BpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9OZXdQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAotCXsiRGlzcG9zZVBpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJDb3B5UGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlQaXhNYXAsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmNQTSwgUGl4TWFwSGFuZGxlIGRzdFBNKSAtPiBOb25lIil9LAotCXsiTmV3UGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX05ld1BpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJEaXNwb3NlUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkNvcHlQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfQ29weVBpeFBhdCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHNyY1BQLCBQaXhQYXRIYW5kbGUgZHN0UFApIC0+IE5vbmUiKX0sCi0JeyJQZW5QaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfUGVuUGl4UGF0LCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJCYWNrUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0JhY2tQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkdldFBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhQYXQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBhdElEKSAtPiAoUGl4UGF0SGFuZGxlIF9ydikiKX0sCi0JeyJNYWtlUkdCUGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX01ha2VSR0JQYXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwcCwgUkdCQ29sb3IgbXlDb2xvcikgLT4gTm9uZSIpfSwKLQl7IkZpbGxDUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiRmlsbENPdmFsIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDT3ZhbCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJGaWxsQ1JvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JvdW5kUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKLQl7IkZpbGxDQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDQXJjLCAxLAotCSBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlLCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJGaWxsQ1JnbiIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAotCXsiRmlsbENQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxDUG9seSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCi0JeyJSR0JGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUkdCRm9yZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IlJHQkJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRZF9SR0JCYWNrQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiBOb25lIil9LAotCXsiU2V0Q1BpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldENQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdiwgUkdCQ29sb3IgY1BpeCkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRQaXgiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydFBpeCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAotCXsiR2V0Q1BpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENQaXhlbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gKFJHQkNvbG9yIGNQaXgpIil9LAotCXsiR2V0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEZvcmVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAotCXsiR2V0QmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEJhY2tDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAotCXsiT3BDb2xvciIsIChQeUNGdW5jdGlvbilRZF9PcENvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkhpbGl0ZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0hpbGl0ZUNvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkRpc3Bvc2VDVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUNUYWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjVGFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRDVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q1RhYmxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjdElEKSAtPiAoQ1RhYkhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9HZXRDQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBjcnNySUQpIC0+IChDQ3JzckhhbmRsZSBfcnYpIil9LAotCXsiU2V0Q0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9TZXRDQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihDQ3JzckhhbmRsZSBjQ3JzcikgLT4gTm9uZSIpfSwKLQl7IkFsbG9jQ3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0FsbG9jQ3Vyc29yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJEaXNwb3NlQ0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlQ0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoQ0Nyc3JIYW5kbGUgY0Nyc3IpIC0+IE5vbmUiKX0sCi0JeyJHZXRNYXhEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TWF4RGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGdsb2JhbFJlY3QpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0Q1RTZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENUU2VlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9HZXREZXZpY2VMaXN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXRNYWluRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiR2V0TmV4dERldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXROZXh0RGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBjdXJEZXZpY2UpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiVGVzdERldmljZUF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilRZF9UZXN0RGV2aWNlQXR0cmlidXRlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGF0dHJpYnV0ZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlNldERldmljZUF0dHJpYnV0ZSIsIChQeUNGdW5jdGlvbilRZF9TZXREZXZpY2VBdHRyaWJ1dGUsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCwgc2hvcnQgYXR0cmlidXRlLCBCb29sZWFuIHZhbHVlKSAtPiBOb25lIil9LAotCXsiSW5pdEdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfSW5pdEdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHFkUmVmTnVtLCBsb25nIG1vZGUsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7Ik5ld0dEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTmV3R0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtLCBsb25nIG1vZGUpIC0+IChHREhhbmRsZSBfcnYpIil9LAotCXsiRGlzcG9zZUdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7IlNldEdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfU2V0R0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2QpIC0+IE5vbmUiKX0sCi0JeyJHZXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCi0JeyJDb2xvcjJJbmRleCIsIChQeUNGdW5jdGlvbilRZF9Db2xvcjJJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoUkdCQ29sb3IgbXlDb2xvcikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkluZGV4MkNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0luZGV4MkNvbG9yLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4KSAtPiAoUkdCQ29sb3IgYUNvbG9yKSIpfSwKLQl7IkludmVydENvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBteUNvbG9yKSIpfSwKLQl7IlJlYWxDb2xvciIsIChQeUNGdW5jdGlvbilRZF9SZWFsQ29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJHQkNvbG9yIGNvbG9yKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0U3ViVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0U3ViVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgbXlDb2xvcnMsIHNob3J0IGlUYWJSZXMsIENUYWJIYW5kbGUgdGFyZ2V0VGJsKSAtPiBOb25lIil9LAotCXsiTWFrZUlUYWJsZSIsIChQeUNGdW5jdGlvbilRZF9NYWtlSVRhYmxlLCAxLAotCSBQeURvY19TVFIoIihDVGFiSGFuZGxlIGNUYWJILCBJVGFiSGFuZGxlIGlUYWJILCBzaG9ydCByZXMpIC0+IE5vbmUiKX0sCi0JeyJTZXRDbGllbnRJRCIsIChQeUNGdW5jdGlvbilRZF9TZXRDbGllbnRJRCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaWQpIC0+IE5vbmUiKX0sCi0JeyJQcm90ZWN0RW50cnkiLCAoUHlDRnVuY3Rpb24pUWRfUHJvdGVjdEVudHJ5LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgQm9vbGVhbiBwcm90ZWN0KSAtPiBOb25lIil9LAotCXsiUmVzZXJ2ZUVudHJ5IiwgKFB5Q0Z1bmN0aW9uKVFkX1Jlc2VydmVFbnRyeSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEJvb2xlYW4gcmVzZXJ2ZSkgLT4gTm9uZSIpfSwKLQl7IlFERXJyb3IiLCAoUHlDRnVuY3Rpb24pUWRfUURFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkNvcHlEZWVwTWFzayIsIChQeUNGdW5jdGlvbilRZF9Db3B5RGVlcE1hc2ssIDEsCi0JIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBCaXRNYXBQdHIgbWFza0JpdHMsIEJpdE1hcFB0ciBkc3RCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgbWFza1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCi0JeyJHZXRQYXR0ZXJuIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBhdHRlcm5JRCkgLT4gKFBhdEhhbmRsZSBfcnYpIil9LAotCXsiTWFjR2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0dldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY3Vyc29ySUQpIC0+IChDdXJzSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHBpY3R1cmVJRCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiRGVsdGFQb2ludCIsIChQeUNGdW5jdGlvbilRZF9EZWx0YVBvaW50LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdEEsIFBvaW50IHB0QikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlNoaWVsZEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9TaGllbGRDdXJzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3Qgc2hpZWxkUmVjdCwgUG9pbnQgb2Zmc2V0UHQpIC0+IE5vbmUiKX0sCi0JeyJTY3JlZW5SZXMiLCAoUHlDRnVuY3Rpb24pUWRfU2NyZWVuUmVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBzY3JuSFJlcywgc2hvcnQgc2NyblZSZXMpIil9LAotCXsiR2V0SW5kUGF0dGVybiIsIChQeUNGdW5jdGlvbilRZF9HZXRJbmRQYXR0ZXJuLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwYXR0ZXJuTGlzdElELCBzaG9ydCBpbmRleCkgLT4gKFBhdHRlcm4gdGhlUGF0KSIpfSwKLQl7IlNsb3BlRnJvbUFuZ2xlIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nsb3BlRnJvbUFuZ2xlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBhbmdsZSkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJBbmdsZUZyb21TbG9wZSIsIChQeUNGdW5jdGlvbilRZF9BbmdsZUZyb21TbG9wZSwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc2xvcGUpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0UGl4Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeE1hcCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKLQl7IkdldFBpeERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeERlcHRoLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcGl4TWFwKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFFER2xvYmFsc1JhbmRvbVNlZWQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzUmFuZG9tU2VlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0UURHbG9iYWxzU2NyZWVuQml0cyIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNTY3JlZW5CaXRzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCaXRNYXAgc2NyZWVuQml0cykiKX0sCi0JeyJHZXRRREdsb2JhbHNBcnJvdyIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNBcnJvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ3Vyc29yIGFycm93KSIpfSwKLQl7IkdldFFER2xvYmFsc0RhcmtHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0RhcmtHcmF5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGRrR3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNMaWdodEdyYXkiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzTGlnaHRHcmF5LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGx0R3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0dyYXksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gZ3JheSkiKX0sCi0JeyJHZXRRREdsb2JhbHNCbGFjayIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNCbGFjaywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBibGFjaykiKX0sCi0JeyJHZXRRREdsb2JhbHNXaGl0ZSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNXaGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiB3aGl0ZSkiKX0sCi0JeyJHZXRRREdsb2JhbHNUaGVQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1RoZVBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0JeyJTZXRRREdsb2JhbHNSYW5kb21TZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFFER2xvYmFsc1JhbmRvbVNlZWQsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZG9tU2VlZCkgLT4gTm9uZSIpfSwKLQl7IlNldFFER2xvYmFsc0Fycm93IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFFER2xvYmFsc0Fycm93LCAxLAotCSBQeURvY19TVFIoIihDdXJzb3IgYXJyb3cpIC0+IE5vbmUiKX0sCi0JeyJHZXRSZWdpb25Cb3VuZHMiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UmVnaW9uQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNSZWdpb25SZWN0YW5ndWxhciIsIChQeUNGdW5jdGlvbilRZF9Jc1JlZ2lvblJlY3Rhbmd1bGFyLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ3JlYXRlTmV3UG9ydCIsIChQeUNGdW5jdGlvbilRZF9DcmVhdGVOZXdQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAotCXsiU2V0UURFcnJvciIsIChQeUNGdW5jdGlvbilRZF9TZXRRREVycm9yLCAxLAotCSBQeURvY19TVFIoIihPU0VyciBlcnIpIC0+IE5vbmUiKX0sCi0JeyJMTUdldFNjclZSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRTY3JWUmVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKLQl7IkxNU2V0U2NyVlJlcyIsIChQeUNGdW5jdGlvbilRZF9MTVNldFNjclZSZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0U2NySFJlcyIsIChQeUNGdW5jdGlvbilRZF9MTUdldFNjckhSZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiBfcnYpIil9LAotCXsiTE1TZXRTY3JIUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0U2NySFJlcywgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRNYWluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TWFpbkRldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldE1haW5EZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXREZXZpY2VMaXN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0RGV2aWNlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9MTVNldERldmljZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRRRENvbG9ycyIsIChQeUNGdW5jdGlvbilRZF9MTUdldFFEQ29sb3JzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0UURDb2xvcnMiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRRRENvbG9ycywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRXaWR0aExpc3RIYW5kIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0V2lkdGhMaXN0SGFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCi0JeyJMTVNldFdpZHRoTGlzdEhhbmQiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRXaWR0aExpc3RIYW5kLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEhpbGl0ZU1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRIaWxpdGVNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAotCXsiTE1TZXRIaWxpdGVNb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0SGlsaXRlTW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoVUludDggdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldFdpZHRoVGFiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0V2lkdGhUYWJIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiTE1TZXRXaWR0aFRhYkhhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldFdpZHRoVGFiSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldExhc3RTUEV4dHJhIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TGFzdFNQRXh0cmEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQzMiBfcnYpIil9LAotCXsiTE1TZXRMYXN0U1BFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9MTVNldExhc3RTUEV4dHJhLCAxLAotCSBQeURvY19TVFIoIihTSW50MzIgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldExhc3RGT05EIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0TGFzdEZPTkQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiTE1TZXRMYXN0Rk9ORCIsIChQeUNGdW5jdGlvbilRZF9MTVNldExhc3RGT05ELCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdmFsdWUpIC0+IE5vbmUiKX0sCi0JeyJMTUdldEZyYWN0RW5hYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCi0JeyJMTVNldEZyYWN0RW5hYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0RnJhY3RFbmFibGUsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRUaGVHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0VGhlR0RldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkxNU2V0VGhlR0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldFRoZUdEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdESGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRIaWxpdGVSR0IiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRIaWxpdGVSR0IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGhpbGl0ZVJHQlZhbHVlKSIpfSwKLQl7IkxNU2V0SGlsaXRlUkdCIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0SGlsaXRlUkdCLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZSkgLT4gTm9uZSIpfSwKLQl7IkxNR2V0Q3Vyc29yTmV3IiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0Q3Vyc29yTmV3LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJMTVNldEN1cnNvck5ldyIsIChQeUNGdW5jdGlvbilRZF9MTVNldEN1cnNvck5ldywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiB2YWx1ZSkgLT4gTm9uZSIpfSwKLQl7IlRleHRGb250IiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRGb250LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBmb250KSAtPiBOb25lIil9LAotCXsiVGV4dEZhY2UiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dEZhY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0eWxlUGFyYW1ldGVyIGZhY2UpIC0+IE5vbmUiKX0sCi0JeyJUZXh0TW9kZSIsIChQeUNGdW5jdGlvbilRZF9UZXh0TW9kZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSkgLT4gTm9uZSIpfSwKLQl7IlRleHRTaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRTaXplLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzaXplKSAtPiBOb25lIil9LAotCXsiU3BhY2VFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9TcGFjZUV4dHJhLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBleHRyYSkgLT4gTm9uZSIpfSwKLQl7IkRyYXdDaGFyIiwgKFB5Q0Z1bmN0aW9uKVFkX0RyYXdDaGFyLCAxLAotCSBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiBOb25lIil9LAotCXsiRHJhd1N0cmluZyIsIChQeUNGdW5jdGlvbilRZF9EcmF3U3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcykgLT4gTm9uZSIpfSwKLQl7Ik1hY0RyYXdUZXh0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0RyYXdUZXh0LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IE5vbmUiKX0sCi0JeyJDaGFyV2lkdGgiLCAoUHlDRnVuY3Rpb24pUWRfQ2hhcldpZHRoLCAxLAotCSBQeURvY19TVFIoIihDaGFyUGFyYW1ldGVyIGNoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlN0cmluZ1dpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX1N0cmluZ1dpZHRoLCAxLAotCSBQeURvY19TVFIoIihTdHIyNTUgcykgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJUZXh0V2lkdGgiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dFdpZHRoLCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0Rm9udEluZm8iLCAoUHlDRnVuY3Rpb24pUWRfR2V0Rm9udEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZvbnRJbmZvIGluZm8pIil9LAotCXsiQ2hhckV4dHJhIiwgKFB5Q0Z1bmN0aW9uKVFkX0NoYXJFeHRyYSwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgZXh0cmEpIC0+IE5vbmUiKX0sCi0JeyJUcnVuY1N0cmluZyIsIChQeUNGdW5jdGlvbilRZF9UcnVuY1N0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgd2lkdGgsIFN0cjI1NSB0aGVTdHJpbmcsIFRydW5jQ29kZSB0cnVuY1doZXJlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldFBvcnQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciB0aGVQb3J0KSAtPiBOb25lIil9LAotCXsiR2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgY3Vyc29ySUQpIC0+IChDdXJzSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q3Vyc29yLCAxLAotCSBQeURvY19TVFIoIihDdXJzb3IgY3JzcikgLT4gTm9uZSIpfSwKLQl7IlNob3dDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2hvd0N1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiTGluZVRvIiwgKFB5Q0Z1bmN0aW9uKVFkX0xpbmVUbywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaCwgc2hvcnQgdikgLT4gTm9uZSIpfSwKLQl7IlNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiAoUmVjdCByKSIpfSwKLQl7Ik9mZnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAotCXsiSW5zZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0luc2V0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAotCXsiVW5pb25SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1VuaW9uUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBzcmMxLCBSZWN0IHNyYzIpIC0+IChSZWN0IGRzdFJlY3QpIil9LAotCXsiRXF1YWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VxdWFsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0MSwgUmVjdCByZWN0MikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkZyYW1lUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKLQl7IkludmVydFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAotCXsiRmlsbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgciwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCi0JeyJDb3B5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ24sIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJTZXRSZWN0UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFJlY3RSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gTm9uZSIpfSwKLQl7Ik9mZnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9PZmZzZXRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IlVuaW9uUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1VuaW9uUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJYb3JSZ24iLCAoUHlDRnVuY3Rpb24pUWRfWG9yUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCi0JeyJFcXVhbFJnbiIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbkEsIFJnbkhhbmRsZSByZ25CKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiRnJhbWVSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJQYWludFJnbiIsIChQeUNGdW5jdGlvbilRZF9QYWludFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKLQl7IkludmVydFJnbiIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCi0JeyJGaWxsUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAotCXsiR2V0UGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4ZWwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJQdEluUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QdEluUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJlY3QgcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkRyYXdUZXh0IiwgKFB5Q0Z1bmN0aW9uKVFkX0RyYXdUZXh0LCAxLAotCSBQeURvY19TVFIoIihCdWZmZXIgdGV4dEJ1Ziwgc2hvcnQgZmlyc3RCeXRlLCBzaG9ydCBieXRlQ291bnQpIC0+IE5vbmUiKX0sCi0JeyJCaXRNYXAiLCAoUHlDRnVuY3Rpb24pUWRfQml0TWFwLCAxLAotCSBQeURvY19TVFIoIlRha2UgKHN0cmluZywgaW50LCBSZWN0KSBhcmd1bWVudCBhbmQgY3JlYXRlIEJpdE1hcCIpfSwKLQl7IlJhd0JpdE1hcCIsIChQeUNGdW5jdGlvbilRZF9SYXdCaXRNYXAsIDEsCi0JIFB5RG9jX1NUUigiVGFrZSBzdHJpbmcgQml0TWFwIGFuZCB0dXJuIGludG8gQml0TWFwIG9iamVjdCIpfSwKKyAgICB7IkdldFBvcnQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR3JhZlB0ciBwb3J0KSIpfSwKKyAgICB7IkdyYWZEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR3JhZkRldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZGV2aWNlKSAtPiBOb25lIil9LAorICAgIHsiU2V0UG9ydEJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UG9ydEJpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBibSkgLT4gTm9uZSIpfSwKKyAgICB7IlBvcnRTaXplIiwgKFB5Q0Z1bmN0aW9uKVFkX1BvcnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiTW92ZVBvcnRUbyIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlUG9ydFRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBsZWZ0R2xvYmFsLCBzaG9ydCB0b3BHbG9iYWwpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRPcmlnaW4iLCAoUHlDRnVuY3Rpb24pUWRfU2V0T3JpZ2luLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRZF9TZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRZF9HZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiQ2xpcFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfQ2xpcFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkJhY2tQYXQiLCAoUHlDRnVuY3Rpb24pUWRfQmFja1BhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJJbml0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX0luaXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNTZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEN1cnNvciBjcnNyKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9IaWRlQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNTaG93Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1Nob3dDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ik9ic2N1cmVDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfT2JzY3VyZUN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZVBlbiIsIChQeUNGdW5jdGlvbilRZF9IaWRlUGVuLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJTaG93UGVuIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nob3dQZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBlbiIsIChQeUNGdW5jdGlvbilRZF9HZXRQZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7IkdldFBlblN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBlblN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQZW5TdGF0ZSBwblN0YXRlKSIpfSwKKyAgICB7IlNldFBlblN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBlblN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQZW5TdGF0ZSBwblN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiUGVuU2l6ZSIsIChQeUNGdW5jdGlvbilRZF9QZW5TaXplLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aWR0aCwgc2hvcnQgaGVpZ2h0KSAtPiBOb25lIil9LAorICAgIHsiUGVuTW9kZSIsIChQeUNGdW5jdGlvbilRZF9QZW5Nb2RlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlKSAtPiBOb25lIil9LAorICAgIHsiUGVuUGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJQZW5Ob3JtYWwiLCAoUHlDRnVuY3Rpb24pUWRfUGVuTm9ybWFsLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZlVG8iLCAoUHlDRnVuY3Rpb24pUWRfTW92ZVRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiTW92ZSIsIChQeUNGdW5jdGlvbilRZF9Nb3ZlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNMaW5lVG8iLCAoUHlDRnVuY3Rpb24pUWRfTWFjTGluZVRvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiBOb25lIil9LAorICAgIHsiTGluZSIsIChQeUNGdW5jdGlvbilRZF9MaW5lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJGb3JlQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfRm9yZUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGNvbG9yKSAtPiBOb25lIil9LAorICAgIHsiQmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX0JhY2tDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBjb2xvcikgLT4gTm9uZSIpfSwKKyAgICB7IkNvbG9yQml0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvbG9yQml0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB3aGljaEJpdCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiAoUmVjdCByKSIpfSwKKyAgICB7Ik1hY09mZnNldFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjT2Zmc2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAorICAgIHsiTWFjSW5zZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0luc2V0UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IChSZWN0IHIpIil9LAorICAgIHsiU2VjdFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2VjdFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJNYWNVbmlvblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjVW5pb25SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNyYzEsIFJlY3Qgc3JjMikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJNYWNFcXVhbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfTWFjRXF1YWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QxLCBSZWN0IHJlY3QyKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW1wdHlSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VtcHR5UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTWFjRnJhbWVSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0ZyYW1lUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiTWFjSW52ZXJ0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNJbnZlcnRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNGaWxsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9NYWNGaWxsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IkZyYW1lT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZU92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IlBhaW50T3ZhbCIsIChQeUNGdW5jdGlvbilRZF9QYWludE92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZU92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkludmVydE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0T3ZhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByKSAtPiBOb25lIil9LAorICAgIHsiRmlsbE92YWwiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbE92YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJGcmFtZVJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9GcmFtZVJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludFJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QYWludFJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJFcmFzZVJvdW5kUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcmFzZVJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0Um91bmRSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IG92YWxXaWR0aCwgc2hvcnQgb3ZhbEhlaWdodCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbFJvdW5kUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBvdmFsV2lkdGgsIHNob3J0IG92YWxIZWlnaHQsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiRnJhbWVBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVBcmMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgc3RhcnRBbmdsZSwgc2hvcnQgYXJjQW5nbGUpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludEFyYyIsIChQeUNGdW5jdGlvbilRZF9QYWludEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkVyYXNlQXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlQXJjLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIHNob3J0IHN0YXJ0QW5nbGUsIHNob3J0IGFyY0FuZ2xlKSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0QXJjIiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxBcmMiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbEFyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSwgUGF0dGVybiBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTmV3UmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik9wZW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfT3BlblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfQ2xvc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJCaXRNYXBUb1JlZ2lvbiIsIChQeUNGdW5jdGlvbilRZF9CaXRNYXBUb1JlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbiwgQml0TWFwUHRyIGJNYXApIC0+IE5vbmUiKX0sCisgICAgeyJSZ25Ub0hhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9SZ25Ub0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbiwgSGFuZGxlIGZsYXR0ZW5lZFJnbkRhdGFIZGwpIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNDb3B5UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY0NvcHlSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBzcmNSZ24sIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJTZXRFbXB0eVJnbiIsIChQeUNGdW5jdGlvbilRZF9TZXRFbXB0eVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1NldFJlY3RSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjU2V0UmVjdFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgbGVmdCwgc2hvcnQgdG9wLCBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tKSAtPiBOb25lIil9LAorICAgIHsiUmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9SZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNPZmZzZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjT2Zmc2V0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJJbnNldFJnbiIsIChQeUNGdW5jdGlvbilRZF9JbnNldFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiU2VjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9TZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNVbmlvblJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNVbmlvblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiRGlmZlJnbiIsIChQeUNGdW5jdGlvbilRZF9EaWZmUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNYb3JSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjWG9yUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduQSwgUmduSGFuZGxlIHNyY1JnbkIsIFJnbkhhbmRsZSBkc3RSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJSZWN0SW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfUmVjdEluUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNFcXVhbFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNFcXVhbFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbkEsIFJnbkhhbmRsZSByZ25CKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiRW1wdHlSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRW1wdHlSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJNYWNGcmFtZVJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNGcmFtZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbikgLT4gTm9uZSIpfSwKKyAgICB7Ik1hY1BhaW50UmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1BhaW50UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRXJhc2VSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJNYWNJbnZlcnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfTWFjSW52ZXJ0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiTWFjRmlsbFJnbiIsIChQeUNGdW5jdGlvbilRZF9NYWNGaWxsUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNjcm9sbFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfU2Nyb2xsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBkaCwgc2hvcnQgZHYsIFJnbkhhbmRsZSB1cGRhdGVSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5Qml0cyIsIChQeUNGdW5jdGlvbilRZF9Db3B5Qml0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBkc3RCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TWFzayIsIChQeUNGdW5jdGlvbilRZF9Db3B5TWFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQml0TWFwUHRyIHNyY0JpdHMsIEJpdE1hcFB0ciBtYXNrQml0cywgQml0TWFwUHRyIGRzdEJpdHMsIFJlY3Qgc3JjUmVjdCwgUmVjdCBtYXNrUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiBOb25lIil9LAorICAgIHsiT3BlblBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfT3BlblBpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcGljRnJhbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlBpY0NvbW1lbnQiLCAoUHlDRnVuY3Rpb24pUWRfUGljQ29tbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQga2luZCwgc2hvcnQgZGF0YVNpemUsIEhhbmRsZSBkYXRhSGFuZGxlKSAtPiBOb25lIil9LAorICAgIHsiQ2xvc2VQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Nsb3NlUGljdHVyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRHJhd1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1BpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBteVBpY3R1cmUsIFJlY3QgZHN0UmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IktpbGxQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVFkX0tpbGxQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihQaWNIYW5kbGUgbXlQaWN0dXJlKSAtPiBOb25lIil9LAorICAgIHsiT3BlblBvbHkiLCAoUHlDRnVuY3Rpb24pUWRfT3BlblBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBvbHlIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkNsb3NlUG9seSIsIChQeUNGdW5jdGlvbilRZF9DbG9zZVBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IktpbGxQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0tpbGxQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCisgICAgeyJPZmZzZXRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiBOb25lIil9LAorICAgIHsiRnJhbWVQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX1BhaW50UG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiRXJhc2VQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX0VyYXNlUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5KSAtPiBOb25lIil9LAorICAgIHsiSW52ZXJ0UG9seSIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRQb2x5LCAxLAorICAgICBQeURvY19TVFIoIihQb2x5SGFuZGxlIHBvbHkpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsUG9seSIsIChQeUNGdW5jdGlvbilRZF9GaWxsUG9seSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9seUhhbmRsZSBwb2x5LCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFB0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoUG9pbnQgcHQpIil9LAorICAgIHsiTG9jYWxUb0dsb2JhbCIsIChQeUNGdW5jdGlvbilRZF9Mb2NhbFRvR2xvYmFsLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7Ikdsb2JhbFRvTG9jYWwiLCAoUHlDRnVuY3Rpb24pUWRfR2xvYmFsVG9Mb2NhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJSYW5kb20iLCAoUHlDRnVuY3Rpb24pUWRfUmFuZG9tLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiTWFjR2V0UGl4ZWwiLCAoUHlDRnVuY3Rpb24pUWRfTWFjR2V0UGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTY2FsZVB0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NjYWxlUHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCkgLT4gKFBvaW50IHB0KSIpfSwKKyAgICB7Ik1hcFB0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFB0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChQb2ludCBwdCkiKX0sCisgICAgeyJNYXBSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChSZWN0IHIpIil9LAorICAgIHsiTWFwUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJnbiwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNYXBQb2x5IiwgKFB5Q0Z1bmN0aW9uKVFkX01hcFBvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJTdGRCaXRzIiwgKFB5Q0Z1bmN0aW9uKVFkX1N0ZEJpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKEJpdE1hcFB0ciBzcmNCaXRzLCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2tSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJBZGRQdCIsIChQeUNGdW5jdGlvbilRZF9BZGRQdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3JjLCBQb2ludCBkc3QpIC0+IChQb2ludCBkc3QpIil9LAorICAgIHsiRXF1YWxQdCIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFB0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdDEsIFBvaW50IHB0MikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik1hY1B0SW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX01hY1B0SW5SZWN0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgUmVjdCByKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHQyUmVjdCIsIChQeUNGdW5jdGlvbilRZF9QdDJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdDEsIFBvaW50IHB0MikgLT4gKFJlY3QgZHN0UmVjdCkiKX0sCisgICAgeyJQdFRvQW5nbGUiLCAoUHlDRnVuY3Rpb24pUWRfUHRUb0FuZ2xlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBvaW50IHB0KSAtPiAoc2hvcnQgYW5nbGUpIil9LAorICAgIHsiU3ViUHQiLCAoUHlDRnVuY3Rpb24pUWRfU3ViUHQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHNyYywgUG9pbnQgZHN0KSAtPiAoUG9pbnQgZHN0KSIpfSwKKyAgICB7IlB0SW5SZ24iLCAoUHlDRnVuY3Rpb24pUWRfUHRJblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQsIFJnbkhhbmRsZSByZ24pIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJOZXdQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfTmV3UGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRpc3Bvc2VQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZVBpeE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiQ29weVBpeE1hcCIsIChQeUNGdW5jdGlvbilRZF9Db3B5UGl4TWFwLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjUE0sIFBpeE1hcEhhbmRsZSBkc3RQTSkgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld1BpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9OZXdQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiRGlzcG9zZVBpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9EaXNwb3NlUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5UGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX0NvcHlQaXhQYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBzcmNQUCwgUGl4UGF0SGFuZGxlIGRzdFBQKSAtPiBOb25lIil9LAorICAgIHsiUGVuUGl4UGF0IiwgKFB5Q0Z1bmN0aW9uKVFkX1BlblBpeFBhdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiQmFja1BpeFBhdCIsIChQeUNGdW5jdGlvbilRZF9CYWNrUGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRQaXhQYXQiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UGl4UGF0LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwYXRJRCkgLT4gKFBpeFBhdEhhbmRsZSBfcnYpIil9LAorICAgIHsiTWFrZVJHQlBhdCIsIChQeUNGdW5jdGlvbilRZF9NYWtlUkdCUGF0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHAsIFJHQkNvbG9yIG15Q29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQ1JlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxDT3ZhbCIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ092YWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgciwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiRmlsbENSb3VuZFJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSb3VuZFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgb3ZhbFdpZHRoLCBzaG9ydCBvdmFsSGVpZ2h0LCBQaXhQYXRIYW5kbGUgcHApIC0+IE5vbmUiKX0sCisgICAgeyJGaWxsQ0FyYyIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ0FyYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByLCBzaG9ydCBzdGFydEFuZ2xlLCBzaG9ydCBhcmNBbmdsZSwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiRmlsbENSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRmlsbENSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24sIFBpeFBhdEhhbmRsZSBwcCkgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxDUG9seSIsIChQeUNGdW5jdGlvbilRZF9GaWxsQ1BvbHksIDEsCisgICAgIFB5RG9jX1NUUigiKFBvbHlIYW5kbGUgcG9seSwgUGl4UGF0SGFuZGxlIHBwKSAtPiBOb25lIil9LAorICAgIHsiUkdCRm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1JHQkZvcmVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJSR0JCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUkdCQmFja0NvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKKyAgICB7IlNldENQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9TZXRDUGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYsIFJHQkNvbG9yIGNQaXgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0UGl4IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnRQaXgsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldENQaXhlbCIsIChQeUNGdW5jdGlvbilRZF9HZXRDUGl4ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IChSR0JDb2xvciBjUGl4KSIpfSwKKyAgICB7IkdldEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9HZXRGb3JlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKKyAgICB7IkdldEJhY2tDb2xvciIsIChQeUNGdW5jdGlvbilRZF9HZXRCYWNrQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJHQkNvbG9yIGNvbG9yKSIpfSwKKyAgICB7Ik9wQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfT3BDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJIaWxpdGVDb2xvciIsIChQeUNGdW5jdGlvbilRZF9IaWxpdGVDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJEaXNwb3NlQ1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VDVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY1RhYmxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0Q1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldENUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY3RJRCkgLT4gKENUYWJIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldENDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfR2V0Q0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgY3JzcklEKSAtPiAoQ0Nyc3JIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldENDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0Nyc3JIYW5kbGUgY0Nyc3IpIC0+IE5vbmUiKX0sCisgICAgeyJBbGxvY0N1cnNvciIsIChQeUNGdW5jdGlvbilRZF9BbGxvY0N1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiRGlzcG9zZUNDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfRGlzcG9zZUNDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKENDcnNySGFuZGxlIGNDcnNyKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWF4RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldE1heERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0KSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldENUU2VlZCIsIChQeUNGdW5jdGlvbilRZF9HZXRDVFNlZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfR2V0RGV2aWNlTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TWFpbkRldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE5leHREZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfR2V0TmV4dERldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgY3VyRGV2aWNlKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRlc3REZXZpY2VBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUWRfVGVzdERldmljZUF0dHJpYnV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBhdHRyaWJ1dGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXREZXZpY2VBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUWRfU2V0RGV2aWNlQXR0cmlidXRlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGF0dHJpYnV0ZSwgQm9vbGVhbiB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkluaXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0luaXRHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBxZFJlZk51bSwgbG9uZyBtb2RlLCBHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCisgICAgeyJOZXdHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX05ld0dEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgbG9uZyBtb2RlKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRpc3Bvc2VHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX0Rpc3Bvc2VHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRHRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEdEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdESGFuZGxlIGdkKSAtPiBOb25lIil9LAorICAgIHsiR2V0R0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9HZXRHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiQ29sb3IySW5kZXgiLCAoUHlDRnVuY3Rpb24pUWRfQ29sb3IySW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKFJHQkNvbG9yIG15Q29sb3IpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJJbmRleDJDb2xvciIsIChQeUNGdW5jdGlvbilRZF9JbmRleDJDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFJHQkNvbG9yIGFDb2xvcikiKX0sCisgICAgeyJJbnZlcnRDb2xvciIsIChQeUNGdW5jdGlvbilRZF9JbnZlcnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgbXlDb2xvcikiKX0sCisgICAgeyJSZWFsQ29sb3IiLCAoUHlDRnVuY3Rpb24pUWRfUmVhbENvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkdldFN1YlRhYmxlIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFN1YlRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihDVGFiSGFuZGxlIG15Q29sb3JzLCBzaG9ydCBpVGFiUmVzLCBDVGFiSGFuZGxlIHRhcmdldFRibCkgLT4gTm9uZSIpfSwKKyAgICB7Ik1ha2VJVGFibGUiLCAoUHlDRnVuY3Rpb24pUWRfTWFrZUlUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjVGFiSCwgSVRhYkhhbmRsZSBpVGFiSCwgc2hvcnQgcmVzKSAtPiBOb25lIil9LAorICAgIHsiU2V0Q2xpZW50SUQiLCAoUHlDRnVuY3Rpb24pUWRfU2V0Q2xpZW50SUQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGlkKSAtPiBOb25lIil9LAorICAgIHsiUHJvdGVjdEVudHJ5IiwgKFB5Q0Z1bmN0aW9uKVFkX1Byb3RlY3RFbnRyeSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEJvb2xlYW4gcHJvdGVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlJlc2VydmVFbnRyeSIsIChQeUNGdW5jdGlvbilRZF9SZXNlcnZlRW50cnksIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBCb29sZWFuIHJlc2VydmUpIC0+IE5vbmUiKX0sCisgICAgeyJRREVycm9yIiwgKFB5Q0Z1bmN0aW9uKVFkX1FERXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJDb3B5RGVlcE1hc2siLCAoUHlDRnVuY3Rpb24pUWRfQ29weURlZXBNYXNrLCAxLAorICAgICBQeURvY19TVFIoIihCaXRNYXBQdHIgc3JjQml0cywgQml0TWFwUHRyIG1hc2tCaXRzLCBCaXRNYXBQdHIgZHN0Qml0cywgUmVjdCBzcmNSZWN0LCBSZWN0IG1hc2tSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrUmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGF0dGVybiIsIChQeUNGdW5jdGlvbilRZF9HZXRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwYXR0ZXJuSUQpIC0+IChQYXRIYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1hY0dldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9NYWNHZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGN1cnNvcklEKSAtPiAoQ3Vyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRZF9HZXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBwaWN0dXJlSUQpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkRlbHRhUG9pbnQiLCAoUHlDRnVuY3Rpb24pUWRfRGVsdGFQb2ludCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHRBLCBQb2ludCBwdEIpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTaGllbGRDdXJzb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2hpZWxkQ3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHNoaWVsZFJlY3QsIFBvaW50IG9mZnNldFB0KSAtPiBOb25lIil9LAorICAgIHsiU2NyZWVuUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX1NjcmVlblJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgc2NybkhSZXMsIHNob3J0IHNjcm5WUmVzKSIpfSwKKyAgICB7IkdldEluZFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pUWRfR2V0SW5kUGF0dGVybiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGF0dGVybkxpc3RJRCwgc2hvcnQgaW5kZXgpIC0+IChQYXR0ZXJuIHRoZVBhdCkiKX0sCisgICAgeyJTbG9wZUZyb21BbmdsZSIsIChQeUNGdW5jdGlvbilRZF9TbG9wZUZyb21BbmdsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgYW5nbGUpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiQW5nbGVGcm9tU2xvcGUiLCAoUHlDRnVuY3Rpb24pUWRfQW5nbGVGcm9tU2xvcGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNsb3BlKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldFBpeEJvdW5kcyIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhNYXApIC0+IChSZWN0IGJvdW5kcykiKX0sCisgICAgeyJHZXRQaXhEZXB0aCIsIChQeUNGdW5jdGlvbilRZF9HZXRQaXhEZXB0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeE1hcCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRRREdsb2JhbHNSYW5kb21TZWVkIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc1JhbmRvbVNlZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldFFER2xvYmFsc1NjcmVlbkJpdHMiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzU2NyZWVuQml0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQml0TWFwIHNjcmVlbkJpdHMpIil9LAorICAgIHsiR2V0UURHbG9iYWxzQXJyb3ciLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzQXJyb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEN1cnNvciBhcnJvdykiKX0sCisgICAgeyJHZXRRREdsb2JhbHNEYXJrR3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNEYXJrR3JheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBka0dyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzTGlnaHRHcmF5IiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFFER2xvYmFsc0xpZ2h0R3JheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGF0dGVybiBsdEdyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzR3JheSIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNHcmF5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChQYXR0ZXJuIGdyYXkpIil9LAorICAgIHsiR2V0UURHbG9iYWxzQmxhY2siLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzQmxhY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gYmxhY2spIil9LAorICAgIHsiR2V0UURHbG9iYWxzV2hpdGUiLCAoUHlDRnVuY3Rpb24pUWRfR2V0UURHbG9iYWxzV2hpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBhdHRlcm4gd2hpdGUpIil9LAorICAgIHsiR2V0UURHbG9iYWxzVGhlUG9ydCIsIChQeUNGdW5jdGlvbilRZF9HZXRRREdsb2JhbHNUaGVQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiU2V0UURHbG9iYWxzUmFuZG9tU2VlZCIsIChQeUNGdW5jdGlvbilRZF9TZXRRREdsb2JhbHNSYW5kb21TZWVkLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHJhbmRvbVNlZWQpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRRREdsb2JhbHNBcnJvdyIsIChQeUNGdW5jdGlvbilRZF9TZXRRREdsb2JhbHNBcnJvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ3Vyc29yIGFycm93KSAtPiBOb25lIil9LAorICAgIHsiR2V0UmVnaW9uQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFJlZ2lvbkJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7IklzUmVnaW9uUmVjdGFuZ3VsYXIiLCAoUHlDRnVuY3Rpb24pUWRfSXNSZWdpb25SZWN0YW5ndWxhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHJlZ2lvbikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNyZWF0ZU5ld1BvcnQiLCAoUHlDRnVuY3Rpb24pUWRfQ3JlYXRlTmV3UG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IlNldFFERXJyb3IiLCAoUHlDRnVuY3Rpb24pUWRfU2V0UURFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRTY3JWUmVzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0U2NyVlJlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU0ludDE2IF9ydikiKX0sCisgICAgeyJMTVNldFNjclZSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRTY3JWUmVzLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldFNjckhSZXMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRTY3JIUmVzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MTYgX3J2KSIpfSwKKyAgICB7IkxNU2V0U2NySFJlcyIsIChQeUNGdW5jdGlvbilRZF9MTVNldFNjckhSZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0TWFpbkRldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldE1haW5EZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldE1haW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRNYWluRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0RGV2aWNlTGlzdCIsIChQeUNGdW5jdGlvbilRZF9MTUdldERldmljZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldERldmljZUxpc3QiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXREZXZpY2VMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0UURDb2xvcnMiLCAoUHlDRnVuY3Rpb24pUWRfTE1HZXRRRENvbG9ycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldFFEQ29sb3JzIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0UURDb2xvcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0V2lkdGhMaXN0SGFuZCIsIChQeUNGdW5jdGlvbilRZF9MTUdldFdpZHRoTGlzdEhhbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHsiTE1TZXRXaWR0aExpc3RIYW5kIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNU2V0V2lkdGhMaXN0SGFuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRIaWxpdGVNb2RlIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0SGlsaXRlTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKKyAgICB7IkxNU2V0SGlsaXRlTW9kZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldEhpbGl0ZU1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRXaWR0aFRhYkhhbmRsZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldFdpZHRoVGFiSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkxNU2V0V2lkdGhUYWJIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRXaWR0aFRhYkhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRMYXN0U1BFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9MTUdldExhc3RTUEV4dHJhLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTSW50MzIgX3J2KSIpfSwKKyAgICB7IkxNU2V0TGFzdFNQRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRMYXN0U1BFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDMyIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRMYXN0Rk9ORCIsIChQeUNGdW5jdGlvbilRZF9MTUdldExhc3RGT05ELCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkxNU2V0TGFzdEZPTkQiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRMYXN0Rk9ORCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAorICAgIHsiTE1HZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldEZyYWN0RW5hYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50OCBfcnYpIil9LAorICAgIHsiTE1TZXRGcmFjdEVuYWJsZSIsIChQeUNGdW5jdGlvbilRZF9MTVNldEZyYWN0RW5hYmxlLCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0VGhlR0RldmljZSIsIChQeUNGdW5jdGlvbilRZF9MTUdldFRoZUdEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEdESGFuZGxlIF9ydikiKX0sCisgICAgeyJMTVNldFRoZUdEZXZpY2UiLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRUaGVHRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0SGlsaXRlUkdCIiwgKFB5Q0Z1bmN0aW9uKVFkX0xNR2V0SGlsaXRlUkdCLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBoaWxpdGVSR0JWYWx1ZSkiKX0sCisgICAgeyJMTVNldEhpbGl0ZVJHQiIsIChQeUNGdW5jdGlvbilRZF9MTVNldEhpbGl0ZVJHQiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgaGlsaXRlUkdCVmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJMTUdldEN1cnNvck5ldyIsIChQeUNGdW5jdGlvbilRZF9MTUdldEN1cnNvck5ldywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiTE1TZXRDdXJzb3JOZXciLCAoUHlDRnVuY3Rpb24pUWRfTE1TZXRDdXJzb3JOZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gdmFsdWUpIC0+IE5vbmUiKX0sCisgICAgeyJUZXh0Rm9udCIsIChQeUNGdW5jdGlvbilRZF9UZXh0Rm9udCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlRleHRGYWNlIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRGYWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHlsZVBhcmFtZXRlciBmYWNlKSAtPiBOb25lIil9LAorICAgIHsiVGV4dE1vZGUiLCAoUHlDRnVuY3Rpb24pUWRfVGV4dE1vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IG1vZGUpIC0+IE5vbmUiKX0sCisgICAgeyJUZXh0U2l6ZSIsIChQeUNGdW5jdGlvbilRZF9UZXh0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNwYWNlRXh0cmEiLCAoUHlDRnVuY3Rpb24pUWRfU3BhY2VFeHRyYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgZXh0cmEpIC0+IE5vbmUiKX0sCisgICAgeyJEcmF3Q2hhciIsIChQeUNGdW5jdGlvbilRZF9EcmF3Q2hhciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gTm9uZSIpfSwKKyAgICB7IkRyYXdTdHJpbmciLCAoUHlDRnVuY3Rpb24pUWRfRHJhd1N0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHMpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNEcmF3VGV4dCIsIChQeUNGdW5jdGlvbilRZF9NYWNEcmF3VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiBOb25lIil9LAorICAgIHsiQ2hhcldpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX0NoYXJXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBjaCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTdHJpbmdXaWR0aCIsIChQeUNGdW5jdGlvbilRZF9TdHJpbmdXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU3RyMjU1IHMpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVGV4dFdpZHRoIiwgKFB5Q0Z1bmN0aW9uKVFkX1RleHRXaWR0aCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldEZvbnRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldEZvbnRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGb250SW5mbyBpbmZvKSIpfSwKKyAgICB7IkNoYXJFeHRyYSIsIChQeUNGdW5jdGlvbilRZF9DaGFyRXh0cmEsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGV4dHJhKSAtPiBOb25lIil9LAorICAgIHsiVHJ1bmNTdHJpbmciLCAoUHlDRnVuY3Rpb24pUWRfVHJ1bmNTdHJpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHdpZHRoLCBTdHIyNTUgdGhlU3RyaW5nLCBUcnVuY0NvZGUgdHJ1bmNXaGVyZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJTZXRQb3J0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgdGhlUG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldEN1cnNvciIsIChQeUNGdW5jdGlvbilRZF9HZXRDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGN1cnNvcklEKSAtPiAoQ3Vyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1NldEN1cnNvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ3Vyc29yIGNyc3IpIC0+IE5vbmUiKX0sCisgICAgeyJTaG93Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKVFkX1Nob3dDdXJzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkxpbmVUbyIsIChQeUNGdW5jdGlvbilRZF9MaW5lVG8sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGgsIHNob3J0IHYpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX1NldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGxlZnQsIHNob3J0IHRvcCwgc2hvcnQgcmlnaHQsIHNob3J0IGJvdHRvbSkgLT4gKFJlY3QgcikiKX0sCisgICAgeyJPZmZzZXRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX09mZnNldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7Ikluc2V0UmVjdCIsIChQeUNGdW5jdGlvbilRZF9JbnNldFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgciwgc2hvcnQgZGgsIHNob3J0IGR2KSAtPiAoUmVjdCByKSIpfSwKKyAgICB7IlVuaW9uUmVjdCIsIChQeUNGdW5jdGlvbilRZF9VbmlvblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3Qgc3JjMSwgUmVjdCBzcmMyKSAtPiAoUmVjdCBkc3RSZWN0KSIpfSwKKyAgICB7IkVxdWFsUmVjdCIsIChQeUNGdW5jdGlvbilRZF9FcXVhbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdDEsIFJlY3QgcmVjdDIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJGcmFtZVJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfRnJhbWVSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIpIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ludmVydFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcikgLT4gTm9uZSIpfSwKKyAgICB7IkZpbGxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVFkX0ZpbGxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHIsIFBhdHRlcm4gcGF0KSAtPiBOb25lIil9LAorICAgIHsiQ29weVJnbiIsIChQeUNGdW5jdGlvbilRZF9Db3B5UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgc3JjUmduLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiU2V0UmVjdFJnbiIsIChQeUNGdW5jdGlvbilRZF9TZXRSZWN0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsIHNob3J0IHJpZ2h0LCBzaG9ydCBib3R0b20pIC0+IE5vbmUiKX0sCisgICAgeyJPZmZzZXRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfT2Zmc2V0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJVbmlvblJnbiIsIChQeUNGdW5jdGlvbilRZF9VbmlvblJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiWG9yUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX1hvclJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHNyY1JnbkEsIFJnbkhhbmRsZSBzcmNSZ25CLCBSZ25IYW5kbGUgZHN0UmduKSAtPiBOb25lIil9LAorICAgIHsiRXF1YWxSZ24iLCAoUHlDRnVuY3Rpb24pUWRfRXF1YWxSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ25BLCBSZ25IYW5kbGUgcmduQikgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkZyYW1lUmduIiwgKFB5Q0Z1bmN0aW9uKVFkX0ZyYW1lUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiUGFpbnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfUGFpbnRSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZ24pIC0+IE5vbmUiKX0sCisgICAgeyJJbnZlcnRSZ24iLCAoUHlDRnVuY3Rpb24pUWRfSW52ZXJ0UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduKSAtPiBOb25lIil9LAorICAgIHsiRmlsbFJnbiIsIChQeUNGdW5jdGlvbilRZF9GaWxsUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmduLCBQYXR0ZXJuIHBhdCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFBpeGVsIiwgKFB5Q0Z1bmN0aW9uKVFkX0dldFBpeGVsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoLCBzaG9ydCB2KSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiUHRJblJlY3QiLCAoUHlDRnVuY3Rpb24pUWRfUHRJblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHB0LCBSZWN0IHIpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJEcmF3VGV4dCIsIChQeUNGdW5jdGlvbilRZF9EcmF3VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHRCdWYsIHNob3J0IGZpcnN0Qnl0ZSwgc2hvcnQgYnl0ZUNvdW50KSAtPiBOb25lIil9LAorICAgIHsiQml0TWFwIiwgKFB5Q0Z1bmN0aW9uKVFkX0JpdE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCJUYWtlIChzdHJpbmcsIGludCwgUmVjdCkgYXJndW1lbnQgYW5kIGNyZWF0ZSBCaXRNYXAiKX0sCisgICAgeyJSYXdCaXRNYXAiLCAoUHlDRnVuY3Rpb24pUWRfUmF3Qml0TWFwLCAxLAorICAgICBQeURvY19TVFIoIlRha2Ugc3RyaW5nIEJpdE1hcCBhbmQgdHVybiBpbnRvIEJpdE1hcCBvYmplY3QiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtNzA5NSwxNSArNzA5NSwxNSBAQAogKi8KIFB5T2JqZWN0ICpCTU9ial9OZXdDb3BpZWQoQml0TWFwUHRyIGl0c2VsZikKIHsKLSAgICAgICAgQml0TWFwT2JqZWN0ICppdDsKLSAgICAgICAgQml0TWFwUHRyIGl0c2VsZl9jb3B5OworICAgIEJpdE1hcE9iamVjdCAqaXQ7CisgICAgQml0TWFwUHRyIGl0c2VsZl9jb3B5OwogCi0gICAgICAgIGlmICgoaXRzZWxmX2NvcHk9KEJpdE1hcFB0ciltYWxsb2Moc2l6ZW9mKEJpdE1hcCkpKSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAqaXRzZWxmX2NvcHkgPSAqaXRzZWxmOwotICAgICAgICBpdCA9IChCaXRNYXBPYmplY3QgKilCTU9ial9OZXcoaXRzZWxmX2NvcHkpOwotICAgICAgICBpdC0+cmVmZXJyZWRfYml0bWFwID0gaXRzZWxmX2NvcHk7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBpZiAoKGl0c2VsZl9jb3B5PShCaXRNYXBQdHIpbWFsbG9jKHNpemVvZihCaXRNYXApKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgKml0c2VsZl9jb3B5ID0gKml0c2VsZjsKKyAgICBpdCA9IChCaXRNYXBPYmplY3QgKilCTU9ial9OZXcoaXRzZWxmX2NvcHkpOworICAgIGl0LT5yZWZlcnJlZF9iaXRtYXAgPSBpdHNlbGZfY29weTsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwpAQCAtNzExMSw0MiArNzExMSw0MiBAQAogCiB2b2lkIGluaXRfUWQodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEJpdE1hcFB0ciwgQk1PYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChCaXRNYXBQdHIsIEJNT2JqX0NvbnZlcnQpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR3JhZlB0ciwgR3JhZk9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdyYWZQdHIsIEdyYWZPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhSR0JDb2xvclB0ciwgUWRSR0JfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChSR0JDb2xvciwgUWRSR0JfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEJpdE1hcFB0ciwgQk1PYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEJpdE1hcFB0ciwgQk1PYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEdyYWZQdHIsIEdyYWZPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdyYWZQdHIsIEdyYWZPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFJHQkNvbG9yUHRyLCBRZFJHQl9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoUkdCQ29sb3IsIFFkUkdCX0NvbnZlcnQpOwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUWQiLCBRZF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1FkIiwgUWRfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUWRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChRZF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JR3JhZlBvcnRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJkdyYWZQb3J0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmR3JhZlBvcnRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJHcmFmUG9ydCIsIChQeU9iamVjdCAqKSZHcmFmUG9ydF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkdyYWZQb3J0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiR3JhZlBvcnRUeXBlIiwgKFB5T2JqZWN0ICopJkdyYWZQb3J0X1R5cGUpOwotCUJpdE1hcF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmQml0TWFwX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmQml0TWFwX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiQml0TWFwIiwgKFB5T2JqZWN0ICopJkJpdE1hcF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkJpdE1hcF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJpdE1hcFR5cGUiLCAoUHlPYmplY3QgKikmQml0TWFwX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFFkX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUWRfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRZF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIEdyYWZQb3J0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZHcmFmUG9ydF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkdyYWZQb3J0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiR3JhZlBvcnQiLCAoUHlPYmplY3QgKikmR3JhZlBvcnRfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZHcmFmUG9ydF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdyYWZQb3J0VHlwZSIsIChQeU9iamVjdCAqKSZHcmFmUG9ydF9UeXBlKTsKKyAgICBCaXRNYXBfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJkJpdE1hcF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJkJpdE1hcF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkJpdE1hcCIsIChQeU9iamVjdCAqKSZCaXRNYXBfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZCaXRNYXBfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJCaXRNYXBUeXBlIiwgKFB5T2JqZWN0ICopJkJpdE1hcF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jIGIvTWFjL01vZHVsZXMvcWRvZmZzL19RZG9mZnNtb2R1bGUuYwppbmRleCBiNDUxNDcyLi42ODZlY2E0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xZG9mZnMvX1Fkb2Zmc21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3Fkb2Zmcy9fUWRvZmZzbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM4LDkwICszOCw5MCBAQAogI2RlZmluZSBHV29ybGRPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmR1dvcmxkX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJkdXb3JsZF9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgR1dvcmxkT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JR1dvcmxkUHRyIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgR1dvcmxkUHRyIG9iX2l0c2VsZjsKIH0gR1dvcmxkT2JqZWN0OwogCiBQeU9iamVjdCAqR1dvcmxkT2JqX05ldyhHV29ybGRQdHIgaXRzZWxmKQogewotCUdXb3JsZE9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOwotCWl0ID0gUHlPYmplY3RfTkVXKEdXb3JsZE9iamVjdCwgJkdXb3JsZF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgR1dvcmxkT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgaXQgPSBQeU9iamVjdF9ORVcoR1dvcmxkT2JqZWN0LCAmR1dvcmxkX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IEdXb3JsZE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBHV29ybGRQdHIgKnBfaXRzZWxmKQogewotCWlmICghR1dvcmxkT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdXb3JsZCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChHV29ybGRPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghR1dvcmxkT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkdXb3JsZCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChHV29ybGRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBHV29ybGRPYmpfZGVhbGxvYyhHV29ybGRPYmplY3QgKnNlbGYpCiB7Ci0JRGlzcG9zZUdXb3JsZChzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgRGlzcG9zZUdXb3JsZChzZWxmLT5vYl9pdHNlbGYpOworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR1dvcmxkT2JqX0dldEdXb3JsZERldmljZShHV29ybGRPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgX3J2OwogI2lmbmRlZiBHZXRHV29ybGREZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhHZXRHV29ybGREZXZpY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdXb3JsZERldmljZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0R1dvcmxkRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0R1dvcmxkRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpHV29ybGRPYmpfR2V0R1dvcmxkUGl4TWFwKEdXb3JsZE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R1dvcmxkUGl4TWFwCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R1dvcmxkUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHV29ybGRQaXhNYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdXb3JsZFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdXb3JsZFBpeE1hcChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqR1dvcmxkT2JqX2FzX0dyYWZQdHIoR1dvcmxkT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR3JhZlB0ciBfcnY7CiAjaWZuZGVmIGFzX0dyYWZQdHIKLQlQeU1hY19QUkVDSEVDSyhhc19HcmFmUHRyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhhc19HcmFmUHRyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBhc19HcmFmUHRyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IGFzX0dyYWZQdHIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIEdXb3JsZE9ial9tZXRob2RzW10gPSB7Ci0JeyJHZXRHV29ybGREZXZpY2UiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX0dldEdXb3JsZERldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgX3J2KSIpfSwKLQl7IkdldEdXb3JsZFBpeE1hcCIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfR2V0R1dvcmxkUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaXhNYXBIYW5kbGUgX3J2KSIpfSwKLQl7ImFzX0dyYWZQdHIiLCAoUHlDRnVuY3Rpb24pR1dvcmxkT2JqX2FzX0dyYWZQdHIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEdyYWZQdHIgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldEdXb3JsZERldmljZSIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfR2V0R1dvcmxkRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBfcnYpIil9LAorICAgIHsiR2V0R1dvcmxkUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKUdXb3JsZE9ial9HZXRHV29ybGRQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiYXNfR3JhZlB0ciIsIChQeUNGdW5jdGlvbilHV29ybGRPYmpfYXNfR3JhZlB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR3JhZlB0ciBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBHV29ybGRPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0xMzgsNjEgKzEzOCw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKkdXb3JsZE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JR1dvcmxkUHRyIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgR1dvcmxkUHRyIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIEdXb3JsZE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKEdXb3JsZE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBHV29ybGRPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChHV29ybGRPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgR1dvcmxkT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IEdXb3JsZF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RZG9mZnMuR1dvcmxkIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoR1dvcmxkT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgR1dvcmxkT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIEdXb3JsZE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgR1dvcmxkT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBHV29ybGRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JR1dvcmxkT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCUdXb3JsZE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlHV29ybGRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUdXb3JsZE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlHV29ybGRPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlHV29ybGRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RZG9mZnMuR1dvcmxkIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoR1dvcmxkT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgR1dvcmxkT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIEdXb3JsZE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgR1dvcmxkT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBHV29ybGRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgR1dvcmxkT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIEdXb3JsZE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBHV29ybGRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIEdXb3JsZE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBHV29ybGRPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBHV29ybGRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBHV29ybGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMDAsNDg5ICsyMDAsNDg5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX05ld0dXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUURFcnIgX2VycjsKLQlHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkOwotCXNob3J0IFBpeGVsRGVwdGg7Ci0JUmVjdCBib3VuZHNSZWN0OwotCUNUYWJIYW5kbGUgY1RhYmxlOwotCUdESGFuZGxlIGFHRGV2aWNlOwotCUdXb3JsZEZsYWdzIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBRREVyciBfZXJyOworICAgIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQ7CisgICAgc2hvcnQgUGl4ZWxEZXB0aDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ1RhYkhhbmRsZSBjVGFibGU7CisgICAgR0RIYW5kbGUgYUdEZXZpY2U7CisgICAgR1dvcmxkRmxhZ3MgZmxhZ3M7CiAjaWZuZGVmIE5ld0dXb3JsZAotCVB5TWFjX1BSRUNIRUNLKE5ld0dXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJlBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmNUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0RldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld0dXb3JsZCgmb2Zmc2NyZWVuR1dvcmxkLAotCSAgICAgICAgICAgICAgICAgUGl4ZWxEZXB0aCwKLQkgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgY1RhYmxlLAotCSAgICAgICAgICAgICAgICAgYUdEZXZpY2UsCi0JICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIG9mZnNjcmVlbkdXb3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmUGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3R1dvcmxkKCZvZmZzY3JlZW5HV29ybGQsCisgICAgICAgICAgICAgICAgICAgICBQaXhlbERlcHRoLAorICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICBjVGFibGUsCisgICAgICAgICAgICAgICAgICAgICBhR0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgb2Zmc2NyZWVuR1dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfTG9ja1BpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIExvY2tQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhMb2NrUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2NrUGl4ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExvY2tQaXhlbHMocG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IExvY2tQaXhlbHMocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19VbmxvY2tQaXhlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBVbmxvY2tQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhVbmxvY2tQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFVubG9ja1BpeGVscyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlVbmxvY2tQaXhlbHMocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVbmxvY2tQaXhlbHMocG0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfVXBkYXRlR1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRGbGFncyBfcnY7Ci0JR1dvcmxkUHRyIG9mZnNjcmVlbkdXb3JsZDsKLQlzaG9ydCBwaXhlbERlcHRoOwotCVJlY3QgYm91bmRzUmVjdDsKLQlDVGFiSGFuZGxlIGNUYWJsZTsKLQlHREhhbmRsZSBhR0RldmljZTsKLQlHV29ybGRGbGFncyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR1dvcmxkRmxhZ3MgX3J2OworICAgIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQ7CisgICAgc2hvcnQgcGl4ZWxEZXB0aDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgQ1RhYkhhbmRsZSBjVGFibGU7CisgICAgR0RIYW5kbGUgYUdEZXZpY2U7CisgICAgR1dvcmxkRmxhZ3MgZmxhZ3M7CiAjaWZuZGVmIFVwZGF0ZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZUdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlR1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmNUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZhR0RldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVXBkYXRlR1dvcmxkKCZvZmZzY3JlZW5HV29ybGQsCi0JICAgICAgICAgICAgICAgICAgIHBpeGVsRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgICBjVGFibGUsCi0JICAgICAgICAgICAgICAgICAgIGFHRGV2aWNlLAotCSAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIG9mZnNjcmVlbkdXb3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY1RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBVcGRhdGVHV29ybGQoJm9mZnNjcmVlbkdXb3JsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYUdEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgb2Zmc2NyZWVuR1dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgcG9ydDsKKyAgICBHREhhbmRsZSBnZGg7CiAjaWZuZGVmIEdldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKEdldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRHV29ybGQoJnBvcnQsCi0JICAgICAgICAgICZnZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRHV29ybGQoJnBvcnQsCisgICAgICAgICAgICAgICZnZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19TZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIHBvcnQ7Ci0JR0RIYW5kbGUgZ2RoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBwb3J0OworICAgIEdESGFuZGxlIGdkaDsKICNpZm5kZWYgU2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0R1dvcmxkKHBvcnQsCi0JICAgICAgICAgIGdkaCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEdXb3JsZChwb3J0LAorICAgICAgICAgICAgICBnZGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfQ1RhYkNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNUYWJIYW5kbGUgY3RhYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ1RhYkhhbmRsZSBjdGFiOwogI2lmbmRlZiBDVGFiQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKENUYWJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDVGFiQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY3RhYikpCi0JCXJldHVybiBOVUxMOwotCUNUYWJDaGFuZ2VkKGN0YWIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmY3RhYikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENUYWJDaGFuZ2VkKGN0YWIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfUGl4UGF0Q2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4UGF0SGFuZGxlIHBwYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeFBhdEhhbmRsZSBwcGF0OwogI2lmbmRlZiBQaXhQYXRDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soUGl4UGF0Q2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGl4UGF0Q2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHBhdCkpCi0JCXJldHVybiBOVUxMOwotCVBpeFBhdENoYW5nZWQocHBhdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcGF0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUGl4UGF0Q2hhbmdlZChwcGF0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1BvcnRDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHcmFmUHRyIHBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEdyYWZQdHIgcG9ydDsKICNpZm5kZWYgUG9ydENoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhQb3J0Q2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUG9ydENoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JUG9ydENoYW5nZWQocG9ydCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBvcnRDaGFuZ2VkKHBvcnQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR0RldmljZUNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUdESGFuZGxlIGdkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBHRGV2aWNlQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKEdEZXZpY2VDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHRGV2aWNlQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR0RldmljZUNoYW5nZWQoZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdEZXZpY2VDaGFuZ2VkKGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19BbGxvd1B1cmdlUGl4ZWxzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgQWxsb3dQdXJnZVBpeGVscwotCVB5TWFjX1BSRUNIRUNLKEFsbG93UHVyZ2VQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsbG93UHVyZ2VQaXhlbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQWxsb3dQdXJnZVBpeGVscyhwbSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFsbG93UHVyZ2VQaXhlbHMocG0pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfTm9QdXJnZVBpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIE5vUHVyZ2VQaXhlbHMKLQlQeU1hY19QUkVDSEVDSyhOb1B1cmdlUGl4ZWxzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOb1B1cmdlUGl4ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCU5vUHVyZ2VQaXhlbHMocG0pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBOb1B1cmdlUGl4ZWxzKHBtKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX0dldFBpeGVsc1N0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlHV29ybGRGbGFncyBfcnY7Ci0JUGl4TWFwSGFuZGxlIHBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBHV29ybGRGbGFncyBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBHZXRQaXhlbHNTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFBpeGVsc1N0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaXhlbHNTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhlbHNTdGF0ZShwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4ZWxzU3RhdGUocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19TZXRQaXhlbHNTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHBtOwotCUdXb3JsZEZsYWdzIHN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgR1dvcmxkRmxhZ3Mgc3RhdGU7CiAjaWZuZGVmIFNldFBpeGVsc1N0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UGl4ZWxzU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFBpeGVsc1N0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFBpeGVsc1N0YXRlKHBtLAotCSAgICAgICAgICAgICAgIHN0YXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UGl4ZWxzU3RhdGUocG0sCisgICAgICAgICAgICAgICAgICAgc3RhdGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfR2V0UGl4Um93Qnl0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtOwogI2lmbmRlZiBHZXRQaXhSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldFBpeFJvd0J5dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQaXhSb3dCeXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQaXhSb3dCeXRlcyhwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UGl4Um93Qnl0ZXMocG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19OZXdTY3JlZW5CdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVFERXJyIF9lcnI7Ci0JUmVjdCBnbG9iYWxSZWN0OwotCUJvb2xlYW4gcHVyZ2VhYmxlOwotCUdESGFuZGxlIGdkaDsKLQlQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBRREVyciBfZXJyOworICAgIFJlY3QgZ2xvYmFsUmVjdDsKKyAgICBCb29sZWFuIHB1cmdlYWJsZTsKKyAgICBHREhhbmRsZSBnZGg7CisgICAgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKICNpZm5kZWYgTmV3U2NyZWVuQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soTmV3U2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZwdXJnZWFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3U2NyZWVuQnVmZmVyKCZnbG9iYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgcHVyZ2VhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZvZmZzY3JlZW5QaXhNYXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGdkaCwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvZmZzY3JlZW5QaXhNYXApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHVyZ2VhYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld1NjcmVlbkJ1ZmZlcigmZ2xvYmFsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmdlYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfRGlzcG9zZVNjcmVlbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKICNpZm5kZWYgRGlzcG9zZVNjcmVlbkJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VTY3JlZW5CdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERpc3Bvc2VTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm9mZnNjcmVlblBpeE1hcCkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VTY3JlZW5CdWZmZXIob2Zmc2NyZWVuUGl4TWFwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm9mZnNjcmVlblBpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VTY3JlZW5CdWZmZXIob2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1FERG9uZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JR3JhZlB0ciBwb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBHcmFmUHRyIHBvcnQ7CiAjaWZuZGVmIFFERG9uZQotCVB5TWFjX1BSRUNIRUNLKFFERG9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUUREb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFERG9uZShwb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRRERvbmUocG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX09mZnNjcmVlblZlcnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgT2Zmc2NyZWVuVmVyc2lvbgotCVB5TWFjX1BSRUNIRUNLKE9mZnNjcmVlblZlcnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE9mZnNjcmVlblZlcnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9mZnNjcmVlblZlcnNpb24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gT2Zmc2NyZWVuVmVyc2lvbigpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19OZXdUZW1wU2NyZWVuQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlRREVyciBfZXJyOwotCVJlY3QgZ2xvYmFsUmVjdDsKLQlCb29sZWFuIHB1cmdlYWJsZTsKLQlHREhhbmRsZSBnZGg7Ci0JUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUURFcnIgX2VycjsKKyAgICBSZWN0IGdsb2JhbFJlY3Q7CisgICAgQm9vbGVhbiBwdXJnZWFibGU7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXA7CiAjaWZuZGVmIE5ld1RlbXBTY3JlZW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhOZXdUZW1wU2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdUZW1wU2NyZWVuQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZnbG9iYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHVyZ2VhYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld1RlbXBTY3JlZW5CdWZmZXIoJmdsb2JhbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVyZ2VhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNjcmVlblBpeE1hcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG9mZnNjcmVlblBpeE1hcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmdsb2JhbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwdXJnZWFibGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3VGVtcFNjcmVlbkJ1ZmZlcigmZ2xvYmFsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXJnZWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb2Zmc2NyZWVuUGl4TWFwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRZG9mZnNfUGl4TWFwMzJCaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCVBpeE1hcEhhbmRsZSBwbUhhbmRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUGl4TWFwSGFuZGxlIHBtSGFuZGxlOwogI2lmbmRlZiBQaXhNYXAzMkJpdAotCVB5TWFjX1BSRUNIRUNLKFBpeE1hcDMyQml0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQaXhNYXAzMkJpdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG1IYW5kbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQaXhNYXAzMkJpdChwbUhhbmRsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUGl4TWFwMzJCaXQocG1IYW5kbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlFkb2Zmc19HZXRQaXhNYXBCeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JUGl4TWFwSGFuZGxlIHBtOwotCWludCBmcm9tLCBsZW5ndGg7Ci0JY2hhciAqY3A7CisgICAgUGl4TWFwSGFuZGxlIHBtOworICAgIGludCBmcm9tLCBsZW5ndGg7CisgICAgY2hhciAqY3A7CiAKLQlpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpaSIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmbGVuZ3RoKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQljcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOwotCV9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpaSIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmbGVuZ3RoKSApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNwID0gR2V0UGl4QmFzZUFkZHIocG0pK2Zyb207CisgICAgX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNwLCBsZW5ndGgpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUWRvZmZzX1B1dFBpeE1hcEJ5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlQaXhNYXBIYW5kbGUgcG07Ci0JaW50IGZyb20sIGxlbmd0aDsKLQljaGFyICpjcCwgKmljcDsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgaW50IGZyb20sIGxlbmd0aDsKKyAgICBjaGFyICpjcCwgKmljcDsKIAotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmlzIyIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmaWNwLCAmbGVuZ3RoKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQljcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOwotCW1lbWNweShjcCwgaWNwLCBsZW5ndGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpcyMiLCBSZXNPYmpfQ29udmVydCwgJnBtLCAmZnJvbSwgJmljcCwgJmxlbmd0aCkgKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBjcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOworICAgIG1lbWNweShjcCwgaWNwLCBsZW5ndGgpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBRZG9mZnNfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiTmV3R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19OZXdHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IFBpeGVsRGVwdGgsIFJlY3QgYm91bmRzUmVjdCwgQ1RhYkhhbmRsZSBjVGFibGUsIEdESGFuZGxlIGFHRGV2aWNlLCBHV29ybGRGbGFncyBmbGFncykgLT4gKEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQpIil9LAotCXsiTG9ja1BpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfTG9ja1BpeGVscywgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVW5sb2NrUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19VbmxvY2tQaXhlbHMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gTm9uZSIpfSwKLQl7IlVwZGF0ZUdXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfVXBkYXRlR1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBwaXhlbERlcHRoLCBSZWN0IGJvdW5kc1JlY3QsIENUYWJIYW5kbGUgY1RhYmxlLCBHREhhbmRsZSBhR0RldmljZSwgR1dvcmxkRmxhZ3MgZmxhZ3MpIC0+IChHV29ybGRGbGFncyBfcnYsIEdXb3JsZFB0ciBvZmZzY3JlZW5HV29ybGQpIil9LAotCXsiR2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkiKX0sCi0JeyJTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1NldEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAotCXsiQ1RhYkNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0NUYWJDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihDVGFiSGFuZGxlIGN0YWIpIC0+IE5vbmUiKX0sCi0JeyJQaXhQYXRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19QaXhQYXRDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcHBhdCkgLT4gTm9uZSIpfSwKLQl7IlBvcnRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19Qb3J0Q2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciBwb3J0KSAtPiBOb25lIil9LAotCXsiR0RldmljZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dEZXZpY2VDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IE5vbmUiKX0sCi0JeyJBbGxvd1B1cmdlUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19BbGxvd1B1cmdlUGl4ZWxzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJOb1B1cmdlUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19Ob1B1cmdlUGl4ZWxzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCi0JeyJHZXRQaXhlbHNTdGF0ZSIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4ZWxzU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEdXb3JsZEZsYWdzIF9ydikiKX0sCi0JeyJTZXRQaXhlbHNTdGF0ZSIsIChQeUNGdW5jdGlvbilRZG9mZnNfU2V0UGl4ZWxzU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgR1dvcmxkRmxhZ3Mgc3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRQaXhSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4Um93Qnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7Ik5ld1NjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3U2NyZWVuQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihSZWN0IGdsb2JhbFJlY3QsIEJvb2xlYW4gcHVyZ2VhYmxlKSAtPiAoR0RIYW5kbGUgZ2RoLCBQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwKSIpfSwKLQl7IkRpc3Bvc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0Rpc3Bvc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXApIC0+IE5vbmUiKX0sCi0JeyJRRERvbmUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1FERG9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhZlB0ciBwb3J0KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiT2Zmc2NyZWVuVmVyc2lvbiIsIChQeUNGdW5jdGlvbilRZG9mZnNfT2Zmc2NyZWVuVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiTmV3VGVtcFNjcmVlbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3VGVtcFNjcmVlbkJ1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0LCBCb29sZWFuIHB1cmdlYWJsZSkgLT4gKEdESGFuZGxlIGdkaCwgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcCkiKX0sCi0JeyJQaXhNYXAzMkJpdCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUGl4TWFwMzJCaXQsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbUhhbmRsZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFBpeE1hcEJ5dGVzIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HZXRQaXhNYXBCeXRlcywgMSwKLQkgUHlEb2NfU1RSKCIocGl4bWFwLCBpbnQgc3RhcnQsIGludCBzaXplKSAtPiBzdHJpbmcuIFJldHVybiBieXRlcyBmcm9tIHRoZSBwaXhtYXAiKX0sCi0JeyJQdXRQaXhNYXBCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfUHV0UGl4TWFwQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKHBpeG1hcCwgaW50IHN0YXJ0LCBzdHJpbmcgZGF0YSkuIFN0b3JlIGJ5dGVzIGludG8gdGhlIHBpeG1hcCIpfSwKKyAgICB7Ik5ld0dXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfTmV3R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBQaXhlbERlcHRoLCBSZWN0IGJvdW5kc1JlY3QsIENUYWJIYW5kbGUgY1RhYmxlLCBHREhhbmRsZSBhR0RldmljZSwgR1dvcmxkRmxhZ3MgZmxhZ3MpIC0+IChHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKKyAgICB7IkxvY2tQaXhlbHMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0xvY2tQaXhlbHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlVubG9ja1BpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfVW5sb2NrUGl4ZWxzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVHV29ybGQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1VwZGF0ZUdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcGl4ZWxEZXB0aCwgUmVjdCBib3VuZHNSZWN0LCBDVGFiSGFuZGxlIGNUYWJsZSwgR0RIYW5kbGUgYUdEZXZpY2UsIEdXb3JsZEZsYWdzIGZsYWdzKSAtPiAoR1dvcmxkRmxhZ3MgX3J2LCBHV29ybGRQdHIgb2Zmc2NyZWVuR1dvcmxkKSIpfSwKKyAgICB7IkdldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAorICAgIHsiU2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19TZXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKKyAgICB7IkNUYWJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19DVGFiQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ1RhYkhhbmRsZSBjdGFiKSAtPiBOb25lIil9LAorICAgIHsiUGl4UGF0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUGl4UGF0Q2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4UGF0SGFuZGxlIHBwYXQpIC0+IE5vbmUiKX0sCisgICAgeyJQb3J0Q2hhbmdlZCIsIChQeUNGdW5jdGlvbilRZG9mZnNfUG9ydENoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgcG9ydCkgLT4gTm9uZSIpfSwKKyAgICB7IkdEZXZpY2VDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19HRGV2aWNlQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiBOb25lIil9LAorICAgIHsiQWxsb3dQdXJnZVBpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfQWxsb3dQdXJnZVBpeGVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiTm9QdXJnZVBpeGVscyIsIChQeUNGdW5jdGlvbilRZG9mZnNfTm9QdXJnZVBpeGVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGl4ZWxzU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeGVsc1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChHV29ybGRGbGFncyBfcnYpIil9LAorICAgIHsiU2V0UGl4ZWxzU3RhdGUiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1NldFBpeGVsc1N0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIEdXb3JsZEZsYWdzIHN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0UGl4Um93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX0dldFBpeFJvd0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJOZXdTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld1NjcmVlbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBnbG9iYWxSZWN0LCBCb29sZWFuIHB1cmdlYWJsZSkgLT4gKEdESGFuZGxlIGdkaCwgUGl4TWFwSGFuZGxlIG9mZnNjcmVlblBpeE1hcCkiKX0sCisgICAgeyJEaXNwb3NlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19EaXNwb3NlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgb2Zmc2NyZWVuUGl4TWFwKSAtPiBOb25lIil9LAorICAgIHsiUUREb25lIiwgKFB5Q0Z1bmN0aW9uKVFkb2Zmc19RRERvbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYWZQdHIgcG9ydCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik9mZnNjcmVlblZlcnNpb24iLCAoUHlDRnVuY3Rpb24pUWRvZmZzX09mZnNjcmVlblZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7Ik5ld1RlbXBTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX05ld1RlbXBTY3JlZW5CdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgZ2xvYmFsUmVjdCwgQm9vbGVhbiBwdXJnZWFibGUpIC0+IChHREhhbmRsZSBnZGgsIFBpeE1hcEhhbmRsZSBvZmZzY3JlZW5QaXhNYXApIil9LAorICAgIHsiUGl4TWFwMzJCaXQiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1BpeE1hcDMyQml0LCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG1IYW5kbGUpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRQaXhNYXBCeXRlcyIsIChQeUNGdW5jdGlvbilRZG9mZnNfR2V0UGl4TWFwQnl0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKHBpeG1hcCwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkgLT4gc3RyaW5nLiBSZXR1cm4gYnl0ZXMgZnJvbSB0aGUgcGl4bWFwIil9LAorICAgIHsiUHV0UGl4TWFwQnl0ZXMiLCAoUHlDRnVuY3Rpb24pUWRvZmZzX1B1dFBpeE1hcEJ5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihwaXhtYXAsIGludCBzdGFydCwgc3RyaW5nIGRhdGEpLiBTdG9yZSBieXRlcyBpbnRvIHRoZSBwaXhtYXAiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtNjkwLDMxICs2OTAsMzEgQEAKIAogdm9pZCBpbml0X1Fkb2Zmcyh2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR1dvcmxkUHRyLCBHV29ybGRPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChHV29ybGRQdHIsIEdXb3JsZE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR1dvcmxkUHRyLCBHV29ybGRPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdXb3JsZFB0ciwgR1dvcmxkT2JqX0NvbnZlcnQpOwogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUWRvZmZzIiwgUWRvZmZzX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfUWRvZmZzIiwgUWRvZmZzX21ldGhvZHMpOwogI2lmbmRlZiBfX0xQNjRfXwotCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwotCVFkb2Zmc19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKFFkb2Zmc19FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkb2Zmc19FcnJvcikgIT0gMCkKLQkJcmV0dXJuOwotCUdXb3JsZF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmR1dvcmxkX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmR1dvcmxkX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiR1dvcmxkIiwgKFB5T2JqZWN0ICopJkdXb3JsZF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJkdXb3JsZF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdXb3JsZFR5cGUiLCAoUHlPYmplY3QgKikmR1dvcmxkX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFFkb2Zmc19FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFFkb2Zmc19FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFFkb2Zmc19FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIEdXb3JsZF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmR1dvcmxkX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmR1dvcmxkX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiR1dvcmxkIiwgKFB5T2JqZWN0ICopJkdXb3JsZF9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJkdXb3JsZF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkdXb3JsZFR5cGUiLCAoUHlPYmplY3QgKikmR1dvcmxkX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3F0L19RdG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKaW5kZXggNDg0NWU0YS4uYmY2N2NkYSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvcXQvX1F0bW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTU2LDM3ICs1NiwzNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFF0VGltZVJlY29yZF9OZXcoVGltZVJlY29yZCAqaXRzZWxmKQogewotICAgICAgICBpZiAoaXRzZWxmLT5iYXNlKQotICAgICAgICAgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJmxPJiIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIGl0c2VsZi0+YmFzZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gIFB5X0J1aWxkVmFsdWUoIk8mbE8iLCBQeU1hY19CdWlsZHdpZGUsICZpdHNlbGYtPnZhbHVlLCBpdHNlbGYtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CisgICAgaWYgKGl0c2VsZi0+YmFzZSkKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mbE8mIiwgUHlNYWNfQnVpbGR3aWRlLCAmaXRzZWxmLT52YWx1ZSwgaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgaXRzZWxmLT5iYXNlKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAgUHlfQnVpbGRWYWx1ZSgiTyZsTyIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsCisgICAgICAgICAgICBQeV9Ob25lKTsKIH0KIAogc3RhdGljIGludAogUXRUaW1lUmVjb3JkX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRpbWVSZWNvcmQgKnBfaXRzZWxmKQogewotICAgICAgICBQeU9iamVjdCAqYmFzZSA9IE5VTEw7Ci0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZsfE8iLCBQeU1hY19HZXR3aWRlLCAmcF9pdHNlbGYtPnZhbHVlLCAmcF9pdHNlbGYtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2UpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCBiYXNlID09IE5VTEwgfHwgYmFzZSA9PSBQeV9Ob25lICkKLSAgICAgICAgICAgICAgICBwX2l0c2VsZi0+YmFzZSA9IE5VTEw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoICFUaW1lQmFzZU9ial9Db252ZXJ0KGJhc2UsICZwX2l0c2VsZi0+YmFzZSkgKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiAxOworICAgIFB5T2JqZWN0ICpiYXNlID0gTlVMTDsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgIk8mbHxPIiwgUHlNYWNfR2V0d2lkZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgJmJhc2UpICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBiYXNlID09IE5VTEwgfHwgYmFzZSA9PSBQeV9Ob25lICkKKyAgICAgICAgcF9pdHNlbGYtPmJhc2UgPSBOVUxMOworICAgIGVsc2UKKyAgICAgICAgaWYgKCAhVGltZUJhc2VPYmpfQ29udmVydChiYXNlLCAmcF9pdHNlbGYtPmJhc2UpICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CiBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNdXNpY01JRElQYWNrZXQgKnBfaXRzZWxmKQogewotICAgICAgICBpbnQgZHVtbXk7CisgICAgaW50IGR1bW15OwogCi0gICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiaGxzIyIsICZwX2l0c2VsZi0+bGVuZ3RoLCAmcF9pdHNlbGYtPnJlc2VydmVkLCBwX2l0c2VsZi0+ZGF0YSwgZHVtbXkpICkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcmV0dXJuIDE7CisgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJobHMjIiwgJnBfaXRzZWxmLT5sZW5ndGgsICZwX2l0c2VsZi0+cmVzZXJ2ZWQsIHBfaXRzZWxmLT5kYXRhLCBkdW1teSkgKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKIH0KIAogCkBAIC0xMDEsNDcgKzEwMSw0NyBAQAogI2RlZmluZSBJZGxlTWFuYWdlck9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZJZGxlTWFuYWdlcl9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZJZGxlTWFuYWdlcl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgSWRsZU1hbmFnZXJPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlJZGxlTWFuYWdlciBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIElkbGVNYW5hZ2VyIG9iX2l0c2VsZjsKIH0gSWRsZU1hbmFnZXJPYmplY3Q7CiAKIFB5T2JqZWN0ICpJZGxlTWFuYWdlck9ial9OZXcoSWRsZU1hbmFnZXIgaXRzZWxmKQogewotCUlkbGVNYW5hZ2VyT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBJZGxlTWFuYWdlciBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKElkbGVNYW5hZ2VyT2JqZWN0LCAmSWRsZU1hbmFnZXJfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIElkbGVNYW5hZ2VyT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBJZGxlTWFuYWdlciBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKElkbGVNYW5hZ2VyT2JqZWN0LCAmSWRsZU1hbmFnZXJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgSWRsZU1hbmFnZXJPYmpfQ29udmVydChQeU9iamVjdCAqdiwgSWRsZU1hbmFnZXIgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFJZGxlTWFuYWdlck9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJJZGxlTWFuYWdlciByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChJZGxlTWFuYWdlck9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIUlkbGVNYW5hZ2VyT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIklkbGVNYW5hZ2VyIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKElkbGVNYW5hZ2VyT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgSWRsZU1hbmFnZXJPYmpfZGVhbGxvYyhJZGxlTWFuYWdlck9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBJZGxlTWFuYWdlck9ial9tZXRob2RzW10gPSB7Ci0Je05VTEwsIE5VTEwsIDB9CisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIElkbGVNYW5hZ2VyT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTU4LDYxICsxNTgsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpJZGxlTWFuYWdlck9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JSWRsZU1hbmFnZXIgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBJZGxlTWFuYWdlciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKElkbGVNYW5hZ2VyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoSWRsZU1hbmFnZXJPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgSWRsZU1hbmFnZXJPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgSWRsZU1hbmFnZXJfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUXQuSWRsZU1hbmFnZXIiLCAvKnRwX25hbWUqLwotCXNpemVvZihJZGxlTWFuYWdlck9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIElkbGVNYW5hZ2VyT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIElkbGVNYW5hZ2VyT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBJZGxlTWFuYWdlck9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgSWRsZU1hbmFnZXJPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JSWRsZU1hbmFnZXJPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JSWRsZU1hbmFnZXJPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JSWRsZU1hbmFnZXJPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCUlkbGVNYW5hZ2VyT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCUlkbGVNYW5hZ2VyT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JSWRsZU1hbmFnZXJPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RdC5JZGxlTWFuYWdlciIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKElkbGVNYW5hZ2VyT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgSWRsZU1hbmFnZXJPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgSWRsZU1hbmFnZXJPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIElkbGVNYW5hZ2VyT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBJZGxlTWFuYWdlck9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBJZGxlTWFuYWdlck9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBJZGxlTWFuYWdlck9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBJZGxlTWFuYWdlck9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgSWRsZU1hbmFnZXJPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgSWRsZU1hbmFnZXJPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBJZGxlTWFuYWdlck9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIElkbGVNYW5hZ2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIyNSwxMDQzICsyMjUsMTA0MyBAQAogI2RlZmluZSBNb3ZpZUN0bE9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZNb3ZpZUNvbnRyb2xsZXJfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmTW92aWVDb250cm9sbGVyX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNb3ZpZUNvbnRyb2xsZXJPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlNb3ZpZUNvbnRyb2xsZXIgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBNb3ZpZUNvbnRyb2xsZXIgb2JfaXRzZWxmOwogfSBNb3ZpZUNvbnRyb2xsZXJPYmplY3Q7CiAKIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9OZXcoTW92aWVDb250cm9sbGVyIGl0c2VsZikKIHsKLQlNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllQ29udHJvbGxlciBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE1vdmllQ29udHJvbGxlck9iamVjdCwgJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTW92aWVDb250cm9sbGVyT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNb3ZpZUNvbnRyb2xsZXIgZnJvbSBOVUxMIHBvaW50ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpdCA9IFB5T2JqZWN0X05FVyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QsICZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgTW92aWVDdGxPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTW92aWVDb250cm9sbGVyICpwX2l0c2VsZikKIHsKLQlpZiAodiA9PSBQeV9Ob25lKQotCXsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmICghTW92aWVDdGxPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTW92aWVDb250cm9sbGVyIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE1vdmllQ29udHJvbGxlck9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIU1vdmllQ3RsT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vdmllQ29udHJvbGxlciByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBNb3ZpZUN0bE9ial9kZWFsbG9jKE1vdmllQ29udHJvbGxlck9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVDb250cm9sbGVyKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVDb250cm9sbGVyKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldE1vdmllKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlXaW5kb3dQdHIgbW92aWVXaW5kb3c7Ci0JUG9pbnQgd2hlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgV2luZG93UHRyIG1vdmllV2luZG93OworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBNQ1NldE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmbW92aWVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgIG1vdmllV2luZG93LAotCSAgICAgICAgICAgICAgICAgd2hlcmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZtb3ZpZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0TW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgbW92aWVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRJbmRNb3ZpZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBNQ0dldEluZE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbmRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbmRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRJbmRNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldEluZE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNSZW1vdmVBbGxNb3ZpZXMoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1JlbW92ZUFsbE1vdmllcwotCVB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlQWxsTW92aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1JlbW92ZUFsbE1vdmllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNSZW1vdmVBbGxNb3ZpZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DUmVtb3ZlQWxsTW92aWVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUmVtb3ZlQU1vdmllKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZSBtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIG07CiAjaWZuZGVmIE1DUmVtb3ZlQU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVBTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DUmVtb3ZlQU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1JlbW92ZUFNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIG0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJm0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1JlbW92ZUFNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIG0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DUmVtb3ZlTW92aWUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1JlbW92ZU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNSZW1vdmVNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNSZW1vdmVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNSZW1vdmVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lzUGxheWVyRXZlbnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUV2ZW50UmVjb3JkIGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRXZlbnRSZWNvcmQgZTsKICNpZm5kZWYgTUNJc1BsYXllckV2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNJc1BsYXllckV2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0lzUGxheWVyRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzUGxheWVyRXZlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNJc1BsYXllckV2ZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0RvQWN0aW9uKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlzaG9ydCBhY3Rpb247Ci0Jdm9pZCAqIHBhcmFtczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBzaG9ydCBhY3Rpb247CisgICAgdm9pZCAqIHBhcmFtczsKICNpZm5kZWYgTUNEb0FjdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1DRG9BY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DRG9BY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEb0FjdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgcGFyYW1zKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJocyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0RvQWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckF0dGFjaGVkKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlCb29sZWFuIGF0dGFjaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBCb29sZWFuIGF0dGFjaDsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQXR0YWNoZWQKLQlQeU1hY19QUkVDSEVDSyhNQ1NldENvbnRyb2xsZXJBdHRhY2hlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyQXR0YWNoZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRhY2gpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldENvbnRyb2xsZXJBdHRhY2hlZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRhY2gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJBdHRhY2hlZChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJc0NvbnRyb2xsZXJBdHRhY2hlZChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CiAjaWZuZGVmIE1DSXNDb250cm9sbGVyQXR0YWNoZWQKLQlQeU1hY19QUkVDSEVDSyhNQ0lzQ29udHJvbGxlckF0dGFjaGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0lzQ29udHJvbGxlckF0dGFjaGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzQ29udHJvbGxlckF0dGFjaGVkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0lzQ29udHJvbGxlckF0dGFjaGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlclBvcnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNHcmFmUHRyIGdwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENHcmFmUHRyIGdwOwogI2lmbmRlZiBNQ1NldENvbnRyb2xsZXJQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmdwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRDb250cm9sbGVyUG9ydChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZ3ApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZ3ApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJQb3J0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyUG9ydChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBNQ0dldENvbnRyb2xsZXJQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNHZXRDb250cm9sbGVyUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRWaXNpYmxlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlCb29sZWFuIHZpc2libGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQm9vbGVhbiB2aXNpYmxlOwogI2lmbmRlZiBNQ1NldFZpc2libGUKLQlQeU1hY19QUkVDSEVDSyhNQ1NldFZpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0VmlzaWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgdmlzaWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aXNpYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0VmlzaWJsZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CiAjaWZuZGVmIE1DR2V0VmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKE1DR2V0VmlzaWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRWaXNpYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldFZpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdAotCVB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyQm91bmRzUmduKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgTUNHZXRDb250cm9sbGVyQm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRDb250cm9sbGVyQm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DR2V0Q29udHJvbGxlckJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRXaW5kb3dSZ24oTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVdpbmRvd1B0ciB3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgX3J2OworICAgIFdpbmRvd1B0ciB3OwogI2lmbmRlZiBNQ0dldFdpbmRvd1JnbgotCVB5TWFjX1BSRUNIRUNLKE1DR2V0V2luZG93UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldFdpbmRvd1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0V2luZG93UmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRXaW5kb3dSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNNb3ZpZUNoYW5nZWQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllIG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgbTsKICNpZm5kZWYgTUNNb3ZpZUNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhNQ01vdmllQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNNb3ZpZUNoYW5nZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DTW92aWVDaGFuZ2VkKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DTW92aWVDaGFuZ2VkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXREdXJhdGlvbihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgTUNTZXREdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1DU2V0RHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0RHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0RHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXREdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0Q3VycmVudFRpbWUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIE1DR2V0Q3VycmVudFRpbWUKLQlQeU1hY19QUkVDSEVDSyhNQ0dldEN1cnJlbnRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldEN1cnJlbnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldEN1cnJlbnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDdXJyZW50VGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllIHRoZU1vdmllOwotCVdpbmRvd1B0ciB3OwotCVBvaW50IHdoZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllIHRoZU1vdmllOworICAgIFdpbmRvd1B0ciB3OworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBNQ05ld0F0dGFjaGVkQ29udHJvbGxlcgotCVB5TWFjX1BSRUNIRUNLKE1DTmV3QXR0YWNoZWRDb250cm9sbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ05ld0F0dGFjaGVkQ29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DTmV3QXR0YWNoZWRDb250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ05ld0F0dGFjaGVkQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DRHJhdyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JV2luZG93UHRyIHc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CiAjaWZuZGVmIE1DRHJhdwotCVB5TWFjX1BSRUNIRUNLKE1DRHJhdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNEcmF3KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEcmF3KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgIHcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNEcmF3KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIHcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQWN0aXZhdGUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVdpbmRvd1B0ciB3OwotCUJvb2xlYW4gYWN0aXZhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgQm9vbGVhbiBhY3RpdmF0ZTsKICNpZm5kZWYgTUNBY3RpdmF0ZQotCVB5TWFjX1BSRUNIRUNLKE1DQWN0aXZhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWN0aXZhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0FjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICB3LAotCSAgICAgICAgICAgICAgICAgYWN0aXZhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNBY3RpdmF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lkbGUoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ0lkbGUKLQlQeU1hY19QUkVDSEVDSyhNQ0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0lkbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNLZXkoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNJbnQ4IGtleTsKLQlsb25nIG1vZGlmaWVyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTSW50OCBrZXk7CisgICAgbG9uZyBtb2RpZmllcnM7CiAjaWZuZGVmIE1DS2V5Ci0JUHlNYWNfUFJFQ0hFQ0soTUNLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtleSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DS2V5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAga2V5LAotCSAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNLZXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgbW9kaWZpZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0NsaWNrKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlXaW5kb3dQdHIgdzsKLQlQb2ludCB3aGVyZTsKLQlsb25nIHdoZW47Ci0JbG9uZyBtb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgUG9pbnQgd2hlcmU7CisgICAgbG9uZyB3aGVuOworICAgIGxvbmcgbW9kaWZpZXJzOwogI2lmbmRlZiBNQ0NsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soTUNDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNDbGljayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNDbGljayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgdywKLQkgICAgICAgICAgICAgIHdoZXJlLAotCSAgICAgICAgICAgICAgd2hlbiwKLQkgICAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DQ2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICB3aGVyZSwKKyAgICAgICAgICAgICAgICAgIHdoZW4sCisgICAgICAgICAgICAgICAgICBtb2RpZmllcnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DRW5hYmxlRWRpdGluZyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQm9vbGVhbiBlbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEJvb2xlYW4gZW5hYmxlZDsKICNpZm5kZWYgTUNFbmFibGVFZGl0aW5nCi0JUHlNYWNfUFJFQ0hFQ0soTUNFbmFibGVFZGl0aW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0VuYWJsZUVkaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNFbmFibGVFZGl0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DRW5hYmxlRWRpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0lzRWRpdGluZ0VuYWJsZWQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIE1DSXNFZGl0aW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1DSXNFZGl0aW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNJc0VkaXRpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0lzRWRpdGluZ0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DSXNFZGl0aW5nRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0NvcHkoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKICNpZm5kZWYgTUNDb3B5Ci0JUHlNYWNfUFJFQ0hFQ0soTUNDb3B5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0NvcHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQ29weShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQ3V0KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CiAjaWZuZGVmIE1DQ3V0Ci0JUHlNYWNfUFJFQ0hFQ0soTUNDdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQ3V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0N1dChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQYXN0ZShNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWUgc3JjTW92aWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgc3JjTW92aWU7CiAjaWZuZGVmIE1DUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhNQ1Bhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1Bhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyY01vdmllKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNQYXN0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgc3JjTW92aWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNQYXN0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgc3JjTW92aWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DQ2xlYXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ0NsZWFyCi0JUHlNYWNfUFJFQ0hFQ0soTUNDbGVhcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNDbGVhcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNDbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNDbGVhcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1VuZG8oTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBNQ1VuZG8KLQlQeU1hY19QUkVDSEVDSyhNQ1VuZG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1DVW5kbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNVbmRvKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1VuZG8oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQb3NpdGlvbkNvbnRyb2xsZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVJlY3QgbW92aWVSZWN0OwotCVJlY3QgY29udHJvbGxlclJlY3Q7Ci0JbG9uZyBzb21lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmVjdCBtb3ZpZVJlY3Q7CisgICAgUmVjdCBjb250cm9sbGVyUmVjdDsKKyAgICBsb25nIHNvbWVGbGFnczsKICNpZm5kZWYgTUNQb3NpdGlvbkNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhNQ1Bvc2l0aW9uQ29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNQb3NpdGlvbkNvbnRyb2xsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udHJvbGxlclJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZzb21lRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1Bvc2l0aW9uQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udHJvbGxlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzb21lRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1Bvc2l0aW9uQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVySW5mbyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JbG9uZyBzb21lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgbG9uZyBzb21lRmxhZ3M7CiAjaWZuZGVmIE1DR2V0Q29udHJvbGxlckluZm8KLQlQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldENvbnRyb2xsZXJJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldENvbnRyb2xsZXJJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldENvbnRyb2xsZXJJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0Q2xpcChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUmduSGFuZGxlIHRoZUNsaXA7Ci0JUmduSGFuZGxlIG1vdmllQ2xpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKKyAgICBSZ25IYW5kbGUgbW92aWVDbGlwOwogI2lmbmRlZiBNQ1NldENsaXAKLQlQeU1hY19QUkVDSEVDSyhNQ1NldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1DU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVDbGlwLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0Q2xpcChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwLAotCSAgICAgICAgICAgICAgICBtb3ZpZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbW92aWVDbGlwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRDbGlwKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHRoZUNsaXAsCisgICAgICAgICAgICAgICAgICAgIG1vdmllQ2xpcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNHZXRDbGlwKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlSZ25IYW5kbGUgdGhlQ2xpcDsKLQlSZ25IYW5kbGUgbW92aWVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFJnbkhhbmRsZSB0aGVDbGlwOworICAgIFJnbkhhbmRsZSBtb3ZpZUNsaXA7CiAjaWZuZGVmIE1DR2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKE1DR2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNHZXRDbGlwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ0dldENsaXAoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgJnRoZUNsaXAsCi0JICAgICAgICAgICAgICAgICZtb3ZpZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNsaXAsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgbW92aWVDbGlwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRDbGlwKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICZ0aGVDbGlwLAorICAgICAgICAgICAgICAgICAgICAmbW92aWVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVDbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG1vdmllQ2xpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNEcmF3QmFkZ2UoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVJnbkhhbmRsZSBtb3ZpZVJnbjsKLQlSZ25IYW5kbGUgYmFkZ2VSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUmduSGFuZGxlIG1vdmllUmduOworICAgIFJnbkhhbmRsZSBiYWRnZVJnbjsKICNpZm5kZWYgTUNEcmF3QmFkZ2UKLQlQeU1hY19QUkVDSEVDSyhNQ0RyYXdCYWRnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNEcmF3QmFkZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNEcmF3QmFkZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBtb3ZpZVJnbiwKLQkgICAgICAgICAgICAgICAgICAmYmFkZ2VSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWRnZVJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm1vdmllUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNEcmF3QmFkZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAmYmFkZ2VSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBiYWRnZVJnbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNTZXRVcEVkaXRNZW51KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlsb25nIG1vZGlmaWVyczsKLQlNZW51SGFuZGxlIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIGxvbmcgbW9kaWZpZXJzOworICAgIE1lbnVIYW5kbGUgbWg7CiAjaWZuZGVmIE1DU2V0VXBFZGl0TWVudQotCVB5TWFjX1BSRUNIRUNLKE1DU2V0VXBFZGl0TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRVcEVkaXRNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNTZXRVcEVkaXRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgbWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNTZXRVcEVkaXRNZW51KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DR2V0TWVudVN0cmluZyhNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JbG9uZyBtb2RpZmllcnM7Ci0Jc2hvcnQgaXRlbTsKLQlTdHIyNTUgYVN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBsb25nIG1vZGlmaWVyczsKKyAgICBzaG9ydCBpdGVtOworICAgIFN0cjI1NSBhU3RyaW5nOwogI2lmbmRlZiBNQ0dldE1lbnVTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhNQ0dldE1lbnVTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DR2V0TWVudVN0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgYVN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0TWVudVN0cmluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllcnMsCi0JICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgIGFTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNHZXRNZW51U3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYVN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNQdEluQ29udHJvbGxlcihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUG9pbnQgdGhlUHQ7Ci0JQm9vbGVhbiBpbkNvbnRyb2xsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUG9pbnQgdGhlUHQ7CisgICAgQm9vbGVhbiBpbkNvbnRyb2xsZXI7CiAjaWZuZGVmIE1DUHRJbkNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhNQ1B0SW5Db250cm9sbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1B0SW5Db250cm9sbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DUHRJbkNvbnRyb2xsZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZVB0LAotCSAgICAgICAgICAgICAgICAgICAgICAgJmluQ29udHJvbGxlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5Db250cm9sbGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1B0SW5Db250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNvbnRyb2xsZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluQ29udHJvbGxlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNJbnZhbGlkYXRlKE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlXaW5kb3dQdHIgdzsKLQlSZ25IYW5kbGUgaW52YWxpZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBXaW5kb3dQdHIgdzsKKyAgICBSZ25IYW5kbGUgaW52YWxpZFJnbjsKICNpZm5kZWYgTUNJbnZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soTUNJbnZhbGlkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0ludmFsaWRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbGlkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNJbnZhbGlkYXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHcsCi0JICAgICAgICAgICAgICAgICAgIGludmFsaWRSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW52YWxpZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DSW52YWxpZGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICB3LAorICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0FkanVzdEN1cnNvcihNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JV2luZG93UHRyIHc7Ci0JUG9pbnQgd2hlcmU7Ci0JbG9uZyBtb2RpZmllcnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgV2luZG93UHRyIHc7CisgICAgUG9pbnQgd2hlcmU7CisgICAgbG9uZyBtb2RpZmllcnM7CiAjaWZuZGVmIE1DQWRqdXN0Q3Vyc29yCi0JUHlNYWNfUFJFQ0hFQ0soTUNBZGp1c3RDdXJzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWRqdXN0Q3Vyc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJndoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZXJzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTUNBZGp1c3RDdXJzb3IoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICB3LAotCSAgICAgICAgICAgICAgICAgICAgIHdoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVycyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0FkanVzdEN1cnNvcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZXJzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0dldEludGVyZmFjZUVsZW1lbnQoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1DSW50ZXJmYWNlRWxlbWVudCB3aGljaEVsZW1lbnQ7Ci0Jdm9pZCAqIGVsZW1lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTUNJbnRlcmZhY2VFbGVtZW50IHdoaWNoRWxlbWVudDsKKyAgICB2b2lkICogZWxlbWVudDsKICNpZm5kZWYgTUNHZXRJbnRlcmZhY2VFbGVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNHZXRJbnRlcmZhY2VFbGVtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ0dldEludGVyZmFjZUVsZW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hFbGVtZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DR2V0SW50ZXJmYWNlRWxlbWVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaEVsZW1lbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0dldEludGVyZmFjZUVsZW1lbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ0FkZE1vdmllU2VnbWVudChNb3ZpZUNvbnRyb2xsZXJPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWUgc3JjTW92aWU7Ci0JQm9vbGVhbiBzY2FsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWUgc3JjTW92aWU7CisgICAgQm9vbGVhbiBzY2FsZWQ7CiAjaWZuZGVmIE1DQWRkTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNBZGRNb3ZpZVNlZ21lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1DQWRkTW92aWVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DQWRkTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3JjTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY2FsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ0FkZE1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVDdGxPYmpfTUNUcmltTW92aWVTZWdtZW50KE1vdmllQ29udHJvbGxlck9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKICNpZm5kZWYgTUNUcmltTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTUNUcmltTW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1RyaW1Nb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DVHJpbU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUNUcmltTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllQ3RsT2JqX01DU2V0SWRsZU1hbmFnZXIoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUlkbGVNYW5hZ2VyIGltOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIElkbGVNYW5hZ2VyIGltOwogI2lmbmRlZiBNQ1NldElkbGVNYW5hZ2VyCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUNTZXRJZGxlTWFuYWdlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1DU2V0SWRsZU1hbmFnZXIoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGltKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX0NvbnZlcnQsICZpbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1DU2V0SWRsZU1hbmFnZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoTW92aWVDb250cm9sbGVyT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzCi0JUHlNYWNfUFJFQ0hFQ0soTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBNb3ZpZUN0bE9ial9tZXRob2RzW10gPSB7Ci0JeyJNQ1NldE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0TW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIHRoZU1vdmllLCBXaW5kb3dQdHIgbW92aWVXaW5kb3csIFBvaW50IHdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldEluZE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0SW5kTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7Ik1DUmVtb3ZlQWxsTW92aWVzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlQWxsTW92aWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DUmVtb3ZlQU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlQU1vdmllLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1JlbW92ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUmVtb3ZlTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc1BsYXllckV2ZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNQbGF5ZXJFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoRXZlbnRSZWNvcmQgZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNEb0FjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RvQWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBhY3Rpb24sIHZvaWQgKiBwYXJhbXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlckF0dGFjaGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckF0dGFjaGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGF0dGFjaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc0NvbnRyb2xsZXJBdHRhY2hlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0lzQ29udHJvbGxlckF0dGFjaGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlclBvcnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgZ3ApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q29udHJvbGxlclBvcnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyUG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKLQl7Ik1DU2V0VmlzaWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldFZpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdmlzaWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0VmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7Ik1DU2V0Q29udHJvbGxlckJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q29udHJvbGxlckJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJCb3VuZHNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiTUNHZXRXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3KSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJNQ01vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ01vdmllQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXREdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldER1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DR2V0Q3VycmVudFRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDdXJyZW50VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKLQl7Ik1DTmV3QXR0YWNoZWRDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DTmV3QXR0YWNoZWRDb250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSB0aGVNb3ZpZSwgV2luZG93UHRyIHcsIFBvaW50IHdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0RyYXciLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEcmF3LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgQm9vbGVhbiBhY3RpdmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJZGxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0tleSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0tleSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDgga2V5LCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNDbGljayIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NsaWNrLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUsIGxvbmcgd2hlbiwgbG9uZyBtb2RpZmllcnMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DRW5hYmxlRWRpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0VuYWJsZUVkaXRpbmcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZW5hYmxlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNJc0VkaXRpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNFZGl0aW5nRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiTUNDb3B5IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7Ik1DQ3V0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ3V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiTUNQYXN0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1Bhc3RlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmNNb3ZpZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNDbGVhciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0NsZWFyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DVW5kbyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1VuZG8sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNQb3NpdGlvbkNvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNQb3NpdGlvbkNvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgbW92aWVSZWN0LCBSZWN0IGNvbnRyb2xsZXJSZWN0LCBsb25nIHNvbWVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRDb250cm9sbGVySW5mbyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJJbmZvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNvbWVGbGFncykiKX0sCi0JeyJNQ1NldENsaXAiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDbGlwLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgdGhlQ2xpcCwgUmduSGFuZGxlIG1vdmllQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHRoZUNsaXAsIFJnbkhhbmRsZSBtb3ZpZUNsaXApIil9LAotCXsiTUNEcmF3QmFkZ2UiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNEcmF3QmFkZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBtb3ZpZVJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBiYWRnZVJnbikiKX0sCi0JeyJNQ1NldFVwRWRpdE1lbnUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRVcEVkaXRNZW51LCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vZGlmaWVycywgTWVudUhhbmRsZSBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRNZW51U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0TWVudVN0cmluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb2RpZmllcnMsIHNob3J0IGl0ZW0sIFN0cjI1NSBhU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ1B0SW5Db250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUHRJbkNvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBpbkNvbnRyb2xsZXIpIil9LAotCXsiTUNJbnZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSW52YWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNQ0FkanVzdEN1cnNvciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0FkanVzdEN1cnNvciwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcsIFBvaW50IHdoZXJlLCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNHZXRJbnRlcmZhY2VFbGVtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0SW50ZXJmYWNlRWxlbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTUNJbnRlcmZhY2VFbGVtZW50IHdoaWNoRWxlbWVudCwgdm9pZCAqIGVsZW1lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DQWRkTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWRkTW92aWVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmNNb3ZpZSwgQm9vbGVhbiBzY2FsZWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1DVHJpbU1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1RyaW1Nb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldElkbGVNYW5hZ2VyLCAxLAotCSBQeURvY19TVFIoIihJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0Q29udHJvbGxlckNhcGFiaWxpdGllcywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1DU2V0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgdGhlTW92aWUsIFdpbmRvd1B0ciBtb3ZpZVdpbmRvdywgUG9pbnQgd2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0SW5kTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRJbmRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiTUNSZW1vdmVBbGxNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVBbGxNb3ZpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNSZW1vdmVBTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVBTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIG0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DUmVtb3ZlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNSZW1vdmVNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzUGxheWVyRXZlbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJc1BsYXllckV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0RvQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DRG9BY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGFjdGlvbiwgdm9pZCAqIHBhcmFtcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyQXR0YWNoZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQXR0YWNoZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gYXR0YWNoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzQ29udHJvbGxlckF0dGFjaGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DSXNDb250cm9sbGVyQXR0YWNoZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyUG9ydCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJQb3J0LCAxLAorICAgICBQeURvY19TVFIoIihDR3JhZlB0ciBncCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDb250cm9sbGVyUG9ydCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldENvbnRyb2xsZXJQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiTUNTZXRWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0VmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiB2aXNpYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldFZpc2libGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENvbnRyb2xsZXJCb3VuZHNSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDb250cm9sbGVyQm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJNQ0dldFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldFdpbmRvd1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHcpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7Ik1DTW92aWVDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DTW92aWVDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldER1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0RHVyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNHZXRDdXJyZW50VGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0dldEN1cnJlbnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAorICAgIHsiTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNOZXdBdHRhY2hlZENvbnRyb2xsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHRoZU1vdmllLCBXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DRHJhdyIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0FjdGl2YXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWN0aXZhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3LCBCb29sZWFuIGFjdGl2YXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lkbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJZGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DS2V5IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DS2V5LCAxLAorICAgICBQeURvY19TVFIoIihTSW50OCBrZXksIGxvbmcgbW9kaWZpZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0NsaWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ2xpY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3LCBQb2ludCB3aGVyZSwgbG9uZyB3aGVuLCBsb25nIG1vZGlmaWVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNFbmFibGVFZGl0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DRW5hYmxlRWRpdGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBlbmFibGVkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0lzRWRpdGluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJc0VkaXRpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJNQ0NvcHkiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNDb3B5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiTUNDdXQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNDdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJNQ1Bhc3RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DUGFzdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHNyY01vdmllKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0NsZWFyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQ2xlYXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNVbmRvIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DVW5kbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1Bvc2l0aW9uQ29udHJvbGxlciIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1Bvc2l0aW9uQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIFJlY3QgY29udHJvbGxlclJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldENvbnRyb2xsZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DR2V0Q29udHJvbGxlckluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc29tZUZsYWdzKSIpfSwKKyAgICB7Ik1DU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwLCBSZ25IYW5kbGUgbW92aWVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldENsaXAiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgdGhlQ2xpcCwgUmduSGFuZGxlIG1vdmllQ2xpcCkiKX0sCisgICAgeyJNQ0RyYXdCYWRnZSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ0RyYXdCYWRnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIG1vdmllUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGJhZGdlUmduKSIpfSwKKyAgICB7Ik1DU2V0VXBFZGl0TWVudSIsIChQeUNGdW5jdGlvbilNb3ZpZUN0bE9ial9NQ1NldFVwRWRpdE1lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbW9kaWZpZXJzLCBNZW51SGFuZGxlIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldE1lbnVTdHJpbmciLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRNZW51U3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vZGlmaWVycywgc2hvcnQgaXRlbSwgU3RyMjU1IGFTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DUHRJbkNvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNQdEluQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGluQ29udHJvbGxlcikiKX0sCisgICAgeyJNQ0ludmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNJbnZhbGlkYXRlLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUmduSGFuZGxlIGludmFsaWRSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1DQWRqdXN0Q3Vyc29yIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DQWRqdXN0Q3Vyc29yLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdywgUG9pbnQgd2hlcmUsIGxvbmcgbW9kaWZpZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ0dldEludGVyZmFjZUVsZW1lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNHZXRJbnRlcmZhY2VFbGVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNQ0ludGVyZmFjZUVsZW1lbnQgd2hpY2hFbGVtZW50LCB2b2lkICogZWxlbWVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNBZGRNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNBZGRNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIHNyY01vdmllLCBCb29sZWFuIHNjYWxlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUNUcmltTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DVHJpbU1vdmllU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllQ3RsT2JqX01DU2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNQ1NldENvbnRyb2xsZXJDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pTW92aWVDdGxPYmpfTUNTZXRDb250cm9sbGVyQ2FwYWJpbGl0aWVzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBNb3ZpZUN0bE9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTEyNzgsNjEgKzEyNzgsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZUN0bE9ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JTW92aWVDb250cm9sbGVyIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTW92aWVDb250cm9sbGVyIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE1vdmllQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoTW92aWVDb250cm9sbGVyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIE1vdmllQ3RsT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoTW92aWVDb250cm9sbGVyT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1vdmllQ3RsT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1vdmllQ29udHJvbGxlcl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5Nb3ZpZUNvbnRyb2xsZXIiLCAvKnRwX25hbWUqLwotCXNpemVvZihNb3ZpZUNvbnRyb2xsZXJPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNb3ZpZUN0bE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNb3ZpZUN0bE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTW92aWVDdGxPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1vdmllQ3RsT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1vdmllQ3RsT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1vdmllQ3RsT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1vdmllQ3RsT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNb3ZpZUN0bE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNb3ZpZUN0bE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1vdmllQ3RsT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTW92aWVDb250cm9sbGVyIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoTW92aWVDb250cm9sbGVyT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgTW92aWVDdGxPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgTW92aWVDdGxPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIE1vdmllQ3RsT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBNb3ZpZUN0bE9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBNb3ZpZUN0bE9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBNb3ZpZUN0bE9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBNb3ZpZUN0bE9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgTW92aWVDdGxPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgTW92aWVDdGxPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBNb3ZpZUN0bE9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNb3ZpZUNvbnRyb2xsZXIgLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTEzNDUsNDE3ICsxMzQ1LDQxNyBAQAogI2RlZmluZSBUaW1lQmFzZU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUaW1lQmFzZV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZUaW1lQmFzZV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgVGltZUJhc2VPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUaW1lQmFzZSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFRpbWVCYXNlIG9iX2l0c2VsZjsKIH0gVGltZUJhc2VPYmplY3Q7CiAKIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9OZXcoVGltZUJhc2UgaXRzZWxmKQogewotCVRpbWVCYXNlT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUaW1lQmFzZSBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRpbWVCYXNlT2JqZWN0LCAmVGltZUJhc2VfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRpbWVCYXNlT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUaW1lQmFzZSBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFRpbWVCYXNlT2JqZWN0LCAmVGltZUJhc2VfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVGltZUJhc2VPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVGltZUJhc2UgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFUaW1lQmFzZU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUaW1lQmFzZSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUaW1lQmFzZU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVRpbWVCYXNlT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRpbWVCYXNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRpbWVCYXNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVGltZUJhc2VPYmpfZGVhbGxvYyhUaW1lQmFzZU9iamVjdCAqc2VsZikKIHsKLQkvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIC8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLworICAgIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIERpc3Bvc2VUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZVRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlEaXNwb3NlVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBEaXNwb3NlVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKLQlUaW1lU2NhbGUgczsKLQlUaW1lUmVjb3JkIHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OworICAgIFRpbWVTY2FsZSBzOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIEdldFRpbWVCYXNlVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBzLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdHIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgU2V0VGltZUJhc2VUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICZ0cik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVZhbHVlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgdDsKLQlUaW1lU2NhbGUgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHQ7CisgICAgVGltZVNjYWxlIHM7CiAjaWZuZGVmIFNldFRpbWVCYXNlVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgdCwKLQkgICAgICAgICAgICAgICAgIHMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlVmFsdWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgICAgICBzKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCByOwogI2lmbmRlZiBTZXRUaW1lQmFzZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcikpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlUmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICByKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUaW1lQmFzZVJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlU3RhcnRUaW1lKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CisgICAgVGltZVNjYWxlIHM7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgR2V0VGltZUJhc2VTdGFydFRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVN0YXJ0VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VTdGFydFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VTdGFydFRpbWUoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVSZWNvcmQgdHI7CiAjaWZuZGVmIFNldFRpbWVCYXNlU3RhcnRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VGltZUJhc2VTdGFydFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RhcnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0cikpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlU3RhcnRUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJnRyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VTdGFydFRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmdHIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OwotCVRpbWVTY2FsZSBzOwotCVRpbWVSZWNvcmQgdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CisgICAgVGltZVNjYWxlIHM7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgR2V0VGltZUJhc2VTdG9wVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlU3RvcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlU3RvcFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0cik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VTdG9wVGltZShUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0cjsKICNpZm5kZWYgU2V0VGltZUJhc2VTdG9wVGltZQotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RvcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlU3RvcFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJnRyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VTdG9wVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VGbGFncyhUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUaW1lQmFzZUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZUZsYWdzKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHRpbWVCYXNlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgdGltZUJhc2VGbGFnczsKICNpZm5kZWYgU2V0VGltZUJhc2VGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQmFzZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgdGltZUJhc2VGbGFncyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZUJhc2VGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlRmxhZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVCYXNlRmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lQmFzZSBtYXN0ZXI7Ci0JVGltZVJlY29yZCBzbGF2ZVplcm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVCYXNlIG1hc3RlcjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZtYXN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc2xhdmVaZXJvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9HZXRUaW1lQmFzZU1hc3RlclRpbWVCYXNlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lQmFzZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVCYXNlIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jayhUaW1lQmFzZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50IGNsb2NrTWVpc3RlcjsKLQlUaW1lUmVjb3JkIHNsYXZlWmVybzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50IGNsb2NrTWVpc3RlcjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0VGltZUJhc2VNYXN0ZXJDbG9jawotCVB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyQ2xvY2spOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlTWFzdGVyQ2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2xvY2tNZWlzdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlTWFzdGVyQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrTWVpc3RlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjbG9ja01laXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmc2xhdmVaZXJvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VNYXN0ZXJDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tNZWlzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2soVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgX3J2OwogI2lmbmRlZiBHZXRUaW1lQmFzZU1hc3RlckNsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VNYXN0ZXJDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VNYXN0ZXJDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VGltZUJhc2VNYXN0ZXJDbG9jayhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZU1hc3RlckNsb2NrKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VTdGF0dXMoVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCVRpbWVSZWNvcmQgdW5waW5uZWRUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBUaW1lUmVjb3JkIHVucGlubmVkVGltZTsKICNpZm5kZWYgR2V0VGltZUJhc2VTdGF0dXMKLQlQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZVN0YXR1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnVucGlubmVkVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ1bnBpbm5lZFRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUaW1lQmFzZVN0YXR1cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bnBpbm5lZFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdW5waW5uZWRUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8oVGltZUJhc2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgemVybzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB6ZXJvOwogI2lmbmRlZiBTZXRUaW1lQmFzZVplcm8KLQlQeU1hY19QUkVDSEVDSyhTZXRUaW1lQmFzZVplcm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRpbWVCYXNlWmVybyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmemVybykpCi0JCXJldHVybiBOVUxMOwotCVNldFRpbWVCYXNlWmVybyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAmemVybyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ6ZXJvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VGltZUJhc2VaZXJvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICZ6ZXJvKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVGltZUJhc2VPYmpfR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlKFRpbWVCYXNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VGltZUJhc2VFZmZlY3RpdmVSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUaW1lQmFzZU9ial9tZXRob2RzW10gPSB7Ci0JeyJEaXNwb3NlVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZVRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAotCXsiU2V0VGltZUJhc2VUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKLQl7IlNldFRpbWVCYXNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHQsIFRpbWVTY2FsZSBzKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VSYXRlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNldFRpbWVCYXNlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHIpIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZVN0YXJ0VGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXJ0VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKLQl7IlNldFRpbWVCYXNlU3RhcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlU3RhcnRUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAotCXsiU2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAotCXsiR2V0VGltZUJhc2VGbGFncyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRUaW1lQmFzZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgdGltZUJhc2VGbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZUJhc2UgbWFzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IlNldFRpbWVCYXNlTWFzdGVyQ2xvY2siLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGNsb2NrTWVpc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCi0JeyJHZXRUaW1lQmFzZU1hc3RlckNsb2NrIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCi0JeyJHZXRUaW1lQmFzZVN0YXR1cyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYsIFRpbWVSZWNvcmQgdW5waW5uZWRUaW1lKSIpfSwKLQl7IlNldFRpbWVCYXNlWmVybyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8sIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgemVybykgLT4gTm9uZSIpfSwKLQl7IkdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJEaXNwb3NlVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfRGlzcG9zZVRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZVRpbWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAorICAgIHsiU2V0VGltZUJhc2VUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0cikgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRpbWVCYXNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHQsIFRpbWVTY2FsZSBzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VSYXRlIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlNldFRpbWVCYXNlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZVN0YXJ0VGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXJ0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVNjYWxlIHMpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIHRyKSIpfSwKKyAgICB7IlNldFRpbWVCYXNlU3RhcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlU3RhcnRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgcykgLT4gKFRpbWVWYWx1ZSBfcnYsIFRpbWVSZWNvcmQgdHIpIil9LAorICAgIHsiU2V0VGltZUJhc2VTdG9wVGltZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVN0b3BUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRyKSAtPiBOb25lIil9LAorICAgIHsiR2V0VGltZUJhc2VGbGFncyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJTZXRUaW1lQmFzZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX1NldFRpbWVCYXNlRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgdGltZUJhc2VGbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZUJhc2UgbWFzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfR2V0VGltZUJhc2VNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKKyAgICB7IlNldFRpbWVCYXNlTWFzdGVyQ2xvY2siLCAoUHlDRnVuY3Rpb24pVGltZUJhc2VPYmpfU2V0VGltZUJhc2VNYXN0ZXJDbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50IGNsb2NrTWVpc3RlciwgVGltZVJlY29yZCBzbGF2ZVplcm8pIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUaW1lQmFzZU1hc3RlckNsb2NrIiwgKFB5Q0Z1bmN0aW9uKVRpbWVCYXNlT2JqX0dldFRpbWVCYXNlTWFzdGVyQ2xvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENvbXBvbmVudEluc3RhbmNlIF9ydikiKX0sCisgICAgeyJHZXRUaW1lQmFzZVN0YXR1cyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZVN0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYsIFRpbWVSZWNvcmQgdW5waW5uZWRUaW1lKSIpfSwKKyAgICB7IlNldFRpbWVCYXNlWmVybyIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9TZXRUaW1lQmFzZVplcm8sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgemVybykgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRpbWVCYXNlRWZmZWN0aXZlUmF0ZSIsIChQeUNGdW5jdGlvbilUaW1lQmFzZU9ial9HZXRUaW1lQmFzZUVmZmVjdGl2ZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFRpbWVCYXNlT2JqX2dldHNldGxpc3QgTlVMTApAQCAtMTc3Miw2MSArMTc3Miw2MSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlRpbWVCYXNlT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpfc2VsZjsKLQlUaW1lQmFzZSBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFRpbWVCYXNlIGl0c2VsZjsKKyAgICBjaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKLQlpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOwotCSgoVGltZUJhc2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVGltZUJhc2VPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOworICAgIGlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgKChUaW1lQmFzZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiBfc2VsZjsKIH0KIAogI2RlZmluZSBUaW1lQmFzZU9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBUaW1lQmFzZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9RdC5UaW1lQmFzZSIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFRpbWVCYXNlT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgVGltZUJhc2VPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KLQkwLCAvKnRwX3ByaW50Ki8KLQkoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KLQkoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgVGltZUJhc2VPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFRpbWVCYXNlT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBUaW1lQmFzZU9ial9oYXNoLCAvKnRwX2hhc2gqLwotCTAsIC8qdHBfY2FsbCovCi0JMCwgLyp0cF9zdHIqLwotCVB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KLQlQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLwotCTAsIC8qdHBfYXNfYnVmZmVyKi8KLQlQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlUaW1lQmFzZU9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlUaW1lQmFzZU9ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQlUaW1lQmFzZU9ial90cF9pbml0LCAvKiB0cF9pbml0ICovCi0JVGltZUJhc2VPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JVGltZUJhc2VPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KLQlUaW1lQmFzZU9ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwgLypvYl9zaXplKi8KKyAgICAiX1F0LlRpbWVCYXNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoVGltZUJhc2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBUaW1lQmFzZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBUaW1lQmFzZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgVGltZUJhc2VPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFRpbWVCYXNlT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFRpbWVCYXNlT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAvKnRwX21lbWJlcnMqLworICAgIFRpbWVCYXNlT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFRpbWVCYXNlT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBUaW1lQmFzZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KKyAgICBUaW1lQmFzZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFRpbWVCYXNlT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBUaW1lQmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTgzOSwyOTQgKzE4MzksMjk0IEBACiAjZGVmaW5lIFVzZXJEYXRhT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlVzZXJEYXRhX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlVzZXJEYXRhX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBVc2VyRGF0YU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVVzZXJEYXRhIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgVXNlckRhdGEgb2JfaXRzZWxmOwogfSBVc2VyRGF0YU9iamVjdDsKIAogUHlPYmplY3QgKlVzZXJEYXRhT2JqX05ldyhVc2VyRGF0YSBpdHNlbGYpCiB7Ci0JVXNlckRhdGFPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFVzZXJEYXRhIGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoVXNlckRhdGFPYmplY3QsICZVc2VyRGF0YV9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgVXNlckRhdGFPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFVzZXJEYXRhIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVXNlckRhdGFPYmplY3QsICZVc2VyRGF0YV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBVc2VyRGF0YU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBVc2VyRGF0YSAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIVVzZXJEYXRhT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlVzZXJEYXRhIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFVzZXJEYXRhT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghVXNlckRhdGFPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVXNlckRhdGEgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoVXNlckRhdGFPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBVc2VyRGF0YU9ial9kZWFsbG9jKFVzZXJEYXRhT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VVc2VyRGF0YShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZVVzZXJEYXRhKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9HZXRVc2VyRGF0YShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YTsKLQlPU1R5cGUgdWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGE7CisgICAgT1NUeXBlIHVkVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBHZXRVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldFVzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX0FkZFVzZXJEYXRhKFVzZXJEYXRhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhOwotCU9TVHlwZSB1ZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGE7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgQWRkVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhBZGRVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFVzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGEoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSB1ZFR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgUmVtb3ZlVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfQ291bnRVc2VyRGF0YVR5cGUoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlPU1R5cGUgdWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgQ291bnRVc2VyRGF0YVR5cGUKLQlQeU1hY19QUkVDSEVDSyhDb3VudFVzZXJEYXRhVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ291bnRVc2VyRGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfR2V0TmV4dFVzZXJEYXRhVHlwZShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JT1NUeXBlIHVkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgT1NUeXBlIHVkVHlwZTsKICNpZm5kZWYgR2V0TmV4dFVzZXJEYXRhVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRVc2VyRGF0YVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE5leHRVc2VyRGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ1ZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VXNlckRhdGFUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dFVzZXJEYXRhVHlwZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9BZGRVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGE7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBBZGRVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhBZGRVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9HZXRVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGE7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBHZXRVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhHZXRVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRsUmVnaW9uVGFnKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YVRleHQoVXNlckRhdGFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHVkVHlwZTsKLQlsb25nIGluZGV4OwotCXNob3J0IGl0bFJlZ2lvblRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgdWRUeXBlOworICAgIGxvbmcgaW5kZXg7CisgICAgc2hvcnQgaXRsUmVnaW9uVGFnOwogI2lmbmRlZiBSZW1vdmVVc2VyRGF0YVRleHQKLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVVc2VyRGF0YVRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZVVzZXJEYXRhVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGxSZWdpb25UYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlVXNlckRhdGFUZXh0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1ZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGl0bFJlZ2lvblRhZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnVkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRsUmVnaW9uVGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZVVzZXJEYXRhVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGxSZWdpb25UYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX1B1dFVzZXJEYXRhSW50b0hhbmRsZShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgUHV0VXNlckRhdGFJbnRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0VXNlckRhdGFJbnRvSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRVc2VyRGF0YUludG9IYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0VXNlckRhdGFJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBQdXRVc2VyRGF0YUludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlVzZXJEYXRhT2JqX0NvcHlVc2VyRGF0YShVc2VyRGF0YU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlVc2VyRGF0YSBkc3RVc2VyRGF0YTsKLQlPU1R5cGUgY29weVJ1bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVXNlckRhdGEgZHN0VXNlckRhdGE7CisgICAgT1NUeXBlIGNvcHlSdWxlOwogI2lmbmRlZiBDb3B5VXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5VXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJmRzdFVzZXJEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIGRzdFVzZXJEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmZHN0VXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvcHlSdWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0VXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UnVsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBVc2VyRGF0YU9ial9tZXRob2RzW10gPSB7Ci0JeyJHZXRVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9HZXRVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCi0JeyJBZGRVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9BZGRVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUpIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50VXNlckRhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0NvdW50VXNlckRhdGFUeXBlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgdWRUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldE5leHRVc2VyRGF0YVR5cGUiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0TmV4dFVzZXJEYXRhVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkFkZFVzZXJEYXRhVGV4dCIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9BZGRVc2VyRGF0YVRleHQsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4LCBzaG9ydCBpdGxSZWdpb25UYWcpIC0+IE5vbmUiKX0sCi0JeyJHZXRVc2VyRGF0YVRleHQiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0VXNlckRhdGFUZXh0LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAotCXsiUmVtb3ZlVXNlckRhdGFUZXh0IiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX1JlbW92ZVVzZXJEYXRhVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAotCXsiUHV0VXNlckRhdGFJbnRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX1B1dFVzZXJEYXRhSW50b0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IE5vbmUiKX0sCi0JeyJDb3B5VXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQ29weVVzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIihVc2VyRGF0YSBkc3RVc2VyRGF0YSwgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0VXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfR2V0VXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiQWRkVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQWRkVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhLCBPU1R5cGUgdWRUeXBlKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfUmVtb3ZlVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudFVzZXJEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9Db3VudFVzZXJEYXRhVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHVkVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXROZXh0VXNlckRhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldE5leHRVc2VyRGF0YVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJBZGRVc2VyRGF0YVRleHQiLCAoUHlDRnVuY3Rpb24pVXNlckRhdGFPYmpfQWRkVXNlckRhdGFUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YSwgT1NUeXBlIHVkVHlwZSwgbG9uZyBpbmRleCwgc2hvcnQgaXRsUmVnaW9uVGFnKSAtPiBOb25lIil9LAorICAgIHsiR2V0VXNlckRhdGFUZXh0IiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0dldFVzZXJEYXRhVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGEsIE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKKyAgICB7IlJlbW92ZVVzZXJEYXRhVGV4dCIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9SZW1vdmVVc2VyRGF0YVRleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSB1ZFR5cGUsIGxvbmcgaW5kZXgsIHNob3J0IGl0bFJlZ2lvblRhZykgLT4gTm9uZSIpfSwKKyAgICB7IlB1dFVzZXJEYXRhSW50b0hhbmRsZSIsIChQeUNGdW5jdGlvbilVc2VyRGF0YU9ial9QdXRVc2VyRGF0YUludG9IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiBOb25lIil9LAorICAgIHsiQ29weVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVVzZXJEYXRhT2JqX0NvcHlVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVXNlckRhdGEgZHN0VXNlckRhdGEsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgVXNlckRhdGFPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0yMTQzLDYxICsyMTQzLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVXNlckRhdGFPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVVzZXJEYXRhIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVXNlckRhdGEgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVXNlckRhdGFPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChVc2VyRGF0YU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBVc2VyRGF0YU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFVzZXJEYXRhT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFVzZXJEYXRhT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFVzZXJEYXRhX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0LlVzZXJEYXRhIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVXNlckRhdGFPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBVc2VyRGF0YU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBVc2VyRGF0YU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVXNlckRhdGFPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFVzZXJEYXRhT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVVzZXJEYXRhT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVVzZXJEYXRhT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVVzZXJEYXRhT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlVc2VyRGF0YU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlVc2VyRGF0YU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVVzZXJEYXRhT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuVXNlckRhdGEiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihVc2VyRGF0YU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFVzZXJEYXRhT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFVzZXJEYXRhT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBVc2VyRGF0YU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgVXNlckRhdGFPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVXNlckRhdGFPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVXNlckRhdGFPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgVXNlckRhdGFPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFVzZXJEYXRhT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFVzZXJEYXRhT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgVXNlckRhdGFPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFVzZXJEYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yMjEwLDExNjUgKzIyMTAsMTE2NSBAQAogI2RlZmluZSBNZWRpYU9ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZNZWRpYV9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZNZWRpYV9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgTWVkaWFPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlNZWRpYSBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIE1lZGlhIG9iX2l0c2VsZjsKIH0gTWVkaWFPYmplY3Q7CiAKIFB5T2JqZWN0ICpNZWRpYU9ial9OZXcoTWVkaWEgaXRzZWxmKQogewotCU1lZGlhT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNZWRpYSBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKE1lZGlhT2JqZWN0LCAmTWVkaWFfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIE1lZGlhT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBNZWRpYSBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKE1lZGlhT2JqZWN0LCAmTWVkaWFfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgTWVkaWFPYmpfQ29udmVydChQeU9iamVjdCAqdiwgTWVkaWEgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFNZWRpYU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNZWRpYSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChNZWRpYU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIU1lZGlhT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1lZGlhIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKE1lZGlhT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgTWVkaWFPYmpfZGVhbGxvYyhNZWRpYU9iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlVHJhY2tNZWRpYShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZVRyYWNrTWVkaWEoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0xvYWRNZWRpYUludG9SYW0oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRNZWRpYUludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkTWVkaWFJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkTWVkaWFJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkTWVkaWFJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRNZWRpYUludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVRyYWNrKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFUcmFjawotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVHJhY2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVHJhY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhVHJhY2soX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVHJhY2soX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFDcmVhdGlvblRpbWUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFDcmVhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUNyZWF0aW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFDcmVhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYUNyZWF0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB1bnNpZ25lZCBsb25nIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhTW9kaWZpY2F0aW9uVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhVGltZVNjYWxlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lU2NhbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lU2NhbGUgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhVGltZVNjYWxlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lU2NhbGUgdGltZVNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lU2NhbGUgdGltZVNjYWxlOwogI2lmbmRlZiBTZXRNZWRpYVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhVGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWVTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGltZVNjYWxlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHRpbWVTY2FsZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRHVyYXRpb24oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBfcnY7CiAjaWZuZGVmIEdldE1lZGlhRHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUR1cmF0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUR1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYUR1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYUR1cmF0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTGFuZ3VhZ2UoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRNZWRpYUxhbmd1YWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFMYW5ndWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFMYW5ndWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFMYW5ndWFnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFMYW5ndWFnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYUxhbmd1YWdlKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBsYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgbGFuZ3VhZ2U7CiAjaWZuZGVmIFNldE1lZGlhTGFuZ3VhZ2UKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUxhbmd1YWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUxhbmd1YWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNZWRpYUxhbmd1YWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICBsYW5ndWFnZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGFuZ3VhZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYUxhbmd1YWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUXVhbGl0eShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldE1lZGlhUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFRdWFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNZWRpYVF1YWxpdHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVF1YWxpdHkoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHF1YWxpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHF1YWxpdHk7CiAjaWZuZGVmIFNldE1lZGlhUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFRdWFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhUXVhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBxdWFsaXR5KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TWVkaWFRdWFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKLQlTdHIyNTUgY3JlYXRvck5hbWU7Ci0JT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CisgICAgU3RyMjU1IGNyZWF0b3JOYW1lOworICAgIE9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyOwogI2lmbmRlZiBHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvck5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYUhhbmRsZXJEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVVzZXJEYXRhKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0TWVkaWFVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZWRpYUhhbmRsZXIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNZWRpYUhhbmRsZXIgX3J2OwogI2lmbmRlZiBHZXRNZWRpYUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhSGFuZGxlcihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNZWRpYUhhbmRsZXJDb21wb25lbnQgbUg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTWVkaWFIYW5kbGVyQ29tcG9uZW50IG1IOwogI2lmbmRlZiBTZXRNZWRpYUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYUhhbmRsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmbUgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBtSCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJm1IKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0JlZ2luTWVkaWFFZGl0cyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgQmVnaW5NZWRpYUVkaXRzCi0JUHlNYWNfUFJFQ0hFQ0soQmVnaW5NZWRpYUVkaXRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhCZWdpbk1lZGlhRWRpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBCZWdpbk1lZGlhRWRpdHMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBCZWdpbk1lZGlhRWRpdHMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfRW5kTWVkaWFFZGl0cyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgRW5kTWVkaWFFZGl0cwotCVB5TWFjX1BSRUNIRUNLKEVuZE1lZGlhRWRpdHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEVuZE1lZGlhRWRpdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRNZWRpYUVkaXRzKF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRW5kTWVkaWFFZGl0cyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgaW5kZXg7CiAjaWZuZGVmIFNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleAotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGluZGV4OwotCU9TVHlwZSBkaFR5cGU7Ci0JU3RyMjU1IGNyZWF0b3JOYW1lOwotCU9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBPU1R5cGUgZGhUeXBlOworICAgIFN0cjI1NSBjcmVhdG9yTmFtZTsKKyAgICBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcjsKICNpZm5kZWYgR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGNyZWF0b3JOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGhUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0b3JNYW51ZmFjdHVyZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGhUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yTWFudWZhY3R1cmVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgY3JlYXRvck5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3JOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRvck1hbnVmYWN0dXJlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkaFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNyZWF0b3JNYW51ZmFjdHVyZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRGF0YUhhbmRsZXIoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCURhdGFIYW5kbGVyIF9ydjsKLQlzaG9ydCBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRGF0YUhhbmRsZXIgX3J2OworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRNZWRpYURhdGFIYW5kbGVyCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhSGFuZGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFEYXRhSGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhRGF0YUhhbmRsZXIoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhRGF0YUhhbmRsZXIoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7Ci0JRGF0YUhhbmRsZXJDb21wb25lbnQgZGF0YUhhbmRsZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgaW5kZXg7CisgICAgRGF0YUhhbmRsZXJDb21wb25lbnQgZGF0YUhhbmRsZXI7CiAjaWZuZGVmIFNldE1lZGlhRGF0YUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFIYW5kbGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZkYXRhSGFuZGxlcikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNZWRpYURhdGFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZkYXRhSGFuZGxlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYURhdGFIYW5kbGVyKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUhhbmRsZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbihNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBpbmRleDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBpbmRleDsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKICNpZm5kZWYgR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjSCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY0gpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5kZXg7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpbmRleDsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSDsKICNpZm5kZWYgU2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2NIKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGVDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFTYW1wbGVDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTYW1wbGVDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFTYW1wbGVDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYVN5bmNTYW1wbGVDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNZWRpYVN5bmNTYW1wbGVDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU3luY1NhbXBsZUNvdW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVN5bmNTYW1wbGVDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFTeW5jU2FtcGxlQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1lZGlhU3luY1NhbXBsZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NhbXBsZU51bVRvTWVkaWFUaW1lKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGxvZ2ljYWxTYW1wbGVOdW07Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0JVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGxvZ2ljYWxTYW1wbGVOdW07CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOwogI2lmbmRlZiBTYW1wbGVOdW1Ub01lZGlhVGltZQotCVB5TWFjX1BSRUNIRUNLKFNhbXBsZU51bVRvTWVkaWFUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTYW1wbGVOdW1Ub01lZGlhVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxvZ2ljYWxTYW1wbGVOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlTYW1wbGVOdW1Ub01lZGlhVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIGxvZ2ljYWxTYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9naWNhbFNhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNhbXBsZU51bVRvTWVkaWFUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbFNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfTWVkaWFUaW1lVG9TYW1wbGVOdW0oTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSB0aW1lOwotCWxvbmcgc2FtcGxlTnVtOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOwotCVRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgbG9uZyBzYW1wbGVOdW07CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uOwogI2lmbmRlZiBNZWRpYVRpbWVUb1NhbXBsZU51bQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVGltZVRvU2FtcGxlTnVtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVRpbWVUb1NhbXBsZU51bSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlNZWRpYVRpbWVUb1NhbXBsZU51bShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNZWRpYVRpbWVUb1NhbXBsZU51bShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9BZGRNZWRpYVNhbXBsZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YUluOwotCWxvbmcgaW5PZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCVRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7Ci0JbG9uZyBudW1iZXJPZlNhbXBsZXM7Ci0Jc2hvcnQgc2FtcGxlRmxhZ3M7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFJbjsKKyAgICBsb25nIGluT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOwogI2lmbmRlZiBBZGRNZWRpYVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhU2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNZWRpYVNhbXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbE8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIHNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCi0JICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKLQkgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbE8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9BZGRNZWRpYVNhbXBsZVJlZmVyZW5jZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGRhdGFPZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotCVRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7Ci0JbG9uZyBudW1iZXJPZlNhbXBsZXM7Ci0Jc2hvcnQgc2FtcGxlRmxhZ3M7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOwogI2lmbmRlZiBBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhU2FtcGxlUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxPJmxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbE8mbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRNZWRpYVNhbXBsZVJlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGUoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFPdXQ7Ci0JbG9uZyBtYXhTaXplVG9Hcm93OwotCWxvbmcgc2l6ZTsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOwotCWxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLQlsb25nIG1heE51bWJlck9mU2FtcGxlczsKLQlsb25nIG51bWJlck9mU2FtcGxlczsKLQlzaG9ydCBzYW1wbGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YU91dDsKKyAgICBsb25nIG1heFNpemVUb0dyb3c7CisgICAgbG9uZyBzaXplOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4OworICAgIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZVRvR3JvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhU2FtcGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIG1heFNpemVUb0dyb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBtYXhOdW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVGbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25QZXJTYW1wbGUsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplVG9Hcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhOdW1iZXJPZlNhbXBsZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWVkaWFTYW1wbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZVRvR3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25QZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBkYXRhT2Zmc2V0OwotCWxvbmcgc2l6ZTsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgc2FtcGxlVGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGU7Ci0JU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IOwotCWxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleDsKLQlsb25nIG1heE51bWJlck9mU2FtcGxlczsKLQlsb25nIG51bWJlck9mU2FtcGxlczsKLQlzaG9ydCBzYW1wbGVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGRhdGFPZmZzZXQ7CisgICAgbG9uZyBzaXplOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIFRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4OworICAgIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzOworICAgIGxvbmcgbnVtYmVyT2ZTYW1wbGVzOworICAgIHNob3J0IHNhbXBsZUZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGxsbGgiLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TnVtYmVyT2ZTYW1wbGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhU2FtcGxlUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvblBlclNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25ILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY3JpcHRpb25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4TnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRmxhZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGxsbGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uUGVyU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIG1heENodW5rU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIG1heENodW5rU2l6ZTsKICNpZm5kZWYgU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhDaHVua1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2h1bmtTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heENodW5rU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDaHVua1NpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgbWF4Q2h1bmtTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgbWF4Q2h1bmtTaXplOwogI2lmbmRlZiBHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhDaHVua1NpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG1heENodW5rU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYVByZWZlcnJlZENodW5rU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4Q2h1bmtTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDaHVua1NpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhU2hhZG93U3luYyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGZyYW1lRGlmZlNhbXBsZU51bTsKLQlsb25nIHN5bmNTYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmcmFtZURpZmZTYW1wbGVOdW07CisgICAgbG9uZyBzeW5jU2FtcGxlTnVtOwogI2lmbmRlZiBTZXRNZWRpYVNoYWRvd1N5bmMKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVNoYWRvd1N5bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1lZGlhU2hhZG93U3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcmFtZURpZmZTYW1wbGVOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1lZGlhU2hhZG93U3luYyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEaWZmU2FtcGxlTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY1NhbXBsZU51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVEaWZmU2FtcGxlTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3luY1NhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNTYW1wbGVOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhU2hhZG93U3luYyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGZyYW1lRGlmZlNhbXBsZU51bTsKLQlsb25nIHN5bmNTYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmcmFtZURpZmZTYW1wbGVOdW07CisgICAgbG9uZyBzeW5jU2FtcGxlTnVtOwogI2lmbmRlZiBHZXRNZWRpYVNoYWRvd1N5bmMKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVNoYWRvd1N5bmMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhU2hhZG93U3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lRGlmZlNhbXBsZU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lRGlmZlNhbXBsZU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYVNoYWRvd1N5bmMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lRGlmZlNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW5jU2FtcGxlTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jU2FtcGxlTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldE1lZGlhRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWVkaWFEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TWVkaWFEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhRGF0YVNpemU2NChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQl3aWRlIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIHdpZGUgZGF0YVNpemU7CiAjaWZuZGVmIEdldE1lZGlhRGF0YVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhRGF0YVNpemU2NChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNZWRpYURhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfQ29weU1lZGlhVXNlckRhdGEoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTWVkaWEgZHN0TWVkaWE7Ci0JT1NUeXBlIGNvcHlSdWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1lZGlhIGRzdE1lZGlhOworICAgIE9TVHlwZSBjb3B5UnVsZTsKICNpZm5kZWYgQ29weU1lZGlhVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5TWVkaWFVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1lZGlhVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZkc3RNZWRpYSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1lZGlhVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TWVkaWEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJmRzdE1lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5TWVkaWFVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZShNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JRml4ZWQgcmF0ZTsKLQlUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFnczsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCByYXRlOworICAgIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CiAjaWZuZGVmIEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfR2V0TWVkaWFEYXRhUmVmKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRNZWRpYURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1lZGlhRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmQXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9TZXRNZWRpYURhdGFSZWYoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgaW5kZXg7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgU2V0TWVkaWFEYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TWVkaWFEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyhNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBpbmRleDsKLQlsb25nIGRhdGFSZWZBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGluZGV4OworICAgIGxvbmcgZGF0YVJlZkF0dHJpYnV0ZXM7CiAjaWZuZGVmIFNldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZkF0dHJpYnV0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZBdHRyaWJ1dGVzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmQXR0cmlidXRlcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfQWRkTWVkaWFEYXRhUmVmKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGluZGV4OwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBpbmRleDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIEFkZE1lZGlhRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEFkZE1lZGlhRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkTWVkaWFEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1lZGlhRGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkTWVkaWFEYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNZWRpYU9ial9HZXRNZWRpYURhdGFSZWZDb3VudChNZWRpYU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBjb3VudDsKICNpZm5kZWYgR2V0TWVkaWFEYXRhUmVmQ291bnQKLQlQeU1hY19QUkVDSEVDSyhHZXRNZWRpYURhdGFSZWZDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFEYXRhUmVmQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNZWRpYURhdGFSZWZDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIGNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldE1lZGlhRGF0YVJlZkNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX1NldE1lZGlhUGxheUhpbnRzKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOwotCWxvbmcgZmxhZ3NNYXNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgZmxhZ3NNYXNrOwogI2lmbmRlZiBTZXRNZWRpYVBsYXlIaW50cwotCVB5TWFjX1BSRUNIRUNLKFNldE1lZGlhUGxheUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNZWRpYVBsYXlIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCi0JCXJldHVybiBOVUxMOwotCVNldE1lZGlhUGxheUhpbnRzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNZWRpYVBsYXlIaW50cyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhUGxheUhpbnRzKE1lZGlhT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHZXRNZWRpYVBsYXlIaW50cwotCVB5TWFjX1BSRUNIRUNLKEdldE1lZGlhUGxheUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNZWRpYVBsYXlIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFQbGF5SGludHMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1lZGlhUGxheUhpbnRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkoTWVkaWFPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgRml4ZWQgcmF0ZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lOwogI2lmbmRlZiBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBNZWRpYU9ial9tZXRob2RzW10gPSB7Ci0JeyJMb2FkTWVkaWFJbnRvUmFtIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0xvYWRNZWRpYUludG9SYW0sIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBUaW1lVmFsdWUgZHVyYXRpb24sIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVHJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRNZWRpYUNyZWF0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUNyZWF0aW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFNb2RpZmljYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTW9kaWZpY2F0aW9uVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVTY2FsZSBfcnYpIil9LAotCXsiU2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVTY2FsZSB0aW1lU2NhbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYUR1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRHVyYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAotCXsiR2V0TWVkaWFMYW5ndWFnZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUxhbmd1YWdlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0TWVkaWFMYW5ndWFnZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYUxhbmd1YWdlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsYW5ndWFnZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhUXVhbGl0eSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVF1YWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJTZXRNZWRpYVF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFRdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBxdWFsaXR5KSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBjcmVhdG9yTmFtZSkgLT4gKE9TVHlwZSBtZWRpYVR5cGUsIE9TVHlwZSBjcmVhdG9yTWFudWZhY3R1cmVyKSIpfSwKLQl7IkdldE1lZGlhVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKLQl7IkdldE1lZGlhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1lZGlhSGFuZGxlciBfcnYpIil9LAotCXsiU2V0TWVkaWFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyQ29tcG9uZW50IG1IKSAtPiBOb25lIil9LAotCXsiQmVnaW5NZWRpYUVkaXRzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0JlZ2luTWVkaWFFZGl0cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRW5kTWVkaWFFZGl0cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9FbmRNZWRpYUVkaXRzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZWRpYURlZmF1bHREYXRhUmVmSW5kZXgiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldE1lZGlhRGF0YUhhbmRsZXJEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBTdHIyNTUgY3JlYXRvck5hbWUpIC0+IChPU1R5cGUgZGhUeXBlLCBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcikiKX0sCi0JeyJHZXRNZWRpYURhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YUhhbmRsZXIsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoRGF0YUhhbmRsZXIgX3J2KSIpfSwKLQl7IlNldE1lZGlhRGF0YUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFEYXRhSGFuZGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIERhdGFIYW5kbGVyQ29tcG9uZW50IGRhdGFIYW5kbGVyKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluZGV4LCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjSCkgLT4gTm9uZSIpfSwKLQl7IlNldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0gpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVNhbXBsZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhU3luY1NhbXBsZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU3luY1NhbXBsZUNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTYW1wbGVOdW1Ub01lZGlhVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TYW1wbGVOdW1Ub01lZGlhVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBsb2dpY2FsU2FtcGxlTnVtKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbikiKX0sCi0JeyJNZWRpYVRpbWVUb1NhbXBsZU51bSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9NZWRpYVRpbWVUb1NhbXBsZU51bSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChsb25nIHNhbXBsZU51bSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbikiKX0sCi0JeyJBZGRNZWRpYVNhbXBsZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9BZGRNZWRpYVNhbXBsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFJbiwgbG9uZyBpbk9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGVSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSAtPiAoVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiR2V0TWVkaWFTYW1wbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhT3V0LCBsb25nIG1heFNpemVUb0dyb3csIFRpbWVWYWx1ZSB0aW1lLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzKSAtPiAobG9uZyBzaXplLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBsb25nIHNhbXBsZURlc2NyaXB0aW9uSW5kZXgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykiKX0sCi0JeyJHZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZVJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCwgbG9uZyBtYXhOdW1iZXJPZlNhbXBsZXMpIC0+IChsb25nIGRhdGFPZmZzZXQsIGxvbmcgc2l6ZSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIil9LAotCXsiU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbWF4Q2h1bmtTaXplKSAtPiBOb25lIil9LAotCXsiR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFQcmVmZXJyZWRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgbWF4Q2h1bmtTaXplKSIpfSwKLQl7IlNldE1lZGlhU2hhZG93U3luYyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVNoYWRvd1N5bmMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZnJhbWVEaWZmU2FtcGxlTnVtLCBsb25nIHN5bmNTYW1wbGVOdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVNoYWRvd1N5bmMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTaGFkb3dTeW5jLCAxLAotCSBQeURvY19TVFIoIihsb25nIGZyYW1lRGlmZlNhbXBsZU51bSkgLT4gKGxvbmcgc3luY1NhbXBsZU51bSkiKX0sCi0JeyJHZXRNZWRpYURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1lZGlhRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAotCXsiQ29weU1lZGlhVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQ29weU1lZGlhVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhIGRzdE1lZGlhLCBPU1R5cGUgY29weVJ1bGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lLCBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbikiKX0sCi0JeyJHZXRNZWRpYURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZGF0YVJlZkF0dHJpYnV0ZXMpIil9LAotCXsiU2V0TWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YVJlZkF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAotCXsiQWRkTWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0FkZE1lZGlhRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKHNob3J0IGluZGV4KSIpfSwKLQl7IkdldE1lZGlhRGF0YVJlZkNvdW50IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVJlZkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBjb3VudCkiKX0sCi0JeyJTZXRNZWRpYVBsYXlIaW50cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYVBsYXlIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRNZWRpYVBsYXlIaW50cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVBsYXlIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBmbGFncykiKX0sCi0JeyJHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHksIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTG9hZE1lZGlhSW50b1JhbSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9Mb2FkTWVkaWFJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFUcmFjayIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVRyYWNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0TWVkaWFDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFDcmVhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU1vZGlmaWNhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYUR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhTGFuZ3VhZ2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFMYW5ndWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhTGFuZ3VhZ2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFMYW5ndWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYVF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFRdWFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU2V0TWVkaWFRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcXVhbGl0eSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhSGFuZGxlckRlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgY3JlYXRvck5hbWUpIC0+IChPU1R5cGUgbWVkaWFUeXBlLCBPU1R5cGUgY3JlYXRvck1hbnVmYWN0dXJlcikiKX0sCisgICAgeyJHZXRNZWRpYVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNZWRpYUhhbmRsZXIgX3J2KSIpfSwKKyAgICB7IlNldE1lZGlhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlckNvbXBvbmVudCBtSCkgLT4gTm9uZSIpfSwKKyAgICB7IkJlZ2luTWVkaWFFZGl0cyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9CZWdpbk1lZGlhRWRpdHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuZE1lZGlhRWRpdHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfRW5kTWVkaWFFZGl0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVkaWFEZWZhdWx0RGF0YVJlZkluZGV4IiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGVmYXVsdERhdGFSZWZJbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNZWRpYURhdGFIYW5kbGVyRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhSGFuZGxlckRlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgU3RyMjU1IGNyZWF0b3JOYW1lKSAtPiAoT1NUeXBlIGRoVHlwZSwgT1NUeXBlIGNyZWF0b3JNYW51ZmFjdHVyZXIpIil9LAorICAgIHsiR2V0TWVkaWFEYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFIYW5kbGVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKERhdGFIYW5kbGVyIF9ydikiKX0sCisgICAgeyJTZXRNZWRpYURhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhRGF0YUhhbmRsZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBEYXRhSGFuZGxlckNvbXBvbmVudCBkYXRhSGFuZGxlcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb25Db3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzY0gpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhU2FtcGxlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5kZXgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2NIKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFTYW1wbGVDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVNhbXBsZUNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYVN5bmNTYW1wbGVDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYVN5bmNTYW1wbGVDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2FtcGxlTnVtVG9NZWRpYVRpbWUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2FtcGxlTnVtVG9NZWRpYVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbG9naWNhbFNhbXBsZU51bSkgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIil9LAorICAgIHsiTWVkaWFUaW1lVG9TYW1wbGVOdW0iLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfTWVkaWFUaW1lVG9TYW1wbGVOdW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lKSAtPiAobG9uZyBzYW1wbGVOdW0sIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIil9LAorICAgIHsiQWRkTWVkaWFTYW1wbGUiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfQWRkTWVkaWFTYW1wbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhSW4sIGxvbmcgaW5PZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IkFkZE1lZGlhU2FtcGxlUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0FkZE1lZGlhU2FtcGxlUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgVGltZVZhbHVlIGR1cmF0aW9uUGVyU2FtcGxlLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbnVtYmVyT2ZTYW1wbGVzLCBzaG9ydCBzYW1wbGVGbGFncykgLT4gKFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IkdldE1lZGlhU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YU91dCwgbG9uZyBtYXhTaXplVG9Hcm93LCBUaW1lVmFsdWUgdGltZSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25ILCBsb25nIG1heE51bWJlck9mU2FtcGxlcykgLT4gKGxvbmcgc2l6ZSwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvblBlclNhbXBsZSwgbG9uZyBzYW1wbGVEZXNjcmlwdGlvbkluZGV4LCBsb25nIG51bWJlck9mU2FtcGxlcywgc2hvcnQgc2FtcGxlRmxhZ3MpIil9LAorICAgIHsiR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFTYW1wbGVSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB0aW1lLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkgsIGxvbmcgbWF4TnVtYmVyT2ZTYW1wbGVzKSAtPiAobG9uZyBkYXRhT2Zmc2V0LCBsb25nIHNpemUsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb25QZXJTYW1wbGUsIGxvbmcgc2FtcGxlRGVzY3JpcHRpb25JbmRleCwgbG9uZyBudW1iZXJPZlNhbXBsZXMsIHNob3J0IHNhbXBsZUZsYWdzKSIpfSwKKyAgICB7IlNldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX1NldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1heENodW5rU2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhUHJlZmVycmVkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIG1heENodW5rU2l6ZSkiKX0sCisgICAgeyJTZXRNZWRpYVNoYWRvd1N5bmMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFTaGFkb3dTeW5jLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZyYW1lRGlmZlNhbXBsZU51bSwgbG9uZyBzeW5jU2FtcGxlTnVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFTaGFkb3dTeW5jIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhU2hhZG93U3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmcmFtZURpZmZTYW1wbGVOdW0pIC0+IChsb25nIHN5bmNTYW1wbGVOdW0pIil9LAorICAgIHsiR2V0TWVkaWFEYXRhU2l6ZSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFTaXplLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNZWRpYURhdGFTaXplNjQiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFEYXRhU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+ICh3aWRlIGRhdGFTaXplKSIpfSwKKyAgICB7IkNvcHlNZWRpYVVzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0NvcHlNZWRpYVVzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYSBkc3RNZWRpYSwgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAorICAgIHsiR2V0TWVkaWFEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1lZGlhT2JqX0dldE1lZGlhRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGRhdGFSZWZBdHRyaWJ1dGVzKSIpfSwKKyAgICB7IlNldE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAorICAgIHsiU2V0TWVkaWFEYXRhUmVmQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9TZXRNZWRpYURhdGFSZWZBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbmRleCwgbG9uZyBkYXRhUmVmQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IkFkZE1lZGlhRGF0YVJlZiIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9BZGRNZWRpYURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChzaG9ydCBpbmRleCkiKX0sCisgICAgeyJHZXRNZWRpYURhdGFSZWZDb3VudCIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYURhdGFSZWZDb3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgY291bnQpIil9LAorICAgIHsiU2V0TWVkaWFQbGF5SGludHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfU2V0TWVkaWFQbGF5SGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0TWVkaWFQbGF5SGludHMiLCAoUHlDRnVuY3Rpb24pTWVkaWFPYmpfR2V0TWVkaWFQbGF5SGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgZmxhZ3MpIil9LAorICAgIHsiR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seSIsIChQeUNGdW5jdGlvbilNZWRpYU9ial9HZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFncywgVGltZVZhbHVlIHRpbWUsIEZpeGVkIHJhdGUpIC0+IChUaW1lVmFsdWUgaW50ZXJlc3RpbmdUaW1lKSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTWVkaWFPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC0zMzg1LDYxICszMzg1LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTWVkaWFPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCU1lZGlhIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTWVkaWEgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTWVkaWFPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChNZWRpYU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNZWRpYU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE1lZGlhT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1lZGlhT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1lZGlhX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0Lk1lZGlhIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTWVkaWFPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNZWRpYU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNZWRpYU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTWVkaWFPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1lZGlhT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1lZGlhT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1lZGlhT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1lZGlhT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNZWRpYU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNZWRpYU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1lZGlhT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTWVkaWEiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihNZWRpYU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE1lZGlhT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1lZGlhT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBNZWRpYU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgTWVkaWFPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTWVkaWFPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTWVkaWFPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgTWVkaWFPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1lZGlhT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE1lZGlhT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgTWVkaWFPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNZWRpYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zNDUyLDEyNzEgKzM0NTIsMTI3MSBAQAogI2RlZmluZSBUcmFja09ial9DaGVjayh4KSAoKHgpLT5vYl90eXBlID09ICZUcmFja19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZUcmFja19UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgVHJhY2tPYmplY3QgewotCVB5T2JqZWN0X0hFQUQKLQlUcmFjayBvYl9pdHNlbGY7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFRyYWNrIG9iX2l0c2VsZjsKIH0gVHJhY2tPYmplY3Q7CiAKIFB5T2JqZWN0ICpUcmFja09ial9OZXcoVHJhY2sgaXRzZWxmKQogewotCVRyYWNrT2JqZWN0ICppdDsKLQlpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUcmFjayBmcm9tIE5VTEwgcG9pbnRlciIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRyYWNrT2JqZWN0LCAmVHJhY2tfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRyYWNrT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhRdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBUcmFjayBmcm9tIE5VTEwgcG9pbnRlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGl0ID0gUHlPYmplY3RfTkVXKFRyYWNrT2JqZWN0LCAmVHJhY2tfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgVHJhY2tPYmpfQ29udmVydChQeU9iamVjdCAqdiwgVHJhY2sgKnBfaXRzZWxmKQogewotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKCFUcmFja09ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJUcmFjayByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChUcmFja09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIVRyYWNrT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlRyYWNrIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFRyYWNrT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgVHJhY2tPYmpfZGVhbGxvYyhUcmFja09iamVjdCAqc2VsZikKIHsKLQlpZiAoc2VsZi0+b2JfaXRzZWxmKSBEaXNwb3NlTW92aWVUcmFjayhzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllVHJhY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0xvYWRUcmFja0ludG9SYW0oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRUcmFja0ludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkVHJhY2tJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkVHJhY2tJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkVHJhY2tJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRUcmFja0ludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1BpY3QoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBfcnY7Ci0JVGltZVZhbHVlIHRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBfcnY7CisgICAgVGltZVZhbHVlIHRpbWU7CiAjaWZuZGVmIEdldFRyYWNrUGljdAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUGljdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tQaWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrUGljdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB0aW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tQaWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0NsaXBSZ24oVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQ2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRUcmFja0NsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja0NsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrQ2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUcmFja0NsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrRGlzcGxheUJvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW92aWVCb3VuZHNSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW92aWVCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTW92aWVCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja01vdmllQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tCb3VuZHNSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0JvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTWF0dGUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpeE1hcEhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpeE1hcEhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldFRyYWNrTWF0dGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja01hdHRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja01hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja01hdHRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNYXR0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tNYXR0ZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHRoZU1hdHRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgdGhlTWF0dGU7CiAjaWZuZGVmIFNldFRyYWNrTWF0dGUKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja01hdHRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja01hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrTWF0dGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIHRoZU1hdHRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZU1hdHRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tNYXR0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgdGhlTWF0dGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0lEKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldFRyYWNrSUQKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0lEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0lEKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0lEKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTW92aWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OwogI2lmbmRlZiBHZXRUcmFja01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0NyZWF0aW9uVGltZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja0NyZWF0aW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQ3JlYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0NyZWF0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tDcmVhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTW9kaWZpY2F0aW9uVGltZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja01vZGlmaWNhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja01vZGlmaWNhdGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTW9kaWZpY2F0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja01vZGlmaWNhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldFRyYWNrRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrRW5hYmxlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja0VuYWJsZWQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gaXNFbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIGlzRW5hYmxlZDsKICNpZm5kZWYgU2V0VHJhY2tFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja0VuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpc0VuYWJsZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgaXNFbmFibGVkKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpc0VuYWJsZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRUcmFja0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgaXNFbmFibGVkKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tVc2FnZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRUcmFja1VzYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja1VzYWdlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHVzYWdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHVzYWdlOwogI2lmbmRlZiBTZXRUcmFja1VzYWdlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgdXNhZ2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tVc2FnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgdXNhZ2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0R1cmF0aW9uKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OwogI2lmbmRlZiBHZXRUcmFja0R1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEdXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEdXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tEdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tEdXJhdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja09mZnNldChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrT2Zmc2V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja09mZnNldChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja09mZnNldChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIG1vdmllT2Zmc2V0VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIG1vdmllT2Zmc2V0VGltZTsKICNpZm5kZWYgU2V0VHJhY2tPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja09mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZU9mZnNldFRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja09mZnNldChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIG1vdmllT2Zmc2V0VGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVPZmZzZXRUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBtb3ZpZU9mZnNldFRpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0xheWVyKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0VHJhY2tMYXllcgotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTGF5ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTGF5ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrTGF5ZXIoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrTGF5ZXIoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tMYXllcihUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbGF5ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGxheWVyOwogI2lmbmRlZiBTZXRUcmFja0xheWVyCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMYXllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMYXllcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxheWVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0VHJhY2tMYXllcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgbGF5ZXIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxheWVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tMYXllcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgbGF5ZXIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0FsdGVybmF0ZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CiAjaWZuZGVmIEdldFRyYWNrQWx0ZXJuYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tBbHRlcm5hdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrQWx0ZXJuYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja0FsdGVybmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tBbHRlcm5hdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRyYWNrIGFsdGVybmF0ZVQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIGFsdGVybmF0ZVQ7CiAjaWZuZGVmIFNldFRyYWNrQWx0ZXJuYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tBbHRlcm5hdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrQWx0ZXJuYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmFsdGVybmF0ZVQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0FsdGVybmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGFsdGVybmF0ZVQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZhbHRlcm5hdGVUKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tBbHRlcm5hdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGVUKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tWb2x1bWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBHZXRUcmFja1ZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1ZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrVm9sdW1lKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB2b2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHZvbHVtZTsKICNpZm5kZWYgU2V0VHJhY2tWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhTZXRUcmFja1ZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja1ZvbHVtZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHZvbHVtZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0RpbWVuc2lvbnMoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIHdpZHRoOwotCUZpeGVkIGhlaWdodDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgd2lkdGg7CisgICAgRml4ZWQgaGVpZ2h0OwogI2lmbmRlZiBHZXRUcmFja0RpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0VHJhY2tEaW1lbnNpb25zKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFRyYWNrRGltZW5zaW9ucyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBoZWlnaHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrRGltZW5zaW9ucyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgd2lkdGg7Ci0JRml4ZWQgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCB3aWR0aDsKKyAgICBGaXhlZCBoZWlnaHQ7CiAjaWZuZGVmIFNldFRyYWNrRGltZW5zaW9ucwotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrRGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJndpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCVNldFRyYWNrRGltZW5zaW9ucyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0VHJhY2tEaW1lbnNpb25zKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1VzZXJEYXRhKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0VHJhY2tVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBzZXR0aW5nczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CiAjaWZuZGVmIEdldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5ncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5ncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9TZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIHNldHRpbmdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBzZXR0aW5nczsKICNpZm5kZWYgU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9OZXdUcmFja01lZGlhKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNZWRpYSBfcnY7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKLQlUaW1lU2NhbGUgdGltZVNjYWxlOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVkaWEgX3J2OworICAgIE9TVHlwZSBtZWRpYVR5cGU7CisgICAgVGltZVNjYWxlIHRpbWVTY2FsZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIE5ld1RyYWNrTWVkaWEKLQlQeU1hY19QUkVDSEVDSyhOZXdUcmFja01lZGlhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdUcmFja01lZGlhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdUcmFja01lZGlhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdUcmFja01lZGlhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrTWVkaWEoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1lZGlhIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTWVkaWEgX3J2OwogI2lmbmRlZiBHZXRUcmFja01lZGlhCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNZWRpYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tNZWRpYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tNZWRpYShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tNZWRpYShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9JbnNlcnRNZWRpYUludG9UcmFjayhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgdHJhY2tTdGFydDsKLQlUaW1lVmFsdWUgbWVkaWFUaW1lOwotCVRpbWVWYWx1ZSBtZWRpYUR1cmF0aW9uOwotCUZpeGVkIG1lZGlhUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdHJhY2tTdGFydDsKKyAgICBUaW1lVmFsdWUgbWVkaWFUaW1lOworICAgIFRpbWVWYWx1ZSBtZWRpYUR1cmF0aW9uOworICAgIEZpeGVkIG1lZGlhUmF0ZTsKICNpZm5kZWYgSW5zZXJ0TWVkaWFJbnRvVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhJbnNlcnRNZWRpYUludG9UcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TWVkaWFJbnRvVHJhY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbWVkaWFSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydE1lZGlhSW50b1RyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFEdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFSYXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZtZWRpYVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0TWVkaWFJbnRvVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVJhdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0luc2VydFRyYWNrU2VnbWVudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBkc3RUcmFjazsKLQlUaW1lVmFsdWUgc3JjSW47Ci0JVGltZVZhbHVlIHNyY0R1cmF0aW9uOwotCVRpbWVWYWx1ZSBkc3RJbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayBkc3RUcmFjazsKKyAgICBUaW1lVmFsdWUgc3JjSW47CisgICAgVGltZVZhbHVlIHNyY0R1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBkc3RJbjsKICNpZm5kZWYgSW5zZXJ0VHJhY2tTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0VHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIGRzdEluOwotCVRpbWVWYWx1ZSBkc3REdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgZHN0SW47CisgICAgVGltZVZhbHVlIGRzdER1cmF0aW9uOwogI2lmbmRlZiBJbnNlcnRFbXB0eVRyYWNrU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEluc2VydEVtcHR5VHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRFbXB0eVRyYWNrU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3RJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdER1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydEVtcHR5VHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRFbXB0eVRyYWNrU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RHVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgRGVsZXRlVHJhY2tTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlVHJhY2tTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgb2xkRHVyYXRpb247Ci0JVGltZVZhbHVlIG5ld0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIG9sZER1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbjsKICNpZm5kZWYgU2NhbGVUcmFja1NlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhTY2FsZVRyYWNrU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVUcmFja1NlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9sZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3RHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2NhbGVUcmFja1NlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBvbGREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0R1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjYWxlVHJhY2tTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0R1cmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9Jc1NjcmFwTW92aWUoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBfcnY7CiAjaWZuZGVmIElzU2NyYXBNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKElzU2NyYXBNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNTY3JhcE1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1NjcmFwTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1NjcmFwTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0NvcHlUcmFja1NldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRyYWNrIGRzdFRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRyYWNrIGRzdFRyYWNrOwogI2lmbmRlZiBDb3B5VHJhY2tTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKENvcHlUcmFja1NldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5VHJhY2tTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZkc3RUcmFjaykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VHJhY2tTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weVRyYWNrU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VHJhY2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZEVtcHR5VHJhY2tUb01vdmllKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1vdmllIGRzdE1vdmllOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlUcmFjayBkc3RUcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgVHJhY2sgZHN0VHJhY2s7CiAjaWZuZGVmIEFkZEVtcHR5VHJhY2tUb01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soQWRkRW1wdHlUcmFja1RvTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEVtcHR5VHJhY2tUb01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRFbXB0eVRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRFbXB0eVRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZENsb25lZFRyYWNrVG9Nb3ZpZShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSBkc3RNb3ZpZTsKLQlsb25nIGZsYWdzOwotCVRyYWNrIGRzdFRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOworICAgIGxvbmcgZmxhZ3M7CisgICAgVHJhY2sgZHN0VHJhY2s7CiAjaWZuZGVmIEFkZENsb25lZFRyYWNrVG9Nb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEFkZENsb25lZFRyYWNrVG9Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkQ2xvbmVkVHJhY2tUb01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZENsb25lZFRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZENsb25lZFRyYWNrVG9Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RUcmFjayk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgZHN0VHJhY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVRyYWNrIHJlZlRyYWNrOwotCU9TVHlwZSByZWZUeXBlOwotCWxvbmcgYWRkZWRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayByZWZUcmFjazsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGFkZGVkSW5kZXg7CiAjaWZuZGVmIEFkZFRyYWNrUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soQWRkVHJhY2tSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFRyYWNrUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmcmVmVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQWRkVHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZEluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBhZGRlZEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnJlZlRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkZWRJbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBEZWxldGVUcmFja1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZVRyYWNrUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVUcmFja1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZyZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlVHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWxldGVUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UoVHJhY2tPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgcmVmVHJhY2s7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUcmFjayByZWZUcmFjazsKKyAgICBPU1R5cGUgcmVmVHlwZTsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBTZXRUcmFja1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNldFRyYWNrUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRUcmFja1JlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZyZWZUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmcmVmVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRUcmFja1JlZmVyZW5jZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JT1NUeXBlIHJlZlR5cGU7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEdldFRyYWNrUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRyYWNrUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tSZWZlcmVuY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1R5cGUgX3J2OwotCU9TVHlwZSByZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1R5cGUgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOwogI2lmbmRlZiBHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrUmVmZXJlbmNlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRUcmFja1JlZmVyZW5jZVR5cGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tSZWZlcmVuY2VDb3VudChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JT1NUeXBlIHJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIE9TVHlwZSByZWZUeXBlOwogI2lmbmRlZiBHZXRUcmFja1JlZmVyZW5jZUNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2VDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tSZWZlcmVuY2VDb3VudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRUcmFja1JlZmVyZW5jZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja1JlZmVyZW5jZUNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0VkaXRSYXRlKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JVGltZVZhbHVlIGF0VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIFRpbWVWYWx1ZSBhdFRpbWU7CiAjaWZuZGVmIEdldFRyYWNrRWRpdFJhdGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0VkaXRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0VkaXRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tFZGl0UmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRUcmFja0VkaXRSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0RhdGFTaXplKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldFRyYWNrRGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0RhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0VHJhY2tEYXRhU2l6ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NChUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQl3aWRlIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIHdpZGUgZGF0YVNpemU7CiAjaWZuZGVmIEdldFRyYWNrRGF0YVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrRGF0YVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tEYXRhU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRyYWNrRGF0YVNpemU2NChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRUcmFja0RhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfUHRJblRyYWNrKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCBwdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgcHQ7CiAjaWZuZGVmIFB0SW5UcmFjawotCVB5TWFjX1BSRUNIRUNLKFB0SW5UcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHRJblRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFB0SW5UcmFjayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICBwdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHRJblRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIHB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9Db3B5VHJhY2tVc2VyRGF0YShUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBkc3RUcmFjazsKLQlPU1R5cGUgY29weVJ1bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgZHN0VHJhY2s7CisgICAgT1NUeXBlIGNvcHlSdWxlOwogI2lmbmRlZiBDb3B5VHJhY2tVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKENvcHlUcmFja1VzZXJEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5VHJhY2tVc2VyRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJmRzdFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5VHJhY2tVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmZHN0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvcHlSdWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlUcmFja1VzZXJEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UnVsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVHJhY2tPYmpfR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBpbnRlcmVzdGluZ1RpbWVGbGFnczsKLQlUaW1lVmFsdWUgdGltZTsKLQlGaXhlZCByYXRlOwotCVRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKICNpZm5kZWYgR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCUdldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRUcmFja05leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgX3J2OwotCVRpbWVWYWx1ZSB0aW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrU2VnbWVudERpc3BsYXlCb3VuZHNSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX0dldFRyYWNrU3RhdHVzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OwogI2lmbmRlZiBHZXRUcmFja1N0YXR1cwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrU3RhdHVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja1N0YXR1cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0VHJhY2tTdGF0dXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFRyYWNrU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRyYWNrT2JqX1NldFRyYWNrTG9hZFNldHRpbmdzKFRyYWNrT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgcHJlbG9hZFRpbWU7Ci0JVGltZVZhbHVlIHByZWxvYWREdXJhdGlvbjsKLQlsb25nIHByZWxvYWRGbGFnczsKLQlsb25nIGRlZmF1bHRIaW50czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHByZWxvYWRUaW1lOworICAgIFRpbWVWYWx1ZSBwcmVsb2FkRHVyYXRpb247CisgICAgbG9uZyBwcmVsb2FkRmxhZ3M7CisgICAgbG9uZyBkZWZhdWx0SGludHM7CiAjaWZuZGVmIFNldFRyYWNrTG9hZFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0VHJhY2tMb2FkU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFRyYWNrTG9hZFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0SGludHMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRUcmFja0xvYWRTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHByZWxvYWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEhpbnRzKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRIaW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFRyYWNrTG9hZFNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGludHMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncyhUcmFja09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZWxvYWRUaW1lOwotCVRpbWVWYWx1ZSBwcmVsb2FkRHVyYXRpb247Ci0JbG9uZyBwcmVsb2FkRmxhZ3M7Ci0JbG9uZyBkZWZhdWx0SGludHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmVsb2FkVGltZTsKKyAgICBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uOworICAgIGxvbmcgcHJlbG9hZEZsYWdzOworICAgIGxvbmcgZGVmYXVsdEhpbnRzOwogI2lmbmRlZiBHZXRUcmFja0xvYWRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKEdldFRyYWNrTG9hZFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRUcmFja0xvYWRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0VHJhY2tMb2FkU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAmcHJlbG9hZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0SGludHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRIaW50cyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFRyYWNrTG9hZFNldHRpbmdzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVsb2FkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEhpbnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWxvYWRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0SGludHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVHJhY2tPYmpfbWV0aG9kc1tdID0gewotCXsiTG9hZFRyYWNrSW50b1JhbSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Mb2FkVHJhY2tJbnRvUmFtLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tQaWN0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFRyYWNrQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0NsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAotCXsiU2V0VHJhY2tDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IkdldFRyYWNrTW92aWVCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja0JvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja01hdHRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTWF0dGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAotCXsiU2V0VHJhY2tNYXR0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja01hdHRlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0lEIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrSUQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldFRyYWNrTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKLQl7IkdldFRyYWNrQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQ3JlYXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJHZXRUcmFja01vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJHZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGlzRW5hYmxlZCkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrVXNhZ2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tVc2FnZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiU2V0VHJhY2tVc2FnZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1VzYWdlLCAxLAotCSBQeURvY19TVFIoIihsb25nIHVzYWdlKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0R1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IkdldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IlNldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgbW92aWVPZmZzZXRUaW1lKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xheWVyLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xheWVyLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBsYXllcikgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrQWx0ZXJuYXRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQWx0ZXJuYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAotCXsiU2V0VHJhY2tBbHRlcm5hdGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIGFsdGVybmF0ZVQpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja1ZvbHVtZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1ZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldFRyYWNrVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0RpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSIpfSwKLQl7IlNldFRyYWNrRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0RpbWVuc2lvbnMsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrVXNlckRhdGEsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCi0JeyJHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgc2V0dGluZ3MpIil9LAotCXsiU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHNldHRpbmdzKSAtPiBOb25lIil9LAotCXsiTmV3VHJhY2tNZWRpYSIsIChQeUNGdW5jdGlvbilUcmFja09ial9OZXdUcmFja01lZGlhLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgbWVkaWFUeXBlLCBUaW1lU2NhbGUgdGltZVNjYWxlLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoTWVkaWEgX3J2KSIpfSwKLQl7IkdldFRyYWNrTWVkaWEiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNZWRpYSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTWVkaWEgX3J2KSIpfSwKLQl7Ikluc2VydE1lZGlhSW50b1RyYWNrIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0luc2VydE1lZGlhSW50b1RyYWNrLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdHJhY2tTdGFydCwgVGltZVZhbHVlIG1lZGlhVGltZSwgVGltZVZhbHVlIG1lZGlhRHVyYXRpb24sIEZpeGVkIG1lZGlhUmF0ZSkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydFRyYWNrU2VnbWVudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9JbnNlcnRUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIGRzdFRyYWNrLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiRGVsZXRlVHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU2NhbGVUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiSXNTY3JhcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0lzU2NyYXBNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCi0JeyJDb3B5VHJhY2tTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9Db3B5VHJhY2tTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgZHN0VHJhY2spIC0+IE5vbmUiKX0sCi0JeyJBZGRFbXB0eVRyYWNrVG9Nb3ZpZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9BZGRFbXB0eVRyYWNrVG9Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChUcmFjayBkc3RUcmFjaykiKX0sCi0JeyJBZGRDbG9uZWRUcmFja1RvTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQWRkQ2xvbmVkVHJhY2tUb01vdmllLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBkc3RNb3ZpZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIGRzdFRyYWNrKSIpfSwKLQl7IkFkZFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihUcmFjayByZWZUcmFjaywgT1NUeXBlIHJlZlR5cGUpIC0+IChsb25nIGFkZGVkSW5kZXgpIil9LAotCXsiRGVsZXRlVHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAotCXsiU2V0VHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFRyYWNrIHJlZlRyYWNrLCBPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkdldFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldE5leHRUcmFja1JlZmVyZW5jZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAoT1NUeXBlIF9ydikiKX0sCi0JeyJHZXRUcmFja1JlZmVyZW5jZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0VHJhY2tFZGl0UmF0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0VkaXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgYXRUaW1lKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkdldFRyYWNrRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0VHJhY2tEYXRhU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAod2lkZSBkYXRhU2l6ZSkiKX0sCi0JeyJQdEluVHJhY2siLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfUHRJblRyYWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNvcHlUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0NvcHlUcmFja1VzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIihUcmFjayBkc3RUcmFjaywgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAotCXsiR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAotCXsiR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRUcmFja1N0YXR1cyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1N0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIC0+IE5vbmUiKX0sCi0JeyJHZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiTG9hZFRyYWNrSW50b1JhbSIsIChQeUNGdW5jdGlvbilUcmFja09ial9Mb2FkVHJhY2tJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tQaWN0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUGljdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0NsaXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJnbkhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrQ2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0Rpc3BsYXlCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTW92aWVCb3VuZHNSZ24iLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0JvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0JvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01hdHRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTWF0dGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpeE1hcEhhbmRsZSBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tNYXR0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja01hdHRlLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0lEIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrQ3JlYXRpb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQ3JlYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRUcmFja01vZGlmaWNhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNb2RpZmljYXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCisgICAgeyJHZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRUcmFja0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGlzRW5hYmxlZCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrVXNhZ2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tVc2FnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tVc2FnZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja1VzYWdlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHVzYWdlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0R1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgbW92aWVPZmZzZXRUaW1lKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xheWVyLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tMYXllciIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xheWVyLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBsYXllcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrQWx0ZXJuYXRlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrQWx0ZXJuYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiU2V0VHJhY2tBbHRlcm5hdGUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tBbHRlcm5hdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIGFsdGVybmF0ZVQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja1ZvbHVtZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1ZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldFRyYWNrVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0RpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEaW1lbnNpb25zLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSIpfSwKKyAgICB7IlNldFRyYWNrRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0RpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrVXNlckRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVzZXJEYXRhIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1NvdW5kTG9jYWxpemF0aW9uU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgc2V0dGluZ3MpIil9LAorICAgIHsiU2V0VHJhY2tTb3VuZExvY2FsaXphdGlvblNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX1NldFRyYWNrU291bmRMb2NhbGl6YXRpb25TZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHNldHRpbmdzKSAtPiBOb25lIil9LAorICAgIHsiTmV3VHJhY2tNZWRpYSIsIChQeUNGdW5jdGlvbilUcmFja09ial9OZXdUcmFja01lZGlhLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgbWVkaWFUeXBlLCBUaW1lU2NhbGUgdGltZVNjYWxlLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoTWVkaWEgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrTWVkaWEiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tNZWRpYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoTWVkaWEgX3J2KSIpfSwKKyAgICB7Ikluc2VydE1lZGlhSW50b1RyYWNrIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0luc2VydE1lZGlhSW50b1RyYWNrLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdHJhY2tTdGFydCwgVGltZVZhbHVlIG1lZGlhVGltZSwgVGltZVZhbHVlIG1lZGlhRHVyYXRpb24sIEZpeGVkIG1lZGlhUmF0ZSkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydFRyYWNrU2VnbWVudCIsIChQeUNGdW5jdGlvbilUcmFja09ial9JbnNlcnRUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIGRzdFRyYWNrLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfSW5zZXJ0RW1wdHlUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlVHJhY2tTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0RlbGV0ZVRyYWNrU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiU2NhbGVUcmFja1NlZ21lbnQiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2NhbGVUcmFja1NlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiSXNTY3JhcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0lzU2NyYXBNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50IF9ydikiKX0sCisgICAgeyJDb3B5VHJhY2tTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9Db3B5VHJhY2tTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgZHN0VHJhY2spIC0+IE5vbmUiKX0sCisgICAgeyJBZGRFbXB0eVRyYWNrVG9Nb3ZpZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9BZGRFbXB0eVRyYWNrVG9Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChUcmFjayBkc3RUcmFjaykiKX0sCisgICAgeyJBZGRDbG9uZWRUcmFja1RvTW92aWUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfQWRkQ2xvbmVkVHJhY2tUb01vdmllLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBkc3RNb3ZpZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIGRzdFRyYWNrKSIpfSwKKyAgICB7IkFkZFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0FkZFRyYWNrUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayByZWZUcmFjaywgT1NUeXBlIHJlZlR5cGUpIC0+IChsb25nIGFkZGVkSW5kZXgpIil9LAorICAgIHsiRGVsZXRlVHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfRGVsZXRlVHJhY2tSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlLCBsb25nIGluZGV4KSAtPiBOb25lIil9LAorICAgIHsiU2V0VHJhY2tSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfU2V0VHJhY2tSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFRyYWNrIHJlZlRyYWNrLCBPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFRyYWNrUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcmVmVHlwZSwgbG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXROZXh0VHJhY2tSZWZlcmVuY2VUeXBlIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldE5leHRUcmFja1JlZmVyZW5jZVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAoT1NUeXBlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1JlZmVyZW5jZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrUmVmZXJlbmNlQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSByZWZUeXBlKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tFZGl0UmF0ZSIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0VkaXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgYXRUaW1lKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkdldFRyYWNrRGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfR2V0VHJhY2tEYXRhU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiR2V0VHJhY2tEYXRhU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrRGF0YVNpemU2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAod2lkZSBkYXRhU2l6ZSkiKX0sCisgICAgeyJQdEluVHJhY2siLCAoUHlDRnVuY3Rpb24pVHJhY2tPYmpfUHRJblRyYWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvcHlUcmFja1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0NvcHlUcmFja1VzZXJEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayBkc3RUcmFjaywgT1NUeXBlIGNvcHlSdWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0VHJhY2tOZXh0SW50ZXJlc3RpbmdUaW1lIiwgKFB5Q0Z1bmN0aW9uKVRyYWNrT2JqX0dldFRyYWNrTmV4dEludGVyZXN0aW5nVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoVGltZVZhbHVlIGludGVyZXN0aW5nVGltZSwgVGltZVZhbHVlIGludGVyZXN0aW5nRHVyYXRpb24pIil9LAorICAgIHsiR2V0VHJhY2tTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1NlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRUcmFja1N0YXR1cyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja1N0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9TZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRUcmFja0xvYWRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilUcmFja09ial9HZXRUcmFja0xvYWRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHByZWxvYWRUaW1lLCBUaW1lVmFsdWUgcHJlbG9hZER1cmF0aW9uLCBsb25nIHByZWxvYWRGbGFncywgbG9uZyBkZWZhdWx0SGludHMpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogI2RlZmluZSBUcmFja09ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTQ3MzMsNjEgKzQ3MzMsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpUcmFja09ial90cF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqX2FyZ3MsIFB5T2JqZWN0ICpfa3dkcykKIHsKLQlQeU9iamVjdCAqX3NlbGY7Ci0JVHJhY2sgaXRzZWxmOwotCWNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OworICAgIFB5T2JqZWN0ICpfc2VsZjsKKyAgICBUcmFjayBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBUcmFja09ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7Ci0JaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFRyYWNrT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIF9zZWxmOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFRyYWNrT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoVHJhY2tPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gX3NlbGY7CiB9CiAKICNkZWZpbmUgVHJhY2tPYmpfdHBfZnJlZSBQeU9iamVjdF9EZWwKIAogCiBQeVR5cGVPYmplY3QgVHJhY2tfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfUXQuVHJhY2siLCAvKnRwX25hbWUqLwotCXNpemVvZihUcmFja09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFRyYWNrT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIFRyYWNrT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCi0JKHJlcHJmdW5jKSBUcmFja09ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgVHJhY2tPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCi0JMCwgLyp0cF9kb2MqLwotCTAsIC8qdHBfdHJhdmVyc2UqLwotCTAsIC8qdHBfY2xlYXIqLwotCTAsIC8qdHBfcmljaGNvbXBhcmUqLwotCTAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwotCTAsIC8qdHBfaXRlciovCi0JMCwgLyp0cF9pdGVybmV4dCovCi0JVHJhY2tPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLwotCTAsIC8qdHBfbWVtYmVycyovCi0JVHJhY2tPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JVHJhY2tPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLwotCVRyYWNrT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLwotCVRyYWNrT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JVHJhY2tPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9RdC5UcmFjayIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFRyYWNrT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgVHJhY2tPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgVHJhY2tPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFRyYWNrT2JqX3JlcHIsIC8qdHBfcmVwciovCisgICAgKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLworICAgIChQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCisgICAgKGhhc2hmdW5jKSBUcmFja09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBUcmFja09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBUcmFja09ial9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICBUcmFja09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgVHJhY2tPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgVHJhY2tPYmpfdHBfbmV3LCAvKiB0cF9uZXcgKi8KKyAgICBUcmFja09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRyYWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ4MDAsMjQ3NiArNDgwMCwyNDc2IEBACiAjZGVmaW5lIE1vdmllT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJk1vdmllX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJk1vdmllX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBNb3ZpZU9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCU1vdmllIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgTW92aWUgb2JfaXRzZWxmOwogfSBNb3ZpZU9iamVjdDsKIAogUHlPYmplY3QgKk1vdmllT2JqX05ldyhNb3ZpZSBpdHNlbGYpCiB7Ci0JTW92aWVPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllIGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoTW92aWVPYmplY3QsICZNb3ZpZV9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgTW92aWVPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIE1vdmllIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoTW92aWVPYmplY3QsICZNb3ZpZV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBNb3ZpZU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBNb3ZpZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIU1vdmllT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk1vdmllIHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKE1vdmllT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghTW92aWVPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTW92aWUgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoTW92aWVPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBNb3ZpZU9ial9kZWFsbG9jKE1vdmllT2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9pdHNlbGYpIERpc3Bvc2VNb3ZpZShzZWxmLT5vYl9pdHNlbGYpOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2l0c2VsZikgRGlzcG9zZU1vdmllKHNlbGYtPm9iX2l0c2VsZik7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Nb3ZpZXNUYXNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1heE1pbGxpU2VjVG9Vc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbWF4TWlsbGlTZWNUb1VzZTsKICNpZm5kZWYgTW92aWVzVGFzawotCVB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhNaWxsaVNlY1RvVXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92aWVzVGFzayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgbWF4TWlsbGlTZWNUb1VzZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4TWlsbGlTZWNUb1VzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1vdmllc1Rhc2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIG1heE1pbGxpU2VjVG9Vc2UpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QcmVyb2xsTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JRml4ZWQgUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdGltZTsKKyAgICBGaXhlZCBSYXRlOwogI2lmbmRlZiBQcmVyb2xsTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQcmVyb2xsTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFByZXJvbGxNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFByZXJvbGxNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgIFJhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJlJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHJlcm9sbE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgUmF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQWJvcnRQcmVQcmVyb2xsTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIGVycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgZXJyOwogI2lmbmRlZiBBYm9ydFByZVByZXJvbGxNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEFib3J0UHJlUHJlcm9sbE1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBYm9ydFByZVByZXJvbGxNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVycikpCi0JCXJldHVybiBOVUxMOwotCUFib3J0UHJlUHJlcm9sbE1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBBYm9ydFByZVByZXJvbGxNb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0xvYWRNb3ZpZUludG9SYW0oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIExvYWRNb3ZpZUludG9SYW0KLQlQeU1hY19QUkVDSEVDSyhMb2FkTW92aWVJbnRvUmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhMb2FkTW92aWVJbnRvUmFtKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkTW92aWVJbnRvUmFtKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRNb3ZpZUludG9SYW0oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBhY3RpdmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gYWN0aXZlOwogI2lmbmRlZiBTZXRNb3ZpZUFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQWN0aXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUFjdGl2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQWN0aXZlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgYWN0aXZlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZUFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIGFjdGl2ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllQWN0aXZlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEdldE1vdmllQWN0aXZlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVBY3RpdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQWN0aXZlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUFjdGl2ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVBY3RpdmUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU3RhcnRNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTdGFydE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soU3RhcnRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3RhcnRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RhcnRNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFN0YXJ0TW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1N0b3BNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTdG9wTW92aWUKLQlQeU1hY19QUkVDSEVDSyhTdG9wTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFN0b3BNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU3RvcE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU3RvcE1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9Hb1RvQmVnaW5uaW5nT2ZNb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBHb1RvQmVnaW5uaW5nT2ZNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKEdvVG9CZWdpbm5pbmdPZk1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHb1RvQmVnaW5uaW5nT2ZNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR29Ub0JlZ2lubmluZ09mTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHb1RvQmVnaW5uaW5nT2ZNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR29Ub0VuZE9mTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgR29Ub0VuZE9mTW92aWUKLQlQeU1hY19QUkVDSEVDSyhHb1RvRW5kT2ZNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR29Ub0VuZE9mTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdvVG9FbmRPZk1vdmllKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR29Ub0VuZE9mTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0lzTW92aWVEb25lKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzTW92aWVEb25lCi0JUHlNYWNfUFJFQ0hFQ0soSXNNb3ZpZURvbmUpOworICAgIFB5TWFjX1BSRUNIRUNLKElzTW92aWVEb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc01vdmllRG9uZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNNb3ZpZURvbmUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVQcmV2aWV3TW9kZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBHZXRNb3ZpZVByZXZpZXdNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3TW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3TW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVByZXZpZXdNb2RlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIHVzZVByZXZpZXc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gdXNlUHJldmlldzsKICNpZm5kZWYgU2V0TW92aWVQcmV2aWV3TW9kZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJldmlld01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJldmlld01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VQcmV2aWV3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVQcmV2aWV3TW9kZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgdXNlUHJldmlldyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlUHJldmlldykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllUHJldmlld01vZGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZVByZXZpZXcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2hvd01vdmllUG9zdGVyCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd01vdmllUG9zdGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93TW92aWVQb3N0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNob3dNb3ZpZVBvc3Rlcihfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dNb3ZpZVBvc3Rlcihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZUJhc2UgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllTWFzdGVyVGltZUJhc2UoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVCYXNlIHRiOwotCVRpbWVSZWNvcmQgc2xhdmVaZXJvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSB0YjsKKyAgICBUaW1lUmVjb3JkIHNsYXZlWmVybzsKICNpZm5kZWYgU2V0TW92aWVNYXN0ZXJUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllTWFzdGVyVGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllTWFzdGVyVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0YiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZU1hc3RlclRpbWVCYXNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICB0YiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTWFzdGVyVGltZUJhc2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsYXZlWmVybyk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllTWFzdGVyQ2xvY2soTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBjbG9ja01laXN0ZXI7Ci0JVGltZVJlY29yZCBzbGF2ZVplcm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudCBjbG9ja01laXN0ZXI7CisgICAgVGltZVJlY29yZCBzbGF2ZVplcm87CiAjaWZuZGVmIFNldE1vdmllTWFzdGVyQ2xvY2sKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZU1hc3RlckNsb2NrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZU1hc3RlckNsb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNsb2NrTWVpc3RlciwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzbGF2ZVplcm8pKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZU1hc3RlckNsb2NrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBjbG9ja01laXN0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAmc2xhdmVaZXJvKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY2xvY2tNZWlzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNsYXZlWmVybykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTWFzdGVyQ2xvY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrTWVpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICZzbGF2ZVplcm8pOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DaG9vc2VNb3ZpZUNsb2NrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBDaG9vc2VNb3ZpZUNsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soQ2hvb3NlTW92aWVDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hvb3NlTW92aWVDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2hvb3NlTW92aWVDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2hvb3NlTW92aWVDbG9jayhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUdXb3JsZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBHZXRNb3ZpZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllR1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAmcG9ydCwKLQkgICAgICAgICAgICAgICAmZ2RoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCi0JICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2RoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAmcG9ydCwKKyAgICAgICAgICAgICAgICAgICAmZ2RoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2RoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZUdXb3JsZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgcG9ydDsKLQlHREhhbmRsZSBnZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2RoOwogI2lmbmRlZiBTZXRNb3ZpZUdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllR1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZUdXb3JsZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHBvcnQsCi0JICAgICAgICAgICAgICAgZ2RoKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVHV29ybGQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgIGdkaCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgbmF0dXJhbEJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCBuYXR1cmFsQm91bmRzOwogI2lmbmRlZiBHZXRNb3ZpZU5hdHVyYWxCb3VuZHNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hdHVyYWxCb3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbmF0dXJhbEJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXR1cmFsQm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm5hdHVyYWxCb3VuZHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JVHJhY2sgdGhlVHJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgR2V0TmV4dFRyYWNrRm9yQ29tcG9zaXRpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFRyYWNrRm9yQ29tcG9zaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXROZXh0VHJhY2tGb3JDb21wb3NpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0aGVUcmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHJhY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldFByZXZUcmFja0ZvckNvbXBvc2l0aW5nKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JVHJhY2sgdGhlVHJhY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcKLQlQeU1hY19QUkVDSEVDSyhHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UHJldlRyYWNrRm9yQ29tcG9zaXRpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0aGVUcmFjaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFByZXZUcmFja0ZvckNvbXBvc2l0aW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlVHJhY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUGljdChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKLQlUaW1lVmFsdWUgdGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKKyAgICBUaW1lVmFsdWUgdGltZTsKICNpZm5kZWYgR2V0TW92aWVQaWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQaWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVQaWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVBpY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUG9zdGVyUGljdChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVQb3N0ZXJQaWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQb3N0ZXJQaWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBvc3RlclBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUG9zdGVyUGljdChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUG9zdGVyUGljdChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfVXBkYXRlTW92aWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFVwZGF0ZU1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVXBkYXRlTW92aWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUmduSGFuZGxlIGludmFsaWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIGludmFsaWRSZ247CiAjaWZuZGVmIEludmFsaWRhdGVNb3ZpZVJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKEludmFsaWRhdGVNb3ZpZVJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW52YWxpZGF0ZU1vdmllUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbnZhbGlkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsaWRhdGVNb3ZpZVJlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsaWRSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxpZGF0ZU1vdmllUmVnaW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUJveChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3hSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJveFJlY3Q7CiAjaWZuZGVmIEdldE1vdmllQm94Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVCb3gpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3ZpZUJveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICZib3hSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZUJveChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllQm94KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJveFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm94UmVjdDsKICNpZm5kZWYgU2V0TW92aWVCb3gKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQm94KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgJmJveFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3hSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVCb3goX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAmYm94UmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGlzcGxheUNsaXBSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllRGlzcGxheUNsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZURpc3BsYXlDbGlwUmduKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVEaXNwbGF5Q2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRNb3ZpZURpc3BsYXlDbGlwUmduCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEaXNwbGF5Q2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEaXNwbGF5Q2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllRGlzcGxheUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllRGlzcGxheUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNsaXBSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQ2xpcFJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVDbGlwUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllQ2xpcFJnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTZXRNb3ZpZUNsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZUNsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllQ2xpcFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICB0aGVDbGlwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZUNsaXBSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURpc3BsYXlCb3VuZHNSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRGlzcGxheUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVCb3VuZHNSZ24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJnbkhhbmRsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllQm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVCb3VuZHNSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllQm91bmRzUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUJvdW5kc1Jnbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllQm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVZpZGVvT3V0cHV0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRJbnN0YW5jZSB2b3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB2b3V0OwogI2lmbmRlZiBTZXRNb3ZpZVZpZGVvT3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWaWRlb091dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWaWRlb091dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVZpZGVvT3V0cHV0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICB2b3V0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2b3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVWaWRlb091dHB1dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgdm91dCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllSW50b0hhbmRsZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgcHVibGljTW92aWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOwogI2lmbmRlZiBQdXRNb3ZpZUludG9IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcHVibGljTW92aWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNNb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b0hhbmRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljTW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllSW50b0RhdGFGb3JrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGZSZWZOdW07Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBtYXhTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGZSZWZOdW07CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBtYXhTaXplOwogI2lmbmRlZiBQdXRNb3ZpZUludG9EYXRhRm9yawotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9EYXRhRm9yayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcmsoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcmsoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yazY0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgZlJlZk51bTsKLQl3aWRlIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIG1heFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBmUmVmTnVtOworICAgIHdpZGUgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKICNpZm5kZWYgUHV0TW92aWVJbnRvRGF0YUZvcms2NAotCVB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b0RhdGFGb3JrNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQdXRNb3ZpZUludG9EYXRhRm9yazY0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvRGF0YUZvcms2NChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURhdGFIYW5kbGVyIGRoOwotCXdpZGUgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFNpemU7CiAjaWZuZGVmIFB1dE1vdmllSW50b1N0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9TdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZUludG9TdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllSW50b1N0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllSW50b1N0b3JhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBwdWJsaWNNb3ZpZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOwogI2lmbmRlZiBQdXRNb3ZpZUZvckRhdGFSZWZJbnRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNyZWF0aW9uVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZUNyZWF0aW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQ3JlYXRpb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUNyZWF0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVDcmVhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllQ3JlYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTW9kaWZpY2F0aW9uVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllTW9kaWZpY2F0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVNb2RpZmljYXRpb25UaW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUaW1lU2NhbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVTY2FsZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVTY2FsZSBfcnY7CiAjaWZuZGVmIEdldE1vdmllVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRpbWVTY2FsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVUaW1lU2NhbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVTY2FsZSB0aW1lU2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVTY2FsZSB0aW1lU2NhbGU7CiAjaWZuZGVmIFNldE1vdmllVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZVNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVUaW1lU2NhbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICB0aW1lU2NhbGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWVTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllVGltZVNjYWxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGltZVNjYWxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVEdXJhdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVEdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllRHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRHVyYXRpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVSYXRlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKICNpZm5kZWYgR2V0TW92aWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVSYXRlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBTZXRNb3ZpZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUmF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICByYXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgcmF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CiAjaWZuZGVmIEdldE1vdmllUHJlZmVycmVkUmF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJlZmVycmVkUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmVmZXJyZWRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkUmF0ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgcmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgcmF0ZTsKICNpZm5kZWYgU2V0TW92aWVQcmVmZXJyZWRSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmVmZXJyZWRSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZWZlcnJlZFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVByZWZlcnJlZFJhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgcmF0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVQcmVmZXJyZWRSYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldE1vdmllUHJlZmVycmVkVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllUHJlZmVycmVkVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVQcmVmZXJyZWRWb2x1bWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllUHJlZmVycmVkVm9sdW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUHJlZmVycmVkVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVByZWZlcnJlZFZvbHVtZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllVm9sdW1lKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0TW92aWVWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVZvbHVtZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVZvbHVtZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdm9sdW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNldE1vdmllVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVWb2x1bWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICB2b2x1bWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllVm9sdW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVQcmV2aWV3VGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZXZpZXdUaW1lOwotCVRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmV2aWV3VGltZTsKKyAgICBUaW1lVmFsdWUgcHJldmlld0R1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVByZXZpZXdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQcmV2aWV3VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVQcmV2aWV3VGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdEdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZVByZXZpZXdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdEdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVQcmV2aWV3VGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHByZXZpZXdUaW1lOwotCVRpbWVWYWx1ZSBwcmV2aWV3RHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwcmV2aWV3VGltZTsKKyAgICBUaW1lVmFsdWUgcHJldmlld0R1cmF0aW9uOwogI2lmbmRlZiBTZXRNb3ZpZVByZXZpZXdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmV2aWV3VGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQcmV2aWV3VGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdEdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllUHJldmlld1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgcHJldmlld0R1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJldmlld1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3RHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVByZXZpZXdUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdEdXJhdGlvbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllUG9zdGVyVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKICNpZm5kZWYgR2V0TW92aWVQb3N0ZXJUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVQb3N0ZXJUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVBvc3RlclRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllUG9zdGVyVGltZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVQb3N0ZXJUaW1lKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIHBvc3RlclRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBwb3N0ZXJUaW1lOwogI2lmbmRlZiBTZXRNb3ZpZVBvc3RlclRpbWUKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVBvc3RlclRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllUG9zdGVyVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvc3RlclRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVBvc3RlclRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgcG9zdGVyVGltZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zdGVyVGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllUG9zdGVyVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBwb3N0ZXJUaW1lKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVTZWxlY3Rpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lOwotCVRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHNlbGVjdGlvblRpbWU7CisgICAgVGltZVZhbHVlIHNlbGVjdGlvbkR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVNlbGVjdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25EdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvblRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uRHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc2VsZWN0aW9uVGltZTsKLQlUaW1lVmFsdWUgc2VsZWN0aW9uRHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBzZWxlY3Rpb25UaW1lOworICAgIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbjsKICNpZm5kZWYgU2V0TW92aWVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25UaW1lLAotCSAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0aW9uVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbGVjdGlvbkR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbkR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVBY3RpdmVTZWdtZW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIFNldE1vdmllQWN0aXZlU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVBY3RpdmVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVBY3RpdmVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllQWN0aXZlU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVBY3RpdmVTZWdtZW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIEdldE1vdmllQWN0aXZlU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllQWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVBY3RpdmVTZWdtZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRNb3ZpZUFjdGl2ZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldE1vdmllQWN0aXZlU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVRpbWUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7Ci0JVGltZVJlY29yZCBjdXJyZW50VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVZhbHVlIF9ydjsKKyAgICBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lOwogI2lmbmRlZiBHZXRNb3ZpZVRpbWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZjdXJyZW50VGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZjdXJyZW50VGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVGltZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmY3VycmVudFRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldE1vdmllVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVJlY29yZCBuZXd0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIG5ld3RpbWU7CiAjaWZuZGVmIFNldE1vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZuZXd0aW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0TW92aWVUaW1lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICZuZXd0aW1lKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJm5ld3RpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVRpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgJm5ld3RpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVRpbWVWYWx1ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZVZhbHVlIG5ld3RpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRpbWVWYWx1ZSBuZXd0aW1lOwogI2lmbmRlZiBTZXRNb3ZpZVRpbWVWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllVGltZVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVRpbWVWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld3RpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVRpbWVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIG5ld3RpbWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld3RpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRNb3ZpZVRpbWVWYWx1ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIG5ld3RpbWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVVzZXJEYXRhKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVc2VyRGF0YSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVzZXJEYXRhIF9ydjsKICNpZm5kZWYgR2V0TW92aWVVc2VyRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllVXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVUcmFja0NvdW50KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIEdldE1vdmllVHJhY2tDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllVHJhY2tDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFja0NvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRyYWNrQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllVHJhY2tDb3VudChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JbG9uZyB0cmFja0lEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgbG9uZyB0cmFja0lEOwogI2lmbmRlZiBHZXRNb3ZpZVRyYWNrCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFjayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVUcmFjayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICB0cmFja0lEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUcmFjayBfcnY7Ci0JbG9uZyBpbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVHJhY2sgX3J2OworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIEdldE1vdmllSW5kVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUluZFRyYWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUluZFRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZUluZFRyYWNrKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllSW5kVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVHJhY2sgX3J2OwotCWxvbmcgaW5kZXg7Ci0JT1NUeXBlIHRyYWNrVHlwZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUcmFjayBfcnY7CisgICAgbG9uZyBpbmRleDsKKyAgICBPU1R5cGUgdHJhY2tUeXBlOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEdldE1vdmllSW5kVHJhY2tUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbmRUcmFja1R5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllSW5kVHJhY2tUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRyYWNrVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TW92aWVJbmRUcmFja1R5cGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRyYWNrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TW92aWVJbmRUcmFja1R5cGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX05ld01vdmllVHJhY2soTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRyYWNrIF9ydjsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7Ci0Jc2hvcnQgdHJhY2tWb2x1bWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFRyYWNrIF9ydjsKKyAgICBGaXhlZCB3aWR0aDsKKyAgICBGaXhlZCBoZWlnaHQ7CisgICAgc2hvcnQgdHJhY2tWb2x1bWU7CiAjaWZuZGVmIE5ld01vdmllVHJhY2sKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZVRyYWNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZVRyYWNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1ZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01vdmllVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAotCSAgICAgICAgICAgICAgICAgICAgdHJhY2tWb2x1bWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja1ZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllVHJhY2soX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tWb2x1bWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0QXV0b1RyYWNrQWx0ZXJuYXRlc0VuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0QXV0b1RyYWNrQWx0ZXJuYXRlc0VuYWJsZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2VsZWN0TW92aWVBbHRlcm5hdGVzKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNlbGVjdE1vdmllQWx0ZXJuYXRlcwotCVB5TWFjX1BSRUNIRUNLKFNlbGVjdE1vdmllQWx0ZXJuYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2VsZWN0TW92aWVBbHRlcm5hdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTZWxlY3RNb3ZpZUFsdGVybmF0ZXMoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZWxlY3RNb3ZpZUFsdGVybmF0ZXMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0luc2VydE1vdmllU2VnbWVudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSBkc3RNb3ZpZTsKLQlUaW1lVmFsdWUgc3JjSW47Ci0JVGltZVZhbHVlIHNyY0R1cmF0aW9uOwotCVRpbWVWYWx1ZSBkc3RJbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBkc3RNb3ZpZTsKKyAgICBUaW1lVmFsdWUgc3JjSW47CisgICAgVGltZVZhbHVlIHNyY0R1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBkc3RJbjsKICNpZm5kZWYgSW5zZXJ0TW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0TW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW5zZXJ0TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY0R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIGRzdEluOwotCVRpbWVWYWx1ZSBkc3REdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgZHN0SW47CisgICAgVGltZVZhbHVlIGRzdER1cmF0aW9uOwogI2lmbmRlZiBJbnNlcnRFbXB0eU1vdmllU2VnbWVudAotCVB5TWFjX1BSRUNIRUNLKEluc2VydEVtcHR5TW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnNlcnRFbXB0eU1vdmllU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3RJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdER1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydEVtcHR5TW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnNlcnRFbXB0eU1vdmllU2VnbWVudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RHVyYXRpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgRGVsZXRlTW92aWVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTW92aWVTZWdtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZWxldGVNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGVsZXRlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgb2xkRHVyYXRpb247Ci0JVGltZVZhbHVlIG5ld0R1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIG9sZER1cmF0aW9uOworICAgIFRpbWVWYWx1ZSBuZXdEdXJhdGlvbjsKICNpZm5kZWYgU2NhbGVNb3ZpZVNlZ21lbnQKLQlQeU1hY19QUkVDSEVDSyhTY2FsZU1vdmllU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2NhbGVNb3ZpZVNlZ21lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9sZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3RHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2NhbGVNb3ZpZVNlZ21lbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBvbGREdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RHVyYXRpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvbGREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0R1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjYWxlTW92aWVTZWdtZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0R1cmF0aW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DdXRNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CiAjaWZuZGVmIEN1dE1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ3V0TW92aWVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEN1dE1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDdXRNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ3V0TW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKICNpZm5kZWYgQ29weU1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVTZWxlY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvcHlNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ29weU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1Bhc3RlTW92aWVTZWxlY3Rpb24oTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIHNyYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgc3JjOwogI2lmbmRlZiBQYXN0ZU1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soUGFzdGVNb3ZpZVNlbGVjdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFzdGVNb3ZpZVNlbGVjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlQYXN0ZU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICBzcmMpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQYXN0ZU1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzcmMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTW92aWUgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBzcmM7CiAjaWZuZGVmIEFkZE1vdmllU2VsZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soQWRkTW92aWVTZWxlY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZE1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCUFkZE1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc3JjKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmc3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWRkTW92aWVTZWxlY3Rpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBzcmMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTW92aWVTZWxlY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllU2VsZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllU2VsZWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1vdmllU2VsZWN0aW9uKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2xlYXJNb3ZpZVNlbGVjdGlvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JT1NUeXBlIGhhbmRsZVR5cGU7Ci0JSGFuZGxlIHB1YmxpY01vdmllOwotCVRpbWVWYWx1ZSBzdGFydDsKLQlUaW1lVmFsdWUgZHVyOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgdGFyZ2V0VHJhY2s7CisgICAgT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgSGFuZGxlIHB1YmxpY01vdmllOworICAgIFRpbWVWYWx1ZSBzdGFydDsKKyAgICBUaW1lVmFsdWUgZHVyOworICAgIGxvbmcgZmxhZ3M7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CiAjaWZuZGVmIFB1dE1vdmllSW50b1R5cGVkSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB1dE1vdmllSW50b1R5cGVkSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnB1YmxpY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0TW92aWVJbnRvVHlwZWRIYW5kbGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckNvbXApOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0NvcHlNb3ZpZVNldHRpbmdzKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU1vdmllIGRzdE1vdmllOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOwogI2lmbmRlZiBDb3B5TW92aWVTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKENvcHlNb3ZpZVNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5TW92aWVTZXR0aW5ncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmZHN0TW92aWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29weU1vdmllU2V0dGluZ3MoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0NvbnZlcnRNb3ZpZVRvRmlsZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUcmFjayBvbmx5VHJhY2s7Ci0JRlNTcGVjIG91dHB1dEZpbGU7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCXNob3J0IHJlc0lEOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVHJhY2sgb25seVRyYWNrOworICAgIEZTU3BlYyBvdXRwdXRGaWxlOworICAgIE9TVHlwZSBmaWxlVHlwZTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBzaG9ydCByZXNJRDsKKyAgICBsb25nIGZsYWdzOworICAgIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wOwogI2lmbmRlZiBDb252ZXJ0TW92aWVUb0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDb252ZXJ0TW92aWVUb0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRNb3ZpZVRvRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZvdXRwdXRGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ1c2VyQ29tcCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb252ZXJ0TW92aWVUb0ZpbGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZvbmx5VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJm91dHB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnVzZXJDb21wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbnZlcnRNb3ZpZVRvRmlsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJDb21wKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVEYXRhU2l6ZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZURhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEYXRhU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVEYXRhU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0Jd2lkZSBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgc3RhcnRUaW1lOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICB3aWRlIGRhdGFTaXplOwogI2lmbmRlZiBHZXRNb3ZpZURhdGFTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZURhdGFTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGF0YVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZURhdGFTaXplNjQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVEYXRhU2l6ZTY0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZGF0YVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B0SW5Nb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHB0OwogI2lmbmRlZiBQdEluTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQdEluTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFB0SW5Nb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBQdEluTW92aWUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgcHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZwdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFB0SW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICBwdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVMYW5ndWFnZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBsYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBsYW5ndWFnZTsKICNpZm5kZWYgU2V0TW92aWVMYW5ndWFnZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllTGFuZ3VhZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldE1vdmllTGFuZ3VhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsYW5ndWFnZSkpCi0JCXJldHVybiBOVUxMOwotCVNldE1vdmllTGFuZ3VhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIGxhbmd1YWdlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsYW5ndWFnZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldE1vdmllTGFuZ3VhZ2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfQ29weU1vdmllVXNlckRhdGEoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgZHN0TW92aWU7Ci0JT1NUeXBlIGNvcHlSdWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIGRzdE1vdmllOworICAgIE9TVHlwZSBjb3B5UnVsZTsKICNpZm5kZWYgQ29weU1vdmllVXNlckRhdGEKLQlQeU1hY19QUkVDSEVDSyhDb3B5TW92aWVVc2VyRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weU1vdmllVXNlckRhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZkc3RNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29weVJ1bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weU1vdmllVXNlckRhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZHN0TW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlSdWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJmRzdE1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb3B5UnVsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb3B5TW92aWVVc2VyRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weVJ1bGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllTmV4dEludGVyZXN0aW5nVGltZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7Ci0Jc2hvcnQgbnVtTWVkaWFUeXBlczsKLQlPU1R5cGUgd2hpY2hNZWRpYVR5cGVzOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7Ci0JVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKLQlUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgaW50ZXJlc3RpbmdUaW1lRmxhZ3M7CisgICAgc2hvcnQgbnVtTWVkaWFUeXBlczsKKyAgICBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CisgICAgVGltZVZhbHVlIGludGVyZXN0aW5nVGltZTsKKyAgICBUaW1lVmFsdWUgaW50ZXJlc3RpbmdEdXJhdGlvbjsKICNpZm5kZWYgR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVOZXh0SW50ZXJlc3RpbmdUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bU1lZGlhVHlwZXMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJndoaWNoTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCUdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ1RpbWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoTWVkaWFUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZXN0aW5nRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nRHVyYXRpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1NZWRpYVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ3aGljaE1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3RpbmdUaW1lRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGljaE1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmVzdGluZ0R1cmF0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9BZGRNb3ZpZVJlc291cmNlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlc1JlZk51bTsKLQlzaG9ydCByZXNJZDsKLQlTdHIyNTUgcmVzTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgcmVzSWQ7CisgICAgU3RyMjU1IHJlc05hbWU7CiAjaWZuZGVmIEFkZE1vdmllUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNJZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCByZXNOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1vdmllUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9VcGRhdGVNb3ZpZVJlc291cmNlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHJlc1JlZk51bTsKLQlzaG9ydCByZXNJZDsKLQlTdHIyNTUgcmVzTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgc2hvcnQgcmVzSWQ7CisgICAgU3RyMjU1IHJlc05hbWU7CiAjaWZuZGVmIFVwZGF0ZU1vdmllUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZVJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc05hbWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0FkZE1vdmllVG9TdG9yYWdlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBBZGRNb3ZpZVRvU3RvcmFnZQotCVB5TWFjX1BSRUNIRUNLKEFkZE1vdmllVG9TdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhBZGRNb3ZpZVRvU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZE1vdmllVG9TdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGRoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEFkZE1vdmllVG9TdG9yYWdlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgVXBkYXRlTW92aWVJblN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhVcGRhdGVNb3ZpZUluU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXBkYXRlTW92aWVJblN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBVcGRhdGVNb3ZpZUluU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBVcGRhdGVNb3ZpZUluU3RvcmFnZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIEhhc01vdmllQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKEhhc01vdmllQ2hhbmdlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGFzTW92aWVDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBIYXNNb3ZpZUNoYW5nZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhhc01vdmllQ2hhbmdlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBDbGVhck1vdmllQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKENsZWFyTW92aWVDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2xlYXJNb3ZpZUNoYW5nZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGVhck1vdmllQ2hhbmdlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVEZWZhdWx0RGF0YVJlZihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBTZXRNb3ZpZURlZmF1bHREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEZWZhdWx0RGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVEZWZhdWx0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TW92aWVEZWZhdWx0RGF0YVJlZihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0dldE1vdmllRGVmYXVsdERhdGFSZWYoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgR2V0TW92aWVEZWZhdWx0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGVmYXVsdERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1vdmllRGVmYXVsdERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZURlZmF1bHREYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfU2V0TW92aWVDb2xvclRhYmxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNUYWJIYW5kbGUgY3RhYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBDVGFiSGFuZGxlIGN0YWI7CiAjaWZuZGVmIFNldE1vdmllQ29sb3JUYWJsZQotCVB5TWFjX1BSRUNIRUNLKFNldE1vdmllQ29sb3JUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVDb2xvclRhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldE1vdmllQ29sb3JUYWJsZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0TW92aWVDb2xvclRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGFiKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JQ1RhYkhhbmRsZSBjdGFiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIENUYWJIYW5kbGUgY3RhYjsKICNpZm5kZWYgR2V0TW92aWVDb2xvclRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVDb2xvclRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUNvbG9yVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZUNvbG9yVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjdGFiKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZUNvbG9yVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdGFiKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfRmxhdHRlbk1vdmllKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUZTU3BlYyB0aGVGaWxlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7Ci0Jc2hvcnQgcmVzSWQ7Ci0JU3RyMjU1IHJlc05hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbW92aWVGbGF0dGVuRmxhZ3M7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBzaG9ydCByZXNJZDsKKyAgICBTdHIyNTUgcmVzTmFtZTsKICNpZm5kZWYgRmxhdHRlbk1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soRmxhdHRlbk1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgcmVzTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUZsYXR0ZW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCi0JICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgcmVzTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIHJlc0lkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZPJmhsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCByZXNOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRmxhdHRlbk1vdmllKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgJnJlc0lkLAorICAgICAgICAgICAgICAgICByZXNOYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGEoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUZTU3BlYyB0aGVGaWxlOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKKyAgICBsb25nIG1vdmllRmxhdHRlbkZsYWdzOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIE9TVHlwZSBjcmVhdG9yOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7CiAjaWZuZGVmIEZsYXR0ZW5Nb3ZpZURhdGEKLQlQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWVEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGF0dGVuTW92aWVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXR0ZW5Nb3ZpZURhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJk8maGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVGbGF0dGVuRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXR0ZW5Nb3ZpZURhdGEoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYoTW92aWVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG1vdmllRmxhdHRlbkZsYWdzOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CisgICAgbG9uZyBtb3ZpZUZsYXR0ZW5GbGFnczsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKICNpZm5kZWYgRmxhdHRlbk1vdmllRGF0YVRvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKEZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmxhdHRlbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZUZsYXR0ZW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVB0ciB0ZXh0OwotCWxvbmcgc2l6ZTsKLQlsb25nIHNlYXJjaEZsYWdzOwotCVRyYWNrIHNlYXJjaFRyYWNrOwotCVRpbWVWYWx1ZSBzZWFyY2hUaW1lOwotCWxvbmcgc2VhcmNoT2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFB0ciB0ZXh0OworICAgIGxvbmcgc2l6ZTsKKyAgICBsb25nIHNlYXJjaEZsYWdzOworICAgIFRyYWNrIHNlYXJjaFRyYWNrOworICAgIFRpbWVWYWx1ZSBzZWFyY2hUaW1lOworICAgIGxvbmcgc2VhcmNoT2Zmc2V0OwogI2lmbmRlZiBNb3ZpZVNlYXJjaFRleHQKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZVNlYXJjaFRleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllU2VhcmNoVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBNb3ZpZVNlYXJjaFRleHQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAmc2VhcmNoVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hPZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgc2VhcmNoVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE1vdmllU2VhcmNoVGV4dChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWFyY2hUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlYXJjaE9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBzZWFyY2hUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaE9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0UG9zdGVyQm94KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IGJveFJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm94UmVjdDsKICNpZm5kZWYgR2V0UG9zdGVyQm94Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0UG9zdGVyQm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRQb3N0ZXJCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFBvc3RlckJveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAmYm94UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3hSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UG9zdGVyQm94KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJveFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1NldFBvc3RlckJveChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3hSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IGJveFJlY3Q7CiAjaWZuZGVmIFNldFBvc3RlckJveAotCVB5TWFjX1BSRUNIRUNLKFNldFBvc3RlckJveCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9zdGVyQm94KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJveFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRQb3N0ZXJCb3goX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgJmJveFJlY3QpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3hSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9zdGVyQm94KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICZib3hSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbihNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKLQlUaW1lVmFsdWUgdGltZTsKLQlUaW1lVmFsdWUgZHVyYXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJnbkhhbmRsZSBfcnY7CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUcmFjayBmaXJzdFByb2JsZW1UcmFjazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUcmFjayBmaXJzdFByb2JsZW1UcmFjazsKICNpZm5kZWYgR2V0TW92aWVTdGF0dXMKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZVN0YXR1cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE1vdmllU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgJmZpcnN0UHJvYmxlbVRyYWNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBmaXJzdFByb2JsZW1UcmFjayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldE1vdmllU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0UHJvYmxlbVRyYWNrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCBmaXJzdFByb2JsZW1UcmFjayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfTmV3TW92aWVDb250cm9sbGVyKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZUNvbnRyb2xsZXIgX3J2OwotCVJlY3QgbW92aWVSZWN0OwotCWxvbmcgc29tZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZUNvbnRyb2xsZXIgX3J2OworICAgIFJlY3QgbW92aWVSZWN0OworICAgIGxvbmcgc29tZUZsYWdzOwogI2lmbmRlZiBOZXdNb3ZpZUNvbnRyb2xsZXIKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUNvbnRyb2xsZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllQ29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmbW92aWVSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc29tZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTmV3TW92aWVDb250cm9sbGVyKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZUN0bE9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJm1vdmllUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvbWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllQ29udHJvbGxlcihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVDdGxPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKk1vdmllT2JqX1B1dE1vdmllT25TY3JhcChNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIG1vdmllU2NyYXBGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIG1vdmllU2NyYXBGbGFnczsKICNpZm5kZWYgUHV0TW92aWVPblNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soUHV0TW92aWVPblNjcmFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQdXRNb3ZpZU9uU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVNjcmFwRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUHV0TW92aWVPblNjcmFwKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVNjcmFwRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVTY3JhcEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFB1dE1vdmllT25TY3JhcChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVTY3JhcEZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9TZXRNb3ZpZVBsYXlIaW50cyhNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgU2V0TW92aWVQbGF5SGludHMKLQlQeU1hY19QUkVDSEVDSyhTZXRNb3ZpZVBsYXlIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0TW92aWVQbGF5SGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRNb3ZpZVBsYXlIaW50cyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0TW92aWVQbGF5SGludHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9HZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShNb3ZpZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlUaW1lVmFsdWUgdGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBUaW1lVmFsdWUgdGltZTsKICNpZm5kZWYgR2V0TWF4TG9hZGVkVGltZUluTW92aWUKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWF4TG9hZGVkVGltZUluTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNYXhMb2FkZWRUaW1lSW5Nb3ZpZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlKE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUJvb2xlYW4gbmVlZHNUaW1lVGFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQm9vbGVhbiBuZWVkc1RpbWVUYWJsZTsKICNpZm5kZWYgUVRNb3ZpZU5lZWRzVGltZVRhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soUVRNb3ZpZU5lZWRzVGltZVRhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVE1vdmllTmVlZHNUaW1lVGFibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVE1vdmllTmVlZHNUaW1lVGFibGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWVkc1RpbWVUYWJsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgbmVlZHNUaW1lVGFibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRNb3ZpZU5lZWRzVGltZVRhYmxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmVlZHNUaW1lVGFibGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzVGltZVRhYmxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpNb3ZpZU9ial9RVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KE1vdmllT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlsb25nIG9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgbG9uZyBvZmZzZXQ7CiAjaWZuZGVmIFFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldERhdGFSZWZNYXhGaWxlT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIE1vdmllT2JqX21ldGhvZHNbXSA9IHsKLQl7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVzVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAotCXsiUHJlcm9sbE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1ByZXJvbGxNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIEZpeGVkIFJhdGUpIC0+IE5vbmUiKX0sCi0JeyJBYm9ydFByZVByZXJvbGxNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BYm9ydFByZVByZXJvbGxNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAotCXsiTG9hZE1vdmllSW50b1JhbSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Mb2FkTW92aWVJbnRvUmFtLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVBY3RpdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IlN0YXJ0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU3RhcnRNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU3RvcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1N0b3BNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR29Ub0JlZ2lubmluZ09mTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR29Ub0JlZ2lubmluZ09mTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdvVG9FbmRPZk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dvVG9FbmRPZk1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJc01vdmllRG9uZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Jc01vdmllRG9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiR2V0TW92aWVQcmV2aWV3TW9kZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZXZpZXdNb2RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVByZXZpZXdNb2RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gdXNlUHJldmlldykgLT4gTm9uZSIpfSwKLQl7IlNob3dNb3ZpZVBvc3RlciIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IlNldE1vdmllTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVNYXN0ZXJUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZUJhc2UgdGIsIFRpbWVSZWNvcmQgc2xhdmVaZXJvKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVNYXN0ZXJDbG9jayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZU1hc3RlckNsb2NrLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnQgY2xvY2tNZWlzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKLQl7IkNob29zZU1vdmllQ2xvY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2hvb3NlTW92aWVDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllR1dvcmxkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAotCXsiU2V0TW92aWVHV29ybGQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBuYXR1cmFsQm91bmRzKSIpfSwKLQl7IkdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nLCAxLAotCSBQeURvY19TVFIoIihUcmFjayB0aGVUcmFjaykgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZywgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgdGhlVHJhY2spIC0+IChUcmFjayBfcnYpIil9LAotCXsiR2V0TW92aWVQaWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE1vdmllUG9zdGVyUGljdCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclBpY3QsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAotCXsiVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkludmFsaWRhdGVNb3ZpZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVCb3gsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm94UmVjdCkiKX0sCi0JeyJTZXRNb3ZpZUJveCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUJveCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEaXNwbGF5Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllRGlzcGxheUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDbGlwUmduLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNb3ZpZUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUJvdW5kc1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVZpZGVvT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVmlkZW9PdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgcHVibGljTW92aWUpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9EYXRhRm9yayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yaywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZlJlZk51bSwgbG9uZyBvZmZzZXQsIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IlB1dE1vdmllSW50b0RhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcms2NCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplKSAtPiBOb25lIil9LAotCXsiUHV0TW92aWVJbnRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IlB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIHB1YmxpY01vdmllKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDcmVhdGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKLQl7IlNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUR1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7IkdldE1vdmllUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJTZXRNb3ZpZVJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCByYXRlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVQcmVmZXJyZWRSYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNldE1vdmllUHJlZmVycmVkUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHJhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldE1vdmllUHJlZmVycmVkVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlNldE1vdmllVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJldmlld1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikiKX0sCi0JeyJTZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllUG9zdGVyVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAotCXsiU2V0TW92aWVQb3N0ZXJUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHBvc3RlclRpbWUpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikiKX0sCi0JeyJTZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikiKX0sCi0JeyJHZXRNb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lKSIpfSwKLQl7IlNldE1vdmllVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgbmV3dGltZSkgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllVGltZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgbmV3dGltZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKLQl7IkdldE1vdmllVHJhY2tDb3VudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrQ291bnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUcmFjaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyB0cmFja0lEKSAtPiAoVHJhY2sgX3J2KSIpfSwKLQl7IkdldE1vdmllSW5kVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVJbmRUcmFjaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJHZXRNb3ZpZUluZFRyYWNrVHlwZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgT1NUeXBlIHRyYWNrVHlwZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIF9ydikiKX0sCi0JeyJOZXdNb3ZpZVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllVHJhY2ssIDEsCi0JIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQsIHNob3J0IHRyYWNrVm9sdW1lKSAtPiAoVHJhY2sgX3J2KSIpfSwKLQl7IlNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGVuYWJsZSkgLT4gTm9uZSIpfSwKLQl7IlNlbGVjdE1vdmllQWx0ZXJuYXRlcyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZWxlY3RNb3ZpZUFsdGVybmF0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7Ikluc2VydE1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnNlcnRNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAotCXsiSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU2NhbGVNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiQ3V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ3V0TW92aWVTZWxlY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJDb3B5TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiUGFzdGVNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QYXN0ZU1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZSBzcmMpIC0+IE5vbmUiKX0sCi0JeyJBZGRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgc3JjKSAtPiBOb25lIil9LAotCXsiQ2xlYXJNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJQdXRNb3ZpZUludG9UeXBlZEhhbmRsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9UeXBlZEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHJhY2sgdGFyZ2V0VHJhY2ssIE9TVHlwZSBoYW5kbGVUeXBlLCBIYW5kbGUgcHVibGljTW92aWUsIFRpbWVWYWx1ZSBzdGFydCwgVGltZVZhbHVlIGR1ciwgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IE5vbmUiKX0sCi0JeyJDb3B5TW92aWVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUpIC0+IE5vbmUiKX0sCi0JeyJDb252ZXJ0TW92aWVUb0ZpbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29udmVydE1vdmllVG9GaWxlLCAxLAotCSBQeURvY19TVFIoIihUcmFjayBvbmx5VHJhY2ssIEZTU3BlYyBvdXRwdXRGaWxlLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IChzaG9ydCByZXNJRCkiKX0sCi0JeyJHZXRNb3ZpZURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGF0YVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1vdmllRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAotCXsiUHRJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B0SW5Nb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRNb3ZpZUxhbmd1YWdlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllTGFuZ3VhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCi0JeyJDb3B5TW92aWVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVVc2VyRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBzaG9ydCBudW1NZWRpYVR5cGVzLCBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKLQl7IkFkZE1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKLQl7IlVwZGF0ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgU3RyMjU1IHJlc05hbWUpIC0+IE5vbmUiKX0sCi0JeyJBZGRNb3ZpZVRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVRvU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJVcGRhdGVNb3ZpZUluU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJIYXNNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJDbGVhck1vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IlNldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNvbG9yVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY3RhYikgLT4gTm9uZSIpfSwKLQl7IkdldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgY3RhYikiKX0sCi0JeyJGbGF0dGVuTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllLCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vdmllRmxhdHRlbkZsYWdzLCBGU1NwZWMgdGhlRmlsZSwgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKLQl7IkZsYXR0ZW5Nb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZUZsYXR0ZW5GbGFncywgRlNTcGVjIHRoZUZpbGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbW92aWVGbGF0dGVuRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJNb3ZpZVNlYXJjaFRleHQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0LCAxLAotCSBQeURvY19TVFIoIihQdHIgdGV4dCwgbG9uZyBzaXplLCBsb25nIHNlYXJjaEZsYWdzKSAtPiAoVHJhY2sgc2VhcmNoVHJhY2ssIFRpbWVWYWx1ZSBzZWFyY2hUaW1lLCBsb25nIHNlYXJjaE9mZnNldCkiKX0sCi0JeyJHZXRQb3N0ZXJCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0UG9zdGVyQm94LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IGJveFJlY3QpIil9LAotCXsiU2V0UG9zdGVyQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldFBvc3RlckJveCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAotCSBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRNb3ZpZVN0YXR1cyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgZmlyc3RQcm9ibGVtVHJhY2spIil9LAotCXsiTmV3TW92aWVDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllQ29udHJvbGxlciwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoTW92aWVDb250cm9sbGVyIF9ydikiKX0sCi0JeyJQdXRNb3ZpZU9uU2NyYXAiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVPblNjcmFwLCAxLAotCSBQeURvY19TVFIoIihsb25nIG1vdmllU2NyYXBGbGFncykgLT4gTm9uZSIpfSwKLQl7IlNldE1vdmllUGxheUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUGxheUhpbnRzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gTm9uZSIpfSwKLQl7IkdldE1heExvYWRlZFRpbWVJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1heExvYWRlZFRpbWVJbk1vdmllLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgdGltZSkiKX0sCi0JeyJRVE1vdmllTmVlZHNUaW1lVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG5lZWRzVGltZVRhYmxlKSIpfSwKLQl7IlFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGRhdGFSZWZUeXBlLCBIYW5kbGUgZGF0YVJlZikgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVzVGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAorICAgIHsiUHJlcm9sbE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1ByZXJvbGxNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUsIEZpeGVkIFJhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJBYm9ydFByZVByZXJvbGxNb3ZpZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BYm9ydFByZVByZXJvbGxNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NFcnIgZXJyKSAtPiBOb25lIil9LAorICAgIHsiTG9hZE1vdmllSW50b1JhbSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Mb2FkTW92aWVJbnRvUmFtLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gYWN0aXZlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVBY3RpdmUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVBY3RpdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlN0YXJ0TW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU3RhcnRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU3RvcE1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1N0b3BNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR29Ub0JlZ2lubmluZ09mTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR29Ub0JlZ2lubmluZ09mTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdvVG9FbmRPZk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dvVG9FbmRPZk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJJc01vdmllRG9uZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Jc01vdmllRG9uZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiR2V0TW92aWVQcmV2aWV3TW9kZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZXZpZXdNb2RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVByZXZpZXdNb2RlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld01vZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gdXNlUHJldmlldykgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dNb3ZpZVBvc3RlciIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TaG93TW92aWVQb3N0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllTWFzdGVyVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVNYXN0ZXJUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZUJhc2UgdGIsIFRpbWVSZWNvcmQgc2xhdmVaZXJvKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVNYXN0ZXJDbG9jayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZU1hc3RlckNsb2NrLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnQgY2xvY2tNZWlzdGVyLCBUaW1lUmVjb3JkIHNsYXZlWmVybykgLT4gTm9uZSIpfSwKKyAgICB7IkNob29zZU1vdmllQ2xvY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ2hvb3NlTW92aWVDbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllR1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllR1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZGgpIil9LAorICAgIHsiU2V0TW92aWVHV29ybGQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkaCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllTmF0dXJhbEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVOYXR1cmFsQm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBuYXR1cmFsQm91bmRzKSIpfSwKKyAgICB7IkdldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE5leHRUcmFja0ZvckNvbXBvc2l0aW5nLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayB0aGVUcmFjaykgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRQcmV2VHJhY2tGb3JDb21wb3NpdGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgdGhlVHJhY2spIC0+IChUcmFjayBfcnYpIil9LAorICAgIHsiR2V0TW92aWVQaWN0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUGljdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHRpbWUpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllUG9zdGVyUGljdCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclBpY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFBpY0hhbmRsZSBfcnYpIil9LAorICAgIHsiVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkludmFsaWRhdGVNb3ZpZVJlZ2lvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnZhbGlkYXRlTW92aWVSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpbnZhbGlkUmduKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm94UmVjdCkiKX0sCisgICAgeyJTZXRNb3ZpZUJveCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUJveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEaXNwbGF5Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURpc3BsYXlDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllRGlzcGxheUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVEaXNwbGF5Q2xpcFJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHRoZUNsaXApIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZUNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllQ2xpcFJnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNsaXBSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSB0aGVDbGlwKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEaXNwbGF5Qm91bmRzUmduIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGlzcGxheUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUJvdW5kc1JnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVZpZGVvT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVmlkZW9PdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgcHVibGljTW92aWUpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9EYXRhRm9yayIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9EYXRhRm9yaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZlJlZk51bSwgbG9uZyBvZmZzZXQsIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlB1dE1vdmllSW50b0RhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVJbnRvRGF0YUZvcms2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplKSAtPiBOb25lIil9LAorICAgIHsiUHV0TW92aWVJbnRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9TdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSkgLT4gTm9uZSIpfSwKKyAgICB7IlB1dE1vdmllRm9yRGF0YVJlZkludG9IYW5kbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVGb3JEYXRhUmVmSW50b0hhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIHB1YmxpY01vdmllKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVDcmVhdGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVDcmVhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllTW9kaWZpY2F0aW9uVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU1vZGlmaWNhdGlvblRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHVuc2lnbmVkIGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lU2NhbGUgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lU2NhbGUgdGltZVNjYWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZVJhdGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2V0TW92aWVSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihGaXhlZCByYXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVQcmVmZXJyZWRSYXRlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJlZmVycmVkUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllUHJlZmVycmVkUmF0ZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVByZWZlcnJlZFJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHJhdGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVByZWZlcnJlZFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllUHJlZmVycmVkVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJlZmVycmVkVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVZvbHVtZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldE1vdmllVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2b2x1bWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllUHJldmlld1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikiKX0sCisgICAgeyJTZXRNb3ZpZVByZXZpZXdUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUHJldmlld1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBwcmV2aWV3VGltZSwgVGltZVZhbHVlIHByZXZpZXdEdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllUG9zdGVyVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVBvc3RlclRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBfcnYpIil9LAorICAgIHsiU2V0TW92aWVQb3N0ZXJUaW1lIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUG9zdGVyVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHBvc3RlclRpbWUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikiKX0sCisgICAgeyJTZXRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHNlbGVjdGlvblRpbWUsIFRpbWVWYWx1ZSBzZWxlY3Rpb25EdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUFjdGl2ZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikiKX0sCisgICAgeyJHZXRNb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUaW1lLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgX3J2LCBUaW1lUmVjb3JkIGN1cnJlbnRUaW1lKSIpfSwKKyAgICB7IlNldE1vdmllVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZVRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgbmV3dGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllVGltZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllVGltZVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgbmV3dGltZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllVXNlckRhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVHJhY2tDb3VudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVRyYWNrQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVUcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyB0cmFja0lEKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllSW5kVHJhY2siLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0TW92aWVJbmRUcmFjaywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCkgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZUluZFRyYWNrVHlwZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUluZFRyYWNrVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpbmRleCwgT1NUeXBlIHRyYWNrVHlwZSwgbG9uZyBmbGFncykgLT4gKFRyYWNrIF9ydikiKX0sCisgICAgeyJOZXdNb3ZpZVRyYWNrIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllVHJhY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQsIHNob3J0IHRyYWNrVm9sdW1lKSAtPiAoVHJhY2sgX3J2KSIpfSwKKyAgICB7IlNldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldEF1dG9UcmFja0FsdGVybmF0ZXNFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGVuYWJsZSkgLT4gTm9uZSIpfSwKKyAgICB7IlNlbGVjdE1vdmllQWx0ZXJuYXRlcyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZWxlY3RNb3ZpZUFsdGVybmF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydE1vdmllU2VnbWVudCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9JbnNlcnRNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllIGRzdE1vdmllLCBUaW1lVmFsdWUgc3JjSW4sIFRpbWVWYWx1ZSBzcmNEdXJhdGlvbiwgVGltZVZhbHVlIGRzdEluKSAtPiBOb25lIil9LAorICAgIHsiSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSW5zZXJ0RW1wdHlNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBkc3RJbiwgVGltZVZhbHVlIGRzdER1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlTW92aWVTZWdtZW50IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0RlbGV0ZU1vdmllU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiU2NhbGVNb3ZpZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfU2NhbGVNb3ZpZVNlZ21lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBvbGREdXJhdGlvbiwgVGltZVZhbHVlIG5ld0R1cmF0aW9uKSAtPiBOb25lIil9LAorICAgIHsiQ3V0TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ3V0TW92aWVTZWxlY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJDb3B5TW92aWVTZWxlY3Rpb24iLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29weU1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiUGFzdGVNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QYXN0ZU1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZSBzcmMpIC0+IE5vbmUiKX0sCisgICAgeyJBZGRNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVNlbGVjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgc3JjKSAtPiBOb25lIil9LAorICAgIHsiQ2xlYXJNb3ZpZVNlbGVjdGlvbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllU2VsZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJQdXRNb3ZpZUludG9UeXBlZEhhbmRsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9QdXRNb3ZpZUludG9UeXBlZEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHJhY2sgdGFyZ2V0VHJhY2ssIE9TVHlwZSBoYW5kbGVUeXBlLCBIYW5kbGUgcHVibGljTW92aWUsIFRpbWVWYWx1ZSBzdGFydCwgVGltZVZhbHVlIGR1ciwgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TW92aWVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUpIC0+IE5vbmUiKX0sCisgICAgeyJDb252ZXJ0TW92aWVUb0ZpbGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQ29udmVydE1vdmllVG9GaWxlLCAxLAorICAgICBQeURvY19TVFIoIihUcmFjayBvbmx5VHJhY2ssIEZTU3BlYyBvdXRwdXRGaWxlLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBmbGFncywgQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXApIC0+IChzaG9ydCByZXNJRCkiKX0sCisgICAgeyJHZXRNb3ZpZURhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1vdmllRGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IkdldE1vdmllRGF0YVNpemU2NCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURhdGFTaXplNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSBzdGFydFRpbWUsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKHdpZGUgZGF0YVNpemUpIil9LAorICAgIHsiUHRJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1B0SW5Nb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJTZXRNb3ZpZUxhbmd1YWdlIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllTGFuZ3VhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbGFuZ3VhZ2UpIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5TW92aWVVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9Db3B5TW92aWVVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWUgZHN0TW92aWUsIE9TVHlwZSBjb3B5UnVsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllTmV4dEludGVyZXN0aW5nVGltZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZU5leHRJbnRlcmVzdGluZ1RpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGludGVyZXN0aW5nVGltZUZsYWdzLCBzaG9ydCBudW1NZWRpYVR5cGVzLCBPU1R5cGUgd2hpY2hNZWRpYVR5cGVzLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKFRpbWVWYWx1ZSBpbnRlcmVzdGluZ1RpbWUsIFRpbWVWYWx1ZSBpbnRlcmVzdGluZ0R1cmF0aW9uKSIpfSwKKyAgICB7IkFkZE1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfQWRkTW92aWVSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKKyAgICB7IlVwZGF0ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfVXBkYXRlTW92aWVSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgU3RyMjU1IHJlc05hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJBZGRNb3ZpZVRvU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9BZGRNb3ZpZVRvU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCisgICAgeyJVcGRhdGVNb3ZpZUluU3RvcmFnZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9VcGRhdGVNb3ZpZUluU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCisgICAgeyJIYXNNb3ZpZUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfSGFzTW92aWVDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJDbGVhck1vdmllQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9DbGVhck1vdmllQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVEZWZhdWx0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZURlZmF1bHREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IlNldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9TZXRNb3ZpZUNvbG9yVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENUYWJIYW5kbGUgY3RhYikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllQ29sb3JUYWJsZSIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZUNvbG9yVGFibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKENUYWJIYW5kbGUgY3RhYikiKX0sCisgICAgeyJGbGF0dGVuTW92aWUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vdmllRmxhdHRlbkZsYWdzLCBGU1NwZWMgdGhlRmlsZSwgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBTdHIyNTUgcmVzTmFtZSkgLT4gKHNob3J0IHJlc0lkKSIpfSwKKyAgICB7IkZsYXR0ZW5Nb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfRmxhdHRlbk1vdmllRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtb3ZpZUZsYXR0ZW5GbGFncywgRlNTcGVjIHRoZUZpbGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJGbGF0dGVuTW92aWVEYXRhVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0ZsYXR0ZW5Nb3ZpZURhdGFUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbW92aWVGbGF0dGVuRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKE1vdmllIF9ydikiKX0sCisgICAgeyJNb3ZpZVNlYXJjaFRleHQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfTW92aWVTZWFyY2hUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihQdHIgdGV4dCwgbG9uZyBzaXplLCBsb25nIHNlYXJjaEZsYWdzKSAtPiAoVHJhY2sgc2VhcmNoVHJhY2ssIFRpbWVWYWx1ZSBzZWFyY2hUaW1lLCBsb25nIHNlYXJjaE9mZnNldCkiKX0sCisgICAgeyJHZXRQb3N0ZXJCb3giLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfR2V0UG9zdGVyQm94LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IGJveFJlY3QpIil9LAorICAgIHsiU2V0UG9zdGVyQm94IiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldFBvc3RlckJveCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBib3hSZWN0KSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVTZWdtZW50RGlzcGxheUJvdW5kc1JnbiIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVNlZ21lbnREaXNwbGF5Qm91bmRzUmduLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRNb3ZpZVN0YXR1cyIsIChQeUNGdW5jdGlvbilNb3ZpZU9ial9HZXRNb3ZpZVN0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVHJhY2sgZmlyc3RQcm9ibGVtVHJhY2spIil9LAorICAgIHsiTmV3TW92aWVDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX05ld01vdmllQ29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBtb3ZpZVJlY3QsIGxvbmcgc29tZUZsYWdzKSAtPiAoTW92aWVDb250cm9sbGVyIF9ydikiKX0sCisgICAgeyJQdXRNb3ZpZU9uU2NyYXAiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUHV0TW92aWVPblNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG1vdmllU2NyYXBGbGFncykgLT4gTm9uZSIpfSwKKyAgICB7IlNldE1vdmllUGxheUhpbnRzIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX1NldE1vdmllUGxheUhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1heExvYWRlZFRpbWVJbk1vdmllIiwgKFB5Q0Z1bmN0aW9uKU1vdmllT2JqX0dldE1heExvYWRlZFRpbWVJbk1vdmllLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChUaW1lVmFsdWUgdGltZSkiKX0sCisgICAgeyJRVE1vdmllTmVlZHNUaW1lVGFibGUiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRNb3ZpZU5lZWRzVGltZVRhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIG5lZWRzVGltZVRhYmxlKSIpfSwKKyAgICB7IlFUR2V0RGF0YVJlZk1heEZpbGVPZmZzZXQiLCAoUHlDRnVuY3Rpb24pTW92aWVPYmpfUVRHZXREYXRhUmVmTWF4RmlsZU9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGRhdGFSZWZUeXBlLCBIYW5kbGUgZGF0YVJlZikgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgTW92aWVPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03Mjg2LDYxICs3Mjg2LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqTW92aWVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCU1vdmllIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgTW92aWUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgTW92aWVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChNb3ZpZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBNb3ZpZU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKE1vdmllT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIE1vdmllT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IE1vdmllX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0Lk1vdmllIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoTW92aWVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBNb3ZpZU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBNb3ZpZU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgTW92aWVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIE1vdmllT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCU1vdmllT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCU1vdmllT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCU1vdmllT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlNb3ZpZU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlNb3ZpZU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCU1vdmllT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuTW92aWUiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihNb3ZpZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIE1vdmllT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIE1vdmllT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBNb3ZpZU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgTW92aWVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgTW92aWVPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgTW92aWVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgTW92aWVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIE1vdmllT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIE1vdmllT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgTW92aWVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBNb3ZpZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03MzUzLDQ3ICs3MzUzLDQ3IEBACiAjZGVmaW5lIFNHT3V0cHV0T2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlNHT3V0cHV0X1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNHT3V0cHV0X1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTR091dHB1dE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNHT3V0cHV0IG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU0dPdXRwdXQgb2JfaXRzZWxmOwogfSBTR091dHB1dE9iamVjdDsKIAogUHlPYmplY3QgKlNHT3V0cHV0T2JqX05ldyhTR091dHB1dCBpdHNlbGYpCiB7Ci0JU0dPdXRwdXRPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFNHT3V0cHV0IGZyb20gTlVMTCBwb2ludGVyIik7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICAgICAgICAgICAgICB9Ci0JaXQgPSBQeU9iamVjdF9ORVcoU0dPdXRwdXRPYmplY3QsICZTR091dHB1dF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgU0dPdXRwdXRPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlIFNHT3V0cHV0IGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoU0dPdXRwdXRPYmplY3QsICZTR091dHB1dF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBTR091dHB1dE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBTR091dHB1dCAqcF9pdHNlbGYpCiB7Ci0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlpZiAoIVNHT3V0cHV0T2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlNHT3V0cHV0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKFNHT3V0cHV0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQlyZXR1cm4gMTsKKyAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgIHsKKyAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghU0dPdXRwdXRPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU0dPdXRwdXQgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoU0dPdXRwdXRPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBTR091dHB1dE9ial9kZWFsbG9jKFNHT3V0cHV0T2JqZWN0ICpzZWxmKQogewotCS8qIENsZWFudXAgb2Ygc2VsZi0+b2JfaXRzZWxmIGdvZXMgaGVyZSAqLwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNHT3V0cHV0T2JqX21ldGhvZHNbXSA9IHsKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKICNkZWZpbmUgU0dPdXRwdXRPYmpfZ2V0c2V0bGlzdCBOVUxMCkBAIC03NDEwLDYxICs3NDEwLDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqU0dPdXRwdXRPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVNHT3V0cHV0IGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgU0dPdXRwdXQgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgU0dPdXRwdXRPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChTR091dHB1dE9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBTR091dHB1dE9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFNHT3V0cHV0T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFNHT3V0cHV0T2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFNHT3V0cHV0X1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1F0LlNHT3V0cHV0IiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoU0dPdXRwdXRPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBTR091dHB1dE9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBTR091dHB1dE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU0dPdXRwdXRPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFNHT3V0cHV0T2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVNHT3V0cHV0T2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVNHT3V0cHV0T2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVNHT3V0cHV0T2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlTR091dHB1dE9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlTR091dHB1dE9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVNHT3V0cHV0T2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUXQuU0dPdXRwdXQiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihTR091dHB1dE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFNHT3V0cHV0T2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFNHT3V0cHV0T2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBTR091dHB1dE9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgU0dPdXRwdXRPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgU0dPdXRwdXRPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgU0dPdXRwdXRPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgU0dPdXRwdXRPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFNHT3V0cHV0T2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFNHT3V0cHV0T2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgU0dPdXRwdXRPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFNHT3V0cHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NDcyLDIwNTI3ICs3NDcyLDIwNTI3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRW50ZXJNb3ZpZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIEVudGVyTW92aWVzCi0JUHlNYWNfUFJFQ0hFQ0soRW50ZXJNb3ZpZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEVudGVyTW92aWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW50ZXJNb3ZpZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVudGVyTW92aWVzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRXhpdE1vdmllcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBFeGl0TW92aWVzCi0JUHlNYWNfUFJFQ0hFQ0soRXhpdE1vdmllcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRXhpdE1vdmllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JRXhpdE1vdmllcygpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRXhpdE1vdmllcygpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRNb3ZpZXNFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKICNpZm5kZWYgR2V0TW92aWVzRXJyb3IKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZXNFcnJvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVzRXJyb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRNb3ZpZXNFcnJvcigpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVzRXJyb3IoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbGVhck1vdmllc1N0aWNreUVycm9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENsZWFyTW92aWVzU3RpY2t5RXJyb3IKLQlQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllc1N0aWNreUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGVhck1vdmllc1N0aWNreUVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDbGVhck1vdmllc1N0aWNreUVycm9yKCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDbGVhck1vdmllc1N0aWNreUVycm9yKCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldE1vdmllc1N0aWNreUVycm9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBHZXRNb3ZpZXNTdGlja3lFcnJvcgotCVB5TWFjX1BSRUNIRUNLKEdldE1vdmllc1N0aWNreUVycm9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZXNTdGlja3lFcnJvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE1vdmllc1N0aWNreUVycm9yKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRNb3ZpZXNTdGlja3lFcnJvcigpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0V2FsbENsb2NrVGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2U7CiAjaWZuZGVmIFFUR2V0V2FsbENsb2NrVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhRVEdldFdhbGxDbG9ja1RpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFdhbGxDbG9ja1RpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSgmd2FsbENsb2NrVGltZUJhc2UpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHdhbGxDbG9ja1RpbWVCYXNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0V2FsbENsb2NrVGltZUJhc2UoJndhbGxDbG9ja1RpbWVCYXNlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCB3YWxsQ2xvY2tUaW1lQmFzZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRJZGxlTWFuYWdlck9wZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUlkbGVNYW5hZ2VyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSWRsZU1hbmFnZXIgX3J2OwogI2lmbmRlZiBRVElkbGVNYW5hZ2VyT3BlbgotCVB5TWFjX1BSRUNIRUNLKFFUSWRsZU1hbmFnZXJPcGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVElkbGVNYW5hZ2VyT3Blbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRJZGxlTWFuYWdlck9wZW4oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRJZGxlTWFuYWdlck9wZW4oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIElkbGVNYW5hZ2VyT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DcmVhdGVNb3ZpZUNvbnRyb2woUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JV2luZG93UHRyIHRoZVdpbmRvdzsKLQlSZWN0IGxvY2FsUmVjdDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlVSW50MzIgb3B0aW9uczsKLQlDb250cm9sSGFuZGxlIHJldHVybmVkQ29udHJvbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OworICAgIFJlY3QgbG9jYWxSZWN0OworICAgIE1vdmllIHRoZU1vdmllOworICAgIFVJbnQzMiBvcHRpb25zOworICAgIENvbnRyb2xIYW5kbGUgcmV0dXJuZWRDb250cm9sOwogI2lmbmRlZiBDcmVhdGVNb3ZpZUNvbnRyb2wKLQlQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZUNvbnRyb2wpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZU1vdmllQ29udHJvbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZvcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZU1vdmllQ29udHJvbCh0aGVXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnJldHVybmVkQ29udHJvbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbG9jYWxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIEN0bE9ial9OZXcsIHJldHVybmVkQ29udHJvbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNb3ZpZUNvbnRyb2wodGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2FsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR1cm5lZENvbnRyb2wpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmxvY2FsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdGxPYmpfTmV3LCByZXR1cm5lZENvbnRyb2wpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0Rpc3Bvc2VNYXR0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGl4TWFwSGFuZGxlIHRoZU1hdHRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQaXhNYXBIYW5kbGUgdGhlTWF0dGU7CiAjaWZuZGVmIERpc3Bvc2VNYXR0ZQotCVB5TWFjX1BSRUNIRUNLKERpc3Bvc2VNYXR0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGlzcG9zZU1hdHRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCi0JCXJldHVybiBOVUxMOwotCURpc3Bvc2VNYXR0ZSh0aGVNYXR0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVNYXR0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERpc3Bvc2VNYXR0ZSh0aGVNYXR0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTW92aWUgX3J2OworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIE5ld01vdmllCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdNb3ZpZShmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllKGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFRpbWVVbnRpbE5leHRUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgZHVyYXRpb247Ci0JbG9uZyBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGR1cmF0aW9uOworICAgIGxvbmcgc2NhbGU7CiAjaWZuZGVmIFFUR2V0VGltZVVudGlsTmV4dFRhc2sKLQlQeU1hY19QUkVDSEVDSyhRVEdldFRpbWVVbnRpbE5leHRUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFRpbWVVbnRpbE5leHRUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRHZXRUaW1lVW50aWxOZXh0VGFzaygmZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0VGltZVVudGlsTmV4dFRhc2soJmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0RGF0YUhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudCBfcnY7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFIYW5kbGVyU3ViVHlwZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnQgX3J2OworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhSGFuZGxlclN1YlR5cGU7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR2V0RGF0YUhhbmRsZXIKLQlQeU1hY19QUkVDSEVDSyhHZXREYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0RGF0YUhhbmRsZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFIYW5kbGVyU3ViVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0RGF0YUhhbmRsZXIoZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhSGFuZGxlclN1YlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YUhhbmRsZXJTdWJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXREYXRhSGFuZGxlcihkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFIYW5kbGVyU3ViVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Bhc3RlSGFuZGxlSW50b01vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBoOwotCU9TVHlwZSBoYW5kbGVUeXBlOwotCU1vdmllIHRoZU1vdmllOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdXNlckNvbXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGg7CisgICAgT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgbG9uZyBmbGFnczsKKyAgICBDb21wb25lbnRJbnN0YW5jZSB1c2VyQ29tcDsKICNpZm5kZWYgUGFzdGVIYW5kbGVJbnRvTW92aWUKLQlQeU1hY19QUkVDSEVDSyhQYXN0ZUhhbmRsZUludG9Nb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFzdGVIYW5kbGVJbnRvTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUGFzdGVIYW5kbGVJbnRvTW92aWUoaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdXNlckNvbXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUGFzdGVIYW5kbGVJbnRvTW92aWUoaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyQ29tcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBkYXRhUmVmOwotCWxvbmcgZmxhZ3M7Ci0JQ29tcG9uZW50IGltcG9ydGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBsb25nIGZsYWdzOworICAgIENvbXBvbmVudCBpbXBvcnRlcjsKICNpZm5kZWYgR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRNb3ZpZUltcG9ydGVyRm9yRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBpbXBvcnRlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBpbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRNSU1FVHlwZUluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JY2hhciogbWltZVN0cmluZ1N0YXJ0OwotCXNob3J0IG1pbWVTdHJpbmdMZW5ndGg7Ci0JT1NUeXBlIGluZm9TZWxlY3RvcjsKLQl2b2lkICogaW5mb0RhdGFQdHI7Ci0JbG9uZyBpbmZvRGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgY2hhciogbWltZVN0cmluZ1N0YXJ0OworICAgIHNob3J0IG1pbWVTdHJpbmdMZW5ndGg7CisgICAgT1NUeXBlIGluZm9TZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb0RhdGFQdHI7CisgICAgbG9uZyBpbmZvRGF0YVNpemU7CiAjaWZuZGVmIFFUR2V0TUlNRVR5cGVJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soUVRHZXRNSU1FVHlwZUluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0TUlNRVR5cGVJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNoTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbWVTdHJpbmdTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbWVTdHJpbmdMZW5ndGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9TZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUR2V0TUlNRVR5cGVJbmZvKG1pbWVTdHJpbmdTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVN0cmluZ0xlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhU2l6ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzaE8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW1lU3RyaW5nU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW1lU3RyaW5nTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVEdldE1JTUVUeXBlSW5mbyhtaW1lU3RyaW5nU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVTdHJpbmdMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHJhY2tUaW1lVG9NZWRpYVRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVWYWx1ZSBfcnY7Ci0JVGltZVZhbHVlIHZhbHVlOwotCVRyYWNrIHRoZVRyYWNrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lVmFsdWUgX3J2OworICAgIFRpbWVWYWx1ZSB2YWx1ZTsKKyAgICBUcmFjayB0aGVUcmFjazsKICNpZm5kZWYgVHJhY2tUaW1lVG9NZWRpYVRpbWUKLQlQeU1hY19QUkVDSEVDSyhUcmFja1RpbWVUb01lZGlhVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhY2tUaW1lVG9NZWRpYVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcmFja1RpbWVUb01lZGlhVGltZSh2YWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUcmFjayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGhlVHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUcmFja1RpbWVUb01lZGlhVGltZSh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVUcmFjayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3VXNlckRhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JVXNlckRhdGEgdGhlVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgVXNlckRhdGEgdGhlVXNlckRhdGE7CiAjaWZuZGVmIE5ld1VzZXJEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTmV3VXNlckRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1VzZXJEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3VXNlckRhdGEoJnRoZVVzZXJEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB0aGVVc2VyRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdVc2VyRGF0YSgmdGhlVXNlckRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHRoZVVzZXJEYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdVc2VyRGF0YUZyb21IYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGg7Ci0JVXNlckRhdGEgdGhlVXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGg7CisgICAgVXNlckRhdGEgdGhlVXNlckRhdGE7CiAjaWZuZGVmIE5ld1VzZXJEYXRhRnJvbUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKE5ld1VzZXJEYXRhRnJvbUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3VXNlckRhdGFGcm9tSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld1VzZXJEYXRhRnJvbUhhbmRsZShoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVVzZXJEYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB0aGVVc2VyRGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3VXNlckRhdGFGcm9tSGFuZGxlKGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVXNlckRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHRoZVVzZXJEYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DcmVhdGVNb3ZpZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZpbGVTcGVjOwotCU9TVHlwZSBjcmVhdG9yOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOwotCWxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3M7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCU1vdmllIG5ld21vdmllOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmaWxlU3BlYzsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBNb3ZpZSBuZXdtb3ZpZTsKICNpZm5kZWYgQ3JlYXRlTW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVNb3ZpZUZpbGUoJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBuZXdtb3ZpZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVNb3ZpZUZpbGVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVNb3ZpZUZpbGUoJmZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1vdmllRmlsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBuZXdtb3ZpZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfT3Blbk1vdmllRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZmlsZVNwZWM7Ci0Jc2hvcnQgcmVzUmVmTnVtOwotCVNJbnQ4IHBlcm1pc3Npb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZpbGVTcGVjOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBTSW50OCBwZXJtaXNzaW9uOwogI2lmbmRlZiBPcGVuTW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gT3Blbk1vdmllRmlsZSgmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZXNSZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuTW92aWVGaWxlKCZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvc2VNb3ZpZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgcmVzUmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IHJlc1JlZk51bTsKICNpZm5kZWYgQ2xvc2VNb3ZpZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZU1vdmllRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VNb3ZpZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xvc2VNb3ZpZUZpbGUocmVzUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc1JlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZU1vdmllRmlsZShyZXNSZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RlbGV0ZU1vdmllRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1NwZWMgZmlsZVNwZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZpbGVTcGVjOwogI2lmbmRlZiBEZWxldGVNb3ZpZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEZWxldGVNb3ZpZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERlbGV0ZU1vdmllRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZpbGVTcGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZU1vdmllRmlsZSgmZmlsZVNwZWMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGVsZXRlTW92aWVGaWxlKCZmaWxlU3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgcmVzSWQ7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIHRoZU1vdmllOworICAgIHNob3J0IHJlc1JlZk51bTsKKyAgICBzaG9ydCByZXNJZDsKKyAgICBzaG9ydCBuZXdNb3ZpZUZsYWdzOworICAgIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CiAjaWZuZGVmIE5ld01vdmllRnJvbUZpbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3TW92aWVGcm9tRmlsZSgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nUHRyKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maGIiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSWQsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRmlsZSgmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nUHRyKTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbUhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlIYW5kbGUgaDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgSGFuZGxlIGg7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21IYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbUhhbmRsZSgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbUhhbmRsZSgmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdNb3ZpZUZyb21EYXRhRm9yayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBmUmVmTnVtOwotCWxvbmcgZmlsZU9mZnNldDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgZlJlZk51bTsKKyAgICBsb25nIGZpbGVPZmZzZXQ7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21EYXRhRm9yawotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZyb21EYXRhRm9yayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbURhdGFGb3JrKCZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRGF0YUZvcmsoJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tRGF0YUZvcms2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlsb25nIGZSZWZOdW07Ci0Jd2lkZSBmaWxlT2Zmc2V0OwotCXNob3J0IG5ld01vdmllRmxhZ3M7Ci0JQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBsb25nIGZSZWZOdW07CisgICAgd2lkZSBmaWxlT2Zmc2V0OworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKICNpZm5kZWYgTmV3TW92aWVGcm9tRGF0YUZvcms2NAotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbURhdGFGb3JrNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibE8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTmV3TW92aWVGcm9tRGF0YUZvcms2NCgmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmV2FzQ2hhbmdlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdNb3ZpZUZyb21EYXRhRm9yazY0KCZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZldhc0NoYW5nZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05ld01vdmllRnJvbURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JTW92aWUgbTsKLQlzaG9ydCBmbGFnczsKLQlzaG9ydCBpZDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZHRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSBtOworICAgIHNob3J0IGZsYWdzOworICAgIHNob3J0IGlkOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkdGFSZWZUeXBlOwogI2lmbmRlZiBOZXdNb3ZpZUZyb21EYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbURhdGFSZWYoJm0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIG0sCi0JICAgICAgICAgICAgICAgICAgICAgaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmR0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTmV3TW92aWVGcm9tRGF0YVJlZigmbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGFSZWZUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlEYXRhSGFuZGxlciBkaDsKLQl3aWRlIGZpbGVPZmZzZXQ7Ci0Jc2hvcnQgbmV3TW92aWVGbGFnczsKLQlCb29sZWFuIGRhdGFSZWZXYXNDYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZpbGVPZmZzZXQ7CisgICAgc2hvcnQgbmV3TW92aWVGbGFnczsKKyAgICBCb29sZWFuIGRhdGFSZWZXYXNDYXRhUmVmVHlwZTsKICNpZm5kZWYgTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldAotCVB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE5ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQoJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlIYW5kbGUgaDsKLQlzaG9ydCBuZXdNb3ZpZUZsYWdzOwotCUJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQ7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE1vdmllIHRoZU1vdmllOworICAgIEhhbmRsZSBoOworICAgIHNob3J0IG5ld01vdmllRmxhZ3M7CisgICAgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIE5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUoJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TW92aWVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZldhc0NoYW5nZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZXYXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBOZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlKCZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZXYXNDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmV2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUmVtb3ZlTW92aWVSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZXNSZWZOdW07Ci0Jc2hvcnQgcmVzSWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgcmVzUmVmTnVtOworICAgIHNob3J0IHJlc0lkOwogI2lmbmRlZiBSZW1vdmVNb3ZpZVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTW92aWVSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlTW92aWVSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVNb3ZpZVJlc291cmNlKHJlc1JlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNJZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzSWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlTW92aWVSZXNvdXJjZShyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NyZWF0ZU1vdmllU3RvcmFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7Ci0JbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKLQlEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcjsKLQlNb3ZpZSBuZXdtb3ZpZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcjsKKyAgICBNb3ZpZSBuZXdtb3ZpZTsKICNpZm5kZWYgQ3JlYXRlTW92aWVTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTW92aWVTdG9yYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVNb3ZpZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlTW92aWVGaWxlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ3JlYXRlTW92aWVTdG9yYWdlKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXREYXRhSGFuZGxlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdtb3ZpZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyLAotCSAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgbmV3bW92aWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTW92aWVGaWxlRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGF0YUhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3bW92aWUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBvdXREYXRhSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIG5ld21vdmllKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9PcGVuTW92aWVTdG9yYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIGZsYWdzOwotCURhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIGZsYWdzOworICAgIERhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyOwogI2lmbmRlZiBPcGVuTW92aWVTdG9yYWdlCi0JUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soT3Blbk1vdmllU3RvcmFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBPcGVuTW92aWVTdG9yYWdlKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dERhdGFIYW5kbGVyKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBPcGVuTW92aWVTdG9yYWdlKGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dERhdGFIYW5kbGVyKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIG91dERhdGFIYW5kbGVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9zZU1vdmllU3RvcmFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlEYXRhSGFuZGxlciBkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBEYXRhSGFuZGxlciBkaDsKICNpZm5kZWYgQ2xvc2VNb3ZpZVN0b3JhZ2UKLQlQeU1hY19QUkVDSEVDSyhDbG9zZU1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvc2VNb3ZpZVN0b3JhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9zZU1vdmllU3RvcmFnZShkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDbG9zZU1vdmllU3RvcmFnZShkaCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGVsZXRlTW92aWVTdG9yYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIERlbGV0ZU1vdmllU3RvcmFnZQotCVB5TWFjX1BSRUNIRUNLKERlbGV0ZU1vdmllU3RvcmFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGVsZXRlTW92aWVTdG9yYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlbGV0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IERlbGV0ZU1vdmllU3RvcmFnZShkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmaWxlU3BlYzsKLQlPU1R5cGUgY3JlYXRvcjsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKLQlsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzOwotCUhhbmRsZSB0YXJnZXREYXRhUmVmOwotCU9TVHlwZSB0YXJnZXREYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgZmlsZVNwZWM7CisgICAgT1NUeXBlIGNyZWF0b3I7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFnczsKKyAgICBIYW5kbGUgdGFyZ2V0RGF0YVJlZjsKKyAgICBPU1R5cGUgdGFyZ2V0RGF0YVJlZlR5cGU7CiAjaWZuZGVmIENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldERhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRhcmdldERhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKCZmaWxlU3BlYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZlR5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZU1vdmllRmlsZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRhcmdldERhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRhcmdldERhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVNob3J0Y3V0TW92aWVGaWxlKCZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVNb3ZpZUZpbGVGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YVJlZlR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NhblF1aWNrVGltZU9wZW5GaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUZTU3BlYyBmaWxlU3BlYzsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOwotCUJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOwotCUJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7Ci0JQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEZTU3BlYyBmaWxlU3BlYzsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOworICAgIEJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOworICAgIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7CisgICAgQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOworICAgIFVJbnQzMiBpbkZsYWdzOwogI2lmbmRlZiBDYW5RdWlja1RpbWVPcGVuRmlsZQotCVB5TWFjX1BSRUNIRUNLKENhblF1aWNrVGltZU9wZW5GaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYW5RdWlja1RpbWVPcGVuRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZmlsZVNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlTmFtZUV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2FuUXVpY2tUaW1lT3BlbkZpbGUoJmZpbGVTcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVFeHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDYW5PcGVuQXNNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENhbk9wZW5Bc01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmaWxlU3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVOYW1lRXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRmlsZSgmZmlsZVNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZUV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyOwotCUJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWU7Ci0JQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlcjsKKyAgICBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllOworICAgIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcjsKKyAgICBVSW50MzIgaW5GbGFnczsKICNpZm5kZWYgQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhDYW5RdWlja1RpbWVPcGVuRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRGF0YVJlZihkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDYW5RdWlja1RpbWVPcGVuRGF0YVJlZihkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENhbk9wZW5Bc01vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2FuT3BlbkFzTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTmV3TW92aWVGcm9tU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU1vdmllIF9ydjsKLQlsb25nIG5ld01vdmllRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE1vdmllIF9ydjsKKyAgICBsb25nIG5ld01vdmllRmxhZ3M7CiAjaWZuZGVmIE5ld01vdmllRnJvbVNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soTmV3TW92aWVGcm9tU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld01vdmllRnJvbVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld01vdmllRnJvbVNjcmFwKG5ld01vdmllRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3TW92aWVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld01vdmllRnJvbVNjcmFwKG5ld01vdmllRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUTmV3QWxpYXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIGZzczsKLQlBbGlhc0hhbmRsZSBhbGlhczsKLQlCb29sZWFuIG1pbmltYWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIGZzczsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBCb29sZWFuIG1pbmltYWw7CiAjaWZuZGVmIFFUTmV3QWxpYXMKLQlQeU1hY19QUkVDSEVDSyhRVE5ld0FsaWFzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVE5ld0FsaWFzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbmltYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVROZXdBbGlhcygmZnNzLAotCSAgICAgICAgICAgICAgICAgICZhbGlhcywKLQkgICAgICAgICAgICAgICAgICBtaW5pbWFsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbmltYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVROZXdBbGlhcygmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICZhbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICBtaW5pbWFsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0VuZEZ1bGxTY3JlZW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUHRyIGZ1bGxTdGF0ZTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFB0ciBmdWxsU3RhdGU7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgRW5kRnVsbFNjcmVlbgotCVB5TWFjX1BSRUNIRUNLKEVuZEZ1bGxTY3JlZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEVuZEZ1bGxTY3JlZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic2wiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnVsbFN0YXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRW5kRnVsbFNjcmVlbihmdWxsU3RhdGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVuZEZ1bGxTY3JlZW4oZnVsbFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9BZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlIYW5kbGUgZXh0ZW5zaW9uOwotCU9TVHlwZSBpZFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgT1NUeXBlIGlkVHlwZTsKICNpZm5kZWYgQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCUhhbmRsZSBleHRlbnNpb247Ci0JT1NUeXBlIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgSGFuZGxlIGV4dGVuc2lvbjsKKyAgICBPU1R5cGUgaWRUeXBlOwogI2lmbmRlZiBHZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZXh0ZW5zaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZXh0ZW5zaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9SZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlPU1R5cGUgaWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgaWRUeXBlOwogI2lmbmRlZiBSZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUV2ZW50UmVjb3JkIHBFdmVudDsKLQlRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEV2ZW50UmVjb3JkIHBFdmVudDsKKyAgICBRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwogI2lmbmRlZiBRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudAotCVB5TWFjX1BSRUNIRUNLKFFUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRJc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRXZlbnQoJnBFdmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZERpYWxvZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZwRXZlbnQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpYWxvZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCgmcEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkRGlhbG9nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnBFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwogI2lmbmRlZiBRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZwotCVB5TWFjX1BSRUNIRUNLKFFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2cpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVREaXNtaXNzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2coY3JlYXRlZERpYWxvZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdGVkRGlhbG9nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nKGNyZWF0ZWREaWFsb2cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nOwotCWxvbmcgYWN0aW9uOwotCXZvaWQgKiBwYXJhbXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZzsKKyAgICBsb25nIGFjdGlvbjsKKyAgICB2b2lkICogcGFyYW1zOwogI2lmbmRlZiBRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRlZERpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24oY3JlYXRlZERpYWxvZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyZWF0ZWREaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uKGNyZWF0ZWREaWFsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUUmVnaXN0ZXJBY2Nlc3NLZXkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU3RyMjU1IGFjY2Vzc0tleVR5cGU7Ci0JbG9uZyBmbGFnczsKLQlIYW5kbGUgYWNjZXNzS2V5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFN0cjI1NSBhY2Nlc3NLZXlUeXBlOworICAgIGxvbmcgZmxhZ3M7CisgICAgSGFuZGxlIGFjY2Vzc0tleTsKICNpZm5kZWYgUVRSZWdpc3RlckFjY2Vzc0tleQotCVB5TWFjX1BSRUNIRUNLKFFUUmVnaXN0ZXJBY2Nlc3NLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUUmVnaXN0ZXJBY2Nlc3NLZXkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGFjY2Vzc0tleVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhY2Nlc3NLZXkpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUVRSZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0tleSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGFjY2Vzc0tleVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhY2Nlc3NLZXkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRSZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc0tleSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRVbnJlZ2lzdGVyQWNjZXNzS2V5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVN0cjI1NSBhY2Nlc3NLZXlUeXBlOwotCWxvbmcgZmxhZ3M7Ci0JSGFuZGxlIGFjY2Vzc0tleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgYWNjZXNzS2V5VHlwZTsKKyAgICBsb25nIGZsYWdzOworICAgIEhhbmRsZSBhY2Nlc3NLZXk7CiAjaWZuZGVmIFFUVW5yZWdpc3RlckFjY2Vzc0tleQotCVB5TWFjX1BSRUNIRUNLKFFUVW5yZWdpc3RlckFjY2Vzc0tleSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRVbnJlZ2lzdGVyQWNjZXNzS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWNjZXNzS2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUVW5yZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NLZXkpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWNjZXNzS2V5KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUVW5yZWdpc3RlckFjY2Vzc0tleShhY2Nlc3NLZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NLZXkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3M7Ci0JVUludDMyIG91dFJlc3RyaWN0aW9uSURzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3M7CisgICAgVUludDMyIG91dFJlc3RyaWN0aW9uSURzOwogI2lmbmRlZiBRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucwotCVB5TWFjX1BSRUNIRUNLKFFUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluUmVzdHJpY3Rpb25DbGFzcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyhpblJlc3RyaWN0aW9uQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRSZXN0cmljdGlvbklEcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0UmVzdHJpY3Rpb25JRHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5SZXN0cmljdGlvbkNsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUR2V0U3VwcG9ydGVkUmVzdHJpY3Rpb25zKGluUmVzdHJpY3Rpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFJlc3RyaWN0aW9uSURzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRSZXN0cmljdGlvbklEcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRUZXh0VG9OYXRpdmVUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUhhbmRsZSB0aGVUZXh0OwotCWxvbmcgZW5jb2Rpbmc7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBIYW5kbGUgdGhlVGV4dDsKKyAgICBsb25nIGVuY29kaW5nOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFFUVGV4dFRvTmF0aXZlVGV4dAotCVB5TWFjX1BSRUNIRUNLKFFUVGV4dFRvTmF0aXZlVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRUZXh0VG9OYXRpdmVUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZVRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUVGV4dFRvTmF0aXZlVGV4dCh0aGVUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRUZXh0VG9OYXRpdmVUZXh0KHRoZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIFZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MKLQlQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcyhtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MKLQlQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhR2V0U3RhdGlzdGljcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZpZGVvTWVkaWFHZXRTdGFsbENvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl1bnNpZ25lZCBsb25nIHN0YWxsczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdW5zaWduZWQgbG9uZyBzdGFsbHM7CiAjaWZuZGVmIFZpZGVvTWVkaWFHZXRTdGFsbENvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldFN0YWxsQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRTdGFsbENvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhR2V0U3RhbGxDb3VudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbGxzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzdGFsbHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWaWRlb01lZGlhR2V0U3RhbGxDb3VudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbGxzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFsbHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29kZWNUeXBlIGNUeXBlOwotCU9TVHlwZSBwYXJhbWV0ZXJJRDsKLQlsb25nIHBhcmFtZXRlckNoYW5nZVNlZWQ7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JbG9uZyBkYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIE9TVHlwZSBwYXJhbWV0ZXJJRDsKKyAgICBsb25nIHBhcmFtZXRlckNoYW5nZVNlZWQ7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyCi0JUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtZXRlckNoYW5nZVNlZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQ2hhbmdlU2VlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbWV0ZXJDaGFuZ2VTZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckNoYW5nZVNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlPU1R5cGUgcGFyYW1ldGVySUQ7Ci0JSGFuZGxlIG91dFBhcmFtZXRlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBPU1R5cGUgcGFyYW1ldGVySUQ7CisgICAgSGFuZGxlIG91dFBhcmFtZXRlckRhdGE7CiAjaWZuZGVmIFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcgotCVB5TWFjX1BSRUNIRUNLKFZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQYXJhbWV0ZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcmFtZXRlckRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwYXJhbWV0ZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQYXJhbWV0ZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFBhcmFtZXRlckRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYUFkZFRleHRTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0ZXh0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlzaG9ydCBmb250TnVtYmVyOwotCXNob3J0IGZvbnRTaXplOwotCVN0eWxlIHRleHRGYWNlOwotCVJHQkNvbG9yIHRleHRDb2xvcjsKLQlSR0JDb2xvciBiYWNrQ29sb3I7Ci0Jc2hvcnQgdGV4dEp1c3RpZmljYXRpb247Ci0JUmVjdCB0ZXh0Qm94OwotCWxvbmcgZGlzcGxheUZsYWdzOwotCVRpbWVWYWx1ZSBzY3JvbGxEZWxheTsKLQlzaG9ydCBoaWxpdGVTdGFydDsKLQlzaG9ydCBoaWxpdGVFbmQ7Ci0JUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGV4dDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CisgICAgc2hvcnQgZm9udE51bWJlcjsKKyAgICBzaG9ydCBmb250U2l6ZTsKKyAgICBTdHlsZSB0ZXh0RmFjZTsKKyAgICBSR0JDb2xvciB0ZXh0Q29sb3I7CisgICAgUkdCQ29sb3IgYmFja0NvbG9yOworICAgIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uOworICAgIFJlY3QgdGV4dEJveDsKKyAgICBsb25nIGRpc3BsYXlGbGFnczsKKyAgICBUaW1lVmFsdWUgc2Nyb2xsRGVsYXk7CisgICAgc2hvcnQgaGlsaXRlU3RhcnQ7CisgICAgc2hvcnQgaGlsaXRlRW5kOworICAgIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKICNpZm5kZWYgVGV4dE1lZGlhQWRkVGV4dFNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZFRleHRTYW1wbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZFRleHRTYW1wbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhoYmhsbGhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RmFjZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkVGV4dFNhbXBsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZhY2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dENvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZ0ZXh0Q29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhoYmhsbGhobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0RmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhQWRkVGV4dFNhbXBsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhY2tDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZ0ZXh0Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmYmFja0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnRleHRCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhQWRkVEVTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRFSGFuZGxlIGhURTsKLQlSR0JDb2xvciBiYWNrQ29sb3I7Ci0Jc2hvcnQgdGV4dEp1c3RpZmljYXRpb247Ci0JUmVjdCB0ZXh0Qm94OwotCWxvbmcgZGlzcGxheUZsYWdzOwotCVRpbWVWYWx1ZSBzY3JvbGxEZWxheTsKLQlzaG9ydCBoaWxpdGVTdGFydDsKLQlzaG9ydCBoaWxpdGVFbmQ7Ci0JUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVWYWx1ZSBzYW1wbGVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBURUhhbmRsZSBoVEU7CisgICAgUkdCQ29sb3IgYmFja0NvbG9yOworICAgIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uOworICAgIFJlY3QgdGV4dEJveDsKKyAgICBsb25nIGRpc3BsYXlGbGFnczsKKyAgICBUaW1lVmFsdWUgc2Nyb2xsRGVsYXk7CisgICAgc2hvcnQgaGlsaXRlU3RhcnQ7CisgICAgc2hvcnQgaGlsaXRlRW5kOworICAgIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKICNpZm5kZWYgVGV4dE1lZGlhQWRkVEVTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFBZGRURVNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhQWRkVEVTYW1wbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsbGhobCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmhURSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRleHRKdXN0aWZpY2F0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsRGVsYXksCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkVEVTYW1wbGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRFLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWNrQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dEp1c3RpZmljYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRCb3gsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbERlbGF5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmJhY2tDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXh0Qm94LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnJnYkhpbGl0ZUNvbG9yLAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobGxoaGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SnVzdGlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcm9sbERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUFkZFRFU2FtcGxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFja0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRKdXN0aWZpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0Qm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZiYWNrQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGV4dEJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZyZ2JIaWxpdGVDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGhpbGl0ZVN0YXJ0OwotCXNob3J0IGhpbGl0ZUVuZDsKLQlSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKLQlUaW1lVmFsdWUgZHVyYXRpb247Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGhpbGl0ZVN0YXJ0OworICAgIHNob3J0IGhpbGl0ZUVuZDsKKyAgICBSR0JDb2xvciByZ2JIaWxpdGVDb2xvcjsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgVGltZVZhbHVlIHNhbXBsZVRpbWU7CiAjaWZuZGVmIFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbGl0ZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWxpdGVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmdiSGlsaXRlQ29sb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlVGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZyZ2JIaWxpdGVDb2xvciwKLQkgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhRHJhd1JhdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JR1dvcmxkUHRyIGd3OwotCUdESGFuZGxlIGdkOwotCXZvaWQgKiBkYXRhOwotCWxvbmcgZGF0YVNpemU7Ci0JVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgR1dvcmxkUHRyIGd3OworICAgIEdESGFuZGxlIGdkOworICAgIHZvaWQgKiBkYXRhOworICAgIGxvbmcgZGF0YVNpemU7CisgICAgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKICNpZm5kZWYgVGV4dE1lZGlhRHJhd1JhdwotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYURyYXdSYXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYURyYXdSYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mc2xPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBHV29ybGRPYmpfQ29udmVydCwgJmd3LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYURyYXdSYXcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICBndywKLQkgICAgICAgICAgICAgICAgICAgICAgIGdkLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgdGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZzbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhRHJhd1JhdyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVNldFRleHRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVZhbHVlIGF0TWVkaWFUaW1lOwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBkYXRhOwotCWxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogZGF0YTsKKyAgICBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVNldFRleHRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVNldFRleHRQcm9wZXJ0eShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRNZWRpYVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVJhd1NldHVwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlHV29ybGRQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0Jdm9pZCAqIGRhdGE7Ci0JbG9uZyBkYXRhU2l6ZTsKLQlUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoOwotCVRpbWVWYWx1ZSBzYW1wbGVEdXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgR1dvcmxkUHRyIGd3OworICAgIEdESGFuZGxlIGdkOworICAgIHZvaWQgKiBkYXRhOworICAgIGxvbmcgZGF0YVNpemU7CisgICAgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb247CiAjaWZuZGVmIFRleHRNZWRpYVJhd1NldHVwCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhUmF3U2V0dXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd1NldHVwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnNsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFSYXdTZXR1cChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBndywKLQkgICAgICAgICAgICAgICAgICAgICAgICBnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mc2xPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVJhd1NldHVwKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFSYXdJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlHV29ybGRQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0JbG9uZyBmbGFnc0luOwotCWxvbmcgZmxhZ3NPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEdXb3JsZFB0ciBndzsKKyAgICBHREhhbmRsZSBnZDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBsb25nIGZsYWdzSW47CisgICAgbG9uZyBmbGFnc091dDsKICNpZm5kZWYgVGV4dE1lZGlhUmF3SWRsZQotCVB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRleHRNZWRpYVJhd0lkbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZndywKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc0luKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhUmF3SWRsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGd3LAotCSAgICAgICAgICAgICAgICAgICAgICAgZ2QsCi0JICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZmbGFnc091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3NPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYVJhd0lkbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogZGF0YTsKLQlsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgYXRNZWRpYVRpbWU7CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIGRhdGE7CisgICAgbG9uZyBkYXRhU2l6ZTsKICNpZm5kZWYgVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdE1lZGlhVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUdldFRleHRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRNZWRpYVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRNZWRpYVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0TWVkaWFGaW5kTmV4dFRleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0ZXh0OwotCWxvbmcgc2l6ZTsKLQlzaG9ydCBmaW5kRmxhZ3M7Ci0JVGltZVZhbHVlIHN0YXJ0VGltZTsKLQlUaW1lVmFsdWUgZm91bmRUaW1lOwotCVRpbWVWYWx1ZSBmb3VuZER1cmF0aW9uOwotCWxvbmcgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGV4dDsKKyAgICBsb25nIHNpemU7CisgICAgc2hvcnQgZmluZEZsYWdzOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGZvdW5kVGltZTsKKyAgICBUaW1lVmFsdWUgZm91bmREdXJhdGlvbjsKKyAgICBsb25nIG9mZnNldDsKICNpZm5kZWYgVGV4dE1lZGlhRmluZE5leHRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhRmluZE5leHRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFGaW5kTmV4dFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZpbmRGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRNZWRpYUZpbmROZXh0VGV4dChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICBmb3VuZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGhsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRNZWRpYUZpbmROZXh0VGV4dChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3VuZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVZhbHVlIHNhbXBsZVRpbWU7Ci0Jc2hvcnQgaGlsaXRlU3RhcnQ7Ci0Jc2hvcnQgaGlsaXRlRW5kOwotCVJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgc2FtcGxlVGltZTsKKyAgICBzaG9ydCBoaWxpdGVTdGFydDsKKyAgICBzaG9ydCBoaWxpdGVFbmQ7CisgICAgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3I7CiAjaWZuZGVmIFRleHRNZWRpYUhpbGl0ZVRleHRTYW1wbGUKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWxpdGVFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlsaXRlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJnYkhpbGl0ZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmcmdiSGlsaXRlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRNZWRpYVNldFRleHRTYW1wbGVEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogZGF0YTsKLQlPU1R5cGUgZGF0YVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHZvaWQgKiBkYXRhOworICAgIE9TVHlwZSBkYXRhVHlwZTsKICNpZm5kZWYgVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEKLQlQeU1hY19QUkVDSEVDSyhUZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgc3ByaXRlSW5kZXg7Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IHNwcml0ZUluZGV4OworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0UHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHNwcml0ZUluZGV4OwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBzcHJpdGVJbmRleDsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0UHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0UHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZobHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlzaG9ydCBzcHJpdGVIaXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgc2hvcnQgc3ByaXRlSGl0SW5kZXg7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSGl0SW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUhpdEluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUhpdEluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVIaXRJbmRleCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IG51bVNwcml0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IG51bVNwcml0ZXM7CiAjaWZuZGVmIFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUNvdW50U3ByaXRlcyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtU3ByaXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtU3ByaXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhQ291bnRTcHJpdGVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1TcHJpdGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1TcHJpdGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUNvdW50SW1hZ2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBudW1JbWFnZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IG51bUltYWdlczsKICNpZm5kZWYgU3ByaXRlTWVkaWFDb3VudEltYWdlcwotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRJbWFnZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhQ291bnRJbWFnZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhQ291bnRJbWFnZXMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtSW1hZ2VzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBudW1JbWFnZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUNvdW50SW1hZ2VzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bUltYWdlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSW1hZ2VzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGltYWdlSW5kZXg7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBpbWFnZURlc2NyaXB0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaW1hZ2VEZXNjcmlwdGlvbjsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VEZXNjcmlwdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEZXNjcmlwdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW1hZ2VEZXNjcmlwdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VEZXNjcmlwdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgc2FtcGxlTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHNhbXBsZU51bTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldERpc3BsYXllZFNhbXBsZU51bWJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKLQlTdHIyNTUgc3ByaXRlTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgU3RyMjU1IHNwcml0ZU5hbWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzcHJpdGVOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlTmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNwcml0ZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVOYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUdldEltYWdlTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgaW1hZ2VJbmRleDsKLQlTdHIyNTUgaW1hZ2VOYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OworICAgIFN0cjI1NSBpbWFnZU5hbWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIGltYWdlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBpbWFnZU5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldEltYWdlTmFtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlTmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgc3ByaXRlSUQ7Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHNwcml0ZUlEOworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOwotCWxvbmcgcHJvcGVydHlUeXBlOwotCXZvaWQgKiBwcm9wZXJ0eVZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBsb25nIHByb3BlcnR5VHlwZTsKKyAgICB2b2lkICogcHJvcGVydHlWYWx1ZTsKICNpZm5kZWYgU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb3BlcnR5VmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlRVEF0b21JRCBzcHJpdGVIaXRJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgUVRBdG9tSUQgc3ByaXRlSGl0SUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSGl0SUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUhpdElEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUhpdElEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVIaXRJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKLQlsb25nIGZsYWdzOwotCVBvaW50IGxvYzsKLQlCb29sZWFuIHdhc0hpdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CisgICAgbG9uZyBmbGFnczsKKyAgICBQb2ludCBsb2M7CisgICAgQm9vbGVhbiB3YXNIaXQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZsb2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBzcHJpdGVJbmRleDsKLQlRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgc3ByaXRlSW5kZXg7CisgICAgUVRBdG9tSUQgc3ByaXRlSUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lECi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU3ByaXRlSW5kZXhUb0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwcml0ZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOwotCXNob3J0IHNwcml0ZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKKyAgICBzaG9ydCBzcHJpdGVJbmRleDsKICNpZm5kZWYgU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTcHJpdGVJRFRvSW5kZXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpdGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCB2YXJpYWJsZUlEOwotCWZsb2F0IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCB2YXJpYWJsZUlEOworICAgIGZsb2F0IHZhbHVlOwogI2lmbmRlZiBTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxmIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHZhcmlhYmxlSUQ7Ci0JZmxvYXQgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHZhcmlhYmxlSUQ7CisgICAgZmxvYXQgdmFsdWU7CiAjaWZuZGVmIFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHNwcml0ZUlEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBzcHJpdGVJRDsKICNpZm5kZWYgU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlCi0JUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcHJpdGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ByaXRlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcml0ZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVFUQXRvbUlEIHZhcmlhYmxlSUQ7Ci0JUHRyIHRoZUNTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFUQXRvbUlEIHZhcmlhYmxlSUQ7CisgICAgUHRyIHRoZUNTdHJpbmc7CiAjaWZuZGVmIFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZwotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVDU3RyaW5nKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ1N0cmluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlQ1N0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEF0b21JRCB2YXJpYWJsZUlEOwotCUhhbmRsZSB0aGVDU3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCB2YXJpYWJsZUlEOworICAgIEhhbmRsZSB0aGVDU3RyaW5nOwogI2lmbmRlZiBTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlQ1N0cmluZyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZUlEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ1N0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhTmV3SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlRVEF0b21JRCBkZXNpcmVkSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBRVEF0b21JRCBkZXNpcmVkSUQ7CiAjaWZuZGVmIFNwcml0ZU1lZGlhTmV3SW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYU5ld0ltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYU5ld0ltYWdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlc2lyZWRJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhTmV3SW1hZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2lyZWRJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhTmV3SW1hZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1Nwcml0ZU1lZGlhRGlzcG9zZUltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBpbWFnZUluZGV4OwogI2lmbmRlZiBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZQotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhRGlzcG9zZUltYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBpbWFnZUluZGV4OwotCVFUQXRvbUlEIGltYWdlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGltYWdlSW5kZXg7CisgICAgUVRBdG9tSUQgaW1hZ2VJRDsKICNpZm5kZWYgU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRAotCVB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRBdG9tSUQgaW1hZ2VJRDsKLQlzaG9ydCBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBRVEF0b21JRCBpbWFnZUlEOworICAgIHNob3J0IGltYWdlSW5kZXg7CiAjaWZuZGVmIFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRQYW4oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHhQZXJjZW50OwotCXNob3J0IHlQZXJjZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCB4UGVyY2VudDsKKyAgICBzaG9ydCB5UGVyY2VudDsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFBhbgotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRQYW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRQYW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmeFBlcmNlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ5UGVyY2VudCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFTZXRQYW4obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICB4UGVyY2VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHlQZXJjZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ4UGVyY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnlQZXJjZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldFBhbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhQZXJjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeVBlcmNlbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRab29tKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBmYWN0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGZhY3RvcjsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFpvb20KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0Wm9vbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldFpvb20pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmYWN0b3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldFpvb20obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhU2V0Wm9vbVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgbGVmdDsKLQlsb25nIHRvcDsKLQlsb25nIHJpZ2h0OwotCWxvbmcgYm90dG9tOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGxlZnQ7CisgICAgbG9uZyB0b3A7CisgICAgbG9uZyByaWdodDsKKyAgICBsb25nIGJvdHRvbTsKICNpZm5kZWYgRmxhc2hNZWRpYVNldFpvb21SZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldFpvb21SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhU2V0Wm9vbVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdG9wLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbVJlY3QobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhU2V0Wm9vbVJlY3QobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb247Ci0JbG9uZyBsZWZ0OwotCWxvbmcgdG9wOwotCWxvbmcgcmlnaHQ7Ci0JbG9uZyBib3R0b207CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgcmVmQ29uOworICAgIGxvbmcgbGVmdDsKKyAgICBsb25nIHRvcDsKKyAgICBsb25nIHJpZ2h0OworICAgIGxvbmcgYm90dG9tOwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3AsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmlnaHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm90dG9tKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBsZWZ0LAotCSAgICAgICAgICAgICAgICAgICAgIHRvcCwKLQkgICAgICAgICAgICAgICAgICAgICByaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICBib3R0b20pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b20pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldFJlZkNvbklEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHJlZkNvbjsKLQlsb25nIHJlZkNvbklEOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIHJlZkNvbjsKKyAgICBsb25nIHJlZkNvbklEOwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0UmVmQ29uSUQKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0UmVmQ29uSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRSZWZDb25JRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25JRChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklEKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFHZXRSZWZDb25JRChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhSURUb1JlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb25JRDsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyByZWZDb25JRDsKKyAgICBsb25nIHJlZkNvbjsKICNpZm5kZWYgRmxhc2hNZWRpYUlEVG9SZWZDb24KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhSURUb1JlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUlEVG9SZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb25JRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFJRFRvUmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb25JRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFJRFRvUmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYXNoRnJhbWVOdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhc2hGcmFtZU51bWJlcjsKICNpZm5kZWYgRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXNoRnJhbWVOdW1iZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYXNoRnJhbWVOdW1iZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFzaEZyYW1lTnVtYmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFzaEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFzaEZyYW1lTnVtYmVyOwotCVRpbWVWYWx1ZSBtb3ZpZVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhc2hGcmFtZU51bWJlcjsKKyAgICBUaW1lVmFsdWUgbW92aWVUaW1lOwogI2lmbmRlZiBGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXNoRnJhbWVOdW1iZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFzaEZyYW1lTnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFzaEZyYW1lTnVtYmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUZyYW1lTnVtYmVyVG9Nb3ZpZVRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVB0ciB0aGVMYWJlbDsKLQlUaW1lVmFsdWUgbW92aWVUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBQdHIgdGhlTGFiZWw7CisgICAgVGltZVZhbHVlIG1vdmllVGltZTsKICNpZm5kZWYgRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMYWJlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWNoYXIgcGF0aDsKLQljaGFyIG5hbWU7Ci0JSGFuZGxlIHRoZVZhcmlhYmxlQ1N0cmluZ091dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBwYXRoOworICAgIGNoYXIgbmFtZTsKKyAgICBIYW5kbGUgdGhlVmFyaWFibGVDU3RyaW5nT3V0OwogI2lmbmRlZiBGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZQotCVB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVZhcmlhYmxlQ1N0cmluZ091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjY08mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVZhcmlhYmxlQ1N0cmluZ091dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVWYXJpYWJsZUNTdHJpbmdPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2NPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0aGVWYXJpYWJsZUNTdHJpbmdPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQljaGFyIHBhdGg7Ci0JY2hhciBuYW1lOwotCWNoYXIgdmFsdWU7Ci0JQm9vbGVhbiB1cGRhdGVGb2N1czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBwYXRoOworICAgIGNoYXIgbmFtZTsKKyAgICBjaGFyIHZhbHVlOworICAgIEJvb2xlYW4gdXBkYXRlRm9jdXM7CiAjaWZuZGVmIEZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlRm9jdXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlRm9jdXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2NjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwZGF0ZUZvY3VzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYVNldEZsYXNoVmFyaWFibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUZvY3VzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JY2hhciBwYXRoOwotCWxvbmcgYnV0dG9uSUQ7Ci0JbG9uZyB0cmFuc2l0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBjaGFyIHBhdGg7CisgICAgbG9uZyBidXR0b25JRDsKKyAgICBsb25nIHRyYW5zaXRpb247CiAjaWZuZGVmIEZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMKLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1dHRvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNpdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGF0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnV0dG9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVUludDggc3dmVmVyc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVUludDggc3dmVmVyc2lvbjsKICNpZm5kZWYgRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24KLQlQeU1hY19QUkVDSEVDSyhGbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzd2ZWZXJzaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzd2ZWZXJzaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRmxhc2hNZWRpYUdldFN1cHBvcnRlZFN3ZlZlcnNpb24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN3ZlZlcnNpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZlZlcnNpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RHZXRDdXJyZW50R3JvdXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBncm91cDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgdm9pZCAqIGdyb3VwOwogI2lmbmRlZiBNZWRpYTNER2V0Q3VycmVudEdyb3VwCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldEN1cnJlbnRHcm91cCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldEN1cnJlbnRHcm91cCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldEN1cnJlbnRHcm91cChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyb3VwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzREdldEN1cnJlbnRHcm91cChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JY2hhciBvYmplY3ROYW1lOwotCUZpeGVkIHg7Ci0JRml4ZWQgeTsKLQlGaXhlZCB6OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBjaGFyIG9iamVjdE5hbWU7CisgICAgRml4ZWQgeDsKKyAgICBGaXhlZCB5OworICAgIEZpeGVkIHo7CiAjaWZuZGVmIE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFRyYW5zbGF0ZU5hbWVkT2JqZWN0VG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnopKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmplY3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQljaGFyIG9iamVjdE5hbWU7Ci0JRml4ZWQgeFNjYWxlOwotCUZpeGVkIHlTY2FsZTsKLQlGaXhlZCB6U2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGNoYXIgb2JqZWN0TmFtZTsKKyAgICBGaXhlZCB4U2NhbGU7CisgICAgRml4ZWQgeVNjYWxlOworICAgIEZpeGVkIHpTY2FsZTsKICNpZm5kZWYgTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4U2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeVNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlTY2FsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpTY2FsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ4U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeVNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpTY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWNoYXIgb2JqZWN0TmFtZTsKLQlGaXhlZCB4RGVncmVlczsKLQlGaXhlZCB5RGVncmVlczsKLQlGaXhlZCB6RGVncmVlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgY2hhciBvYmplY3ROYW1lOworICAgIEZpeGVkIHhEZWdyZWVzOworICAgIEZpeGVkIHlEZWdyZWVzOworICAgIEZpeGVkIHpEZWdyZWVzOwogI2lmbmRlZiBNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnhEZWdyZWVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnlEZWdyZWVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnpEZWdyZWVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9iamVjdE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeERlZ3JlZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeURlZ3JlZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgekRlZ3JlZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYyIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeERlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmeURlZ3JlZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmekRlZ3JlZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNEUm90YXRlTmFtZWRPYmplY3RUbyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqZWN0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4RGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5RGVncmVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6RGVncmVlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFNldENhbWVyYURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBjYW1lcmFEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogY2FtZXJhRGF0YTsKICNpZm5kZWYgTWVkaWEzRFNldENhbWVyYURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNEU2V0Q2FtZXJhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzRFNldENhbWVyYURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzRFNldENhbWVyYURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzREdldENhbWVyYURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXZvaWQgKiBjYW1lcmFEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogY2FtZXJhRGF0YTsKICNpZm5kZWYgTWVkaWEzREdldENhbWVyYURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldENhbWVyYURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzREdldENhbWVyYURhdGEobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlRVEZsb2F0U2luZ2xlIGZvdjsKLQlRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUVRGbG9hdFNpbmdsZSBmb3Y7CisgICAgUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1k7CiAjaWZuZGVmIE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mZmYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm92LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mZmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUVRGbG9hdFNpbmdsZSBmb3Y7Ci0JUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFFURmxvYXRTaW5nbGUgZm92OworICAgIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZOwogI2lmbmRlZiBNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QKLQlQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm92LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXNwZWN0UmF0aW9YVG9ZKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGZmIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZm92LAotCSAgICAgICAgICAgICAgICAgICAgIGFzcGVjdFJhdGlvWFRvWSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzcGVjdFJhdGlvWFRvWSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhc3BlY3RSYXRpb1hUb1kpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhM0RTZXRDYW1lcmFSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jdm9pZCAqIHRRM0NhbWVyYVJhbmdlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogdFEzQ2FtZXJhUmFuZ2U7CiAjaWZuZGVmIE1lZGlhM0RTZXRDYW1lcmFSYW5nZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhM0RTZXRDYW1lcmFSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWEzRFNldENhbWVyYVJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdFEzQ2FtZXJhUmFuZ2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYTNEU2V0Q2FtZXJhUmFuZ2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRRM0NhbWVyYVJhbmdlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRRM0NhbWVyYVJhbmdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWEzRFNldENhbWVyYVJhbmdlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0UTNDYW1lcmFSYW5nZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWEzREdldENhbWVyYVJhbmdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogdFEzQ2FtZXJhUmFuZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHZvaWQgKiB0UTNDYW1lcmFSYW5nZTsKICNpZm5kZWYgTWVkaWEzREdldENhbWVyYVJhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWEzREdldENhbWVyYVJhbmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYTNER2V0Q2FtZXJhUmFuZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0UTNDYW1lcmFSYW5nZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhM0RHZXRDYW1lcmFSYW5nZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdFEzQ2FtZXJhUmFuZ2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdFEzQ2FtZXJhUmFuZ2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYTNER2V0Q2FtZXJhUmFuZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRRM0NhbWVyYVJhbmdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9OZXdUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVGltZUJhc2UgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lQmFzZSBfcnY7CiAjaWZuZGVmIE5ld1RpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soTmV3VGltZUJhc2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE5ld1RpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdUaW1lQmFzZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOZXdUaW1lQmFzZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbnZlcnRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIHRoZVRpbWU7Ci0JVGltZUJhc2UgbmV3QmFzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVGltZVJlY29yZCB0aGVUaW1lOworICAgIFRpbWVCYXNlIG5ld0Jhc2U7CiAjaWZuZGVmIENvbnZlcnRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZuZXdCYXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29udmVydFRpbWUoJnRoZVRpbWUsCi0JICAgICAgICAgICAgbmV3QmFzZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGhlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmdGhlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJm5ld0Jhc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb252ZXJ0VGltZSgmdGhlVGltZSwKKyAgICAgICAgICAgICAgICBuZXdCYXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aGVUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db252ZXJ0VGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlUaW1lUmVjb3JkIHRoZVRpbWU7Ci0JVGltZVNjYWxlIG5ld1NjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIHRoZVRpbWU7CisgICAgVGltZVNjYWxlIG5ld1NjYWxlOwogI2lmbmRlZiBDb252ZXJ0VGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29udmVydFRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCUNvbnZlcnRUaW1lU2NhbGUoJnRoZVRpbWUsCi0JICAgICAgICAgICAgICAgICBuZXdTY2FsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmdGhlVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZ0aGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb252ZXJ0VGltZVNjYWxlKCZ0aGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgbmV3U2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJnRoZVRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0FkZFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgZHN0OwotCVRpbWVSZWNvcmQgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIGRzdDsKKyAgICBUaW1lUmVjb3JkIHNyYzsKICNpZm5kZWYgQWRkVGltZQotCVB5TWFjX1BSRUNIRUNLKEFkZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCUFkZFRpbWUoJmRzdCwKLQkgICAgICAgICZzcmMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFkZFRpbWUoJmRzdCwKKyAgICAgICAgJnNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TdWJ0cmFjdFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRpbWVSZWNvcmQgZHN0OwotCVRpbWVSZWNvcmQgc3JjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBUaW1lUmVjb3JkIGRzdDsKKyAgICBUaW1lUmVjb3JkIHNyYzsKICNpZm5kZWYgU3VidHJhY3RUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU3VidHJhY3RUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTdWJ0cmFjdFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9Db252ZXJ0LCAmZHN0LAotCSAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJnNyYykpCi0JCXJldHVybiBOVUxMOwotCVN1YnRyYWN0VGltZSgmZHN0LAotCSAgICAgICAgICAgICAmc3JjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfQ29udmVydCwgJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTdWJ0cmFjdFRpbWUoJmRzdCwKKyAgICAgICAgICAgICAgICAgJnNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRdFRpbWVSZWNvcmRfTmV3LCAmZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdGk7Ci0JbG9uZyBzYW1wbGVEZXNjSW5kZXg7Ci0JQ29tcG9uZW50SW5zdGFuY2UgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdGk7CisgICAgbG9uZyBzYW1wbGVEZXNjSW5kZXg7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdHA7CiAjaWZuZGVmIE11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlRGVzY0luZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyKHRpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjSW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCB0cCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVEZXNjSW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIodGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2NJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHRwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db2RlY01hbmFnZXJWZXJzaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgdmVyc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIHZlcnNpb247CiAjaWZuZGVmIENvZGVjTWFuYWdlclZlcnNpb24KLQlQeU1hY19QUkVDSEVDSyhDb2RlY01hbmFnZXJWZXJzaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb2RlY01hbmFnZXJWZXJzaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29kZWNNYW5hZ2VyVmVyc2lvbigmdmVyc2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb2RlY01hbmFnZXJWZXJzaW9uKCZ2ZXJzaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRNYXhDb21wcmVzc2lvblNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0Jc2hvcnQgY29sb3JEZXB0aDsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYzsKLQlsb25nIHNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgc2hvcnQgY29sb3JEZXB0aDsKKyAgICBDb2RlY1EgcXVhbGl0eTsKKyAgICBDb2RlY1R5cGUgY1R5cGU7CisgICAgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYzsKKyAgICBsb25nIHNpemU7CiAjaWZuZGVmIEdldE1heENvbXByZXNzaW9uU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdldE1heENvbXByZXNzaW9uU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TWF4Q29tcHJlc3Npb25TaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0TWF4Q29tcHJlc3Npb25TaXplKHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvckRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0TWF4Q29tcHJlc3Npb25TaXplKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldENvbXByZXNzaW9uVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlzaG9ydCBjb2xvckRlcHRoOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlDb21wcmVzc29yQ29tcG9uZW50IGNvZGVjOwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgUmVjdCBzcmNSZWN0OworICAgIHNob3J0IGNvbG9yRGVwdGg7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIENvbXByZXNzb3JDb21wb25lbnQgY29kZWM7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7CisgICAgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWU7CiAjaWZuZGVmIEdldENvbXByZXNzaW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKEdldENvbXByZXNzaW9uVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0Q29tcHJlc3Npb25UaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvZGVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uVGltZShzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1RpbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmY29kZWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25UaW1lKHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JEZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzVGltZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wcmVzc0ltYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0JUmVjdCBzcmNSZWN0OwotCUNvZGVjUSBxdWFsaXR5OwotCUNvZGVjVHlwZSBjVHlwZTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JUHRyIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgQ29kZWNRIHF1YWxpdHk7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQdHIgZGF0YTsKICNpZm5kZWYgQ29tcHJlc3NJbWFnZQotCVB5TWFjX1BSRUNIRUNLKENvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzSW1hZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvbXByZXNzSW1hZ2Uoc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgY1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29tcHJlc3NJbWFnZShzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RlY29tcHJlc3NJbWFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQdHIgZGF0YTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JUGl4TWFwSGFuZGxlIGRzdDsKLQlSZWN0IHNyY1JlY3Q7Ci0JUmVjdCBkc3RSZWN0OwotCXNob3J0IG1vZGU7Ci0JUmduSGFuZGxlIG1hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUHRyIGRhdGE7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFBpeE1hcEhhbmRsZSBkc3Q7CisgICAgUmVjdCBzcmNSZWN0OworICAgIFJlY3QgZHN0UmVjdDsKKyAgICBzaG9ydCBtb2RlOworICAgIFJnbkhhbmRsZSBtYXNrOwogI2lmbmRlZiBEZWNvbXByZXNzSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhEZWNvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKERlY29tcHJlc3NJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzTyZPJk8mTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERlY29tcHJlc3NJbWFnZShkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgIGRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgbWFzayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAic08mTyZPJk8maE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEZWNvbXByZXNzSW1hZ2UoZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dldFNpbWlsYXJpdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHNyYzsKLQlSZWN0IHNyY1JlY3Q7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCVB0ciBkYXRhOwotCUZpeGVkIHNpbWlsYXJpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB0ciBkYXRhOworICAgIEZpeGVkIHNpbWlsYXJpdHk7CiAjaWZuZGVmIEdldFNpbWlsYXJpdHkKLQlQeU1hY19QUkVDSEVDSyhHZXRTaW1pbGFyaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRTaW1pbGFyaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2ltaWxhcml0eShzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICZzaW1pbGFyaXR5KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2ltaWxhcml0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTaW1pbGFyaXR5KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNpbWlsYXJpdHkpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzaW1pbGFyaXR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlDVGFiSGFuZGxlIGN0YWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgQ1RhYkhhbmRsZSBjdGFibGU7CiAjaWZuZGVmIEdldEltYWdlRGVzY3JpcHRpb25DVGFibGUKLQlQeU1hY19QUkVDSEVDSyhHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25DVGFibGUoZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3RhYmxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY3RhYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0YWJsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGN0YWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JQ1RhYkhhbmRsZSBjdGFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIENUYWJIYW5kbGUgY3RhYmxlOwogI2lmbmRlZiBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYmxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYmxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlIYW5kbGUgZXh0ZW5zaW9uOwotCWxvbmcgaWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgbG9uZyBpZFR5cGU7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JSGFuZGxlIGV4dGVuc2lvbjsKLQlsb25nIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgSGFuZGxlIGV4dGVuc2lvbjsKKyAgICBsb25nIGlkVHlwZTsKICNpZm5kZWYgQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1JlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCWxvbmcgaWRUeXBlOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIGxvbmcgaWRUeXBlOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFJlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uKGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbihkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JbG9uZyBpZFR5cGU7Ci0JbG9uZyBjb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgbG9uZyBpZFR5cGU7CisgICAgbG9uZyBjb3VudDsKICNpZm5kZWYgQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZQotCVB5TWFjX1BSRUNIRUNLKENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBjb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWRUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKLQlsb25nIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgbG9uZyBpZFR5cGU7CiAjaWZuZGVmIEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZShkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkVHlwZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUoZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZFR5cGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRmluZENvZGVjKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCUNvZGVjVHlwZSBjVHlwZTsKLQlDb2RlY0NvbXBvbmVudCBzcGVjQ29kZWM7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yOwotCURlY29tcHJlc3NvckNvbXBvbmVudCBkZWNvbXByZXNzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgQ29kZWNUeXBlIGNUeXBlOworICAgIENvZGVjQ29tcG9uZW50IHNwZWNDb2RlYzsKKyAgICBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3I7CisgICAgRGVjb21wcmVzc29yQ29tcG9uZW50IGRlY29tcHJlc3NvcjsKICNpZm5kZWYgRmluZENvZGVjCi0JUHlNYWNfUFJFQ0hFQ0soRmluZENvZGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaW5kQ29kZWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJnNwZWNDb2RlYykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBGaW5kQ29kZWMoY1R5cGUsCi0JICAgICAgICAgICAgICAgICBzcGVjQ29kZWMsCi0JICAgICAgICAgICAgICAgICAmY29tcHJlc3NvciwKLQkgICAgICAgICAgICAgICAgICZkZWNvbXByZXNzb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgZGVjb21wcmVzc29yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc3BlY0NvZGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZpbmRDb2RlYyhjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHNwZWNDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgJmRlY29tcHJlc3Nvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBkZWNvbXByZXNzb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXByZXNzUGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaWNIYW5kbGUgc3JjUGljdHVyZTsKLQlQaWNIYW5kbGUgZHN0UGljdHVyZTsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUGljSGFuZGxlIHNyY1BpY3R1cmU7CisgICAgUGljSGFuZGxlIGRzdFBpY3R1cmU7CisgICAgQ29kZWNRIHF1YWxpdHk7CisgICAgQ29kZWNUeXBlIGNUeXBlOwogI2lmbmRlZiBDb21wcmVzc1BpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhDb21wcmVzc1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb21wcmVzc1BpY3R1cmUoc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpY3R1cmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbXByZXNzUGljdHVyZShzcmNQaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcHJlc3NQaWN0dXJlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBzcmNSZWZOdW07Ci0Jc2hvcnQgZHN0UmVmTnVtOwotCUNvZGVjUSBxdWFsaXR5OwotCUNvZGVjVHlwZSBjVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBzcmNSZWZOdW07CisgICAgc2hvcnQgZHN0UmVmTnVtOworICAgIENvZGVjUSBxdWFsaXR5OworICAgIENvZGVjVHlwZSBjVHlwZTsKICNpZm5kZWYgQ29tcHJlc3NQaWN0dXJlRmlsZQotCVB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXByZXNzUGljdHVyZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY1R5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29tcHJlc3NQaWN0dXJlRmlsZShzcmNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY1R5cGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbXByZXNzUGljdHVyZUZpbGUoc3JjUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUeXBlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db252ZXJ0SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNERDsKLQlQdHIgc3JjRGF0YTsKLQlzaG9ydCBjb2xvckRlcHRoOwotCUNUYWJIYW5kbGUgY3RhYmxlOwotCUNvZGVjUSBhY2N1cmFjeTsKLQlDb2RlY1EgcXVhbGl0eTsKLQlDb2RlY1R5cGUgY1R5cGU7Ci0JQ29kZWNDb21wb25lbnQgY29kZWM7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3RERDsKLQlQdHIgZHN0RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0REOworICAgIFB0ciBzcmNEYXRhOworICAgIHNob3J0IGNvbG9yRGVwdGg7CisgICAgQ1RhYkhhbmRsZSBjdGFibGU7CisgICAgQ29kZWNRIGFjY3VyYWN5OworICAgIENvZGVjUSBxdWFsaXR5OworICAgIENvZGVjVHlwZSBjVHlwZTsKKyAgICBDb2RlY0NvbXBvbmVudCBjb2RlYzsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdEREOworICAgIFB0ciBkc3REYXRhOwogI2lmbmRlZiBDb252ZXJ0SW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhDb252ZXJ0SW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbnZlcnRJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNoTyZsbE8mTyZPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0RELAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3RhYmxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWNjdXJhY3ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb2RlYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RERCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29udmVydEltYWdlKHNyY0RELAotCSAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICBjdGFibGUsCi0JICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSwKLQkgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICBjVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgIGNvZGVjLAotCSAgICAgICAgICAgICAgICAgICAgZHN0REQsCi0JICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNoTyZsbE8mTyZPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0RELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjdXJhY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkc3RERCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29udmVydEltYWdlKHNyY0RELAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBjVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0REQsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9BZGRGaWxlUHJldmlldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCByZXNSZWZOdW07Ci0JT1NUeXBlIHByZXZpZXdUeXBlOwotCUhhbmRsZSBwcmV2aWV3RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCByZXNSZWZOdW07CisgICAgT1NUeXBlIHByZXZpZXdUeXBlOworICAgIEhhbmRsZSBwcmV2aWV3RGF0YTsKICNpZm5kZWYgQWRkRmlsZVByZXZpZXcKLQlQeU1hY19QUkVDSEVDSyhBZGRGaWxlUHJldmlldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkRmlsZVByZXZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcmV2aWV3VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcmV2aWV3RGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBBZGRGaWxlUHJldmlldyhyZXNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RGF0YSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcmV2aWV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwcmV2aWV3RGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBBZGRGaWxlUHJldmlldyhyZXNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RGF0YSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0QmVzdERldmljZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JR0RIYW5kbGUgZ2RoOwotCVJlY3QgcnA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIFJlY3QgcnA7CiAjaWZuZGVmIEdldEJlc3REZXZpY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0QmVzdERldmljZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEJlc3REZXZpY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0QmVzdERldmljZVJlY3QoJmdkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnJwKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QmVzdERldmljZVJlY3QoJmdkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJwKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dESGFzU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JR0RIYW5kbGUgZ2RoOwotCXNob3J0IGRlcHRoOwotCUZpeGVkIHNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEdESGFuZGxlIGdkaDsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBGaXhlZCBzY2FsZTsKICNpZm5kZWYgR0RIYXNTY2FsZQotCVB5TWFjX1BSRUNIRUNLKEdESGFzU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdESGFzU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHREhhc1NjYWxlKGdkaCwKLQkgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHREhhc1NjYWxlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR0RHZXRTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlHREhhbmRsZSBnZGg7Ci0JRml4ZWQgc2NhbGU7Ci0Jc2hvcnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIEZpeGVkIHNjYWxlOworICAgIHNob3J0IGZsYWdzOwogI2lmbmRlZiBHREdldFNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR0RHZXRTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR0RHZXRTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdER2V0U2NhbGUoZ2RoLAotCSAgICAgICAgICAgICAgICAgICZzY2FsZSwKLQkgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR0RHZXRTY2FsZShnZGgsCisgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR0RTZXRTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlHREhhbmRsZSBnZGg7Ci0JRml4ZWQgc2NhbGU7Ci0Jc2hvcnQgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgR0RIYW5kbGUgZ2RoOworICAgIEZpeGVkIHNjYWxlOworICAgIHNob3J0IGZsYWdzOwogI2lmbmRlZiBHRFNldFNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soR0RTZXRTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR0RTZXRTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2RoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR0RTZXRTY2FsZShnZGgsCi0JICAgICAgICAgICAgICAgICAgc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHRFNldFNjYWxlKGdkaCwKKyAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JQ29tcG9uZW50SW5zdGFuY2UgZ2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgZ2k7CiAjaWZuZGVmIEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSgmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGdpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGUoJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUNvbXBvbmVudEluc3RhbmNlIGdpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBnaTsKICNpZm5kZWYgR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWYoZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JQ29tcG9uZW50SW5zdGFuY2UgZ2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBnaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MoJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ2kpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZVdpdGhGbGFncygmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUNvbXBvbmVudEluc3RhbmNlIGdpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIENvbXBvbmVudEluc3RhbmNlIGdpOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzKGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGdpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZldpdGhGbGFncyhkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBnaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUGl4TWFwSGFuZGxlIHBpeG1hcDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcGl4bWFwOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOwogI2lmbmRlZiBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcGl4bWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yUGl4TWFwKHBpeG1hcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlkaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeG1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcChwaXhtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBlZmZlY3RUeXBlOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBlZmZlY3RUeXBlOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoOwogI2lmbmRlZiBNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdAotCVB5TWFjX1BSRUNIRUNLKE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmVmZmVjdFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JFZmZlY3QoZWZmZWN0VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkaCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlkaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZlZmZlY3RUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IE1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0KGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZGgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpZGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0UGl4ZWxTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JT1NUeXBlIFBpeGVsRm9ybWF0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgT1NUeXBlIFBpeGVsRm9ybWF0OwogI2lmbmRlZiBRVEdldFBpeGVsU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFBpeGVsU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJlBpeGVsRm9ybWF0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhlbFNpemUoUGl4ZWxGb3JtYXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmUGl4ZWxGb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVEdldFBpeGVsU2l6ZShQaXhlbEZvcm1hdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCU9TVHlwZSBQaXhlbEZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIE9TVHlwZSBQaXhlbEZvcm1hdDsKICNpZm5kZWYgUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZQaXhlbEZvcm1hdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24oUGl4ZWxGb3JtYXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmUGl4ZWxGb3JtYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uKFBpeGVsRm9ybWF0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhwbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgcG07Ci0JbG9uZyByb3dCeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgbG9uZyByb3dCeXRlczsKICNpZm5kZWYgUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcwotCVB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJvd0J5dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMocG0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93Qnl0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyb3dCeXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzKHBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0J5dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlQaXhNYXBIYW5kbGUgcG07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CiAjaWZuZGVmIFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbAotCVB5TWFjX1BSRUNIRUNLKFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlQaXhNYXBIYW5kbGUgcG07Ci0JRml4ZWQgZ2FtbWFMZXZlbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgRml4ZWQgZ2FtbWFMZXZlbDsKICNpZm5kZWYgUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsCi0JUHlNYWNfUFJFQ0hFQ0soUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcG0sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZ2FtbWFMZXZlbCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwocG0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYUxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZnYW1tYUxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbChwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbW1hTGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCVBpeE1hcEhhbmRsZSBwbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIFBpeE1hcEhhbmRsZSBwbTsKICNpZm5kZWYgUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsCi0JUHlNYWNfUFJFQ0hFQ0soUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVEdldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVBpeE1hcEhhbmRsZSBwbTsKLQlGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFBpeE1hcEhhbmRsZSBwbTsKKyAgICBGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsOwogI2lmbmRlZiBRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwKLQlQeU1hY19QUkVDSEVDSyhRVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyZXF1ZXN0ZWRHYW1tYUxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbChwbSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEdhbW1hTGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJlcXVlc3RlZEdhbW1hTGV2ZWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsKHBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkR2FtbWFMZXZlbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcEFkZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBzcmM7Ci0Jd2lkZSBkc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgc3JjOworICAgIHdpZGUgZHN0OwogI2lmbmRlZiBDb21wQWRkCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcEFkZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcEFkZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcEFkZCgmc3JjLAotCSAgICAgICAgJmRzdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcEFkZCgmc3JjLAorICAgICAgICAmZHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBTdWIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXdpZGUgc3JjOwotCXdpZGUgZHN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICB3aWRlIHNyYzsKKyAgICB3aWRlIGRzdDsKICNpZm5kZWYgQ29tcFN1YgotCVB5TWFjX1BSRUNIRUNLKENvbXBTdWIpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBTdWIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNvbXBTdWIoJnNyYywKLQkgICAgICAgICZkc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBTdWIoJnNyYywKKyAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wTmVnKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGRzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBkc3Q7CiAjaWZuZGVmIENvbXBOZWcKLQlQeU1hY19QUkVDSEVDSyhDb21wTmVnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wTmVnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wTmVnKCZkc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb21wTmVnKCZkc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBkc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0NvbXBTaGlmdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBzcmM7Ci0Jc2hvcnQgc2hpZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgc3JjOworICAgIHNob3J0IHNoaWZ0OwogI2lmbmRlZiBDb21wU2hpZnQKLQlQeU1hY19QUkVDSEVDSyhDb21wU2hpZnQpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBTaGlmdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNoaWZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcFNoaWZ0KCZzcmMsCi0JICAgICAgICAgIHNoaWZ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoaWZ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcFNoaWZ0KCZzcmMsCisgICAgICAgICAgICAgIHNoaWZ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3JjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wTXVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHNyYzE7Ci0JbG9uZyBzcmMyOwotCXdpZGUgZHN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIHNyYzE7CisgICAgbG9uZyBzcmMyOworICAgIHdpZGUgZHN0OwogI2lmbmRlZiBDb21wTXVsCi0JUHlNYWNfUFJFQ0hFQ0soQ29tcE11bCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmMxLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjMikpCi0JCXJldHVybiBOVUxMOwotCUNvbXBNdWwoc3JjMSwKLQkgICAgICAgIHNyYzIsCi0JICAgICAgICAmZHN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjMikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENvbXBNdWwoc3JjMSwKKyAgICAgICAgc3JjMiwKKyAgICAgICAgJmRzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGRzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0Jd2lkZSBudW1lcmF0b3I7Ci0JbG9uZyBkZW5vbWluYXRvcjsKLQlsb25nIHJlbWFpbmRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgd2lkZSBudW1lcmF0b3I7CisgICAgbG9uZyBkZW5vbWluYXRvcjsKKyAgICBsb25nIHJlbWFpbmRlcjsKICNpZm5kZWYgQ29tcERpdgotCVB5TWFjX1BSRUNIRUNLKENvbXBEaXYpOworICAgIFB5TWFjX1BSRUNIRUNLKENvbXBEaXYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZW5vbWluYXRvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvbXBEaXYoJm51bWVyYXRvciwKLQkgICAgICAgICAgICAgIGRlbm9taW5hdG9yLAotCSAgICAgICAgICAgICAgJnJlbWFpbmRlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG51bWVyYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVub21pbmF0b3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wRGl2KCZudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICZyZW1haW5kZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wRml4TXVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGNvbXBTcmM7Ci0JRml4ZWQgZml4U3JjOwotCXdpZGUgY29tcERzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBjb21wU3JjOworICAgIEZpeGVkIGZpeFNyYzsKKyAgICB3aWRlIGNvbXBEc3Q7CiAjaWZuZGVmIENvbXBGaXhNdWwKLQlQeU1hY19QUkVDSEVDSyhDb21wRml4TXVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wRml4TXVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmaXhTcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wRml4TXVsKCZjb21wU3JjLAotCSAgICAgICAgICAgZml4U3JjLAotCSAgICAgICAgICAgJmNvbXBEc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvbXBTcmMsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjb21wRHN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZml4U3JjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcEZpeE11bCgmY29tcFNyYywKKyAgICAgICAgICAgICAgIGZpeFNyYywKKyAgICAgICAgICAgICAgICZjb21wRHN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjb21wU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY29tcERzdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcE11bERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jd2lkZSBjbzsKLQlsb25nIG11bDsKLQlsb25nIGRpdmlzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHdpZGUgY287CisgICAgbG9uZyBtdWw7CisgICAgbG9uZyBkaXZpc29yOwogI2lmbmRlZiBDb21wTXVsRGl2Ci0JUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtdWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXZpc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ29tcE11bERpdigmY28sCi0JICAgICAgICAgICBtdWwsCi0JICAgICAgICAgICBkaXZpc29yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY28pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpdmlzb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDb21wTXVsRGl2KCZjbywKKyAgICAgICAgICAgICAgIG11bCwKKyAgICAgICAgICAgICAgIGRpdmlzb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBjbyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcE11bERpdlRydW5jKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQl3aWRlIGNvOwotCWxvbmcgbXVsOwotCWxvbmcgZGl2aXNvcjsKLQlsb25nIHJlbWFpbmRlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgd2lkZSBjbzsKKyAgICBsb25nIG11bDsKKyAgICBsb25nIGRpdmlzb3I7CisgICAgbG9uZyByZW1haW5kZXI7CiAjaWZuZGVmIENvbXBNdWxEaXZUcnVuYwotCVB5TWFjX1BSRUNIRUNLKENvbXBNdWxEaXZUcnVuYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29tcE11bERpdlRydW5jKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm11bCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRpdmlzb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlDb21wTXVsRGl2VHJ1bmMoJmNvLAotCSAgICAgICAgICAgICAgICBtdWwsCi0JICAgICAgICAgICAgICAgIGRpdmlzb3IsCi0JICAgICAgICAgICAgICAgICZyZW1haW5kZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgY28sCi0JICAgICAgICAgICAgICAgICAgICAgcmVtYWluZGVyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXZpc29yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ29tcE11bERpdlRydW5jKCZjbywKKyAgICAgICAgICAgICAgICAgICAgbXVsLAorICAgICAgICAgICAgICAgICAgICBkaXZpc29yLAorICAgICAgICAgICAgICAgICAgICAmcmVtYWluZGVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGNvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ29tcENvbXBhcmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCXdpZGUgYTsKLQl3aWRlIG1pbnVzYjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgd2lkZSBhOworICAgIHdpZGUgbWludXNiOwogI2lmbmRlZiBDb21wQ29tcGFyZQotCVB5TWFjX1BSRUNIRUNLKENvbXBDb21wYXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wQ29tcGFyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmEsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtaW51c2IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb21wQ29tcGFyZSgmYSwKLQkgICAgICAgICAgICAgICAgICAmbWludXNiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtaW51c2IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wQ29tcGFyZSgmYSwKKyAgICAgICAgICAgICAgICAgICAgICAmbWludXNiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Db21wU3F1YXJlUm9vdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBfcnY7Ci0Jd2lkZSBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgX3J2OworICAgIHdpZGUgc3JjOwogI2lmbmRlZiBDb21wU3F1YXJlUm9vdAotCVB5TWFjX1BSRUNIRUNLKENvbXBTcXVhcmVSb290KTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb21wU3F1YXJlUm9vdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb21wU3F1YXJlUm9vdCgmc3JjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb21wU3F1YXJlUm9vdCgmc3JjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9GaXhNdWxEaXYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7Ci0JRml4ZWQgbXVsOwotCUZpeGVkIGRpdmlzb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CisgICAgRml4ZWQgbXVsOworICAgIEZpeGVkIGRpdmlzb3I7CiAjaWZuZGVmIEZpeE11bERpdgotCVB5TWFjX1BSRUNIRUNLKEZpeE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRml4TXVsRGl2KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJm11bCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZkaXZpc29yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRml4TXVsRGl2KHNyYywKLQkgICAgICAgICAgICAgICAgbXVsLAotCSAgICAgICAgICAgICAgICBkaXZpc29yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmRpdmlzb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhNdWxEaXYoc3JjLAorICAgICAgICAgICAgICAgICAgICBtdWwsCisgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9VbnNpZ25lZEZpeE11bERpdihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCUZpeGVkIHNyYzsKLQlGaXhlZCBtdWw7Ci0JRml4ZWQgZGl2aXNvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRml4ZWQgX3J2OworICAgIEZpeGVkIHNyYzsKKyAgICBGaXhlZCBtdWw7CisgICAgRml4ZWQgZGl2aXNvcjsKICNpZm5kZWYgVW5zaWduZWRGaXhNdWxEaXYKLQlQeU1hY19QUkVDSEVDSyhVbnNpZ25lZEZpeE11bERpdik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVW5zaWduZWRGaXhNdWxEaXYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmbXVsLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmRpdmlzb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbnNpZ25lZEZpeE11bERpdihzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbXVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZGl2aXNvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFVuc2lnbmVkRml4TXVsRGl2KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeEV4cDIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CiAjaWZuZGVmIEZpeEV4cDIKLQlQeU1hY19QUkVDSEVDSyhGaXhFeHAyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaXhFeHAyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaXhFeHAyKHNyYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhFeHAyKHNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeExvZzIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUZpeGVkIF9ydjsKLQlGaXhlZCBzcmM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBGaXhlZCBzcmM7CiAjaWZuZGVmIEZpeExvZzIKLQlQeU1hY19QUkVDSEVDSyhGaXhMb2cyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGaXhMb2cyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaXhMb2cyKHNyYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZzcmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaXhMb2cyKHNyYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ZpeFBvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRml4ZWQgX3J2OwotCUZpeGVkIGJhc2U7Ci0JRml4ZWQgZXhwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGaXhlZCBfcnY7CisgICAgRml4ZWQgYmFzZTsKKyAgICBGaXhlZCBleHA7CiAjaWZuZGVmIEZpeFBvdwotCVB5TWFjX1BSRUNIRUNLKEZpeFBvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRml4UG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmJhc2UsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXhwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRml4UG93KGJhc2UsCi0JICAgICAgICAgICAgIGV4cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmZXhwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRml4UG93KGJhc2UsCisgICAgICAgICAgICAgICAgIGV4cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVUeXBlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0UmVhZERhdGEKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZ25IYW5kbGUgY2xpcFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZ25IYW5kbGUgY2xpcFJnbjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRDbGlwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldENsaXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRDbGlwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldENsaXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmduSGFuZGxlIGNsaXBSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUmduSGFuZGxlIGNsaXBSZ247CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0Q2xpcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRDbGlwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldENsaXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY2xpcFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Q2xpcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsaXBSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjbGlwUmduKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBzb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3Qgc291cmNlUmVjdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc291cmNlUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZVJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnNvdXJjZVJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBzb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3Qgc291cmNlUmVjdDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZVJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZzb3VyY2VSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnNvdXJjZVJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IG5hdHVyYWxCb3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUmVjdCBuYXR1cmFsQm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmF0dXJhbEJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm5hdHVyYWxCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXR1cmFsQm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmbmF0dXJhbEJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnREcmF3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydERyYXcKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydERyYXcpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RHJhdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnREcmF3KGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnREcmF3KGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldEdXb3JsZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBwb3J0OwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENHcmFmUHRyIHBvcnQ7CisgICAgR0RIYW5kbGUgZ2Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEdXb3JsZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBwb3J0LAotCSAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfTmV3LCBnZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIGZzczsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgZnNzOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2F2ZUFzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZ3JhcGhpY3NNb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBncmFwaGljc01vZGU7CisgICAgUkdCQ29sb3Igb3BDb2xvcjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEdyYXBoaWNzTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZncmFwaGljc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZvcENvbG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGdyYXBoaWNzTW9kZTsKLQlSR0JDb2xvciBvcENvbG9yOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgZ3JhcGhpY3NNb2RlOworICAgIFJHQkNvbG9yIG9wQ29sb3I7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JhcGhpY3NNb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYXBoaWNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BDb2xvcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljc01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmb3BDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUNvZGVjUSBxdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBxdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldFF1YWxpdHkoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUNvZGVjUSBxdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBxdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbGl0eSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1YWxpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyBmc3M7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIGZzczsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTYXZlQXNRdWlja1RpbWVJbWFnZUZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgbGltaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiB2YWxpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIHZhbGlkOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogdXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHVzZXJEYXRhOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldE1ldGFEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldE1JTUVUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlzaG9ydCBkcmF3c0FsbFBpeGVsczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBkcmF3c0FsbFBpeGVsczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJhd3NBbGxQaXhlbHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRyYXdzQWxsUGl4ZWxzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcmF3c0FsbFBpeGVscyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd3NBbGxQaXhlbHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVBpY0hhbmRsZSBwaWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFBpY0hhbmRsZSBwaWN0dXJlOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEFzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaWN0dXJlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY3R1cmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaWN0dXJlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCUZTU3BlYyBmc3M7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKKyAgICBGU1NwZWMgZnNzOworICAgIFNjcmlwdENvZGUgc2NyaXB0VGFnOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZmc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEV4cG9ydEltYWdlRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQ3JlYXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmZnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdEF0b21Db250YWluZXJQdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBxdEF0b21Db250YWluZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcjsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW1hZ2VDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGltYWdlQ291bnQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUNvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbWFnZUNvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXg7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VJbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleDsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlSW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5kZXgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZUluZGV4KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBkYXRhUHRyOwotCXdpZGUgZGF0YU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBkYXRhUHRyOworICAgIHdpZGUgZGF0YU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0UmVhZERhdGE2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIGxpbWl0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQl3aWRlIG9mZnNldDsKLQl3aWRlIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBsaW1pdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGxpbWl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBkZWZhdWx0UmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBkZWZhdWx0UmduOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0UmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVmYXVsdFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdFJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlZmF1bHRSZ24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGRlZmF1bHRHcmFwaGljc01vZGU7Ci0JUkdCQ29sb3IgZGVmYXVsdE9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBkZWZhdWx0R3JhcGhpY3NNb2RlOworICAgIFJHQkNvbG9yIGRlZmF1bHRPcENvbG9yOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdEdyYXBoaWNzTW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRPcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRHcmFwaGljc01vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmZGVmYXVsdE9wQ29sb3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWZhdWx0R3JhcGhpY3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdE9wQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEdyYXBoaWNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZkZWZhdWx0T3BDb2xvcik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGRlZmF1bHRTb3VyY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgZGVmYXVsdFNvdXJjZVJlY3Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRTb3VyY2VSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVmYXVsdFNvdXJjZVJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlZmF1bHRTb3VyY2VSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVmYXVsdFNvdXJjZVJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgcHJvZmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgcHJvZmlsZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2ZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwcm9maWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvZmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHByb2ZpbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JUmVjdCBkZXN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRlc3RSZWN0OwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldERlc3RSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRlc3RSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKLQlSZWN0IGRlc3RSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFJlY3QgZGVzdFJlY3Q7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0U2V0RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBHcmFwaGljc0ltcG9ydFNldEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRTZXRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0ltcG9ydEdldEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRGbGFncwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0RmxhZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbXBvcnRHZXRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpOworICAgIHdpZGUgb2Zmc2V0OworICAgIHdpZGUgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NJbXBvcnRHZXRCYXNlRGF0YU9mZnNldEFuZFNpemU2NAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2k7CiAjaWZuZGVmIEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbChjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleFRvVGh1bWJuYWlsKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvRXhwb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgYWN0dWFsU2l6ZVdyaXR0ZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBhY3R1YWxTaXplV3JpdHRlbjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnREb0V4cG9ydAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0RG9FeHBvcnQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsU2l6ZVdyaXR0ZW4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNpemVXcml0dGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnREb0V4cG9ydChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3R1YWxTaXplV3JpdHRlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2l6ZVdyaXR0ZW4pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gY2FuVHJhbnNjb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gY2FuVHJhbnNjb2RlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblRyYW5zY29kZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuVHJhbnNjb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRDYW5UcmFuc2NvZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblRyYW5zY29kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuVHJhbnNjb2RlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZShjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGNhblVzZUNvbXByZXNzb3I7Ci0Jdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gY2FuVXNlQ29tcHJlc3NvcjsKKyAgICB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3Nvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5Vc2VDb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuVXNlQ29tcHJlc3Nvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhblVzZUNvbXByZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW5Vc2VDb21wcmVzc29yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXI7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBvdXREZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lcjsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIG91dERlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dERlc2MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1NldHRpbmdzQXRvbUNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dERlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydERvU3RhbmRhbG9uZUV4cG9ydChjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZUNyZWF0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZUNyZWF0b3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVDcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVDcmVhdG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVOYW1lRXh0ZW5zaW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVOYW1lRXh0ZW5zaW9uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnF0QXRvbUNvbnRhaW5lclB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0TUlNRVR5cGVMaXN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXZvaWQgKiBxdEF0b21Db250YWluZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHI7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcXRBdG9tQ29udGFpbmVyUHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0QXRvbUNvbnRhaW5lclB0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZxdEF0b21Db250YWluZXJQdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXRBdG9tQ29udGFpbmVyUHRyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSB0aGVUZXh0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSB0aGVUZXh0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVUZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlVGV4dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlVGV4dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZVRleHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBkb250UmVjb21wcmVzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGRvbnRSZWNvbXByZXNzOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRvbnRSZWNvbXByZXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvbnRSZWNvbXByZXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gZG9udFJlY29tcHJlc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBkb250UmVjb21wcmVzczsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcwotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9udFJlY29tcHJlc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRvbnRSZWNvbXByZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb250UmVjb21wcmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG9udFJlY29tcHJlc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldEludGVybGFjZVN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybGFjZVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJsYWNlU3R5bGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGludGVybGFjZVN0eWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmxhY2VTdHlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJsYWNlU3R5bGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIHVzZXJEYXRhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHZvaWQgKiB1c2VyRGF0YTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyRGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl2b2lkICogdXNlckRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIHVzZXJEYXRhOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRUYXJnZXREYXRhU2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXREYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXREYXRhU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldERhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0YXJnZXREYXRhU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0RGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERhdGFTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgY29tcHJlc3Npb25NZXRob2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBjb21wcmVzc2lvbk1ldGhvZDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvbk1ldGhvZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbk1ldGhvZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbk1ldGhvZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGNvbXByZXNzaW9uTWV0aG9kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgY29tcHJlc3Npb25NZXRob2Q7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzaW9uTWV0aG9kKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk1ldGhvZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25NZXRob2QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTWV0aG9kKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHkoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25RdWFsaXR5KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb247Ci0JRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uOworICAgIEZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaG9yaXpvbnRhbFJlc29sdXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmdmVydGljYWxSZXNvbHV0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsUmVzb2x1dGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxSZXNvbHV0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZob3Jpem9udGFsUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ2ZXJ0aWNhbFJlc29sdXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbFJlc29sdXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbjsKLQlGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb247CisgICAgRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24KLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9yaXpvbnRhbFJlc29sdXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0aWNhbFJlc29sdXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGhvcml6b250YWxSZXNvbHV0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIHZlcnRpY2FsUmVzb2x1dGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvcml6b250YWxSZXNvbHV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmVydGljYWxSZXNvbHV0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBob3Jpem9udGFsUmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCB2ZXJ0aWNhbFJlc29sdXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0RGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBkZXB0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIGRlcHRoOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldERlcHRoCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXREZXB0aCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREZXB0aChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXREZXB0aChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldERlcHRoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgZGVwdGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBkZXB0aDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXREZXB0aAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RGVwdGgoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRlcHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXREZXB0aChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgY29sb3JTeW5jUHJvZmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgY29sb3JTeW5jUHJvZmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbG9yU3luY1Byb2ZpbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3luY1Byb2ZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb2xvclN5bmNQcm9maWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclN5bmNQcm9maWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclN5bmNQcm9maWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JTeW5jUHJvZmlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yU3luY1Byb2ZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb2xvclN5bmNQcm9maWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUZTU3BlYyB0aGVGaWxlOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBoKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UHRyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVB0ciBwOwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUHRyIHA7CisgICAgdW5zaWduZWQgbG9uZyBzaXplOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0cihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgZ3JpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmdyaXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmdyaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXA7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBncmlwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyaXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgZ3JpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JUGljSGFuZGxlIHBpY3R1cmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGljSGFuZGxlIHBpY3R1cmU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaWN0dXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpY3R1cmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0UGljdHVyZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlQaWNIYW5kbGUgcGljdHVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBQaWNIYW5kbGUgcGljdHVyZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0UGljdHVyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGljdHVyZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWN0dXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGljdHVyZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHV29ybGRQdHIgZ3dvcmxkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdXb3JsZFB0ciBnd29ybGQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX0NvbnZlcnQsICZnd29ybGQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3dvcmxkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9Db252ZXJ0LCAmZ3dvcmxkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd3b3JsZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlHV29ybGRQdHIgZ3dvcmxkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEdXb3JsZFB0ciBnd29ybGQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmd3b3JsZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3b3JsZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3dvcmxkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgZ3dvcmxkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVBpeE1hcEhhbmRsZSBwaXhtYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIHBpeG1hcDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeG1hcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhtYXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhtYXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4bWFwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVBpeE1hcEhhbmRsZSBwaXhtYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIHBpeG1hcDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXApOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl4bWFwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGl4bWFwKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaXhtYXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwaXhtYXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbGltaXQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBsaW1pdDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0T2Zmc2V0QW5kTGltaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gbWF5UmVhZElucHV0RGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIG1heVJlYWRJbnB1dERhdGE7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRNYXlFeHBvcnRlclJlYWRJbnB1dERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF5UmVhZElucHV0RGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWF5UmVhZElucHV0RGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXlSZWFkSW5wdXREYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXlSZWFkSW5wdXREYXRhKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbgotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCVJlY3QgZGltZW5zaW9uczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRpbWVuc2lvbnM7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpbWVuc2lvbnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaW1lbnNpb25zKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaW1lbnNpb25zKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGltZW5zaW9ucyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBpbnB1dERlcHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW5wdXREZXB0aDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEZXB0aCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dERlcHRoKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0RGVwdGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JQ0dyYWZQdHIgZ3c7Ci0JR0RIYW5kbGUgZ2Q7Ci0JUmVjdCBzcmNSZWN0OwotCVJlY3QgZHN0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBDR3JhZlB0ciBndzsKKyAgICBHREhhbmRsZSBnZDsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgUmVjdCBkc3RSZWN0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmd3LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmRzdFJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3csCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZ3csCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmZ2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZHN0UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKLQlCb29sZWFuIHRydW5jYXRlRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heFNpemU7CisgICAgQm9vbGVhbiB0cnVuY2F0ZUZpbGU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZQotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmdHJ1bmNhdGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY2F0ZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVGaWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBtYXhTaXplOwotCUJvb2xlYW4gdHJ1bmNhdGVGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZTsKKyAgICBCb29sZWFuIHRydW5jYXRlRmlsZTsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cnVuY2F0ZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIG1heFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgdHJ1bmNhdGVGaWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRydW5jYXRlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cnVuY2F0ZUZpbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlQ3JlYXRvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIE9TVHlwZSBmaWxlQ3JlYXRvcjsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZUNyZWF0b3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZUNyZWF0b3IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVDcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGZpbGVDcmVhdG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgbG9uZyBtYXJrOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIGxvbmcgbWFyazsKICNpZm5kZWYgR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrCi0JUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXJrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmspKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBsb25nIG1hcms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBtYXJrOwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmsKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmspOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFyayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWFyayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyayhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hcmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmspOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2k7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0OworICAgIHVuc2lnbmVkIGxvbmcgZGF0YVNpemU7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGVuYWJsZVRodW1ibmFpbDsKLQlsb25nIG1heFRodW1ibmFpbFdpZHRoOwotCWxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gZW5hYmxlVGh1bWJuYWlsOworICAgIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGg7CisgICAgbG9uZyBtYXhUaHVtYm5haWxIZWlnaHQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVUaHVtYm5haWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbEhlaWdodCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlVGh1bWJuYWlsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUaHVtYm5haWxXaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlVGh1bWJuYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhUaHVtYm5haWxIZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZVRodW1ibmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRodW1ibmFpbEhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZDsKLQlsb25nIG1heFRodW1ibmFpbFdpZHRoOwotCWxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZDsKKyAgICBsb25nIG1heFRodW1ibmFpbFdpZHRoOworICAgIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0OwogI2lmbmRlZiBHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGh1bWJuYWlsRW5hYmxlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbFdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbEVuYWJsZWQsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGh1bWJuYWlsRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRodW1ibmFpbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VGh1bWJuYWlsSGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbEVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGh1bWJuYWlsSGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9HcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOwotCUJvb2xlYW4gZW5hYmxlRXhpZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGVuYWJsZUV4aWY7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlRXhpZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVFeGlmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZUV4aWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlRXhpZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGV4aWZFbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gZXhpZkVuYWJsZWQ7CiAjaWZuZGVmIEdyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4aWZFbmFibGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBleGlmRW5hYmxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhpZkVuYWJsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4aWZFbmFibGVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9JbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7Ci0JSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNEZXNjOwotCUltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0RGVzYzsKLQl2b2lkICogZGF0YTsKLQlsb25nIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBzcmNEZXNjOworICAgIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0RGVzYzsKKyAgICB2b2lkICogZGF0YTsKKyAgICBsb25nIGRhdGFTaXplOwogI2lmbmRlZiBJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlCi0JUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjRGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UoaXRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZHN0RGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlKGl0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRzdERlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7Ci0Jdm9pZCAqIGRzdERhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YzsKKyAgICB2b2lkICogZHN0RGF0YTsKICNpZm5kZWYgSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEKLQlQeU1hY19QUkVDSEVDSyhJbWFnZVRyYW5zY29kZXJEaXNwb3NlRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0RGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhKGl0YywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEoaXRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdERhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0ltYWdlVHJhbnNjb2RlckVuZFNlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YzsKICNpZm5kZWYgSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UKLQlQeU1hY19QUkVDSEVDSyhJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZpdGMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZShpdGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmaXRjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UoaXRjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9ja0dldFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOwotCVRpbWVSZWNvcmQgb3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFDbG9jazsKKyAgICBUaW1lUmVjb3JkIG91dDsKICNpZm5kZWYgQ2xvY2tHZXRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvY2tHZXRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbG9ja0dldFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhQ2xvY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDbG9ja0dldFRpbWUoYUNsb2NrLAotCSAgICAgICAgICAgICAgICAgICAmb3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJm91dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhQ2xvY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDbG9ja0dldFRpbWUoYUNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAmb3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJm91dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfQ2xvY2tTZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2s7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOworICAgIFRpbWVCYXNlIHRiOwogI2lmbmRlZiBDbG9ja1NldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xvY2tTZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvY2tTZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrLAotCSAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdGIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDbG9ja1NldFRpbWVCYXNlKGFDbG9jaywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9Db252ZXJ0LCAmdGIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDbG9ja1NldFRpbWVCYXNlKGFDbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9DbG9ja0dldFJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrOworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIENsb2NrR2V0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKENsb2NrR2V0UmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvY2tHZXRSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYUNsb2NrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2xvY2tHZXRSYXRlKGFDbG9jaywKLQkgICAgICAgICAgICAgICAgICAgJnJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCByYXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFDbG9jaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IENsb2NrR2V0UmF0ZShhQ2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICZyYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgcmF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NQb3NpdGlvblJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUmVjdCBycDsKLQlQb2ludCB3aGVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBSZWN0IHJwOworICAgIFBvaW50IHdoZXJlOwogI2lmbmRlZiBTQ1Bvc2l0aW9uUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1Bvc2l0aW9uUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NQb3NpdGlvblJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnJwLAotCSAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcnAsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgd2hlcmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1Bvc2l0aW9uUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZycCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NQb3NpdGlvbkRpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlzaG9ydCBpZDsKLQlQb2ludCB3aGVyZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBzaG9ydCBpZDsKKyAgICBQb2ludCB3aGVyZTsKICNpZm5kZWYgU0NQb3NpdGlvbkRpYWxvZwotCVB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25EaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDUG9zaXRpb25EaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDUG9zaXRpb25EaWFsb2coY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICBpZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIHdoZXJlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NQb3NpdGlvbkRpYWxvZyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgd2hlcmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGljdEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaWNIYW5kbGUgdGVzdFBpY3Q7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlzaG9ydCB0ZXN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGljSGFuZGxlIHRlc3RQaWN0OworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgc2hvcnQgdGVzdEZsYWdzOwogI2lmbmRlZiBTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0VGVzdEltYWdlUGljdEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRlc3RQaWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGljdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZXN0UGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDU2V0VGVzdEltYWdlUGljdEhhbmRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGljdEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0Jc2hvcnQgdGVzdEZpbGVSZWY7Ci0JUmVjdCB0ZXN0UmVjdDsKLQlzaG9ydCB0ZXN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgc2hvcnQgdGVzdEZpbGVSZWY7CisgICAgUmVjdCB0ZXN0UmVjdDsKKyAgICBzaG9ydCB0ZXN0RmxhZ3M7CiAjaWZuZGVmIFNDU2V0VGVzdEltYWdlUGljdEZpbGUKLQlQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpY3RGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGaWxlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGaWxlUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0VGVzdEltYWdlUGl4TWFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwOwotCVJlY3QgdGVzdFJlY3Q7Ci0Jc2hvcnQgdGVzdEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwOworICAgIFJlY3QgdGVzdFJlY3Q7CisgICAgc2hvcnQgdGVzdEZsYWdzOwogI2lmbmRlZiBTQ1NldFRlc3RJbWFnZVBpeE1hcAotCVB5TWFjX1BSRUNIRUNLKFNDU2V0VGVzdEltYWdlUGl4TWFwKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ1NldFRlc3RJbWFnZVBpeE1hcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRlc3RQaXhNYXAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ1NldFRlc3RJbWFnZVBpeE1hcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGl4TWFwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ0ZXN0UmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0ZXN0UGl4TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NTZXRUZXN0SW1hZ2VQaXhNYXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBpeE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmdGVzdFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0QmVzdERldmljZVJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JUmVjdCByOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFJlY3QgcjsKICNpZm5kZWYgU0NHZXRCZXN0RGV2aWNlUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNDR2V0QmVzdERldmljZVJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDR2V0QmVzdERldmljZVJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDR2V0QmVzdERldmljZVJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0dldEJlc3REZXZpY2VSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1JlcXVlc3RJbWFnZVNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOwogI2lmbmRlZiBTQ1JlcXVlc3RJbWFnZVNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyhjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDUmVxdWVzdEltYWdlU2V0dGluZ3MoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NJbWFnZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JSGFuZGxlIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIEhhbmRsZSBkYXRhOwogI2lmbmRlZiBTQ0NvbXByZXNzSW1hZ2UKLQlQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzSW1hZ2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NJbWFnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc0ltYWdlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NJbWFnZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGEpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NQaWN0dXJlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpY0hhbmRsZSBzcmNQaWN0dXJlOwotCVBpY0hhbmRsZSBkc3RQaWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpY0hhbmRsZSBzcmNQaWN0dXJlOworICAgIFBpY0hhbmRsZSBkc3RQaWN0dXJlOwogI2lmbmRlZiBTQ0NvbXByZXNzUGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NQaWN0dXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzUGljdHVyZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRzdFBpY3R1cmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0NvbXByZXNzUGljdHVyZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBzcmNQaWN0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFBpY3R1cmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZHN0UGljdHVyZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NQaWN0dXJlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UGljdHVyZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NDb21wcmVzc1BpY3R1cmVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCXNob3J0IHNyY1JlZk51bTsKLQlzaG9ydCBkc3RSZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgc2hvcnQgc3JjUmVmTnVtOworICAgIHNob3J0IGRzdFJlZk51bTsKICNpZm5kZWYgU0NDb21wcmVzc1BpY3R1cmVGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1BpY3R1cmVGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzUGljdHVyZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc1BpY3R1cmVGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0UmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NDb21wcmVzc1BpY3R1cmVGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlZk51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKICNpZm5kZWYgU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ0NvbXByZXNzU2VxdWVuY2VCZWdpbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlQaXhNYXBIYW5kbGUgc3JjOwotCVJlY3Qgc3JjUmVjdDsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbgotCVB5TWFjX1BSRUNIRUNLKFNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VCZWdpbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRlc2MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0JUmVjdCBzcmNSZWN0OwotCUhhbmRsZSBkYXRhOwotCWxvbmcgZGF0YVNpemU7Ci0Jc2hvcnQgbm90U3luY0ZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUGl4TWFwSGFuZGxlIHNyYzsKKyAgICBSZWN0IHNyY1JlY3Q7CisgICAgSGFuZGxlIGRhdGE7CisgICAgbG9uZyBkYXRhU2l6ZTsKKyAgICBzaG9ydCBub3RTeW5jRmxhZzsKICNpZm5kZWYgU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUKLQlQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VGcmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmc3JjUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vdFN5bmNGbGFnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplLAotCSAgICAgICAgICAgICAgICAgICAgIG5vdFN5bmNGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZzcmNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm90U3luY0ZsYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbm90U3luY0ZsYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDQ29tcHJlc3NTZXF1ZW5jZUVuZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKICNpZm5kZWYgU0NDb21wcmVzc1NlcXVlbmNlRW5kCi0JUHlNYWNfUFJFQ0hFQ0soU0NDb21wcmVzc1NlcXVlbmNlRW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0NvbXByZXNzU2VxdWVuY2VFbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUVuZChjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQ29tcHJlc3NTZXF1ZW5jZUVuZChjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpY0hhbmRsZSBzcmNQaWN0dXJlOwotCXNob3J0IG1vdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBQaWNIYW5kbGUgc3JjUGljdHVyZTsKKyAgICBzaG9ydCBtb3Rpb247CiAjaWZuZGVmIFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGljdHVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlzaG9ydCBzcmNSZWY7Ci0Jc2hvcnQgbW90aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIHNob3J0IHNyY1JlZjsKKyAgICBzaG9ydCBtb3Rpb247CiAjaWZuZGVmIFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDRGVmYXVsdFBpeE1hcFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCVBpeE1hcEhhbmRsZSBzcmM7Ci0Jc2hvcnQgbW90aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIFBpeE1hcEhhbmRsZSBzcmM7CisgICAgc2hvcnQgbW90aW9uOwogI2lmbmRlZiBTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNDRGVmYXVsdFBpeE1hcFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0RlZmF1bHRQaXhNYXBTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDRGVmYXVsdFBpeE1hcFNldHRpbmdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW90aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NHZXRJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGNpOwotCU9TVHlwZSBpbmZvVHlwZTsKLQl2b2lkICogaW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBPU1R5cGUgaW5mb1R5cGU7CisgICAgdm9pZCAqIGluZm87CiAjaWZuZGVmIFNDR2V0SW5mbwotCVB5TWFjX1BSRUNIRUNLKFNDR2V0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NHZXRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9UeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNDR2V0SW5mbyhjaSwKLQkgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgIGluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDR2V0SW5mbyhjaSwKKyAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgIGluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDU2V0SW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlPU1R5cGUgaW5mb1R5cGU7Ci0Jdm9pZCAqIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvOwogI2lmbmRlZiBTQ1NldEluZm8KLQlQeU1hY19QUkVDSEVDSyhTQ1NldEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0SW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ1NldEluZm8oY2ksCi0JICAgICAgICAgICAgICAgIGluZm9UeXBlLAotCSAgICAgICAgICAgICAgICBpbmZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ1NldEluZm8oY2ksCisgICAgICAgICAgICAgICAgICAgIGluZm9UeXBlLAorICAgICAgICAgICAgICAgICAgICBpbmZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TQ1NldENvbXByZXNzRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTQ1NldENvbXByZXNzRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTQ1NldENvbXByZXNzRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDU2V0Q29tcHJlc3NGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0NTZXRDb21wcmVzc0ZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDU2V0Q29tcHJlc3NGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0Q29tcHJlc3NGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBjaTsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGNpOworICAgIGxvbmcgZmxhZ3M7CiAjaWZuZGVmIFNDR2V0Q29tcHJlc3NGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNDR2V0Q29tcHJlc3NGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0NHZXRDb21wcmVzc0ZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0dldENvbXByZXNzRmxhZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTQ0dldENvbXByZXNzRmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NDR2V0U2V0dGluZ3NBc1RleHQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7Ci0JSGFuZGxlIHRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgSGFuZGxlIHRleHQ7CiAjaWZuZGVmIFNDR2V0U2V0dGluZ3NBc1RleHQKLQlQeU1hY19QUkVDSEVDSyhTQ0dldFNldHRpbmdzQXNUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTQ0dldFNldHRpbmdzQXNUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0dldFNldHRpbmdzQXNUZXh0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB0ZXh0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0NHZXRTZXR0aW5nc0FzVGV4dChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGV4dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0NBc3luY0lkbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2k7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgY2k7CiAjaWZuZGVmIFNDQXN5bmNJZGxlCi0JUHlNYWNfUFJFQ0hFQ0soU0NBc3luY0lkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNDQXN5bmNJZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTQ0FzeW5jSWRsZShjaSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNDQXN5bmNJZGxlKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Ud2VlbmVyUmVzZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHdlZW5lckNvbXBvbmVudCB0YzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUd2VlbmVyQ29tcG9uZW50IHRjOwogI2lmbmRlZiBUd2VlbmVyUmVzZXQKLQlQeU1hY19QUkVDSEVDSyhUd2VlbmVyUmVzZXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFR3ZWVuZXJSZXNldCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHdlZW5lclJlc2V0KHRjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHdlZW5lclJlc2V0KHRjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UQ0dldFNvdXJjZVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlckVycm9yIF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIOwotCVVzZXJEYXRhIHNyZWZIOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGVyRXJyb3IgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEg7CisgICAgVXNlckRhdGEgc3JlZkg7CiAjaWZuZGVmIFRDR2V0U291cmNlUmVmCi0JUHlNYWNfUFJFQ0hFQ0soVENHZXRTb3VyY2VSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKFRDR2V0U291cmNlUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RIKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENHZXRTb3VyY2VSZWYobWgsCi0JICAgICAgICAgICAgICAgICAgICAgdGNkSCwKLQkgICAgICAgICAgICAgICAgICAgICAmc3JlZkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHNyZWZIKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGNkSCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRDR2V0U291cmNlUmVmKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRjZEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNyZWZIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCBzcmVmSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVENTZXRTb3VyY2VSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZXJFcnJvciBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVDb2RlRGVzY3JpcHRpb25IYW5kbGUgdGNkSDsKLQlVc2VyRGF0YSBzcmVmSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlckVycm9yIF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIOworICAgIFVzZXJEYXRhIHNyZWZIOwogI2lmbmRlZiBUQ1NldFNvdXJjZVJlZgotCVB5TWFjX1BSRUNIRUNLKFRDU2V0U291cmNlUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUQ1NldFNvdXJjZVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RILAotCSAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmc3JlZkgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUQ1NldFNvdXJjZVJlZihtaCwKLQkgICAgICAgICAgICAgICAgICAgICB0Y2RILAotCSAgICAgICAgICAgICAgICAgICAgIHNyZWZIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0Y2RILAorICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmc3JlZkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUQ1NldFNvdXJjZVJlZihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Y2RILAorICAgICAgICAgICAgICAgICAgICAgICAgIHNyZWZIKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UQ1NldFRpbWVDb2RlRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZXJFcnJvciBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBmbGFnc01hc2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZXJFcnJvciBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmxhZ3M7CisgICAgbG9uZyBmbGFnc01hc2s7CiAjaWZuZGVmIFRDU2V0VGltZUNvZGVGbGFncwotCVB5TWFjX1BSRUNIRUNLKFRDU2V0VGltZUNvZGVGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVENTZXRUaW1lQ29kZUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENTZXRUaW1lQ29kZUZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRDU2V0VGltZUNvZGVGbGFncyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVENHZXRUaW1lQ29kZUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGVyRXJyb3IgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGVyRXJyb3IgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBUQ0dldFRpbWVDb2RlRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhUQ0dldFRpbWVDb2RlRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFRDR2V0VGltZUNvZGVGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVENHZXRUaW1lQ29kZUZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVENHZXRUaW1lQ29kZUZsYWdzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YUg7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFIOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIHRhcmdldFRyYWNrOworICAgIFRyYWNrIHVzZWRUcmFjazsKKyAgICBUaW1lVmFsdWUgYXRUaW1lOworICAgIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0SGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0SGFuZGxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJnRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0SGFuZGxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9OZXcsIHVzZWRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRlNTcGVjIHRoZUZpbGU7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgVHJhY2sgdGFyZ2V0VHJhY2s7CisgICAgVHJhY2sgdXNlZFRyYWNrOworICAgIFRpbWVWYWx1ZSBhdFRpbWU7CisgICAgVGltZVZhbHVlIGFkZGVkRHVyYXRpb247CisgICAgbG9uZyBpbkZsYWdzOworICAgIGxvbmcgb3V0RmxhZ3M7CiAjaWZuZGVmIE1vdmllSW1wb3J0RmlsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRGaWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRGaWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgVGltZVNjYWxlIHNjYWxlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCU9TVHlwZSBtZWRpYVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmbWVkaWFUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0TWVkaWFGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUFsaWFzSGFuZGxlIGFsaWFzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEFsaWFzSGFuZGxlIGFsaWFzOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldE1lZGlhRmlsZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0TWVkaWFGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE1lZGlhRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYWxpYXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldE1lZGlhRmlsZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFsaWFzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRNZWRpYUZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0RGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgRml4ZWQgd2lkdGg7CisgICAgRml4ZWQgaGVpZ2h0OwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmhlaWdodCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRDaHVua1NpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBjaHVua1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBjaHVua1NpemU7CiAjaWZuZGVmIE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRDaHVua1NpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2h1bmtTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRDaHVua1NpemUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNodW5rU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0Q2h1bmtTaXplKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhOwotCU9TVHlwZSBoYW5kbGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhOworICAgIE9TVHlwZSBoYW5kbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZoYW5kbGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldEZyb21TY3JhcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGZyb21TY3JhcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGZyb21TY3JhcDsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldEZyb21TY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXRGcm9tU2NyYXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZmcm9tU2NyYXApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldEZyb21TY3JhcChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tU2NyYXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbVNjcmFwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVNjcmFwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydERvVXNlckRpYWxvZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKLQlIYW5kbGUgdGhlRGF0YTsKLQlCb29sZWFuIGNhbmNlbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIEhhbmRsZSB0aGVEYXRhOworICAgIEJvb2xlYW4gY2FuY2VsZWQ7CiAjaWZuZGVmIE1vdmllSW1wb3J0RG9Vc2VyRGlhbG9nCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnREb1VzZXJEaWFsb2cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RG9Vc2VyRGlhbG9nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydERvVXNlckRpYWxvZyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5jZWxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydERvVXNlckRpYWxvZyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW5jZWxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0U2V0RHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFRpbWVWYWx1ZSBkdXJhdGlvbjsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXREdXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0RHVyYXRpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0U2V0RHVyYXRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0U2V0RHVyYXRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgYXV4VHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgYXV4VHlwZTsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXV4VHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBhdXhUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdXhUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGF1eFR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JRlNTcGVjIHRoZUZpbGU7Ci0JSGFuZGxlIHRoZURhdGE7Ci0JQm9vbGVhbiB2YWxpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBGU1NwZWMgdGhlRmlsZTsKKyAgICBIYW5kbGUgdGhlRGF0YTsKKyAgICBCb29sZWFuIHZhbGlkOwogI2lmbmRlZiBNb3ZpZUltcG9ydFZhbGlkYXRlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVEYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRWYWxpZGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVGaWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZ0aGVGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldEZpbGVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRGaWxlVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRGaWxlVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0RmlsZVR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgdGFyZ2V0VHJhY2s7Ci0JVHJhY2sgdXNlZFRyYWNrOwotCVRpbWVWYWx1ZSBhdFRpbWU7Ci0JVGltZVZhbHVlIGFkZGVkRHVyYXRpb247Ci0JbG9uZyBpbkZsYWdzOwotCWxvbmcgb3V0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIHRhcmdldFRyYWNrOworICAgIFRyYWNrIHVzZWRUcmFjazsKKyAgICBUaW1lVmFsdWUgYXRUaW1lOworICAgIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydERhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmdGFyZ2V0VHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnREYXRhUmVmKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBhdFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRlZER1cmF0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX05ldywgdXNlZFRyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgIGFkZGVkRHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrT2JqX0NvbnZlcnQsICZ0YXJnZXRUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydERhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZGVkRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfTmV3LCB1c2VkVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwotCU9TVHlwZSBtZWRpYVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYzsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYywKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisgICAgdW5zaWduZWQgbG9uZyBsaW1pdDsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdAotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpbWl0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0Jd2lkZSBvZmZzZXQ7Ci0Jd2lkZSBsaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICB3aWRlIG9mZnNldDsKKyAgICB3aWRlIGxpbWl0OwogI2lmbmRlZiBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmxpbWl0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgaW5GbGFnczsKLQlsb25nIG91dEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW5GbGFnczsKKyAgICBsb25nIG91dEZsYWdzOwogI2lmbmRlZiBNb3ZpZUltcG9ydElkbGUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydElkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0SWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydElkbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZvdXRGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0SWRsZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCVVJbnQ4IHZhbGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBVSW50OCB2YWxpZDsKICNpZm5kZWYgTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxpZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsaWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEdldExvYWRTdGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlsb25nIGltcG9ydGVyTG9hZFN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgaW1wb3J0ZXJMb2FkU3RhdGU7CiAjaWZuZGVmIE1vdmllSW1wb3J0R2V0TG9hZFN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0TG9hZFN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydEdldExvYWRTdGF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1wb3J0ZXJMb2FkU3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGltcG9ydGVyTG9hZFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltcG9ydGVyTG9hZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlckxvYWRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllSW1wb3J0Q29tcG9uZW50IGNpOwotCVRpbWVWYWx1ZSB0aW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIFRpbWVWYWx1ZSB0aW1lOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlUaW1lUmVjb3JkIHRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgVGltZVJlY29yZCB0aW1lOwogI2lmbmRlZiBNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFF0VGltZVJlY29yZF9OZXcsICZ0aW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldERvbnRCbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGRvbnRCbG9jazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGRvbnRCbG9jazsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXREb250QmxvY2sKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldERvbnRCbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXREb250QmxvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZkb250QmxvY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldERvbnRCbG9jayhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb250QmxvY2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9udEJsb2NrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXREb250QmxvY2soY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9udEJsb2NrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydEdldERvbnRCbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIHdpbGxCbG9jazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIHdpbGxCbG9jazsKICNpZm5kZWYgTW92aWVJbXBvcnRHZXREb250QmxvY2sKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydEdldERvbnRCbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREb250QmxvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllSW1wb3J0R2V0RG9udEJsb2NrKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWxsQmxvY2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdpbGxCbG9jayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllSW1wb3J0R2V0RG9udEJsb2NrKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWxsQmxvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGxCbG9jayk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlJZGxlTWFuYWdlciBpbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcgotCVB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBuZXdNb3ZpZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllSW1wb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbmV3TW92aWVGbGFnczsKICNpZm5kZWYgTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdNb3ZpZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNb3ZpZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld01vdmllRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01vdmllRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgbWVkaWFUeXBlOwogI2lmbmRlZiBNb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFRvSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhSDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhSDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBNb3ZpZUV4cG9ydFRvSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0hhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0hhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0VG9IYW5kbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0VG9IYW5kbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFRvRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlGU1NwZWMgdGhlRmlsZTsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEZTU3BlYyB0aGVGaWxlOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CiAjaWZuZGVmIE1vdmllRXhwb3J0VG9GaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRUb0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9GaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRUb0ZpbGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmdGhlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRUb0ZpbGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlIYW5kbGUgZGF0YUg7Ci0JT1NUeXBlIGhhbmRsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTW92aWVFeHBvcnRDb21wb25lbnQgY2k7CisgICAgSGFuZGxlIGRhdGFIOworICAgIE9TVHlwZSBoYW5kbGVUeXBlOwogI2lmbmRlZiBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBoYW5kbGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YUgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBoYW5kbGVUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCVNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7Ci0JT1NUeXBlIG1lZGlhVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CiAjaWZuZGVmIE1vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJm1lZGlhVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24oY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZtZWRpYVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnREb1VzZXJEaWFsb2coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlUaW1lVmFsdWUgc3RhcnRUaW1lOwotCVRpbWVWYWx1ZSBkdXJhdGlvbjsKLQlCb29sZWFuIGNhbmNlbGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgVGltZVZhbHVlIHN0YXJ0VGltZTsKKyAgICBUaW1lVmFsdWUgZHVyYXRpb247CisgICAgQm9vbGVhbiBjYW5jZWxlZDsKICNpZm5kZWYgTW92aWVFeHBvcnREb1VzZXJEaWFsb2cKLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydERvVXNlckRpYWxvZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnREb1VzZXJEaWFsb2cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnREb1VzZXJEaWFsb2coY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmNlbGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjYW5jZWxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnREb1VzZXJEaWFsb2coY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbmNlbGVkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgY3JlYXRvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgY3JlYXRvcjsKICNpZm5kZWYgTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3JlYXRvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjcmVhdG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmVhdG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNyZWF0b3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0VG9EYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1vdmllRXhwb3J0Q29tcG9uZW50IGNpOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlUcmFjayBvbmx5VGhpc1RyYWNrOwotCVRpbWVWYWx1ZSBzdGFydFRpbWU7Ci0JVGltZVZhbHVlIGR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBUcmFjayBvbmx5VGhpc1RyYWNrOworICAgIFRpbWVWYWx1ZSBzdGFydFRpbWU7CisgICAgVGltZVZhbHVlIGR1cmF0aW9uOwogI2lmbmRlZiBNb3ZpZUV4cG9ydFRvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VG9EYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydFRvRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfQ29udmVydCwgJnRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICBUcmFja09ial9Db252ZXJ0LCAmb25seVRoaXNUcmFjaywKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTW92aWVFeHBvcnRUb0RhdGFSZWYoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0VG9EYXRhUmVmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seVRoaXNUcmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKICNpZm5kZWYgTW92aWVFeHBvcnRGcm9tUHJvY2VkdXJlc1RvRGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0VmFsaWRhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTW92aWVFeHBvcnRDb21wb25lbnQgY2k7Ci0JTW92aWUgdGhlTW92aWU7Ci0JVHJhY2sgb25seVRoaXNUcmFjazsKLQlCb29sZWFuIHZhbGlkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE1vdmllIHRoZU1vdmllOworICAgIFRyYWNrIG9ubHlUaGlzVHJhY2s7CisgICAgQm9vbGVhbiB2YWxpZDsKICNpZm5kZWYgTW92aWVFeHBvcnRWYWxpZGF0ZQotCVB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VmFsaWRhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0VmFsaWRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydFZhbGlkYXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2tPYmpfQ29udmVydCwgJm9ubHlUaGlzVHJhY2spKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydFZhbGlkYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5VGhpc1RyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbGlkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgZXh0ZW5zaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBleHRlbnNpb247CiAjaWZuZGVmIE1vdmllRXhwb3J0R2V0RmlsZU5hbWVFeHRlbnNpb24KLQlQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuc2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBleHRlbnNpb24pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dGVuc2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBleHRlbnNpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlTdHIyNTUgdHlwZVN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBTdHIyNTUgdHlwZVN0cmluZzsKICNpZm5kZWYgTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHR5cGVTdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmcoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVTdHJpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0eXBlU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlU3RyaW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNb3ZpZUV4cG9ydENvbXBvbmVudCBjaTsKLQlPU1R5cGUgbWVkaWFUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1vdmllRXhwb3J0Q29tcG9uZW50IGNpOworICAgIE9TVHlwZSBtZWRpYVR5cGU7CiAjaWZuZGVmIE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soTW92aWVFeHBvcnRHZXRTb3VyY2VNZWRpYVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG1lZGlhVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgbWVkaWFUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbW92aWVUaW1lRnJhY3Rpb247CiAjaWZuZGVmIFRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vdmllVGltZUZyYWN0aW9uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtb3ZpZVRpbWVGcmFjdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllVGltZUZyYWN0aW9uKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgbW92aWVUaW1lRnJhY3Rpb247CiAjaWZuZGVmIFRleHRFeHBvcnRTZXRUaW1lRnJhY3Rpb24KLQlQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVUaW1lRnJhY3Rpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW92aWVUaW1lRnJhY3Rpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92aWVUaW1lRnJhY3Rpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1RleHRFeHBvcnRHZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUZXh0RXhwb3J0Q29tcG9uZW50IGNpOwotCWxvbmcgc2V0dGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUZXh0RXhwb3J0Q29tcG9uZW50IGNpOworICAgIGxvbmcgc2V0dGluZzsKICNpZm5kZWYgVGV4dEV4cG9ydEdldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydEdldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUZXh0RXhwb3J0R2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRFeHBvcnRHZXRTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUZXh0RXhwb3J0R2V0U2V0dGluZ3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UZXh0RXhwb3J0U2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIHNldHRpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIHNldHRpbmc7CiAjaWZuZGVmIFRleHRFeHBvcnRTZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFRleHRFeHBvcnRTZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVGV4dEV4cG9ydFNldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRleHRFeHBvcnRTZXRTZXR0aW5ncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVGV4dEV4cG9ydFNldFNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NSURJSW1wb3J0R2V0U2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKLQlsb25nIHNldHRpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVGV4dEV4cG9ydENvbXBvbmVudCBjaTsKKyAgICBsb25nIHNldHRpbmc7CiAjaWZuZGVmIE1JRElJbXBvcnRHZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKE1JRElJbXBvcnRHZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTUlESUltcG9ydEdldFNldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNSURJSW1wb3J0R2V0U2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTUlESUltcG9ydEdldFNldHRpbmdzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTUlESUltcG9ydFNldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVRleHRFeHBvcnRDb21wb25lbnQgY2k7Ci0JbG9uZyBzZXR0aW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFRleHRFeHBvcnRDb21wb25lbnQgY2k7CisgICAgbG9uZyBzZXR0aW5nOwogI2lmbmRlZiBNSURJSW1wb3J0U2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhNSURJSW1wb3J0U2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKE1JRElJbXBvcnRTZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNSURJSW1wb3J0U2V0U2V0dGluZ3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2V0dGluZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1JRElJbXBvcnRTZXRTZXR0aW5ncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaTsKKyAgICBCb29sZWFuIGVuYWJsZTsKICNpZm5kZWYgR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2k7Ci0JQm9vbGVhbiBlbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIEdyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQKLQlQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZW5hYmxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUHJldmlld1Nob3dEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCXBub3RDb21wb25lbnQgcDsKLQlPU1R5cGUgZGF0YVR5cGU7Ci0JSGFuZGxlIGRhdGE7Ci0JUmVjdCBpbkhlcmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgcG5vdENvbXBvbmVudCBwOworICAgIE9TVHlwZSBkYXRhVHlwZTsKKyAgICBIYW5kbGUgZGF0YTsKKyAgICBSZWN0IGluSGVyZTsKICNpZm5kZWYgUHJldmlld1Nob3dEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soUHJldmlld1Nob3dEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcmV2aWV3U2hvd0RhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5IZXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld1Nob3dEYXRhKHAsCi0JICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5IZXJlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpbkhlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBQcmV2aWV3U2hvd0RhdGEocCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhlcmUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlwbm90Q29tcG9uZW50IHA7Ci0JT1NUeXBlIHByZXZpZXdUeXBlOwotCXNob3J0IHJlc0lEOwotCUZTU3BlYyBzb3VyY2VGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIHBub3RDb21wb25lbnQgcDsKKyAgICBPU1R5cGUgcHJldmlld1R5cGU7CisgICAgc2hvcnQgcmVzSUQ7CisgICAgRlNTcGVjIHNvdXJjZUZpbGU7CiAjaWZuZGVmIFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzb3VyY2VGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRmlsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgcHJldmlld1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzb3VyY2VGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlKHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2aWV3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc291cmNlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgcHJldmlld1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ByZXZpZXdFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlwbm90Q29tcG9uZW50IHA7Ci0JRXZlbnRSZWNvcmQgZTsKLQlCb29sZWFuIGhhbmRsZWRFdmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBwbm90Q29tcG9uZW50IHA7CisgICAgRXZlbnRSZWNvcmQgZTsKKyAgICBCb29sZWFuIGhhbmRsZWRFdmVudDsKICNpZm5kZWYgUHJldmlld0V2ZW50Ci0JUHlNYWNfUFJFQ0hFQ0soUHJldmlld0V2ZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQcmV2aWV3RXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUHJldmlld0V2ZW50KHAsCi0JICAgICAgICAgICAgICAgICAgICZlLAotCSAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZlLAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWRFdmVudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUHJldmlld0V2ZW50KHAsCisgICAgICAgICAgICAgICAgICAgICAgICZlLAorICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRXZlbnRSZWNvcmQsICZlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWRFdmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUNvZGVjRGVjb21wcmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0Jdm9pZCAqIHNyY0RhdGE7Ci0JVUludDMyIHNyY1NpemU7Ci0Jdm9pZCAqIGRzdERhdGE7Ci0JVUludDMyIGRzdEJ1ZmZlclNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOworICAgIHZvaWQgKiBzcmNEYXRhOworICAgIFVJbnQzMiBzcmNTaXplOworICAgIHZvaWQgKiBkc3REYXRhOworICAgIFVJbnQzMiBkc3RCdWZmZXJTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNEZWNvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRGVjb21wcmVzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRGVjb21wcmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnNsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcmNTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0RGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRzdEJ1ZmZlclNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNEZWNvbXByZXNzKGRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUNvZGVjRGVjb21wcmVzcyhkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlclNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0JVUludDMyIHNyY1NpemU7Ci0JVUludDMyIGRzdFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOworICAgIFVJbnQzMiBzcmNTaXplOworICAgIFVJbnQzMiBkc3RTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUoZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkc3RTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhQ29kZWNDb21wcmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7Ci0Jdm9pZCAqIHNyY0RhdGE7Ci0JVUludDMyIHNyY1NpemU7Ci0Jdm9pZCAqIGRzdERhdGE7Ci0JVUludDMyIGRzdEJ1ZmZlclNpemU7Ci0JVUludDMyIGFjdHVhbERzdFNpemU7Ci0JVUludDMyIGRlY29tcHJlc3NTbG9wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFDb2RlY0NvbXBvbmVudCBkYzsKKyAgICB2b2lkICogc3JjRGF0YTsKKyAgICBVSW50MzIgc3JjU2l6ZTsKKyAgICB2b2lkICogZHN0RGF0YTsKKyAgICBVSW50MzIgZHN0QnVmZmVyU2l6ZTsKKyAgICBVSW50MzIgYWN0dWFsRHN0U2l6ZTsKKyAgICBVSW50MzIgZGVjb21wcmVzc1Nsb3A7CiAjaWZuZGVmIERhdGFDb2RlY0NvbXByZXNzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjQ29tcHJlc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0NvbXByZXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2xzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3JjRGF0YSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNyY1NpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHN0QnVmZmVyU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFDb2RlY0NvbXByZXNzKGRjLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgc3JjU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBkc3REYXRhLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGRzdEJ1ZmZlclNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbERzdFNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmRlY29tcHJlc3NTbG9wKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRHN0U2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICBkZWNvbXByZXNzU2xvcCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3RCdWZmZXJTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUNvZGVjQ29tcHJlc3MoZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsRHN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjb21wcmVzc1Nsb3ApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxEc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcHJlc3NTbG9wKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUNvZGVjQ29tcG9uZW50IGRjOwotCXVuc2lnbmVkIGxvbmcgbWF4U3JjU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhQ29kZWNDb21wb25lbnQgZGM7CisgICAgdW5zaWduZWQgbG9uZyBtYXhTcmNTaXplOwogI2lmbmRlZiBEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUKLQlQeU1hY19QUkVDSEVDSyhEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1NpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUoZGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFNyY1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4U3JjU2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZShkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3JjU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhQ29kZWNDb21wb25lbnQgZGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUNvZGVjQ29tcG9uZW50IGRjOwogI2lmbmRlZiBEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZShkYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFDb2RlY0VuZEludGVycnVwdFNhZmUoZGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgaDsKLQlsb25nIGhPZmZzZXQ7Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBoOworICAgIGxvbmcgaE9mZnNldDsKKyAgICBsb25nIG9mZnNldDsKKyAgICBsb25nIHNpemU7CiAjaWZuZGVmIERhdGFIR2V0RGF0YQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGF0YShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFB1dERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGg7Ci0JbG9uZyBoT2Zmc2V0OwotCWxvbmcgb2Zmc2V0OwotCWxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgaDsKKyAgICBsb25nIGhPZmZzZXQ7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBzaXplOwogI2lmbmRlZiBEYXRhSFB1dERhdGEKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFB1dERhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUHV0RGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoLAotCSAgICAgICAgICAgICAgICAgICAgICAmaE9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFB1dERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgIGgsCi0JICAgICAgICAgICAgICAgICAgIGhPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgIHNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhQdXREYXRhKGRoLAorICAgICAgICAgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgICAgICAgICBoT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIRmx1c2hEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSEZsdXNoRGF0YQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRmx1c2hEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEZsdXNoRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhGbHVzaERhdGEoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEZsdXNoRGF0YShkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhPcGVuRm9yV3JpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIT3BlbkZvcldyaXRlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhPcGVuRm9yV3JpdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIT3BlbkZvcldyaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSE9wZW5Gb3JXcml0ZShkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIT3BlbkZvcldyaXRlKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENsb3NlRm9yV3JpdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIQ2xvc2VGb3JXcml0ZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIQ2xvc2VGb3JXcml0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhDbG9zZUZvcldyaXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENsb3NlRm9yV3JpdGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENsb3NlRm9yV3JpdGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIT3BlbkZvclJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIT3BlbkZvclJlYWQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSE9wZW5Gb3JSZWFkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSE9wZW5Gb3JSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSE9wZW5Gb3JSZWFkKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhPcGVuRm9yUmVhZChkaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDbG9zZUZvclJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIQ2xvc2VGb3JSZWFkCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDbG9zZUZvclJlYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ2xvc2VGb3JSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENsb3NlRm9yUmVhZChkaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ2xvc2VGb3JSZWFkKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFNldERhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGRhdGFSZWY7CiAjaWZuZGVmIERhdGFIU2V0RGF0YVJlZgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXREYXRhUmVmKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0RGF0YVJlZihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREYXRhUmVmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBkYXRhUmVmOwogI2lmbmRlZiBEYXRhSEdldERhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXREYXRhUmVmKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhDb21wYXJlRGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgZGF0YVJlZjsKLQlCb29sZWFuIGVxdWFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIEJvb2xlYW4gZXF1YWw7CiAjaWZuZGVmIERhdGFIQ29tcGFyZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENvbXBhcmVEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENvbXBhcmVEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDb21wYXJlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZXF1YWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGVxdWFsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ29tcGFyZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOwogI2lmbmRlZiBEYXRhSFRhc2sKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFRhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIVGFzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhUYXNrKGRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhUYXNrKGRoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEZpbmlzaERhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JUHRyIFBsYWNlVG9QdXREYXRhUHRyOwotCUJvb2xlYW4gQ2FuY2VsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFB0ciBQbGFjZVRvUHV0RGF0YVB0cjsKKyAgICBCb29sZWFuIENhbmNlbDsKICNpZm5kZWYgRGF0YUhGaW5pc2hEYXRhCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhGaW5pc2hEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEZpbmlzaERhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmUGxhY2VUb1B1dERhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZDYW5jZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEZpbmlzaERhdGEoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFBsYWNlVG9QdXREYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgICBDYW5jZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlBsYWNlVG9QdXREYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2FuY2VsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhGaW5pc2hEYXRhKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFjZVRvUHV0RGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuY2VsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEZsdXNoQ2FjaGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIRmx1c2hDYWNoZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRmx1c2hDYWNoZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhGbHVzaENhY2hlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEZsdXNoQ2FjaGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEZsdXNoQ2FjaGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUmVzb2x2ZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIHRoZURhdGFSZWY7Ci0JQm9vbGVhbiB3YXNDaGFuZ2VkOwotCUJvb2xlYW4gdXNlckludGVyZmFjZUFsbG93ZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIHRoZURhdGFSZWY7CisgICAgQm9vbGVhbiB3YXNDaGFuZ2VkOworICAgIEJvb2xlYW4gdXNlckludGVyZmFjZUFsbG93ZWQ7CiAjaWZuZGVmIERhdGFIUmVzb2x2ZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFJlc29sdmVEYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFJlc29sdmVEYXRhUmVmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZXJJbnRlcmZhY2VBbGxvd2VkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhSZXNvbHZlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzQ2hhbmdlZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJJbnRlcmZhY2VBbGxvd2VkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNDaGFuZ2VkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZURhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VySW50ZXJmYWNlQWxsb3dlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUmVzb2x2ZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndhc0NoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW50ZXJmYWNlQWxsb3dlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2FzQ2hhbmdlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRGaWxlU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIR2V0RmlsZVNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEZpbGVTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVTaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmaWxlU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RmlsZVNpemUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENhblVzZURhdGFSZWYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JbG9uZyB1c2VGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBsb25nIHVzZUZsYWdzOwogI2lmbmRlZiBEYXRhSENhblVzZURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENhblVzZURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ2FuVXNlRGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIQ2FuVXNlRGF0YVJlZihkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnVzZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB1c2VGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENhblVzZURhdGFSZWYoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmxhZ3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUHJlZXh0ZW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXVuc2lnbmVkIGxvbmcgbWF4VG9BZGQ7Ci0JdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHVuc2lnbmVkIGxvbmcgbWF4VG9BZGQ7CisgICAgdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkOwogI2lmbmRlZiBEYXRhSFByZWV4dGVuZAotCVB5TWFjX1BSRUNIRUNLKERhdGFIUHJlZXh0ZW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFByZWV4dGVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFRvQWRkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhQcmVleHRlbmQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgbWF4VG9BZGQsCi0JICAgICAgICAgICAgICAgICAgICAgJnNwYWNlQWRkZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwYWNlQWRkZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4VG9BZGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFByZWV4dGVuZChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUb0FkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2VBZGRlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VBZGRlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRGaWxlU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIU2V0RmlsZVNpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldEZpbGVTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldEZpbGVTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldEZpbGVTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldEZpbGVTaXplKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RnJlZVNwYWNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXVuc2lnbmVkIGxvbmcgZnJlZVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgdW5zaWduZWQgbG9uZyBmcmVlU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRGcmVlU3BhY2UKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZyZWVTcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RnJlZVNwYWNlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZnJlZVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZyZWVTcGFjZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJlZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSENyZWF0ZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JQm9vbGVhbiBkZWxldGVFeGlzdGluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOwogI2lmbmRlZiBEYXRhSENyZWF0ZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSENyZWF0ZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQ3JlYXRlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSENyZWF0ZUZpbGUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUV4aXN0aW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSENyZWF0ZUZpbGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUV4aXN0aW5nKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGJsb2NrU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGJsb2NrU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0UHJlZmVycmVkQmxvY2tTaXplKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibG9ja1NpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXREZXZpY2VJbmRleChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGRldmljZUluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgZGV2aWNlSW5kZXg7CiAjaWZuZGVmIERhdGFIR2V0RGV2aWNlSW5kZXgKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERldmljZUluZGV4KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERldmljZUluZGV4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERldmljZUluZGV4KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGV2aWNlSW5kZXgoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlSW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JQm9vbGVhbiB5ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgQm9vbGVhbiB5ZXM7CiAjaWZuZGVmIERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcgotCVB5TWFjX1BSRUNIRUNLKERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHllcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnllcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgeWVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFJbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIHN0YXJ0T2Zmc2V0OwotCWxvbmcgc2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIHN0YXJ0T2Zmc2V0OworICAgIGxvbmcgc2l6ZTsKICNpZm5kZWYgRGF0YUhHZXREYXRhSW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFJbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhSW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGFydE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RGF0YUluQnVmZmVyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0T2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhSW5CdWZmZXIoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBtaWxsaXNlY3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBtaWxsaXNlY3M7CiAjaWZuZGVmIERhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpc2Vjcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRDYWNoZVNpemVMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlTaXplIGNhY2hlU2l6ZUxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFNpemUgY2FjaGVTaXplTGltaXQ7CiAjaWZuZGVmIERhdGFIU2V0Q2FjaGVTaXplTGltaXQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldENhY2hlU2l6ZUxpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldENhY2hlU2l6ZUxpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmY2FjaGVTaXplTGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldENhY2hlU2l6ZUxpbWl0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FjaGVTaXplTGltaXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldENhY2hlU2l6ZUxpbWl0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0Q2FjaGVTaXplTGltaXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JU2l6ZSBjYWNoZVNpemVMaW1pdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBTaXplIGNhY2hlU2l6ZUxpbWl0OwogI2lmbmRlZiBEYXRhSEdldENhY2hlU2l6ZUxpbWl0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRDYWNoZVNpemVMaW1pdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRDYWNoZVNpemVMaW1pdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRDYWNoZVNpemVMaW1pdChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWNoZVNpemVMaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY2FjaGVTaXplTGltaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldENhY2hlU2l6ZUxpbWl0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhY2hlU2l6ZUxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVNpemVMaW1pdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgRGF0YUhHZXRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0TW92aWUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAmaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICBpZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0TW92aWUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhBZGRNb3ZpZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKICNpZm5kZWYgRGF0YUhBZGRNb3ZpZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIQWRkTW92aWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIQWRkTW92aWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmdGhlTW92aWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEFkZE1vdmllKGRoLAotCSAgICAgICAgICAgICAgICAgICAgdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAmaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQWRkTW92aWUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIVXBkYXRlTW92aWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JTW92aWUgdGhlTW92aWU7Ci0Jc2hvcnQgaWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgTW92aWUgdGhlTW92aWU7CisgICAgc2hvcnQgaWQ7CiAjaWZuZGVmIERhdGFIVXBkYXRlTW92aWUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFVwZGF0ZU1vdmllKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFVwZGF0ZU1vdmllKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhVcGRhdGVNb3ZpZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgICAgaWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhVcGRhdGVNb3ZpZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1vdmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIRG9lc0J1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlCb29sZWFuIGJ1ZmZlcnNSZWFkczsKLQlCb29sZWFuIGJ1ZmZlcnNXcml0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgQm9vbGVhbiBidWZmZXJzUmVhZHM7CisgICAgQm9vbGVhbiBidWZmZXJzV3JpdGVzOwogI2lmbmRlZiBEYXRhSERvZXNCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhEYXRhSERvZXNCdWZmZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIRG9lc0J1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhEb2VzQnVmZmVyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1JlYWRzLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1dyaXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNSZWFkcywKLQkgICAgICAgICAgICAgICAgICAgICBidWZmZXJzV3JpdGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhEb2VzQnVmZmVyKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1JlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyc1dyaXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNSZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzV3JpdGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZpbGVOYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCVN0cjI1NSBzdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgU3RyMjU1IHN0cjsKICNpZm5kZWYgRGF0YUhHZXRGaWxlTmFtZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZU5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHN0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RmlsZU5hbWUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZpbGVOYW1lKGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmlsZVNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmaWxlU2l6ZTsKICNpZm5kZWYgRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZpbGVTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNpemUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0TWFjT1NGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBEYXRhSEdldE1hY09TRmlsZVR5cGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldE1hY09TRmlsZVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TWFjT1NGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRNYWNPU0ZpbGVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZmlsZVR5cGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldE1hY09TRmlsZVR5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBmaWxlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNSU1FVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlTdHIyNTUgbWltZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgU3RyMjU1IG1pbWVUeXBlOwogI2lmbmRlZiBEYXRhSEdldE1JTUVUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRNSU1FVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRNSU1FVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbWltZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldE1JTUVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBtaW1lVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0TUlNRVR5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlIYW5kbGUgYW5jaG9yRGF0YVJlZjsKLQlPU1R5cGUgZGF0YVJlZlR5cGU7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgSGFuZGxlIGFuY2hvckRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIEhhbmRsZSBkYXRhUmVmOwogI2lmbmRlZiBEYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmFuY2hvckRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGFuY2hvckRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCUhhbmRsZSBkYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBhbmNob3JEYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBIYW5kbGUgZGF0YVJlZjsKICNpZm5kZWYgRGF0YUhHZXREYXRhUmVmV2l0aEFuY2hvcgotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JEYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0TWFjT1NGaWxlVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgZmlsZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIGZpbGVUeXBlOwogI2lmbmRlZiBEYXRhSFNldE1hY09TRmlsZVR5cGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldE1hY09TRmlsZVR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0TWFjT1NGaWxlVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRNYWNPU0ZpbGVUeXBlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0TWFjT1NGaWxlVHlwZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgVGltZUJhc2UgdGI7CiAjaWZuZGVmIERhdGFIU2V0VGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVCYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnRiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRUaW1lQmFzZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgIHRiKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0YikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIU2V0VGltZUJhc2UoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRJbmZvRmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JVUludDMyIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgRGF0YUhHZXRJbmZvRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEluZm9GbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRJbmZvRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0SW5mb0ZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEluZm9GbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEZpbGVTaXplNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jd2lkZSBmaWxlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZpbGVTaXplOwogI2lmbmRlZiBEYXRhSEdldEZpbGVTaXplNjQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldEZpbGVTaXplNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZVNpemU2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRGaWxlU2l6ZTY0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRGaWxlU2l6ZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSFByZWV4dGVuZDY0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCXdpZGUgbWF4VG9BZGQ7Ci0Jd2lkZSBzcGFjZUFkZGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHdpZGUgbWF4VG9BZGQ7CisgICAgd2lkZSBzcGFjZUFkZGVkOwogI2lmbmRlZiBEYXRhSFByZWV4dGVuZDY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQcmVleHRlbmQ2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhQcmVleHRlbmQ2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtYXhUb0FkZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUHJlZXh0ZW5kNjQoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAmbWF4VG9BZGQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2VBZGRlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2VBZGRlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWF4VG9BZGQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFByZWV4dGVuZDY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRvQWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYWNlQWRkZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIHNwYWNlQWRkZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0RmlsZVNpemU2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl3aWRlIGZpbGVTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHdpZGUgZmlsZVNpemU7CiAjaWZuZGVmIERhdGFIU2V0RmlsZVNpemU2NAotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RmlsZVNpemU2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRGaWxlU2l6ZTY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXRGaWxlU2l6ZTY0KGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJmZpbGVTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRGaWxlU2l6ZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZVNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RnJlZVNwYWNlNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jd2lkZSBmcmVlU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICB3aWRlIGZyZWVTaXplOwogI2lmbmRlZiBEYXRhSEdldEZyZWVTcGFjZTY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2U2NCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGcmVlU3BhY2U2NCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRGcmVlU3BhY2U2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmVlU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgZnJlZVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZyZWVTcGFjZTY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyZWVTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBmcmVlU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhBcHBlbmQ2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQl2b2lkICogZGF0YTsKLQl3aWRlIGZpbGVPZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIHZvaWQgKiBkYXRhOworICAgIHdpZGUgZmlsZU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIERhdGFIQXBwZW5kNjQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEFwcGVuZDY0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEFwcGVuZDY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhBcHBlbmQ2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0JICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVPZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhBcHBlbmQ2NChkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIGZpbGVPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUG9sbFJlYWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0Jdm9pZCAqIGRhdGFQdHI7Ci0JVUludDMyIGRhdGFTaXplU29GYXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgdm9pZCAqIGRhdGFQdHI7CisgICAgVUludDMyIGRhdGFTaXplU29GYXI7CiAjaWZuZGVmIERhdGFIUG9sbFJlYWQKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFBvbGxSZWFkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFBvbGxSZWFkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUG9sbFJlYWQoZGgsCi0JICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAotCSAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplU29GYXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplU29GYXIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVB0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUG9sbFJlYWQoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplU29GYXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplU29GYXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIG9mZnNldDsKLQlsb25nIGxlbjsKLQlsb25nIG1pc3Npbmdfb2Zmc2V0OwotCWxvbmcgbWlzc2luZ19sZW47CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBvZmZzZXQ7CisgICAgbG9uZyBsZW47CisgICAgbG9uZyBtaXNzaW5nX29mZnNldDsKKyAgICBsb25nIG1pc3NpbmdfbGVuOwogI2lmbmRlZiBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlzc2luZ19vZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXNzaW5nX2xlbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1pc3Npbmdfb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdfbGVuKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFBdmFpbGFiaWxpdHkoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlzc2luZ19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaXNzaW5nX2xlbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npbmdfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmdfbGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSZWZBc1R5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIHJlcXVlc3RlZFR5cGU7Ci0JSGFuZGxlIGRhdGFSZWY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIHJlcXVlc3RlZFR5cGU7CisgICAgSGFuZGxlIGRhdGFSZWY7CiAjaWZuZGVmIERhdGFIR2V0RGF0YVJlZkFzVHlwZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RGF0YVJlZkFzVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmVmQXNUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcmVxdWVzdGVkVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0RGF0YVJlZkFzVHlwZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnJlcXVlc3RlZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWZBc1R5cGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBleHRlbnNpb247Ci0JT1NUeXBlIGlkVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBIYW5kbGUgZXh0ZW5zaW9uOworICAgIE9TVHlwZSBpZFR5cGU7CiAjaWZuZGVmIERhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmV4dGVuc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaWRUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldERhdGFSZWZFeHRlbnNpb24oZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSZWZFeHRlbnNpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JSGFuZGxlIGV4dGVuc2lvbjsKLQlPU1R5cGUgaWRUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBleHRlbnNpb247CisgICAgT1NUeXBlIGlkVHlwZTsKICNpZm5kZWYgRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSZWZFeHRlbnNpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSZWZFeHRlbnNpb24oZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpZFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldERhdGFSZWZFeHRlbnNpb24oZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGV4dGVuc2lvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlNb3ZpZSB0aGVNb3ZpZTsKLQlzaG9ydCBpZDsKLQlzaG9ydCBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBNb3ZpZSB0aGVNb3ZpZTsKKyAgICBzaG9ydCBpZDsKKyAgICBzaG9ydCBmbGFnczsKICNpZm5kZWYgRGF0YUhHZXRNb3ZpZVdpdGhGbGFncwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWVXaXRoRmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0TW92aWVXaXRoRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIR2V0TW92aWVXaXRoRmxhZ3MoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlTW92aWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIHRoZU1vdmllLAotCSAgICAgICAgICAgICAgICAgICAgIGlkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVNb3ZpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX05ldywgdGhlTW92aWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIR2V0RmlsZVR5cGVPcmRlcmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlEYXRhSEZpbGVUeXBlT3JkZXJpbmdIYW5kbGUgb3JkZXJpbmdMaXN0SGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIERhdGFIRmlsZVR5cGVPcmRlcmluZ0hhbmRsZSBvcmRlcmluZ0xpc3RIYW5kbGU7CiAjaWZuZGVmIERhdGFIR2V0RmlsZVR5cGVPcmRlcmluZwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0RmlsZVR5cGVPcmRlcmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcmluZ0xpc3RIYW5kbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvcmRlcmluZ0xpc3RIYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmcoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRlcmluZ0xpc3RIYW5kbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBvcmRlcmluZ0xpc3RIYW5kbGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlPU1R5cGUgY3JlYXRvcjsKLQlCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOwotCVVJbnQzMiBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nOworICAgIFVJbnQzMiBmbGFnczsKICNpZm5kZWYgRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZWxldGVFeGlzdGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVFeGlzdGluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsZXRlRXhpc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlRXhpc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JT1NUeXBlIHdoYXQ7Ci0Jdm9pZCAqIGluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgT1NUeXBlIHdoYXQ7CisgICAgdm9pZCAqIGluZm87CiAjaWZuZGVmIERhdGFIR2V0SW5mbwotCVB5TWFjX1BSRUNIRUNLKERhdGFIR2V0SW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhHZXRJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJndoYXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRJbmZvKGRoLAotCSAgICAgICAgICAgICAgICAgICB3aGF0LAotCSAgICAgICAgICAgICAgICAgICBpbmZvKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ3aGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIR2V0SW5mbyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRJZGxlTWFuYWdlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlJZGxlTWFuYWdlciBpbTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgRGF0YUhTZXRJZGxlTWFuYWdlcgotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0SWRsZU1hbmFnZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIU2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFNldElkbGVNYW5hZ2VyKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSWRsZU1hbmFnZXJPYmpfQ29udmVydCwgJmltKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRJZGxlTWFuYWdlcihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSERlbGV0ZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CiAjaWZuZGVmIERhdGFIRGVsZXRlRmlsZQotCVB5TWFjX1BSRUNIRUNLKERhdGFIRGVsZXRlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhEZWxldGVGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSERlbGV0ZUZpbGUoZGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSERlbGV0ZUZpbGUoZGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIU2V0TW92aWVVc2FnZUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFNldE1vdmllVXNhZ2VGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0TW92aWVVc2FnZUZsYWdzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGluRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBpbkZsYWdzOwogI2lmbmRlZiBEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZihkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIGxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzOwogI2lmbmRlZiBEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VW5kZXJzdG9vZEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRVbmRlcnN0b29kRmxhZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVbmRlcnN0b29kRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dFVuZGVyc3Rvb2RGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhSZW5hbWVGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCUhhbmRsZSBuZXdEYXRhUmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIERhdGFIYW5kbGVyIGRoOworICAgIEhhbmRsZSBuZXdEYXRhUmVmOwogI2lmbmRlZiBEYXRhSFJlbmFtZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSFJlbmFtZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUmVuYW1lRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbmV3RGF0YVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIUmVuYW1lRmlsZShkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgbmV3RGF0YVJlZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm5ld0RhdGFSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFJlbmFtZUZpbGUoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RhdGFSZWYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0RhdGFIUGxheWJhY2tIaW50cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlEYXRhSGFuZGxlciBkaDsKLQlsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldDsKLQl1bnNpZ25lZCBsb25nIG1heEZpbGVPZmZzZXQ7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldDsKKyAgICB1bnNpZ25lZCBsb25nIG1heEZpbGVPZmZzZXQ7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgRGF0YUhQbGF5YmFja0hpbnRzCi0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQbGF5YmFja0hpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFBsYXliYWNrSGludHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1pbkZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFBsYXliYWNrSGludHMoZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5GaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbkZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFBsYXliYWNrSGludHMoZGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5GaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhQbGF5YmFja0hpbnRzNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmbGFnczsKLQl3aWRlIG1pbkZpbGVPZmZzZXQ7Ci0Jd2lkZSBtYXhGaWxlT2Zmc2V0OwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgRGF0YUhhbmRsZXIgZGg7CisgICAgbG9uZyBmbGFnczsKKyAgICB3aWRlIG1pbkZpbGVPZmZzZXQ7CisgICAgd2lkZSBtYXhGaWxlT2Zmc2V0OworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIERhdGFIUGxheWJhY2tIaW50czY0Ci0JUHlNYWNfUFJFQ0hFQ0soRGF0YUhQbGF5YmFja0hpbnRzNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKERhdGFIUGxheWJhY2tIaW50czY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1pbkZpbGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldHdpZGUsICZtYXhGaWxlT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSFBsYXliYWNrSGludHM2NChkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluRmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4RmlsZU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWluRmlsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1heEZpbGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IERhdGFIUGxheWJhY2tIaW50czY0KGRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5GaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhGaWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EYXRhSEdldERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCURhdGFIYW5kbGVyIGRoOwotCWxvbmcgZmxhZ3M7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIERhdGFIR2V0RGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSEdldERhdGFSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBEYXRhSEdldERhdGFSYXRlKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXNQZXJTZWNvbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyU2Vjb25kKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRGF0YUhHZXREYXRhUmF0ZShkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfRGF0YUhTZXRUaW1lSGludHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JRGF0YUhhbmRsZXIgZGg7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGJhbmR3aWR0aFByaW9yaXR5OwotCVRpbWVTY2FsZSBzY2FsZTsKLQlUaW1lVmFsdWUgbWluVGltZTsKLQlUaW1lVmFsdWUgbWF4VGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBEYXRhSGFuZGxlciBkaDsKKyAgICBsb25nIGZsYWdzOworICAgIGxvbmcgYmFuZHdpZHRoUHJpb3JpdHk7CisgICAgVGltZVNjYWxlIHNjYWxlOworICAgIFRpbWVWYWx1ZSBtaW5UaW1lOworICAgIFRpbWVWYWx1ZSBtYXhUaW1lOwogI2lmbmRlZiBEYXRhSFNldFRpbWVIaW50cwotCVB5TWFjX1BSRUNIRUNLKERhdGFIU2V0VGltZUhpbnRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEYXRhSFNldFRpbWVIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhbmR3aWR0aFByaW9yaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZtaW5UaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmbWF4VGltZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IERhdGFIU2V0VGltZUhpbnRzKGRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGJhbmR3aWR0aFByaW9yaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGltZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYW5kd2lkdGhQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWluVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBEYXRhSFNldFRpbWVIaW50cyhkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kd2lkdGhQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TWF4U3JjUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBpbnB1dFN0ZDsKLQlSZWN0IG1heFNyY1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXRTdGQ7CisgICAgUmVjdCBtYXhTcmNSZWN0OwogI2lmbmRlZiBWREdldE1heFNyY1JlY3QKLQlQeU1hY19QUkVDSEVDSyhWREdldE1heFNyY1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0TWF4U3JjUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXhTcmNSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZtYXhTcmNSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRNYXhTcmNSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heFNyY1JlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZtYXhTcmNSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEFjdGl2ZVNyY1JlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRTdGQ7Ci0JUmVjdCBhY3RpdmVTcmNSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0U3RkOworICAgIFJlY3QgYWN0aXZlU3JjUmVjdDsKICNpZm5kZWYgVkRHZXRBY3RpdmVTcmNSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRBY3RpdmVTcmNSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEFjdGl2ZVNyY1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0QWN0aXZlU3JjUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTcmNSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYWN0aXZlU3JjUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFN0ZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QWN0aXZlU3JjUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTcmNSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYWN0aXZlU3JjUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXREaWdpdGl6ZXJSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJlY3QgZGlnaXRpemVyUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBSZWN0IGRpZ2l0aXplclJlY3Q7CiAjaWZuZGVmIFZEU2V0RGlnaXRpemVyUmVjdAotCVB5TWFjX1BSRUNIRUNLKFZEU2V0RGlnaXRpemVyUmVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXREaWdpdGl6ZXJSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldERpZ2l0aXplclJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZkaWdpdGl6ZXJSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZGlnaXRpemVyUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RGlnaXRpemVyUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpZ2l0aXplclJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaWdpdGl6ZXJSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldERpZ2l0aXplclJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUmVjdCBkaWdpdGl6ZXJSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJlY3QgZGlnaXRpemVyUmVjdDsKICNpZm5kZWYgVkRHZXREaWdpdGl6ZXJSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRHZXREaWdpdGl6ZXJSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldERpZ2l0aXplclJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0RGlnaXRpemVyUmVjdChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmRpZ2l0aXplclJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZkaWdpdGl6ZXJSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXREaWdpdGl6ZXJSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlnaXRpemVyUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmRpZ2l0aXplclJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0VkJsYW5rUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBpbnB1dFN0ZDsKLQlSZWN0IHZCbGFua1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXRTdGQ7CisgICAgUmVjdCB2QmxhbmtSZWN0OwogI2lmbmRlZiBWREdldFZCbGFua1JlY3QKLQlQeU1hY19QUkVDSEVDSyhWREdldFZCbGFua1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0VkJsYW5rUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRWQmxhbmtSZWN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZCbGFua1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ2QmxhbmtSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRWQmxhbmtSZWN0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZCbGFua1JlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZ2QmxhbmtSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldE1hc2tQaXhNYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXA7CiAjaWZuZGVmIFZER2V0TWFza1BpeE1hcAotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWFza1BpeE1hcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRNYXNrUGl4TWFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZtYXNrUGl4TWFwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXNrUGl4TWFwKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICBtYXNrUGl4TWFwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbWFza1BpeE1hcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TWFza1BpeE1hcChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1BpeE1hcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRVc2VUaGlzQ0xVVChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlOwogI2lmbmRlZiBWRFVzZVRoaXNDTFVUCi0JUHlNYWNfUFJFQ0hFQ0soVkRVc2VUaGlzQ0xVVCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRVc2VUaGlzQ0xVVCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29sb3JUYWJsZUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEVXNlVGhpc0NMVVQoY2ksCi0JICAgICAgICAgICAgICAgICAgICBjb2xvclRhYmxlSGFuZGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY29sb3JUYWJsZUhhbmRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEVXNlVGhpc0NMVVQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclRhYmxlSGFuZGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldElucHV0R2FtbWFWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlGaXhlZCBjaGFubmVsMTsKLQlGaXhlZCBjaGFubmVsMjsKLQlGaXhlZCBjaGFubmVsMzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBGaXhlZCBjaGFubmVsMTsKKyAgICBGaXhlZCBjaGFubmVsMjsKKyAgICBGaXhlZCBjaGFubmVsMzsKICNpZm5kZWYgVkRTZXRJbnB1dEdhbW1hVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0R2FtbWFWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dEdhbW1hVmFsdWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZjaGFubmVsMykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0SW5wdXRHYW1tYVZhbHVlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmNoYW5uZWwzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRJbnB1dEdhbW1hVmFsdWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbDMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW5wdXRHYW1tYVZhbHVlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUZpeGVkIGNoYW5uZWwxOwotCUZpeGVkIGNoYW5uZWwyOwotCUZpeGVkIGNoYW5uZWwzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEZpeGVkIGNoYW5uZWwxOworICAgIEZpeGVkIGNoYW5uZWwyOworICAgIEZpeGVkIGNoYW5uZWwzOwogI2lmbmRlZiBWREdldElucHV0R2FtbWFWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXRHYW1tYVZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0R2FtbWFWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dEdhbW1hVmFsdWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWwxLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsMiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbDMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDEsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgY2hhbm5lbDMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0R2FtbWFWYWx1ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW5uZWwyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsMyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBjaGFubmVsMyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRCcmlnaHRuZXNzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKICNpZm5kZWYgVkRTZXRCcmlnaHRuZXNzCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRCcmlnaHRuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldEJyaWdodG5lc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0QnJpZ2h0bmVzcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEJyaWdodG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEJyaWdodG5lc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzOwogI2lmbmRlZiBWREdldEJyaWdodG5lc3MKLQlQeU1hY19QUkVDSEVDSyhWREdldEJyaWdodG5lc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0QnJpZ2h0bmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRCcmlnaHRuZXNzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnJpZ2h0bmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QnJpZ2h0bmVzcyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q29udHJhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CiAjaWZuZGVmIFZEU2V0Q29udHJhc3QKLQlQeU1hY19QUkVDSEVDSyhWRFNldENvbnRyYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldENvbnRyYXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldENvbnRyYXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0Q29udHJhc3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJhc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEh1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBodWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgaHVlOwogI2lmbmRlZiBWRFNldEh1ZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0SHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldEh1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRIdWUoY2ksCi0JICAgICAgICAgICAgICAgJmh1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRIdWUoY2ksCisgICAgICAgICAgICAgICAgICAgJmh1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFNoYXJwbmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOwogI2lmbmRlZiBWRFNldFNoYXJwbmVzcwotCVB5TWFjX1BSRUNIRUNLKFZEU2V0U2hhcnBuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFNoYXJwbmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRTaGFycG5lc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRTaGFycG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFNhdHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOwogI2lmbmRlZiBWRFNldFNhdHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhWRFNldFNhdHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0U2F0dXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRTYXR1cmF0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0U2F0dXJhdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0Q29udHJhc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7CiAjaWZuZGVmIFZER2V0Q29udHJhc3QKLQlQeU1hY19QUkVDSEVDSyhWREdldENvbnRyYXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENvbnRyYXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldENvbnRyYXN0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q29udHJhc3QoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJhc3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEh1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBodWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgaHVlOwogI2lmbmRlZiBWREdldEh1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEh1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRIdWUoY2ksCi0JICAgICAgICAgICAgICAgJmh1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRIdWUoY2ksCisgICAgICAgICAgICAgICAgICAgJmh1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaHVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFNoYXJwbmVzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOwogI2lmbmRlZiBWREdldFNoYXJwbmVzcwotCVB5TWFjX1BSRUNIRUNLKFZER2V0U2hhcnBuZXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFNoYXJwbmVzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRTaGFycG5lc3MoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRTaGFycG5lc3MoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFNhdHVyYXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOwogI2lmbmRlZiBWREdldFNhdHVyYXRpb24KLQlQeU1hY19QUkVDSEVDSyhWREdldFNhdHVyYXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0U2F0dXJhdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRTYXR1cmF0aW9uKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0U2F0dXJhdGlvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER3JhYk9uZUZyYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWREdyYWJPbmVGcmFtZQotCVB5TWFjX1BSRUNIRUNLKFZER3JhYk9uZUZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdyYWJPbmVGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHcmFiT25lRnJhbWUoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdyYWJPbmVGcmFtZShjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRNYXhBdXhCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JUGl4TWFwSGFuZGxlIHBtOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQaXhNYXBIYW5kbGUgcG07CisgICAgUmVjdCByOwogI2lmbmRlZiBWREdldE1heEF1eEJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWF4QXV4QnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldE1heEF1eEJ1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRNYXhBdXhCdWZmZXIoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgJnBtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwbSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRNYXhBdXhCdWZmZXIoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEN1cnJlbnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGlucHV0Q3VycmVudEZsYWc7Ci0JbG9uZyBvdXRwdXRDdXJyZW50RmxhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIGlucHV0Q3VycmVudEZsYWc7CisgICAgbG9uZyBvdXRwdXRDdXJyZW50RmxhZzsKICNpZm5kZWYgVkRHZXRDdXJyZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhWREdldEN1cnJlbnRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDdXJyZW50RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q3VycmVudEZsYWdzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEN1cnJlbnRGbGFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRDdXJyZW50RmxhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlucHV0Q3VycmVudEZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q3VycmVudEZsYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEN1cnJlbnRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRDdXJyZW50RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q3VycmVudEZsYWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEN1cnJlbnRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEN1cnJlbnRGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRTZXRLZXlDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0S2V5Q29sb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRLZXlDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgaW5kZXg7CiAjaWZuZGVmIFZER2V0S2V5Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhWREdldEtleUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEtleUNvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEtleUNvbG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREFkZEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRBZGRLZXlDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFZEQWRkS2V5Q29sb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEQWRkS2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQWRkS2V5Q29sb3IoY2ksCi0JICAgICAgICAgICAgICAgICAgICAmaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRBZGRLZXlDb2xvcihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TmV4dEtleUNvbG9yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgVkRHZXROZXh0S2V5Q29sb3IKLQlQeU1hY19QUkVDSEVDSyhWREdldE5leHRLZXlDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXROZXh0S2V5Q29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TmV4dEtleUNvbG9yKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXROZXh0S2V5Q29sb3IoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0S2V5Q29sb3JSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSR0JDb2xvciBtaW5SR0I7Ci0JUkdCQ29sb3IgbWF4UkdCOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJHQkNvbG9yIG1pblJHQjsKKyAgICBSR0JDb2xvciBtYXhSR0I7CiAjaWZuZGVmIFZEU2V0S2V5Q29sb3JSYW5nZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0S2V5Q29sb3JSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRLZXlDb2xvclJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEtleUNvbG9yUmFuZ2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldEtleUNvbG9yUmFuZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0S2V5Q29sb3JSYW5nZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlSR0JDb2xvciBtaW5SR0I7Ci0JUkdCQ29sb3IgbWF4UkdCOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJHQkNvbG9yIG1pblJHQjsKKyAgICBSR0JDb2xvciBtYXhSR0I7CiAjaWZuZGVmIFZER2V0S2V5Q29sb3JSYW5nZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0S2V5Q29sb3JSYW5nZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRLZXlDb2xvclJhbmdlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEtleUNvbG9yUmFuZ2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEtleUNvbG9yUmFuZ2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW5SR0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhSR0IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJm1pblJHQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZtYXhSR0IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBjb2xvclNwYWNlTW9kZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBjb2xvclNwYWNlTW9kZTsKICNpZm5kZWYgVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldElucHV0Q29sb3JTcGFjZU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JTcGFjZU1vZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VNb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0Q29sb3JTcGFjZU1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgY29sb3JTcGFjZU1vZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgY29sb3JTcGFjZU1vZGU7CiAjaWZuZGVmIFZER2V0SW5wdXRDb2xvclNwYWNlTW9kZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXRDb2xvclNwYWNlTW9kZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0Q29sb3JTcGFjZU1vZGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclNwYWNlTW9kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU1vZGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q2xpcFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGNsaXBFbmFibGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgY2xpcEVuYWJsZTsKICNpZm5kZWYgVkRTZXRDbGlwU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhWRFNldENsaXBTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRDbGlwU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZjbGlwRW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRDbGlwU3RhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGlwRW5hYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRDbGlwU3RhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRDbGlwU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgY2xpcEVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBjbGlwRW5hYmxlOwogI2lmbmRlZiBWREdldENsaXBTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0Q2xpcFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENsaXBTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRDbGlwU3RhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJmNsaXBFbmFibGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNsaXBFbmFibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENsaXBTdGF0ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmY2xpcEVuYWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcEVuYWJsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRDbGlwUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBjbGlwUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBjbGlwUmVnaW9uOwogI2lmbmRlZiBWRFNldENsaXBSZ24KLQlQeU1hY19QUkVDSEVDSyhWRFNldENsaXBSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0Q2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0Q2xpcFJnbihjaSwKLQkgICAgICAgICAgICAgICAgICAgY2xpcFJlZ2lvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsaXBSZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldENsaXBSZ24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWdpb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEQ2xlYXJDbGlwUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVJnbkhhbmRsZSBjbGlwUmVnaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFJnbkhhbmRsZSBjbGlwUmVnaW9uOwogI2lmbmRlZiBWRENsZWFyQ2xpcFJnbgotCVB5TWFjX1BSRUNIRUNLKFZEQ2xlYXJDbGlwUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRENsZWFyQ2xpcFJnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xpcFJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQ2xlYXJDbGlwUmduKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWdpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjbGlwUmVnaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRDbGVhckNsaXBSZ24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFJlZ2lvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRDTFVUSW5Vc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZTsKICNpZm5kZWYgVkRHZXRDTFVUSW5Vc2UKLQlQeU1hY19QUkVDSEVDSyhWREdldENMVVRJblVzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRDTFVUSW5Vc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q0xVVEluVXNlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICZjb2xvclRhYmxlSGFuZGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JUYWJsZUhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q0xVVEluVXNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvclRhYmxlSGFuZGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgY29sb3JUYWJsZUhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRQTExGaWx0ZXJUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IHBsbFR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgcGxsVHlwZTsKICNpZm5kZWYgVkRTZXRQTExGaWx0ZXJUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRQTExGaWx0ZXJUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldFBMTEZpbHRlclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwbGxUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQTExGaWx0ZXJUeXBlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBwbGxUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsbFR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFBMTEZpbHRlclR5cGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsbFR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0UExMRmlsdGVyVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBwbGxUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IHBsbFR5cGU7CiAjaWZuZGVmIFZER2V0UExMRmlsdGVyVHlwZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0UExMRmlsdGVyVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRQTExGaWx0ZXJUeXBlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFBMTEZpbHRlclR5cGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZwbGxUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwbGxUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRQTExGaWx0ZXJUeXBlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGxsVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxsVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRNYXNrYW5kVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbDsKLQlsb25nIG1hc2s7Ci0JbG9uZyB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICB1bnNpZ25lZCBzaG9ydCBibGVuZExldmVsOworICAgIGxvbmcgbWFzazsKKyAgICBsb25nIHZhbHVlOwogI2lmbmRlZiBWREdldE1hc2thbmRWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0TWFza2FuZFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldE1hc2thbmRWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJkgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJsZW5kTGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldE1hc2thbmRWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBibGVuZExldmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZtYXNrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1hc2ssCi0JICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxlbmRMZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0TWFza2FuZFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRNYXN0ZXJCbGVuZExldmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbDsKICNpZm5kZWYgVkRTZXRNYXN0ZXJCbGVuZExldmVsCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRNYXN0ZXJCbGVuZExldmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldE1hc3RlckJsZW5kTGV2ZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0TWFzdGVyQmxlbmRMZXZlbChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsZW5kTGV2ZWwpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJsZW5kTGV2ZWwpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldE1hc3RlckJsZW5kTGV2ZWwoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGVuZExldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZExldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFBsYXlUaHJ1T25PZmYoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgc3RhdGU7CiAjaWZuZGVmIFZEU2V0UGxheVRocnVPbk9mZgotCVB5TWFjX1BSRUNIRUNLKFZEU2V0UGxheVRocnVPbk9mZik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRQbGF5VGhydU9uT2ZmKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFBsYXlUaHJ1T25PZmYoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRQbGF5VGhydU9uT2ZmKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRGaWVsZFByZWZlcmVuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgZmllbGRGbGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGZpZWxkRmxhZzsKICNpZm5kZWYgVkRTZXRGaWVsZFByZWZlcmVuY2UKLQlQeU1hY19QUkVDSEVDSyhWRFNldEZpZWxkUHJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRGaWVsZFByZWZlcmVuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZmaWVsZEZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEZpZWxkUHJlZmVyZW5jZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEZsYWcpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRGbGFnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRGaWVsZFByZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEZpZWxkUHJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBmaWVsZEZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgZmllbGRGbGFnOwogI2lmbmRlZiBWREdldEZpZWxkUHJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0RmllbGRQcmVmZXJlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldEZpZWxkUHJlZmVyZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRGaWVsZFByZWZlcmVuY2UoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkRmxhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRGaWVsZFByZWZlcmVuY2UoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkRmxhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRGbGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFByZWZsaWdodEdsb2JhbFJlY3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JR3JhZlB0ciB0aGVXaW5kb3c7Ci0JUmVjdCBnbG9iYWxSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEdyYWZQdHIgdGhlV2luZG93OworICAgIFJlY3QgZ2xvYmFsUmVjdDsKICNpZm5kZWYgVkRQcmVmbGlnaHRHbG9iYWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRQcmVmbGlnaHRHbG9iYWxSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFByZWZsaWdodEdsb2JhbFJlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFByZWZsaWdodEdsb2JhbFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZVdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJnRoZVdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEUHJlZmxpZ2h0R2xvYmFsUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmdsb2JhbFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0UGxheVRocnVHbG9iYWxSZWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUdyYWZQdHIgdGhlV2luZG93OwotCVJlY3QgZ2xvYmFsUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBHcmFmUHRyIHRoZVdpbmRvdzsKKyAgICBSZWN0IGdsb2JhbFJlY3Q7CiAjaWZuZGVmIFZEU2V0UGxheVRocnVHbG9iYWxSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0UGxheVRocnVHbG9iYWxSZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQbGF5VGhydUdsb2JhbFJlY3QoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlV2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxSZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZ0aGVXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFJlY3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldEJsYWNrTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CiAjaWZuZGVmIFZEU2V0QmxhY2tMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRCbGFja0xldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0QmxhY2tMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldEJsYWNrTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0QmxhY2tMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGFja0xldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldEJsYWNrTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CiAjaWZuZGVmIFZER2V0QmxhY2tMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRCbGFja0xldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0QmxhY2tMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldEJsYWNrTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0QmxhY2tMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGFja0xldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFdoaXRlTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWw7CiAjaWZuZGVmIFZEU2V0V2hpdGVMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRXaGl0ZUxldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0V2hpdGVMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFdoaXRlTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0V2hpdGVMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFdoaXRlTGV2ZWxWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWw7CiAjaWZuZGVmIFZER2V0V2hpdGVMZXZlbFZhbHVlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRXaGl0ZUxldmVsVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0V2hpdGVMZXZlbFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFdoaXRlTGV2ZWxWYWx1ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpdGVMZXZlbCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgd2hpdGVMZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0V2hpdGVMZXZlbFZhbHVlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFZpZGVvRGVmYXVsdHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbDsKLQl1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsOwotCXVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3M7Ci0JdW5zaWduZWQgc2hvcnQgaHVlOwotCXVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb247Ci0JdW5zaWduZWQgc2hvcnQgY29udHJhc3Q7Ci0JdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWw7CisgICAgdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbDsKKyAgICB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzOworICAgIHVuc2lnbmVkIHNob3J0IGh1ZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uOworICAgIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0OworICAgIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzczsKICNpZm5kZWYgVkRHZXRWaWRlb0RlZmF1bHRzCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRWaWRlb0RlZmF1bHRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFZpZGVvRGVmYXVsdHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0VmlkZW9EZWZhdWx0cyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmJsYWNrTGV2ZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGl0ZUxldmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYnJpZ2h0bmVzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmh1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNhdHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cmFzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxISEhISEhIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmxhY2tMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICB3aGl0ZUxldmVsLAotCSAgICAgICAgICAgICAgICAgICAgIGJyaWdodG5lc3MsCi0JICAgICAgICAgICAgICAgICAgICAgaHVlLAotCSAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgY29udHJhc3QsCi0JICAgICAgICAgICAgICAgICAgICAgc2hhcnBuZXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRWaWRlb0RlZmF1bHRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmxhY2tMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaXRlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcnBuZXNzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEhISEhISEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBibGFja0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBodWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaGFycG5lc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0TnVtYmVyT2ZJbnB1dHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIHNob3J0IGlucHV0czsKICNpZm5kZWYgVkRHZXROdW1iZXJPZklucHV0cwotCVB5TWFjX1BSRUNIRUNLKFZER2V0TnVtYmVyT2ZJbnB1dHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0TnVtYmVyT2ZJbnB1dHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0TnVtYmVyT2ZJbnB1dHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldE51bWJlck9mSW5wdXRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0cyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0Rm9ybWF0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGlucHV0OwotCXNob3J0IGZvcm1hdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBpbnB1dDsKKyAgICBzaG9ydCBmb3JtYXQ7CiAjaWZuZGVmIFZER2V0SW5wdXRGb3JtYXQKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0Rm9ybWF0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0Rm9ybWF0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0Rm9ybWF0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldElucHV0Rm9ybWF0KGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0SW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXQ7CiAjaWZuZGVmIFZEU2V0SW5wdXQKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldElucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldElucHV0KGNpLAotCSAgICAgICAgICAgICAgICAgaW5wdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldElucHV0KGNpLAorICAgICAgICAgICAgICAgICAgICAgaW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgaW5wdXQ7CiAjaWZuZGVmIFZER2V0SW5wdXQKLQlQeU1hY19QUkVDSEVDSyhWREdldElucHV0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldElucHV0KGNpLAotCSAgICAgICAgICAgICAgICAgJmlucHV0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpbnB1dCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0SW5wdXQoY2ksCisgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldElucHV0U3RhbmRhcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0Jc2hvcnQgaW5wdXRTdGFuZGFyZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBpbnB1dFN0YW5kYXJkOwogI2lmbmRlZiBWRFNldElucHV0U3RhbmRhcmQKLQlQeU1hY19QUkVDSEVDSyhWRFNldElucHV0U3RhbmRhcmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0SW5wdXRTdGFuZGFyZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0U3RhbmRhcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldElucHV0U3RhbmRhcmQoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RhbmRhcmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRTdGFuZGFyZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0SW5wdXRTdGFuZGFyZChjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdGFuZGFyZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXR1cEJ1ZmZlcnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVmRpZ0J1ZmZlclJlY0xpc3RIYW5kbGUgYnVmZmVyTGlzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBWZGlnQnVmZmVyUmVjTGlzdEhhbmRsZSBidWZmZXJMaXN0OwogI2lmbmRlZiBWRFNldHVwQnVmZmVycwotCVB5TWFjX1BSRUNIRUNLKFZEU2V0dXBCdWZmZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldHVwQnVmZmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmYnVmZmVyTGlzdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0dXBCdWZmZXJzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckxpc3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZidWZmZXJMaXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXR1cEJ1ZmZlcnMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTGlzdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHcmFiT25lRnJhbWVBc3luYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlzaG9ydCBidWZmZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgc2hvcnQgYnVmZmVyOwogI2lmbmRlZiBWREdyYWJPbmVGcmFtZUFzeW5jCi0JUHlNYWNfUFJFQ0hFQ0soVkRHcmFiT25lRnJhbWVBc3luYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHcmFiT25lRnJhbWVBc3luYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER3JhYk9uZUZyYW1lQXN5bmMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHcmFiT25lRnJhbWVBc3luYyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkREb25lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCXNob3J0IGJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBzaG9ydCBidWZmZXI7CiAjaWZuZGVmIFZERG9uZQotCVB5TWFjX1BSRUNIRUNLKFZERG9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkREb25lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkREb25lKGNpLAotCSAgICAgICAgICAgICBidWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkREb25lKGNpLAorICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0Q29tcHJlc3Npb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JT1NUeXBlIGNvbXByZXNzVHlwZTsKLQlzaG9ydCBkZXB0aDsKLQlSZWN0IGJvdW5kczsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQlsb25nIGtleUZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBPU1R5cGUgY29tcHJlc3NUeXBlOworICAgIHNob3J0IGRlcHRoOworICAgIFJlY3QgYm91bmRzOworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OworICAgIGxvbmcga2V5RnJhbWVSYXRlOwogI2lmbmRlZiBWRFNldENvbXByZXNzaW9uCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAma2V5RnJhbWVSYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRDb21wcmVzc2lvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maGxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAma2V5RnJhbWVSYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRDb21wcmVzc2lvbihjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRENvbXByZXNzT25lRnJhbWVBc3luYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKICNpZm5kZWYgVkRDb21wcmVzc09uZUZyYW1lQXN5bmMKLQlQeU1hY19QUkVDSEVDSyhWRENvbXByZXNzT25lRnJhbWVBc3luYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRDb21wcmVzc09uZUZyYW1lQXN5bmMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRDb21wcmVzc09uZUZyYW1lQXN5bmMoY2kpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0SW1hZ2VEZXNjcmlwdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBWREdldEltYWdlRGVzY3JpcHRpb24KLQlQeU1hY19QUkVDSEVDSyhWREdldEltYWdlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0SW1hZ2VEZXNjcmlwdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGVzYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0SW1hZ2VEZXNjcmlwdGlvbihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldEltYWdlRGVzY3JpcHRpb24oY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEUmVzZXRDb21wcmVzc1NlcXVlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZQotCVB5TWFjX1BSRUNIRUNLKFZEUmVzZXRDb21wcmVzc1NlcXVlbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRSZXNldENvbXByZXNzU2VxdWVuY2UoY2kpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFJlc2V0Q29tcHJlc3NTZXF1ZW5jZShjaSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRDb21wcmVzc2lvbk9uT2ZmKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCUJvb2xlYW4gc3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgQm9vbGVhbiBzdGF0ZTsKICNpZm5kZWYgVkRTZXRDb21wcmVzc2lvbk9uT2ZmCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRDb21wcmVzc2lvbk9uT2ZmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFNldENvbXByZXNzaW9uT25PZmYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZzdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0Q29tcHJlc3Npb25Pbk9mZihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldENvbXByZXNzaW9uT25PZmYoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldENvbXByZXNzaW9uVHlwZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVkRDb21wcmVzc2lvbkxpc3RIYW5kbGUgaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBWRENvbXByZXNzaW9uTGlzdEhhbmRsZSBoOwogI2lmbmRlZiBWREdldENvbXByZXNzaW9uVHlwZXMKLQlQeU1hY19QUkVDSEVDSyhWREdldENvbXByZXNzaW9uVHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0Q29tcHJlc3Npb25UeXBlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q29tcHJlc3Npb25UeXBlcyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldENvbXByZXNzaW9uVHlwZXMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0VGltZUJhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JVGltZUJhc2UgdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBUaW1lQmFzZSB0OwogI2lmbmRlZiBWRFNldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soVkRTZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX0NvbnZlcnQsICZ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRUaW1lQmFzZShjaSwKLQkgICAgICAgICAgICAgICAgICAgIHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZUJhc2VPYmpfQ29udmVydCwgJnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFNldFRpbWVCYXNlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRTZXRGcmFtZVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JRml4ZWQgZnJhbWVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEZpeGVkIGZyYW1lc1BlclNlY29uZDsKICNpZm5kZWYgVkRTZXRGcmFtZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhWRFNldEZyYW1lUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRGcmFtZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lc1BlclNlY29uZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RnJhbWVSYXRlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RnJhbWVSYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIG1pbGxpU2VjUGVyRnJhbWU7Ci0JRml4ZWQgZnJhbWVzUGVyU2Vjb25kOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBtaWxsaVNlY1BlckZyYW1lOworICAgIEZpeGVkIGZyYW1lc1BlclNlY29uZDsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBWREdldERhdGFSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXREYXRhUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXREYXRhUmF0ZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICZtaWxsaVNlY1BlckZyYW1lLAotCSAgICAgICAgICAgICAgICAgICAgJmZyYW1lc1BlclNlY29uZCwKLQkgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNQZXJGcmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBmcmFtZXNQZXJTZWNvbmQsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldERhdGFSYXRlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpU2VjUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVzUGVyU2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaWxsaVNlY1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGZyYW1lc1BlclNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRTb3VuZElucHV0RHJpdmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVN0cjI1NSBzb3VuZERyaXZlck5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgU3RyMjU1IHNvdW5kRHJpdmVyTmFtZTsKICNpZm5kZWYgVkRHZXRTb3VuZElucHV0RHJpdmVyCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRTb3VuZElucHV0RHJpdmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldFNvdW5kSW5wdXREcml2ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHNvdW5kRHJpdmVyTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0U291bmRJbnB1dERyaXZlcihjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmREcml2ZXJOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc291bmREcml2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRTb3VuZElucHV0RHJpdmVyKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZERyaXZlck5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0RE1BRGVwdGhzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgZGVwdGhBcnJheTsKLQlsb25nIHByZWZlcnJlZERlcHRoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgZGVwdGhBcnJheTsKKyAgICBsb25nIHByZWZlcnJlZERlcHRoOwogI2lmbmRlZiBWREdldERNQURlcHRocwotCVB5TWFjX1BSRUNIRUNLKFZER2V0RE1BRGVwdGhzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldERNQURlcHRocyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRETUFEZXB0aHMoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgJmRlcHRoQXJyYXksCi0JICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZERlcHRoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZGVwdGhBcnJheSwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWREZXB0aCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0RE1BRGVwdGhzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWREZXB0aCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkRGVwdGgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0UHJlZmVycmVkVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVRpbWVTY2FsZSBwcmVmZXJyZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgVGltZVNjYWxlIHByZWZlcnJlZDsKICNpZm5kZWYgVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhWREdldFByZWZlcnJlZFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0UHJlZmVycmVkVGltZVNjYWxlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0UHJlZmVycmVkVGltZVNjYWxlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRSZWxlYXNlQXN5bmNCdWZmZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwogI2lmbmRlZiBWRFJlbGVhc2VBc3luY0J1ZmZlcnMKLQlQeU1hY19QUkVDSEVDSyhWRFJlbGVhc2VBc3luY0J1ZmZlcnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEUmVsZWFzZUFzeW5jQnVmZmVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRSZWxlYXNlQXN5bmNCdWZmZXJzKGNpKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRSZWxlYXNlQXN5bmNCdWZmZXJzKGNpKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgVkRTZXREYXRhUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFZEU2V0RGF0YVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0RGF0YVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RGF0YVJhdGUoY2ksCi0JICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0RGF0YVJhdGUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRHZXRUaW1lQ29kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlUaW1lUmVjb3JkIGF0VGltZTsKLQl2b2lkICogdGltZUNvZGVGb3JtYXQ7Ci0Jdm9pZCAqIHRpbWVDb2RlVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBUaW1lUmVjb3JkIGF0VGltZTsKKyAgICB2b2lkICogdGltZUNvZGVGb3JtYXQ7CisgICAgdm9pZCAqIHRpbWVDb2RlVGltZTsKICNpZm5kZWYgVkRHZXRUaW1lQ29kZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0VGltZUNvZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0VGltZUNvZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZUNvZGVGb3JtYXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQ29kZVRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFRpbWVDb2RlKGNpLAotCSAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKLQkgICAgICAgICAgICAgICAgICAgIHRpbWVDb2RlRm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgdGltZUNvZGVUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmF0VGltZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZUNvZGVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lQ29kZVRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldFRpbWVDb2RlKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgJmF0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVDb2RlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgdGltZUNvZGVUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX05ldywgJmF0VGltZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRVc2VTYWZlQnVmZmVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlCb29sZWFuIHVzZVNhZmVCdWZmZXJzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIEJvb2xlYW4gdXNlU2FmZUJ1ZmZlcnM7CiAjaWZuZGVmIFZEVXNlU2FmZUJ1ZmZlcnMKLQlQeU1hY19QUkVDSEVDSyhWRFVzZVNhZmVCdWZmZXJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRFVzZVNhZmVCdWZmZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXNlU2FmZUJ1ZmZlcnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFVzZVNhZmVCdWZmZXJzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgdXNlU2FmZUJ1ZmZlcnMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2FmZUJ1ZmZlcnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRFVzZVNhZmVCdWZmZXJzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2FmZUJ1ZmZlcnMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0U291bmRJbnB1dFNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHZpZGVvSW5wdXQ7Ci0JbG9uZyBzb3VuZElucHV0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgdmlkZW9JbnB1dDsKKyAgICBsb25nIHNvdW5kSW5wdXQ7CiAjaWZuZGVmIFZER2V0U291bmRJbnB1dFNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0U291bmRJbnB1dFNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXRTb3VuZElucHV0U291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0U291bmRJbnB1dFNvdXJjZShjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdW5kSW5wdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNvdW5kSW5wdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0U291bmRJbnB1dFNvdXJjZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdW5kSW5wdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kSW5wdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0Q29tcHJlc3Npb25UaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7Ci0Jc2hvcnQgZGVwdGg7Ci0JUmVjdCBzcmNSZWN0OwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIE9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgc2hvcnQgZGVwdGg7CisgICAgUmVjdCBzcmNSZWN0OworICAgIENvZGVjUSBzcGF0aWFsUXVhbGl0eTsKKyAgICBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OworICAgIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lOwogI2lmbmRlZiBWREdldENvbXByZXNzaW9uVGltZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0Q29tcHJlc3Npb25UaW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldENvbXByZXNzaW9uVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZER2V0Q29tcHJlc3Npb25UaW1lKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmc3JjUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0Q29tcHJlc3Npb25UaW1lKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NUaW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldFByZWZlcnJlZFBhY2tldFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7Ci0JbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOwogI2lmbmRlZiBWRFNldFByZWZlcnJlZFBhY2tldFNpemUKLQlQeU1hY19QUkVDSEVDSyhWRFNldFByZWZlcnJlZFBhY2tldFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZShjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCWxvbmcgd2lkdGg7Ci0JbG9uZyBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyB3aWR0aDsKKyAgICBsb25nIGhlaWdodDsKICNpZm5kZWYgVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMKLQlQeU1hY19QUkVDSEVDSyhWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWlnaHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHdpZHRoOwotCWxvbmcgaGVpZ2h0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIGxvbmcgd2lkdGg7CisgICAgbG9uZyBoZWlnaHQ7CiAjaWZuZGVmIFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soVkRHZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2kpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotCSAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVpZ2h0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WREdldElucHV0TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlsb25nIHZpZGVvSW5wdXQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgbG9uZyB2aWRlb0lucHV0OworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBWREdldElucHV0TmFtZQotCVB5TWFjX1BSRUNIRUNLKFZER2V0SW5wdXROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWREdldElucHV0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRHZXRJbnB1dE5hbWUoY2ksCi0JICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRHZXRJbnB1dE5hbWUoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9JbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9WRFNldERlc3RpbmF0aW9uUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlDR3JhZlB0ciBkZXN0UG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKKyAgICBDR3JhZlB0ciBkZXN0UG9ydDsKICNpZm5kZWYgVkRTZXREZXN0aW5hdGlvblBvcnQKLQlQeU1hY19QUkVDSEVDSyhWRFNldERlc3RpbmF0aW9uUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRTZXREZXN0aW5hdGlvblBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZkZXN0UG9ydCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFZEU2V0RGVzdGluYXRpb25Qb3J0KGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RQb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmRlc3RQb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVkRTZXREZXN0aW5hdGlvblBvcnQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1ZER2V0RGV2aWNlTmFtZUFuZEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOwotCVN0cjI1NSBvdXROYW1lOwotCVVJbnQzMiBvdXROYW1lRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2k7CisgICAgU3RyMjU1IG91dE5hbWU7CisgICAgVUludDMyIG91dE5hbWVGbGFnczsKICNpZm5kZWYgVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhWREdldERldmljZU5hbWVBbmRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBWREdldERldmljZU5hbWVBbmRGbGFncyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROYW1lRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG91dE5hbWVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dE5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWREdldERldmljZU5hbWVBbmRGbGFncyhjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROYW1lRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE5hbWVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaTsKLQlVSW50MzIgaW5TdGF0ZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpOworICAgIFVJbnQzMiBpblN0YXRlRmxhZ3M7CiAjaWZuZGVmIFZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmcKLQlQeU1hY19QUkVDSEVDSyhWRENhcHR1cmVTdGF0ZUNoYW5naW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhWRENhcHR1cmVTdGF0ZUNoYW5naW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5TdGF0ZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyhjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RhdGVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0YXRlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBWRENhcHR1cmVTdGF0ZUNoYW5naW5nKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdGF0ZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCWxvbmcgZXJyb3JMaW5lOwotCVN0cmluZ1B0ciBlcnJEZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgbG9uZyBlcnJvckxpbmU7CisgICAgU3RyaW5nUHRyIGVyckRlc2M7CiAjaWZuZGVmIFhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlcnJEZXNjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JMaW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckRlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGVycm9yTGluZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVyckRlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUdldERldGFpbGVkUGFyc2VFcnJvcihhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvckxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyRGVzYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JMaW5lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZEVsZW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQljaGFyIGVsZW1lbnROYW1lOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKLQlVSW50MzIgZWxlbWVudElEOwotCWxvbmcgZWxlbWVudEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgY2hhciBlbGVtZW50TmFtZTsKKyAgICBVSW50MzIgbmFtZVNwYWNlSUQ7CisgICAgVUludDMyIGVsZW1lbnRJRDsKKyAgICBsb25nIGVsZW1lbnRGbGFnczsKICNpZm5kZWYgWE1MUGFyc2VBZGRFbGVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRFbGVtZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEVsZW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFhNTFBhcnNlQWRkRWxlbWVudChhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudE5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbWVudElELAotCSAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50RmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsY2wiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZEVsZW1lbnQoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudEZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCVVJbnQzMiBlbGVtZW50SUQ7Ci0JVUludDMyIG5hbWVTcGFjZUlEOwotCWNoYXIgYXR0cmlidXRlTmFtZTsKLQlVSW50MzIgYXR0cmlidXRlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBVSW50MzIgZWxlbWVudElEOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWU7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOwogI2lmbmRlZiBYTUxQYXJzZUFkZEF0dHJpYnV0ZQotCVB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkQXR0cmlidXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVTcGFjZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGRBdHRyaWJ1dGUoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVNwYWNlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGNsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlQWRkQXR0cmlidXRlKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JVUludDMyIGVsZW1lbnRJRDsKLQlVSW50MzIgbmFtZVNwYWNlSURzOwotCWNoYXIgYXR0cmlidXRlTmFtZXM7Ci0JVUludDMyIGF0dHJpYnV0ZUlEczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIFVJbnQzMiBlbGVtZW50SUQ7CisgICAgVUludDMyIG5hbWVTcGFjZUlEczsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWVzOworICAgIFVJbnQzMiBhdHRyaWJ1dGVJRHM7CiAjaWZuZGVmIFhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRNdWx0aXBsZUF0dHJpYnV0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyhhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSURzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlSURzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlEcywKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lcywKLQkgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyhhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlSURzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlSURzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZUlEcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlVSW50MzIgZWxlbWVudElEOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKLQljaGFyIGF0dHJpYnV0ZU5hbWU7Ci0JVUludDMyIGF0dHJpYnV0ZUlEOwotCVVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7Ci0Jdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKKyAgICBVSW50MzIgZWxlbWVudElEOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBjaGFyIGF0dHJpYnV0ZU5hbWU7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOworICAgIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7CisgICAgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CiAjaWZuZGVmIFhNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1hNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCUNvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7Ci0JVUludDMyIGVsZW1lbnRJRDsKLQlVSW50MzIgYXR0cmlidXRlSUQ7Ci0JVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZDsKLQl2b2lkICogYXR0cmlidXRlVmFsdWVLaW5kSW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIFVJbnQzMiBlbGVtZW50SUQ7CisgICAgVUludDMyIGF0dHJpYnV0ZUlEOworICAgIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQ7CisgICAgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm87CiAjaWZuZGVmIFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kCi0JUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbGVtZW50SUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZVZhbHVlS2luZEluZm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZChhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUtpbmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVLaW5kSW5mbyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmVsZW1lbnRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlVmFsdWVLaW5kSW5mbykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlQWRkQXR0cmlidXRlVmFsdWVLaW5kKGFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZUFkZE5hbWVTcGFjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCWNoYXIgbmFtZVNwYWNlVVJMOwotCVVJbnQzMiBuYW1lU3BhY2VJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIGNoYXIgbmFtZVNwYWNlVVJMOworICAgIFVJbnQzMiBuYW1lU3BhY2VJRDsKICNpZm5kZWYgWE1MUGFyc2VBZGROYW1lU3BhY2UKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZUFkZE5hbWVTcGFjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWE1MUGFyc2VBZGROYW1lU3BhY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VBZGROYW1lU3BhY2UoYVBhcnNlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlVVJMLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZVVSTCwKLQkgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gWE1MUGFyc2VBZGROYW1lU3BhY2UoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVNwYWNlVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lU3BhY2VJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxjbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVTcGFjZVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lU3BhY2VJRCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOwotCVVJbnQzMiBvZmZzZXQ7Ci0JVUludDMyIGxpbWl0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXI7CisgICAgVUludDMyIG9mZnNldDsKKyAgICBVSW50MzIgbGltaXQ7CiAjaWZuZGVmIFhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQKLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbGltaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0KGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmFQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW1pdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQoYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9YTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlcjsKLQlsb25nIHJlZmNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyOworICAgIGxvbmcgcmVmY29uOwogI2lmbmRlZiBYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFhNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZhUGFyc2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmY29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uKGFQYXJzZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYVBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFhNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbihhUGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZjb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHSW5pdGlhbGl6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR0luaXRpYWxpemUKLQlQeU1hY19QUkVDSEVDSyhTR0luaXRpYWxpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSW5pdGlhbGl6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0luaXRpYWxpemUocyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dJbml0aWFsaXplKHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RGF0YU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JRlNTcGVjIG1vdmllRmlsZTsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEZTU3BlYyBtb3ZpZUZpbGU7CisgICAgbG9uZyB3aGVyZUZsYWdzOwogI2lmbmRlZiBTR1NldERhdGFPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldERhdGFPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0RGF0YU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJm1vdmllRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldERhdGFPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vdmllRmlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXREYXRhT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JRlNTcGVjIG1vdmllRmlsZTsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEZTU3BlYyBtb3ZpZUZpbGU7CisgICAgbG9uZyB3aGVyZUZsYWdzOwogI2lmbmRlZiBTR0dldERhdGFPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmbW92aWVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhT3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmbW92aWVGaWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtb3ZpZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEdXb3JsZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JQ0dyYWZQdHIgZ3A7Ci0JR0RIYW5kbGUgZ2Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIENHcmFmUHRyIGdwOworICAgIEdESGFuZGxlIGdkOwogI2lmbmRlZiBTR1NldEdXb3JsZAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0R1dvcmxkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZncCwKLQkgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZnZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0R1dvcmxkKHMsCi0JICAgICAgICAgICAgICAgICAgZ3AsCi0JICAgICAgICAgICAgICAgICAgZ2QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmdkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRHV29ybGQocywKKyAgICAgICAgICAgICAgICAgICAgICBncCwKKyAgICAgICAgICAgICAgICAgICAgICBnZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRHV29ybGQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUNHcmFmUHRyIGdwOwotCUdESGFuZGxlIGdkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBDR3JhZlB0ciBncDsKKyAgICBHREhhbmRsZSBnZDsKICNpZm5kZWYgU0dHZXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhTR0dldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRHV29ybGQocywKLQkgICAgICAgICAgICAgICAgICAmZ3AsCi0JICAgICAgICAgICAgICAgICAgJmdkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgZ3AsCi0JICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX05ldywgZ2QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0R1dvcmxkKHMsCisgICAgICAgICAgICAgICAgICAgICAgJmdwLAorICAgICAgICAgICAgICAgICAgICAgICZnZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIGdwLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9OZXcsIGdkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR05ld0NoYW5uZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCU9TVHlwZSBjaGFubmVsVHlwZTsKLQlTR0NoYW5uZWwgcmVmOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBPU1R5cGUgY2hhbm5lbFR5cGU7CisgICAgU0dDaGFubmVsIHJlZjsKICNpZm5kZWYgU0dOZXdDaGFubmVsCi0JUHlNYWNfUFJFQ0hFQ0soU0dOZXdDaGFubmVsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR05ld0NoYW5uZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYW5uZWxUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dOZXdDaGFubmVsKHMsCi0JICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAotCSAgICAgICAgICAgICAgICAgICAmcmVmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHJlZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYW5uZWxUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dOZXdDaGFubmVsKHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIHJlZik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dEaXNwb3NlQ2hhbm5lbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR0Rpc3Bvc2VDaGFubmVsCi0JUHlNYWNfUFJFQ0hFQ0soU0dEaXNwb3NlQ2hhbm5lbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dEaXNwb3NlQ2hhbm5lbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHRGlzcG9zZUNoYW5uZWwocywKLQkgICAgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dEaXNwb3NlQ2hhbm5lbChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdGFydFByZXZpZXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dTdGFydFByZXZpZXcKLQlQeU1hY19QUkVDSEVDSyhTR1N0YXJ0UHJldmlldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFByZXZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTdGFydFByZXZpZXcocyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTdGFydFByZXZpZXcocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdGFydFJlY29yZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR1N0YXJ0UmVjb3JkCi0JUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFJlY29yZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdGFydFJlY29yZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1N0YXJ0UmVjb3JkKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU3RhcnRSZWNvcmQocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dJZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CiAjaWZuZGVmIFNHSWRsZQotCVB5TWFjX1BSRUNIRUNLKFNHSWRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dJZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHSWRsZShzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0lkbGUocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTdG9wKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CiAjaWZuZGVmIFNHU3RvcAotCVB5TWFjX1BSRUNIRUNLKFNHU3RvcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTdG9wKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU3RvcChzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1N0b3Aocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYXVzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JQm9vbGVhbiBwYXVzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQm9vbGVhbiBwYXVzZTsKICNpZm5kZWYgU0dQYXVzZQotCVB5TWFjX1BSRUNIRUNLKFNHUGF1c2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGF1c2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhdXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYXVzZShzLAotCSAgICAgICAgICAgICAgcGF1c2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXVzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGF1c2UocywKKyAgICAgICAgICAgICAgICAgIHBhdXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1ByZXBhcmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gcHJlcGFyZUZvclByZXZpZXc7Ci0JQm9vbGVhbiBwcmVwYXJlRm9yUmVjb3JkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBCb29sZWFuIHByZXBhcmVGb3JQcmV2aWV3OworICAgIEJvb2xlYW4gcHJlcGFyZUZvclJlY29yZDsKICNpZm5kZWYgU0dQcmVwYXJlCi0JUHlNYWNfUFJFQ0hFQ0soU0dQcmVwYXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1ByZXBhcmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVwYXJlRm9yUHJldmlldywKLQkgICAgICAgICAgICAgICAgICAgICAgJnByZXBhcmVGb3JSZWNvcmQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1ByZXBhcmUocywKLQkgICAgICAgICAgICAgICAgcHJlcGFyZUZvclByZXZpZXcsCi0JICAgICAgICAgICAgICAgIHByZXBhcmVGb3JSZWNvcmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlcGFyZUZvclByZXZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVwYXJlRm9yUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQcmVwYXJlKHMsCisgICAgICAgICAgICAgICAgICAgIHByZXBhcmVGb3JQcmV2aWV3LAorICAgICAgICAgICAgICAgICAgICBwcmVwYXJlRm9yUmVjb3JkKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1JlbGVhc2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKICNpZm5kZWYgU0dSZWxlYXNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dSZWxlYXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1JlbGVhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dSZWxlYXNlKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUmVsZWFzZShzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1vdmllKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlNb3ZpZSBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBNb3ZpZSBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOwogI2lmbmRlZiBTR0dldE1vdmllCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb3ZpZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb3ZpZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE1vdmllKHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgTW92aWVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0TW92aWUocyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRNYXhpbXVtUmVjb3JkVGltZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JdW5zaWduZWQgbG9uZyB0aWNrczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgdW5zaWduZWQgbG9uZyB0aWNrczsKICNpZm5kZWYgU0dTZXRNYXhpbXVtUmVjb3JkVGltZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0TWF4aW11bVJlY29yZFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0TWF4aW11bVJlY29yZFRpbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRNYXhpbXVtUmVjb3JkVGltZShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aWNrcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0TWF4aW11bVJlY29yZFRpbWUocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1heGltdW1SZWNvcmRUaW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQl1bnNpZ25lZCBsb25nIHRpY2tzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICB1bnNpZ25lZCBsb25nIHRpY2tzOwogI2lmbmRlZiBTR0dldE1heGltdW1SZWNvcmRUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNYXhpbXVtUmVjb3JkVGltZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRNYXhpbXVtUmVjb3JkVGltZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE1heGltdW1SZWNvcmRUaW1lKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGlja3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldE1heGltdW1SZWNvcmRUaW1lKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGlja3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JdW5zaWduZWQgbG9uZyBieXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgdW5zaWduZWQgbG9uZyBieXRlczsKICNpZm5kZWYgU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmcocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VGltZVJlbWFpbmluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JbG9uZyB0aWNrc0xlZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIGxvbmcgdGlja3NMZWZ0OwogI2lmbmRlZiBTR0dldFRpbWVSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldFRpbWVSZW1haW5pbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VGltZVJlbWFpbmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFRpbWVSZW1haW5pbmcocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzTGVmdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGlja3NMZWZ0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFRpbWVSZW1haW5pbmcocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpY2tzTGVmdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGlja3NMZWZ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dyYWJQaWN0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlQaWNIYW5kbGUgcDsKLQlSZWN0IGJvdW5kczsKLQlzaG9ydCBvZmZzY3JlZW5EZXB0aDsKLQlsb25nIGdyYWJQaWN0RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFBpY0hhbmRsZSBwOworICAgIFJlY3QgYm91bmRzOworICAgIHNob3J0IG9mZnNjcmVlbkRlcHRoOworICAgIGxvbmcgZ3JhYlBpY3RGbGFnczsKICNpZm5kZWYgU0dHcmFiUGljdAotCVB5TWFjX1BSRUNIRUNLKFNHR3JhYlBpY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR3JhYlBpY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmhsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNjcmVlbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ3JhYlBpY3RGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR3JhYlBpY3QocywKLQkgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kcywKLQkgICAgICAgICAgICAgICAgIG9mZnNjcmVlbkRlcHRoLAotCSAgICAgICAgICAgICAgICAgZ3JhYlBpY3RGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZobCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzY3JlZW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdyYWJQaWN0RmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dyYWJQaWN0KHMsCisgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5EZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgIGdyYWJQaWN0RmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldExhc3RNb3ZpZVJlc0lEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlzaG9ydCByZXNJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgcmVzSUQ7CiAjaWZuZGVmIFNHR2V0TGFzdE1vdmllUmVzSUQKLQlQeU1hY19QUkVDSEVDSyhTR0dldExhc3RNb3ZpZVJlc0lEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldExhc3RNb3ZpZVJlc0lEKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0TGFzdE1vdmllUmVzSUQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0TGFzdE1vdmllUmVzSUQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzSUQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCWxvbmcgc2dGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgbG9uZyBzZ0ZsYWdzOwogI2lmbmRlZiBTR1NldEZsYWdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2dGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0RmxhZ3MocywKLQkgICAgICAgICAgICAgICAgIHNnRmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZ0ZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRGbGFncyhzLAorICAgICAgICAgICAgICAgICAgICAgc2dGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JbG9uZyBzZ0ZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBsb25nIHNnRmxhZ3M7CiAjaWZuZGVmIFNHR2V0RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0dldEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RmxhZ3MocywKLQkgICAgICAgICAgICAgICAgICZzZ0ZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzZ0ZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldEZsYWdzKHMsCisgICAgICAgICAgICAgICAgICAgICAmc2dGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2dGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIG5ld0NoYW5uZWw7Ci0JQ29tcG9uZW50IHNnQ2hhbm5lbENvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIG5ld0NoYW5uZWw7CisgICAgQ29tcG9uZW50IHNnQ2hhbm5lbENvbXBvbmVudDsKICNpZm5kZWYgU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc2dDaGFubmVsQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0NoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ0NoYW5uZWxDb21wb25lbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgbmV3Q2hhbm5lbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmc2dDaGFubmVsQ29tcG9uZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ0NoYW5uZWxDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgbmV3Q2hhbm5lbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dTZXRTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9Db252ZXJ0LCAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U2V0dGluZ3MocywKLQkgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICB1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR0dldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0U2V0dGluZ3MocywKKyAgICAgICAgICAgICAgICAgICAgICAgICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB1ZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRJbmRDaGFubmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlzaG9ydCBpbmRleDsKLQlTR0NoYW5uZWwgcmVmOwotCU9TVHlwZSBjaGFuVHlwZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgaW5kZXg7CisgICAgU0dDaGFubmVsIHJlZjsKKyAgICBPU1R5cGUgY2hhblR5cGU7CiAjaWZuZGVmIFNHR2V0SW5kQ2hhbm5lbAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0SW5kQ2hhbm5lbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRJbmRDaGFubmVsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0SW5kQ2hhbm5lbChzLAotCSAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoYW5UeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgcmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjaGFuVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRJbmRDaGFubmVsKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhblR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNoYW5UeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1VwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JUmduSGFuZGxlIHVwZGF0ZVJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgUmduSGFuZGxlIHVwZGF0ZVJnbjsKICNpZm5kZWYgU0dVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhTR1VwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dVcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdXBkYXRlUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dVcGRhdGUocywKLQkgICAgICAgICAgICAgICB1cGRhdGVSZ24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnVwZGF0ZVJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHVXBkYXRlKHMsCisgICAgICAgICAgICAgICAgICAgdXBkYXRlUmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFBhdXNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlCb29sZWFuIHBhdXNlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgQm9vbGVhbiBwYXVzZWQ7CiAjaWZuZGVmIFNHR2V0UGF1c2UKLQlQeU1hY19QUkVDSEVDSyhTR0dldFBhdXNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFBhdXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0UGF1c2UocywKLQkgICAgICAgICAgICAgICAgICZwYXVzZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHBhdXNlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRQYXVzZShzLAorICAgICAgICAgICAgICAgICAgICAgJnBhdXNlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF1c2VkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dTZXRDaGFubmVsU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxTZXR0aW5ncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsU2V0dGluZ3MocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfQ29udmVydCwgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxTZXR0aW5ncyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR0dldENoYW5uZWxTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YU9ial9OZXcsIHVkKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE1vZGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gcHJldmlld01vZGU7Ci0JQm9vbGVhbiByZWNvcmRNb2RlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBCb29sZWFuIHByZXZpZXdNb2RlOworICAgIEJvb2xlYW4gcmVjb3JkTW9kZTsKICNpZm5kZWYgU0dHZXRNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldE1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRNb2RlKHMsCi0JICAgICAgICAgICAgICAgICZwcmV2aWV3TW9kZSwKLQkgICAgICAgICAgICAgICAgJnJlY29yZE1vZGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYmIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3TW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICByZWNvcmRNb2RlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldE1vZGUocywKKyAgICAgICAgICAgICAgICAgICAgJnByZXZpZXdNb2RlLAorICAgICAgICAgICAgICAgICAgICAmcmVjb3JkTW9kZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZE1vZGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCWxvbmcgd2hlcmVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dTZXREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXREYXRhUmVmKHMsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgIGRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldERhdGFSZWYocywKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0RGF0YVJlZihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOwotCWxvbmcgd2hlcmVGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgSGFuZGxlIGRhdGFSZWY7CisgICAgT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dHZXREYXRhUmVmCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhUmVmKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSZWYpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhUmVmKHMsCi0JICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhUmVmKHMsCisgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgZGF0YVJlZlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dOZXdPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkYXRhUmVmOwotCU9TVHlwZSBkYXRhUmVmVHlwZTsKLQlsb25nIHdoZXJlRmxhZ3M7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkYXRhUmVmOworICAgIE9TVHlwZSBkYXRhUmVmVHlwZTsKKyAgICBsb25nIHdoZXJlRmxhZ3M7CisgICAgU0dPdXRwdXQgc2dPdXQ7CiAjaWZuZGVmIFNHTmV3T3V0cHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dOZXdPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHTmV3T3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHTmV3T3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKLQkgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKLQkgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzLAotCSAgICAgICAgICAgICAgICAgICZzZ091dCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgc2dPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmRhdGFSZWZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmVGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHTmV3T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICZzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgc2dPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHRGlzcG9zZU91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OwogI2lmbmRlZiBTR0Rpc3Bvc2VPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR0Rpc3Bvc2VPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHRGlzcG9zZU91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dEaXNwb3NlT3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgIHNnT3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dEaXNwb3NlT3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldE91dHB1dEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlsb25nIHdoZXJlRmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIGxvbmcgd2hlcmVGbGFnczsKICNpZm5kZWYgU0dTZXRPdXRwdXRGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0RmxhZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGVyZUZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRPdXRwdXRGbGFncyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZXJlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldE91dHB1dEZsYWdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlRmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbE91dHB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JU0dPdXRwdXQgc2dPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFNHT3V0cHV0IHNnT3V0OwogI2lmbmRlZiBTR1NldENoYW5uZWxPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbE91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbE91dHB1dChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQl1bnNpZ25lZCBsb25nIHNwYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICB1bnNpZ25lZCBsb25nIHNwYWNlOwogI2lmbmRlZiBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNwYWNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0hhbmRsZVVwZGF0ZUV2ZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlFdmVudFJlY29yZCBldmVudDsKLQlCb29sZWFuIGhhbmRsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEV2ZW50UmVjb3JkIGV2ZW50OworICAgIEJvb2xlYW4gaGFuZGxlZDsKICNpZm5kZWYgU0dIYW5kbGVVcGRhdGVFdmVudAotCVB5TWFjX1BSRUNIRUNLKFNHSGFuZGxlVXBkYXRlRXZlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSGFuZGxlVXBkYXRlRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0hhbmRsZVVwZGF0ZUV2ZW50KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmZXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0hhbmRsZVVwZGF0ZUV2ZW50KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRPdXRwdXROZXh0T3V0cHV0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlTR091dHB1dCBuZXh0T3V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBTR091dHB1dCBuZXh0T3V0OwogI2lmbmRlZiBTR1NldE91dHB1dE5leHRPdXRwdXQKLQlQeU1hY19QUkVDSEVDSyhTR1NldE91dHB1dE5leHRPdXRwdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0TmV4dE91dHB1dCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZuZXh0T3V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRPdXRwdXROZXh0T3V0cHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0T3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZuZXh0T3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRPdXRwdXROZXh0T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0T3V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE91dHB1dE5leHRPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCVNHT3V0cHV0IG5leHRPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIFNHT3V0cHV0IG5leHRPdXQ7CiAjaWZuZGVmIFNHR2V0T3V0cHV0TmV4dE91dHB1dAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0TmV4dE91dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXROZXh0T3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE91dHB1dE5leHRPdXRwdXQocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0T3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfTmV3LCBuZXh0T3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXROZXh0T3V0cHV0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dE91dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgbmV4dE91dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQl3aWRlIG1heE9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dPdXRwdXQgc2dPdXQ7CisgICAgd2lkZSBtYXhPZmZzZXQ7CiAjaWZuZGVmIFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0d2lkZSwgJm1heE9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0T3V0cHV0TWF4aW11bU9mZnNldChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXR3aWRlLCAmbWF4T2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4T2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldE91dHB1dE1heGltdW1PZmZzZXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCXdpZGUgbWF4T2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICB3aWRlIG1heE9mZnNldDsKICNpZm5kZWYgU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldE91dHB1dE1heGltdW1PZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0T3V0cHV0TWF4aW11bU9mZnNldChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgbWF4T2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWF4T2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBtYXhPZmZzZXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dPdXRwdXQgc2dPdXQ7Ci0JSGFuZGxlIGRhdGFSZWY7Ci0JT1NUeXBlIGRhdGFSZWZUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBIYW5kbGUgZGF0YVJlZjsKKyAgICBPU1R5cGUgZGF0YVJlZlR5cGU7CiAjaWZuZGVmIFNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldE91dHB1dERhdGFSZWZlcmVuY2UocywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhUmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZlR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRhdGFSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGRhdGFSZWZUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfQ29udmVydCwgJnNnT3V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFSZWZUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBkYXRhUmVmVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlQdHIgcDsKLQlsb25nIGxlbjsKLQl3aWRlIG9mZnNldDsKLQlTR091dHB1dCBzZ091dDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgUHRyIHA7CisgICAgbG9uZyBsZW47CisgICAgd2lkZSBvZmZzZXQ7CisgICAgU0dPdXRwdXQgc2dPdXQ7CiAjaWZuZGVmIFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNnT3V0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHNnT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZ091dCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0dPdXRwdXRPYmpfTmV3LCBzZ091dCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0Jd2lkZSBieXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgd2lkZSBieXRlczsKICNpZm5kZWYgU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBieXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGR3aWRlLCBieXRlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHT3V0cHV0IHNnT3V0OwotCXdpZGUgc3BhY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHT3V0cHV0IHNnT3V0OworICAgIHdpZGUgc3BhY2U7CiAjaWZuZGVmIFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNnT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGFjZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgc3BhY2UpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHV3JpdGVNb3ZpZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVB0ciBwOwotCWxvbmcgbGVuOwotCWxvbmcgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBQdHIgcDsKKyAgICBsb25nIGxlbjsKKyAgICBsb25nIG9mZnNldDsKICNpZm5kZWYgU0dXcml0ZU1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVNb3ZpZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHV3JpdGVNb3ZpZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnAsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1dyaXRlTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgcCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1dyaXRlTW92aWVEYXRhKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JVGltZUJhc2UgdGI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFRpbWVCYXNlIHRiOwogI2lmbmRlZiBTR0dldFRpbWVCYXNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRUaW1lQmFzZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFRpbWVCYXNlKHMsCi0JICAgICAgICAgICAgICAgICAgICAmdGIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFRpbWVCYXNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAmdGIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0FkZE1vdmllRGF0YShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JUHRyIHA7Ci0JbG9uZyBsZW47Ci0JbG9uZyBvZmZzZXQ7Ci0JbG9uZyBjaFJlZkNvbjsKLQlUaW1lVmFsdWUgdGltZTsKLQlzaG9ydCB3cml0ZVR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIFB0ciBwOworICAgIGxvbmcgbGVuOworICAgIGxvbmcgb2Zmc2V0OworICAgIGxvbmcgY2hSZWZDb247CisgICAgVGltZVZhbHVlIHRpbWU7CisgICAgc2hvcnQgd3JpdGVUeXBlOwogI2lmbmRlZiBTR0FkZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHQWRkTW92aWVEYXRhKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0FkZE1vdmllRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2xsbGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNoUmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGltZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndyaXRlVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQWRkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgICBwLAotCSAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIGNoUmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbGxsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRNb3ZpZURhdGEocywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFuZ2VkU291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHQ2hhbmdlZFNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbmdlZFNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFuZ2VkU291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFuZ2VkU291cmNlKHMsCi0JICAgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFuZ2VkU291cmNlKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQWRkRXh0ZW5kZWRNb3ZpZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCVB0ciBwOwotCWxvbmcgbGVuOwotCXdpZGUgb2Zmc2V0OwotCWxvbmcgY2hSZWZDb247Ci0JVGltZVZhbHVlIHRpbWU7Ci0Jc2hvcnQgd3JpdGVUeXBlOwotCVNHT3V0cHV0IHdoaWNoT3V0cHV0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBQdHIgcDsKKyAgICBsb25nIGxlbjsKKyAgICB3aWRlIG9mZnNldDsKKyAgICBsb25nIGNoUmVmQ29uOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIHNob3J0IHdyaXRlVHlwZTsKKyAgICBTR091dHB1dCB3aGljaE91dHB1dDsKICNpZm5kZWYgU0dBZGRFeHRlbmRlZE1vdmllRGF0YQotCVB5TWFjX1BSRUNIRUNLKFNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJnNsbGxoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnAsCi0JICAgICAgICAgICAgICAgICAgICAgICZsZW4sCi0JICAgICAgICAgICAgICAgICAgICAgICZjaFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FkZEV4dGVuZGVkTW92aWVEYXRhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hPdXRwdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkd2lkZSwgb2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX05ldywgd2hpY2hPdXRwdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbGxsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRFeHRlbmRlZE1vdmllRGF0YShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoT3V0cHV0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZHdpZGUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9OZXcsIHdoaWNoT3V0cHV0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0FkZE91dHB1dERhdGFSZWZUb01lZGlhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR091dHB1dCBzZ091dDsKLQlNZWRpYSB0aGVNZWRpYTsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR091dHB1dCBzZ091dDsKKyAgICBNZWRpYSB0aGVNZWRpYTsKKyAgICBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjOwogI2lmbmRlZiBTR0FkZE91dHB1dERhdGFSZWZUb01lZGlhCi0JUHlNYWNfUFJFQ0hFQ0soU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFNHT3V0cHV0T2JqX0NvbnZlcnQsICZzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJnRoZU1lZGlhLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FkZE91dHB1dERhdGFSZWZUb01lZGlhKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZ091dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZU1lZGlhLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTR091dHB1dE9ial9Db252ZXJ0LCAmc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhT2JqX0NvbnZlcnQsICZ0aGVNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkZXNjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2dPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVNZWRpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0U2V0dGluZ3NTdW1tYXJ5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlIYW5kbGUgc3VtbWFyeVRleHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBzdW1tYXJ5VGV4dDsKICNpZm5kZWYgU0dTZXRTZXR0aW5nc1N1bW1hcnkKLQlQeU1hY19QUkVDSEVDSyhTR1NldFNldHRpbmdzU3VtbWFyeSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRTZXR0aW5nc1N1bW1hcnkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc3VtbWFyeVRleHQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNldHRpbmdzU3VtbWFyeShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUZXh0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzdW1tYXJ5VGV4dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0U2V0dGluZ3NTdW1tYXJ5KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVRleHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbFVzYWdlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgdXNhZ2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyB1c2FnZTsKICNpZm5kZWYgU0dTZXRDaGFubmVsVXNhZ2UKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxVc2FnZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsVXNhZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsVXNhZ2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsVXNhZ2UoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVXNhZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyB1c2FnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHVzYWdlOwogI2lmbmRlZiBTR0dldENoYW5uZWxVc2FnZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFVzYWdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxVc2FnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxVc2FnZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2FnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdXNhZ2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFVzYWdlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVzYWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBTR1NldENoYW5uZWxCb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbEJvdW5kcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbEJvdW5kcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxCb3VuZHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCBib3VuZHM7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbEJvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbEJvdW5kcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxCb3VuZHMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsVm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2b2x1bWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxWb2x1bWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsVm9sdW1lKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFZvbHVtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFZvbHVtZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbFZvbHVtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbEluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBjaGFubmVsSW5mbzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGNoYW5uZWxJbmZvOwogI2lmbmRlZiBTR0dldENoYW5uZWxJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxJbmZvKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbEluZm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmZvKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxJbmZvKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbEluZm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmZvKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxQbGF5RmxhZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBwbGF5RmxhZ3M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBwbGF5RmxhZ3M7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFBsYXlGbGFncwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFBsYXlGbGFncyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsUGxheUZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwbGF5RmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxQbGF5RmxhZ3MoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGxheUZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsUGxheUZsYWdzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsUGxheUZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgcGxheUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgcGxheUZsYWdzOwogI2lmbmRlZiBTR0dldENoYW5uZWxQbGF5RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxQbGF5RmxhZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFBsYXlGbGFncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxQbGF5RmxhZ3MoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXlGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxQbGF5RmxhZ3MoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBsYXlGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxheUZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxNYXhGcmFtZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBmcmFtZUNvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgZnJhbWVDb3VudDsKICNpZm5kZWYgU0dTZXRDaGFubmVsTWF4RnJhbWVzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsTWF4RnJhbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxNYXhGcmFtZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxNYXhGcmFtZXMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxNYXhGcmFtZXMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsTWF4RnJhbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgZnJhbWVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGZyYW1lQ291bnQ7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbE1heEZyYW1lcwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbE1heEZyYW1lcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsTWF4RnJhbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbE1heEZyYW1lcyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVDb3VudCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsTWF4RnJhbWVzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZUNvdW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyByZWZDb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsUmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxSZWZDb24oYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRDaGFubmVsUmVmQ29uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsQ2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZ25IYW5kbGUgdGhlQ2xpcDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSZ25IYW5kbGUgdGhlQ2xpcDsKICNpZm5kZWYgU0dTZXRDaGFubmVsQ2xpcAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbENsaXApOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbENsaXAoYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxDbGlwKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxDbGlwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJnbkhhbmRsZSB0aGVDbGlwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBTR0dldENoYW5uZWxDbGlwCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQ2xpcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsQ2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxDbGlwKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmdGhlQ2xpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRoZUNsaXApOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbENsaXAoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDbGlwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgdGhlQ2xpcCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHNhbXBsZURlc2M7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgSGFuZGxlIHNhbXBsZURlc2M7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxTYW1wbGVEZXNjcmlwdGlvbihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZURlc2MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Q2hhbm5lbERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHJpbmdQdHIgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHJpbmdQdHIgbmFtZTsKICNpZm5kZWYgU0dTZXRDaGFubmVsRGV2aWNlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsRGV2aWNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldENoYW5uZWxEZXZpY2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENoYW5uZWxEZXZpY2UoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVRpbWVTY2FsZSBzY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbFRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0Q2hhbm5lbFRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q2hhbm5lbFRpbWVTY2FsZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxUaW1lU2NhbGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsUHV0UGljdHVyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dDaGFubmVsUHV0UGljdHVyZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFB1dFBpY3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFB1dFBpY3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsUHV0UGljdHVyZShjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxQdXRQaWN0dXJlKGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgYnl0ZXNQZXJTZWNvbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgbG9uZyBieXRlc1BlclNlY29uZDsKICNpZm5kZWYgU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBieXRlc1BlclNlY29uZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIGJ5dGVzUGVyU2Vjb25kOwogI2lmbmRlZiBTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzUGVyU2Vjb25kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclNlY29uZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyMjU1IG5hbWU7Ci0JU2NyaXB0Q29kZSBzY3JpcHRUYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyMjU1IG5hbWU7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CiAjaWZuZGVmIFNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdFRhZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxTZXREYXRhU291cmNlTmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgbmFtZTsKLQlTY3JpcHRDb2RlIHNjcmlwdFRhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBTY3JpcHRDb2RlIHNjcmlwdFRhZzsKICNpZm5kZWYgU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dDaGFubmVsR2V0RGF0YVNvdXJjZU5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NyaXB0VGFnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUhhbmRsZSBzZXR0aW5nczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CiAjaWZuZGVmIFNHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHNldHRpbmdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSBzZXR0aW5nczsKICNpZm5kZWYgU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncwotCVB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgc2V0dGluZ3MpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5ncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldENoYW5uZWxUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlUaW1lQmFzZSB0YjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBUaW1lQmFzZSB0YjsKICNpZm5kZWYgU0dHZXRDaGFubmVsVGltZUJhc2UKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsVGltZUJhc2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsVGltZUJhc2UoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBUaW1lQmFzZU9ial9OZXcsIHRiKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENoYW5uZWxUaW1lQmFzZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q2hhbm5lbFJlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHJlZkNvbjsKICNpZm5kZWYgU0dHZXRDaGFubmVsUmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRDaGFubmVsUmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRDaGFubmVsUmVmQ29uKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRDaGFubmVsUmVmQ29uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgb3V0RGV2aWNlTmFtZTsKLQlTdHIyNTUgb3V0SW5wdXROYW1lOwotCXNob3J0IG91dElucHV0TnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFN0cjI1NSBvdXREZXZpY2VOYW1lOworICAgIFN0cjI1NSBvdXRJbnB1dE5hbWU7CisgICAgc2hvcnQgb3V0SW5wdXROdW1iZXI7CiAjaWZuZGVmIFNHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMKLQlQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgb3V0RGV2aWNlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXRJbnB1dE5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SW5wdXROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dElucHV0TnVtYmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRJbnB1dE51bWJlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBvdXREZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG91dElucHV0TmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dERldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRJbnB1dE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SW5wdXROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dElucHV0TnVtYmVyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENoYW5uZWxEZXZpY2VJbnB1dChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBpbklucHV0TnVtYmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGluSW5wdXROdW1iZXI7CiAjaWZuZGVmIFNHU2V0Q2hhbm5lbERldmljZUlucHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbERldmljZUlucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbklucHV0TnVtYmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRDaGFubmVsRGV2aWNlSW5wdXQoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbklucHV0TnVtYmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5JbnB1dE51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbERldmljZUlucHV0KGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5JbnB1dE51bWJlcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVVJbnQzMiBpbkZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIFVJbnQzMiBpbkZsYWdzOwogI2lmbmRlZiBTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcKLQlQeU1hY19QUkVDSEVDSyhTR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyhjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0luaXRDaGFubmVsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVNlcUdyYWJDb21wb25lbnQgb3duZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU2VxR3JhYkNvbXBvbmVudCBvd25lcjsKICNpZm5kZWYgU0dJbml0Q2hhbm5lbAotCVB5TWFjX1BSRUNIRUNLKFNHSW5pdENoYW5uZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHSW5pdENoYW5uZWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm93bmVyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dJbml0Q2hhbm5lbChjLAotCSAgICAgICAgICAgICAgICAgICAgb3duZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZvd25lcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHSW5pdENoYW5uZWwoYywKKyAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1dyaXRlU2FtcGxlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlNb3ZpZSBtOwotCUFsaWFzSGFuZGxlIHRoZUZpbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgTW92aWUgbTsKKyAgICBBbGlhc0hhbmRsZSB0aGVGaWxlOwogI2lmbmRlZiBTR1dyaXRlU2FtcGxlcwotCVB5TWFjX1BSRUNIRUNLKFNHV3JpdGVTYW1wbGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1dyaXRlU2FtcGxlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBNb3ZpZU9ial9Db252ZXJ0LCAmbSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVGaWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dXcml0ZVNhbXBsZXMoYywKLQkgICAgICAgICAgICAgICAgICAgICBtLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUZpbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmllT2JqX0NvbnZlcnQsICZtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUZpbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1dyaXRlU2FtcGxlcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRmlsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXREYXRhUmF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIGJ5dGVzUGVyU2Vjb25kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgYnl0ZXNQZXJTZWNvbmQ7CiAjaWZuZGVmIFNHR2V0RGF0YVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldERhdGFSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0RGF0YVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0RGF0YVJhdGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc1BlclNlY29uZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJTZWNvbmQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHQWxpZ25DaGFubmVsUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR0FsaWduQ2hhbm5lbFJlY3QKLQlQeU1hY19QUkVDSEVDSyhTR0FsaWduQ2hhbm5lbFJlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHQWxpZ25DaGFubmVsUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0FsaWduQ2hhbm5lbFJlY3QoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0FsaWduQ2hhbm5lbFJlY3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsR2V0RGl0bChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JSGFuZGxlIGRpdGw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkaXRsOwogI2lmbmRlZiBTR1BhbmVsR2V0RGl0bAotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXREaXRsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0RGl0bCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsR2V0RGl0bChzLAotCSAgICAgICAgICAgICAgICAgICAgICZkaXRsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGl0bCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEdldERpdGwocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRpdGwpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxHZXRUaXRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU3RyMjU1IHRpdGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTdHIyNTUgdGl0bGU7CiAjaWZuZGVmIFNHUGFuZWxHZXRUaXRsZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEdldFRpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbEdldFRpdGxlKHMsCi0JICAgICAgICAgICAgICAgICAgICAgIHRpdGxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxHZXRUaXRsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbENhblJ1bihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR1BhbmVsQ2FuUnVuCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbENhblJ1bik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbENhblJ1bik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcywKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxDYW5SdW4ocywKLQkgICAgICAgICAgICAgICAgICAgIGMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbENhblJ1bihzLAorICAgICAgICAgICAgICAgICAgICAgICAgYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEluc3RhbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCURpYWxvZ1B0ciBkOwotCXNob3J0IGl0ZW1PZmZzZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CiAjaWZuZGVmIFNHUGFuZWxJbnN0YWxsCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEluc3RhbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxJbnN0YWxsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbEluc3RhbGwocywKLQkgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgIGQsCi0JICAgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsSW5zdGFsbChzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsRXZlbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCVNHQ2hhbm5lbCBjOwotCURpYWxvZ1B0ciBkOwotCXNob3J0IGl0ZW1PZmZzZXQ7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7Ci0Jc2hvcnQgaXRlbUhpdDsKLQlCb29sZWFuIGhhbmRsZWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CisgICAgRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgc2hvcnQgaXRlbUhpdDsKKyAgICBCb29sZWFuIGhhbmRsZWQ7CiAjaWZuZGVmIFNHUGFuZWxFdmVudAotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEV2ZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsRXZlbnQocywKLQkgICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICAgZCwKLQkgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAotCSAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCwKLQkgICAgICAgICAgICAgICAgICAgJmhhbmRsZWQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0LAotCSAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEV2ZW50UmVjb3JkLCAmdGhlRXZlbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsRXZlbnQocywKKyAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaXRlbU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgJnRoZUV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAmaXRlbUhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxJdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlEaWFsb2dQdHIgZDsKLQlzaG9ydCBpdGVtT2Zmc2V0OwotCXNob3J0IGl0ZW1OdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIFNHQ2hhbm5lbCBjOworICAgIERpYWxvZ1B0ciBkOworICAgIHNob3J0IGl0ZW1PZmZzZXQ7CisgICAgc2hvcnQgaXRlbU51bTsKICNpZm5kZWYgU0dQYW5lbEl0ZW0KLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsSXRlbSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEl0ZW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCi0JICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaXRlbU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxJdGVtKHMsCi0JICAgICAgICAgICAgICAgICAgYywKLQkgICAgICAgICAgICAgICAgICBkLAotCSAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgaXRlbU51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlbU51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHUGFuZWxJdGVtKHMsCisgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICBkLAorICAgICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbU51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFJlbW92ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JRGlhbG9nUHRyIGQ7Ci0Jc2hvcnQgaXRlbU9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgRGlhbG9nUHRyIGQ7CisgICAgc2hvcnQgaXRlbU9mZnNldDsKICNpZm5kZWYgU0dQYW5lbFJlbW92ZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxSZW1vdmUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxSZW1vdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIERsZ09ial9Db252ZXJ0LCAmZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJml0ZW1PZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1BhbmVsUmVtb3ZlKHMsCi0JICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgZCwKLQkgICAgICAgICAgICAgICAgICAgIGl0ZW1PZmZzZXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEbGdPYmpfQ29udmVydCwgJmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVtT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFJlbW92ZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGQsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsU2V0R3JhYmJlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU2VxR3JhYkNvbXBvbmVudCBzZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzZzsKICNpZm5kZWYgU0dQYW5lbFNldEdyYWJiZXIKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0R3JhYmJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldEdyYWJiZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldEdyYWJiZXIocywKLQkgICAgICAgICAgICAgICAgICAgICAgICBzZyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNnKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFNldEdyYWJiZXIocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFNldFJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCXNob3J0IHJlc1JlZjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgc2hvcnQgcmVzUmVmOwogI2lmbmRlZiBTR1BhbmVsU2V0UmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxTZXRSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0UmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVzUmVmKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldFJlc0ZpbGUocywKLQkgICAgICAgICAgICAgICAgICAgICAgICByZXNSZWYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsU2V0UmVzRmlsZShzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbEdldFNldHRpbmdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNlcUdyYWJDb21wb25lbnQgczsKLQlTR0NoYW5uZWwgYzsKLQlVc2VyRGF0YSB1ZDsKLQlsb25nIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNlcUdyYWJDb21wb25lbnQgczsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBVc2VyRGF0YSB1ZDsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBTR1BhbmVsR2V0U2V0dGluZ3MKLQlQeU1hY19QUkVDSEVDSyhTR1BhbmVsR2V0U2V0dGluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRTZXR0aW5ncyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxHZXRTZXR0aW5ncyhzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGFPYmpfTmV3LCB1ZCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1BhbmVsR2V0U2V0dGluZ3MocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX05ldywgdWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHUGFuZWxTZXRTZXR0aW5ncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTZXFHcmFiQ29tcG9uZW50IHM7Ci0JU0dDaGFubmVsIGM7Ci0JVXNlckRhdGEgdWQ7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTZXFHcmFiQ29tcG9uZW50IHM7CisgICAgU0dDaGFubmVsIGM7CisgICAgVXNlckRhdGEgdWQ7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgU0dQYW5lbFNldFNldHRpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFNldFNldHRpbmdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1BhbmVsU2V0U2V0dGluZ3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dQYW5lbFNldFNldHRpbmdzKHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhT2JqX0NvbnZlcnQsICZ1ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFNldFNldHRpbmdzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dQYW5lbFZhbGlkYXRlSW5wdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUJvb2xlYW4gb2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEJvb2xlYW4gb2s7CiAjaWZuZGVmIFNHUGFuZWxWYWxpZGF0ZUlucHV0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbFZhbGlkYXRlSW5wdXQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHUGFuZWxWYWxpZGF0ZUlucHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxWYWxpZGF0ZUlucHV0KHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9rKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBvayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbFZhbGlkYXRlSW5wdXQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG9rKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1BhbmVsR2V0RElUTEZvclNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU2VxR3JhYkNvbXBvbmVudCBzOwotCUhhbmRsZSBkaXRsOwotCVBvaW50IHJlcXVlc3RlZFNpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU2VxR3JhYkNvbXBvbmVudCBzOworICAgIEhhbmRsZSBkaXRsOworICAgIFBvaW50IHJlcXVlc3RlZFNpemU7CiAjaWZuZGVmIFNHUGFuZWxHZXRESVRMRm9yU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNHUGFuZWxHZXRESVRMRm9yU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dQYW5lbEdldERJVExGb3JTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHUGFuZWxHZXRESVRMRm9yU2l6ZShzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGl0bCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZFNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRpdGwsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgcmVxdWVzdGVkU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dQYW5lbEdldERJVExGb3JTaXplKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdGVkU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZGl0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCByZXF1ZXN0ZWRTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNyY1ZpZGVvQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCVJlY3QgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSZWN0IHI7CiAjaWZuZGVmIFNHR2V0U3JjVmlkZW9Cb3VuZHMKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNyY1ZpZGVvQm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFNyY1ZpZGVvQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U3JjVmlkZW9Cb3VuZHMoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTcmNWaWRlb0JvdW5kcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR1NldFZpZGVvUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFZpZGVvUmVjdChjLAotCSAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvUmVjdChjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFZpZGVvUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSZWN0IHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgUmVjdCByOwogI2lmbmRlZiBTR0dldFZpZGVvUmVjdAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvUmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFZpZGVvUmVjdChjLAotCSAgICAgICAgICAgICAgICAgICAgICZyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRWaWRlb1JlY3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VmlkZW9Db21wcmVzc29yVHlwZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlPU1R5cGUgY29tcHJlc3NvclR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgT1NUeXBlIGNvbXByZXNzb3JUeXBlOwogI2lmbmRlZiBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9Db21wcmVzc29yVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3JUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzb3JUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3JUeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzb3JUeXBlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvQ29tcHJlc3NvclR5cGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JT1NUeXBlIGNvbXByZXNzb3JUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIE9TVHlwZSBjb21wcmVzc29yVHlwZTsKICNpZm5kZWYgU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFZpZGVvQ29tcHJlc3NvclR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXByZXNzb3JUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3JUeXBlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3NvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvQ29tcHJlc3NvclR5cGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NvclR5cGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VmlkZW9Db21wcmVzc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGRlcHRoOwotCUNvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvcjsKLQlDb2RlY1Egc3BhdGlhbFF1YWxpdHk7Ci0JQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKLQlsb25nIGtleUZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3I7CisgICAgQ29kZWNRIHNwYXRpYWxRdWFsaXR5OworICAgIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHk7CisgICAgbG9uZyBrZXlGcmFtZVJhdGU7CiAjaWZuZGVmIFNHU2V0VmlkZW9Db21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRWaWRlb0NvbXByZXNzb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9Db21wcmVzc29yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfQ29udmVydCwgJmNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmtleUZyYW1lUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VmlkZW9Db21wcmVzc29yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlGcmFtZVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFZpZGVvQ29tcHJlc3NvcihjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhdGlhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUZyYW1lUmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRWaWRlb0NvbXByZXNzb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgZGVwdGg7Ci0JQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yOwotCUNvZGVjUSBzcGF0aWFsUXVhbGl0eTsKLQlDb2RlY1EgdGVtcG9yYWxRdWFsaXR5OwotCWxvbmcga2V5RnJhbWVSYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGRlcHRoOworICAgIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvcjsKKyAgICBDb2RlY1Egc3BhdGlhbFF1YWxpdHk7CisgICAgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eTsKKyAgICBsb25nIGtleUZyYW1lUmF0ZTsKICNpZm5kZWYgU0dHZXRWaWRlb0NvbXByZXNzb3IKLQlQeU1hY19QUkVDSEVDSyhTR0dldFZpZGVvQ29tcHJlc3Nvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRWaWRlb0NvbXByZXNzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRWaWRlb0NvbXByZXNzb3IoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzb3IsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wb3JhbFF1YWxpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleUZyYW1lUmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBjb21wcmVzc29yLAotCSAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWxRdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsUXVhbGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICBrZXlGcmFtZVJhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VmlkZW9Db21wcmVzc29yKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcG9yYWxRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlGcmFtZVJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaE8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29tcHJlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcGF0aWFsUXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbFF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAga2V5RnJhbWVSYXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRJbnN0YW5jZSBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudEluc3RhbmNlIF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudChjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQoYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUNvbXBvbmVudEluc3RhbmNlIHZkaWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgQ29tcG9uZW50SW5zdGFuY2UgdmRpZzsKICNpZm5kZWYgU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZkaWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZGlnKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdmRpZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkaWcpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKFNHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZChjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1ZpZGVvRGlnaXRpemVyQ2hhbmdlZChjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dyYWJGcmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBidWZmZXJOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgYnVmZmVyTnVtOwogI2lmbmRlZiBTR0dyYWJGcmFtZQotCVB5TWFjX1BSRUNIRUNLKFNHR3JhYkZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHcmFiRnJhbWUoYywKLQkgICAgICAgICAgICAgICAgICBidWZmZXJOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dyYWJGcmFtZShjLAorICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHcmFiRnJhbWVDb21wbGV0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBidWZmZXJOdW07Ci0JQm9vbGVhbiBkb25lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGJ1ZmZlck51bTsKKyAgICBCb29sZWFuIGRvbmU7CiAjaWZuZGVmIFNHR3JhYkZyYW1lQ29tcGxldGUKLQlQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZUNvbXBsZXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dyYWJGcmFtZUNvbXBsZXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dyYWJGcmFtZUNvbXBsZXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmZG9uZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZG9uZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR3JhYkZyYW1lQ29tcGxldGUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlck51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkb25lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb25lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0NvbXByZXNzRnJhbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgYnVmZmVyTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGJ1ZmZlck51bTsKICNpZm5kZWYgU0dDb21wcmVzc0ZyYW1lCi0JUHlNYWNfUFJFQ0hFQ0soU0dDb21wcmVzc0ZyYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0NvbXByZXNzRnJhbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHQ29tcHJlc3NGcmFtZShjLAotCSAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0NvbXByZXNzRnJhbWUoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldENvbXByZXNzQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGRlcHRoOwotCVJlY3QgY29tcHJlc3NTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGRlcHRoOworICAgIFJlY3QgY29tcHJlc3NTaXplOwogI2lmbmRlZiBTR1NldENvbXByZXNzQnVmZmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRDb21wcmVzc0J1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRDb21wcmVzc0J1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbXByZXNzU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0Q29tcHJlc3NCdWZmZXIoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzU2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZjb21wcmVzc1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldENvbXByZXNzQnVmZmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1NpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0Q29tcHJlc3NCdWZmZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgZGVwdGg7Ci0JUmVjdCBjb21wcmVzc1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgZGVwdGg7CisgICAgUmVjdCBjb21wcmVzc1NpemU7CiAjaWZuZGVmIFNHR2V0Q29tcHJlc3NCdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhTR0dldENvbXByZXNzQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldENvbXByZXNzQnVmZmVyKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0Q29tcHJlc3NCdWZmZXIoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc1NpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY29tcHJlc3NTaXplKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldENvbXByZXNzQnVmZmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NTaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNvbXByZXNzU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRCdWZmZXJJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGJ1ZmZlck51bTsKLQlQaXhNYXBIYW5kbGUgYnVmZmVyUE07Ci0JUmVjdCBidWZmZXJSZWN0OwotCUdXb3JsZFB0ciBjb21wcmVzc0J1ZmZlcjsKLQlSZWN0IGNvbXByZXNzQnVmZmVyUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCBidWZmZXJOdW07CisgICAgUGl4TWFwSGFuZGxlIGJ1ZmZlclBNOworICAgIFJlY3QgYnVmZmVyUmVjdDsKKyAgICBHV29ybGRQdHIgY29tcHJlc3NCdWZmZXI7CisgICAgUmVjdCBjb21wcmVzc0J1ZmZlclJlY3Q7CiAjaWZuZGVmIFNHR2V0QnVmZmVySW5mbwotCVB5TWFjX1BSRUNIRUNLKFNHR2V0QnVmZmVySW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRCdWZmZXJJbmZvKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldEJ1ZmZlckluZm8oYywKLQkgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyUE0sCi0JICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3NCdWZmZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc0J1ZmZlclJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBidWZmZXJQTSwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZidWZmZXJSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGNvbXByZXNzQnVmZmVyLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmNvbXByZXNzQnVmZmVyUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlck51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0QnVmZmVySW5mbyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXJQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXByZXNzQnVmZmVyUmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGJ1ZmZlclBNLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJ1ZmZlclJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1dvcmxkT2JqX05ldywgY29tcHJlc3NCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmY29tcHJlc3NCdWZmZXJSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFVzZVNjcmVlbkJ1ZmZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcjsKICNpZm5kZWYgU0dTZXRVc2VTY3JlZW5CdWZmZXIKLQlQeU1hY19QUkVDSEVDSyhTR1NldFVzZVNjcmVlbkJ1ZmZlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VTY3JlZW5CdWZmZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnVzZVNjcmVlbkJ1ZmZlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VXNlU2NyZWVuQnVmZmVyKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2NyZWVuQnVmZmVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2NyZWVuQnVmZmVyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRVc2VTY3JlZW5CdWZmZXIoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTY3JlZW5CdWZmZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VXNlU2NyZWVuQnVmZmVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyOwogI2lmbmRlZiBTR0dldFVzZVNjcmVlbkJ1ZmZlcgotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VXNlU2NyZWVuQnVmZmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFVzZVNjcmVlbkJ1ZmZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFVzZVNjcmVlbkJ1ZmZlcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VTY3JlZW5CdWZmZXIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHVzZVNjcmVlbkJ1ZmZlcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRVc2VTY3JlZW5CdWZmZXIoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlU2NyZWVuQnVmZmVyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTY3JlZW5CdWZmZXIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0RnJhbWVSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUZpeGVkIGZyYW1lUmF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBGaXhlZCBmcmFtZVJhdGU7CiAjaWZuZGVmIFNHU2V0RnJhbWVSYXRlCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGcmFtZVJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0RnJhbWVSYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJmZyYW1lUmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0RnJhbWVSYXRlKGMsCi0JICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZmcmFtZVJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEZyYW1lUmF0ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRGcmFtZVJhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JRml4ZWQgZnJhbWVSYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEZpeGVkIGZyYW1lUmF0ZTsKICNpZm5kZWYgU0dHZXRGcmFtZVJhdGUKLQlQeU1hY19QUkVDSEVDSyhTR0dldEZyYW1lUmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRGcmFtZVJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRGcmFtZVJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAmZnJhbWVSYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgZnJhbWVSYXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR0dldEZyYW1lUmF0ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZmcmFtZVJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBmcmFtZVJhdGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0UHJlZmVycmVkUGFja2V0U2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXM7CiAjaWZuZGVmIFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0UHJlZmVycmVkUGFja2V0U2l6ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFByZWZlcnJlZFBhY2tldFNpemUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzOwogI2lmbmRlZiBTR0dldFByZWZlcnJlZFBhY2tldFNpemUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFByZWZlcnJlZFBhY2tldFNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFByZWZlcnJlZFBhY2tldFNpemUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIGNvbXByZXNzb3JUeXBlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBIYW5kbGUgY29tcHJlc3NvclR5cGVzOwogI2lmbmRlZiBTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0Ci0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjb21wcmVzc29yVHlwZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc29yVHlwZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNvbXByZXNzb3JUeXBlcykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzb3JUeXBlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlIYW5kbGUgY29tcHJlc3NvclR5cGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSBjb21wcmVzc29yVHlwZXM7CiAjaWZuZGVmIFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QKLQlQeU1hY19QUkVDSEVDSyhTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yVHlwZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb21wcmVzc29yVHlwZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc29yVHlwZXMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBjb21wcmVzc29yVHlwZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0U291bmRJbnB1dERyaXZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlTdHIyNTUgZHJpdmVyTmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBTdHIyNTUgZHJpdmVyTmFtZTsKICNpZm5kZWYgU0dTZXRTb3VuZElucHV0RHJpdmVyCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0RHJpdmVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kSW5wdXREcml2ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZHJpdmVyTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U291bmRJbnB1dERyaXZlcihjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJOYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkcml2ZXJOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRTb3VuZElucHV0RHJpdmVyKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyaXZlck5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0U291bmRJbnB1dERyaXZlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFNHQ2hhbm5lbCBjOwogI2lmbmRlZiBTR0dldFNvdW5kSW5wdXREcml2ZXIKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kSW5wdXREcml2ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dERyaXZlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNvdW5kSW5wdXREcml2ZXIoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0RHJpdmVyKGMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU291bmRJbnB1dERyaXZlckNoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHU291bmRJbnB1dERyaXZlckNoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU291bmRJbnB1dERyaXZlckNoYW5nZWQoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZChjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCWxvbmcgc2Vjb25kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBsb25nIHNlY29uZHM7CiAjaWZuZGVmIFNHU2V0U291bmRSZWNvcmRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKLQlTR0NoYW5uZWwgYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgU0dDaGFubmVsIGM7CiAjaWZuZGVmIFNHR2V0U291bmRSZWNvcmRDaHVua1NpemUKLQlQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0U291bmRSZWNvcmRDaHVua1NpemUoYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZShjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFNvdW5kSW5wdXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgRml4ZWQgcmF0ZTsKICNpZm5kZWYgU0dTZXRTb3VuZElucHV0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0U291bmRJbnB1dFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0U291bmRJbnB1dFJhdGUoYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFNvdW5kSW5wdXRSYXRlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR0dldFNvdW5kSW5wdXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGaXhlZCBfcnY7Ci0JU0dDaGFubmVsIGM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEZpeGVkIF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKICNpZm5kZWYgU0dHZXRTb3VuZElucHV0UmF0ZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHR2V0U291bmRJbnB1dFJhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dHZXRTb3VuZElucHV0UmF0ZShjKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0UmF0ZShjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBzYW1wbGVTaXplOwotCXNob3J0IG51bUNoYW5uZWxzOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgc2FtcGxlU2l6ZTsKKyAgICBzaG9ydCBudW1DaGFubmVsczsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOwogI2lmbmRlZiBTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm51bUNoYW5uZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNvbXByZXNzaW9uVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uVHlwZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBzYW1wbGVTaXplOwotCXNob3J0IG51bUNoYW5uZWxzOwotCU9TVHlwZSBjb21wcmVzc2lvblR5cGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgc2hvcnQgc2FtcGxlU2l6ZTsKKyAgICBzaG9ydCBudW1DaGFubmVsczsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOwogI2lmbmRlZiBTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvblR5cGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaGhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGNvbXByZXNzaW9uVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25UeXBlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBjb21wcmVzc2lvblR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JSGFuZGxlIHJhdGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIEhhbmRsZSByYXRlczsKICNpZm5kZWYgU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcwotCVB5TWFjX1BSRUNIRUNLKFNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmF0ZXMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmF0ZXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlIYW5kbGUgcmF0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgSGFuZGxlIHJhdGVzOwogI2lmbmRlZiBTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzCi0JUHlNYWNfUFJFQ0hFQ0soU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmF0ZXMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCByYXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhdGVzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcmF0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0Rm9udE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0JU3RyaW5nUHRyIHBzdHI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgU0dDaGFubmVsIGM7CisgICAgU3RyaW5nUHRyIHBzdHI7CiAjaWZuZGVmIFNHU2V0Rm9udE5hbWUKLQlQeU1hY19QUkVDSEVDSyhTR1NldEZvbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldEZvbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwc3RyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRGb250TmFtZShjLAotCSAgICAgICAgICAgICAgICAgICAgcHN0cik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldEZvbnROYW1lKGMsCisgICAgICAgICAgICAgICAgICAgICAgICBwc3RyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldEZvbnRTaXplKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVNHQ2hhbm5lbCBjOwotCXNob3J0IGZvbnRTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGZvbnRTaXplOwogI2lmbmRlZiBTR1NldEZvbnRTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRGb250U2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRGb250U2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9udFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBTR1NldEZvbnRTaXplKGMsCi0JICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnRTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRGb250U2l6ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9udFNpemUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VGV4dEZvcmVDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSR0JDb2xvciB0aGVDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSR0JDb2xvciB0aGVDb2xvcjsKICNpZm5kZWYgU0dTZXRUZXh0Rm9yZUNvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0Rm9yZUNvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFRleHRGb3JlQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRUZXh0Rm9yZUNvbG9yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnRoZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFRleHRGb3JlQ29sb3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmdGhlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0VGV4dEJhY2tDb2xvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlSR0JDb2xvciB0aGVDb2xvcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBSR0JDb2xvciB0aGVDb2xvcjsKICNpZm5kZWYgU0dTZXRUZXh0QmFja0NvbG9yCi0JUHlNYWNfUFJFQ0hFQ0soU0dTZXRUZXh0QmFja0NvbG9yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTR1NldFRleHRCYWNrQ29sb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRUZXh0QmFja0NvbG9yKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVDb2xvcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJnRoZUNvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBTR1NldFRleHRCYWNrQ29sb3IoYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUNvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfTmV3LCAmdGhlQ29sb3IpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHU2V0SnVzdGlmaWNhdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCBqdXN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IGp1c3Q7CiAjaWZuZGVmIFNHU2V0SnVzdGlmaWNhdGlvbgotCVB5TWFjX1BSRUNIRUNLKFNHU2V0SnVzdGlmaWNhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dTZXRKdXN0aWZpY2F0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCi0JICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU0dTZXRKdXN0aWZpY2F0aW9uKGMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dTZXRKdXN0aWZpY2F0aW9uKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1NHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlTR0NoYW5uZWwgYzsKLQlzaG9ydCByZXR0b3NwYWNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFNHQ2hhbm5lbCBjOworICAgIHNob3J0IHJldHRvc3BhY2U7CiAjaWZuZGVmIFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZQotCVB5TWFjX1BSRUNIRUNLKFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgcmV0dG9zcGFjZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlKGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXR0b3NwYWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9TR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JU0dDaGFubmVsIGM7Ci0Jc2hvcnQgcmV0dG9zcGFjZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBTR0NoYW5uZWwgYzsKKyAgICBzaG9ydCByZXR0b3NwYWNlOwogI2lmbmRlZiBTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUKLQlQeU1hY19QUkVDSEVDSyhTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmV0dG9zcGFjZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZShjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR0b3NwYWNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlTdHIyNTUgc3RyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgU3RyMjU1IHN0cjsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHN0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgc3RyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JU3RyMjU1IHN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFN0cjI1NSBzdHI7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldENsaWVudE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JU3RyMjU1IHN0cjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFN0cjI1NSBzdHI7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRDbGllbnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBzdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRCZWdpbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRCZWdpbgotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRCZWdpbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJlZ2luKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0QmVnaW4odm8pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0QmVnaW4odm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRFbmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0RW5kCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEVuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEVuZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEVuZCh2byk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUVmlkZW9PdXRwdXRFbmQodm8pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCWxvbmcgZGlzcGxheU1vZGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIGxvbmcgZGlzcGxheU1vZGVJRDsKICNpZm5kZWYgUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5TW9kZUlEKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlKHZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZUlEKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlNb2RlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlNb2RlSUQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCWxvbmcgZGlzcGxheU1vZGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIGxvbmcgZGlzcGxheU1vZGVJRDsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZSh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlNb2RlSUQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlNb2RlSUQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUodm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXNwbGF5TW9kZUlEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TW9kZUlEKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JR1dvcmxkUHRyIGd3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgR1dvcmxkUHRyIGd3OwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0R2V0R1dvcmxkCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEdXb3JsZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEdldEdXb3JsZCh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZndyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEdXb3JsZCh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZndyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdXb3JsZE9ial9OZXcsIGd3KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlsb25nIGluZGV4OwotCUNvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBsb25nIGluZGV4OworICAgIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgb3V0cHV0Q29tcG9uZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0KHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dENvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIG91dHB1dENvbXBvbmVudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldENsb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2xvY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBDb21wb25lbnRJbnN0YW5jZSBjbG9jazsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldENsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldENsb2NrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0Q2xvY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRDbG9jayh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsb2NrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9OZXcsIGNsb2NrKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnZvKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldENsb2NrKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgY2xvY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOwotCUNHcmFmUHRyIGVjaG9Qb3J0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87CisgICAgQ0dyYWZQdHIgZWNob1BvcnQ7CiAjaWZuZGVmIFFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydAotCVB5TWFjX1BSRUNIRUNLKFFUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKLQkgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmZWNob1BvcnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQodm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0KHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvUG9ydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm87Ci0JbG9uZyBpbmRleDsKLQlDb21wb25lbnQgY29kZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKKyAgICBsb25nIGluZGV4OworICAgIENvbXBvbmVudCBjb2RlYzsKICNpZm5kZWYgUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yCi0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKTsKKyAgICBQeU1hY19QUkVDSEVDSyhRVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3Nvcih2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcE9ial9OZXcsIGNvZGVjKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yKHZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgY29kZWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1FUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JUVRWaWRlb091dHB1dENvbXBvbmVudCB2bzsKLQlDR3JhZlB0ciBlY2hvUG9ydDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvOworICAgIENHcmFmUHRyIGVjaG9Qb3J0OwogI2lmbmRlZiBRVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCh2bywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmVjaG9Qb3J0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCh2bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9Qb3J0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlVSW50MzIgZmxhZ3M7Ci0JVUludDMyIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVUludDMyIGZsYWdzOworICAgIFVJbnQzMiBmbGFnc01hc2s7CiAjaWZuZGVmIE1lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzTWFzaykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzTWFzayk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVUludDMyIGZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBVSW50MzIgZmxhZ3M7CiAjaWZuZGVmIE1lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTaXplIGFsbG93YW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU2l6ZSBhbGxvd2FuY2U7CiAjaWZuZGVmIE1lZGlhU2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWxsb3dhbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvd2FuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTaXplIGFsbG93YW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU2l6ZSBhbGxvd2FuY2U7CiAjaWZuZGVmIE1lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsbG93YW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGxvd2FuY2UpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyhtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MobWgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGZsYWdzTWFzazsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGZsYWdzTWFzazsKICNpZm5kZWYgTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFnc01hc2spKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc01hc2spOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NNYXNrKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NNYXNrKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUlkbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSBhdE1lZGlhVGltZTsKLQlsb25nIGZsYWdzSW47Ci0JbG9uZyBmbGFnc091dDsKLQlUaW1lUmVjb3JkIG1vdmllVGltZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVZhbHVlIGF0TWVkaWFUaW1lOworICAgIGxvbmcgZmxhZ3NJbjsKKyAgICBsb25nIGZsYWdzT3V0OworICAgIFRpbWVSZWNvcmQgbW92aWVUaW1lOwogI2lmbmRlZiBNZWRpYUlkbGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUlkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZtb3ZpZVRpbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUlkbGUobWgsCi0JICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAotCSAgICAgICAgICAgICAgICBmbGFnc0luLAotCSAgICAgICAgICAgICAgICAmZmxhZ3NPdXQsCi0JICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3NJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRUaW1lUmVjb3JkX0NvbnZlcnQsICZtb3ZpZVRpbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUlkbGUobWgsCisgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lLAorICAgICAgICAgICAgICAgICAgICBmbGFnc0luLAorICAgICAgICAgICAgICAgICAgICAmZmxhZ3NPdXQsCisgICAgICAgICAgICAgICAgICAgICZtb3ZpZVRpbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzT3V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE1lZGlhSW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JSGFuZGxlIGg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEhhbmRsZSBoOwogI2lmbmRlZiBNZWRpYUdldE1lZGlhSW5mbwotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TWVkaWFJbmZvKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldE1lZGlhSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TWVkaWFJbmZvKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRNZWRpYUluZm8obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFQdXRNZWRpYUluZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBIYW5kbGUgaDsKICNpZm5kZWYgTWVkaWFQdXRNZWRpYUluZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVB1dE1lZGlhSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFQdXRNZWRpYUluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVB1dE1lZGlhSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUHV0TWVkaWFJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0QWN0aXZlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGVuYWJsZU1lZGlhOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGVuYWJsZU1lZGlhOwogI2lmbmRlZiBNZWRpYVNldEFjdGl2ZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0QWN0aXZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEFjdGl2ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZU1lZGlhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRBY3RpdmUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgZW5hYmxlTWVkaWEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlTWVkaWEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldEFjdGl2ZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNZWRpYSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRSYXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlGaXhlZCByYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBGaXhlZCByYXRlOwogI2lmbmRlZiBNZWRpYVNldFJhdGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFJhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0UmF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmcmF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0UmF0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgcmF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFJhdGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR0dldFN0YXR1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycjsKICNpZm5kZWYgTWVkaWFHR2V0U3RhdHVzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHR2V0U3RhdHVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdHZXRTdGF0dXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR0dldFN0YXR1cyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1c0Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgc3RhdHVzRXJyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHR2V0U3RhdHVzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzRXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNFcnIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tFZGl0ZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgTWVkaWFUcmFja0VkaXRlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tFZGl0ZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tFZGl0ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhVHJhY2tFZGl0ZWQobWgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVRyYWNrRWRpdGVkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldE1lZGlhVGltZVNjYWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lU2NhbGUgbmV3VGltZVNjYWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lU2NhbGUgbmV3VGltZVNjYWxlOwogI2lmbmRlZiBNZWRpYVNldE1lZGlhVGltZVNjYWxlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTY2FsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0TWVkaWFUaW1lU2NhbGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaW1lU2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3VGltZVNjYWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRNZWRpYVRpbWVTY2FsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RpbWVTY2FsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JVGltZVNjYWxlIG5ld1RpbWVTY2FsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgVGltZVNjYWxlIG5ld1RpbWVTY2FsZTsKICNpZm5kZWYgTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0TW92aWVUaW1lU2NhbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0TW92aWVUaW1lU2NhbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdUaW1lU2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldE1vdmllVGltZVNjYWxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTY2FsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0TW92aWVUaW1lU2NhbGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUaW1lU2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0R1dvcmxkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlDR3JhZlB0ciBhUG9ydDsKLQlHREhhbmRsZSBhR0Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENHcmFmUHRyIGFQb3J0OworICAgIEdESGFuZGxlIGFHRDsKICNpZm5kZWYgTWVkaWFTZXRHV29ybGQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldEdXb3JsZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRHV29ybGQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmFQb3J0LAotCSAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0R1dvcmxkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgIGFQb3J0LAotCSAgICAgICAgICAgICAgICAgICAgIGFHRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfQ29udmVydCwgJmFQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmFHRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0R1dvcmxkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGFHRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXREaW1lbnNpb25zKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlGaXhlZCB3aWR0aDsKLQlGaXhlZCBoZWlnaHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIEZpeGVkIHdpZHRoOworICAgIEZpeGVkIGhlaWdodDsKICNpZm5kZWYgTWVkaWFTZXREaW1lbnNpb25zCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXREaW1lbnNpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldERpbWVuc2lvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmd2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaGVpZ2h0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXREaW1lbnNpb25zKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZoZWlnaHQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldERpbWVuc2lvbnMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0Q2xpcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmduSGFuZGxlIHRoZUNsaXA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSB0aGVDbGlwOwogI2lmbmRlZiBNZWRpYVNldENsaXAKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldENsaXApOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0Q2xpcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdGhlQ2xpcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0Q2xpcChtaCwKLQkgICAgICAgICAgICAgICAgICAgdGhlQ2xpcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUNsaXApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldENsaXAobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHRoZUNsaXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0VHJhY2tPcGFxdWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUJvb2xlYW4gdHJhY2tJc09wYXF1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiB0cmFja0lzT3BhcXVlOwogI2lmbmRlZiBNZWRpYUdldFRyYWNrT3BhcXVlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRUcmFja09wYXF1ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRUcmFja09wYXF1ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRUcmFja09wYXF1ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0lzT3BhcXVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB0cmFja0lzT3BhcXVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRUcmFja09wYXF1ZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0lzT3BhcXVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lzT3BhcXVlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBtb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgbW9kZTsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBNZWRpYVNldEdyYXBoaWNzTW9kZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0R3JhcGhpY3NNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldEdyYXBoaWNzTW9kZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJm9wQ29sb3IpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldEdyYXBoaWNzTW9kZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcENvbG9yKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEdyYXBoaWNzTW9kZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBtb2RlOwotCVJHQkNvbG9yIG9wQ29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgbW9kZTsKKyAgICBSR0JDb2xvciBvcENvbG9yOwogI2lmbmRlZiBNZWRpYUdldEdyYXBoaWNzTW9kZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0R3JhcGhpY3NNb2RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEdyYXBoaWNzTW9kZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRHcmFwaGljc01vZGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRHcmFwaGljc01vZGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wQ29sb3IpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZvcENvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdTZXRWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgdm9sdW1lOwogI2lmbmRlZiBNZWRpYUdTZXRWb2x1bWUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdTZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR1NldFZvbHVtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR1NldFZvbHVtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR1NldFZvbHVtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFNvdW5kQmFsYW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgYmFsYW5jZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgYmFsYW5jZTsKICNpZm5kZWYgTWVkaWFTZXRTb3VuZEJhbGFuY2UKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kQmFsYW5jZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZEJhbGFuY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZEJhbGFuY2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZEJhbGFuY2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZEJhbGFuY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGJhbGFuY2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGJhbGFuY2U7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRCYWxhbmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEJhbGFuY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRCYWxhbmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kQmFsYW5jZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U291bmRCYWxhbmNlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYWxhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSB3aGVuOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgd2hlbjsKICNpZm5kZWYgTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndoZW4pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHdoZW4pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aGVuKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFNyY1JnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmduSGFuZGxlIHJnbjsKLQlUaW1lVmFsdWUgYXRNZWRpYVRpbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSByZ247CisgICAgVGltZVZhbHVlIGF0TWVkaWFUaW1lOwogI2lmbmRlZiBNZWRpYUdldFNyY1JnbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U3JjUmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFNyY1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRTcmNSZ24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgcmduLAotCSAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0TWVkaWFUaW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTcmNSZ24obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmduLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF0TWVkaWFUaW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVByZXJvbGwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVRpbWVWYWx1ZSB0aW1lOwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFRpbWVWYWx1ZSB0aW1lOworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIE1lZGlhUHJlcm9sbAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhUHJlcm9sbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFQcmVyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVByZXJvbGwobWgsCi0JICAgICAgICAgICAgICAgICAgIHRpbWUsCi0JICAgICAgICAgICAgICAgICAgIHJhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnJhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVByZXJvbGwobWgsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHJhdGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGluZGV4OwogI2lmbmRlZiBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25DaGFuZ2VkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JT1NUeXBlIGNoYXJhY3RlcmlzdGljOwotCUJvb2xlYW4gaGFzSXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIE9TVHlwZSBjaGFyYWN0ZXJpc3RpYzsKKyAgICBCb29sZWFuIGhhc0l0OwogI2lmbmRlZiBNZWRpYUhhc0NoYXJhY3RlcmlzdGljCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmNoYXJhY3RlcmlzdGljKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcmlzdGljLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhc0l0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBoYXNJdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjaGFyYWN0ZXJpc3RpYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhSGFzQ2hhcmFjdGVyaXN0aWMobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNJdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JUmVjdCBib3VuZHM7Ci0Jc2hvcnQgZGVwdGg7Ci0JQ1RhYkhhbmRsZSBjdGFiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBSZWN0IGJvdW5kczsKKyAgICBzaG9ydCBkZXB0aDsKKyAgICBDVGFiSGFuZGxlIGN0YWI7CiAjaWZuZGVmIE1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZjdGFiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RhYik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmN0YWIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGFiKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmYm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldEhpbnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGhpbnRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGhpbnRzOwogI2lmbmRlZiBNZWRpYVNldEhpbnRzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIaW50cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRIaW50cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhpbnRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRIaW50cyhtaCwKLQkgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbnRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRIaW50cyhtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVN0cjI1NSBuYW1lOwotCWxvbmcgcmVxdWVzdGVkTGFuZ3VhZ2U7Ci0JbG9uZyBhY3R1YWxMYW5ndWFnZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgU3RyMjU1IG5hbWU7CisgICAgbG9uZyByZXF1ZXN0ZWRMYW5ndWFnZTsKKyAgICBsb25nIGFjdHVhbExhbmd1YWdlOwogI2lmbmRlZiBNZWRpYUdldE5hbWUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldE5hbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0ZWRMYW5ndWFnZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0TmFtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgbmFtZSwKLQkgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkTGFuZ3VhZ2UsCi0JICAgICAgICAgICAgICAgICAgICZhY3R1YWxMYW5ndWFnZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYWN0dWFsTGFuZ3VhZ2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RlZExhbmd1YWdlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXROYW1lKG1oLAorICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbExhbmd1YWdlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxMYW5ndWFnZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFGb3JjZVVwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBmb3JjZVVwZGF0ZUZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZvcmNlVXBkYXRlRmxhZ3M7CiAjaWZuZGVmIE1lZGlhRm9yY2VVcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUZvcmNlVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUZvcmNlVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9yY2VVcGRhdGVGbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhRm9yY2VVcGRhdGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZUZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcmNlVXBkYXRlRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUZvcmNlVXBkYXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGVGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXREcmF3aW5nUmduKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlSZ25IYW5kbGUgcGFydGlhbFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgUmduSGFuZGxlIHBhcnRpYWxSZ247CiAjaWZuZGVmIE1lZGlhR2V0RHJhd2luZ1JnbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RHJhd2luZ1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXREcmF3aW5nUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldERyYXdpbmdSZ24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0aWFsUmduKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgcGFydGlhbFJnbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0RHJhd2luZ1JnbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRpYWxSZ24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBwYXJ0aWFsUmduKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdTZXRBY3RpdmVTZWdtZW50KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlUaW1lVmFsdWUgYWN0aXZlU3RhcnQ7Ci0JVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBUaW1lVmFsdWUgYWN0aXZlU3RhcnQ7CisgICAgVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uOwogI2lmbmRlZiBNZWRpYUdTZXRBY3RpdmVTZWdtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0QWN0aXZlU2VnbWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0QWN0aXZlU2VnbWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZhY3RpdmVTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZUR1cmF0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHU2V0QWN0aXZlU2VnbWVudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN0YXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRHVyYXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGl2ZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0aXZlRHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdTZXRBY3RpdmVTZWdtZW50KG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEdXJhdGlvbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFJbnZhbGlkYXRlUmVnaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlSZ25IYW5kbGUgaW52YWxSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSBpbnZhbFJnbjsKICNpZm5kZWYgTWVkaWFJbnZhbGlkYXRlUmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFJbnZhbGlkYXRlUmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUludmFsaWRhdGVSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFJbnZhbGlkYXRlUmVnaW9uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbFJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmludmFsUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFJbnZhbGlkYXRlUmVnaW9uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbFJnbik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXROZXh0U3RlcFRpbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGZsYWdzOwotCVRpbWVWYWx1ZSBtZWRpYVRpbWVJbjsKLQlUaW1lVmFsdWUgbWVkaWFUaW1lT3V0OwotCUZpeGVkIHJhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIHNob3J0IGZsYWdzOworICAgIFRpbWVWYWx1ZSBtZWRpYVRpbWVJbjsKKyAgICBUaW1lVmFsdWUgbWVkaWFUaW1lT3V0OworICAgIEZpeGVkIHJhdGU7CiAjaWZuZGVmIE1lZGlhR2V0TmV4dFN0ZXBUaW1lCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXROZXh0U3RlcFRpbWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0TmV4dFN0ZXBUaW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWVJbiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXROZXh0U3RlcFRpbWUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lSW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYVRpbWVJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZyYXRlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXROZXh0U3RlcFRpbWUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhVGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgaW5wdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBpbnB1dEluZGV4OwogI2lmbmRlZiBNZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0SW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dEluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOwogI2lmbmRlZiBNZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkKG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBzYW1wbGVOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgc2FtcGxlTnVtOwogI2lmbmRlZiBNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhUmVsZWFzZVNhbXBsZURhdGFQb2ludGVyKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUmVsZWFzZVNhbXBsZURhdGFQb2ludGVyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRyYWNrUHJvcGVydHlBdG9tQ2hhbmdlZChtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNldFZpZGVvUGFyYW0oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgd2hpY2hQYXJhbTsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyB3aGljaFBhcmFtOworICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlOwogI2lmbmRlZiBNZWRpYVNldFZpZGVvUGFyYW0KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFZpZGVvUGFyYW0pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0VmlkZW9QYXJhbSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoaWNoUGFyYW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFZpZGVvUGFyYW0obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFyYW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hpY2hQYXJhbSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhU2V0VmlkZW9QYXJhbShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2hQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibEgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRWaWRlb1BhcmFtKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHdoaWNoUGFyYW07Ci0JdW5zaWduZWQgc2hvcnQgdmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgd2hpY2hQYXJhbTsKKyAgICB1bnNpZ25lZCBzaG9ydCB2YWx1ZTsKICNpZm5kZWYgTWVkaWFHZXRWaWRlb1BhcmFtCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRWaWRlb1BhcmFtKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFZpZGVvUGFyYW0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ3aGljaFBhcmFtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRWaWRlb1BhcmFtKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaFBhcmFtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsSCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndoaWNoUGFyYW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFZpZGVvUGFyYW0obWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhQ29tcGFyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBpc09LOwotCU1lZGlhIHNyY01lZGlhOwotCUNvbXBvbmVudEluc3RhbmNlIHNyY01lZGlhQ29tcG9uZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGlzT0s7CisgICAgTWVkaWEgc3JjTWVkaWE7CisgICAgQ29tcG9uZW50SW5zdGFuY2Ugc3JjTWVkaWFDb21wb25lbnQ7CiAjaWZuZGVmIE1lZGlhQ29tcGFyZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhQ29tcGFyZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDb21wYXJlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBNZWRpYU9ial9Db252ZXJ0LCAmc3JjTWVkaWEsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnNyY01lZGlhQ29tcG9uZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFDb21wYXJlKG1oLAotCSAgICAgICAgICAgICAgICAgICAmaXNPSywKLQkgICAgICAgICAgICAgICAgICAgc3JjTWVkaWEsCi0JICAgICAgICAgICAgICAgICAgIHNyY01lZGlhQ29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpc09LKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFPYmpfQ29udmVydCwgJnNyY01lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZzcmNNZWRpYUNvbXBvbmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhQ29tcGFyZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgJmlzT0ssCisgICAgICAgICAgICAgICAgICAgICAgIHNyY01lZGlhLAorICAgICAgICAgICAgICAgICAgICAgICBzcmNNZWRpYUNvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaXNPSyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRDbG9jayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50SW5zdGFuY2UgY2xvY2s7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudEluc3RhbmNlIGNsb2NrOwogI2lmbmRlZiBNZWRpYUdldENsb2NrCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRDbG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRDbG9jayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRDbG9jayhtaCwKLQkgICAgICAgICAgICAgICAgICAgICZjbG9jayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBjbG9jayk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0Q2xvY2sobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAmY2xvY2spOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgY2xvY2spOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQ7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX0NvbnZlcnQsICZvdXRwdXRDb21wb25lbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50KG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcE9ial9Db252ZXJ0LCAmb3V0cHV0Q29tcG9uZW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENvbXBvbmVudCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQ29tcG9uZW50IG91dHB1dENvbXBvbmVudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudDsKICNpZm5kZWYgTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Q29tcG9uZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgQ21wT2JqX05ldywgb3V0cHV0Q29tcG9uZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRDb21wb25lbnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBPYmpfTmV3LCBvdXRwdXRDb21wb25lbnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgSGFuZGxlIGRhdGE7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRMb2NhbGl6YXRpb25EYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEludmFsaWRSZWdpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVJnbkhhbmRsZSByZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFJnbkhhbmRsZSByZ247CiAjaWZuZGVmIE1lZGlhR2V0SW52YWxpZFJlZ2lvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0SW52YWxpZFJlZ2lvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRJbnZhbGlkUmVnaW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZ24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldEludmFsaWRSZWdpb24obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0SW52YWxpZFJlZ2lvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmduKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKICNpZm5kZWYgTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4obWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25IKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBzYW1wbGVEZXNjcmlwdGlvbkg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSDsKICNpZm5kZWYgTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNhbXBsZURlc2NyaXB0aW9uSCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVEZXNjcmlwdGlvbkgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzYW1wbGVEZXNjcmlwdGlvbkgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlRGVzY3JpcHRpb25IKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgaW5wdXRJbmRleDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBpbnB1dEluZGV4OwogI2lmbmRlZiBNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlucHV0SW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRJbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRVUkxMaW5rKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlQb2ludCBkaXNwbGF5V2hlcmU7Ci0JSGFuZGxlIHVybExpbms7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFBvaW50IGRpc3BsYXlXaGVyZTsKKyAgICBIYW5kbGUgdXJsTGluazsKICNpZm5kZWYgTWVkaWFHZXRVUkxMaW5rCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRVUkxMaW5rKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldFVSTExpbmspOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmRpc3BsYXlXaGVyZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0VVJMTGluayhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVdoZXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdXJsTGluayk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHVybExpbmspOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZkaXNwbGF5V2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFVSTExpbmsobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlXaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnVybExpbmspOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCB1cmxMaW5rKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgZmxhZ3M7Ci0JUG9pbnQgbG9jOwotCWxvbmcgdGFyZ2V0UmVmQ29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIGZsYWdzOworICAgIFBvaW50IGxvYzsKKyAgICBsb25nIHRhcmdldFJlZkNvbjsKICNpZm5kZWYgTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhSGl0VGVzdFRhcmdldFJlZkNvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyB0YXJnZXRSZWZDb247Ci0JbG9uZyBmbGFnczsKLQlQb2ludCBsb2M7Ci0JQm9vbGVhbiB3YXNIaXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgdGFyZ2V0UmVmQ29uOworICAgIGxvbmcgZmxhZ3M7CisgICAgUG9pbnQgbG9jOworICAgIEJvb2xlYW4gd2FzSGl0OwogI2lmbmRlZiBNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRhcmdldFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmxvYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2FzSGl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB3YXNIaXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmbG9jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3YXNIaXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHdhc0hpdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHRhcmdldFJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyB0YXJnZXRSZWZDb247CiAjaWZuZGVmIE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbgotCVB5TWFjX1BSRUNIRUNLKE1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFyZ2V0UmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRSZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIGZpcnN0UmVmQ29uOwotCWxvbmcgc2Vjb25kUmVmQ29uOwotCUJvb2xlYW4gZXF1YWw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgZmlyc3RSZWZDb247CisgICAgbG9uZyBzZWNvbmRSZWZDb247CisgICAgQm9vbGVhbiBlcXVhbDsKICNpZm5kZWYgTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVRhcmdldFJlZkNvbnNFcXVhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFUYXJnZXRSZWZDb25zRXF1YWwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRSZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRhcmdldFJlZkNvbnNFcXVhbChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRSZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlyc3RSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRSZWZDb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYVRhcmdldFJlZkNvbnNFcXVhbChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRSZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVxdWFsKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFQcmVQcmVyb2xsQ2FuY2VsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQl2b2lkICogcmVmY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICB2b2lkICogcmVmY29uOwogI2lmbmRlZiBNZWRpYVByZVByZXJvbGxDYW5jZWwKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVByZVByZXJvbGxDYW5jZWwpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhUHJlUHJlcm9sbENhbmNlbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUHJlUHJlcm9sbENhbmNlbChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZmNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUHJlUHJlcm9sbENhbmNlbChtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUVudGVyRW1wdHlFZGl0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhRW50ZXJFbXB0eUVkaXQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUVudGVyRW1wdHlFZGl0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUVudGVyRW1wdHlFZGl0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUVudGVyRW1wdHlFZGl0KG1oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFFbnRlckVtcHR5RWRpdChtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIG1pbGxpU2VjczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBtaWxsaVNlY3M7CiAjaWZuZGVmIE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaVNlY3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1pbGxpU2Vjcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpU2Vjcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlTZWNzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0Jc2hvcnQgdm9sdW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCB2b2x1bWU7CiAjaWZuZGVmIE1lZGlhR2V0RWZmZWN0aXZlVm9sdW1lCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RWZmZWN0aXZlVm9sdW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JQm9vbGVhbiBlbmFibGVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBCb29sZWFuIGVuYWJsZWQ7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmFibGVkKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBlbmFibGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGVuYWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBlbmFibGU7CiAjaWZuZGVmIE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZAotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5hYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBiYWxhbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBiYWxhbmNlOwogI2lmbmRlZiBNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZQotCVB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTY3JlZW5Mb2NrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlCb29sZWFuIGxvY2tJdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgQm9vbGVhbiBsb2NrSXQ7CiAjaWZuZGVmIE1lZGlhU2V0U2NyZWVuTG9jawotCVB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0U2NyZWVuTG9jayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTY3JlZW5Mb2NrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmbG9ja0l0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFTZXRTY3JlZW5Mb2NrKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrSXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9ja0l0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTY3JlZW5Mb2NrKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrSXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0RXJyb3JTdHJpbmcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudFJlc3VsdCB0aGVFcnJvcjsKLQlTdHIyNTUgZXJyb3JTdHJpbmc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudFJlc3VsdCB0aGVFcnJvcjsKKyAgICBTdHIyNTUgZXJyb3JTdHJpbmc7CiAjaWZuZGVmIE1lZGlhR2V0RXJyb3JTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVycm9yU3RyaW5nKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUdldEVycm9yU3RyaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVFcnJvciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBlcnJvclN0cmluZykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0RXJyb3JTdHJpbmcobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVFcnJvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RyaW5nKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZXJyb3JTdHJpbmcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldEVycm9yU3RyaW5nKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0cmluZyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCVVJbnQ4IGJhbmRMZXZlbHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIFVJbnQ4IGJhbmRMZXZlbHM7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFuZExldmVscyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFuZExldmVscyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYW5kTGV2ZWxzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kTGV2ZWxzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYURvSWRsZUFjdGlvbnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKICNpZm5kZWYgTWVkaWFEb0lkbGVBY3Rpb25zCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFEb0lkbGVBY3Rpb25zKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYURvSWRsZUFjdGlvbnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhRG9JZGxlQWN0aW9ucyhtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhRG9JZGxlQWN0aW9ucyhtaCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCXNob3J0IGJhc3M7Ci0Jc2hvcnQgdHJlYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBzaG9ydCBiYXNzOworICAgIHNob3J0IHRyZWJsZTsKICNpZm5kZWYgTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFNvdW5kQmFzc0FuZFRyZWJsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyZWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZiYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlzaG9ydCBiYXNzOwotCXNob3J0IHRyZWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgc2hvcnQgYmFzczsKKyAgICBzaG9ydCB0cmVibGU7CiAjaWZuZGVmIE1lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgYmFzcywKLQkgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJlYmxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmVibGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhVGltZUJhc2VDaGFuZ2VkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CiAjaWZuZGVmIE1lZGlhVGltZUJhc2VDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFUaW1lQmFzZUNoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVGltZUJhc2VDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYVRpbWVCYXNlQ2hhbmdlZChtaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVGltZUJhc2VDaGFuZ2VkKG1oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYU1DSXNQbGF5ZXJFdmVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JRXZlbnRSZWNvcmQgZTsKLQlCb29sZWFuIGhhbmRsZWRJdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgRXZlbnRSZWNvcmQgZTsKKyAgICBCb29sZWFuIGhhbmRsZWRJdDsKICNpZm5kZWYgTWVkaWFNQ0lzUGxheWVyRXZlbnQKLQlQeU1hY19QUkVDSEVDSyhNZWRpYU1DSXNQbGF5ZXJFdmVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFNQ0lzUGxheWVyRXZlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYU1DSXNQbGF5ZXJFdmVudChtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlZEl0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkSXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFNQ0lzUGxheWVyRXZlbnQobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbmRsZWRJdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlZEl0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldE1lZGlhTG9hZFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIG1lZGlhTG9hZFN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBsb25nIG1lZGlhTG9hZFN0YXRlOwogI2lmbmRlZiBNZWRpYUdldE1lZGlhTG9hZFN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZWRpYUxvYWRTdGF0ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgbWVkaWFMb2FkU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdldE1lZGlhTG9hZFN0YXRlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lZGlhTG9hZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUxvYWRTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFWaWRlb091dHB1dENoYW5nZWQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUNvbXBvbmVudEluc3RhbmNlIHZvdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIENvbXBvbmVudEluc3RhbmNlIHZvdXQ7CiAjaWZuZGVmIE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFWaWRlb091dHB1dENoYW5nZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm91dCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdm91dCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhRW1wdHlTYW1wbGVDYWNoZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyBzYW1wbGVOdW07Ci0JbG9uZyBzYW1wbGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBzYW1wbGVOdW07CisgICAgbG9uZyBzYW1wbGVDb3VudDsKICNpZm5kZWYgTWVkaWFFbXB0eVNhbXBsZUNhY2hlCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFFbXB0eVNhbXBsZUNhY2hlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYUVtcHR5U2FtcGxlQ2FjaGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlQ291bnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUVtcHR5U2FtcGxlQ2FjaGUobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZU51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlQ291bnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZUNvdW50KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFFbXB0eVNhbXBsZUNhY2hlKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUNvdW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYUdldFB1YmxpY0luZm8oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCU9TVHlwZSBpbmZvU2VsZWN0b3I7Ci0Jdm9pZCAqIGluZm9EYXRhUHRyOwotCVNpemUgaW9EYXRhU2l6ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgT1NUeXBlIGluZm9TZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb0RhdGFQdHI7CisgICAgU2l6ZSBpb0RhdGFTaXplOwogI2lmbmRlZiBNZWRpYUdldFB1YmxpY0luZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdldFB1YmxpY0luZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhR2V0UHVibGljSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mcyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0cikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR2V0UHVibGljSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJmlvRGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGlvRGF0YVNpemUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluZm9TZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhUHRyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFHZXRQdWJsaWNJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW9EYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW9EYXRhU2l6ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFTZXRQdWJsaWNJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlPU1R5cGUgaW5mb1NlbGVjdG9yOwotCXZvaWQgKiBpbmZvRGF0YVB0cjsKLQlTaXplIGRhdGFTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBPU1R5cGUgaW5mb1NlbGVjdG9yOworICAgIHZvaWQgKiBpbmZvRGF0YVB0cjsKKyAgICBTaXplIGRhdGFTaXplOwogI2lmbmRlZiBNZWRpYVNldFB1YmxpY0luZm8KLQlQeU1hY19QUkVDSEVDSyhNZWRpYVNldFB1YmxpY0luZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE1lZGlhU2V0UHVibGljSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mb0RhdGFQdHIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhU2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhU2V0UHVibGljSW5mbyhtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1NlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvRGF0YVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvRGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFTaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFTZXRQdWJsaWNJbmZvKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvU2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9EYXRhUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFSZWZDb25TZXRQcm9wZXJ0eShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNZWRpYUhhbmRsZXIgbWg7Ci0JbG9uZyByZWZDb247Ci0JbG9uZyBwcm9wZXJ0eVR5cGU7Ci0Jdm9pZCAqIHByb3BlcnR5VmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIGxvbmcgcmVmQ29uOworICAgIGxvbmcgcHJvcGVydHlUeXBlOworICAgIHZvaWQgKiBwcm9wZXJ0eVZhbHVlOwogI2lmbmRlZiBNZWRpYVJlZkNvblNldFByb3BlcnR5Ci0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhUmVmQ29uU2V0UHJvcGVydHkobWgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhUmVmQ29uU2V0UHJvcGVydHkobWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NZWRpYVJlZkNvbkdldFByb3BlcnR5KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlsb25nIHJlZkNvbjsKLQlsb25nIHByb3BlcnR5VHlwZTsKLQl2b2lkICogcHJvcGVydHlWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyByZWZDb247CisgICAgbG9uZyBwcm9wZXJ0eVR5cGU7CisgICAgdm9pZCAqIHByb3BlcnR5VmFsdWU7CiAjaWZuZGVmIE1lZGlhUmVmQ29uR2V0UHJvcGVydHkKLQlQeU1hY19QUkVDSEVDSyhNZWRpYVJlZkNvbkdldFByb3BlcnR5KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNZWRpYVJlZkNvbkdldFByb3BlcnR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWVkaWFSZWZDb25HZXRQcm9wZXJ0eShtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eVZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFSZWZDb25HZXRQcm9wZXJ0eShtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCWxvbmcgbmF2aWdhdGlvbjsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNZWRpYUhhbmRsZXIgbWg7CisgICAgbG9uZyBuYXZpZ2F0aW9uOworICAgIGxvbmcgcmVmQ29uOwogI2lmbmRlZiBNZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uCi0JUHlNYWNfUFJFQ0hFQ0soTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hdmlnYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHJlZkNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYXZpZ2F0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X01lZGlhR0dldElkbGVNYW5hZ2VyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU1lZGlhSGFuZGxlciBtaDsKLQlJZGxlTWFuYWdlciBwaW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTWVkaWFIYW5kbGVyIG1oOworICAgIElkbGVNYW5hZ2VyIHBpbTsKICNpZm5kZWYgTWVkaWFHR2V0SWRsZU1hbmFnZXIKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdHZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHR2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE1lZGlhR0dldElkbGVNYW5hZ2VyKG1oLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaW0pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9OZXcsIHBpbSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtaCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE1lZGlhR0dldElkbGVNYW5hZ2VyKG1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaW0pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9OZXcsIHBpbSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTWVkaWFHU2V0SWRsZU1hbmFnZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTWVkaWFIYW5kbGVyIG1oOwotCUlkbGVNYW5hZ2VyIGltOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE1lZGlhSGFuZGxlciBtaDsKKyAgICBJZGxlTWFuYWdlciBpbTsKICNpZm5kZWYgTWVkaWFHU2V0SWRsZU1hbmFnZXIKLQlQeU1hY19QUkVDSEVDSyhNZWRpYUdTZXRJZGxlTWFuYWdlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWVkaWFHU2V0SWRsZU1hbmFnZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAotCSAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNZWRpYUdTZXRJZGxlTWFuYWdlcihtaCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJZGxlTWFuYWdlck9ial9Db252ZXJ0LCAmaW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNZWRpYUdTZXRJZGxlTWFuYWdlcihtaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfUVRNSURJR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVFUTUlESUNvbXBvbmVudCBjaTsKLQlRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzOwotCVFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUTUlESUNvbXBvbmVudCBjaTsKKyAgICBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzOworICAgIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzOwogI2lmbmRlZiBRVE1JRElHZXRNSURJUG9ydHMKLQlQeU1hY19QUkVDSEVDSyhRVE1JRElHZXRNSURJUG9ydHMpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUTUlESUdldE1JRElQb3J0cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gUVRNSURJR2V0TUlESVBvcnRzKGNpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnB1dFBvcnRzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dHB1dFBvcnRzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRNSURJR2V0TUlESVBvcnRzKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dFBvcnRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnB1dFBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dHB1dFBvcnRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVE1JRElVc2VTZW5kUG9ydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVE1JRElDb21wb25lbnQgY2k7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JbG9uZyBpblVzZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBRVE1JRElDb21wb25lbnQgY2k7CisgICAgbG9uZyBwb3J0SW5kZXg7CisgICAgbG9uZyBpblVzZTsKICNpZm5kZWYgUVRNSURJVXNlU2VuZFBvcnQKLQlQeU1hY19QUkVDSEVDSyhRVE1JRElVc2VTZW5kUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUVRNSURJVXNlU2VuZFBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJmNpLAotCSAgICAgICAgICAgICAgICAgICAgICAmcG9ydEluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5Vc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBRVE1JRElVc2VTZW5kUG9ydChjaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5Vc2UpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZjaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUVRNSURJVXNlU2VuZFBvcnQoY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVXNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9RVE1JRElTZW5kTUlESShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlRVE1JRElDb21wb25lbnQgY2k7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JTXVzaWNNSURJUGFja2V0IG1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFFUTUlESUNvbXBvbmVudCBjaTsKKyAgICBsb25nIHBvcnRJbmRleDsKKyAgICBNdXNpY01JRElQYWNrZXQgbXA7CiAjaWZuZGVmIFFUTUlESVNlbmRNSURJCi0JUHlNYWNfUFJFQ0hFQ0soUVRNSURJU2VuZE1JREkpOworICAgIFB5TWFjX1BSRUNIRUNLKFFUTUlESVNlbmRNSURJKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCi0JICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgIFF0TXVzaWNNSURJUGFja2V0X0NvbnZlcnQsICZtcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFFUTUlESVNlbmRNSURJKGNpLAotCSAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAmbXApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFF0TXVzaWNNSURJUGFja2V0X0NvbnZlcnQsICZtcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFFUTUlESVNlbmRNSURJKGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbXApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JbG9uZyBtaWRpQ2hhbm5lbDsKLQlsb25nIHBvbHlwaG9ueTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBtaWRpQ2hhbm5lbDsKKyAgICBsb25nIHBvbHlwaG9ueTsKICNpZm5kZWYgTXVzaWNHZXRQYXJ0Ci0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0KG1jLAotCSAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBtaWRpQ2hhbm5lbCwKLQkgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydChtYywKKyAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgJm1pZGlDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAmcG9seXBob255KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlkaUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldFBhcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgbWlkaUNoYW5uZWw7Ci0JbG9uZyBwb2x5cGhvbnk7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIGxvbmcgbWlkaUNoYW5uZWw7CisgICAgbG9uZyBwb2x5cGhvbnk7CiAjaWZuZGVmIE11c2ljU2V0UGFydAotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnQobWMsCi0JICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgIG1pZGlDaGFubmVsLAotCSAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWlkaUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2x5cGhvbnkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIG1pZGlDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKICNpZm5kZWYgTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlcgotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlcihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1N0b3JlUGFydEluc3RydW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1N0b3JlUGFydEluc3RydW1lbnQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1N0b3JlUGFydEluc3RydW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudChtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1N0b3JlUGFydEluc3RydW1lbnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCUF0b21pY0luc3RydW1lbnQgYWk7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgQXRvbWljSW5zdHJ1bWVudCBhaTsKKyAgICBsb25nIGZsYWdzOwogI2lmbmRlZiBNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50Ci0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50KG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhaSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWkpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBhaSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JQXRvbWljSW5zdHJ1bWVudFB0ciBhaVA7Ci0JbG9uZyBmbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgQXRvbWljSW5zdHJ1bWVudFB0ciBhaVA7CisgICAgbG9uZyBmbGFnczsKICNpZm5kZWYgTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudAotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZhaVAsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlQLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHNsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWlQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50KG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGtub2JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBrbm9iSUQ7CiAjaWZuZGVmIE11c2ljR2V0UGFydEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnRLbm9iKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldFBhcnRLbm9iKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYklEKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY1NldFBhcnRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlsb25nIGtub2JJRDsKLQlsb25nIGtub2JWYWx1ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBrbm9iSUQ7CisgICAgbG9uZyBrbm9iVmFsdWU7CiAjaWZuZGVmIE11c2ljU2V0UGFydEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRLbm9iKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYklELAotCSAgICAgICAgICAgICAgICAgICAgICAma25vYlZhbHVlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZXRQYXJ0S25vYihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICBrbm9iVmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYlZhbHVlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZXRQYXJ0S25vYihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iVmFsdWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0S25vYihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGtub2JJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGtub2JJRDsKICNpZm5kZWYgTXVzaWNHZXRLbm9iCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRLbm9iKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldEtub2IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldEtub2IobWMsCi0JICAgICAgICAgICAgICAgICAgIGtub2JJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRLbm9iKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcga25vYklEOwotCWxvbmcga25vYlZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcga25vYklEOworICAgIGxvbmcga25vYlZhbHVlOwogI2lmbmRlZiBNdXNpY1NldEtub2IKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldEtub2IpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0S25vYik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICZrbm9iVmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldEtub2IobWMsCi0JICAgICAgICAgICAgICAgICAgIGtub2JJRCwKLQkgICAgICAgICAgICAgICAgICAga25vYlZhbHVlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm9iVmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldEtub2IobWMsCisgICAgICAgICAgICAgICAgICAgICAgIGtub2JJRCwKKyAgICAgICAgICAgICAgICAgICAgICAga25vYlZhbHVlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldFBhcnROYW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlTdHJpbmdQdHIgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgU3RyaW5nUHRyIG5hbWU7CiAjaWZuZGVmIE11c2ljR2V0UGFydE5hbWUKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnROYW1lKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldFBhcnROYW1lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbHMiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRQYXJ0TmFtZShtYywKLQkgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0UGFydE5hbWUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0TmFtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JU3RyaW5nUHRyIG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIFN0cmluZ1B0ciBuYW1lOwogI2lmbmRlZiBNdXNpY1NldFBhcnROYW1lCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0TmFtZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0TmFtZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydE5hbWUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnROYW1lKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljUGxheU5vdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgcGl0Y2g7Ci0JbG9uZyB2ZWxvY2l0eTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBwaXRjaDsKKyAgICBsb25nIHZlbG9jaXR5OwogI2lmbmRlZiBNdXNpY1BsYXlOb3RlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNQbGF5Tm90ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNQbGF5Tm90ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBpdGNoLAotCSAgICAgICAgICAgICAgICAgICAgICAmdmVsb2NpdHkpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1BsYXlOb3RlKG1jLAotCSAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgIHBpdGNoLAotCSAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHkpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZWxvY2l0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljUGxheU5vdGUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNSZXNldFBhcnQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcGFydDsKICNpZm5kZWYgTXVzaWNSZXNldFBhcnQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1Jlc2V0UGFydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNSZXNldFBhcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNSZXNldFBhcnQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgcGFydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNSZXNldFBhcnQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0Q29udHJvbGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXI7Ci0JbG9uZyBjb250cm9sbGVyVmFsdWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyOworICAgIGxvbmcgY29udHJvbGxlclZhbHVlOwogI2lmbmRlZiBNdXNpY1NldFBhcnRDb250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0Q29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0Q29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJOdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb250cm9sbGVyVmFsdWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRDb250cm9sbGVyKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyVmFsdWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbGxlck51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJWYWx1ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0UGFydENvbnRyb2xsZXIobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlck51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJWYWx1ZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRQYXJ0Q29udHJvbGxlcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIHBhcnQ7Ci0JTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBwYXJ0OworICAgIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyOwogI2lmbmRlZiBNdXNpY0dldFBhcnRDb250cm9sbGVyCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0Q29udHJvbGxlcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRQYXJ0Q29udHJvbGxlcik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbGxlck51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0UGFydENvbnRyb2xsZXIobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlck51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRyb2xsZXJOdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldFBhcnRDb250cm9sbGVyKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJOdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0SW5zdHJ1bWVudE5hbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOwotCUhhbmRsZSBpbnN0cnVtZW50TmFtZXM7Ci0JSGFuZGxlIGluc3RydW1lbnRDYXRlZ29yeUxhc3RzOwotCUhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50czsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOworICAgIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0czsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXM7CiAjaWZuZGVmIE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudE5hbWVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpYWJsZUluc3RydW1lbnRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpYWJsZUluc3RydW1lbnRzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TmFtZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnRDYXRlZ29yeUxhc3RzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnN0cnVtZW50TmFtZXMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpYWJsZUluc3RydW1lbnRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpYWJsZUluc3RydW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50TmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnRDYXRlZ29yeUxhc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbnN0cnVtZW50TmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudENhdGVnb3J5TmFtZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0RHJ1bU5hbWVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOwotCUhhbmRsZSBpbnN0cnVtZW50TnVtYmVyczsKLQlIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzOworICAgIEhhbmRsZSBpbnN0cnVtZW50TnVtYmVyczsKKyAgICBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzOwogI2lmbmRlZiBNdXNpY0dldERydW1OYW1lcwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0RHJ1bU5hbWVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldERydW1OYW1lcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWFibGVJbnN0cnVtZW50cykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0RHJ1bU5hbWVzKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWFibGVJbnN0cnVtZW50cywKLQkgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE51bWJlcnMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE5hbWVzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWFibGVJbnN0cnVtZW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0RHJ1bU5hbWVzKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWFibGVJbnN0cnVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE51bWJlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5zdHJ1bWVudE5hbWVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldE1hc3RlclR1bmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CiAjaWZuZGVmIE11c2ljR2V0TWFzdGVyVHVuZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0TWFzdGVyVHVuZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRNYXN0ZXJUdW5lKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0dldE1hc3RlclR1bmUobWMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldE1hc3RlclR1bmUobWMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0TWFzdGVyVHVuZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG1hc3RlclR1bmU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBtYXN0ZXJUdW5lOwogI2lmbmRlZiBNdXNpY1NldE1hc3RlclR1bmUKLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldE1hc3RlclR1bmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0TWFzdGVyVHVuZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1hc3RlclR1bmUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldE1hc3RlclR1bmUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlclR1bmUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFzdGVyVHVuZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0TWFzdGVyVHVuZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyVHVuZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgaW5kZXg7Ci0JbG9uZyBpZDE7Ci0JbG9uZyBpZDI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBpbmRleDsKKyAgICBsb25nIGlkMTsKKyAgICBsb25nIGlkMjsKICNpZm5kZWYgTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dldERldmljZUNvbm5lY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZDIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgaWQyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkMik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZDIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljVXNlRGV2aWNlQ29ubmVjdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGlkMTsKLQlsb25nIGlkMjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGlkMTsKKyAgICBsb25nIGlkMjsKICNpZm5kZWYgTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1VzZURldmljZUNvbm5lY3Rpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWQxLAotCSAgICAgICAgICAgICAgICAgICAgICAmaWQyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDEsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBrbm9iSW5kZXg7Ci0JbG9uZyBpc0dsb2JhbDsKLQlIYW5kbGUgc2V0dGluZ3NOYW1lczsKLQlIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeUxhc3RzOwotCUhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBrbm9iSW5kZXg7CisgICAgbG9uZyBpc0dsb2JhbDsKKyAgICBIYW5kbGUgc2V0dGluZ3NOYW1lczsKKyAgICBIYW5kbGUgc2V0dGluZ3NDYXRlZ29yeUxhc3RzOworICAgIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXM7CiAjaWZuZGVmIE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmtub2JJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmlzR2xvYmFsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYkluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc05hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc0NhdGVnb3J5TGFzdHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzQ2F0ZWdvcnlOYW1lcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc05hbWVzLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtub2JJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzR2xvYmFsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRLbm9iU2V0dGluZ1N0cmluZ3MobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc05hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXR0aW5nc0NhdGVnb3J5TGFzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldHRpbmdzQ2F0ZWdvcnlOYW1lcyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc05hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgaW5wdXRQb3J0Q291bnQ7Ci0JbG9uZyBvdXRwdXRQb3J0Q291bnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBpbnB1dFBvcnRDb3VudDsKKyAgICBsb25nIG91dHB1dFBvcnRDb3VudDsKICNpZm5kZWYgTXVzaWNHZXRNSURJUG9ydHMKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0dldE1JRElQb3J0cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZXRNSURJUG9ydHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0TUlESVBvcnRzKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFBvcnRDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydENvdW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgaW5wdXRQb3J0Q291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UG9ydENvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNHZXRNSURJUG9ydHMobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0UG9ydENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRQb3J0Q291bnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFBvcnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb3J0Q291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2VuZE1JREkoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwb3J0SW5kZXg7Ci0JTXVzaWNNSURJUGFja2V0IG1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgcG9ydEluZGV4OworICAgIE11c2ljTUlESVBhY2tldCBtcDsKICNpZm5kZWYgTXVzaWNTZW5kTUlESQotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2VuZE1JREkpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2VuZE1JREkpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgUXRNdXNpY01JRElQYWNrZXRfQ29udmVydCwgJm1wKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNTZW5kTUlESShtYywKLQkgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICZtcCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUXRNdXNpY01JRElQYWNrZXRfQ29udmVydCwgJm1wKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNTZW5kTUlESShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtcCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRPZmZsaW5lVGltZVRvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgbmV3VGltZVN0YW1wOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIGxvbmcgbmV3VGltZVN0YW1wOwogI2lmbmRlZiBNdXNpY1NldE9mZmxpbmVUaW1lVG8KLQlQeU1hY19QUkVDSEVDSyhNdXNpY1NldE9mZmxpbmVUaW1lVG8pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0T2ZmbGluZVRpbWVUbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTdGFtcCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0T2ZmbGluZVRpbWVUbyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVN0YW1wKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1RpbWVTdGFtcCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljU2V0T2ZmbGluZVRpbWVUbyhtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGltZVN0YW1wKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0dldEluZm9UZXh0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgc2VsZWN0b3I7Ci0JSGFuZGxlIHRleHRIOwotCUhhbmRsZSBzdHlsZUg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgbG9uZyBzZWxlY3RvcjsKKyAgICBIYW5kbGUgdGV4dEg7CisgICAgSGFuZGxlIHN0eWxlSDsKICNpZm5kZWYgTXVzaWNHZXRJbmZvVGV4dAotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5mb1RleHQpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5mb1RleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2V0SW5mb1RleHQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SCwKLQkgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZUgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRleHRILAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHN0eWxlSCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2V0SW5mb1RleHQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0SCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHlsZUgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHRleHRILAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHN0eWxlSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZXRJbnN0cnVtZW50SW5mbyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIGdldEluc3RydW1lbnRJbmZvRmxhZ3M7Ci0JSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGdldEluc3RydW1lbnRJbmZvRmxhZ3M7CisgICAgSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SDsKICNpZm5kZWYgTXVzaWNHZXRJbnN0cnVtZW50SW5mbwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudEluZm8pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljR2V0SW5zdHJ1bWVudEluZm8pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZnZXRJbnN0cnVtZW50SW5mb0ZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZXRJbnN0cnVtZW50SW5mbyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEluc3RydW1lbnRJbmZvRmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb0xpc3RIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgaW5mb0xpc3RIKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmdldEluc3RydW1lbnRJbmZvRmxhZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dldEluc3RydW1lbnRJbmZvKG1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdHJ1bWVudEluZm9GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvTGlzdEgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBpbmZvTGlzdEgpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKICNpZm5kZWYgTXVzaWNUYXNrCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNUYXNrKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljVGFzayhtYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljVGFzayhtYyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBwYXJ0OwotCWxvbmcgaW5zdHJ1bWVudE51bWJlcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgbG9uZyBpbnN0cnVtZW50TnVtYmVyOwogI2lmbmRlZiBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZQotCVB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5zdHJ1bWVudE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlKG1jLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1bWVudE51bWJlcik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluc3RydW1lbnROdW1iZXIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnROdW1iZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCWxvbmcgcGFydDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIHBhcnQ7CisgICAgSGFuZGxlIGRhdGE7CiAjaWZuZGVmIE11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbihtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY1NldFBhcnRTb3VuZExvY2FsaXphdGlvbihtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljR2VuZXJpY0NvbmZpZ3VyZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlNdXNpY0NvbXBvbmVudCBtYzsKLQlsb25nIG1vZGU7Ci0JbG9uZyBmbGFnczsKLQlsb25nIGJhc2VSZXNJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIG1vZGU7CisgICAgbG9uZyBmbGFnczsKKyAgICBsb25nIGJhc2VSZXNJRDsKICNpZm5kZWYgTXVzaWNHZW5lcmljQ29uZmlndXJlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZW5lcmljQ29uZmlndXJlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dlbmVyaWNDb25maWd1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhc2VSZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2VuZXJpY0NvbmZpZ3VyZShtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZXNJRCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhc2VSZXNJRCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2VuZXJpY0NvbmZpZ3VyZShtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VSZXNJRCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZW5lcmljR2V0S25vYkxpc3QoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0JbG9uZyBrbm9iVHlwZTsKLQlHZW5lcmljS25vYkRlc2NyaXB0aW9uTGlzdEhhbmRsZSBna2RsSDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBsb25nIGtub2JUeXBlOworICAgIEdlbmVyaWNLbm9iRGVzY3JpcHRpb25MaXN0SGFuZGxlIGdrZGxIOwogI2lmbmRlZiBNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdAotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2VuZXJpY0dldEtub2JMaXN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgJmtub2JUeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNHZW5lcmljR2V0S25vYkxpc3QobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga25vYlR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdrZGxIKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgZ2tkbEgpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAma25vYlR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0dlbmVyaWNHZXRLbm9iTGlzdChtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbm9iVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2tkbEgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBna2RsSCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCUhhbmRsZSByZXNvdXJjZUlESDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBNdXNpY0NvbXBvbmVudCBtYzsKKyAgICBIYW5kbGUgcmVzb3VyY2VJREg7CiAjaWZuZGVmIE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycwotCVB5TWFjX1BSRUNIRUNLKE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZXNvdXJjZUlESCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyhtYywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJREgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZXNvdXJjZUlESCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyhtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VJREgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X011c2ljRGVyaXZlZE1JRElTZW5kKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU11c2ljQ29tcG9uZW50IG1jOwotCU11c2ljTUlESVBhY2tldCBwYWNrZXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CisgICAgTXVzaWNNSURJUGFja2V0IHBhY2tldDsKICNpZm5kZWYgTXVzaWNEZXJpdmVkTUlESVNlbmQKLQlQeU1hY19QUkVDSEVDSyhNdXNpY0Rlcml2ZWRNSURJU2VuZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkTUlESVNlbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAotCSAgICAgICAgICAgICAgICAgICAgICBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0LCAmcGFja2V0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTXVzaWNEZXJpdmVkTUlESVNlbmQobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJm1jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBRdE11c2ljTUlESVBhY2tldF9Db252ZXJ0LCAmcGFja2V0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTXVzaWNEZXJpdmVkTUlESVNlbmQobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgTXVzaWNDb21wb25lbnQgbWM7CiAjaWZuZGVmIE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZShtYyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZtYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE11c2ljRGVyaXZlZE9wZW5SZXNGaWxlKG1jKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9NdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTXVzaWNDb21wb25lbnQgbWM7Ci0Jc2hvcnQgcmVzUmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE11c2ljQ29tcG9uZW50IG1jOworICAgIHNob3J0IHJlc1JlZk51bTsKICNpZm5kZWYgTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUobWMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNSZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUobWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1JlZk51bSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JTm90ZUFsbG9jYXRvciBuYTsKLQlsb25nIGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CisgICAgbG9uZyBpbmRleDsKICNpZm5kZWYgTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UKLQlQeU1hY19QUkVDSEVDSyhOQVVucmVnaXN0ZXJNdXNpY0RldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5BVW5yZWdpc3Rlck11c2ljRGV2aWNlKG5hLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTkFVbnJlZ2lzdGVyTXVzaWNEZXZpY2UobmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BU2F2ZU11c2ljQ29uZmlndXJhdGlvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlOb3RlQWxsb2NhdG9yIG5hOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CiAjaWZuZGVmIE5BU2F2ZU11c2ljQ29uZmlndXJhdGlvbgotCVB5TWFjX1BSRUNIRUNLKE5BU2F2ZU11c2ljQ29uZmlndXJhdGlvbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24obmEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24obmEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BR2V0TUlESVBvcnRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCU5vdGVBbGxvY2F0b3IgbmE7Ci0JUVRNSURJUG9ydExpc3RIYW5kbGUgaW5wdXRQb3J0czsKLQlRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0czsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBOb3RlQWxsb2NhdG9yIG5hOworICAgIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHM7CisgICAgUVRNSURJUG9ydExpc3RIYW5kbGUgb3V0cHV0UG9ydHM7CiAjaWZuZGVmIE5BR2V0TUlESVBvcnRzCi0JUHlNYWNfUFJFQ0hFQ0soTkFHZXRNSURJUG9ydHMpOworICAgIFB5TWFjX1BSRUNIRUNLKE5BR2V0TUlESVBvcnRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQUdldE1JRElQb3J0cyhuYSwKLQkgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKLQkgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydHMpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlucHV0UG9ydHMsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0cHV0UG9ydHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQUdldE1JRElQb3J0cyhuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRQb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0UG9ydHMpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGlucHV0UG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0cHV0UG9ydHMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X05BVGFzayhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlOb3RlQWxsb2NhdG9yIG5hOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIE5vdGVBbGxvY2F0b3IgbmE7CiAjaWZuZGVmIE5BVGFzawotCVB5TWFjX1BSRUNIRUNLKE5BVGFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTkFUYXNrKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOQVRhc2sobmEpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmbmEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBOQVRhc2sobmEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRIZWFkZXIoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nICogaGVhZGVyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgdW5zaWduZWQgbG9uZyAqIGhlYWRlcjsKICNpZm5kZWYgVHVuZVNldEhlYWRlcgotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0SGVhZGVyKHRwLAotCSAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRIZWFkZXIodHAsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVHZXRUaW1lQmFzZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCVRpbWVCYXNlIHRiOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgVGltZUJhc2UgdGI7CiAjaWZuZGVmIFR1bmVHZXRUaW1lQmFzZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVHZXRUaW1lQmFzZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUdldFRpbWVCYXNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0VGltZUJhc2UodHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0Yik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0VGltZUJhc2UodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0Yik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgdGIpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRUaW1lU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFR1bmVTZXRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0VGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0VGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0VGltZVNjYWxlKHRwLAotCSAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0VGltZVNjYWxlKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVHZXRUaW1lU2NhbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlUaW1lU2NhbGUgc2NhbGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBUaW1lU2NhbGUgc2NhbGU7CiAjaWZuZGVmIFR1bmVHZXRUaW1lU2NhbGUKLQlQeU1hY19QUkVDSEVDSyhUdW5lR2V0VGltZVNjYWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lR2V0VGltZVNjYWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lR2V0VGltZVNjYWxlKHRwLAotCSAgICAgICAgICAgICAgICAgICAgICAgJnNjYWxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydiwKLQkgICAgICAgICAgICAgICAgICAgICBzY2FsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVHZXRUaW1lU2NhbGUodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lSW5zdGFudChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgdHVuZTsKLQl1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIHVuc2lnbmVkIGxvbmcgdHVuZTsKKyAgICB1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbjsKICNpZm5kZWYgVHVuZUluc3RhbnQKLQlQeU1hY19QUkVDSEVDSyhUdW5lSW5zdGFudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUluc3RhbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0dW5lUG9zaXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lSW5zdGFudCh0cCwKLQkgICAgICAgICAgICAgICAgICAmdHVuZSwKLQkgICAgICAgICAgICAgICAgICB0dW5lUG9zaXRpb24pOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIHR1bmUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdHVuZVBvc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZUluc3RhbnQodHAsCisgICAgICAgICAgICAgICAgICAgICAgJnR1bmUsCisgICAgICAgICAgICAgICAgICAgICAgdHVuZVBvc2l0aW9uKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU3RvcChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCWxvbmcgc3RvcEZsYWdzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgbG9uZyBzdG9wRmxhZ3M7CiAjaWZuZGVmIFR1bmVTdG9wCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVN0b3ApOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTdG9wKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RvcEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVN0b3AodHAsCi0JICAgICAgICAgICAgICAgc3RvcEZsYWdzKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0b3BGbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTdG9wKHRwLAorICAgICAgICAgICAgICAgICAgIHN0b3BGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZVNldFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCUZpeGVkIHZvbHVtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIEZpeGVkIHZvbHVtZTsKICNpZm5kZWYgVHVuZVNldFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJnZvbHVtZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVTZXRWb2x1bWUodHAsCi0JICAgICAgICAgICAgICAgICAgICB2b2x1bWUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0Rml4ZWQsICZ2b2x1bWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0Vm9sdW1lKHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lR2V0Vm9sdW1lKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZUdldFZvbHVtZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVHZXRWb2x1bWUpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVHZXRWb2x1bWUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXRWb2x1bWUodHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0Vm9sdW1lKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lUHJlcm9sbChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CiAjaWZuZGVmIFR1bmVQcmVyb2xsCi0JUHlNYWNfUFJFQ0hFQ0soVHVuZVByZXJvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVQcmVyb2xsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lUHJlcm9sbCh0cCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVQcmVyb2xsKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lVW5yb2xsKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZVVucm9sbAotCVB5TWFjX1BSRUNIRUNLKFR1bmVVbnJvbGwpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVVbnJvbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVVbnJvbGwodHApOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lVW5yb2xsKHRwKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0UGFydFRyYW5zcG9zZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgcGFydDsKLQlsb25nIHRyYW5zcG9zZTsKLQlsb25nIHZlbG9jaXR5U2hpZnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICB1bnNpZ25lZCBsb25nIHBhcnQ7CisgICAgbG9uZyB0cmFuc3Bvc2U7CisgICAgbG9uZyB2ZWxvY2l0eVNoaWZ0OwogI2lmbmRlZiBUdW5lU2V0UGFydFRyYW5zcG9zZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRQYXJ0VHJhbnNwb3NlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0UGFydFRyYW5zcG9zZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9zZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZlbG9jaXR5U2hpZnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0UGFydFRyYW5zcG9zZSh0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVNoaWZ0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmxsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYW5zcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlbG9jaXR5U2hpZnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0UGFydFRyYW5zcG9zZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVNoaWZ0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lR2V0Tm90ZUFsbG9jYXRvcihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTm90ZUFsbG9jYXRvciBfcnY7Ci0JVHVuZVBsYXllciB0cDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTm90ZUFsbG9jYXRvciBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZUdldE5vdGVBbGxvY2F0b3IKLQlQeU1hY19QUkVDSEVDSyhUdW5lR2V0Tm90ZUFsbG9jYXRvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZUdldE5vdGVBbGxvY2F0b3IpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXROb3RlQWxsb2NhdG9yKHRwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHApKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lR2V0Tm90ZUFsbG9jYXRvcih0cCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0U29mdGVyKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JbG9uZyBzb2Z0ZXI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICBsb25nIHNvZnRlcjsKICNpZm5kZWYgVHVuZVNldFNvZnRlcgotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb2Z0ZXIpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb2Z0ZXIpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZzb2Z0ZXIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0U29mdGVyKHRwLAotCSAgICAgICAgICAgICAgICAgICAgc29mdGVyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvZnRlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRTb2Z0ZXIodHAsCisgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0ZXIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKICNpZm5kZWYgVHVuZVRhc2sKLQlQeU1hY19QUkVDSEVDSyhUdW5lVGFzayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVRhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVUYXNrKHRwKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVRhc2sodHApOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRCYWxhbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDb21wb25lbnRSZXN1bHQgX3J2OwotCVR1bmVQbGF5ZXIgdHA7Ci0JbG9uZyBiYWxhbmNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgbG9uZyBiYWxhbmNlOwogI2lmbmRlZiBUdW5lU2V0QmFsYW5jZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRCYWxhbmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUdW5lU2V0QmFsYW5jZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0QmFsYW5jZSh0cCwKLQkgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbGFuY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0QmFsYW5jZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYWxhbmNlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0U291bmRMb2NhbGl6YXRpb24oUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQlIYW5kbGUgZGF0YTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIEhhbmRsZSBkYXRhOwogI2lmbmRlZiBUdW5lU2V0U291bmRMb2NhbGl6YXRpb24KLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0U291bmRMb2NhbGl6YXRpb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVTZXRTb3VuZExvY2FsaXphdGlvbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmZGF0YSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVTZXRTb3VuZExvY2FsaXphdGlvbih0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmRhdGEpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUdW5lU2V0U291bmRMb2NhbGl6YXRpb24odHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X1R1bmVTZXRIZWFkZXJXaXRoU2l6ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgKiBoZWFkZXI7Ci0JdW5zaWduZWQgbG9uZyBzaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDb21wb25lbnRSZXN1bHQgX3J2OworICAgIFR1bmVQbGF5ZXIgdHA7CisgICAgdW5zaWduZWQgbG9uZyAqIGhlYWRlcjsKKyAgICB1bnNpZ25lZCBsb25nIHNpemU7CiAjaWZuZGVmIFR1bmVTZXRIZWFkZXJXaXRoU2l6ZQotCVB5TWFjX1BSRUNIRUNLKFR1bmVTZXRIZWFkZXJXaXRoU2l6ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldEhlYWRlcldpdGhTaXplKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mc2wiLAotCSAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0T2JqX0NvbnZlcnQsICZ0cCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhlYWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUdW5lU2V0SGVhZGVyV2l0aFNpemUodHAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZzbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVTZXRIZWFkZXJXaXRoU2l6ZSh0cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9UdW5lU2V0UGFydE1peChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ29tcG9uZW50UmVzdWx0IF9ydjsKLQlUdW5lUGxheWVyIHRwOwotCXVuc2lnbmVkIGxvbmcgcGFydE51bWJlcjsKLQlsb25nIHZvbHVtZTsKLQlsb25nIGJhbGFuY2U7Ci0JbG9uZyBtaXhGbGFnczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ29tcG9uZW50UmVzdWx0IF9ydjsKKyAgICBUdW5lUGxheWVyIHRwOworICAgIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlcjsKKyAgICBsb25nIHZvbHVtZTsKKyAgICBsb25nIGJhbGFuY2U7CisgICAgbG9uZyBtaXhGbGFnczsKICNpZm5kZWYgVHVuZVNldFBhcnRNaXgKLQlQeU1hY19QUkVDSEVDSyhUdW5lU2V0UGFydE1peCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHVuZVNldFBhcnRNaXgpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0TnVtYmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1peEZsYWdzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVHVuZVNldFBhcnRNaXgodHAsCi0JICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlciwKLQkgICAgICAgICAgICAgICAgICAgICB2b2x1bWUsCi0JICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSwKLQkgICAgICAgICAgICAgICAgICAgICBtaXhGbGFncyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdE9ial9Db252ZXJ0LCAmdHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJ0TnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1peEZsYWdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVHVuZVNldFBhcnRNaXgodHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaXhGbGFncyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUXRfVHVuZUdldFBhcnRNaXgoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNvbXBvbmVudFJlc3VsdCBfcnY7Ci0JVHVuZVBsYXllciB0cDsKLQl1bnNpZ25lZCBsb25nIHBhcnROdW1iZXI7Ci0JbG9uZyB2b2x1bWVPdXQ7Ci0JbG9uZyBiYWxhbmNlT3V0OwotCWxvbmcgbWl4RmxhZ3NPdXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIENvbXBvbmVudFJlc3VsdCBfcnY7CisgICAgVHVuZVBsYXllciB0cDsKKyAgICB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXI7CisgICAgbG9uZyB2b2x1bWVPdXQ7CisgICAgbG9uZyBiYWxhbmNlT3V0OworICAgIGxvbmcgbWl4RmxhZ3NPdXQ7CiAjaWZuZGVmIFR1bmVHZXRQYXJ0TWl4Ci0JUHlNYWNfUFJFQ0hFQ0soVHVuZUdldFBhcnRNaXgpOworICAgIFB5TWFjX1BSRUNIRUNLKFR1bmVHZXRQYXJ0TWl4KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydE51bWJlcikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFR1bmVHZXRQYXJ0TWl4KHRwLAotCSAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXIsCi0JICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZU91dCwKLQkgICAgICAgICAgICAgICAgICAgICAmbWl4RmxhZ3NPdXQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgdm9sdW1lT3V0LAotCSAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VPdXQsCi0JICAgICAgICAgICAgICAgICAgICAgbWl4RmxhZ3NPdXQpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENtcEluc3RPYmpfQ29udmVydCwgJnRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydE51bWJlcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFR1bmVHZXRQYXJ0TWl4KHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnZvbHVtZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmYmFsYW5jZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbWl4RmxhZ3NPdXQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsbGxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2VPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWl4RmxhZ3NPdXQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlF0X0FsaWduV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgd3A7Ci0JQm9vbGVhbiBmcm9udDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIHdwOworICAgIEJvb2xlYW4gZnJvbnQ7CiAjaWZuZGVmIEFsaWduV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soQWxpZ25XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEFsaWduV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd3AsCi0JICAgICAgICAgICAgICAgICAgICAgICZmcm9udCkpCi0JCXJldHVybiBOVUxMOwotCUFsaWduV2luZG93KHdwLAotCSAgICAgICAgICAgIGZyb250LAotCSAgICAgICAgICAgIChSZWN0ICopMCwKLQkgICAgICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0cikwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQWxpZ25XaW5kb3cod3AsCisgICAgICAgICAgICAgICAgZnJvbnQsCisgICAgICAgICAgICAgICAgKFJlY3QgKikwLAorICAgICAgICAgICAgICAgIChJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyKTApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9EcmFnQWxpZ25lZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIHdwOwotCVBvaW50IHN0YXJ0UHQ7Ci0JUmVjdCBib3VuZHNSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgd3A7CisgICAgUG9pbnQgc3RhcnRQdDsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CiAjaWZuZGVmIERyYWdBbGlnbmVkV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhZ0FsaWduZWRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKERyYWdBbGlnbmVkV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmd3AsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJvdW5kc1JlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlEcmFnQWxpZ25lZFdpbmRvdyh3cCwKLQkgICAgICAgICAgICAgICAgICBzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAotCSAgICAgICAgICAgICAgICAgIChSZWN0ICopMCwKLQkgICAgICAgICAgICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0cikwKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZ3cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYWdBbGlnbmVkV2luZG93KHdwLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgKFJlY3QgKikwLAorICAgICAgICAgICAgICAgICAgICAgIChJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyKTApOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpRdF9Nb3ZpZXNUYXNrKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG1heE1pbGxpU2VjVG9Vc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbWF4TWlsbGlTZWNUb1VzZTsKICNpZm5kZWYgTW92aWVzVGFzawotCVB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmllc1Rhc2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZtYXhNaWxsaVNlY1RvVXNlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTW92aWVzVGFzaygoTW92aWUpMCwKLQkgICAgICAgICAgIG1heE1pbGxpU2VjVG9Vc2UpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1heE1pbGxpU2VjVG9Vc2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZpZXNUYXNrKChNb3ZpZSkwLAorICAgICAgICAgICAgICAgbWF4TWlsbGlTZWNUb1VzZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBRdF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJFbnRlck1vdmllcyIsIChQeUNGdW5jdGlvbilRdF9FbnRlck1vdmllcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRXhpdE1vdmllcyIsIChQeUNGdW5jdGlvbilRdF9FeGl0TW92aWVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZXNFcnJvciIsIChQeUNGdW5jdGlvbilRdF9HZXRNb3ZpZXNFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQ2xlYXJNb3ZpZXNTdGlja3lFcnJvciIsIChQeUNGdW5jdGlvbilRdF9DbGVhck1vdmllc1N0aWNreUVycm9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRNb3ZpZXNTdGlja3lFcnJvciIsIChQeUNGdW5jdGlvbilRdF9HZXRNb3ZpZXNTdGlja3lFcnJvciwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9RVEdldFdhbGxDbG9ja1RpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChUaW1lQmFzZSB3YWxsQ2xvY2tUaW1lQmFzZSkiKX0sCi0JeyJRVElkbGVNYW5hZ2VyT3BlbiIsIChQeUNGdW5jdGlvbilRdF9RVElkbGVNYW5hZ2VyT3BlbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSWRsZU1hbmFnZXIgX3J2KSIpfSwKLQl7IkNyZWF0ZU1vdmllQ29udHJvbCIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZUNvbnRyb2wsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB0aGVXaW5kb3csIE1vdmllIHRoZU1vdmllLCBVSW50MzIgb3B0aW9ucykgLT4gKFJlY3QgbG9jYWxSZWN0LCBDb250cm9sSGFuZGxlIHJldHVybmVkQ29udHJvbCkiKX0sCi0JeyJEaXNwb3NlTWF0dGUiLCAoUHlDRnVuY3Rpb24pUXRfRGlzcG9zZU1hdHRlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgdGhlTWF0dGUpIC0+IE5vbmUiKX0sCi0JeyJOZXdNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmbGFncykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJRVEdldFRpbWVVbnRpbE5leHRUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0VGltZVVudGlsTmV4dFRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgc2NhbGUpIC0+IChsb25nIGR1cmF0aW9uKSIpfSwKLQl7IkdldERhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldERhdGFIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFIYW5kbGVyU3ViVHlwZSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudCBfcnYpIil9LAotCXsiUGFzdGVIYW5kbGVJbnRvTW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfUGFzdGVIYW5kbGVJbnRvTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoLCBPU1R5cGUgaGFuZGxlVHlwZSwgTW92aWUgdGhlTW92aWUsIGxvbmcgZmxhZ3MsIENvbXBvbmVudEluc3RhbmNlIHVzZXJDb21wKSAtPiBOb25lIil9LAotCXsiR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVJbXBvcnRlckZvckRhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIGRhdGFSZWYsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnQgaW1wb3J0ZXIpIil9LAotCXsiUVRHZXRNSU1FVHlwZUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRNSU1FVHlwZUluZm8sIDEsCi0JIFB5RG9jX1NUUigiKGNoYXIqIG1pbWVTdHJpbmdTdGFydCwgc2hvcnQgbWltZVN0cmluZ0xlbmd0aCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyKSAtPiAobG9uZyBpbmZvRGF0YVNpemUpIil9LAotCXsiVHJhY2tUaW1lVG9NZWRpYVRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfVHJhY2tUaW1lVG9NZWRpYVRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVWYWx1ZSB2YWx1ZSwgVHJhY2sgdGhlVHJhY2spIC0+IChUaW1lVmFsdWUgX3J2KSIpfSwKLQl7Ik5ld1VzZXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld1VzZXJEYXRhLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVc2VyRGF0YSB0aGVVc2VyRGF0YSkiKX0sCi0JeyJOZXdVc2VyRGF0YUZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3VXNlckRhdGFGcm9tSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKFVzZXJEYXRhIHRoZVVzZXJEYXRhKSIpfSwKLQl7IkNyZWF0ZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzKSAtPiAoc2hvcnQgcmVzUmVmTnVtLCBNb3ZpZSBuZXdtb3ZpZSkiKX0sCi0JeyJPcGVuTW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X09wZW5Nb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgU0ludDggcGVybWlzc2lvbikgLT4gKHNob3J0IHJlc1JlZk51bSkiKX0sCi0JeyJDbG9zZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9DbG9zZU1vdmllRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtKSAtPiBOb25lIil9LAotCXsiRGVsZXRlTW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlbGV0ZU1vdmllRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNTcGVjIGZpbGVTcGVjKSAtPiBOb25lIil9LAotCXsiTmV3TW92aWVGcm9tRmlsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21GaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZXNSZWZOdW0sIHNob3J0IHJlc0lkLCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIHNob3J0IHJlc0lkLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7Ik5ld01vdmllRnJvbUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoLCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAotCXsiTmV3TW92aWVGcm9tRGF0YUZvcmsiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRGF0YUZvcmssIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZSZWZOdW0sIGxvbmcgZmlsZU9mZnNldCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7Ik5ld01vdmllRnJvbURhdGFGb3JrNjQiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRGF0YUZvcms2NCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBmUmVmTnVtLCB3aWRlIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCi0JeyJOZXdNb3ZpZUZyb21EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGZsYWdzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGR0YVJlZlR5cGUpIC0+IChNb3ZpZSBtLCBzaG9ydCBpZCkiKX0sCi0JeyJOZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbVN0b3JhZ2VPZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2F0YVJlZlR5cGUpIil9LAotCXsiTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZvckRhdGFSZWZGcm9tSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgaCwgc2hvcnQgbmV3TW92aWVGbGFncywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKLQl7IlJlbW92ZU1vdmllUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfUmVtb3ZlTW92aWVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCkgLT4gTm9uZSIpfSwKLQl7IkNyZWF0ZU1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9DcmVhdGVNb3ZpZVN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKERhdGFIYW5kbGVyIG91dERhdGFIYW5kbGVyLCBNb3ZpZSBuZXdtb3ZpZSkiKX0sCi0JeyJPcGVuTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X09wZW5Nb3ZpZVN0b3JhZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlcikiKX0sCi0JeyJDbG9zZU1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9DbG9zZU1vdmllU3RvcmFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IE5vbmUiKX0sCi0JeyJEZWxldGVNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfRGVsZXRlTW92aWVTdG9yYWdlLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlU2hvcnRjdXRNb3ZpZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGNyZWF0b3IsIFNjcmlwdENvZGUgc2NyaXB0VGFnLCBsb25nIGNyZWF0ZU1vdmllRmlsZUZsYWdzLCBIYW5kbGUgdGFyZ2V0RGF0YVJlZiwgT1NUeXBlIHRhcmdldERhdGFSZWZUeXBlKSAtPiBOb25lIil9LAotCXsiQ2FuUXVpY2tUaW1lT3BlbkZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2FuUXVpY2tUaW1lT3BlbkZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYywgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb24sIFVJbnQzMiBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWUsIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcikiKX0sCi0JeyJDYW5RdWlja1RpbWVPcGVuRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9DYW5RdWlja1RpbWVPcGVuRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgVUludDMyIGluRmxhZ3MpIC0+IChCb29sZWFuIG91dENhbk9wZW5XaXRoR3JhcGhpY3NJbXBvcnRlciwgQm9vbGVhbiBvdXRDYW5PcGVuQXNNb3ZpZSwgQm9vbGVhbiBvdXRQcmVmZXJHcmFwaGljc0ltcG9ydGVyKSIpfSwKLQl7Ik5ld01vdmllRnJvbVNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbVNjcmFwLCAxLAotCSBQeURvY19TVFIoIihsb25nIG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAotCXsiUVROZXdBbGlhcyIsIChQeUNGdW5jdGlvbilRdF9RVE5ld0FsaWFzLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgZnNzLCBCb29sZWFuIG1pbmltYWwpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCi0JeyJFbmRGdWxsU2NyZWVuIiwgKFB5Q0Z1bmN0aW9uKVF0X0VuZEZ1bGxTY3JlZW4sIDEsCi0JIFB5RG9jX1NUUigiKFB0ciBmdWxsU3RhdGUsIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCi0JeyJBZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGV4dGVuc2lvbiwgT1NUeXBlIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkdldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfR2V0U291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU291bmREZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgaWRUeXBlKSAtPiAoSGFuZGxlIGV4dGVuc2lvbikiKX0sCi0JeyJSZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZVNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlFUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUSXNTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0V2ZW50LCAxLAotCSBQeURvY19TVFIoIihRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nKSAtPiAoRXZlbnRSZWNvcmQgcEV2ZW50KSIpfSwKLQl7IlFURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X1FURGlzbWlzc1N0YW5kYXJkUGFyYW1ldGVyRGlhbG9nLCAxLAotCSBQeURvY19TVFIoIihRVFBhcmFtZXRlckRpYWxvZyBjcmVhdGVkRGlhbG9nKSAtPiBOb25lIil9LAotCXsiUVRTdGFuZGFyZFBhcmFtZXRlckRpYWxvZ0RvQWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZywgbG9uZyBhY3Rpb24sIHZvaWQgKiBwYXJhbXMpIC0+IE5vbmUiKX0sCi0JeyJRVFJlZ2lzdGVyQWNjZXNzS2V5IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUUmVnaXN0ZXJBY2Nlc3NLZXksIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBhY2Nlc3NLZXlUeXBlLCBsb25nIGZsYWdzLCBIYW5kbGUgYWNjZXNzS2V5KSAtPiBOb25lIil9LAotCXsiUVRVbnJlZ2lzdGVyQWNjZXNzS2V5IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVW5yZWdpc3RlckFjY2Vzc0tleSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IGFjY2Vzc0tleVR5cGUsIGxvbmcgZmxhZ3MsIEhhbmRsZSBhY2Nlc3NLZXkpIC0+IE5vbmUiKX0sCi0JeyJRVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9RVEdldFN1cHBvcnRlZFJlc3RyaWN0aW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGluUmVzdHJpY3Rpb25DbGFzcykgLT4gKFVJbnQzMiBvdXRSZXN0cmljdGlvbklEcykiKX0sCi0JeyJRVFRleHRUb05hdGl2ZVRleHQiLCAoUHlDRnVuY3Rpb24pUXRfUVRUZXh0VG9OYXRpdmVUZXh0LCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgdGhlVGV4dCwgbG9uZyBlbmNvZGluZywgbG9uZyBmbGFncykgLT4gTm9uZSIpfSwKLQl7IlZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWaWRlb01lZGlhR2V0U3RhdGlzdGljcyIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0U3RhdGlzdGljcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWaWRlb01lZGlhR2V0U3RhbGxDb3VudCIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0U3RhbGxDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzdGFsbHMpIil9LAotCXsiVmlkZW9NZWRpYVNldENvZGVjUGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb2RlY1R5cGUgY1R5cGUsIE9TVHlwZSBwYXJhbWV0ZXJJRCwgbG9uZyBwYXJhbWV0ZXJDaGFuZ2VTZWVkLCB2b2lkICogZGF0YVB0ciwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVmlkZW9NZWRpYUdldENvZGVjUGFyYW1ldGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb2RlY1R5cGUgY1R5cGUsIE9TVHlwZSBwYXJhbWV0ZXJJRCwgSGFuZGxlIG91dFBhcmFtZXRlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYUFkZFRleHRTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkVGV4dFNhbXBsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGV4dCwgdW5zaWduZWQgbG9uZyBzaXplLCBzaG9ydCBmb250TnVtYmVyLCBzaG9ydCBmb250U2l6ZSwgU3R5bGUgdGV4dEZhY2UsIHNob3J0IHRleHRKdXN0aWZpY2F0aW9uLCBsb25nIGRpc3BsYXlGbGFncywgVGltZVZhbHVlIHNjcm9sbERlbGF5LCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0ZXh0Q29sb3IsIFJHQkNvbG9yIGJhY2tDb2xvciwgUmVjdCB0ZXh0Qm94LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAotCXsiVGV4dE1lZGlhQWRkVEVTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkVEVTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVEVIYW5kbGUgaFRFLCBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbiwgbG9uZyBkaXNwbGF5RmxhZ3MsIFRpbWVWYWx1ZSBzY3JvbGxEZWxheSwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgYmFja0NvbG9yLCBSZWN0IHRleHRCb3gsIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yLCBUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCi0JeyJUZXh0TWVkaWFBZGRIaWxpdGVTYW1wbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHJnYkhpbGl0ZUNvbG9yLCBUaW1lVmFsdWUgc2FtcGxlVGltZSkiKX0sCi0JeyJUZXh0TWVkaWFEcmF3UmF3IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYURyYXdSYXcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgR1dvcmxkUHRyIGd3LCBHREhhbmRsZSBnZCwgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUsIFRleHREZXNjcmlwdGlvbkhhbmRsZSB0ZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVNldFRleHRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFTZXRUZXh0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIGF0TWVkaWFUaW1lLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVJhd1NldHVwIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVJhd1NldHVwLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEdXb3JsZFB0ciBndywgR0RIYW5kbGUgZ2QsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplLCBUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoLCBUaW1lVmFsdWUgc2FtcGxlRHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRNZWRpYVJhd0lkbGUiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhUmF3SWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBHV29ybGRQdHIgZ3csIEdESGFuZGxlIGdkLCBUaW1lVmFsdWUgc2FtcGxlVGltZSwgbG9uZyBmbGFnc0luKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFnc091dCkiKX0sCi0JeyJUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUZXh0TWVkaWFGaW5kTmV4dFRleHQiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhRmluZE5leHRUZXh0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFB0ciB0ZXh0LCBsb25nIHNpemUsIHNob3J0IGZpbmRGbGFncywgVGltZVZhbHVlIHN0YXJ0VGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBmb3VuZFRpbWUsIFRpbWVWYWx1ZSBmb3VuZER1cmF0aW9uLCBsb25nIG9mZnNldCkiKX0sCi0JeyJUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUhpbGl0ZVRleHRTYW1wbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvcikiKX0sCi0JeyJUZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFTZXRUZXh0U2FtcGxlRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogZGF0YSwgT1NUeXBlIGRhdGFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYVNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU2V0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgc3ByaXRlSW5kZXgsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHNwcml0ZUluZGV4LCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0U3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBzcHJpdGVIaXRJbmRleCkiKX0sCi0JeyJTcHJpdGVNZWRpYUNvdW50U3ByaXRlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUNvdW50U3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgbnVtU3ByaXRlcykiKX0sCi0JeyJTcHJpdGVNZWRpYUNvdW50SW1hZ2VzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhQ291bnRJbWFnZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG51bUltYWdlcykiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGltYWdlSW5kZXgsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaW1hZ2VEZXNjcmlwdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXREaXNwbGF5ZWRTYW1wbGVOdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2FtcGxlTnVtKSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQsIFN0cjI1NSBzcHJpdGVOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEltYWdlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEltYWdlTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4LCBTdHIyNTUgaW1hZ2VOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU2V0U3ByaXRlUHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldFNwcml0ZVByb3BlcnR5LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0QWxsU3ByaXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEF0b21JRCBzcHJpdGVIaXRJRCkiKX0sCi0JeyJTcHJpdGVNZWRpYUhpdFRlc3RPbmVTcHJpdGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdhc0hpdCkiKX0sCi0JeyJTcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNwcml0ZUluZGV4VG9JRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBzcHJpdGVJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUQXRvbUlEIHNwcml0ZUlEKSIpfSwKLQl7IlNwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhU3ByaXRlSURUb0luZGV4LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc3ByaXRlSW5kZXgpIil9LAotCXsiU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQsIGZsb2F0IHZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGZsb2F0IHZhbHVlKSIpfSwKLQl7IlNwcml0ZU1lZGlhRGlzcG9zZVNwcml0ZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgc3ByaXRlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGVUb1N0cmluZyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCwgUHRyIHRoZUNTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhR2V0QWN0aW9uVmFyaWFibGVBc1N0cmluZyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgdmFyaWFibGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0aGVDU3RyaW5nKSIpfSwKLQl7IlNwcml0ZU1lZGlhTmV3SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFOZXdJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBRVEF0b21JRCBkZXNpcmVkSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhRGlzcG9zZUltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhRGlzcG9zZUltYWdlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGltYWdlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRBdG9tSUQgaW1hZ2VJRCkiKX0sCi0JeyJTcHJpdGVNZWRpYUltYWdlSURUb0luZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRBdG9tSUQgaW1hZ2VJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGltYWdlSW5kZXgpIil9LAotCXsiRmxhc2hNZWRpYVNldFBhbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0UGFuLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHhQZXJjZW50LCBzaG9ydCB5UGVyY2VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRmxhc2hNZWRpYVNldFpvb20iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFpvb20sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgZmFjdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJGbGFzaE1lZGlhU2V0Wm9vbVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFpvb21SZWN0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbGVmdCwgbG9uZyB0b3AsIGxvbmcgcmlnaHQsIGxvbmcgYm90dG9tKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJGbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRSZWZDb25Cb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGxlZnQsIGxvbmcgdG9wLCBsb25nIHJpZ2h0LCBsb25nIGJvdHRvbSkiKX0sCi0JeyJGbGFzaE1lZGlhR2V0UmVmQ29uSUQiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldFJlZkNvbklELCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb25JRCkiKX0sCi0JeyJGbGFzaE1lZGlhSURUb1JlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhSURUb1JlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb24pIil9LAotCXsiRmxhc2hNZWRpYUdldERpc3BsYXllZEZyYW1lTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFzaEZyYW1lTnVtYmVyKSIpfSwKLQl7IkZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFGcmFtZU51bWJlclRvTW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhc2hGcmFtZU51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtb3ZpZVRpbWUpIil9LAotCXsiRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRnJhbWVMYWJlbFRvTW92aWVUaW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFB0ciB0aGVMYWJlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtb3ZpZVRpbWUpIil9LAotCXsiRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUdldEZsYXNoVmFyaWFibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgcGF0aCwgY2hhciBuYW1lLCBIYW5kbGUgdGhlVmFyaWFibGVDU3RyaW5nT3V0KSIpfSwKLQl7IkZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gdXBkYXRlRm9jdXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIHBhdGgsIGNoYXIgbmFtZSwgY2hhciB2YWx1ZSkiKX0sCi0JeyJGbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFEb0J1dHRvbkFjdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBidXR0b25JRCwgbG9uZyB0cmFuc2l0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBwYXRoKSIpfSwKLQl7IkZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50OCBzd2ZWZXJzaW9uKSIpfSwKLQl7Ik1lZGlhM0RHZXRDdXJyZW50R3JvdXAiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldEN1cnJlbnRHcm91cCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogZ3JvdXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RUcmFuc2xhdGVOYW1lZE9iamVjdFRvLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHgsIEZpeGVkIHksIEZpeGVkIHopIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAotCXsiTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHhTY2FsZSwgRml4ZWQgeVNjYWxlLCBGaXhlZCB6U2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAotCXsiTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgeERlZ3JlZXMsIEZpeGVkIHlEZWdyZWVzLCBGaXhlZCB6RGVncmVlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgb2JqZWN0TmFtZSkiKX0sCi0JeyJNZWRpYTNEU2V0Q2FtZXJhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogY2FtZXJhRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWEzREdldENhbWVyYURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGNhbWVyYURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RTZXRDYW1lcmFBbmdsZUFzcGVjdCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUVRGbG9hdFNpbmdsZSBmb3YsIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYTNER2V0Q2FtZXJhQW5nbGVBc3BlY3QiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEZsb2F0U2luZ2xlIGZvdiwgUVRGbG9hdFNpbmdsZSBhc3BlY3RSYXRpb1hUb1kpIil9LAotCXsiTWVkaWEzRFNldENhbWVyYVJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RTZXRDYW1lcmFSYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogdFEzQ2FtZXJhUmFuZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhM0RHZXRDYW1lcmFSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNER2V0Q2FtZXJhUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIHRRM0NhbWVyYVJhbmdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOZXdUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9OZXdUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2UgX3J2KSIpfSwKLQl7IkNvbnZlcnRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbnZlcnRUaW1lLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRoZVRpbWUsIFRpbWVCYXNlIG5ld0Jhc2UpIC0+IChUaW1lUmVjb3JkIHRoZVRpbWUpIil9LAotCXsiQ29udmVydFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0VGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihUaW1lUmVjb3JkIHRoZVRpbWUsIFRpbWVTY2FsZSBuZXdTY2FsZSkgLT4gKFRpbWVSZWNvcmQgdGhlVGltZSkiKX0sCi0JeyJBZGRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgZHN0LCBUaW1lUmVjb3JkIHNyYykgLT4gKFRpbWVSZWNvcmQgZHN0KSIpfSwKLQl7IlN1YnRyYWN0VGltZSIsIChQeUNGdW5jdGlvbilRdF9TdWJ0cmFjdFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFRpbWVSZWNvcmQgZHN0LCBUaW1lUmVjb3JkIHNyYykgLT4gKFRpbWVSZWNvcmQgZHN0KSIpfSwKLQl7Ik11c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIHRpLCBsb25nIHNhbXBsZURlc2NJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudEluc3RhbmNlIHRwKSIpfSwKLQl7IkNvZGVjTWFuYWdlclZlcnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfQ29kZWNNYW5hZ2VyVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyB2ZXJzaW9uKSIpfSwKLQl7IkdldE1heENvbXByZXNzaW9uU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HZXRNYXhDb21wcmVzc2lvblNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCwgc2hvcnQgY29sb3JEZXB0aCwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSwgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYykgLT4gKGxvbmcgc2l6ZSkiKX0sCi0JeyJHZXRDb21wcmVzc2lvblRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0Q29tcHJlc3Npb25UaW1lLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIHNob3J0IGNvbG9yRGVwdGgsIENvZGVjVHlwZSBjVHlwZSwgQ29tcHJlc3NvckNvbXBvbmVudCBjb2RlYykgLT4gKENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWUpIil9LAotCXsiQ29tcHJlc3NJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc0ltYWdlLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUHRyIGRhdGEpIC0+IE5vbmUiKX0sCi0JeyJEZWNvbXByZXNzSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfRGVjb21wcmVzc0ltYWdlLCAxLAotCSBQeURvY19TVFIoIihQdHIgZGF0YSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBQaXhNYXBIYW5kbGUgZHN0LCBSZWN0IHNyY1JlY3QsIFJlY3QgZHN0UmVjdCwgc2hvcnQgbW9kZSwgUmduSGFuZGxlIG1hc2spIC0+IE5vbmUiKX0sCi0JeyJHZXRTaW1pbGFyaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dldFNpbWlsYXJpdHksIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBQdHIgZGF0YSkgLT4gKEZpeGVkIHNpbWlsYXJpdHkpIil9LAotCXsiR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSIsIChQeUNGdW5jdGlvbilRdF9HZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlLCAxLAotCSBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDVGFiSGFuZGxlIGN0YWJsZSkiKX0sCi0JeyJTZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NldEltYWdlRGVzY3JpcHRpb25DVGFibGUsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgQ1RhYkhhbmRsZSBjdGFibGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUsIGxvbmcgaW5kZXgpIC0+IChIYW5kbGUgZXh0ZW5zaW9uKSIpfSwKLQl7IkFkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfQWRkSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBIYW5kbGUgZXh0ZW5zaW9uLCBsb25nIGlkVHlwZSkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfUmVtb3ZlSW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBsb25nIGlkVHlwZSwgbG9uZyBpbmRleCkgLT4gTm9uZSIpfSwKLQl7IkNvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfQ291bnRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBsb25nIGlkVHlwZSkgLT4gKGxvbmcgY291bnQpIil9LAotCXsiR2V0TmV4dEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAobG9uZyBpZFR5cGUpIil9LAotCXsiRmluZENvZGVjIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpbmRDb2RlYywgMSwKLQkgUHlEb2NfU1RSKCIoQ29kZWNUeXBlIGNUeXBlLCBDb2RlY0NvbXBvbmVudCBzcGVjQ29kZWMpIC0+IChDb21wcmVzc29yQ29tcG9uZW50IGNvbXByZXNzb3IsIERlY29tcHJlc3NvckNvbXBvbmVudCBkZWNvbXByZXNzb3IpIil9LAotCXsiQ29tcHJlc3NQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXByZXNzUGljdHVyZSwgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIHNyY1BpY3R1cmUsIFBpY0hhbmRsZSBkc3RQaWN0dXJlLCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlKSAtPiBOb25lIil9LAotCXsiQ29tcHJlc3NQaWN0dXJlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc1BpY3R1cmVGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzcmNSZWZOdW0sIHNob3J0IGRzdFJlZk51bSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSkgLT4gTm9uZSIpfSwKLQl7IkNvbnZlcnRJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0SW1hZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjREQsIFB0ciBzcmNEYXRhLCBzaG9ydCBjb2xvckRlcHRoLCBDVGFiSGFuZGxlIGN0YWJsZSwgQ29kZWNRIGFjY3VyYWN5LCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlLCBDb2RlY0NvbXBvbmVudCBjb2RlYywgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3RERCwgUHRyIGRzdERhdGEpIC0+IE5vbmUiKX0sCi0JeyJBZGRGaWxlUHJldmlldyIsIChQeUNGdW5jdGlvbilRdF9BZGRGaWxlUHJldmlldywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBPU1R5cGUgcHJldmlld1R5cGUsIEhhbmRsZSBwcmV2aWV3RGF0YSkgLT4gTm9uZSIpfSwKLQl7IkdldEJlc3REZXZpY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEJlc3REZXZpY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChHREhhbmRsZSBnZGgsIFJlY3QgcnApIil9LAotCXsiR0RIYXNTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HREhhc1NjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIHNob3J0IGRlcHRoKSAtPiAoRml4ZWQgc2NhbGUpIil9LAotCXsiR0RHZXRTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HREdldFNjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgpIC0+IChGaXhlZCBzY2FsZSwgc2hvcnQgZmxhZ3MpIil9LAotCXsiR0RTZXRTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9HRFNldFNjYWxlLCAxLAotCSBQeURvY19TVFIoIihHREhhbmRsZSBnZGgsIEZpeGVkIHNjYWxlLCBzaG9ydCBmbGFncykgLT4gTm9uZSIpfSwKLQl7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKLQl7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAotCXsiR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckZpbGVXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyB0aGVGaWxlLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAotCXsiR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfR2V0R3JhcGhpY3NJbXBvcnRlckZvckRhdGFSZWZXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCi0JeyJNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCIsIChQeUNGdW5jdGlvbilRdF9NYWtlSW1hZ2VEZXNjcmlwdGlvbkZvclBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBpeG1hcCkgLT4gKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoKSIpfSwKLQl7Ik1ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X01ha2VJbWFnZURlc2NyaXB0aW9uRm9yRWZmZWN0LCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZWZmZWN0VHlwZSkgLT4gKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgaWRoKSIpfSwKLQl7IlFUR2V0UGl4ZWxTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4ZWxTaXplLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgUGl4ZWxGb3JtYXQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeGVsRm9ybWF0RGVwdGhGb3JJbWFnZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgUGl4ZWxGb3JtYXQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeE1hcEhhbmRsZVJvd0J5dGVzLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChsb25nIF9ydikiKX0sCi0JeyJRVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgbG9uZyByb3dCeXRlcykgLT4gTm9uZSIpfSwKLQl7IlFUR2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwsIDEsCi0JIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSkgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJRVFNldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIEZpeGVkIGdhbW1hTGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJRVEdldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsLCAxLAotCSBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChGaXhlZCBfcnYpIil9LAotCXsiUVRTZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCwgMSwKLQkgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBGaXhlZCByZXF1ZXN0ZWRHYW1tYUxldmVsKSAtPiBOb25lIil9LAotCXsiQ29tcEFkZCIsIChQeUNGdW5jdGlvbilRdF9Db21wQWRkLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIHNyYywgd2lkZSBkc3QpIil9LAotCXsiQ29tcFN1YiIsIChQeUNGdW5jdGlvbilRdF9Db21wU3ViLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIHNyYywgd2lkZSBkc3QpIil9LAotCXsiQ29tcE5lZyIsIChQeUNGdW5jdGlvbilRdF9Db21wTmVnLCAxLAotCSBQeURvY19TVFIoIigpIC0+ICh3aWRlIGRzdCkiKX0sCi0JeyJDb21wU2hpZnQiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFNoaWZ0LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzaGlmdCkgLT4gKHdpZGUgc3JjKSIpfSwKLQl7IkNvbXBNdWwiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBzcmMxLCBsb25nIHNyYzIpIC0+ICh3aWRlIGRzdCkiKX0sCi0JeyJDb21wRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBEaXYsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZGVub21pbmF0b3IpIC0+IChsb25nIF9ydiwgd2lkZSBudW1lcmF0b3IsIGxvbmcgcmVtYWluZGVyKSIpfSwKLQl7IkNvbXBGaXhNdWwiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcEZpeE11bCwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgZml4U3JjKSAtPiAod2lkZSBjb21wU3JjLCB3aWRlIGNvbXBEc3QpIil9LAotCXsiQ29tcE11bERpdiIsIChQeUNGdW5jdGlvbilRdF9Db21wTXVsRGl2LCAxLAotCSBQeURvY19TVFIoIihsb25nIG11bCwgbG9uZyBkaXZpc29yKSAtPiAod2lkZSBjbykiKX0sCi0JeyJDb21wTXVsRGl2VHJ1bmMiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bERpdlRydW5jLCAxLAotCSBQeURvY19TVFIoIihsb25nIG11bCwgbG9uZyBkaXZpc29yKSAtPiAod2lkZSBjbywgbG9uZyByZW1haW5kZXIpIil9LAotCXsiQ29tcENvbXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcENvbXBhcmUsIDEsCi0JIFB5RG9jX1NUUigiKHdpZGUgYSwgd2lkZSBtaW51c2IpIC0+IChsb25nIF9ydikiKX0sCi0JeyJDb21wU3F1YXJlUm9vdCIsIChQeUNGdW5jdGlvbilRdF9Db21wU3F1YXJlUm9vdCwgMSwKLQkgUHlEb2NfU1RSKCIod2lkZSBzcmMpIC0+ICh1bnNpZ25lZCBsb25nIF9ydikiKX0sCi0JeyJGaXhNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfRml4TXVsRGl2LCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMsIEZpeGVkIG11bCwgRml4ZWQgZGl2aXNvcikgLT4gKEZpeGVkIF9ydikiKX0sCi0JeyJVbnNpZ25lZEZpeE11bERpdiIsIChQeUNGdW5jdGlvbilRdF9VbnNpZ25lZEZpeE11bERpdiwgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgc3JjLCBGaXhlZCBtdWwsIEZpeGVkIGRpdmlzb3IpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4RXhwMiIsIChQeUNGdW5jdGlvbilRdF9GaXhFeHAyLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4TG9nMiIsIChQeUNGdW5jdGlvbilRdF9GaXhMb2cyLCAxLAotCSBQeURvY19TVFIoIihGaXhlZCBzcmMpIC0+IChGaXhlZCBfcnYpIil9LAotCXsiRml4UG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeFBvdywgMSwKLQkgUHlEb2NfU1RSKCIoRml4ZWQgYmFzZSwgRml4ZWQgZXhwKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVUeXBlKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXREYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0UmVhZERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB1bnNpZ25lZCBsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgY2xpcFJnbikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmVjdCBzb3VyY2VSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3Qgc291cmNlUmVjdCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldE5hdHVyYWxCb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgbmF0dXJhbEJvdW5kcykiKX0sCi0JeyJHcmFwaGljc0ltcG9ydERyYXciLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnREcmF3LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBDR3JhZlB0ciBwb3J0LCBHREhhbmRsZSBnZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2QpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJlY3QgYm91bmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEJvdW5kc1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2F2ZUFzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgZnNzLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGdyYXBoaWNzTW9kZSwgUkdCQ29sb3Igb3BDb2xvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBncmFwaGljc01vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIENvZGVjUSBxdWFsaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldFF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvZGVjUSBxdWFsaXR5KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRBbGlhc2VkRGF0YVJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRWYWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHZhbGlkKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiB1c2VyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRNSU1FVHlwZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RG9lc0RyYXdBbGxQaXhlbHMsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZHJhd3NBbGxQaXhlbHMpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRBc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGljSGFuZGxlIHBpY3R1cmUpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvciwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RXhwb3J0SW1hZ2VUeXBlTGlzdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RXhwb3J0U2V0dGluZ3NBc0F0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEV4cG9ydFNldHRpbmdzRnJvbUF0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUNvdW50IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGltYWdlQ291bnQpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgaW1hZ2VJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRJbWFnZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXgpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREYXRhT2Zmc2V0QW5kU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgd2lkZSBzaXplKSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0UmVhZERhdGE2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFJlYWREYXRhNjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgd2lkZSBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCB3aWRlIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0Q2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZ25IYW5kbGUgZGVmYXVsdFJnbikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVmYXVsdEdyYXBoaWNzTW9kZSwgUkdCQ29sb3IgZGVmYXVsdE9wQ29sb3IpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGVmYXVsdFNvdXJjZVJlY3QpIil9LAotCXsiR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgcHJvZmlsZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldERlc3RSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGVzdFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZWN0IGRlc3RSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldERlc3RSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkZXN0UmVjdCkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFncykiKX0sCi0JeyJHcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIHdpZGUgc2l6ZSkiKX0sCi0JeyJHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RG9FeHBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb0V4cG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGFjdHVhbFNpemVXcml0dGVuKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0Q2FuVHJhbnNjb2RlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gY2FuVHJhbnNjb2RlKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1RyYW5zY29kZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0Q2FuVXNlQ29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhblVzZUNvbXByZXNzb3IpIil9LAotCXsiR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1VzZUNvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogY29kZWNTZXR0aW5nc0F0b21Db250YWluZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIG91dERlc2MpIil9LAotCXsiR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREb1N0YW5kYWxvbmVFeHBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVDcmVhdG9yKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVOYW1lRXh0ZW5zaW9uLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlTmFtZUV4dGVuc2lvbikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXJQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXIsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRoZVRleHQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBkb250UmVjb21wcmVzcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERvbnRSZWNvbXByZXNzLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZG9udFJlY29tcHJlc3MpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldEludGVybGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBpbnRlcmxhY2VTdHlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE1ldGFEYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHVzZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogdXNlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRUYXJnZXREYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgdGFyZ2V0RGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvbk1ldGhvZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgY29tcHJlc3Npb25NZXRob2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvbk1ldGhvZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGNvbXByZXNzaW9uTWV0aG9kKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25RdWFsaXR5LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb2RlY1Egc3BhdGlhbFF1YWxpdHkpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRSZXNvbHV0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uLCBGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgaG9yaXpvbnRhbFJlc29sdXRpb24sIEZpeGVkIHZlcnRpY2FsUmVzb2x1dGlvbikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0RGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIGRlcHRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldERlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkZXB0aCkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldENvbG9yU3luY1Byb2ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGNvbG9yU3luY1Byb2ZpbGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgaCwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGgpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0ciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UHRyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUHRyIHAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0R3JhcGhpY3NJbXBvcnRlciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGdyaXApIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBQaWNIYW5kbGUgcGljdHVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGljSGFuZGxlIHBpY3R1cmUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgR1dvcmxkUHRyIGd3b3JsZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdXb3JsZFB0ciBnd29ybGQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUGl4TWFwSGFuZGxlIHBpeG1hcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0UGl4bWFwLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBwaXhtYXApIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gbWF5UmVhZElucHV0RGF0YSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc2l6ZSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFJlYWRJbnB1dERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGltZW5zaW9ucywgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRpbWVuc2lvbnMpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGgsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbnB1dERlcHRoKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnREcmF3SW5wdXRJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIENHcmFmUHRyIGd3LCBHREhhbmRsZSBnZCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKLQl7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplLCBCb29sZWFuIHRydW5jYXRlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhTaXplLCBCb29sZWFuIHRydW5jYXRlRmlsZSkiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVDcmVhdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dE1hcmsiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBtYXJrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dE1hcmsiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgbWFyaykiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGVUaHVtYm5haWwsIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGgsIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdGh1bWJuYWlsRW5hYmxlZCwgbG9uZyBtYXhUaHVtYm5haWxXaWR0aCwgbG9uZyBtYXhUaHVtYm5haWxIZWlnaHQpIil9LAotCXsiR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGVFeGlmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJHcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RXhpZkVuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBleGlmRW5hYmxlZCkiKX0sCi0JeyJJbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgc3JjRGVzYywgdm9pZCAqIGRhdGEsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRzdERlc2MpIil9LAotCXsiSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMsIHZvaWQgKiBkc3REYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSIsIChQeUNGdW5jdGlvbilRdF9JbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoSW1hZ2VUcmFuc2NvZGVyQ29tcG9uZW50IGl0YykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiQ2xvY2tHZXRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb2NrR2V0VGltZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCBvdXQpIil9LAotCXsiQ2xvY2tTZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9DbG9ja1NldFRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2ssIFRpbWVCYXNlIHRiKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJDbG9ja0dldFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvY2tHZXRSYXRlLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhQ2xvY2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCByYXRlKSIpfSwKLQl7IlNDUG9zaXRpb25SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUG9zaXRpb25SZWN0LCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcnAsIFBvaW50IHdoZXJlKSIpfSwKLQl7IlNDUG9zaXRpb25EaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfU0NQb3NpdGlvbkRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIHNob3J0IGlkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUG9pbnQgd2hlcmUpIil9LAotCXsiU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0VGVzdEltYWdlUGljdEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpY0hhbmRsZSB0ZXN0UGljdCwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCi0JeyJTQ1NldFRlc3RJbWFnZVBpY3RGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0VGVzdEltYWdlUGljdEZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCB0ZXN0RmlsZVJlZiwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCi0JeyJTQ1NldFRlc3RJbWFnZVBpeE1hcCIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpeE1hcCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSB0ZXN0UGl4TWFwLCBzaG9ydCB0ZXN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHRlc3RSZWN0KSIpfSwKLQl7IlNDR2V0QmVzdERldmljZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRCZXN0RGV2aWNlUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHIpIil9LAotCXsiU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ1JlcXVlc3RJbWFnZVNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NDb21wcmVzc0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NJbWFnZSwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIFBpeE1hcEhhbmRsZSBzcmMsIFJlY3Qgc3JjUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGRhdGEpIil9LAotCXsiU0NDb21wcmVzc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1BpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgc3JjUGljdHVyZSwgUGljSGFuZGxlIGRzdFBpY3R1cmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDQ29tcHJlc3NQaWN0dXJlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzUGljdHVyZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBzcmNSZWZOdW0sIHNob3J0IGRzdFJlZk51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4iLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1NlcXVlbmNlQmVnaW4sIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1NlcXVlbmNlRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YSwgbG9uZyBkYXRhU2l6ZSwgc2hvcnQgbm90U3luY0ZsYWcpIil9LAotCXsiU0NDb21wcmVzc1NlcXVlbmNlRW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUVuZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDRGVmYXVsdFBpY3RIYW5kbGVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgc3JjUGljdHVyZSwgc2hvcnQgbW90aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDRGVmYXVsdFBpY3RGaWxlU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBzcmNSZWYsIHNob3J0IG1vdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NEZWZhdWx0UGl4TWFwU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBzaG9ydCBtb3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDR2V0SW5mbyIsIChQeUNGdW5jdGlvbilRdF9TQ0dldEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBPU1R5cGUgaW5mb1R5cGUsIHZvaWQgKiBpbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTQ1NldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRJbmZvLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0NTZXRDb21wcmVzc0ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0Q29tcHJlc3NGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNDR2V0Q29tcHJlc3NGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TQ0dldENvbXByZXNzRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFncykiKX0sCi0JeyJTQ0dldFNldHRpbmdzQXNUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0U2V0dGluZ3NBc1RleHQsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRleHQpIil9LAotCXsiU0NBc3luY0lkbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NBc3luY0lkbGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUd2VlbmVyUmVzZXQiLCAoUHlDRnVuY3Rpb24pUXRfVHdlZW5lclJlc2V0LCAxLAotCSBQeURvY19TVFIoIihUd2VlbmVyQ29tcG9uZW50IHRjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUQ0dldFNvdXJjZVJlZiIsIChQeUNGdW5jdGlvbilRdF9UQ0dldFNvdXJjZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEgpIC0+IChIYW5kbGVyRXJyb3IgX3J2LCBVc2VyRGF0YSBzcmVmSCkiKX0sCi0JeyJUQ1NldFNvdXJjZVJlZiIsIChQeUNGdW5jdGlvbilRdF9UQ1NldFNvdXJjZVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lQ29kZURlc2NyaXB0aW9uSGFuZGxlIHRjZEgsIFVzZXJEYXRhIHNyZWZIKSAtPiAoSGFuZGxlckVycm9yIF9ydikiKX0sCi0JeyJUQ1NldFRpbWVDb2RlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVENTZXRUaW1lQ29kZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiAoSGFuZGxlckVycm9yIF9ydikiKX0sCi0JeyJUQ0dldFRpbWVDb2RlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVENHZXRUaW1lQ29kZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChIYW5kbGVyRXJyb3IgX3J2LCBsb25nIGZsYWdzKSIpfSwKLQl7Ik1vdmllSW1wb3J0SGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0SGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFILCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0RmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgVGltZVZhbHVlIGR1cmF0aW9uLCBUaW1lU2NhbGUgc2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBtZWRpYVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0TWVkaWFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0TWVkaWFGaWxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQWxpYXNIYW5kbGUgYWxpYXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0RGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldERpbWVuc2lvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldENodW5rU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgY2h1bmtTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldEF1eGlsaWFyeURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGEsIE9TVHlwZSBoYW5kbGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldEZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldEZyb21TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZnJvbVNjcmFwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydERvVXNlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydERvVXNlckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBIYW5kbGUgdGhlRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gY2FuY2VsZWQpIil9LAotCXsiTW92aWVJbXBvcnRTZXREdXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldER1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0QXV4aWxpYXJ5RGF0YVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGF1eFR5cGUpIil9LAotCXsiTW92aWVJbXBvcnRWYWxpZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFZhbGlkYXRlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIEhhbmRsZSB0aGVEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCi0JeyJNb3ZpZUltcG9ydEdldEZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlKSIpfSwKLQl7Ik1vdmllSW1wb3J0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgdGFyZ2V0VHJhY2ssIFRpbWVWYWx1ZSBhdFRpbWUsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRyYWNrIHVzZWRUcmFjaywgVGltZVZhbHVlIGFkZGVkRHVyYXRpb24sIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldFNhbXBsZURlc2NyaXB0aW9uLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAotCXsiTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0LCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTW92aWVJbXBvcnRJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0SWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb3V0RmxhZ3MpIil9LAotCXsiTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRWYWxpZGF0ZURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggdmFsaWQpIil9LAotCXsiTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRMb2FkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbXBvcnRlckxvYWRTdGF0ZSkiKX0sCi0JeyJNb3ZpZUltcG9ydEdldE1heExvYWRlZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSB0aW1lKSIpfSwKLQl7Ik1vdmllSW1wb3J0RXN0aW1hdGVDb21wbGV0aW9uVGltZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCB0aW1lKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0RG9udEJsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0RG9udEJsb2NrLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBkb250QmxvY2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllSW1wb3J0R2V0RG9udEJsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RG9udEJsb2NrLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2lsbEJsb2NrKSIpfSwKLQl7Ik1vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRJZGxlTWFuYWdlciwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBuZXdNb3ZpZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0RGVzdGluYXRpb25NZWRpYVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIG1lZGlhVHlwZSkiKX0sCi0JeyJNb3ZpZUV4cG9ydFRvSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VG9IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YUgsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0VG9GaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VG9GaWxlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0QXV4aWxpYXJ5RGF0YSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YUgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgaGFuZGxlVHlwZSkiKX0sCi0JeyJNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNb3ZpZUV4cG9ydERvVXNlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydERvVXNlckRpYWxvZywgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhbmNlbGVkKSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRDcmVhdG9yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgY3JlYXRvcikiKX0sCi0JeyJNb3ZpZUV4cG9ydFRvRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrLCBUaW1lVmFsdWUgc3RhcnRUaW1lLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRGcm9tUHJvY2VkdXJlc1RvRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRWYWxpZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIE1vdmllIHRoZU1vdmllLCBUcmFjayBvbmx5VGhpc1RyYWNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0RmlsZU5hbWVFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGV4dGVuc2lvbikiKX0sCi0JeyJNb3ZpZUV4cG9ydEdldFNob3J0RmlsZVR5cGVTdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgU3RyMjU1IHR5cGVTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0U291cmNlTWVkaWFUeXBlLCAxLAotCSBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAotCXsiVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0R2V0VGltZUZyYWN0aW9uLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtb3ZpZVRpbWVGcmFjdGlvbikiKX0sCi0JeyJUZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRFeHBvcnRTZXRUaW1lRnJhY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgbW92aWVUaW1lRnJhY3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlRleHRFeHBvcnRHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0R2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNldHRpbmcpIil9LAotCXsiVGV4dEV4cG9ydFNldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRFeHBvcnRTZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBzZXR0aW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNSURJSW1wb3J0R2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTUlESUltcG9ydEdldFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZXR0aW5nKSIpfSwKLQl7Ik1JRElJbXBvcnRTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9NSURJSW1wb3J0U2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgc2V0dGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltYWdlSW1wb3J0U2V0U2VxdWVuY2VFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihHcmFwaGljSW1hZ2VNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgQm9vbGVhbiBlbmFibGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkdyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbWFnZUltcG9ydEdldFNlcXVlbmNlRW5hYmxlZCwgMSwKLQkgUHlEb2NfU1RSKCIoR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVuYWJsZSkiKX0sCi0JeyJQcmV2aWV3U2hvd0RhdGEiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld1Nob3dEYXRhLCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHAsIE9TVHlwZSBkYXRhVHlwZSwgSGFuZGxlIGRhdGEsIFJlY3QgaW5IZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJQcmV2aWV3TWFrZVByZXZpZXdSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHAsIEZTU3BlYyBzb3VyY2VGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIHByZXZpZXdUeXBlLCBzaG9ydCByZXNJRCkiKX0sCi0JeyJQcmV2aWV3RXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfUHJldmlld0V2ZW50LCAxLAotCSBQeURvY19TVFIoIihwbm90Q29tcG9uZW50IHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBFdmVudFJlY29yZCBlLCBCb29sZWFuIGhhbmRsZWRFdmVudCkiKX0sCi0JeyJEYXRhQ29kZWNEZWNvbXByZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0RlY29tcHJlc3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdm9pZCAqIHNyY0RhdGEsIFVJbnQzMiBzcmNTaXplLCB2b2lkICogZHN0RGF0YSwgVUludDMyIGRzdEJ1ZmZlclNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFDb2RlY0dldENvbXByZXNzQnVmZmVyU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgVUludDMyIHNyY1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZHN0U2l6ZSkiKX0sCi0JeyJEYXRhQ29kZWNDb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNDb21wcmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjLCB2b2lkICogc3JjRGF0YSwgVUludDMyIHNyY1NpemUsIHZvaWQgKiBkc3REYXRhLCBVSW50MzIgZHN0QnVmZmVyU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBhY3R1YWxEc3RTaXplLCBVSW50MzIgZGVjb21wcmVzc1Nsb3ApIil9LAotCXsiRGF0YUNvZGVjQmVnaW5JbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjLCB1bnNpZ25lZCBsb25nIG1heFNyY1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFDb2RlY0VuZEludGVycnVwdFNhZmUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjRW5kSW50ZXJydXB0U2FmZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUNvZGVjQ29tcG9uZW50IGRjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGgsIGxvbmcgaE9mZnNldCwgbG9uZyBvZmZzZXQsIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhQdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHV0RGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBoLCBsb25nIGhPZmZzZXQsIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKLQl7IkRhdGFIRmx1c2hEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmx1c2hEYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhPcGVuRm9yV3JpdGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhPcGVuRm9yV3JpdGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSENsb3NlRm9yV3JpdGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDbG9zZUZvcldyaXRlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhPcGVuRm9yUmVhZCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSE9wZW5Gb3JSZWFkLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhDbG9zZUZvclJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDbG9zZUZvclJlYWQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFNldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXREYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAotCXsiRGF0YUhDb21wYXJlRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENvbXBhcmVEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVxdWFsKSIpfSwKLQl7IkRhdGFIVGFzayIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEZpbmlzaERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhGaW5pc2hEYXRhLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgUHRyIFBsYWNlVG9QdXREYXRhUHRyLCBCb29sZWFuIENhbmNlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhGbHVzaENhY2hlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmx1c2hDYWNoZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIUmVzb2x2ZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhSZXNvbHZlRGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSB0aGVEYXRhUmVmLCBCb29sZWFuIHVzZXJJbnRlcmZhY2VBbGxvd2VkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3YXNDaGFuZ2VkKSIpfSwKLQl7IkRhdGFIR2V0RmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZpbGVTaXplKSIpfSwKLQl7IkRhdGFIQ2FuVXNlRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENhblVzZURhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdXNlRmxhZ3MpIil9LAotCXsiRGF0YUhQcmVleHRlbmQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQcmVleHRlbmQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB1bnNpZ25lZCBsb25nIG1heFRvQWRkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzcGFjZUFkZGVkKSIpfSwKLQl7IkRhdGFIU2V0RmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmlsZVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RnJlZVNwYWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RnJlZVNwYWNlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgZnJlZVNpemUpIil9LAotCXsiRGF0YUhDcmVhdGVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ3JlYXRlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBjcmVhdG9yLCBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJsb2NrU2l6ZSkiKX0sCi0JeyJEYXRhSEdldERldmljZUluZGV4IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGV2aWNlSW5kZXgsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkZXZpY2VJbmRleCkiKX0sCi0JeyJEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXIiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4geWVzKSIpfSwKLQl7IkRhdGFIR2V0RGF0YUluQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YUluQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBzdGFydE9mZnNldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2l6ZSkiKX0sCi0JeyJEYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaXNlY3MpIil9LAotCXsiRGF0YUhTZXRDYWNoZVNpemVMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldENhY2hlU2l6ZUxpbWl0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgU2l6ZSBjYWNoZVNpemVMaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRDYWNoZVNpemVMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldENhY2hlU2l6ZUxpbWl0LCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNpemUgY2FjaGVTaXplTGltaXQpIil9LAotCXsiRGF0YUhHZXRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1vdmllLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkiKX0sCi0JeyJEYXRhSEFkZE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQWRkTW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBNb3ZpZSB0aGVNb3ZpZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlkKSIpfSwKLQl7IkRhdGFIVXBkYXRlTW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhVcGRhdGVNb3ZpZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhEb2VzQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRG9lc0J1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGJ1ZmZlcnNSZWFkcywgQm9vbGVhbiBidWZmZXJzV3JpdGVzKSIpfSwKLQl7IkRhdGFIR2V0RmlsZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRBdmFpbGFibGVGaWxlU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZpbGVTaXplKSIpfSwKLQl7IkRhdGFIR2V0TWFjT1NGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1hY09TRmlsZVR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlKSIpfSwKLQl7IkRhdGFIR2V0TUlNRVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNSU1FVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFN0cjI1NSBtaW1lVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldERhdGFSZWZXaXRoQW5jaG9yLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGFuY2hvckRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmV2l0aEFuY2hvciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBhbmNob3JEYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZikiKX0sCi0JeyJEYXRhSFNldE1hY09TRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRNYWNPU0ZpbGVUeXBlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGZpbGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFNldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0VGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBUaW1lQmFzZSB0YikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhHZXRJbmZvRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRJbmZvRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGZsYWdzKSIpfSwKLQl7IkRhdGFIR2V0RmlsZVNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZpbGVTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmaWxlU2l6ZSkiKX0sCi0JeyJEYXRhSFByZWV4dGVuZDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHJlZXh0ZW5kNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIG1heFRvQWRkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBzcGFjZUFkZGVkKSIpfSwKLQl7IkRhdGFIU2V0RmlsZVNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldEZpbGVTaXplNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB3aWRlIGZpbGVTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldEZyZWVTcGFjZTY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RnJlZVNwYWNlNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmcmVlU2l6ZSkiKX0sCi0JeyJEYXRhSEFwcGVuZDY0IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQXBwZW5kNjQsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB2b2lkICogZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBmaWxlT2Zmc2V0KSIpfSwKLQl7IkRhdGFIUG9sbFJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQb2xsUmVhZCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIHZvaWQgKiBkYXRhUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGRhdGFTaXplU29GYXIpIil9LAotCXsiRGF0YUhHZXREYXRhQXZhaWxhYmlsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgb2Zmc2V0LCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlzc2luZ19vZmZzZXQsIGxvbmcgbWlzc2luZ19sZW4pIil9LAotCXsiRGF0YUhHZXREYXRhUmVmQXNUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZkFzVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSByZXF1ZXN0ZWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAotCXsiRGF0YUhTZXREYXRhUmVmRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBleHRlbnNpb24sIE9TVHlwZSBpZFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0RGF0YVJlZkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWZFeHRlbnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgaWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGV4dGVuc2lvbikiKX0sCi0JeyJEYXRhSEdldE1vdmllV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TW92aWVXaXRoRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBzaG9ydCBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE1vdmllIHRoZU1vdmllLCBzaG9ydCBpZCkiKX0sCi0JeyJEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmciLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIERhdGFIRmlsZVR5cGVPcmRlcmluZ0hhbmRsZSBvcmRlcmluZ0xpc3RIYW5kbGUpIil9LAotCXsiRGF0YUhDcmVhdGVGaWxlV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBjcmVhdG9yLCBCb29sZWFuIGRlbGV0ZUV4aXN0aW5nLCBVSW50MzIgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIR2V0SW5mbyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEluZm8sIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgd2hhdCwgdm9pZCAqIGluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IkRhdGFIU2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRJZGxlTWFuYWdlciwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSERlbGV0ZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhEZWxldGVGaWxlLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzLCAxLAotCSBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb3V0VW5kZXJzdG9vZEZsYWdzKSIpfSwKLQl7IkRhdGFIUmVuYW1lRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFJlbmFtZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgbmV3RGF0YVJlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiRGF0YUhQbGF5YmFja0hpbnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUGxheWJhY2tIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbWluRmlsZU9mZnNldCwgdW5zaWduZWQgbG9uZyBtYXhGaWxlT2Zmc2V0LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSFBsYXliYWNrSGludHM2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFBsYXliYWNrSGludHM2NCwgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIHdpZGUgbWluRmlsZU9mZnNldCwgd2lkZSBtYXhGaWxlT2Zmc2V0LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJEYXRhSEdldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCi0JeyJEYXRhSFNldFRpbWVIaW50cyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldFRpbWVIaW50cywgMSwKLQkgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgZmxhZ3MsIGxvbmcgYmFuZHdpZHRoUHJpb3JpdHksIFRpbWVTY2FsZSBzY2FsZSwgVGltZVZhbHVlIG1pblRpbWUsIFRpbWVWYWx1ZSBtYXhUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldE1heFNyY1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXhTcmNSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IG1heFNyY1JlY3QpIil9LAotCXsiVkRHZXRBY3RpdmVTcmNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0QWN0aXZlU3JjUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBhY3RpdmVTcmNSZWN0KSIpfSwKLQl7IlZEU2V0RGlnaXRpemVyUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldERpZ2l0aXplclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaWdpdGl6ZXJSZWN0KSIpfSwKLQl7IlZER2V0RGlnaXRpemVyUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldERpZ2l0aXplclJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaWdpdGl6ZXJSZWN0KSIpfSwKLQl7IlZER2V0VkJsYW5rUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldFZCbGFua1JlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0ZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdkJsYW5rUmVjdCkiKX0sCi0JeyJWREdldE1hc2tQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXNrUGl4TWFwLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUGl4TWFwSGFuZGxlIG1hc2tQaXhNYXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEVXNlVGhpc0NMVVQiLCAoUHlDRnVuY3Rpb24pUXRfVkRVc2VUaGlzQ0xVVCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXRJbnB1dEdhbW1hVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dEdhbW1hVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBGaXhlZCBjaGFubmVsMSwgRml4ZWQgY2hhbm5lbDIsIEZpeGVkIGNoYW5uZWwzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldElucHV0R2FtbWFWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0R2FtbWFWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCBjaGFubmVsMSwgRml4ZWQgY2hhbm5lbDIsIEZpeGVkIGNoYW5uZWwzKSIpfSwKLQl7IlZEU2V0QnJpZ2h0bmVzcyIsIChQeUNGdW5jdGlvbilRdF9WRFNldEJyaWdodG5lc3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYnJpZ2h0bmVzcykiKX0sCi0JeyJWREdldEJyaWdodG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRCcmlnaHRuZXNzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MpIil9LAotCXsiVkRTZXRDb250cmFzdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldENvbnRyYXN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0KSIpfSwKLQl7IlZEU2V0SHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGh1ZSkiKX0sCi0JeyJWRFNldFNoYXJwbmVzcyIsIChQeUNGdW5jdGlvbilRdF9WRFNldFNoYXJwbmVzcywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3MpIil9LAotCXsiVkRTZXRTYXR1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0U2F0dXJhdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBzYXR1cmF0aW9uKSIpfSwKLQl7IlZER2V0Q29udHJhc3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDb250cmFzdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdCkiKX0sCi0JeyJWREdldEh1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEh1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBodWUpIil9LAotCXsiVkRHZXRTaGFycG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTaGFycG5lc3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzKSIpfSwKLQl7IlZER2V0U2F0dXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WREdldFNhdHVyYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbikiKX0sCi0JeyJWREdyYWJPbmVGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9WREdyYWJPbmVGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0TWF4QXV4QnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWF4QXV4QnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBwbSwgUmVjdCByKSIpfSwKLQl7IlZER2V0Q3VycmVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q3VycmVudEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5wdXRDdXJyZW50RmxhZywgbG9uZyBvdXRwdXRDdXJyZW50RmxhZykiKX0sCi0JeyJWRFNldEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0S2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0S2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbmRleCkiKX0sCi0JeyJWREFkZEtleUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQWRkS2V5Q29sb3IsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbmRleCkiKX0sCi0JeyJWREdldE5leHRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREdldE5leHRLZXlDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0S2V5Q29sb3JSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEtleUNvbG9yUmFuZ2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgbWluUkdCLCBSR0JDb2xvciBtYXhSR0IpIil9LAotCXsiVkRHZXRLZXlDb2xvclJhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0S2V5Q29sb3JSYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciBtaW5SR0IsIFJHQkNvbG9yIG1heFJHQikiKX0sCi0JeyJWRFNldElucHV0Q29sb3JTcGFjZU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgY29sb3JTcGFjZU1vZGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0SW5wdXRDb2xvclNwYWNlTW9kZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0Q29sb3JTcGFjZU1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgY29sb3JTcGFjZU1vZGUpIil9LAotCXsiVkRTZXRDbGlwU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDbGlwU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBjbGlwRW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldENsaXBTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldENsaXBTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBjbGlwRW5hYmxlKSIpfSwKLQl7IlZEU2V0Q2xpcFJnbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldENsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJlZ2lvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRDbGVhckNsaXBSZ24iLCAoUHlDRnVuY3Rpb24pUXRfVkRDbGVhckNsaXBSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBSZ25IYW5kbGUgY2xpcFJlZ2lvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRDTFVUSW5Vc2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDTFVUSW5Vc2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ1RhYkhhbmRsZSBjb2xvclRhYmxlSGFuZGxlKSIpfSwKLQl7IlZEU2V0UExMRmlsdGVyVHlwZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFBMTEZpbHRlclR5cGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBwbGxUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFBMTEZpbHRlclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRQTExGaWx0ZXJUeXBlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHBsbFR5cGUpIil9LAotCXsiVkRHZXRNYXNrYW5kVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRNYXNrYW5kVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCB1bnNpZ25lZCBzaG9ydCBibGVuZExldmVsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtYXNrLCBsb25nIHZhbHVlKSIpfSwKLQl7IlZEU2V0TWFzdGVyQmxlbmRMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9WRFNldE1hc3RlckJsZW5kTGV2ZWwsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbCkiKX0sCi0JeyJWRFNldFBsYXlUaHJ1T25PZmYiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQbGF5VGhydU9uT2ZmLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgc3RhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0RmllbGRQcmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RmllbGRQcmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgZmllbGRGbGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldEZpZWxkUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEZpZWxkUHJlZmVyZW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBmaWVsZEZsYWcpIil9LAotCXsiVkRQcmVmbGlnaHRHbG9iYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEUHJlZmxpZ2h0R2xvYmFsUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEdyYWZQdHIgdGhlV2luZG93KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBnbG9iYWxSZWN0KSIpfSwKLQl7IlZEU2V0UGxheVRocnVHbG9iYWxSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UGxheVRocnVHbG9iYWxSZWN0LCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgR3JhZlB0ciB0aGVXaW5kb3cpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGdsb2JhbFJlY3QpIil9LAotCXsiVkRTZXRCbGFja0xldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRCbGFja0xldmVsVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbCkiKX0sCi0JeyJWREdldEJsYWNrTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEJsYWNrTGV2ZWxWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsKSIpfSwKLQl7IlZEU2V0V2hpdGVMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0V2hpdGVMZXZlbFZhbHVlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwpIil9LAotCXsiVkRHZXRXaGl0ZUxldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRXaGl0ZUxldmVsVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgd2hpdGVMZXZlbCkiKX0sCi0JeyJWREdldFZpZGVvRGVmYXVsdHMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRWaWRlb0RlZmF1bHRzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWwsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MsIHVuc2lnbmVkIHNob3J0IGh1ZSwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbiwgdW5zaWduZWQgc2hvcnQgY29udHJhc3QsIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcykiKX0sCi0JeyJWREdldE51bWJlck9mSW5wdXRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TnVtYmVyT2ZJbnB1dHMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaW5wdXRzKSIpfSwKLQl7IlZER2V0SW5wdXRGb3JtYXQiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dEZvcm1hdCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZm9ybWF0KSIpfSwKLQl7IlZEU2V0SW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRJbnB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldElucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgaW5wdXQpIil9LAotCXsiVkRTZXRJbnB1dFN0YW5kYXJkIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRTdGFuZGFyZCwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RhbmRhcmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0dXBCdWZmZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0dXBCdWZmZXJzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgVmRpZ0J1ZmZlclJlY0xpc3RIYW5kbGUgYnVmZmVyTGlzdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHcmFiT25lRnJhbWVBc3luYyIsIChQeUNGdW5jdGlvbilRdF9WREdyYWJPbmVGcmFtZUFzeW5jLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgYnVmZmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRERvbmUiLCAoUHlDRnVuY3Rpb24pUXRfVkREb25lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgYnVmZmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldENvbXByZXNzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q29tcHJlc3Npb24sIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBPU1R5cGUgY29tcHJlc3NUeXBlLCBzaG9ydCBkZXB0aCwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IlZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQ29tcHJlc3NPbmVGcmFtZUFzeW5jLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW1hZ2VEZXNjcmlwdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRSZXNldENvbXByZXNzU2VxdWVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRSZXNldENvbXByZXNzU2VxdWVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldENvbXByZXNzaW9uT25PZmYiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDb21wcmVzc2lvbk9uT2ZmLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQm9vbGVhbiBzdGF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXRDb21wcmVzc2lvblR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29tcHJlc3Npb25UeXBlcywgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFZEQ29tcHJlc3Npb25MaXN0SGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFRpbWVCYXNlIHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RnJhbWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgRml4ZWQgZnJhbWVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaVNlY1BlckZyYW1lLCBGaXhlZCBmcmFtZXNQZXJTZWNvbmQsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAotCXsiVkRHZXRTb3VuZElucHV0RHJpdmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U291bmRJbnB1dERyaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFN0cjI1NSBzb3VuZERyaXZlck5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0RE1BRGVwdGhzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RE1BRGVwdGhzLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVwdGhBcnJheSwgbG9uZyBwcmVmZXJyZWREZXB0aCkiKX0sCi0JeyJWREdldFByZWZlcnJlZFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFByZWZlcnJlZFRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgcHJlZmVycmVkKSIpfSwKLQl7IlZEUmVsZWFzZUFzeW5jQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFJlbGVhc2VBc3luY0J1ZmZlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWRFNldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RGF0YVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFRpbWVDb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0VGltZUNvZGUsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCB2b2lkICogdGltZUNvZGVGb3JtYXQsIHZvaWQgKiB0aW1lQ29kZVRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lUmVjb3JkIGF0VGltZSkiKX0sCi0JeyJWRFVzZVNhZmVCdWZmZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEVXNlU2FmZUJ1ZmZlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBCb29sZWFuIHVzZVNhZmVCdWZmZXJzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJWREdldFNvdW5kSW5wdXRTb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTb3VuZElucHV0U291cmNlLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB2aWRlb0lucHV0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzb3VuZElucHV0KSIpfSwKLQl7IlZER2V0Q29tcHJlc3Npb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29tcHJlc3Npb25UaW1lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgT1NUeXBlIGNvbXByZXNzaW9uVHlwZSwgc2hvcnQgZGVwdGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHNyY1JlY3QsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgdW5zaWduZWQgbG9uZyBjb21wcmVzc1RpbWUpIil9LAotCXsiVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB3aWR0aCwgbG9uZyBoZWlnaHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0UHJlZmVycmVkSW1hZ2VEaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KSIpfSwKLQl7IlZER2V0SW5wdXROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXROYW1lLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyB2aWRlb0lucHV0LCBTdHIyNTUgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRTZXREZXN0aW5hdGlvblBvcnQiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXREZXN0aW5hdGlvblBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBDR3JhZlB0ciBkZXN0UG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXREZXZpY2VOYW1lQW5kRmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBTdHIyNTUgb3V0TmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBvdXROYW1lRmxhZ3MpIil9LAotCXsiVkRDYXB0dXJlU3RhdGVDaGFuZ2luZyIsIChQeUNGdW5jdGlvbilRdF9WRENhcHR1cmVTdGF0ZUNoYW5naW5nLCAxLAotCSBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgVUludDMyIGluU3RhdGVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFN0cmluZ1B0ciBlcnJEZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBlcnJvckxpbmUpIil9LAotCXsiWE1MUGFyc2VBZGRFbGVtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkRWxlbWVudCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIG5hbWVTcGFjZUlELCBsb25nIGVsZW1lbnRGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgZWxlbWVudE5hbWUsIFVJbnQzMiBlbGVtZW50SUQpIil9LAotCXsiWE1MUGFyc2VBZGRBdHRyaWJ1dGUiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBuYW1lU3BhY2VJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgYXR0cmlidXRlTmFtZSwgVUludDMyIGF0dHJpYnV0ZUlEKSIpfSwKLQl7IlhNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIG5hbWVTcGFjZUlEcywgY2hhciBhdHRyaWJ1dGVOYW1lcywgVUludDMyIGF0dHJpYnV0ZUlEcykiKX0sCi0JeyJYTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkQXR0cmlidXRlQW5kVmFsdWUsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBuYW1lU3BhY2VJRCwgVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZCwgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGF0dHJpYnV0ZU5hbWUsIFVJbnQzMiBhdHRyaWJ1dGVJRCkiKX0sCi0JeyJYTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZCIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZVZhbHVlS2luZCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCwgVUludDMyIGF0dHJpYnV0ZUlELCBVSW50MzIgYXR0cmlidXRlVmFsdWVLaW5kLCB2b2lkICogYXR0cmlidXRlVmFsdWVLaW5kSW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiWE1MUGFyc2VBZGROYW1lU3BhY2UiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGROYW1lU3BhY2UsIDEsCi0JIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG5hbWVTcGFjZVVSTCwgVUludDMyIG5hbWVTcGFjZUlEKSIpfSwKLQl7IlhNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VTZXRPZmZzZXRBbmRMaW1pdCwgMSwKLQkgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIG9mZnNldCwgVUludDMyIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBsb25nIHJlZmNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dJbml0aWFsaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSW5pdGlhbGl6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldERhdGFPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXREYXRhT3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEZTU3BlYyBtb3ZpZUZpbGUsIGxvbmcgd2hlcmVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXREYXRhT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YU91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBGU1NwZWMgbW92aWVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyB3aGVyZUZsYWdzKSIpfSwKLQl7IlNHU2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIENHcmFmUHRyIGdwLCBHREhhbmRsZSBnZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRHV29ybGQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENHcmFmUHRyIGdwLCBHREhhbmRsZSBnZCkiKX0sCi0JeyJTR05ld0NoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdDaGFubmVsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIE9TVHlwZSBjaGFubmVsVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHQ2hhbm5lbCByZWYpIil9LAotCXsiU0dEaXNwb3NlQ2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0Rpc3Bvc2VDaGFubmVsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0YXJ0UHJldmlldyIsIChQeUNGdW5jdGlvbilRdF9TR1N0YXJ0UHJldmlldywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0YXJ0UmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU3RhcnRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1N0b3AiLCAoUHlDRnVuY3Rpb24pUXRfU0dTdG9wLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGF1c2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYXVzZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBCb29sZWFuIHBhdXNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1ByZXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQcmVwYXJlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEJvb2xlYW4gcHJlcGFyZUZvclByZXZpZXcsIEJvb2xlYW4gcHJlcGFyZUZvclJlY29yZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dSZWxlYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUmVsZWFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldE1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TW92aWUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKE1vdmllIF9ydikiKX0sCi0JeyJTR1NldE1heGltdW1SZWNvcmRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0TWF4aW11bVJlY29yZFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgdW5zaWduZWQgbG9uZyB0aWNrcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRNYXhpbXVtUmVjb3JkVGltZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE1heGltdW1SZWNvcmRUaW1lLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHRpY2tzKSIpfSwKLQl7IlNHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGJ5dGVzKSIpfSwKLQl7IlNHR2V0VGltZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFRpbWVSZW1haW5pbmcsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdGlja3NMZWZ0KSIpfSwKLQl7IlNHR3JhYlBpY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiUGljdCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBSZWN0IGJvdW5kcywgc2hvcnQgb2Zmc2NyZWVuRGVwdGgsIGxvbmcgZ3JhYlBpY3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwKSIpfSwKLQl7IlNHR2V0TGFzdE1vdmllUmVzSUQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRMYXN0TW92aWVSZXNJRCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgcmVzSUQpIil9LAotCXsiU0dTZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIGxvbmcgc2dGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldEZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNnRmxhZ3MpIil9LAotCXsiU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9TR05ld0NoYW5uZWxGcm9tQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIENvbXBvbmVudCBzZ0NoYW5uZWxDb21wb25lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgbmV3Q2hhbm5lbCkiKX0sCi0JeyJTR1NldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgVXNlckRhdGEgdWQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVXNlckRhdGEgdWQpIil9LAotCXsiU0dHZXRJbmRDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0SW5kQ2hhbm5lbCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBzaG9ydCBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHQ2hhbm5lbCByZWYsIE9TVHlwZSBjaGFuVHlwZSkiKX0sCi0JeyJTR1VwZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR1VwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBSZ25IYW5kbGUgdXBkYXRlUmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFBhdXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0UGF1c2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gcGF1c2VkKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFNldHRpbmdzLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBVc2VyRGF0YSB1ZCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVc2VyRGF0YSB1ZCkiKX0sCi0JeyJTR0dldE1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRNb2RlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHByZXZpZXdNb2RlLCBCb29sZWFuIHJlY29yZE1vZGUpIil9LAotCXsiU0dTZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RGF0YVJlZiwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFSZWYsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIGxvbmcgd2hlcmVGbGFncykiKX0sCi0JeyJTR05ld091dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR05ld091dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR091dHB1dCBzZ091dCkiKX0sCi0JeyJTR0Rpc3Bvc2VPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dEaXNwb3NlT3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldE91dHB1dEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQsIGxvbmcgd2hlcmVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbE91dHB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmcsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHNwYWNlKSIpfSwKLQl7IlNHSGFuZGxlVXBkYXRlRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dIYW5kbGVVcGRhdGVFdmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBFdmVudFJlY29yZCBldmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaGFuZGxlZCkiKX0sCi0JeyJTR1NldE91dHB1dE5leHRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRPdXRwdXROZXh0T3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBTR091dHB1dCBuZXh0T3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldE91dHB1dE5leHRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRPdXRwdXROZXh0T3V0cHV0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dPdXRwdXQgbmV4dE91dCkiKX0sCi0JeyJTR1NldE91dHB1dE1heGltdW1PZmZzZXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0LCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCB3aWRlIG1heE9mZnNldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRPdXRwdXRNYXhpbXVtT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0T3V0cHV0TWF4aW11bU9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgbWF4T2Zmc2V0KSIpfSwKLQl7IlNHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE91dHB1dERhdGFSZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKLQl7IlNHV3JpdGVFeHRlbmRlZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCBTR091dHB1dCBzZ091dCkiKX0sCi0JeyJTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgYnl0ZXMpIil9LAotCXsiU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIHNwYWNlKSIpfSwKLQl7IlNHV3JpdGVNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZU1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvZmZzZXQpIil9LAotCXsiU0dHZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFRpbWVCYXNlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lQmFzZSB0YikiKX0sCi0JeyJTR0FkZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZE1vdmllRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuLCBsb25nIGNoUmVmQ29uLCBUaW1lVmFsdWUgdGltZSwgc2hvcnQgd3JpdGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBvZmZzZXQpIil9LAotCXsiU0dDaGFuZ2VkU291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbmdlZFNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dBZGRFeHRlbmRlZE1vdmllRGF0YSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZEV4dGVuZGVkTW92aWVEYXRhLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4sIGxvbmcgY2hSZWZDb24sIFRpbWVWYWx1ZSB0aW1lLCBzaG9ydCB3cml0ZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgU0dPdXRwdXQgd2hpY2hPdXRwdXQpIil9LAotCXsiU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSIsIChQeUNGdW5jdGlvbilRdF9TR0FkZE91dHB1dERhdGFSZWZUb01lZGlhLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBNZWRpYSB0aGVNZWRpYSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRTZXR0aW5nc1N1bW1hcnkiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTZXR0aW5nc1N1bW1hcnksIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIHN1bW1hcnlUZXh0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldENoYW5uZWxVc2FnZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxVc2FnZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgdXNhZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFVzYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFVzYWdlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdXNhZ2UpIil9LAotCXsiU0dTZXRDaGFubmVsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJlY3QgYm91bmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxCb3VuZHMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsQm91bmRzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYm91bmRzKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0Q2hhbm5lbFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgdm9sdW1lKSIpfSwKLQl7IlNHR2V0Q2hhbm5lbEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGNoYW5uZWxJbmZvKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbFBsYXlGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxQbGF5RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHBsYXlGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDaGFubmVsUGxheUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFBsYXlGbGFncywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHBsYXlGbGFncykiKX0sCi0JeyJTR1NldENoYW5uZWxNYXhGcmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsTWF4RnJhbWVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBmcmFtZUNvdW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxNYXhGcmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsTWF4RnJhbWVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZnJhbWVDb3VudCkiKX0sCi0JeyJTR1NldENoYW5uZWxSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyByZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q2hhbm5lbENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsQ2xpcCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJnbkhhbmRsZSB0aGVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHRoZUNsaXApIil9LAotCXsiU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgc2FtcGxlRGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbERldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldENoYW5uZWxUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVTY2FsZSBzY2FsZSkiKX0sCi0JeyJTR0NoYW5uZWxQdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFB1dFBpY3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxTZXRSZXF1ZXN0ZWREYXRhUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldFJlcXVlc3RlZERhdGFSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAotCXsiU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsU2V0RGF0YVNvdXJjZU5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgbmFtZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTY3JpcHRDb2RlIHNjcmlwdFRhZykiKX0sCi0JeyJTR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFNldENvZGVjU2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgc2V0dGluZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsR2V0Q29kZWNTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgc2V0dGluZ3MpIil9LAotCXsiU0dHZXRDaGFubmVsVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVGltZUJhc2UsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZUJhc2UgdGIpIil9LAotCXsiU0dHZXRDaGFubmVsUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFJlZkNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbikiKX0sCi0JeyJTR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgb3V0RGV2aWNlTmFtZSwgU3RyMjU1IG91dElucHV0TmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG91dElucHV0TnVtYmVyKSIpfSwKLQl7IlNHU2V0Q2hhbm5lbERldmljZUlucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbERldmljZUlucHV0LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgaW5JbnB1dE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRDaGFubmVsU2V0dGluZ3NTdGF0ZUNoYW5naW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFVJbnQzMiBpbkZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0luaXRDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSW5pdENoYW5uZWwsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTZXFHcmFiQ29tcG9uZW50IG93bmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1dyaXRlU2FtcGxlcyIsIChQeUNGdW5jdGlvbilRdF9TR1dyaXRlU2FtcGxlcywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIE1vdmllIG0sIEFsaWFzSGFuZGxlIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhUmF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKLQl7IlNHQWxpZ25DaGFubmVsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR0FsaWduQ2hhbm5lbFJlY3QsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKLQl7IlNHUGFuZWxHZXREaXRsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXREaXRsLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGl0bCkiKX0sCi0JeyJTR1BhbmVsR2V0VGl0bGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEdldFRpdGxlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFN0cjI1NSB0aXRsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQYW5lbENhblJ1biIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsQ2FuUnVuLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsSW5zdGFsbCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsSW5zdGFsbCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxFdmVudCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsRXZlbnQsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0LCBFdmVudFJlY29yZCB0aGVFdmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGl0ZW1IaXQsIEJvb2xlYW4gaGFuZGxlZCkiKX0sCi0JeyJTR1BhbmVsSXRlbSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsSXRlbSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQsIHNob3J0IGl0ZW1OdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxSZW1vdmUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFJlbW92ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgRGlhbG9nUHRyIGQsIHNob3J0IGl0ZW1PZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxTZXRHcmFiYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxTZXRHcmFiYmVyLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNlcUdyYWJDb21wb25lbnQgc2cpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHUGFuZWxTZXRSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxTZXRSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIHNob3J0IHJlc1JlZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dQYW5lbEdldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRTZXR0aW5ncywgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVzZXJEYXRhIHVkKSIpfSwKLQl7IlNHUGFuZWxTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0U2V0dGluZ3MsIDEsCi0JIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFVzZXJEYXRhIHVkLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1BhbmVsVmFsaWRhdGVJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsVmFsaWRhdGVJbnB1dCwgMSwKLQkgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBvaykiKX0sCi0JeyJTR1BhbmVsR2V0RElUTEZvclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEdldERJVExGb3JTaXplLCAxLAotCSBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGl0bCwgUG9pbnQgcmVxdWVzdGVkU2l6ZSkiKX0sCi0JeyJTR0dldFNyY1ZpZGVvQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U3JjVmlkZW9Cb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKLQl7IlNHU2V0VmlkZW9SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9SZWN0LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgUmVjdCByKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFZpZGVvUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvUmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHIpIil9LAotCXsiU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9Db21wcmVzc29yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgY29tcHJlc3NvclR5cGUpIil9LAotCXsiU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9Db21wcmVzc29yVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIE9TVHlwZSBjb21wcmVzc29yVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRWaWRlb0NvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb0NvbXByZXNzb3IsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBkZXB0aCwgQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIGxvbmcga2V5RnJhbWVSYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFZpZGVvQ29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvQ29tcHJlc3NvciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBkZXB0aCwgQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIGxvbmcga2V5RnJhbWVSYXRlKSIpfSwKLQl7IlNHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRJbnN0YW5jZSBfcnYpIil9LAotCXsiU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgQ29tcG9uZW50SW5zdGFuY2UgdmRpZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfU0dWaWRlb0RpZ2l0aXplckNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dyYWJGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0dyYWJGcmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHcmFiRnJhbWVDb21wbGV0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dyYWJGcmFtZUNvbXBsZXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBkb25lKSIpfSwKLQl7IlNHQ29tcHJlc3NGcmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0NvbXByZXNzRnJhbWUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHU2V0Q29tcHJlc3NCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDb21wcmVzc0J1ZmZlciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGRlcHRoLCBSZWN0IGNvbXByZXNzU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRDb21wcmVzc0J1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9TR0dldENvbXByZXNzQnVmZmVyLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGRlcHRoLCBSZWN0IGNvbXByZXNzU2l6ZSkiKX0sCi0JeyJTR0dldEJ1ZmZlckluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRCdWZmZXJJbmZvLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUGl4TWFwSGFuZGxlIGJ1ZmZlclBNLCBSZWN0IGJ1ZmZlclJlY3QsIEdXb3JsZFB0ciBjb21wcmVzc0J1ZmZlciwgUmVjdCBjb21wcmVzc0J1ZmZlclJlY3QpIil9LAotCXsiU0dTZXRVc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRVc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBCb29sZWFuIHVzZVNjcmVlbkJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRVc2VTY3JlZW5CdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRVc2VTY3JlZW5CdWZmZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXIpIil9LAotCXsiU0dTZXRGcmFtZVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGcmFtZVJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBGaXhlZCBmcmFtZVJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RnJhbWVSYXRlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIGZyYW1lUmF0ZSkiKX0sCi0JeyJTR1NldFByZWZlcnJlZFBhY2tldFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSIpfSwKLQl7IlNHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSBjb21wcmVzc29yVHlwZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRVc2VyVmlkZW9Db21wcmVzc29yTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgY29tcHJlc3NvclR5cGVzKSIpfSwKLQl7IlNHU2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kSW5wdXREcml2ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHIyNTUgZHJpdmVyTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dHZXRTb3VuZElucHV0RHJpdmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dERyaXZlciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU291bmRJbnB1dERyaXZlckNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRSZWNvcmRDaHVua1NpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHNlY29uZHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlNHR2V0U291bmRSZWNvcmRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRTb3VuZFJlY29yZENodW5rU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTR1NldFNvdW5kSW5wdXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRJbnB1dFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBGaXhlZCByYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFNvdW5kSW5wdXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoRml4ZWQgX3J2KSIpfSwKLQl7IlNHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZElucHV0UGFyYW1ldGVycywgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IHNhbXBsZVNpemUsIHNob3J0IG51bUNoYW5uZWxzLCBPU1R5cGUgY29tcHJlc3Npb25UeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRJbnB1dFBhcmFtZXRlcnMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc2FtcGxlU2l6ZSwgc2hvcnQgbnVtQ2hhbm5lbHMsIE9TVHlwZSBjb21wcmVzc2lvblR5cGUpIil9LAotCXsiU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcyIsIChQeUNGdW5jdGlvbilRdF9TR1NldEFkZGl0aW9uYWxTb3VuZFJhdGVzLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHJhdGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHJhdGVzKSIpfSwKLQl7IlNHU2V0Rm9udE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGb250TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cmluZ1B0ciBwc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR1NldEZvbnRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Rm9udFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBmb250U2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiU0dTZXRUZXh0Rm9yZUNvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dEZvcmVDb2xvciwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0aGVDb2xvcikiKX0sCi0JeyJTR1NldFRleHRCYWNrQ29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRUZXh0QmFja0NvbG9yLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIHRoZUNvbG9yKSIpfSwKLQl7IlNHU2V0SnVzdGlmaWNhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9TR1NldEp1c3RpZmljYXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBqdXN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJTR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlLCAxLAotCSBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHJldHRvc3BhY2UpIil9LAotCXsiU0dTZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IHJldHRvc3BhY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRDdXJyZW50Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXRDbGllbnROYW1lLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEJlZ2luIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRCZWdpbiwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEVuZCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0RW5kLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBsb25nIGRpc3BsYXlNb2RlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXREaXNwbGF5TW9kZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRpc3BsYXlNb2RlSUQpIil9LAotCXsiUVRWaWRlb091dHB1dEdldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0R1dvcmxkLCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgR1dvcmxkUHRyIGd3KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRJbmRTb3VuZE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50KSIpfSwKLQl7IlFUVmlkZW9PdXRwdXRHZXRDbG9jayIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0Q2xvY2ssIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRJbnN0YW5jZSBjbG9jaykiKX0sCi0JeyJRVFZpZGVvT3V0cHV0U2V0RWNob1BvcnQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0LCAxLAotCSBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBDR3JhZlB0ciBlY2hvUG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvciwgMSwKLQkgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudCBjb2RlYykiKX0sCi0JeyJRVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRCYXNlU2V0RWNob1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIENHcmFmUHRyIGVjaG9Qb3J0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVUludDMyIGZsYWdzLCBVSW50MzIgZmxhZ3NNYXNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3MsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBmbGFncykiKX0sCi0JeyJNZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2l6ZSBhbGxvd2FuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2l6ZSBhbGxvd2FuY2UpIil9LAotCXsiTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0SGFuZGxlckNhcGFiaWxpdGllcyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgbG9uZyBmbGFnc01hc2spIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhSWRsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUlkbGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVZhbHVlIGF0TWVkaWFUaW1lLCBsb25nIGZsYWdzSW4sIFRpbWVSZWNvcmQgbW92aWVUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmbGFnc091dCkiKX0sCi0JeyJNZWRpYUdldE1lZGlhSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE1lZGlhSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFQdXRNZWRpYUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQdXRNZWRpYUluZm8sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0QWN0aXZlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0QWN0aXZlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gZW5hYmxlTWVkaWEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFJhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHR2V0U3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR0dldFN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50UmVzdWx0IHN0YXR1c0VycikiKX0sCi0JeyJNZWRpYVRyYWNrRWRpdGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tFZGl0ZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldE1lZGlhVGltZVNjYWxlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVTY2FsZSBuZXdUaW1lU2NhbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0TW92aWVUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRNb3ZpZVRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lU2NhbGUgbmV3VGltZVNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEdXb3JsZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDR3JhZlB0ciBhUG9ydCwgR0RIYW5kbGUgYUdEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNldERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXREaW1lbnNpb25zLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHdpZHRoLCBGaXhlZCBoZWlnaHQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhU2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldENsaXAsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHRoZUNsaXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0VHJhY2tPcGFxdWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRUcmFja09wYXF1ZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB0cmFja0lzT3BhcXVlKSIpfSwKLQl7Ik1lZGlhU2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0R3JhcGhpY3NNb2RlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbW9kZSwgUkdCQ29sb3Igb3BDb2xvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRHcmFwaGljc01vZGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRHcmFwaGljc01vZGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbW9kZSwgUkdCQ29sb3Igb3BDb2xvcikiKX0sCi0JeyJNZWRpYUdTZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHZvbHVtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgYmFsYW5jZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhbGFuY2UpIil9LAotCXsiTWVkaWFHZXROZXh0Qm91bmRzQ2hhbmdlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVZhbHVlIHdoZW4pIil9LAotCXsiTWVkaWFHZXRTcmNSZ24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTcmNSZ24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHJnbiwgVGltZVZhbHVlIGF0TWVkaWFUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVByZXJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQcmVyb2xsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSB0aW1lLCBGaXhlZCByYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUhhc0NoYXJhY3RlcmlzdGljIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSGFzQ2hhcmFjdGVyaXN0aWMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGNoYXJhY3RlcmlzdGljKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBoYXNJdCkiKX0sCi0JeyJNZWRpYUdldE9mZnNjcmVlbkJ1ZmZlclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGRlcHRoLCBDVGFiSGFuZGxlIGN0YWIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCi0JeyJNZWRpYVNldEhpbnRzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0SGludHMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBoaW50cykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBTdHIyNTUgbmFtZSwgbG9uZyByZXF1ZXN0ZWRMYW5ndWFnZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYWN0dWFsTGFuZ3VhZ2UpIil9LAotCXsiTWVkaWFGb3JjZVVwZGF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUZvcmNlVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZm9yY2VVcGRhdGVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXREcmF3aW5nUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0RHJhd2luZ1JnbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIHBhcnRpYWxSZ24pIil9LAotCXsiTWVkaWFHU2V0QWN0aXZlU2VnbWVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdTZXRBY3RpdmVTZWdtZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhY3RpdmVTdGFydCwgVGltZVZhbHVlIGFjdGl2ZUR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUludmFsaWRhdGVSZWdpb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFJbnZhbGlkYXRlUmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSBpbnZhbFJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXROZXh0U3RlcFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXROZXh0U3RlcFRpbWUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgZmxhZ3MsIFRpbWVWYWx1ZSBtZWRpYVRpbWVJbiwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSBtZWRpYVRpbWVPdXQpIil9LAotCXsiTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUNoYW5nZWROb25QcmltYXJ5U291cmNlLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaW5wdXRJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFUcmFja1JlZmVyZW5jZXNDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlciIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlciwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHNhbXBsZU51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFUcmFja1Byb3BlcnR5QXRvbUNoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRWaWRlb1BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0VmlkZW9QYXJhbSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHdoaWNoUGFyYW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkiKX0sCi0JeyJNZWRpYUdldFZpZGVvUGFyYW0iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRWaWRlb1BhcmFtLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgd2hpY2hQYXJhbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHZhbHVlKSIpfSwKLQl7Ik1lZGlhQ29tcGFyZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUNvbXBhcmUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgTWVkaWEgc3JjTWVkaWEsIENvbXBvbmVudEluc3RhbmNlIHNyY01lZGlhQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBpc09LKSIpfSwKLQl7Ik1lZGlhR2V0Q2xvY2siLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRDbG9jaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50SW5zdGFuY2UgY2xvY2spIil9LAotCXsiTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kT3V0cHV0Q29tcG9uZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZE91dHB1dENvbXBvbmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudCkiKX0sCi0JeyJNZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFNvdW5kTG9jYWxpemF0aW9uRGF0YSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBIYW5kbGUgZGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRJbnZhbGlkUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0SW52YWxpZFJlZ2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgcmduKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25CMk4sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2FtcGxlRGVzY3JpcHRpb25OMkIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgc2FtcGxlRGVzY3JpcHRpb25IKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUZsdXNoTm9uUHJpbWFyeVNvdXJjZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaW5wdXRJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRVUkxMaW5rIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VVJMTGluaywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQb2ludCBkaXNwbGF5V2hlcmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdXJsTGluaykiKX0sCi0JeyJNZWRpYUhpdFRlc3RGb3JUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdGFyZ2V0UmVmQ29uKSIpfSwKLQl7Ik1lZGlhSGl0VGVzdFRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB0YXJnZXRSZWZDb24sIGxvbmcgZmxhZ3MsIFBvaW50IGxvYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2FzSGl0KSIpfSwKLQl7Ik1lZGlhRGlzcG9zZVRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24sIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB0YXJnZXRSZWZDb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmlyc3RSZWZDb24sIGxvbmcgc2Vjb25kUmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlcXVhbCkiKX0sCi0JeyJNZWRpYVByZVByZXJvbGxDYW5jZWwiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFQcmVQcmVyb2xsQ2FuY2VsLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiByZWZjb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhRW50ZXJFbXB0eUVkaXQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFFbnRlckVtcHR5RWRpdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pbGxpU2VjcykiKX0sCi0JeyJNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVmZmVjdGl2ZVZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgdm9sdW1lKSIpfSwKLQl7Ik1lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZW5hYmxlZCkiKX0sCi0JeyJNZWRpYVNldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gZW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVmZmVjdGl2ZVNvdW5kQmFsYW5jZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgYmFsYW5jZSkiKX0sCi0JeyJNZWRpYVNldFNjcmVlbkxvY2siLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTY3JlZW5Mb2NrLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEJvb2xlYW4gbG9ja0l0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldEVycm9yU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0RXJyb3JTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29tcG9uZW50UmVzdWx0IHRoZUVycm9yLCBTdHIyNTUgZXJyb3JTdHJpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRFcXVhbGl6ZXJCYW5kTGV2ZWxzLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50OCBiYW5kTGV2ZWxzKSIpfSwKLQl7Ik1lZGlhRG9JZGxlQWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYURvSWRsZUFjdGlvbnMsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZEJhc3NBbmRUcmVibGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgYmFzcywgc2hvcnQgdHJlYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kQmFzc0FuZFRyZWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgYmFzcywgc2hvcnQgdHJlYmxlKSIpfSwKLQl7Ik1lZGlhVGltZUJhc2VDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVGltZUJhc2VDaGFuZ2VkLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhTUNJc1BsYXllckV2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhTUNJc1BsYXllckV2ZW50LCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEV2ZW50UmVjb3JkIGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGhhbmRsZWRJdCkiKX0sCi0JeyJNZWRpYUdldE1lZGlhTG9hZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TWVkaWFMb2FkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWVkaWFMb2FkU3RhdGUpIil9LAotCXsiTWVkaWFWaWRlb091dHB1dENoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFWaWRlb091dHB1dENoYW5nZWQsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29tcG9uZW50SW5zdGFuY2Ugdm91dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFFbXB0eVNhbXBsZUNhY2hlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRW1wdHlTYW1wbGVDYWNoZSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHNhbXBsZU51bSwgbG9uZyBzYW1wbGVDb3VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFHZXRQdWJsaWNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0UHVibGljSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBPU1R5cGUgaW5mb1NlbGVjdG9yLCB2b2lkICogaW5mb0RhdGFQdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTaXplIGlvRGF0YVNpemUpIil9LAotCXsiTWVkaWFTZXRQdWJsaWNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0UHVibGljSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBPU1R5cGUgaW5mb1NlbGVjdG9yLCB2b2lkICogaW5mb0RhdGFQdHIsIFNpemUgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik1lZGlhUmVmQ29uU2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFSZWZDb25TZXRQcm9wZXJ0eSwgMSwKLQkgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbiwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNZWRpYVJlZkNvbkdldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUmVmQ29uR2V0UHJvcGVydHksIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24sIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYU5hdmlnYXRlVGFyZ2V0UmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgbmF2aWdhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uKSIpfSwKLQl7Ik1lZGlhR0dldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR0dldElkbGVNYW5hZ2VyLCAxLAotCSBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJZGxlTWFuYWdlciBwaW0pIil9LAotCXsiTWVkaWFHU2V0SWRsZU1hbmFnZXIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0SWRsZU1hbmFnZXIsIDEsCi0JIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSWRsZU1hbmFnZXIgaW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlFUTUlESUdldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElHZXRNSURJUG9ydHMsIDEsCi0JIFB5RG9jX1NUUigiKFFUTUlESUNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHMsIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzKSIpfSwKLQl7IlFUTUlESVVzZVNlbmRQb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUTUlESVVzZVNlbmRQb3J0LCAxLAotCSBQeURvY19TVFIoIihRVE1JRElDb21wb25lbnQgY2ksIGxvbmcgcG9ydEluZGV4LCBsb25nIGluVXNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJRVE1JRElTZW5kTUlESSIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElTZW5kTUlESSwgMSwKLQkgUHlEb2NfU1RSKCIoUVRNSURJQ29tcG9uZW50IGNpLCBsb25nIHBvcnRJbmRleCwgTXVzaWNNSURJUGFja2V0IG1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWRpQ2hhbm5lbCwgbG9uZyBwb2x5cGhvbnkpIil9LAotCXsiTXVzaWNTZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBtaWRpQ2hhbm5lbCwgbG9uZyBwb2x5cGhvbnkpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlciwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBpbnN0cnVtZW50TnVtYmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXIsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU3RvcmVQYXJ0SW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1N0b3JlUGFydEluc3RydW1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQXRvbWljSW5zdHJ1bWVudCBhaSkiKX0sCi0JeyJNdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEF0b21pY0luc3RydW1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIEF0b21pY0luc3RydW1lbnRQdHIgYWlQLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydEtub2IsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcga25vYklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEtub2IsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcga25vYklELCBsb25nIGtub2JWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0S25vYiwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYklEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldEtub2IiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRLbm9iLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iSUQsIGxvbmcga25vYlZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dldFBhcnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydE5hbWUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIFN0cmluZ1B0ciBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1BsYXlOb3RlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljUGxheU5vdGUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgcGl0Y2gsIGxvbmcgdmVsb2NpdHkpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljUmVzZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljUmVzZXRQYXJ0LCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldFBhcnRDb250cm9sbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydENvbnRyb2xsZXIsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIE11c2ljQ29udHJvbGxlciBjb250cm9sbGVyTnVtYmVyLCBsb25nIGNvbnRyb2xsZXJWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRQYXJ0Q29udHJvbGxlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRDb250cm9sbGVyLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbnN0cnVtZW50TmFtZXMsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG1vZGlmaWFibGVJbnN0cnVtZW50cykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBpbnN0cnVtZW50TmFtZXMsIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlMYXN0cywgSGFuZGxlIGluc3RydW1lbnRDYXRlZ29yeU5hbWVzKSIpfSwKLQl7Ik11c2ljR2V0RHJ1bU5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0RHJ1bU5hbWVzLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RpZmlhYmxlSW5zdHJ1bWVudHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaW5zdHJ1bWVudE51bWJlcnMsIEhhbmRsZSBpbnN0cnVtZW50TmFtZXMpIil9LAotCXsiTXVzaWNHZXRNYXN0ZXJUdW5lIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0TWFzdGVyVHVuZSwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljU2V0TWFzdGVyVHVuZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldE1hc3RlclR1bmUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIG1hc3RlclR1bmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0RGV2aWNlQ29ubmVjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldERldmljZUNvbm5lY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpZDEsIGxvbmcgaWQyKSIpfSwKLQl7Ik11c2ljVXNlRGV2aWNlQ29ubmVjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1VzZURldmljZUNvbm5lY3Rpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGlkMSwgbG9uZyBpZDIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0S25vYlNldHRpbmdTdHJpbmdzLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iSW5kZXgsIGxvbmcgaXNHbG9iYWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgc2V0dGluZ3NOYW1lcywgSGFuZGxlIHNldHRpbmdzQ2F0ZWdvcnlMYXN0cywgSGFuZGxlIHNldHRpbmdzQ2F0ZWdvcnlOYW1lcykiKX0sCi0JeyJNdXNpY0dldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldE1JRElQb3J0cywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlucHV0UG9ydENvdW50LCBsb25nIG91dHB1dFBvcnRDb3VudCkiKX0sCi0JeyJNdXNpY1NlbmRNSURJIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2VuZE1JREksIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBvcnRJbmRleCwgTXVzaWNNSURJUGFja2V0IG1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY1NldE9mZmxpbmVUaW1lVG8iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRPZmZsaW5lVGltZVRvLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBuZXdUaW1lU3RhbXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljR2V0SW5mb1RleHQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbmZvVGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgc2VsZWN0b3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGV4dEgsIEhhbmRsZSBzdHlsZUgpIil9LAotCXsiTXVzaWNHZXRJbnN0cnVtZW50SW5mbyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEluc3RydW1lbnRJbmZvLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBnZXRJbnN0cnVtZW50SW5mb0ZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW5zdHJ1bWVudEluZm9MaXN0SGFuZGxlIGluZm9MaXN0SCkiKX0sCi0JeyJNdXNpY1Rhc2siLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNUYXNrLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlckludGVycnVwdFNhZmUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb24sIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIEhhbmRsZSBkYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0dlbmVyaWNDb25maWd1cmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZW5lcmljQ29uZmlndXJlLCAxLAotCSBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RlLCBsb25nIGZsYWdzLCBsb25nIGJhc2VSZXNJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNHZW5lcmljR2V0S25vYkxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZW5lcmljR2V0S25vYkxpc3QsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgR2VuZXJpY0tub2JEZXNjcmlwdGlvbkxpc3RIYW5kbGUgZ2tkbEgpIil9LAotCXsiTXVzaWNHZW5lcmljU2V0UmVzb3VyY2VOdW1iZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycywgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIEhhbmRsZSByZXNvdXJjZUlESCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiTXVzaWNEZXJpdmVkTUlESVNlbmQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkTUlESVNlbmQsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBNdXNpY01JRElQYWNrZXQgcGFja2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik11c2ljRGVyaXZlZENsb3NlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBzaG9ydCByZXNSZWZOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7Ik5BVW5yZWdpc3Rlck11c2ljRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X05BVW5yZWdpc3Rlck11c2ljRGV2aWNlLCAxLAotCSBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uLCAxLAotCSBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJOQUdldE1JRElQb3J0cyIsIChQeUNGdW5jdGlvbilRdF9OQUdldE1JRElQb3J0cywgMSwKLQkgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUTUlESVBvcnRMaXN0SGFuZGxlIGlucHV0UG9ydHMsIFFUTUlESVBvcnRMaXN0SGFuZGxlIG91dHB1dFBvcnRzKSIpfSwKLQl7Ik5BVGFzayIsIChQeUNGdW5jdGlvbilRdF9OQVRhc2ssIDEsCi0JIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRIZWFkZXIiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEhlYWRlciwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgdW5zaWduZWQgbG9uZyAqIGhlYWRlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRUaW1lQmFzZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVCYXNlIHRiKSIpfSwKLQl7IlR1bmVTZXRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFRpbWVTY2FsZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgVGltZVNjYWxlIHNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lR2V0VGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRUaW1lU2NhbGUsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAotCXsiVHVuZUluc3RhbnQiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUluc3RhbnQsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgdHVuZVBvc2l0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0dW5lKSIpfSwKLQl7IlR1bmVTdG9wIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTdG9wLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIHN0b3BGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFZvbHVtZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBGaXhlZCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVHZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldFZvbHVtZSwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVByZXJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVByZXJvbGwsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVVbnJvbGwiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVVucm9sbCwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFBhcnRUcmFuc3Bvc2UiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFBhcnRUcmFuc3Bvc2UsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydCwgbG9uZyB0cmFuc3Bvc2UsIGxvbmcgdmVsb2NpdHlTaGlmdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldE5vdGVBbGxvY2F0b3IiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldE5vdGVBbGxvY2F0b3IsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChOb3RlQWxsb2NhdG9yIF9ydikiKX0sCi0JeyJUdW5lU2V0U29mdGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRTb2Z0ZXIsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIGxvbmcgc29mdGVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCi0JeyJUdW5lVGFzayIsIChQeUNGdW5jdGlvbilRdF9UdW5lVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEJhbGFuY2UsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIGxvbmcgYmFsYW5jZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFNvdW5kTG9jYWxpemF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRTb3VuZExvY2FsaXphdGlvbiwgMSwKLQkgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgSGFuZGxlIGRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKLQl7IlR1bmVTZXRIZWFkZXJXaXRoU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0SGVhZGVyV2l0aFNpemUsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZVNldFBhcnRNaXgiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFBhcnRNaXgsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlciwgbG9uZyB2b2x1bWUsIGxvbmcgYmFsYW5jZSwgbG9uZyBtaXhGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAotCXsiVHVuZUdldFBhcnRNaXgiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZUdldFBhcnRNaXgsIDEsCi0JIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgcGFydE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgdm9sdW1lT3V0LCBsb25nIGJhbGFuY2VPdXQsIGxvbmcgbWl4RmxhZ3NPdXQpIil9LAotCXsiQWxpZ25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pUXRfQWxpZ25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciB3cCwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKLQl7IkRyYWdBbGlnbmVkV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0RyYWdBbGlnbmVkV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQdHIgd3AsIFBvaW50IHN0YXJ0UHQsIFJlY3QgYm91bmRzUmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmllc1Rhc2siLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVzVGFzaywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBtYXhNaWxsaVNlY1RvVXNlKSAtPiBOb25lIil9LAorICAgIHsiRW50ZXJNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRW50ZXJNb3ZpZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkV4aXRNb3ZpZXMiLCAoUHlDRnVuY3Rpb24pUXRfRXhpdE1vdmllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVzRXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVzRXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkNsZWFyTW92aWVzU3RpY2t5RXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfQ2xlYXJNb3ZpZXNTdGlja3lFcnJvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TW92aWVzU3RpY2t5RXJyb3IiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TW92aWVzU3RpY2t5RXJyb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlFUR2V0V2FsbENsb2NrVGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRXYWxsQ2xvY2tUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVGltZUJhc2Ugd2FsbENsb2NrVGltZUJhc2UpIil9LAorICAgIHsiUVRJZGxlTWFuYWdlck9wZW4iLCAoUHlDRnVuY3Rpb24pUXRfUVRJZGxlTWFuYWdlck9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKElkbGVNYW5hZ2VyIF9ydikiKX0sCisgICAgeyJDcmVhdGVNb3ZpZUNvbnRyb2wiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVDb250cm9sLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgdGhlV2luZG93LCBNb3ZpZSB0aGVNb3ZpZSwgVUludDMyIG9wdGlvbnMpIC0+IChSZWN0IGxvY2FsUmVjdCwgQ29udHJvbEhhbmRsZSByZXR1cm5lZENvbnRyb2wpIil9LAorICAgIHsiRGlzcG9zZU1hdHRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Rpc3Bvc2VNYXR0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHRoZU1hdHRlKSAtPiBOb25lIil9LAorICAgIHsiTmV3TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZmxhZ3MpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiUVRHZXRUaW1lVW50aWxOZXh0VGFzayIsIChQeUNGdW5jdGlvbilRdF9RVEdldFRpbWVVbnRpbE5leHRUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIHNjYWxlKSAtPiAobG9uZyBkdXJhdGlvbikiKX0sCisgICAgeyJHZXREYXRhSGFuZGxlciIsIChQeUNGdW5jdGlvbilRdF9HZXREYXRhSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhSGFuZGxlclN1YlR5cGUsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnQgX3J2KSIpfSwKKyAgICB7IlBhc3RlSGFuZGxlSW50b01vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X1Bhc3RlSGFuZGxlSW50b01vdmllLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCwgT1NUeXBlIGhhbmRsZVR5cGUsIE1vdmllIHRoZU1vdmllLCBsb25nIGZsYWdzLCBDb21wb25lbnRJbnN0YW5jZSB1c2VyQ29tcCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldE1vdmllSW1wb3J0ZXJGb3JEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBkYXRhUmVmLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50IGltcG9ydGVyKSIpfSwKKyAgICB7IlFUR2V0TUlNRVR5cGVJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0TUlNRVR5cGVJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihjaGFyKiBtaW1lU3RyaW5nU3RhcnQsIHNob3J0IG1pbWVTdHJpbmdMZW5ndGgsIE9TVHlwZSBpbmZvU2VsZWN0b3IsIHZvaWQgKiBpbmZvRGF0YVB0cikgLT4gKGxvbmcgaW5mb0RhdGFTaXplKSIpfSwKKyAgICB7IlRyYWNrVGltZVRvTWVkaWFUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1RyYWNrVGltZVRvTWVkaWFUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lVmFsdWUgdmFsdWUsIFRyYWNrIHRoZVRyYWNrKSAtPiAoVGltZVZhbHVlIF9ydikiKX0sCisgICAgeyJOZXdVc2VyRGF0YSIsIChQeUNGdW5jdGlvbilRdF9OZXdVc2VyRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVXNlckRhdGEgdGhlVXNlckRhdGEpIil9LAorICAgIHsiTmV3VXNlckRhdGFGcm9tSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld1VzZXJEYXRhRnJvbUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgpIC0+IChVc2VyRGF0YSB0aGVVc2VyRGF0YSkiKX0sCisgICAgeyJDcmVhdGVNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncykgLT4gKHNob3J0IHJlc1JlZk51bSwgTW92aWUgbmV3bW92aWUpIil9LAorICAgIHsiT3Blbk1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9PcGVuTW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIFNJbnQ4IHBlcm1pc3Npb24pIC0+IChzaG9ydCByZXNSZWZOdW0pIil9LAorICAgIHsiQ2xvc2VNb3ZpZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvc2VNb3ZpZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IkRlbGV0ZU1vdmllRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EZWxldGVNb3ZpZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyBmaWxlU3BlYykgLT4gTm9uZSIpfSwKKyAgICB7Ik5ld01vdmllRnJvbUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVzUmVmTnVtLCBzaG9ydCByZXNJZCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBzaG9ydCByZXNJZCwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGcm9tSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCwgc2hvcnQgbmV3TW92aWVGbGFncykgLT4gKE1vdmllIHRoZU1vdmllLCBCb29sZWFuIGRhdGFSZWZXYXNDaGFuZ2VkKSIpfSwKKyAgICB7Ik5ld01vdmllRnJvbURhdGFGb3JrIiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFGb3JrLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmUmVmTnVtLCBsb25nIGZpbGVPZmZzZXQsIHNob3J0IG5ld01vdmllRmxhZ3MpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21EYXRhRm9yazY0IiwgKFB5Q0Z1bmN0aW9uKVF0X05ld01vdmllRnJvbURhdGFGb3JrNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZlJlZk51bSwgd2lkZSBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NoYW5nZWQpIil9LAorICAgIHsiTmV3TW92aWVGcm9tRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21EYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBmbGFncywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkdGFSZWZUeXBlKSAtPiAoTW92aWUgbSwgc2hvcnQgaWQpIil9LAorICAgIHsiTmV3TW92aWVGcm9tU3RvcmFnZU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21TdG9yYWdlT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBmaWxlT2Zmc2V0LCBzaG9ydCBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgdGhlTW92aWUsIEJvb2xlYW4gZGF0YVJlZldhc0NhdGFSZWZUeXBlKSIpfSwKKyAgICB7Ik5ld01vdmllRm9yRGF0YVJlZkZyb21IYW5kbGUiLCAoUHlDRnVuY3Rpb24pUXRfTmV3TW92aWVGb3JEYXRhUmVmRnJvbUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGgsIHNob3J0IG5ld01vdmllRmxhZ3MsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUpIC0+IChNb3ZpZSB0aGVNb3ZpZSwgQm9vbGVhbiBkYXRhUmVmV2FzQ2hhbmdlZCkiKX0sCisgICAgeyJSZW1vdmVNb3ZpZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZU1vdmllUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgc2hvcnQgcmVzSWQpIC0+IE5vbmUiKX0sCisgICAgeyJDcmVhdGVNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ3JlYXRlTW92aWVTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBPU1R5cGUgY3JlYXRvciwgU2NyaXB0Q29kZSBzY3JpcHRUYWcsIGxvbmcgY3JlYXRlTW92aWVGaWxlRmxhZ3MpIC0+IChEYXRhSGFuZGxlciBvdXREYXRhSGFuZGxlciwgTW92aWUgbmV3bW92aWUpIil9LAorICAgIHsiT3Blbk1vdmllU3RvcmFnZSIsIChQeUNGdW5jdGlvbilRdF9PcGVuTW92aWVTdG9yYWdlLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGZsYWdzKSAtPiAoRGF0YUhhbmRsZXIgb3V0RGF0YUhhbmRsZXIpIil9LAorICAgIHsiQ2xvc2VNb3ZpZVN0b3JhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvc2VNb3ZpZVN0b3JhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiBOb25lIil9LAorICAgIHsiRGVsZXRlTW92aWVTdG9yYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlbGV0ZU1vdmllU3RvcmFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNyZWF0ZVNob3J0Y3V0TW92aWVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NyZWF0ZVNob3J0Y3V0TW92aWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBjcmVhdG9yLCBTY3JpcHRDb2RlIHNjcmlwdFRhZywgbG9uZyBjcmVhdGVNb3ZpZUZpbGVGbGFncywgSGFuZGxlIHRhcmdldERhdGFSZWYsIE9TVHlwZSB0YXJnZXREYXRhUmVmVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNhblF1aWNrVGltZU9wZW5GaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NhblF1aWNrVGltZU9wZW5GaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgZmlsZVNwZWMsIE9TVHlwZSBmaWxlVHlwZSwgT1NUeXBlIGZpbGVOYW1lRXh0ZW5zaW9uLCBVSW50MzIgaW5GbGFncykgLT4gKEJvb2xlYW4gb3V0Q2FuT3BlbldpdGhHcmFwaGljc0ltcG9ydGVyLCBCb29sZWFuIG91dENhbk9wZW5Bc01vdmllLCBCb29sZWFuIG91dFByZWZlckdyYXBoaWNzSW1wb3J0ZXIpIil9LAorICAgIHsiQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfQ2FuUXVpY2tUaW1lT3BlbkRhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIFVJbnQzMiBpbkZsYWdzKSAtPiAoQm9vbGVhbiBvdXRDYW5PcGVuV2l0aEdyYXBoaWNzSW1wb3J0ZXIsIEJvb2xlYW4gb3V0Q2FuT3BlbkFzTW92aWUsIEJvb2xlYW4gb3V0UHJlZmVyR3JhcGhpY3NJbXBvcnRlcikiKX0sCisgICAgeyJOZXdNb3ZpZUZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilRdF9OZXdNb3ZpZUZyb21TY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBuZXdNb3ZpZUZsYWdzKSAtPiAoTW92aWUgX3J2KSIpfSwKKyAgICB7IlFUTmV3QWxpYXMiLCAoUHlDRnVuY3Rpb24pUXRfUVROZXdBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIGZzcywgQm9vbGVhbiBtaW5pbWFsKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAorICAgIHsiRW5kRnVsbFNjcmVlbiIsIChQeUNGdW5jdGlvbilRdF9FbmRGdWxsU2NyZWVuLCAxLAorICAgICBQeURvY19TVFIoIihQdHIgZnVsbFN0YXRlLCBsb25nIGZsYWdzKSAtPiBOb25lIil9LAorICAgIHsiQWRkU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9BZGRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBleHRlbnNpb24sIE9TVHlwZSBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldFNvdW5kRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNvdW5kRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIGlkVHlwZSkgLT4gKEhhbmRsZSBleHRlbnNpb24pIil9LAorICAgIHsiUmVtb3ZlU291bmREZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9SZW1vdmVTb3VuZERlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihTb3VuZERlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIE9TVHlwZSBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJRVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCIsIChQeUNGdW5jdGlvbilRdF9RVElzU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZykgLT4gKEV2ZW50UmVjb3JkIHBFdmVudCkiKX0sCisgICAgeyJRVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZyIsIChQeUNGdW5jdGlvbilRdF9RVERpc21pc3NTdGFuZGFyZFBhcmFtZXRlckRpYWxvZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRQYXJhbWV0ZXJEaWFsb2cgY3JlYXRlZERpYWxvZykgLT4gTm9uZSIpfSwKKyAgICB7IlFUU3RhbmRhcmRQYXJhbWV0ZXJEaWFsb2dEb0FjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9RVFN0YW5kYXJkUGFyYW1ldGVyRGlhbG9nRG9BY3Rpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFFUUGFyYW1ldGVyRGlhbG9nIGNyZWF0ZWREaWFsb2csIGxvbmcgYWN0aW9uLCB2b2lkICogcGFyYW1zKSAtPiBOb25lIil9LAorICAgIHsiUVRSZWdpc3RlckFjY2Vzc0tleSIsIChQeUNGdW5jdGlvbilRdF9RVFJlZ2lzdGVyQWNjZXNzS2V5LCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgYWNjZXNzS2V5VHlwZSwgbG9uZyBmbGFncywgSGFuZGxlIGFjY2Vzc0tleSkgLT4gTm9uZSIpfSwKKyAgICB7IlFUVW5yZWdpc3RlckFjY2Vzc0tleSIsIChQeUNGdW5jdGlvbilRdF9RVFVucmVnaXN0ZXJBY2Nlc3NLZXksIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBhY2Nlc3NLZXlUeXBlLCBsb25nIGZsYWdzLCBIYW5kbGUgYWNjZXNzS2V5KSAtPiBOb25lIil9LAorICAgIHsiUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRTdXBwb3J0ZWRSZXN0cmljdGlvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBpblJlc3RyaWN0aW9uQ2xhc3MpIC0+IChVSW50MzIgb3V0UmVzdHJpY3Rpb25JRHMpIil9LAorICAgIHsiUVRUZXh0VG9OYXRpdmVUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVGV4dFRvTmF0aXZlVGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIHRoZVRleHQsIGxvbmcgZW5jb2RpbmcsIGxvbmcgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJWaWRlb01lZGlhUmVzZXRTdGF0aXN0aWNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZpZGVvTWVkaWFSZXNldFN0YXRpc3RpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldFN0YXRpc3RpY3MsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVmlkZW9NZWRpYUdldFN0YWxsQ291bnQiLCAoUHlDRnVuY3Rpb24pUXRfVmlkZW9NZWRpYUdldFN0YWxsQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3RhbGxzKSIpfSwKKyAgICB7IlZpZGVvTWVkaWFTZXRDb2RlY1BhcmFtZXRlciIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29kZWNUeXBlIGNUeXBlLCBPU1R5cGUgcGFyYW1ldGVySUQsIGxvbmcgcGFyYW1ldGVyQ2hhbmdlU2VlZCwgdm9pZCAqIGRhdGFQdHIsIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZpZGVvTWVkaWFHZXRDb2RlY1BhcmFtZXRlciIsIChQeUNGdW5jdGlvbilRdF9WaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ29kZWNUeXBlIGNUeXBlLCBPU1R5cGUgcGFyYW1ldGVySUQsIEhhbmRsZSBvdXRQYXJhbWV0ZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFBZGRUZXh0U2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZFRleHRTYW1wbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUHRyIHRleHQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgc2hvcnQgZm9udE51bWJlciwgc2hvcnQgZm9udFNpemUsIFN0eWxlIHRleHRGYWNlLCBzaG9ydCB0ZXh0SnVzdGlmaWNhdGlvbiwgbG9uZyBkaXNwbGF5RmxhZ3MsIFRpbWVWYWx1ZSBzY3JvbGxEZWxheSwgc2hvcnQgaGlsaXRlU3RhcnQsIHNob3J0IGhpbGl0ZUVuZCwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGV4dENvbG9yLCBSR0JDb2xvciBiYWNrQ29sb3IsIFJlY3QgdGV4dEJveCwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lKSIpfSwKKyAgICB7IlRleHRNZWRpYUFkZFRFU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZFRFU2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRFSGFuZGxlIGhURSwgc2hvcnQgdGV4dEp1c3RpZmljYXRpb24sIGxvbmcgZGlzcGxheUZsYWdzLCBUaW1lVmFsdWUgc2Nyb2xsRGVsYXksIHNob3J0IGhpbGl0ZVN0YXJ0LCBzaG9ydCBoaWxpdGVFbmQsIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIGJhY2tDb2xvciwgUmVjdCB0ZXh0Qm94LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAorICAgIHsiVGV4dE1lZGlhQWRkSGlsaXRlU2FtcGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kLCBUaW1lVmFsdWUgZHVyYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciByZ2JIaWxpdGVDb2xvciwgVGltZVZhbHVlIHNhbXBsZVRpbWUpIil9LAorICAgIHsiVGV4dE1lZGlhRHJhd1JhdyIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFEcmF3UmF3LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEdXb3JsZFB0ciBndywgR0RIYW5kbGUgZ2QsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplLCBUZXh0RGVzY3JpcHRpb25IYW5kbGUgdGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhU2V0VGV4dFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFSYXdTZXR1cCIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFSYXdTZXR1cCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBHV29ybGRQdHIgZ3csIEdESGFuZGxlIGdkLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSwgVGV4dERlc2NyaXB0aW9uSGFuZGxlIHRkaCwgVGltZVZhbHVlIHNhbXBsZUR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0TWVkaWFSYXdJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYVJhd0lkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgR1dvcmxkUHRyIGd3LCBHREhhbmRsZSBnZCwgVGltZVZhbHVlIHNhbXBsZVRpbWUsIGxvbmcgZmxhZ3NJbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3NPdXQpIil9LAorICAgIHsiVGV4dE1lZGlhR2V0VGV4dFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUdldFRleHRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYXRNZWRpYVRpbWUsIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogZGF0YSwgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVGV4dE1lZGlhRmluZE5leHRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X1RleHRNZWRpYUZpbmROZXh0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGV4dCwgbG9uZyBzaXplLCBzaG9ydCBmaW5kRmxhZ3MsIFRpbWVWYWx1ZSBzdGFydFRpbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgZm91bmRUaW1lLCBUaW1lVmFsdWUgZm91bmREdXJhdGlvbiwgbG9uZyBvZmZzZXQpIil9LAorICAgIHsiVGV4dE1lZGlhSGlsaXRlVGV4dFNhbXBsZSIsIChQeUNGdW5jdGlvbilRdF9UZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBzYW1wbGVUaW1lLCBzaG9ydCBoaWxpdGVTdGFydCwgc2hvcnQgaGlsaXRlRW5kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgcmdiSGlsaXRlQ29sb3IpIil9LAorICAgIHsiVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGRhdGEsIE9TVHlwZSBkYXRhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IHNwcml0ZUluZGV4LCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0UHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBzcHJpdGVJbmRleCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUhpdFRlc3RTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgc3ByaXRlSGl0SW5kZXgpIil9LAorICAgIHsiU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFDb3VudFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IG51bVNwcml0ZXMpIil9LAorICAgIHsiU3ByaXRlTWVkaWFDb3VudEltYWdlcyIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUNvdW50SW1hZ2VzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBudW1JbWFnZXMpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRJbmRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0SW5kSW1hZ2VEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGltYWdlRGVzY3JpcHRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhR2V0RGlzcGxheWVkU2FtcGxlTnVtYmVyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNhbXBsZU51bSkiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldFNwcml0ZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBTdHIyNTUgc3ByaXRlTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRJbWFnZU5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCwgU3RyMjU1IGltYWdlTmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNldFNwcml0ZVByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlELCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHkiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRTcHJpdGVQcm9wZXJ0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBwcm9wZXJ0eVR5cGUsIHZvaWQgKiBwcm9wZXJ0eVZhbHVlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdEFsbFNwcml0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRBdG9tSUQgc3ByaXRlSGl0SUQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSGl0VGVzdE9uZVNwcml0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCwgbG9uZyBmbGFncywgUG9pbnQgbG9jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB3YXNIaXQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgc3ByaXRlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVEF0b21JRCBzcHJpdGVJRCkiKX0sCisgICAgeyJTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCBzcHJpdGVJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNwcml0ZUluZGV4KSIpfSwKKyAgICB7IlNwcml0ZU1lZGlhU2V0QWN0aW9uVmFyaWFibGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBRVEF0b21JRCB2YXJpYWJsZUlELCBmbG9hdCB2YWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBmbG9hdCB2YWx1ZSkiKX0sCisgICAgeyJTcHJpdGVNZWRpYURpc3Bvc2VTcHJpdGUiLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHNwcml0ZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlVG9TdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQsIFB0ciB0aGVDU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUdldEFjdGlvblZhcmlhYmxlQXNTdHJpbmciLCAoUHlDRnVuY3Rpb24pUXRfU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIHZhcmlhYmxlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgdGhlQ1N0cmluZykiKX0sCisgICAgeyJTcHJpdGVNZWRpYU5ld0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhTmV3SW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgUVRBdG9tSUQgZGVzaXJlZElEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYURpc3Bvc2VJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBpbWFnZUluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTcHJpdGVNZWRpYUltYWdlSW5kZXhUb0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1Nwcml0ZU1lZGlhSW1hZ2VJbmRleFRvSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgc2hvcnQgaW1hZ2VJbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFFUQXRvbUlEIGltYWdlSUQpIil9LAorICAgIHsiU3ByaXRlTWVkaWFJbWFnZUlEVG9JbmRleCIsIChQeUNGdW5jdGlvbilRdF9TcHJpdGVNZWRpYUltYWdlSURUb0luZGV4LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFUQXRvbUlEIGltYWdlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpbWFnZUluZGV4KSIpfSwKKyAgICB7IkZsYXNoTWVkaWFTZXRQYW4iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYVNldFBhbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCB4UGVyY2VudCwgc2hvcnQgeVBlcmNlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkZsYXNoTWVkaWFTZXRab29tIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRab29tLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGZhY3RvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRmxhc2hNZWRpYVNldFpvb21SZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFTZXRab29tUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGxlZnQsIGxvbmcgdG9wLCBsb25nIHJpZ2h0LCBsb25nIGJvdHRvbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRmxhc2hNZWRpYUdldFJlZkNvbkJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBsZWZ0LCBsb25nIHRvcCwgbG9uZyByaWdodCwgbG9uZyBib3R0b20pIil9LAorICAgIHsiRmxhc2hNZWRpYUdldFJlZkNvbklEIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRSZWZDb25JRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uSUQpIil9LAorICAgIHsiRmxhc2hNZWRpYUlEVG9SZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUlEVG9SZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb25JRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgcmVmQ29uKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFHZXREaXNwbGF5ZWRGcmFtZU51bWJlciIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhc2hGcmFtZU51bWJlcikiKX0sCisgICAgeyJGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYXNoRnJhbWVOdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbW92aWVUaW1lKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfRmxhc2hNZWRpYUZyYW1lTGFiZWxUb01vdmllVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBQdHIgdGhlTGFiZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbW92aWVUaW1lKSIpfSwKKyAgICB7IkZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0ZsYXNoTWVkaWFHZXRGbGFzaFZhcmlhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIHBhdGgsIGNoYXIgbmFtZSwgSGFuZGxlIHRoZVZhcmlhYmxlQ1N0cmluZ091dCkiKX0sCisgICAgeyJGbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhU2V0Rmxhc2hWYXJpYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIHVwZGF0ZUZvY3VzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBwYXRoLCBjaGFyIG5hbWUsIGNoYXIgdmFsdWUpIil9LAorICAgIHsiRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9ucyIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhRG9CdXR0b25BY3Rpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgYnV0dG9uSUQsIGxvbmcgdHJhbnNpdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGNoYXIgcGF0aCkiKX0sCisgICAgeyJGbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbiIsIChQeUNGdW5jdGlvbilRdF9GbGFzaE1lZGlhR2V0U3VwcG9ydGVkU3dmVmVyc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggc3dmVmVyc2lvbikiKX0sCisgICAgeyJNZWRpYTNER2V0Q3VycmVudEdyb3VwIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDdXJyZW50R3JvdXAsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGdyb3VwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEVHJhbnNsYXRlTmFtZWRPYmplY3RUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4LCBGaXhlZCB5LCBGaXhlZCB6KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKKyAgICB7Ik1lZGlhM0RTY2FsZU5hbWVkT2JqZWN0VG8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNjYWxlTmFtZWRPYmplY3RUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB4U2NhbGUsIEZpeGVkIHlTY2FsZSwgRml4ZWQgelNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBvYmplY3ROYW1lKSIpfSwKKyAgICB7Ik1lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RSb3RhdGVOYW1lZE9iamVjdFRvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHhEZWdyZWVzLCBGaXhlZCB5RGVncmVlcywgRml4ZWQgekRlZ3JlZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIG9iamVjdE5hbWUpIil9LAorICAgIHsiTWVkaWEzRFNldENhbWVyYURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIGNhbWVyYURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhM0RHZXRDYW1lcmFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiBjYW1lcmFEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNEU2V0Q2FtZXJhQW5nbGVBc3BlY3QiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFFURmxvYXRTaW5nbGUgZm92LCBRVEZsb2F0U2luZ2xlIGFzcGVjdFJhdGlvWFRvWSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhM0RHZXRDYW1lcmFBbmdsZUFzcGVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUVRGbG9hdFNpbmdsZSBmb3YsIFFURmxvYXRTaW5nbGUgYXNwZWN0UmF0aW9YVG9ZKSIpfSwKKyAgICB7Ik1lZGlhM0RTZXRDYW1lcmFSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYTNEU2V0Q2FtZXJhUmFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgdm9pZCAqIHRRM0NhbWVyYVJhbmdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYTNER2V0Q2FtZXJhUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWEzREdldENhbWVyYVJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHZvaWQgKiB0UTNDYW1lcmFSYW5nZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTmV3VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfTmV3VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFRpbWVCYXNlIF9ydikiKX0sCisgICAgeyJDb252ZXJ0VGltZSIsIChQeUNGdW5jdGlvbilRdF9Db252ZXJ0VGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0aGVUaW1lLCBUaW1lQmFzZSBuZXdCYXNlKSAtPiAoVGltZVJlY29yZCB0aGVUaW1lKSIpfSwKKyAgICB7IkNvbnZlcnRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydFRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGltZVJlY29yZCB0aGVUaW1lLCBUaW1lU2NhbGUgbmV3U2NhbGUpIC0+IChUaW1lUmVjb3JkIHRoZVRpbWUpIil9LAorICAgIHsiQWRkVGltZSIsIChQeUNGdW5jdGlvbilRdF9BZGRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIGRzdCwgVGltZVJlY29yZCBzcmMpIC0+IChUaW1lUmVjb3JkIGRzdCkiKX0sCisgICAgeyJTdWJ0cmFjdFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU3VidHJhY3RUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihUaW1lUmVjb3JkIGRzdCwgVGltZVJlY29yZCBzcmMpIC0+IChUaW1lUmVjb3JkIGRzdCkiKX0sCisgICAgeyJNdXNpY01lZGlhR2V0SW5kZXhlZFR1bmVQbGF5ZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNNZWRpYUdldEluZGV4ZWRUdW5lUGxheWVyLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSB0aSwgbG9uZyBzYW1wbGVEZXNjSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnRJbnN0YW5jZSB0cCkiKX0sCisgICAgeyJDb2RlY01hbmFnZXJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvZGVjTWFuYWdlclZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgdmVyc2lvbikiKX0sCisgICAgeyJHZXRNYXhDb21wcmVzc2lvblNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0TWF4Q29tcHJlc3Npb25TaXplLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIHNob3J0IGNvbG9yRGVwdGgsIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUsIENvbXByZXNzb3JDb21wb25lbnQgY29kZWMpIC0+IChsb25nIHNpemUpIil9LAorICAgIHsiR2V0Q29tcHJlc3Npb25UaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldENvbXByZXNzaW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBzaG9ydCBjb2xvckRlcHRoLCBDb2RlY1R5cGUgY1R5cGUsIENvbXByZXNzb3JDb21wb25lbnQgY29kZWMpIC0+IChDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lKSIpfSwKKyAgICB7IkNvbXByZXNzSW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0LCBDb2RlY1EgcXVhbGl0eSwgQ29kZWNUeXBlIGNUeXBlLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIFB0ciBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiRGVjb21wcmVzc0ltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RlY29tcHJlc3NJbWFnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUHRyIGRhdGEsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUGl4TWFwSGFuZGxlIGRzdCwgUmVjdCBzcmNSZWN0LCBSZWN0IGRzdFJlY3QsIHNob3J0IG1vZGUsIFJnbkhhbmRsZSBtYXNrKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2ltaWxhcml0eSIsIChQeUNGdW5jdGlvbilRdF9HZXRTaW1pbGFyaXR5LCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgUHRyIGRhdGEpIC0+IChGaXhlZCBzaW1pbGFyaXR5KSIpfSwKKyAgICB7IkdldEltYWdlRGVzY3JpcHRpb25DVGFibGUiLCAoUHlDRnVuY3Rpb24pUXRfR2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ1RhYkhhbmRsZSBjdGFibGUpIil9LAorICAgIHsiU2V0SW1hZ2VEZXNjcmlwdGlvbkNUYWJsZSIsIChQeUNGdW5jdGlvbilRdF9TZXRJbWFnZURlc2NyaXB0aW9uQ1RhYmxlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIENUYWJIYW5kbGUgY3RhYmxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HZXRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIGxvbmcgaWRUeXBlLCBsb25nIGluZGV4KSAtPiAoSGFuZGxlIGV4dGVuc2lvbikiKX0sCisgICAgeyJBZGRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0FkZEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgSGFuZGxlIGV4dGVuc2lvbiwgbG9uZyBpZFR5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1JlbW92ZUltYWdlRGVzY3JpcHRpb25FeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUsIGxvbmcgaW5kZXgpIC0+IE5vbmUiKX0sCisgICAgeyJDb3VudEltYWdlRGVzY3JpcHRpb25FeHRlbnNpb25UeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvdW50SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgbG9uZyBpZFR5cGUpIC0+IChsb25nIGNvdW50KSIpfSwKKyAgICB7IkdldE5leHRJbWFnZURlc2NyaXB0aW9uRXh0ZW5zaW9uVHlwZSIsIChQeUNGdW5jdGlvbilRdF9HZXROZXh0SW1hZ2VEZXNjcmlwdGlvbkV4dGVuc2lvblR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKGxvbmcgaWRUeXBlKSIpfSwKKyAgICB7IkZpbmRDb2RlYyIsIChQeUNGdW5jdGlvbilRdF9GaW5kQ29kZWMsIDEsCisgICAgIFB5RG9jX1NUUigiKENvZGVjVHlwZSBjVHlwZSwgQ29kZWNDb21wb25lbnQgc3BlY0NvZGVjKSAtPiAoQ29tcHJlc3NvckNvbXBvbmVudCBjb21wcmVzc29yLCBEZWNvbXByZXNzb3JDb21wb25lbnQgZGVjb21wcmVzc29yKSIpfSwKKyAgICB7IkNvbXByZXNzUGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9Db21wcmVzc1BpY3R1cmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBzcmNQaWN0dXJlLCBQaWNIYW5kbGUgZHN0UGljdHVyZSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXByZXNzUGljdHVyZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcHJlc3NQaWN0dXJlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc3JjUmVmTnVtLCBzaG9ydCBkc3RSZWZOdW0sIENvZGVjUSBxdWFsaXR5LCBDb2RlY1R5cGUgY1R5cGUpIC0+IE5vbmUiKX0sCisgICAgeyJDb252ZXJ0SW1hZ2UiLCAoUHlDRnVuY3Rpb24pUXRfQ29udmVydEltYWdlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0RELCBQdHIgc3JjRGF0YSwgc2hvcnQgY29sb3JEZXB0aCwgQ1RhYkhhbmRsZSBjdGFibGUsIENvZGVjUSBhY2N1cmFjeSwgQ29kZWNRIHF1YWxpdHksIENvZGVjVHlwZSBjVHlwZSwgQ29kZWNDb21wb25lbnQgY29kZWMsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZHN0REQsIFB0ciBkc3REYXRhKSAtPiBOb25lIil9LAorICAgIHsiQWRkRmlsZVByZXZpZXciLCAoUHlDRnVuY3Rpb24pUXRfQWRkRmlsZVByZXZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHJlc1JlZk51bSwgT1NUeXBlIHByZXZpZXdUeXBlLCBIYW5kbGUgcHJldmlld0RhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRCZXN0RGV2aWNlUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HZXRCZXN0RGV2aWNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoR0RIYW5kbGUgZ2RoLCBSZWN0IHJwKSIpfSwKKyAgICB7IkdESGFzU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RIYXNTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBzaG9ydCBkZXB0aCkgLT4gKEZpeGVkIHNjYWxlKSIpfSwKKyAgICB7IkdER2V0U2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RHZXRTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoKSAtPiAoRml4ZWQgc2NhbGUsIHNob3J0IGZsYWdzKSIpfSwKKyAgICB7IkdEU2V0U2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfR0RTZXRTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR0RIYW5kbGUgZ2RoLCBGaXhlZCBzY2FsZSwgc2hvcnQgZmxhZ3MpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRJbnN0YW5jZSBnaSkiKX0sCisgICAgeyJHZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9HZXRHcmFwaGljc0ltcG9ydGVyRm9yRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKKyAgICB7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JGaWxlV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgdGhlRmlsZSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudEluc3RhbmNlIGdpKSIpfSwKKyAgICB7IkdldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dldEdyYXBoaWNzSW1wb3J0ZXJGb3JEYXRhUmVmV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgZ2kpIil9LAorICAgIHsiTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfTWFrZUltYWdlRGVzY3JpcHRpb25Gb3JQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwaXhtYXApIC0+IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaCkiKX0sCisgICAgeyJNYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCIsIChQeUNGdW5jdGlvbilRdF9NYWtlSW1hZ2VEZXNjcmlwdGlvbkZvckVmZmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGVmZmVjdFR5cGUpIC0+IChJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGlkaCkiKX0sCisgICAgeyJRVEdldFBpeGVsU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9RVEdldFBpeGVsU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIFBpeGVsRm9ybWF0KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlFUR2V0UGl4ZWxGb3JtYXREZXB0aEZvckltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhlbEZvcm1hdERlcHRoRm9ySW1hZ2VEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIFBpeGVsRm9ybWF0KSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlFUR2V0UGl4TWFwSGFuZGxlUm93Qnl0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVSb3dCeXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiUVRTZXRQaXhNYXBIYW5kbGVSb3dCeXRlcyIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZVJvd0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0sIGxvbmcgcm93Qnl0ZXMpIC0+IE5vbmUiKX0sCisgICAgeyJRVEdldFBpeE1hcEhhbmRsZUdhbW1hTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfUVRHZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsLCAxLAorICAgICBQeURvY19TVFIoIihQaXhNYXBIYW5kbGUgcG0pIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiUVRTZXRQaXhNYXBIYW5kbGVHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUU2V0UGl4TWFwSGFuZGxlR2FtbWFMZXZlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtLCBGaXhlZCBnYW1tYUxldmVsKSAtPiBOb25lIil9LAorICAgIHsiUVRHZXRQaXhNYXBIYW5kbGVSZXF1ZXN0ZWRHYW1tYUxldmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUR2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUGl4TWFwSGFuZGxlIHBtKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IlFUU2V0UGl4TWFwSGFuZGxlUmVxdWVzdGVkR2FtbWFMZXZlbCIsIChQeUNGdW5jdGlvbilRdF9RVFNldFBpeE1hcEhhbmRsZVJlcXVlc3RlZEdhbW1hTGV2ZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpeE1hcEhhbmRsZSBwbSwgRml4ZWQgcmVxdWVzdGVkR2FtbWFMZXZlbCkgLT4gTm9uZSIpfSwKKyAgICB7IkNvbXBBZGQiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcEFkZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBzcmMsIHdpZGUgZHN0KSIpfSwKKyAgICB7IkNvbXBTdWIiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFN1YiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBzcmMsIHdpZGUgZHN0KSIpfSwKKyAgICB7IkNvbXBOZWciLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE5lZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAod2lkZSBkc3QpIil9LAorICAgIHsiQ29tcFNoaWZ0IiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBTaGlmdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc2hpZnQpIC0+ICh3aWRlIHNyYykiKX0sCisgICAgeyJDb21wTXVsIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWwsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgc3JjMSwgbG9uZyBzcmMyKSAtPiAod2lkZSBkc3QpIil9LAorICAgIHsiQ29tcERpdiIsIChQeUNGdW5jdGlvbilRdF9Db21wRGl2LCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGRlbm9taW5hdG9yKSAtPiAobG9uZyBfcnYsIHdpZGUgbnVtZXJhdG9yLCBsb25nIHJlbWFpbmRlcikiKX0sCisgICAgeyJDb21wRml4TXVsIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBGaXhNdWwsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGZpeFNyYykgLT4gKHdpZGUgY29tcFNyYywgd2lkZSBjb21wRHN0KSIpfSwKKyAgICB7IkNvbXBNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcE11bERpdiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtdWwsIGxvbmcgZGl2aXNvcikgLT4gKHdpZGUgY28pIil9LAorICAgIHsiQ29tcE11bERpdlRydW5jIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBNdWxEaXZUcnVuYywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBtdWwsIGxvbmcgZGl2aXNvcikgLT4gKHdpZGUgY28sIGxvbmcgcmVtYWluZGVyKSIpfSwKKyAgICB7IkNvbXBDb21wYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0NvbXBDb21wYXJlLCAxLAorICAgICBQeURvY19TVFIoIih3aWRlIGEsIHdpZGUgbWludXNiKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiQ29tcFNxdWFyZVJvb3QiLCAoUHlDRnVuY3Rpb24pUXRfQ29tcFNxdWFyZVJvb3QsIDEsCisgICAgIFB5RG9jX1NUUigiKHdpZGUgc3JjKSAtPiAodW5zaWduZWQgbG9uZyBfcnYpIil9LAorICAgIHsiRml4TXVsRGl2IiwgKFB5Q0Z1bmN0aW9uKVF0X0ZpeE11bERpdiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjLCBGaXhlZCBtdWwsIEZpeGVkIGRpdmlzb3IpIC0+IChGaXhlZCBfcnYpIil9LAorICAgIHsiVW5zaWduZWRGaXhNdWxEaXYiLCAoUHlDRnVuY3Rpb24pUXRfVW5zaWduZWRGaXhNdWxEaXYsIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIHNyYywgRml4ZWQgbXVsLCBGaXhlZCBkaXZpc29yKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeEV4cDIiLCAoUHlDRnVuY3Rpb24pUXRfRml4RXhwMiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeExvZzIiLCAoUHlDRnVuY3Rpb24pUXRfRml4TG9nMiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRml4ZWQgc3JjKSAtPiAoRml4ZWQgX3J2KSIpfSwKKyAgICB7IkZpeFBvdyIsIChQeUNGdW5jdGlvbilRdF9GaXhQb3csIDEsCisgICAgIFB5RG9jX1NUUigiKEZpeGVkIGJhc2UsIEZpeGVkIGV4cCkgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmLCBPU1R5cGUgZGF0YVJlVHlwZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RGF0YUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0RGF0YUhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREYXRhSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRJbWFnZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFJlYWREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0UmVhZERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogZGF0YVB0ciwgdW5zaWduZWQgbG9uZyBkYXRhT2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0Q2xpcCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGNsaXBSZ24pIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIFJlY3Qgc291cmNlUmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRTb3VyY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHNvdXJjZVJlY3QpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXROYXR1cmFsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IG5hdHVyYWxCb3VuZHMpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnREcmF3IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RHJhdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgQ0dyYWZQdHIgcG9ydCwgR0RIYW5kbGUgZ2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENHcmFmUHRyIHBvcnQsIEdESGFuZGxlIGdkKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0Qm91bmRzUmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEJvdW5kc1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0Qm91bmRzUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNhdmVBc1BpY3R1cmUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIGZzcywgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBncmFwaGljc01vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZ3JhcGhpY3NNb2RlLCBSR0JDb2xvciBvcENvbG9yKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldFF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCBDb2RlY1EgcXVhbGl0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRRdWFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb2RlY1EgcXVhbGl0eSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNhdmVBc1F1aWNrVGltZUltYWdlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEFsaWFzZWREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0VmFsaWRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiB2YWxpZCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldE1ldGFEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TWV0YURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB2b2lkICogdXNlckRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVscyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydERvZXNEcmF3QWxsUGl4ZWxzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGRyYXdzQWxsUGl4ZWxzKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwaWN0dXJlKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0RXhwb3J0SW1hZ2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IsIEZTU3BlYyBmc3MsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRJbWFnZVR5cGVMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEV4cG9ydFNldHRpbmdzQXNBdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRFeHBvcnRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBxdEF0b21Db250YWluZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VDb3VudCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbWFnZUNvdW50KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0U2V0SW1hZ2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIGltYWdlSW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0SW1hZ2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXgsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBpbWFnZUluZGV4KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YU9mZnNldEFuZFNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIHdpZGUgc2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydFJlYWREYXRhNjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRSZWFkRGF0YTY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHdpZGUgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGF0YVJlZmVyZW5jZU9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgd2lkZSBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0ltcG9ydEdldERlZmF1bHRDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmduSGFuZGxlIGRlZmF1bHRSZ24pIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlZmF1bHRHcmFwaGljc01vZGUsIFJHQkNvbG9yIGRlZmF1bHRPcENvbG9yKSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdFNvdXJjZVJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRHZXREZWZhdWx0U291cmNlUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGRlZmF1bHRTb3VyY2VSZWN0KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1wb3J0R2V0Q29sb3JTeW5jUHJvZmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldENvbG9yU3luY1Byb2ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHByb2ZpbGUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldERlc3RSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgUmVjdCBkZXN0UmVjdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXREZXN0UmVjdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldERlc3RSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGVzdFJlY3QpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydFNldEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3MpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRHZXRCYXNlRGF0YU9mZnNldEFuZFNpemU2NCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0ltcG9ydEdldEJhc2VEYXRhT2Zmc2V0QW5kU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0ltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgb2Zmc2V0LCB3aWRlIHNpemUpIil9LAorICAgIHsiR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbXBvcnRTZXRJbWFnZUluZGV4VG9UaHVtYm5haWwsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERvRXhwb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9FeHBvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBhY3R1YWxTaXplV3JpdHRlbikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydENhblRyYW5zY29kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhblRyYW5zY29kZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERvVHJhbnNjb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRDYW5Vc2VDb21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5Vc2VDb21wcmVzc29yKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9Vc2VDb21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGNvZGVjU2V0dGluZ3NBdG9tQ29udGFpbmVyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBvdXREZXNjKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0RGVmYXVsdEZpbGVUeXBlQW5kQ3JlYXRvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlZmF1bHRGaWxlTmFtZUV4dGVuc2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgZmlsZU5hbWVFeHRlbnNpb24pIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRNSU1FVHlwZUxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB2b2lkICogcXRBdG9tQ29udGFpbmVyUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNBdG9tQ29udGFpbmVyLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHF0QXRvbUNvbnRhaW5lclB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzVGV4dCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldFNldHRpbmdzQXNUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0aGVUZXh0KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0RG9udFJlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXREb250UmVjb21wcmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZG9udFJlY29tcHJlc3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0RG9udFJlY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGRvbnRSZWNvbXByZXNzKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnRlcmxhY2VTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgaW50ZXJsYWNlU3R5bGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW50ZXJsYWNlU3R5bGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnRlcmxhY2VTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGludGVybGFjZVN0eWxlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0TWV0YURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiB1c2VyRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRNZXRhRGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE1ldGFEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIHVzZXJEYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0VGFyZ2V0RGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIHRhcmdldERhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldFRhcmdldERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0VGFyZ2V0RGF0YVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0YXJnZXREYXRhU2l6ZSkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uTWV0aG9kIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIGNvbXByZXNzaW9uTWV0aG9kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0Q29tcHJlc3Npb25NZXRob2QsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBjb21wcmVzc2lvbk1ldGhvZCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldENvbXByZXNzaW9uUXVhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIENvZGVjUSBzcGF0aWFsUXVhbGl0eSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHkiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb21wcmVzc2lvblF1YWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvbiIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldFJlc29sdXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGaXhlZCBob3Jpem9udGFsUmVzb2x1dGlvbiwgRml4ZWQgdmVydGljYWxSZXNvbHV0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldFJlc29sdXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRSZXNvbHV0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEZpeGVkIGhvcml6b250YWxSZXNvbHV0aW9uLCBGaXhlZCB2ZXJ0aWNhbFJlc29sdXRpb24pIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXREZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldERlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgbG9uZyBkZXB0aCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXREZXB0aCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldERlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGVwdGgpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0Q29sb3JTeW5jUHJvZmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldENvbG9yU3luY1Byb2ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBjb2xvclN5bmNQcm9maWxlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgRlNTcGVjIHRoZUZpbGUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGgsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0SGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBoKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQdHIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFB0ciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFB0ciBwLCB1bnNpZ25lZCBsb25nIHNpemUsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlciIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldElucHV0R3JhcGhpY3NJbXBvcnRlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHcmFwaGljc0ltcG9ydENvbXBvbmVudCBncmlwKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgUGljSGFuZGxlIHBpY3R1cmUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpY0hhbmRsZSBwaWN0dXJlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEdXb3JsZFB0ciBnd29ybGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBHV29ybGRQdHIgZ3dvcmxkKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRQaXhtYXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRJbnB1dFBpeG1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIFBpeE1hcEhhbmRsZSBwaXhtYXApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaXhtYXAiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgcGl4bWFwKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldElucHV0T2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBsaW1pdCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydE1heUV4cG9ydGVyUmVhZElucHV0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIG1heVJlYWRJbnB1dERhdGEpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXREYXRhU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIHNpemUpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0UmVhZElucHV0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHZvaWQgKiBkYXRhUHRyLCB1bnNpZ25lZCBsb25nIGRhdGFPZmZzZXQsIHVuc2lnbmVkIGxvbmcgZGF0YVNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEltYWdlRGVzY3JpcHRpb25IYW5kbGUgZGVzYykiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURpbWVuc2lvbnMsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBkaW1lbnNpb25zKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRJbWFnZURlcHRoLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5wdXREZXB0aCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0RHJhd0lucHV0SW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBDR3JhZlB0ciBndywgR0RIYW5kbGUgZ2QsIFJlY3Qgc3JjUmVjdCwgUmVjdCBkc3RSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RGF0YVJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0RmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFNldE91dHB1dEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaCkiKX0sCisgICAgeyJHcmFwaGljc0V4cG9ydFNldE91dHB1dE9mZnNldEFuZE1heFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRPZmZzZXRBbmRNYXhTaXplLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSwgQm9vbGVhbiB0cnVuY2F0ZUZpbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldE91dHB1dE9mZnNldEFuZE1heFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4U2l6ZSwgQm9vbGVhbiB0cnVuY2F0ZUZpbGUpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpLCBPU1R5cGUgZmlsZVR5cGUsIE9TVHlwZSBmaWxlQ3JlYXRvcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNzRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGZpbGVUeXBlLCBPU1R5cGUgZmlsZUNyZWF0b3IpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRNYXJrIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgbWFyaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRNYXJrIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFyaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIG1hcmspIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRSZWFkT3V0cHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydFJlYWRPdXRwdXREYXRhLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSwgdm9pZCAqIGRhdGFQdHIsIHVuc2lnbmVkIGxvbmcgZGF0YU9mZnNldCwgdW5zaWduZWQgbG9uZyBkYXRhU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRTZXRUaHVtYm5haWxFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0U2V0VGh1bWJuYWlsRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlVGh1bWJuYWlsLCBsb25nIG1heFRodW1ibmFpbFdpZHRoLCBsb25nIG1heFRodW1ibmFpbEhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRUaHVtYm5haWxFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzRXhwb3J0R2V0VGh1bWJuYWlsRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHRodW1ibmFpbEVuYWJsZWQsIGxvbmcgbWF4VGh1bWJuYWlsV2lkdGgsIGxvbmcgbWF4VGh1bWJuYWlsSGVpZ2h0KSIpfSwKKyAgICB7IkdyYXBoaWNzRXhwb3J0U2V0RXhpZkVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NFeHBvcnRTZXRFeGlmRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY3NFeHBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlRXhpZikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZCIsIChQeUNGdW5jdGlvbilRdF9HcmFwaGljc0V4cG9ydEdldEV4aWZFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihHcmFwaGljc0V4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXhpZkVuYWJsZWQpIil9LAorICAgIHsiSW1hZ2VUcmFuc2NvZGVyQmVnaW5TZXF1ZW5jZSIsIChQeUNGdW5jdGlvbilRdF9JbWFnZVRyYW5zY29kZXJCZWdpblNlcXVlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIHNyY0Rlc2MsIHZvaWQgKiBkYXRhLCBsb25nIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkc3REZXNjKSIpfSwKKyAgICB7IkltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0ltYWdlVHJhbnNjb2RlckRpc3Bvc2VEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihJbWFnZVRyYW5zY29kZXJDb21wb25lbnQgaXRjLCB2b2lkICogZHN0RGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfSW1hZ2VUcmFuc2NvZGVyRW5kU2VxdWVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKEltYWdlVHJhbnNjb2RlckNvbXBvbmVudCBpdGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkNsb2NrR2V0VGltZSIsIChQeUNGdW5jdGlvbilRdF9DbG9ja0dldFRpbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFDbG9jaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgb3V0KSIpfSwKKyAgICB7IkNsb2NrU2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfQ2xvY2tTZXRUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrLCBUaW1lQmFzZSB0YikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiQ2xvY2tHZXRSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0Nsb2NrR2V0UmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYUNsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgcmF0ZSkiKX0sCisgICAgeyJTQ1Bvc2l0aW9uUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TQ1Bvc2l0aW9uUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHJwLCBQb2ludCB3aGVyZSkiKX0sCisgICAgeyJTQ1Bvc2l0aW9uRGlhbG9nIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDUG9zaXRpb25EaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBzaG9ydCBpZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBvaW50IHdoZXJlKSIpfSwKKyAgICB7IlNDU2V0VGVzdEltYWdlUGljdEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpY3RIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaWNIYW5kbGUgdGVzdFBpY3QsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAorICAgIHsiU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9TQ1NldFRlc3RJbWFnZVBpY3RGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgdGVzdEZpbGVSZWYsIHNob3J0IHRlc3RGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgdGVzdFJlY3QpIil9LAorICAgIHsiU0NTZXRUZXN0SW1hZ2VQaXhNYXAiLCAoUHlDRnVuY3Rpb24pUXRfU0NTZXRUZXN0SW1hZ2VQaXhNYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgdGVzdFBpeE1hcCwgc2hvcnQgdGVzdEZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCB0ZXN0UmVjdCkiKX0sCisgICAgeyJTQ0dldEJlc3REZXZpY2VSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NDR2V0QmVzdERldmljZVJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKKyAgICB7IlNDUmVxdWVzdEltYWdlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NSZXF1ZXN0SW1hZ2VTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDQ29tcHJlc3NJbWFnZSIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzSW1hZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBQaXhNYXBIYW5kbGUgc3JjLCBSZWN0IHNyY1JlY3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MsIEhhbmRsZSBkYXRhKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NQaWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHNyY1BpY3R1cmUsIFBpY0hhbmRsZSBkc3RQaWN0dXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0NvbXByZXNzUGljdHVyZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfU0NDb21wcmVzc1BpY3R1cmVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgc3JjUmVmTnVtLCBzaG9ydCBkc3RSZWZOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NSZXF1ZXN0U2VxdWVuY2VTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUJlZ2luLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSW1hZ2VEZXNjcmlwdGlvbkhhbmRsZSBkZXNjKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgUmVjdCBzcmNSZWN0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGEsIGxvbmcgZGF0YVNpemUsIHNob3J0IG5vdFN5bmNGbGFnKSIpfSwKKyAgICB7IlNDQ29tcHJlc3NTZXF1ZW5jZUVuZCIsIChQeUNGdW5jdGlvbilRdF9TQ0NvbXByZXNzU2VxdWVuY2VFbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGljSGFuZGxlIHNyY1BpY3R1cmUsIHNob3J0IG1vdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TQ0RlZmF1bHRQaWN0RmlsZVNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgc2hvcnQgc3JjUmVmLCBzaG9ydCBtb3Rpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDRGVmYXVsdFBpeE1hcFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDRGVmYXVsdFBpeE1hcFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgUGl4TWFwSGFuZGxlIHNyYywgc2hvcnQgbW90aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0dldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mbykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0NTZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDU2V0SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgY2ksIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNDU2V0Q29tcHJlc3NGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TQ1NldENvbXByZXNzRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGNpLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTQ0dldENvbXByZXNzRmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0NHZXRDb21wcmVzc0ZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3MpIil9LAorICAgIHsiU0NHZXRTZXR0aW5nc0FzVGV4dCIsIChQeUNGdW5jdGlvbilRdF9TQ0dldFNldHRpbmdzQXNUZXh0LCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSB0ZXh0KSIpfSwKKyAgICB7IlNDQXN5bmNJZGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NDQXN5bmNJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHdlZW5lclJlc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1R3ZWVuZXJSZXNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHdlZW5lckNvbXBvbmVudCB0YykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVENHZXRTb3VyY2VSZWYiLCAoUHlDRnVuY3Rpb24pUXRfVENHZXRTb3VyY2VSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RIKSAtPiAoSGFuZGxlckVycm9yIF9ydiwgVXNlckRhdGEgc3JlZkgpIil9LAorICAgIHsiVENTZXRTb3VyY2VSZWYiLCAoUHlDRnVuY3Rpb24pUXRfVENTZXRTb3VyY2VSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZUNvZGVEZXNjcmlwdGlvbkhhbmRsZSB0Y2RILCBVc2VyRGF0YSBzcmVmSCkgLT4gKEhhbmRsZXJFcnJvciBfcnYpIil9LAorICAgIHsiVENTZXRUaW1lQ29kZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDU2V0VGltZUNvZGVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBsb25nIGZsYWdzTWFzaykgLT4gKEhhbmRsZXJFcnJvciBfcnYpIil9LAorICAgIHsiVENHZXRUaW1lQ29kZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1RDR2V0VGltZUNvZGVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoSGFuZGxlckVycm9yIF9ydiwgbG9uZyBmbGFncykiKX0sCisgICAgeyJNb3ZpZUltcG9ydEhhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhSCwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0RmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0U2FtcGxlRHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRTYW1wbGVEdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFRpbWVWYWx1ZSBkdXJhdGlvbiwgVGltZVNjYWxlIHNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0U2FtcGxlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldE1lZGlhRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldE1lZGlhRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEFsaWFzSGFuZGxlIGFsaWFzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldERpbWVuc2lvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREaW1lbnNpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgRml4ZWQgd2lkdGgsIEZpeGVkIGhlaWdodCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRDaHVua1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRDaHVua1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGNodW5rU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRBdXhpbGlhcnlEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEhhbmRsZSBkYXRhLCBPU1R5cGUgaGFuZGxlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRGcm9tU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBCb29sZWFuIGZyb21TY3JhcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnREb1VzZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnREb1VzZXJEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBGU1NwZWMgdGhlRmlsZSwgSGFuZGxlIHRoZURhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGNhbmNlbGVkKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0RHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXREdXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIFRpbWVWYWx1ZSBkdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldEF1eGlsaWFyeURhdGFUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBhdXhUeXBlKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0VmFsaWRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRWYWxpZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBIYW5kbGUgdGhlRGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRGaWxlVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldEZpbGVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgTW92aWUgdGhlTW92aWUsIFRyYWNrIHRhcmdldFRyYWNrLCBUaW1lVmFsdWUgYXRUaW1lLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUcmFjayB1c2VkVHJhY2ssIFRpbWVWYWx1ZSBhZGRlZER1cmF0aW9uLCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0U2FtcGxlRGVzY3JpcHRpb24iLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTYW1wbGVEZXNjcmlwdGlvbkhhbmRsZSBkZXNjLCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0U2V0T2Zmc2V0QW5kTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGxpbWl0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjQiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdDY0LCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgd2lkZSBvZmZzZXQsIHdpZGUgbGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0SWRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydElkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBsb25nIGluRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG91dEZsYWdzKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0VmFsaWRhdGVEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQ4IHZhbGlkKSIpfSwKKyAgICB7Ik1vdmllSW1wb3J0R2V0TG9hZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0TG9hZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW1wb3J0ZXJMb2FkU3RhdGUpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0R2V0TWF4TG9hZGVkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgdGltZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydEVzdGltYXRlQ29tcGxldGlvblRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVSZWNvcmQgdGltZSkiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldERvbnRCbG9jayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydFNldERvbnRCbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZG9udEJsb2NrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUltcG9ydEdldERvbnRCbG9jayIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldERvbnRCbG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdpbGxCbG9jaykiKX0sCisgICAgeyJNb3ZpZUltcG9ydFNldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllSW1wb3J0Q29tcG9uZW50IGNpLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRTZXROZXdNb3ZpZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllSW1wb3J0U2V0TmV3TW92aWVGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIGxvbmcgbmV3TW92aWVGbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVJbXBvcnRHZXREZXN0aW5hdGlvbk1lZGlhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUltcG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBtZWRpYVR5cGUpIil9LAorICAgIHsiTW92aWVFeHBvcnRUb0hhbmRsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFILCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydFRvRmlsZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFRvRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIEZTU3BlYyB0aGVGaWxlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldEF1eGlsaWFyeURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgSGFuZGxlIGRhdGFIKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGhhbmRsZVR5cGUpIil9LAorICAgIHsiTW92aWVFeHBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSwgU2FtcGxlRGVzY3JpcHRpb25IYW5kbGUgZGVzYywgT1NUeXBlIG1lZGlhVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTW92aWVFeHBvcnREb1VzZXJEaWFsb2ciLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnREb1VzZXJEaWFsb2csIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBjYW5jZWxlZCkiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0Q3JlYXRvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGNyZWF0b3IpIil9LAorICAgIHsiTW92aWVFeHBvcnRUb0RhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfTW92aWVFeHBvcnRUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaywgVGltZVZhbHVlIHN0YXJ0VGltZSwgVGltZVZhbHVlIGR1cmF0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0RnJvbVByb2NlZHVyZXNUb0RhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydFZhbGlkYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0VmFsaWRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1vdmllRXhwb3J0Q29tcG9uZW50IGNpLCBNb3ZpZSB0aGVNb3ZpZSwgVHJhY2sgb25seVRoaXNUcmFjaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdmFsaWQpIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRGaWxlTmFtZUV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihNb3ZpZUV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBleHRlbnNpb24pIil9LAorICAgIHsiTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllRXhwb3J0R2V0U2hvcnRGaWxlVHlwZVN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2ksIFN0cjI1NSB0eXBlU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSIsIChQeUNGdW5jdGlvbilRdF9Nb3ZpZUV4cG9ydEdldFNvdXJjZU1lZGlhVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTW92aWVFeHBvcnRDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBPU1R5cGUgbWVkaWFUeXBlKSIpfSwKKyAgICB7IlRleHRFeHBvcnRHZXRUaW1lRnJhY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbW92aWVUaW1lRnJhY3Rpb24pIil9LAorICAgIHsiVGV4dEV4cG9ydFNldFRpbWVGcmFjdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0U2V0VGltZUZyYWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIG1vdmllVGltZUZyYWN0aW9uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUZXh0RXhwb3J0R2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfVGV4dEV4cG9ydEdldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZXR0aW5nKSIpfSwKKyAgICB7IlRleHRFeHBvcnRTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9UZXh0RXhwb3J0U2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFRleHRFeHBvcnRDb21wb25lbnQgY2ksIGxvbmcgc2V0dGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTUlESUltcG9ydEdldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X01JRElJbXBvcnRHZXRTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVGV4dEV4cG9ydENvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc2V0dGluZykiKX0sCisgICAgeyJNSURJSW1wb3J0U2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfTUlESUltcG9ydFNldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihUZXh0RXhwb3J0Q29tcG9uZW50IGNpLCBsb25nIHNldHRpbmcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkdyYXBoaWNzSW1hZ2VJbXBvcnRTZXRTZXF1ZW5jZUVuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoR3JhcGhpY0ltYWdlTW92aWVJbXBvcnRDb21wb25lbnQgY2ksIEJvb2xlYW4gZW5hYmxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJHcmFwaGljc0ltYWdlSW1wb3J0R2V0U2VxdWVuY2VFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X0dyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKEdyYXBoaWNJbWFnZU1vdmllSW1wb3J0Q29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlbmFibGUpIil9LAorICAgIHsiUHJldmlld1Nob3dEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdTaG93RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwLCBPU1R5cGUgZGF0YVR5cGUsIEhhbmRsZSBkYXRhLCBSZWN0IGluSGVyZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUHJldmlld01ha2VQcmV2aWV3UmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdNYWtlUHJldmlld1JlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwLCBGU1NwZWMgc291cmNlRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBwcmV2aWV3VHlwZSwgc2hvcnQgcmVzSUQpIil9LAorICAgIHsiUHJldmlld0V2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1ByZXZpZXdFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIocG5vdENvbXBvbmVudCBwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRXZlbnRSZWNvcmQgZSwgQm9vbGVhbiBoYW5kbGVkRXZlbnQpIil9LAorICAgIHsiRGF0YUNvZGVjRGVjb21wcmVzcyIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNEZWNvbXByZXNzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIHZvaWQgKiBzcmNEYXRhLCBVSW50MzIgc3JjU2l6ZSwgdm9pZCAqIGRzdERhdGEsIFVJbnQzMiBkc3RCdWZmZXJTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhQ29kZWNHZXRDb21wcmVzc0J1ZmZlclNpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhQ29kZWNDb21wb25lbnQgZGMsIFVJbnQzMiBzcmNTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDMyIGRzdFNpemUpIil9LAorICAgIHsiRGF0YUNvZGVjQ29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUNvZGVjQ29tcHJlc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdm9pZCAqIHNyY0RhdGEsIFVJbnQzMiBzcmNTaXplLCB2b2lkICogZHN0RGF0YSwgVUludDMyIGRzdEJ1ZmZlclNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgYWN0dWFsRHN0U2l6ZSwgVUludDMyIGRlY29tcHJlc3NTbG9wKSIpfSwKKyAgICB7IkRhdGFDb2RlY0JlZ2luSW50ZXJydXB0U2FmZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYywgdW5zaWduZWQgbG9uZyBtYXhTcmNTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFDb2RlY0VuZEludGVycnVwdFNhZmUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFDb2RlY0NvbXBvbmVudCBkYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBoLCBsb25nIGhPZmZzZXQsIGxvbmcgb2Zmc2V0LCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIUHV0RGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFB1dERhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgaCwgbG9uZyBoT2Zmc2V0LCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG9mZnNldCkiKX0sCisgICAgeyJEYXRhSEZsdXNoRGF0YSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZsdXNoRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIT3BlbkZvcldyaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIT3BlbkZvcldyaXRlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhDbG9zZUZvcldyaXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2xvc2VGb3JXcml0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIT3BlbkZvclJlYWQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhPcGVuRm9yUmVhZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIQ2xvc2VGb3JSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIQ2xvc2VGb3JSZWFkLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhTZXREYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKKyAgICB7IkRhdGFIQ29tcGFyZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDb21wYXJlRGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBlcXVhbCkiKX0sCisgICAgeyJEYXRhSFRhc2siLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhGaW5pc2hEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRmluaXNoRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFB0ciBQbGFjZVRvUHV0RGF0YVB0ciwgQm9vbGVhbiBDYW5jZWwpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIRmx1c2hDYWNoZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEZsdXNoQ2FjaGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFJlc29sdmVEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUmVzb2x2ZURhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgdGhlRGF0YVJlZiwgQm9vbGVhbiB1c2VySW50ZXJmYWNlQWxsb3dlZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gd2FzQ2hhbmdlZCkiKX0sCisgICAgeyJEYXRhSEdldEZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmaWxlU2l6ZSkiKX0sCisgICAgeyJEYXRhSENhblVzZURhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhDYW5Vc2VEYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIGRhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHVzZUZsYWdzKSIpfSwKKyAgICB7IkRhdGFIUHJlZXh0ZW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUHJlZXh0ZW5kLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdW5zaWduZWQgbG9uZyBtYXhUb0FkZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgc3BhY2VBZGRlZCkiKX0sCisgICAgeyJEYXRhSFNldEZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0RmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZpbGVTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEZyZWVTcGFjZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZyZWVTcGFjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBsb25nIGZyZWVTaXplKSIpfSwKKyAgICB7IkRhdGFIQ3JlYXRlRmlsZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENyZWF0ZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgY3JlYXRvciwgQm9vbGVhbiBkZWxldGVFeGlzdGluZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRQcmVmZXJyZWRCbG9ja1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBibG9ja1NpemUpIil9LAorICAgIHsiRGF0YUhHZXREZXZpY2VJbmRleCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERldmljZUluZGV4LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZGV2aWNlSW5kZXgpIil9LAorICAgIHsiRGF0YUhJc1N0cmVhbWluZ0RhdGFIYW5kbGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFISXNTdHJlYW1pbmdEYXRhSGFuZGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHllcykiKX0sCisgICAgeyJEYXRhSEdldERhdGFJbkJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFJbkJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgc3RhcnRPZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHNpemUpIil9LAorICAgIHsiRGF0YUhHZXRTY2hlZHVsZUFoZWFkVGltZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldFNjaGVkdWxlQWhlYWRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlzZWNzKSIpfSwKKyAgICB7IkRhdGFIU2V0Q2FjaGVTaXplTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRDYWNoZVNpemVMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIFNpemUgY2FjaGVTaXplTGltaXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0Q2FjaGVTaXplTGltaXQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRDYWNoZVNpemVMaW1pdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTaXplIGNhY2hlU2l6ZUxpbWl0KSIpfSwKKyAgICB7IkRhdGFIR2V0TW92aWUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNb3ZpZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIil9LAorICAgIHsiRGF0YUhBZGRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEFkZE1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgTW92aWUgdGhlTW92aWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpZCkiKX0sCisgICAgeyJEYXRhSFVwZGF0ZU1vdmllIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVXBkYXRlTW92aWUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIRG9lc0J1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9EYXRhSERvZXNCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBidWZmZXJzUmVhZHMsIEJvb2xlYW4gYnVmZmVyc1dyaXRlcykiKX0sCisgICAgeyJEYXRhSEdldEZpbGVOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZU5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0QXZhaWxhYmxlRmlsZVNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBmaWxlU2l6ZSkiKX0sCisgICAgeyJEYXRhSEdldE1hY09TRmlsZVR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRNYWNPU0ZpbGVUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIE9TVHlwZSBmaWxlVHlwZSkiKX0sCisgICAgeyJEYXRhSEdldE1JTUVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0TUlNRVR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBTdHIyNTUgbWltZVR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIU2V0RGF0YVJlZldpdGhBbmNob3IiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXREYXRhUmVmV2l0aEFuY2hvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIEhhbmRsZSBhbmNob3JEYXRhUmVmLCBPU1R5cGUgZGF0YVJlZlR5cGUsIEhhbmRsZSBkYXRhUmVmKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RGF0YVJlZldpdGhBbmNob3IsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgYW5jaG9yRGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYpIil9LAorICAgIHsiRGF0YUhTZXRNYWNPU0ZpbGVUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0TWFjT1NGaWxlVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIE9TVHlwZSBmaWxlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhTZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldFRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgVGltZUJhc2UgdGIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIR2V0SW5mb0ZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0SW5mb0ZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBmbGFncykiKX0sCisgICAgeyJEYXRhSEdldEZpbGVTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRGaWxlU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZmlsZVNpemUpIil9LAorICAgIHsiRGF0YUhQcmVleHRlbmQ2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFByZWV4dGVuZDY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBtYXhUb0FkZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgc3BhY2VBZGRlZCkiKX0sCisgICAgeyJEYXRhSFNldEZpbGVTaXplNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRGaWxlU2l6ZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgd2lkZSBmaWxlU2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRGcmVlU3BhY2U2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldEZyZWVTcGFjZTY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZnJlZVNpemUpIil9LAorICAgIHsiRGF0YUhBcHBlbmQ2NCIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEFwcGVuZDY0LCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgdm9pZCAqIGRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHdpZGUgZmlsZU9mZnNldCkiKX0sCisgICAgeyJEYXRhSFBvbGxSZWFkIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIUG9sbFJlYWQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCB2b2lkICogZGF0YVB0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBkYXRhU2l6ZVNvRmFyKSIpfSwKKyAgICB7IkRhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFBdmFpbGFiaWxpdHksIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIG9mZnNldCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1pc3Npbmdfb2Zmc2V0LCBsb25nIG1pc3NpbmdfbGVuKSIpfSwKKyAgICB7IkRhdGFIR2V0RGF0YVJlZkFzVHlwZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSZWZBc1R5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgcmVxdWVzdGVkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBkYXRhUmVmKSIpfSwKKyAgICB7IkRhdGFIU2V0RGF0YVJlZkV4dGVuc2lvbiIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFNldERhdGFSZWZFeHRlbnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBIYW5kbGUgZXh0ZW5zaW9uLCBPU1R5cGUgaWRUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldERhdGFSZWZFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXREYXRhUmVmRXh0ZW5zaW9uLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIGlkVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSBleHRlbnNpb24pIil9LAorICAgIHsiRGF0YUhHZXRNb3ZpZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldE1vdmllV2l0aEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgc2hvcnQgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBNb3ZpZSB0aGVNb3ZpZSwgc2hvcnQgaWQpIil9LAorICAgIHsiRGF0YUhHZXRGaWxlVHlwZU9yZGVyaW5nIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0RmlsZVR5cGVPcmRlcmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBEYXRhSEZpbGVUeXBlT3JkZXJpbmdIYW5kbGUgb3JkZXJpbmdMaXN0SGFuZGxlKSIpfSwKKyAgICB7IkRhdGFIQ3JlYXRlRmlsZVdpdGhGbGFncyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBPU1R5cGUgY3JlYXRvciwgQm9vbGVhbiBkZWxldGVFeGlzdGluZywgVUludDMyIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSEdldEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhHZXRJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgT1NUeXBlIHdoYXQsIHZvaWQgKiBpbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJEYXRhSFNldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0SWRsZU1hbmFnZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBJZGxlTWFuYWdlciBpbSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhEZWxldGVGaWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIRGVsZXRlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIU2V0TW92aWVVc2FnZUZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIU2V0TW92aWVVc2FnZUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhVc2VUZW1wb3JhcnlEYXRhUmVmIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIVXNlVGVtcG9yYXJ5RGF0YVJlZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgsIGxvbmcgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXRUZW1wb3JhcnlEYXRhUmVmQ2FwYWJpbGl0aWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X0RhdGFIR2V0VGVtcG9yYXJ5RGF0YVJlZkNhcGFiaWxpdGllcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRGF0YUhhbmRsZXIgZGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG91dFVuZGVyc3Rvb2RGbGFncykiKX0sCisgICAgeyJEYXRhSFJlbmFtZUZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhSZW5hbWVGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgSGFuZGxlIG5ld0RhdGFSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IkRhdGFIUGxheWJhY2tIaW50cyIsIChQeUNGdW5jdGlvbilRdF9EYXRhSFBsYXliYWNrSGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIG1pbkZpbGVPZmZzZXQsIHVuc2lnbmVkIGxvbmcgbWF4RmlsZU9mZnNldCwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhQbGF5YmFja0hpbnRzNjQiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhQbGF5YmFja0hpbnRzNjQsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCB3aWRlIG1pbkZpbGVPZmZzZXQsIHdpZGUgbWF4RmlsZU9mZnNldCwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiRGF0YUhHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9EYXRhSEdldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihEYXRhSGFuZGxlciBkaCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgYnl0ZXNQZXJTZWNvbmQpIil9LAorICAgIHsiRGF0YUhTZXRUaW1lSGludHMiLCAoUHlDRnVuY3Rpb24pUXRfRGF0YUhTZXRUaW1lSGludHMsIDEsCisgICAgIFB5RG9jX1NUUigiKERhdGFIYW5kbGVyIGRoLCBsb25nIGZsYWdzLCBsb25nIGJhbmR3aWR0aFByaW9yaXR5LCBUaW1lU2NhbGUgc2NhbGUsIFRpbWVWYWx1ZSBtaW5UaW1lLCBUaW1lVmFsdWUgbWF4VGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRNYXhTcmNSZWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWF4U3JjUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGlucHV0U3RkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBtYXhTcmNSZWN0KSIpfSwKKyAgICB7IlZER2V0QWN0aXZlU3JjUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WREdldEFjdGl2ZVNyY1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0ZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgYWN0aXZlU3JjUmVjdCkiKX0sCisgICAgeyJWRFNldERpZ2l0aXplclJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXREaWdpdGl6ZXJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGlnaXRpemVyUmVjdCkiKX0sCisgICAgeyJWREdldERpZ2l0aXplclJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXREaWdpdGl6ZXJSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZGlnaXRpemVyUmVjdCkiKX0sCisgICAgeyJWREdldFZCbGFua1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRWQmxhbmtSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgaW5wdXRTdGQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IHZCbGFua1JlY3QpIil9LAorICAgIHsiVkRHZXRNYXNrUGl4TWFwIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWFza1BpeE1hcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFBpeE1hcEhhbmRsZSBtYXNrUGl4TWFwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFVzZVRoaXNDTFVUIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEVXNlVGhpc0NMVVQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBDVGFiSGFuZGxlIGNvbG9yVGFibGVIYW5kbGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0SW5wdXRHYW1tYVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRHYW1tYVZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgRml4ZWQgY2hhbm5lbDEsIEZpeGVkIGNoYW5uZWwyLCBGaXhlZCBjaGFubmVsMykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRJbnB1dEdhbW1hVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dEdhbW1hVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgRml4ZWQgY2hhbm5lbDEsIEZpeGVkIGNoYW5uZWwyLCBGaXhlZCBjaGFubmVsMykiKX0sCisgICAgeyJWRFNldEJyaWdodG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRCcmlnaHRuZXNzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJyaWdodG5lc3MpIil9LAorICAgIHsiVkRHZXRCcmlnaHRuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0QnJpZ2h0bmVzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzKSIpfSwKKyAgICB7IlZEU2V0Q29udHJhc3QiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDb250cmFzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBjb250cmFzdCkiKX0sCisgICAgeyJWRFNldEh1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEh1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBodWUpIil9LAorICAgIHsiVkRTZXRTaGFycG5lc3MiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRTaGFycG5lc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2hhcnBuZXNzKSIpfSwKKyAgICB7IlZEU2V0U2F0dXJhdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldFNhdHVyYXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgc2F0dXJhdGlvbikiKX0sCisgICAgeyJWREdldENvbnRyYXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q29udHJhc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgY29udHJhc3QpIil9LAorICAgIHsiVkRHZXRIdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRIdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgaHVlKSIpfSwKKyAgICB7IlZER2V0U2hhcnBuZXNzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U2hhcnBuZXNzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNoYXJwbmVzcykiKX0sCisgICAgeyJWREdldFNhdHVyYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRTYXR1cmF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24pIil9LAorICAgIHsiVkRHcmFiT25lRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHcmFiT25lRnJhbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldE1heEF1eEJ1ZmZlciIsIChQeUNGdW5jdGlvbilRdF9WREdldE1heEF1eEJ1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaXhNYXBIYW5kbGUgcG0sIFJlY3QgcikiKX0sCisgICAgeyJWREdldEN1cnJlbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9WREdldEN1cnJlbnRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGlucHV0Q3VycmVudEZsYWcsIGxvbmcgb3V0cHV0Q3VycmVudEZsYWcpIil9LAorICAgIHsiVkRTZXRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WRFNldEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREdldEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5kZXgpIil9LAorICAgIHsiVkRBZGRLZXlDb2xvciIsIChQeUNGdW5jdGlvbilRdF9WREFkZEtleUNvbG9yLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaW5kZXgpIil9LAorICAgIHsiVkRHZXROZXh0S2V5Q29sb3IiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXROZXh0S2V5Q29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEtleUNvbG9yUmFuZ2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRLZXlDb2xvclJhbmdlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJHQkNvbG9yIG1pblJHQiwgUkdCQ29sb3IgbWF4UkdCKSIpfSwKKyAgICB7IlZER2V0S2V5Q29sb3JSYW5nZSIsIChQeUNGdW5jdGlvbilRdF9WREdldEtleUNvbG9yUmFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgbWluUkdCLCBSR0JDb2xvciBtYXhSR0IpIil9LAorICAgIHsiVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXRDb2xvclNwYWNlTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGNvbG9yU3BhY2VNb2RlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldElucHV0Q29sb3JTcGFjZU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGNvbG9yU3BhY2VNb2RlKSIpfSwKKyAgICB7IlZEU2V0Q2xpcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q2xpcFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgY2xpcEVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRDbGlwU3RhdGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRDbGlwU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgY2xpcEVuYWJsZSkiKX0sCisgICAgeyJWRFNldENsaXBSZ24iLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZWdpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEQ2xlYXJDbGlwUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEQ2xlYXJDbGlwUmduLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgUmduSGFuZGxlIGNsaXBSZWdpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0Q0xVVEluVXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0Q0xVVEluVXNlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENUYWJIYW5kbGUgY29sb3JUYWJsZUhhbmRsZSkiKX0sCisgICAgeyJWRFNldFBMTEZpbHRlclR5cGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRQTExGaWx0ZXJUeXBlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgc2hvcnQgcGxsVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRQTExGaWx0ZXJUeXBlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0UExMRmlsdGVyVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBwbGxUeXBlKSIpfSwKKyAgICB7IlZER2V0TWFza2FuZFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0TWFza2FuZFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgdW5zaWduZWQgc2hvcnQgYmxlbmRMZXZlbCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWFzaywgbG9uZyB2YWx1ZSkiKX0sCisgICAgeyJWRFNldE1hc3RlckJsZW5kTGV2ZWwiLCAoUHlDRnVuY3Rpb24pUXRfVkRTZXRNYXN0ZXJCbGVuZExldmVsLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsZW5kTGV2ZWwpIil9LAorICAgIHsiVkRTZXRQbGF5VGhydU9uT2ZmIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0UGxheVRocnVPbk9mZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IHN0YXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEZpZWxkUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEZpZWxkUHJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGZpZWxkRmxhZykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRGaWVsZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRGaWVsZFByZWZlcmVuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZmllbGRGbGFnKSIpfSwKKyAgICB7IlZEUHJlZmxpZ2h0R2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFByZWZsaWdodEdsb2JhbFJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBHcmFmUHRyIHRoZVdpbmRvdykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgZ2xvYmFsUmVjdCkiKX0sCisgICAgeyJWRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCIsIChQeUNGdW5jdGlvbilRdF9WRFNldFBsYXlUaHJ1R2xvYmFsUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEdyYWZQdHIgdGhlV2luZG93KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBnbG9iYWxSZWN0KSIpfSwKKyAgICB7IlZEU2V0QmxhY2tMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0QmxhY2tMZXZlbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IGJsYWNrTGV2ZWwpIil9LAorICAgIHsiVkRHZXRCbGFja0xldmVsVmFsdWUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRCbGFja0xldmVsVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgYmxhY2tMZXZlbCkiKX0sCisgICAgeyJWRFNldFdoaXRlTGV2ZWxWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFdoaXRlTGV2ZWxWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsKSIpfSwKKyAgICB7IlZER2V0V2hpdGVMZXZlbFZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0V2hpdGVMZXZlbFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIHNob3J0IHdoaXRlTGV2ZWwpIil9LAorICAgIHsiVkRHZXRWaWRlb0RlZmF1bHRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0VmlkZW9EZWZhdWx0cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCBibGFja0xldmVsLCB1bnNpZ25lZCBzaG9ydCB3aGl0ZUxldmVsLCB1bnNpZ25lZCBzaG9ydCBicmlnaHRuZXNzLCB1bnNpZ25lZCBzaG9ydCBodWUsIHVuc2lnbmVkIHNob3J0IHNhdHVyYXRpb24sIHVuc2lnbmVkIHNob3J0IGNvbnRyYXN0LCB1bnNpZ25lZCBzaG9ydCBzaGFycG5lc3MpIil9LAorICAgIHsiVkRHZXROdW1iZXJPZklucHV0cyIsIChQeUNGdW5jdGlvbilRdF9WREdldE51bWJlck9mSW5wdXRzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlucHV0cykiKX0sCisgICAgeyJWREdldElucHV0Rm9ybWF0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0SW5wdXRGb3JtYXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGZvcm1hdCkiKX0sCisgICAgeyJWRFNldElucHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0SW5wdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGlucHV0KSIpfSwKKyAgICB7IlZEU2V0SW5wdXRTdGFuZGFyZCIsIChQeUNGdW5jdGlvbilRdF9WRFNldElucHV0U3RhbmRhcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBzaG9ydCBpbnB1dFN0YW5kYXJkKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldHVwQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFNldHVwQnVmZmVycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFZkaWdCdWZmZXJSZWNMaXN0SGFuZGxlIGJ1ZmZlckxpc3QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER3JhYk9uZUZyYW1lQXN5bmMiLCAoUHlDRnVuY3Rpb24pUXRfVkRHcmFiT25lRnJhbWVBc3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkREb25lIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZERG9uZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIHNob3J0IGJ1ZmZlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRDb21wcmVzc2lvbiIsIChQeUNGdW5jdGlvbilRdF9WRFNldENvbXByZXNzaW9uLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgT1NUeXBlIGNvbXByZXNzVHlwZSwgc2hvcnQgZGVwdGgsIENvZGVjUSBzcGF0aWFsUXVhbGl0eSwgQ29kZWNRIHRlbXBvcmFsUXVhbGl0eSwgbG9uZyBrZXlGcmFtZVJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJWRENvbXByZXNzT25lRnJhbWVBc3luYyIsIChQeUNGdW5jdGlvbilRdF9WRENvbXByZXNzT25lRnJhbWVBc3luYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0SW1hZ2VEZXNjcmlwdGlvbiIsIChQeUNGdW5jdGlvbilRdF9WREdldEltYWdlRGVzY3JpcHRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBJbWFnZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEUmVzZXRDb21wcmVzc1NlcXVlbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEUmVzZXRDb21wcmVzc1NlcXVlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXRDb21wcmVzc2lvbk9uT2ZmIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0Q29tcHJlc3Npb25Pbk9mZiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEJvb2xlYW4gc3RhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0Q29tcHJlc3Npb25UeXBlcyIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbXByZXNzaW9uVHlwZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBWRENvbXByZXNzaW9uTGlzdEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBUaW1lQmFzZSB0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldEZyYW1lUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIEZpeGVkIGZyYW1lc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WREdldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlsbGlTZWNQZXJGcmFtZSwgRml4ZWQgZnJhbWVzUGVyU2Vjb25kLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKKyAgICB7IlZER2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9WREdldFNvdW5kSW5wdXREcml2ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBTdHIyNTUgc291bmREcml2ZXJOYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldERNQURlcHRocyIsIChQeUNGdW5jdGlvbilRdF9WREdldERNQURlcHRocywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGRlcHRoQXJyYXksIGxvbmcgcHJlZmVycmVkRGVwdGgpIil9LAorICAgIHsiVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfVkRHZXRQcmVmZXJyZWRUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHByZWZlcnJlZCkiKX0sCisgICAgeyJWRFJlbGVhc2VBc3luY0J1ZmZlcnMiLCAoUHlDRnVuY3Rpb24pUXRfVkRSZWxlYXNlQXN5bmNCdWZmZXJzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRTZXREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldERhdGFSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgbG9uZyBieXRlc1BlclNlY29uZCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRUaW1lQ29kZSIsIChQeUNGdW5jdGlvbilRdF9WREdldFRpbWVDb2RlLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgdm9pZCAqIHRpbWVDb2RlRm9ybWF0LCB2b2lkICogdGltZUNvZGVUaW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVJlY29yZCBhdFRpbWUpIil9LAorICAgIHsiVkRVc2VTYWZlQnVmZmVycyIsIChQeUNGdW5jdGlvbilRdF9WRFVzZVNhZmVCdWZmZXJzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQm9vbGVhbiB1c2VTYWZlQnVmZmVycykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVkRHZXRTb3VuZElucHV0U291cmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0U291bmRJbnB1dFNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgdmlkZW9JbnB1dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgc291bmRJbnB1dCkiKX0sCisgICAgeyJWREdldENvbXByZXNzaW9uVGltZSIsIChQeUNGdW5jdGlvbilRdF9WREdldENvbXByZXNzaW9uVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIE9TVHlwZSBjb21wcmVzc2lvblR5cGUsIHNob3J0IGRlcHRoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBzcmNSZWN0LCBDb2RlY1Egc3BhdGlhbFF1YWxpdHksIENvZGVjUSB0ZW1wb3JhbFF1YWxpdHksIHVuc2lnbmVkIGxvbmcgY29tcHJlc3NUaW1lKSIpfSwKKyAgICB7IlZEU2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9WRFNldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IGNpLCBsb25nIHByZWZlcnJlZFBhY2tldFNpemVJbkJ5dGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9WRFNldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgd2lkdGgsIGxvbmcgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucyIsIChQeUNGdW5jdGlvbilRdF9WREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHdpZHRoLCBsb25nIGhlaWdodCkiKX0sCisgICAgeyJWREdldElucHV0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9WREdldElucHV0TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIGxvbmcgdmlkZW9JbnB1dCwgU3RyMjU1IG5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZEU2V0RGVzdGluYXRpb25Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1ZEU2V0RGVzdGluYXRpb25Qb3J0LCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgQ0dyYWZQdHIgZGVzdFBvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlZER2V0RGV2aWNlTmFtZUFuZEZsYWdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1ZER2V0RGV2aWNlTmFtZUFuZEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihWaWRlb0RpZ2l0aXplckNvbXBvbmVudCBjaSwgU3RyMjU1IG91dE5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgb3V0TmFtZUZsYWdzKSIpfSwKKyAgICB7IlZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmciLCAoUHlDRnVuY3Rpb24pUXRfVkRDYXB0dXJlU3RhdGVDaGFuZ2luZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoVmlkZW9EaWdpdGl6ZXJDb21wb25lbnQgY2ksIFVJbnQzMiBpblN0YXRlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlhNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlR2V0RGV0YWlsZWRQYXJzZUVycm9yLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBTdHJpbmdQdHIgZXJyRGVzYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZXJyb3JMaW5lKSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkRWxlbWVudCIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEVsZW1lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBuYW1lU3BhY2VJRCwgbG9uZyBlbGVtZW50RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGVsZW1lbnROYW1lLCBVSW50MzIgZWxlbWVudElEKSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkQXR0cmlidXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkQXR0cmlidXRlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgbmFtZVNwYWNlSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBjaGFyIGF0dHJpYnV0ZU5hbWUsIFVJbnQzMiBhdHRyaWJ1dGVJRCkiKX0sCisgICAgeyJYTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZE11bHRpcGxlQXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgVUludDMyIGVsZW1lbnRJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVJbnQzMiBuYW1lU3BhY2VJRHMsIGNoYXIgYXR0cmlidXRlTmFtZXMsIFVJbnQzMiBhdHRyaWJ1dGVJRHMpIil9LAorICAgIHsiWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9YTUxQYXJzZUFkZEF0dHJpYnV0ZUFuZFZhbHVlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyLCBVSW50MzIgZWxlbWVudElELCBVSW50MzIgbmFtZVNwYWNlSUQsIFVJbnQzMiBhdHRyaWJ1dGVWYWx1ZUtpbmQsIHZvaWQgKiBhdHRyaWJ1dGVWYWx1ZUtpbmRJbmZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBhdHRyaWJ1dGVOYW1lLCBVSW50MzIgYXR0cmlidXRlSUQpIil9LAorICAgIHsiWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQiLCAoUHlDRnVuY3Rpb24pUXRfWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBlbGVtZW50SUQsIFVJbnQzMiBhdHRyaWJ1dGVJRCwgVUludDMyIGF0dHJpYnV0ZVZhbHVlS2luZCwgdm9pZCAqIGF0dHJpYnV0ZVZhbHVlS2luZEluZm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlhNTFBhcnNlQWRkTmFtZVNwYWNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlQWRkTmFtZVNwYWNlLCAxLAorICAgICBQeURvY19TVFIoIihDb21wb25lbnRJbnN0YW5jZSBhUGFyc2VyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgY2hhciBuYW1lU3BhY2VVUkwsIFVJbnQzMiBuYW1lU3BhY2VJRCkiKX0sCisgICAgeyJYTUxQYXJzZVNldE9mZnNldEFuZExpbWl0IiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKENvbXBvbmVudEluc3RhbmNlIGFQYXJzZXIsIFVJbnQzMiBvZmZzZXQsIFVJbnQzMiBsaW1pdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiWE1MUGFyc2VTZXRFdmVudFBhcnNlUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1hNTFBhcnNlU2V0RXZlbnRQYXJzZVJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ29tcG9uZW50SW5zdGFuY2UgYVBhcnNlciwgbG9uZyByZWZjb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHSW5pdGlhbGl6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0luaXRpYWxpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXREYXRhT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RGF0YU91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBGU1NwZWMgbW92aWVGaWxlLCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0RGF0YU91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR0dldERhdGFPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRlNTcGVjIG1vdmllRmlsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgd2hlcmVGbGFncykiKX0sCisgICAgeyJTR1NldEdXb3JsZCIsIChQeUNGdW5jdGlvbilRdF9TR1NldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBDR3JhZlB0ciBncCwgR0RIYW5kbGUgZ2QpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0R1dvcmxkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0R1dvcmxkLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDR3JhZlB0ciBncCwgR0RIYW5kbGUgZ2QpIil9LAorICAgIHsiU0dOZXdDaGFubmVsIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHTmV3Q2hhbm5lbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBPU1R5cGUgY2hhbm5lbFR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgcmVmKSIpfSwKKyAgICB7IlNHRGlzcG9zZUNoYW5uZWwiLCAoUHlDRnVuY3Rpb24pUXRfU0dEaXNwb3NlQ2hhbm5lbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdGFydFByZXZpZXciLCAoUHlDRnVuY3Rpb24pUXRfU0dTdGFydFByZXZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdGFydFJlY29yZCIsIChQeUNGdW5jdGlvbilRdF9TR1N0YXJ0UmVjb3JkLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHSWRsZSIsIChQeUNGdW5jdGlvbilRdF9TR0lkbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTdG9wIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU3RvcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhdXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGF1c2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgQm9vbGVhbiBwYXVzZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQcmVwYXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUHJlcGFyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBCb29sZWFuIHByZXBhcmVGb3JQcmV2aWV3LCBCb29sZWFuIHByZXBhcmVGb3JSZWNvcmQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUmVsZWFzZSIsIChQeUNGdW5jdGlvbilRdF9TR1JlbGVhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRNb3ZpZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldE1vdmllLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChNb3ZpZSBfcnYpIil9LAorICAgIHsiU0dTZXRNYXhpbXVtUmVjb3JkVGltZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldE1heGltdW1SZWNvcmRUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIHVuc2lnbmVkIGxvbmcgdGlja3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0TWF4aW11bVJlY29yZFRpbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRNYXhpbXVtUmVjb3JkVGltZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyB0aWNrcykiKX0sCisgICAgeyJTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBieXRlcykiKX0sCisgICAgeyJTR0dldFRpbWVSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUaW1lUmVtYWluaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHRpY2tzTGVmdCkiKX0sCisgICAgeyJTR0dyYWJQaWN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR3JhYlBpY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgUmVjdCBib3VuZHMsIHNob3J0IG9mZnNjcmVlbkRlcHRoLCBsb25nIGdyYWJQaWN0RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBQaWNIYW5kbGUgcCkiKX0sCisgICAgeyJTR0dldExhc3RNb3ZpZVJlc0lEIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TGFzdE1vdmllUmVzSUQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHJlc0lEKSIpfSwKKyAgICB7IlNHU2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBsb25nIHNnRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRGbGFncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBzZ0ZsYWdzKSIpfSwKKyAgICB7IlNHTmV3Q2hhbm5lbEZyb21Db21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBDb21wb25lbnQgc2dDaGFubmVsQ29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dDaGFubmVsIG5ld0NoYW5uZWwpIil9LAorICAgIHsiU0dTZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFVzZXJEYXRhIHVkLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFVzZXJEYXRhIHVkKSIpfSwKKyAgICB7IlNHR2V0SW5kQ2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0dldEluZENoYW5uZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgc2hvcnQgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBTR0NoYW5uZWwgcmVmLCBPU1R5cGUgY2hhblR5cGUpIil9LAorICAgIHsiU0dVcGRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dVcGRhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgUmduSGFuZGxlIHVwZGF0ZVJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRQYXVzZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFBhdXNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHBhdXNlZCkiKX0sCisgICAgeyJTR1NldENoYW5uZWxTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxTZXR0aW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgVXNlckRhdGEgdWQsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFNldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBsb25nIGZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVXNlckRhdGEgdWQpIil9LAorICAgIHsiU0dHZXRNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBwcmV2aWV3TW9kZSwgQm9vbGVhbiByZWNvcmRNb2RlKSIpfSwKKyAgICB7IlNHU2V0RGF0YVJlZiIsIChQeUNGdW5jdGlvbilRdF9TR1NldERhdGFSZWYsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFSZWYiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhUmVmLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgZGF0YVJlZiwgT1NUeXBlIGRhdGFSZWZUeXBlLCBsb25nIHdoZXJlRmxhZ3MpIil9LAorICAgIHsiU0dOZXdPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dOZXdPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSwgbG9uZyB3aGVyZUZsYWdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU0dPdXRwdXQgc2dPdXQpIil9LAorICAgIHsiU0dEaXNwb3NlT3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHRGlzcG9zZU91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRPdXRwdXRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR1NldE91dHB1dEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0LCBsb25nIHdoZXJlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbE91dHB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxPdXRwdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmciLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgbG9uZyBzcGFjZSkiKX0sCisgICAgeyJTR0hhbmRsZVVwZGF0ZUV2ZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHSGFuZGxlVXBkYXRlRXZlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgRXZlbnRSZWNvcmQgZXZlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGhhbmRsZWQpIil9LAorICAgIHsiU0dTZXRPdXRwdXROZXh0T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0TmV4dE91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgU0dPdXRwdXQgbmV4dE91dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRPdXRwdXROZXh0T3V0cHV0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0T3V0cHV0TmV4dE91dHB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNHT3V0cHV0IG5leHRPdXQpIil9LAorICAgIHsiU0dTZXRPdXRwdXRNYXhpbXVtT2Zmc2V0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0T3V0cHV0TWF4aW11bU9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgd2lkZSBtYXhPZmZzZXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0T3V0cHV0TWF4aW11bU9mZnNldCIsIChQeUNGdW5jdGlvbilRdF9TR0dldE91dHB1dE1heGltdW1PZmZzZXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dPdXRwdXQgc2dPdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG1heE9mZnNldCkiKX0sCisgICAgeyJTR0dldE91dHB1dERhdGFSZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRPdXRwdXREYXRhUmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRhdGFSZWYsIE9TVHlwZSBkYXRhUmVmVHlwZSkiKX0sCisgICAgeyJTR1dyaXRlRXh0ZW5kZWRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZUV4dGVuZGVkTW92aWVEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBQdHIgcCwgbG9uZyBsZW4pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIG9mZnNldCwgU0dPdXRwdXQgc2dPdXQpIil9LAorICAgIHsiU0dHZXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NCIsIChQeUNGdW5jdGlvbilRdF9TR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB3aWRlIGJ5dGVzKSIpfSwKKyAgICB7IlNHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YU91dHB1dFN0b3JhZ2VTcGFjZVJlbWFpbmluZzY0LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHT3V0cHV0IHNnT3V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBzcGFjZSkiKX0sCisgICAgeyJTR1dyaXRlTW92aWVEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHV3JpdGVNb3ZpZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IlNHR2V0VGltZUJhc2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRUaW1lQmFzZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZUJhc2UgdGIpIil9LAorICAgIHsiU0dBZGRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRNb3ZpZURhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIFB0ciBwLCBsb25nIGxlbiwgbG9uZyBjaFJlZkNvbiwgVGltZVZhbHVlIHRpbWUsIHNob3J0IHdyaXRlVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IlNHQ2hhbmdlZFNvdXJjZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5nZWRTb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHQWRkRXh0ZW5kZWRNb3ZpZURhdGEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRFeHRlbmRlZE1vdmllRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYywgUHRyIHAsIGxvbmcgbGVuLCBsb25nIGNoUmVmQ29uLCBUaW1lVmFsdWUgdGltZSwgc2hvcnQgd3JpdGVUeXBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgd2lkZSBvZmZzZXQsIFNHT3V0cHV0IHdoaWNoT3V0cHV0KSIpfSwKKyAgICB7IlNHQWRkT3V0cHV0RGF0YVJlZlRvTWVkaWEiLCAoUHlDRnVuY3Rpb24pUXRfU0dBZGRPdXRwdXREYXRhUmVmVG9NZWRpYSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR091dHB1dCBzZ091dCwgTWVkaWEgdGhlTWVkaWEsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIGRlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0U2V0dGluZ3NTdW1tYXJ5IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U2V0dGluZ3NTdW1tYXJ5LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIEhhbmRsZSBzdW1tYXJ5VGV4dCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRDaGFubmVsVXNhZ2UiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsVXNhZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIHVzYWdlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENoYW5uZWxVc2FnZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxVc2FnZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHVzYWdlKSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbEJvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZWN0IGJvdW5kcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbEJvdW5kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSZWN0IGJvdW5kcykiKX0sCisgICAgeyJTR1NldENoYW5uZWxWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldENoYW5uZWxWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDaGFubmVsVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHZvbHVtZSkiKX0sCisgICAgeyJTR0dldENoYW5uZWxJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBjaGFubmVsSW5mbykiKX0sCisgICAgeyJTR1NldENoYW5uZWxQbGF5RmxhZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRDaGFubmVsUGxheUZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBwbGF5RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFBsYXlGbGFncyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxQbGF5RmxhZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBwbGF5RmxhZ3MpIil9LAorICAgIHsiU0dTZXRDaGFubmVsTWF4RnJhbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbE1heEZyYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgZnJhbWVDb3VudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsTWF4RnJhbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbE1heEZyYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGZyYW1lQ291bnQpIil9LAorICAgIHsiU0dTZXRDaGFubmVsUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENoYW5uZWxDbGlwIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q2hhbm5lbENsaXAsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBSZ25IYW5kbGUgdGhlQ2xpcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsQ2xpcCIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSB0aGVDbGlwKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFNhbXBsZURlc2NyaXB0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHNhbXBsZURlc2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbERldmljZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRDaGFubmVsVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lU2NhbGUgc2NhbGUpIil9LAorICAgIHsiU0dDaGFubmVsUHV0UGljdHVyZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxQdXRQaWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDaGFubmVsU2V0UmVxdWVzdGVkRGF0YVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBsb25nIGJ5dGVzUGVyU2Vjb25kKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXRSZXF1ZXN0ZWREYXRhUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGJ5dGVzUGVyU2Vjb25kKSIpfSwKKyAgICB7IlNHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbFNldERhdGFTb3VyY2VOYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG5hbWUsIFNjcmlwdENvZGUgc2NyaXB0VGFnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxHZXREYXRhU291cmNlTmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFN0cjI1NSBuYW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIil9LAorICAgIHsiU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR0NoYW5uZWxTZXRDb2RlY1NldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgSGFuZGxlIHNldHRpbmdzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0NoYW5uZWxHZXRDb2RlY1NldHRpbmdzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHNldHRpbmdzKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFRpbWVCYXNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0Q2hhbm5lbFRpbWVCYXNlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVCYXNlIHRiKSIpfSwKKyAgICB7IlNHR2V0Q2hhbm5lbFJlZkNvbiIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxSZWZDb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyByZWZDb24pIil9LAorICAgIHsiU0dHZXRDaGFubmVsRGV2aWNlQW5kSW5wdXROYW1lcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldENoYW5uZWxEZXZpY2VBbmRJbnB1dE5hbWVzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IG91dERldmljZU5hbWUsIFN0cjI1NSBvdXRJbnB1dE5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBvdXRJbnB1dE51bWJlcikiKX0sCisgICAgeyJTR1NldENoYW5uZWxEZXZpY2VJbnB1dCIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxEZXZpY2VJbnB1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGluSW5wdXROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZyIsIChQeUNGdW5jdGlvbilRdF9TR1NldENoYW5uZWxTZXR0aW5nc1N0YXRlQ2hhbmdpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBVSW50MzIgaW5GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dJbml0Q2hhbm5lbCIsIChQeUNGdW5jdGlvbilRdF9TR0luaXRDaGFubmVsLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU2VxR3JhYkNvbXBvbmVudCBvd25lcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dXcml0ZVNhbXBsZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dXcml0ZVNhbXBsZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBNb3ZpZSBtLCBBbGlhc0hhbmRsZSB0aGVGaWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldERhdGFSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0RGF0YVJhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBieXRlc1BlclNlY29uZCkiKX0sCisgICAgeyJTR0FsaWduQ2hhbm5lbFJlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dBbGlnbkNoYW5uZWxSZWN0LCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCisgICAgeyJTR1BhbmVsR2V0RGl0bCIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0RGl0bCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRpdGwpIil9LAorICAgIHsiU0dQYW5lbEdldFRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTdHIyNTUgdGl0bGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUGFuZWxDYW5SdW4iLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbENhblJ1biwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbEluc3RhbGwiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEluc3RhbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsRXZlbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEV2ZW50LCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBEaWFsb2dQdHIgZCwgc2hvcnQgaXRlbU9mZnNldCwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBpdGVtSGl0LCBCb29sZWFuIGhhbmRsZWQpIil9LAorICAgIHsiU0dQYW5lbEl0ZW0iLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbEl0ZW0sIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0LCBzaG9ydCBpdGVtTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsUmVtb3ZlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxSZW1vdmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIERpYWxvZ1B0ciBkLCBzaG9ydCBpdGVtT2Zmc2V0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsU2V0R3JhYmJlciIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0R3JhYmJlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBTZXFHcmFiQ29tcG9uZW50IHNnKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1BhbmVsU2V0UmVzRmlsZSIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsU2V0UmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzLCBzaG9ydCByZXNSZWYpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHUGFuZWxHZXRTZXR0aW5ncyIsIChQeUNGdW5jdGlvbilRdF9TR1BhbmVsR2V0U2V0dGluZ3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcywgU0dDaGFubmVsIGMsIGxvbmcgZmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVc2VyRGF0YSB1ZCkiKX0sCisgICAgeyJTR1BhbmVsU2V0U2V0dGluZ3MiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFNldFNldHRpbmdzLCAxLAorICAgICBQeURvY19TVFIoIihTZXFHcmFiQ29tcG9uZW50IHMsIFNHQ2hhbm5lbCBjLCBVc2VyRGF0YSB1ZCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dQYW5lbFZhbGlkYXRlSW5wdXQiLCAoUHlDRnVuY3Rpb24pUXRfU0dQYW5lbFZhbGlkYXRlSW5wdXQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNlcUdyYWJDb21wb25lbnQgcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gb2spIil9LAorICAgIHsiU0dQYW5lbEdldERJVExGb3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHUGFuZWxHZXRESVRMRm9yU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2VxR3JhYkNvbXBvbmVudCBzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGRpdGwsIFBvaW50IHJlcXVlc3RlZFNpemUpIil9LAorICAgIHsiU0dHZXRTcmNWaWRlb0JvdW5kcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNyY1ZpZGVvQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJlY3QgcikiKX0sCisgICAgeyJTR1NldFZpZGVvUmVjdCIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvUmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIFJlY3QgcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRWaWRlb1JlY3QiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCByKSIpfSwKKyAgICB7IlNHR2V0VmlkZW9Db21wcmVzc29yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFZpZGVvQ29tcHJlc3NvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgT1NUeXBlIGNvbXByZXNzb3JUeXBlKSIpfSwKKyAgICB7IlNHU2V0VmlkZW9Db21wcmVzc29yVHlwZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFZpZGVvQ29tcHJlc3NvclR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBPU1R5cGUgY29tcHJlc3NvclR5cGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0VmlkZW9Db21wcmVzc29yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VmlkZW9Db21wcmVzc29yLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZGVwdGgsIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRWaWRlb0NvbXByZXNzb3IiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRWaWRlb0NvbXByZXNzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgc2hvcnQgZGVwdGgsIENvbXByZXNzb3JDb21wb25lbnQgY29tcHJlc3NvciwgQ29kZWNRIHNwYXRpYWxRdWFsaXR5LCBDb2RlY1EgdGVtcG9yYWxRdWFsaXR5LCBsb25nIGtleUZyYW1lUmF0ZSkiKX0sCisgICAgeyJTR0dldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50SW5zdGFuY2UgX3J2KSIpfSwKKyAgICB7IlNHU2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRWaWRlb0RpZ2l0aXplckNvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIENvbXBvbmVudEluc3RhbmNlIHZkaWcpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHVmlkZW9EaWdpdGl6ZXJDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHcmFiRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiRnJhbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBidWZmZXJOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR3JhYkZyYW1lQ29tcGxldGUiLCAoUHlDRnVuY3Rpb24pUXRfU0dHcmFiRnJhbWVDb21wbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZG9uZSkiKX0sCisgICAgeyJTR0NvbXByZXNzRnJhbWUiLCAoUHlDRnVuY3Rpb24pUXRfU0dDb21wcmVzc0ZyYW1lLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgYnVmZmVyTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR1NldENvbXByZXNzQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Q29tcHJlc3NCdWZmZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBkZXB0aCwgUmVjdCBjb21wcmVzc1NpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0Q29tcHJlc3NCdWZmZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dHZXRDb21wcmVzc0J1ZmZlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBkZXB0aCwgUmVjdCBjb21wcmVzc1NpemUpIil9LAorICAgIHsiU0dHZXRCdWZmZXJJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0QnVmZmVySW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIHNob3J0IGJ1ZmZlck51bSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFBpeE1hcEhhbmRsZSBidWZmZXJQTSwgUmVjdCBidWZmZXJSZWN0LCBHV29ybGRQdHIgY29tcHJlc3NCdWZmZXIsIFJlY3QgY29tcHJlc3NCdWZmZXJSZWN0KSIpfSwKKyAgICB7IlNHU2V0VXNlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VXNlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgQm9vbGVhbiB1c2VTY3JlZW5CdWZmZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0VXNlU2NyZWVuQnVmZmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VXNlU2NyZWVuQnVmZmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdXNlU2NyZWVuQnVmZmVyKSIpfSwKKyAgICB7IlNHU2V0RnJhbWVSYXRlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0RnJhbWVSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgRml4ZWQgZnJhbWVSYXRlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldEZyYW1lUmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldEZyYW1lUmF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBGaXhlZCBmcmFtZVJhdGUpIil9LAorICAgIHsiU0dTZXRQcmVmZXJyZWRQYWNrZXRTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0UHJlZmVycmVkUGFja2V0U2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIGxvbmcgcHJlZmVycmVkUGFja2V0U2l6ZUluQnl0ZXMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0UHJlZmVycmVkUGFja2V0U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFByZWZlcnJlZFBhY2tldFNpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBwcmVmZXJyZWRQYWNrZXRTaXplSW5CeXRlcykiKX0sCisgICAgeyJTR1NldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBIYW5kbGUgY29tcHJlc3NvclR5cGVzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGNvbXByZXNzb3JUeXBlcykiKX0sCisgICAgeyJTR1NldFNvdW5kSW5wdXREcml2ZXIiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRTb3VuZElucHV0RHJpdmVyLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgU3RyMjU1IGRyaXZlck5hbWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHR2V0U291bmRJbnB1dERyaXZlciIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXREcml2ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9TR1NvdW5kSW5wdXREcml2ZXJDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRTb3VuZFJlY29yZENodW5rU2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kUmVjb3JkQ2h1bmtTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgbG9uZyBzZWNvbmRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0U291bmRSZWNvcmRDaHVua1NpemUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU0dTZXRTb3VuZElucHV0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFNvdW5kSW5wdXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRTb3VuZElucHV0UmF0ZSIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKEZpeGVkIF9ydikiKX0sCisgICAgeyJTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0U291bmRJbnB1dFBhcmFtZXRlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCBzYW1wbGVTaXplLCBzaG9ydCBudW1DaGFubmVscywgT1NUeXBlIGNvbXByZXNzaW9uVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRTb3VuZElucHV0UGFyYW1ldGVycyIsIChQeUNGdW5jdGlvbilRdF9TR0dldFNvdW5kSW5wdXRQYXJhbWV0ZXJzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHNhbXBsZVNpemUsIHNob3J0IG51bUNoYW5uZWxzLCBPU1R5cGUgY29tcHJlc3Npb25UeXBlKSIpfSwKKyAgICB7IlNHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXMiLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRBZGRpdGlvbmFsU291bmRSYXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMsIEhhbmRsZSByYXRlcykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRBZGRpdGlvbmFsU291bmRSYXRlcyIsIChQeUNGdW5jdGlvbilRdF9TR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEhhbmRsZSByYXRlcykiKX0sCisgICAgeyJTR1NldEZvbnROYW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0Rm9udE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBTdHJpbmdQdHIgcHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dTZXRGb250U2l6ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldEZvbnRTaXplLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQgZm9udFNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlNHU2V0VGV4dEZvcmVDb2xvciIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRGb3JlQ29sb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUkdCQ29sb3IgdGhlQ29sb3IpIil9LAorICAgIHsiU0dTZXRUZXh0QmFja0NvbG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHU2V0VGV4dEJhY2tDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBSR0JDb2xvciB0aGVDb2xvcikiKX0sCisgICAgeyJTR1NldEp1c3RpZmljYXRpb24iLCAoUHlDRnVuY3Rpb24pUXRfU0dTZXRKdXN0aWZpY2F0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihTR0NoYW5uZWwgYywgc2hvcnQganVzdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiU0dHZXRUZXh0UmV0dXJuVG9TcGFjZVZhbHVlIiwgKFB5Q0Z1bmN0aW9uKVF0X1NHR2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0dDaGFubmVsIGMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCByZXR0b3NwYWNlKSIpfSwKKyAgICB7IlNHU2V0VGV4dFJldHVyblRvU3BhY2VWYWx1ZSIsIChQeUNGdW5jdGlvbilRdF9TR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFNHQ2hhbm5lbCBjLCBzaG9ydCByZXR0b3NwYWNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0Q3VycmVudENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBTdHIyNTUgc3RyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0U2V0Q2xpZW50TmFtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgU3RyMjU1IHN0cikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldENsaWVudE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIFN0cjI1NSBzdHIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRCZWdpbiIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0QmVnaW4sIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRFbmQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEVuZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRWaWRlb091dHB1dFNldERpc3BsYXlNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXREaXNwbGF5TW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgbG9uZyBkaXNwbGF5TW9kZUlEKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGUiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldERpc3BsYXlNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBkaXNwbGF5TW9kZUlEKSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRHZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEdXb3JsZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdXb3JsZFB0ciBndykiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0SW5kU291bmRPdXRwdXQiLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0LCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBsb25nIGluZGV4KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50IG91dHB1dENvbXBvbmVudCkiKX0sCisgICAgeyJRVFZpZGVvT3V0cHV0R2V0Q2xvY2siLCAoUHlDRnVuY3Rpb24pUXRfUVRWaWRlb091dHB1dEdldENsb2NrLCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQ29tcG9uZW50SW5zdGFuY2UgY2xvY2spIil9LAorICAgIHsiUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVF0X1FUVmlkZW9PdXRwdXRTZXRFY2hvUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRWaWRlb091dHB1dENvbXBvbmVudCB2bywgQ0dyYWZQdHIgZWNob1BvcnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlFUVmlkZW9PdXRwdXRHZXRJbmRJbWFnZURlY29tcHJlc3NvciIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0R2V0SW5kSW1hZ2VEZWNvbXByZXNzb3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFFUVmlkZW9PdXRwdXRDb21wb25lbnQgdm8sIGxvbmcgaW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBDb21wb25lbnQgY29kZWMpIil9LAorICAgIHsiUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVFZpZGVvT3V0cHV0QmFzZVNldEVjaG9Qb3J0LCAxLAorICAgICBQeURvY19TVFIoIihRVFZpZGVvT3V0cHV0Q29tcG9uZW50IHZvLCBDR3JhZlB0ciBlY2hvUG9ydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRDaHVua01hbmFnZW1lbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldENodW5rTWFuYWdlbWVudEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFVJbnQzMiBmbGFncywgVUludDMyIGZsYWdzTWFzaykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRDaHVua01hbmFnZW1lbnRGbGFncyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBVSW50MzIgZmxhZ3MpIil9LAorICAgIHsiTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNpemUgYWxsb3dhbmNlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFB1cmdlYWJsZUNodW5rTWVtb3J5QWxsb3dhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFNpemUgYWxsb3dhbmNlKSIpfSwKKyAgICB7Ik1lZGlhRW1wdHlBbGxQdXJnZWFibGVDaHVua3MiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFFbXB0eUFsbFB1cmdlYWJsZUNodW5rcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldEhhbmRsZXJDYXBhYmlsaXRpZXMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgZmxhZ3MsIGxvbmcgZmxhZ3NNYXNrKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUlkbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFJZGxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSwgbG9uZyBmbGFnc0luLCBUaW1lUmVjb3JkIG1vdmllVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgZmxhZ3NPdXQpIil9LAorICAgIHsiTWVkaWFHZXRNZWRpYUluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRNZWRpYUluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhUHV0TWVkaWFJbmZvIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHV0TWVkaWFJbmZvLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEhhbmRsZSBoKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldEFjdGl2ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEFjdGl2ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGVuYWJsZU1lZGlhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldFJhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRSYXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR0dldFN0YXR1cyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdHZXRTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudFJlc3VsdCBzdGF0dXNFcnIpIil9LAorICAgIHsiTWVkaWFUcmFja0VkaXRlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrRWRpdGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0TWVkaWFUaW1lU2NhbGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRNZWRpYVRpbWVTY2FsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lU2NhbGUgbmV3VGltZVNjYWxlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldE1vdmllVGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0TW92aWVUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgVGltZVNjYWxlIG5ld1RpbWVTY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXRHV29ybGQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRHV29ybGQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgQ0dyYWZQdHIgYVBvcnQsIEdESGFuZGxlIGFHRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTZXREaW1lbnNpb25zIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0RGltZW5zaW9ucywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBGaXhlZCB3aWR0aCwgRml4ZWQgaGVpZ2h0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVNldENsaXAiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRDbGlwLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSB0aGVDbGlwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFRyYWNrT3BhcXVlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VHJhY2tPcGFxdWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gdHJhY2tJc09wYXF1ZSkiKX0sCisgICAgeyJNZWRpYVNldEdyYXBoaWNzTW9kZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEdyYXBoaWNzTW9kZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIG1vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0R3JhcGhpY3NNb2RlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0R3JhcGhpY3NNb2RlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1vZGUsIFJHQkNvbG9yIG9wQ29sb3IpIil9LAorICAgIHsiTWVkaWFHU2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCB2b2x1bWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGJhbGFuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0U291bmRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBzaG9ydCBiYWxhbmNlKSIpfSwKKyAgICB7Ik1lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5leHRCb3VuZHNDaGFuZ2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFRpbWVWYWx1ZSB3aGVuKSIpfSwKKyAgICB7Ik1lZGlhR2V0U3JjUmduIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U3JjUmduLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFJnbkhhbmRsZSByZ24sIFRpbWVWYWx1ZSBhdE1lZGlhVGltZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFQcmVyb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHJlcm9sbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgdGltZSwgRml4ZWQgcmF0ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFIYXNDaGFyYWN0ZXJpc3RpYyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUhhc0NoYXJhY3RlcmlzdGljLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE9TVHlwZSBjaGFyYWN0ZXJpc3RpYykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaGFzSXQpIil9LAorICAgIHsiTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0T2Zmc2NyZWVuQnVmZmVyU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBzaG9ydCBkZXB0aCwgQ1RhYkhhbmRsZSBjdGFiKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgUmVjdCBib3VuZHMpIil9LAorICAgIHsiTWVkaWFTZXRIaW50cyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldEhpbnRzLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgaGludHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgU3RyMjU1IG5hbWUsIGxvbmcgcmVxdWVzdGVkTGFuZ3VhZ2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIGFjdHVhbExhbmd1YWdlKSIpfSwKKyAgICB7Ik1lZGlhRm9yY2VVcGRhdGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFGb3JjZVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZvcmNlVXBkYXRlRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0RHJhd2luZ1JnbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldERyYXdpbmdSZ24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIFJnbkhhbmRsZSBwYXJ0aWFsUmduKSIpfSwKKyAgICB7Ik1lZGlhR1NldEFjdGl2ZVNlZ21lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHU2V0QWN0aXZlU2VnbWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBUaW1lVmFsdWUgYWN0aXZlU3RhcnQsIFRpbWVWYWx1ZSBhY3RpdmVEdXJhdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFJbnZhbGlkYXRlUmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSW52YWxpZGF0ZVJlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBSZ25IYW5kbGUgaW52YWxSZ24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0TmV4dFN0ZXBUaW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0TmV4dFN0ZXBUaW1lLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGZsYWdzLCBUaW1lVmFsdWUgbWVkaWFUaW1lSW4sIEZpeGVkIHJhdGUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lVmFsdWUgbWVkaWFUaW1lT3V0KSIpfSwKKyAgICB7Ik1lZGlhQ2hhbmdlZE5vblByaW1hcnlTb3VyY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGlucHV0SW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRyYWNrUmVmZXJlbmNlc0NoYW5nZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFSZWxlYXNlU2FtcGxlRGF0YVBvaW50ZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBzYW1wbGVOdW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0VmlkZW9QYXJhbSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFZpZGVvUGFyYW0sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyB3aGljaFBhcmFtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgdW5zaWduZWQgc2hvcnQgdmFsdWUpIil9LAorICAgIHsiTWVkaWFHZXRWaWRlb1BhcmFtIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0VmlkZW9QYXJhbSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIHdoaWNoUGFyYW0pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkiKX0sCisgICAgeyJNZWRpYUNvbXBhcmUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFDb21wYXJlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIE1lZGlhIHNyY01lZGlhLCBDb21wb25lbnRJbnN0YW5jZSBzcmNNZWRpYUNvbXBvbmVudCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gaXNPSykiKX0sCisgICAgeyJNZWRpYUdldENsb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0Q2xvY2ssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudEluc3RhbmNlIGNsb2NrKSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZE91dHB1dENvbXBvbmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBDb21wb25lbnQgb3V0cHV0Q29tcG9uZW50KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR2V0U291bmRPdXRwdXRDb21wb25lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIENvbXBvbmVudCBvdXRwdXRDb21wb25lbnQpIil9LAorICAgIHsiTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGEsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgSGFuZGxlIGRhdGEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0SW52YWxpZFJlZ2lvbiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEludmFsaWRSZWdpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUmduSGFuZGxlIHJnbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkIyTiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQiIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNhbXBsZURlc2NyaXB0aW9uTjJCLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIFNhbXBsZURlc2NyaXB0aW9uSGFuZGxlIHNhbXBsZURlc2NyaXB0aW9uSCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFGbHVzaE5vblByaW1hcnlTb3VyY2VEYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGlucHV0SW5kZXgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0VVJMTGluayIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFVSTExpbmssIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgUG9pbnQgZGlzcGxheVdoZXJlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHVybExpbmspIil9LAorICAgIHsiTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhSGl0VGVzdEZvclRhcmdldFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHRhcmdldFJlZkNvbikiKX0sCisgICAgeyJNZWRpYUhpdFRlc3RUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgdGFyZ2V0UmVmQ29uLCBsb25nIGZsYWdzLCBQb2ludCBsb2MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIHdhc0hpdCkiKX0sCisgICAgeyJNZWRpYURpc3Bvc2VUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFEaXNwb3NlVGFyZ2V0UmVmQ29uLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgdGFyZ2V0UmVmQ29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVRhcmdldFJlZkNvbnNFcXVhbCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRhcmdldFJlZkNvbnNFcXVhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIGZpcnN0UmVmQ29uLCBsb25nIHNlY29uZFJlZkNvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEJvb2xlYW4gZXF1YWwpIil9LAorICAgIHsiTWVkaWFQcmVQcmVyb2xsQ2FuY2VsIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUHJlUHJlcm9sbENhbmNlbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCB2b2lkICogcmVmY29uKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUVudGVyRW1wdHlFZGl0IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhRW50ZXJFbXB0eUVkaXQsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFDdXJyZW50TWVkaWFRdWV1ZWREYXRhIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhQ3VycmVudE1lZGlhUXVldWVkRGF0YSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBtaWxsaVNlY3MpIil9LAorICAgIHsiTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFZmZlY3RpdmVWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IHZvbHVtZSkiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kTGV2ZWxNZXRlcmluZ0VuYWJsZWQiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBCb29sZWFuIGVuYWJsZWQpIil9LAorICAgIHsiTWVkaWFTZXRTb3VuZExldmVsTWV0ZXJpbmdFbmFibGVkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGVuYWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRFZmZlY3RpdmVTb3VuZEJhbGFuY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhbGFuY2UpIil9LAorICAgIHsiTWVkaWFTZXRTY3JlZW5Mb2NrIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U2NyZWVuTG9jaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBCb29sZWFuIGxvY2tJdCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRFcnJvclN0cmluZyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldEVycm9yU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudFJlc3VsdCB0aGVFcnJvciwgU3RyMjU1IGVycm9yU3RyaW5nKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFNvdW5kRXF1YWxpemVyQmFuZExldmVscywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVUludDggYmFuZExldmVscykiKX0sCisgICAgeyJNZWRpYURvSWRsZUFjdGlvbnMiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFEb0lkbGVBY3Rpb25zLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhU2V0U291bmRCYXNzQW5kVHJlYmxlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIHNob3J0IGJhc3MsIHNob3J0IHRyZWJsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUiLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFHZXRTb3VuZEJhc3NBbmRUcmVibGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHNob3J0IGJhc3MsIHNob3J0IHRyZWJsZSkiKX0sCisgICAgeyJNZWRpYVRpbWVCYXNlQ2hhbmdlZCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVRpbWVCYXNlQ2hhbmdlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYU1DSXNQbGF5ZXJFdmVudCIsIChQeUNGdW5jdGlvbilRdF9NZWRpYU1DSXNQbGF5ZXJFdmVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBFdmVudFJlY29yZCBlKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgQm9vbGVhbiBoYW5kbGVkSXQpIil9LAorICAgIHsiTWVkaWFHZXRNZWRpYUxvYWRTdGF0ZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldE1lZGlhTG9hZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIG1lZGlhTG9hZFN0YXRlKSIpfSwKKyAgICB7Ik1lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhVmlkZW9PdXRwdXRDaGFuZ2VkLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIENvbXBvbmVudEluc3RhbmNlIHZvdXQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhRW1wdHlTYW1wbGVDYWNoZSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUVtcHR5U2FtcGxlQ2FjaGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyBzYW1wbGVOdW0sIGxvbmcgc2FtcGxlQ291bnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhR2V0UHVibGljSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdldFB1YmxpY0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgU2l6ZSBpb0RhdGFTaXplKSIpfSwKKyAgICB7Ik1lZGlhU2V0UHVibGljSW5mbyIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVNldFB1YmxpY0luZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgT1NUeXBlIGluZm9TZWxlY3Rvciwgdm9pZCAqIGluZm9EYXRhUHRyLCBTaXplIGRhdGFTaXplKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNZWRpYVJlZkNvblNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhUmVmQ29uU2V0UHJvcGVydHksIDEsCisgICAgIFB5RG9jX1NUUigiKE1lZGlhSGFuZGxlciBtaCwgbG9uZyByZWZDb24sIGxvbmcgcHJvcGVydHlUeXBlLCB2b2lkICogcHJvcGVydHlWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTWVkaWFSZWZDb25HZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilRdF9NZWRpYVJlZkNvbkdldFByb3BlcnR5LCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIGxvbmcgcmVmQ29uLCBsb25nIHByb3BlcnR5VHlwZSwgdm9pZCAqIHByb3BlcnR5VmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik1lZGlhTmF2aWdhdGVUYXJnZXRSZWZDb24iLCAoUHlDRnVuY3Rpb24pUXRfTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oLCBsb25nIG5hdmlnYXRpb24pIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHJlZkNvbikiKX0sCisgICAgeyJNZWRpYUdHZXRJZGxlTWFuYWdlciIsIChQeUNGdW5jdGlvbilRdF9NZWRpYUdHZXRJZGxlTWFuYWdlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTWVkaWFIYW5kbGVyIG1oKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSWRsZU1hbmFnZXIgcGltKSIpfSwKKyAgICB7Ik1lZGlhR1NldElkbGVNYW5hZ2VyIiwgKFB5Q0Z1bmN0aW9uKVF0X01lZGlhR1NldElkbGVNYW5hZ2VyLCAxLAorICAgICBQeURvY19TVFIoIihNZWRpYUhhbmRsZXIgbWgsIElkbGVNYW5hZ2VyIGltKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJRVE1JRElHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJR2V0TUlESVBvcnRzLCAxLAorICAgICBQeURvY19TVFIoIihRVE1JRElDb21wb25lbnQgY2kpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzLCBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0cykiKX0sCisgICAgeyJRVE1JRElVc2VTZW5kUG9ydCIsIChQeUNGdW5jdGlvbilRdF9RVE1JRElVc2VTZW5kUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUVRNSURJQ29tcG9uZW50IGNpLCBsb25nIHBvcnRJbmRleCwgbG9uZyBpblVzZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiUVRNSURJU2VuZE1JREkiLCAoUHlDRnVuY3Rpb24pUXRfUVRNSURJU2VuZE1JREksIDEsCisgICAgIFB5RG9jX1NUUigiKFFUTUlESUNvbXBvbmVudCBjaSwgbG9uZyBwb3J0SW5kZXgsIE11c2ljTUlESVBhY2tldCBtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0UGFydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgbWlkaUNoYW5uZWwsIGxvbmcgcG9seXBob255KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgbWlkaUNoYW5uZWwsIGxvbmcgcG9seXBob255KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1NldFBhcnRJbnN0cnVtZW50TnVtYmVyIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHBhcnQsIGxvbmcgaW5zdHJ1bWVudE51bWJlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0SW5zdHJ1bWVudE51bWJlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRJbnN0cnVtZW50TnVtYmVyLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1N0b3JlUGFydEluc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTdG9yZVBhcnRJbnN0cnVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydEF0b21pY0luc3RydW1lbnQiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEF0b21pY0luc3RydW1lbnQgYWkpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRBdG9taWNJbnN0cnVtZW50LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBBdG9taWNJbnN0cnVtZW50UHRyIGFpUCwgbG9uZyBmbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnRLbm9iLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGtub2JJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRLbm9iLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGtub2JJRCwgbG9uZyBrbm9iVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0S25vYiIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEtub2IsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIGtub2JJRCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRLbm9iIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0S25vYiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYklELCBsb25nIGtub2JWYWx1ZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZXRQYXJ0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldFBhcnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0TmFtZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnROYW1lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBTdHJpbmdQdHIgbmFtZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNQbGF5Tm90ZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1BsYXlOb3RlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIHBpdGNoLCBsb25nIHZlbG9jaXR5KSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1Jlc2V0UGFydCIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1Jlc2V0UGFydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRQYXJ0Q29udHJvbGxlciIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NldFBhcnRDb250cm9sbGVyLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBNdXNpY0NvbnRyb2xsZXIgY29udHJvbGxlck51bWJlciwgbG9uZyBjb250cm9sbGVyVmFsdWUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0UGFydENvbnRyb2xsZXIiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRQYXJ0Q29udHJvbGxlciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgcGFydCwgTXVzaWNDb250cm9sbGVyIGNvbnRyb2xsZXJOdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2V0SW5zdHJ1bWVudE5hbWVzIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5zdHJ1bWVudE5hbWVzLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtb2RpZmlhYmxlSW5zdHJ1bWVudHMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzLCBIYW5kbGUgaW5zdHJ1bWVudENhdGVnb3J5TGFzdHMsIEhhbmRsZSBpbnN0cnVtZW50Q2F0ZWdvcnlOYW1lcykiKX0sCisgICAgeyJNdXNpY0dldERydW1OYW1lcyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldERydW1OYW1lcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kaWZpYWJsZUluc3RydW1lbnRzKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIGluc3RydW1lbnROdW1iZXJzLCBIYW5kbGUgaW5zdHJ1bWVudE5hbWVzKSIpfSwKKyAgICB7Ik11c2ljR2V0TWFzdGVyVHVuZSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldE1hc3RlclR1bmUsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY1NldE1hc3RlclR1bmUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNTZXRNYXN0ZXJUdW5lLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBtYXN0ZXJUdW5lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldERldmljZUNvbm5lY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXREZXZpY2VDb25uZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIGxvbmcgaWQxLCBsb25nIGlkMikiKX0sCisgICAgeyJNdXNpY1VzZURldmljZUNvbm5lY3Rpb24iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNVc2VEZXZpY2VDb25uZWN0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBpZDEsIGxvbmcgaWQyKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dldEtub2JTZXR0aW5nU3RyaW5ncywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcga25vYkluZGV4LCBsb25nIGlzR2xvYmFsKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHNldHRpbmdzTmFtZXMsIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TGFzdHMsIEhhbmRsZSBzZXR0aW5nc0NhdGVnb3J5TmFtZXMpIil9LAorICAgIHsiTXVzaWNHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRNSURJUG9ydHMsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgbG9uZyBpbnB1dFBvcnRDb3VudCwgbG9uZyBvdXRwdXRQb3J0Q291bnQpIil9LAorICAgIHsiTXVzaWNTZW5kTUlESSIsIChQeUNGdW5jdGlvbilRdF9NdXNpY1NlbmRNSURJLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwb3J0SW5kZXgsIE11c2ljTUlESVBhY2tldCBtcCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNTZXRPZmZsaW5lVGltZVRvIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0T2ZmbGluZVRpbWVUbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbmV3VGltZVN0YW1wKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0dldEluZm9UZXh0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2V0SW5mb1RleHQsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBsb25nIHNlbGVjdG9yKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgSGFuZGxlIHRleHRILCBIYW5kbGUgc3R5bGVIKSIpfSwKKyAgICB7Ik11c2ljR2V0SW5zdHJ1bWVudEluZm8iLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNHZXRJbnN0cnVtZW50SW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgZ2V0SW5zdHJ1bWVudEluZm9GbGFncykgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEluc3RydW1lbnRJbmZvTGlzdEhhbmRsZSBpbmZvTGlzdEgpIil9LAorICAgIHsiTXVzaWNUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljVGFzaywgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBsb25nIGluc3RydW1lbnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljU2V0UGFydFNvdW5kTG9jYWxpemF0aW9uLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBwYXJ0LCBIYW5kbGUgZGF0YSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNHZW5lcmljQ29uZmlndXJlIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY0NvbmZpZ3VyZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTXVzaWNDb21wb25lbnQgbWMsIGxvbmcgbW9kZSwgbG9uZyBmbGFncywgbG9uZyBiYXNlUmVzSUQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljR2VuZXJpY0dldEtub2JMaXN0IiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljR2VuZXJpY0dldEtub2JMaXN0LCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgbG9uZyBrbm9iVHlwZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIEdlbmVyaWNLbm9iRGVzY3JpcHRpb25MaXN0SGFuZGxlIGdrZGxIKSIpfSwKKyAgICB7Ik11c2ljR2VuZXJpY1NldFJlc291cmNlTnVtYmVycyIsIChQeUNGdW5jdGlvbilRdF9NdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnMsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jLCBIYW5kbGUgcmVzb3VyY2VJREgpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7Ik11c2ljRGVyaXZlZE1JRElTZW5kIiwgKFB5Q0Z1bmN0aW9uKVF0X011c2ljRGVyaXZlZE1JRElTZW5kLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgTXVzaWNNSURJUGFja2V0IHBhY2tldCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkT3BlblJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKE11c2ljQ29tcG9uZW50IG1jKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJNdXNpY0Rlcml2ZWRDbG9zZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUXRfTXVzaWNEZXJpdmVkQ2xvc2VSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihNdXNpY0NvbXBvbmVudCBtYywgc2hvcnQgcmVzUmVmTnVtKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJOQVVucmVnaXN0ZXJNdXNpY0RldmljZSIsIChQeUNGdW5jdGlvbilRdF9OQVVucmVnaXN0ZXJNdXNpY0RldmljZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSwgbG9uZyBpbmRleCkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTkFTYXZlTXVzaWNDb25maWd1cmF0aW9uIiwgKFB5Q0Z1bmN0aW9uKVF0X05BU2F2ZU11c2ljQ29uZmlndXJhdGlvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoTm90ZUFsbG9jYXRvciBuYSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiTkFHZXRNSURJUG9ydHMiLCAoUHlDRnVuY3Rpb24pUXRfTkFHZXRNSURJUG9ydHMsIDEsCisgICAgIFB5RG9jX1NUUigiKE5vdGVBbGxvY2F0b3IgbmEpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBRVE1JRElQb3J0TGlzdEhhbmRsZSBpbnB1dFBvcnRzLCBRVE1JRElQb3J0TGlzdEhhbmRsZSBvdXRwdXRQb3J0cykiKX0sCisgICAgeyJOQVRhc2siLCAoUHlDRnVuY3Rpb24pUXRfTkFUYXNrLCAxLAorICAgICBQeURvY19TVFIoIihOb3RlQWxsb2NhdG9yIG5hKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0SGVhZGVyIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRIZWFkZXIsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIHVuc2lnbmVkIGxvbmcgKiBoZWFkZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXRUaW1lQmFzZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0VGltZUJhc2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBUaW1lQmFzZSB0YikiKX0sCisgICAgeyJUdW5lU2V0VGltZVNjYWxlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRUaW1lU2NhbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIFRpbWVTY2FsZSBzY2FsZSkgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZUdldFRpbWVTY2FsZSIsIChQeUNGdW5jdGlvbilRdF9UdW5lR2V0VGltZVNjYWxlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydiwgVGltZVNjYWxlIHNjYWxlKSIpfSwKKyAgICB7IlR1bmVJbnN0YW50IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVJbnN0YW50LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHR1bmVQb3NpdGlvbikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYsIHVuc2lnbmVkIGxvbmcgdHVuZSkiKX0sCisgICAgeyJUdW5lU3RvcCIsIChQeUNGdW5jdGlvbilRdF9UdW5lU3RvcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgbG9uZyBzdG9wRmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoVHVuZVBsYXllciB0cCwgRml4ZWQgdm9sdW1lKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lR2V0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRWb2x1bWUsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVQcmVyb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVQcmVyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lVW5yb2xsIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVVbnJvbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRQYXJ0VHJhbnNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRQYXJ0VHJhbnNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnQsIGxvbmcgdHJhbnNwb3NlLCBsb25nIHZlbG9jaXR5U2hpZnQpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXROb3RlQWxsb2NhdG9yIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXROb3RlQWxsb2NhdG9yLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwKSAtPiAoTm90ZUFsbG9jYXRvciBfcnYpIil9LAorICAgIHsiVHVuZVNldFNvZnRlciIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0U29mdGVyLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIHNvZnRlcikgLT4gKENvbXBvbmVudFJlc3VsdCBfcnYpIil9LAorICAgIHsiVHVuZVRhc2siLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVRhc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHApIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRCYWxhbmNlIiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRCYWxhbmNlLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCBsb25nIGJhbGFuY2UpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRTb3VuZExvY2FsaXphdGlvbiIsIChQeUNGdW5jdGlvbilRdF9UdW5lU2V0U291bmRMb2NhbGl6YXRpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKFR1bmVQbGF5ZXIgdHAsIEhhbmRsZSBkYXRhKSAtPiAoQ29tcG9uZW50UmVzdWx0IF9ydikiKX0sCisgICAgeyJUdW5lU2V0SGVhZGVyV2l0aFNpemUiLCAoUHlDRnVuY3Rpb24pUXRfVHVuZVNldEhlYWRlcldpdGhTaXplLCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nICogaGVhZGVyLCB1bnNpZ25lZCBsb25nIHNpemUpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVTZXRQYXJ0TWl4IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVTZXRQYXJ0TWl4LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXIsIGxvbmcgdm9sdW1lLCBsb25nIGJhbGFuY2UsIGxvbmcgbWl4RmxhZ3MpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2KSIpfSwKKyAgICB7IlR1bmVHZXRQYXJ0TWl4IiwgKFB5Q0Z1bmN0aW9uKVF0X1R1bmVHZXRQYXJ0TWl4LCAxLAorICAgICBQeURvY19TVFIoIihUdW5lUGxheWVyIHRwLCB1bnNpZ25lZCBsb25nIHBhcnROdW1iZXIpIC0+IChDb21wb25lbnRSZXN1bHQgX3J2LCBsb25nIHZvbHVtZU91dCwgbG9uZyBiYWxhbmNlT3V0LCBsb25nIG1peEZsYWdzT3V0KSIpfSwKKyAgICB7IkFsaWduV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVF0X0FsaWduV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgd3AsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJEcmFnQWxpZ25lZFdpbmRvdyIsIChQeUNGdW5jdGlvbilRdF9EcmFnQWxpZ25lZFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UHRyIHdwLCBQb2ludCBzdGFydFB0LCBSZWN0IGJvdW5kc1JlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZpZXNUYXNrIiwgKFB5Q0Z1bmN0aW9uKVF0X01vdmllc1Rhc2ssIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbWF4TWlsbGlTZWNUb1VzZSkgLT4gTm9uZSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0yODAwMCw5MCArMjgwMDAsOTAgQEAKIAogdm9pZCBpbml0X1F0KHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAKIAogCi0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUcmFjaywgVHJhY2tPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUcmFjaywgVHJhY2tPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZSwgTW92aWVPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZSwgTW92aWVPYmpfQ29udmVydCk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lZGlhLCBNZWRpYU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1lZGlhLCBNZWRpYU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVHJhY2ssIFRyYWNrT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUcmFjaywgVHJhY2tPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1vdmllLCBNb3ZpZU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTW92aWUsIE1vdmllT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUaW1lQmFzZSwgVGltZUJhc2VPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVXNlckRhdGEsIFVzZXJEYXRhT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChVc2VyRGF0YSwgVXNlckRhdGFPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1lZGlhLCBNZWRpYU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTWVkaWEsIE1lZGlhT2JqX0NvbnZlcnQpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfUXQiLCBRdF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1F0IiwgUXRfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JUXRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChRdF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFF0X0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JSWRsZU1hbmFnZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJklkbGVNYW5hZ2VyX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmSWRsZU1hbmFnZXJfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJJZGxlTWFuYWdlciIsIChQeU9iamVjdCAqKSZJZGxlTWFuYWdlcl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJklkbGVNYW5hZ2VyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiSWRsZU1hbmFnZXJUeXBlIiwgKFB5T2JqZWN0ICopJklkbGVNYW5hZ2VyX1R5cGUpOwotCU1vdmllQ29udHJvbGxlcl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmTW92aWVDb250cm9sbGVyX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTW92aWVDb250cm9sbGVyX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWVDb250cm9sbGVyIiwgKFB5T2JqZWN0ICopJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllQ29udHJvbGxlclR5cGUiLCAoUHlPYmplY3QgKikmTW92aWVDb250cm9sbGVyX1R5cGUpOwotCVRpbWVCYXNlX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUaW1lQmFzZV9UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlRpbWVCYXNlX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVGltZUJhc2UiLCAoUHlPYmplY3QgKikmVGltZUJhc2VfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZUaW1lQmFzZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRpbWVCYXNlVHlwZSIsIChQeU9iamVjdCAqKSZUaW1lQmFzZV9UeXBlKTsKLQlVc2VyRGF0YV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVXNlckRhdGFfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZVc2VyRGF0YV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlVzZXJEYXRhIiwgKFB5T2JqZWN0ICopJlVzZXJEYXRhX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVXNlckRhdGFfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVc2VyRGF0YVR5cGUiLCAoUHlPYmplY3QgKikmVXNlckRhdGFfVHlwZSk7Ci0JTWVkaWFfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJk1lZGlhX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmTWVkaWFfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZWRpYSIsIChQeU9iamVjdCAqKSZNZWRpYV9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJk1lZGlhX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVkaWFUeXBlIiwgKFB5T2JqZWN0ICopJk1lZGlhX1R5cGUpOwotCVRyYWNrX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZUcmFja19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJlRyYWNrX1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiVHJhY2siLCAoUHlPYmplY3QgKikmVHJhY2tfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZUcmFja19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRyYWNrVHlwZSIsIChQeU9iamVjdCAqKSZUcmFja19UeXBlKTsKLQlNb3ZpZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmTW92aWVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZNb3ZpZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllIiwgKFB5T2JqZWN0ICopJk1vdmllX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmTW92aWVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZVR5cGUiLCAoUHlPYmplY3QgKikmTW92aWVfVHlwZSk7Ci0JU0dPdXRwdXRfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJlNHT3V0cHV0X1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU0dPdXRwdXRfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTR091dHB1dCIsIChQeU9iamVjdCAqKSZTR091dHB1dF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNHT3V0cHV0X1R5cGUpOwotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0dPdXRwdXRUeXBlIiwgKFB5T2JqZWN0ICopJlNHT3V0cHV0X1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFF0X0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUXRfRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBRdF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIElkbGVNYW5hZ2VyX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZJZGxlTWFuYWdlcl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJklkbGVNYW5hZ2VyX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiSWRsZU1hbmFnZXIiLCAoUHlPYmplY3QgKikmSWRsZU1hbmFnZXJfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZJZGxlTWFuYWdlcl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIklkbGVNYW5hZ2VyVHlwZSIsIChQeU9iamVjdCAqKSZJZGxlTWFuYWdlcl9UeXBlKTsKKyAgICBNb3ZpZUNvbnRyb2xsZXJfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1vdmllQ29udHJvbGxlcl9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1vdmllQ29udHJvbGxlciIsIChQeU9iamVjdCAqKSZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZNb3ZpZUNvbnRyb2xsZXJfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZUNvbnRyb2xsZXJUeXBlIiwgKFB5T2JqZWN0ICopJk1vdmllQ29udHJvbGxlcl9UeXBlKTsKKyAgICBUaW1lQmFzZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVGltZUJhc2VfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZUaW1lQmFzZV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRpbWVCYXNlIiwgKFB5T2JqZWN0ICopJlRpbWVCYXNlX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmVGltZUJhc2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUaW1lQmFzZVR5cGUiLCAoUHlPYmplY3QgKikmVGltZUJhc2VfVHlwZSk7CisgICAgVXNlckRhdGFfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlVzZXJEYXRhX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVXNlckRhdGFfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJVc2VyRGF0YSIsIChQeU9iamVjdCAqKSZVc2VyRGF0YV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlVzZXJEYXRhX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVXNlckRhdGFUeXBlIiwgKFB5T2JqZWN0ICopJlVzZXJEYXRhX1R5cGUpOworICAgIE1lZGlhX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZNZWRpYV9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJk1lZGlhX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVkaWEiLCAoUHlPYmplY3QgKikmTWVkaWFfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZNZWRpYV9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lZGlhVHlwZSIsIChQeU9iamVjdCAqKSZNZWRpYV9UeXBlKTsKKyAgICBUcmFja19UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgaWYgKFB5VHlwZV9SZWFkeSgmVHJhY2tfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZUcmFja19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRyYWNrIiwgKFB5T2JqZWN0ICopJlRyYWNrX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmVHJhY2tfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJUcmFja1R5cGUiLCAoUHlPYmplY3QgKikmVHJhY2tfVHlwZSk7CisgICAgTW92aWVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJk1vdmllX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmTW92aWVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNb3ZpZSIsIChQeU9iamVjdCAqKSZNb3ZpZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJk1vdmllX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTW92aWVUeXBlIiwgKFB5T2JqZWN0ICopJk1vdmllX1R5cGUpOworICAgIFNHT3V0cHV0X1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTR091dHB1dF9UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJlNHT3V0cHV0X1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0dPdXRwdXQiLCAoUHlPYmplY3QgKikmU0dPdXRwdXRfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZTR091dHB1dF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNHT3V0cHV0VHlwZSIsIChQeU9iamVjdCAqKSZTR091dHB1dF9UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9yZXMvX1Jlc21vZHVsZS5jIGIvTWFjL01vZHVsZXMvcmVzL19SZXNtb2R1bGUuYwppbmRleCA4OWZkMDJjLi5mNTgyNGIxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9yZXMvX1Jlc21vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3Jlcy9fUmVzbW9kdWxlLmMKQEAgLTgsOSArOCw5IEBACiAKIC8qIE1hY3JvIHRvIHRlc3Qgd2hldGhlciBhIHdlYWstbG9hZGVkIENGTSBmdW5jdGlvbiBleGlzdHMgKi8KICNkZWZpbmUgUHlNYWNfUFJFQ0hFQ0socnRuKSBkbyB7IGlmICggJnJ0biA9PSBOVUxMICkgIHtcCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCi0gICAgICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCi0gICAgICAgIHJldHVybiBOVUxMOyBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKKyAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAorICAgIHJldHVybiBOVUxMOyBcCiAgICAgfX0gd2hpbGUoMCkKIAogCkBAIC0zMSw3ICszMSw3IEBACiBzdGF0aWMgdm9pZAogUHlNYWNfQXV0b0Rpc3Bvc2VIYW5kbGUoSGFuZGxlIGgpCiB7Ci0gICAgICAgIERpc3Bvc2VIYW5kbGUoaCk7CisgICAgRGlzcG9zZUhhbmRsZShoKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRXJyb3I7CkBAIC00Myw1MzEgKzQzLDUzMSBAQAogI2RlZmluZSBSZXNPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmUmVzb3VyY2VfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmUmVzb3VyY2VfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFJlc291cmNlT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JSGFuZGxlIG9iX2l0c2VsZjsKLQl2b2lkICgqb2JfZnJlZWl0KShIYW5kbGUgcHRyKTsKKyAgICBQeU9iamVjdF9IRUFECisgICAgSGFuZGxlIG9iX2l0c2VsZjsKKyAgICB2b2lkICgqb2JfZnJlZWl0KShIYW5kbGUgcHRyKTsKIH0gUmVzb3VyY2VPYmplY3Q7CiAKIFB5T2JqZWN0ICpSZXNPYmpfTmV3KEhhbmRsZSBpdHNlbGYpCiB7Ci0JUmVzb3VyY2VPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhSZXNvdXJjZU9iamVjdCwgJlJlc291cmNlX1R5cGUpOwotCWlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQlpdC0+b2JfaXRzZWxmID0gaXRzZWxmOwotCWl0LT5vYl9mcmVlaXQgPSBOVUxMOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBSZXNvdXJjZU9iamVjdCAqaXQ7CisgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOworICAgIGl0ID0gUHlPYmplY3RfTkVXKFJlc291cmNlT2JqZWN0LCAmUmVzb3VyY2VfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgaXQtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiBpbnQgUmVzT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFSZXNPYmpfQ2hlY2sodikpCi0JewotCQlQeU9iamVjdCAqdG1wOwotCQlpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkKLQkJewotCQkJKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXRtcCktPm9iX2l0c2VsZjsKLQkJCVB5X0RFQ1JFRih0bXApOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJUHlFcnJfQ2xlYXIoKTsKLQl9Ci0JaWYgKCFSZXNPYmpfQ2hlY2sodikpCi0JewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiUmVzb3VyY2UgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIGlmICghUmVzT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlPYmplY3QgKnRtcDsKKyAgICAgICAgaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7CisgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghUmVzT2JqX0NoZWNrKHYpKQorICAgIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgUmVzT2JqX2RlYWxsb2MoUmVzb3VyY2VPYmplY3QgKnNlbGYpCiB7Ci0JaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCi0JewotCQlzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsKLQl9Ci0Jc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQlzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOworICAgIGlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQorICAgIHsKKyAgICAgICAgc2VsZi0+b2JfZnJlZWl0KHNlbGYtPm9iX2l0c2VsZik7CisgICAgfQorICAgIHNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfSG9tZVJlc0ZpbGUoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBIb21lUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhvbWVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIb21lUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSG9tZVJlc0ZpbGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEhvbWVSZXNGaWxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9NYWNMb2FkUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgTWFjTG9hZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soTWFjTG9hZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNMb2FkUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCU1hY0xvYWRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY0xvYWRSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1JlbGVhc2VSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZWxlYXNlUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhSZWxlYXNlUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbGVhc2VSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVsZWFzZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUmVsZWFzZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfRGV0YWNoUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRGV0YWNoUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhEZXRhY2hSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRGV0YWNoUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURldGFjaFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRGV0YWNoUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXRSZXNBdHRycyhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFJlc0F0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzQXR0cnMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc0F0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRSZXNBdHRycyhfc2VsZi0+b2JfaXRzZWxmKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0UmVzQXR0cnMoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldFJlc0luZm8oUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHRoZUlEOwotCVJlc1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgdGhlSUQ7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBHZXRSZXNJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UmVzSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgJnRoZUlELAotCSAgICAgICAgICAgJnRoZVR5cGUsCi0JICAgICAgICAgICBuYW1lKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIHRoZUlELAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgJnRoZUlELAorICAgICAgICAgICAgICAgJnRoZVR5cGUsCisgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaE8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfU2V0UmVzSW5mbyhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgdGhlSUQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHRoZUlEOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBTZXRSZXNJbmZvCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzSW5mbyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UmVzSW5mbyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCVNldFJlc0luZm8oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIHRoZUlELAotCSAgICAgICAgICAgbmFtZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzSW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgdGhlSUQsCisgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0FkZFJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgdGhlSUQ7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCB0aGVJRDsKKyAgICBTdHIyNTUgbmFtZTsKICNpZm5kZWYgQWRkUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhBZGRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQWRkUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUFkZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgdGhlVHlwZSwKLQkgICAgICAgICAgICB0aGVJRCwKLQkgICAgICAgICAgICBuYW1lKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgbmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEFkZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgdGhlVHlwZSwKKyAgICAgICAgICAgICAgICB0aGVJRCwKKyAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldFJlc291cmNlU2l6ZU9uRGlzayhSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRSZXNvdXJjZVNpemVPbkRpc2sKLQlQeU1hY19QUkVDSEVDSyhHZXRSZXNvdXJjZVNpemVPbkRpc2spOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc291cmNlU2l6ZU9uRGlzayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UmVzb3VyY2VTaXplT25EaXNrKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNvdXJjZVNpemVPbkRpc2soX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0dldE1heFJlc291cmNlU2l6ZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OwogI2lmbmRlZiBHZXRNYXhSZXNvdXJjZVNpemUKLQlQeU1hY19QUkVDSEVDSyhHZXRNYXhSZXNvdXJjZVNpemUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldE1heFJlc291cmNlU2l6ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TWF4UmVzb3VyY2VTaXplKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRNYXhSZXNvdXJjZVNpemUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1NldFJlc0F0dHJzKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBhdHRyczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgYXR0cnM7CiAjaWZuZGVmIFNldFJlc0F0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzQXR0cnMpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJlc0F0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cnMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNBdHRycyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgIGF0dHJzKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRycykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFJlc0F0dHJzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgYXR0cnMpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfQ2hhbmdlZFJlc291cmNlKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENoYW5nZWRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKENoYW5nZWRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDaGFuZ2VkUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDaGFuZ2VkUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9SZW1vdmVSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBSZW1vdmVSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFJlbW92ZVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZW1vdmVSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JUmVtb3ZlUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBSZW1vdmVSZXNvdXJjZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX1dyaXRlUmVzb3VyY2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgV3JpdGVSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKFdyaXRlUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKFdyaXRlUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVdyaXRlUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBXcml0ZVJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfU2V0UmVzb3VyY2VTaXplKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIG5ld1NpemU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgbmV3U2l6ZTsKICNpZm5kZWYgU2V0UmVzb3VyY2VTaXplCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzb3VyY2VTaXplKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNvdXJjZVNpemUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZuZXdTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzb3VyY2VTaXplKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgIG5ld1NpemUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1NpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRSZXNvdXJjZVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgbmV3U2l6ZSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9HZXROZXh0Rk9ORChSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0TmV4dEZPTkQKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0Rk9ORCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dEZPTkQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHRGT05EKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dEZPTkQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiAjaWZuZGVmIF9fTFA2NF9fCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9hc19Db250cm9sKFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gQ3RsT2JqX05ldygoQ29udHJvbEhhbmRsZSlfc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gX3JlczsKKyAgICBfcmVzID0gQ3RsT2JqX05ldygoQ29udHJvbEhhbmRsZSlfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9hc19NZW51KFJlc291cmNlT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAKLQlfcmVzID0gTWVudU9ial9OZXcoKE1lbnVIYW5kbGUpX3NlbGYtPm9iX2l0c2VsZik7Ci0JcmV0dXJuIF9yZXM7CisgICAgX3JlcyA9IE1lbnVPYmpfTmV3KChNZW51SGFuZGxlKV9zZWxmLT5vYl9pdHNlbGYpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX0xvYWRSZXNvdXJjZShSZXNvdXJjZU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBMb2FkUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhMb2FkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKExvYWRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTG9hZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgTG9hZFJlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNPYmpfQXV0b0Rpc3Bvc2UoUmVzb3VyY2VPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWludCBvbm9mZiwgb2xkID0gMDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKLQkgICAgICAgIHJldHVybiBOVUxMOwotCWlmICggX3NlbGYtPm9iX2ZyZWVpdCApCi0JICAgICAgICBvbGQgPSAxOwotCWlmICggb25vZmYgKQotCSAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOwotCWVsc2UKLQkgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpbnQgb25vZmYsIG9sZCA9IDA7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZvbm9mZikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICggX3NlbGYtPm9iX2ZyZWVpdCApCisgICAgICAgIG9sZCA9IDE7CisgICAgaWYgKCBvbm9mZiApCisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKKyAgICBlbHNlCisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBOVUxMOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJpIiwgb2xkKTsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgUmVzT2JqX21ldGhvZHNbXSA9IHsKLQl7IkhvbWVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9Ib21lUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7Ik1hY0xvYWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfTWFjTG9hZFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZWxlYXNlUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1JlbGVhc2VSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiRGV0YWNoUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0RldGFjaFJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRSZXNBdHRycyIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJHZXRSZXNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXRSZXNJbmZvLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCB0aGVJRCwgUmVzVHlwZSB0aGVUeXBlLCBTdHIyNTUgbmFtZSkiKX0sCi0JeyJTZXRSZXNJbmZvIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9TZXRSZXNJbmZvLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB0aGVJRCwgU3RyMjU1IG5hbWUpIC0+IE5vbmUiKX0sCi0JeyJBZGRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfQWRkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQsIFN0cjI1NSBuYW1lKSAtPiBOb25lIil9LAotCXsiR2V0UmVzb3VyY2VTaXplT25EaXNrIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXRSZXNvdXJjZVNpemVPbkRpc2ssIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IkdldE1heFJlc291cmNlU2l6ZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0TWF4UmVzb3VyY2VTaXplLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRSZXNBdHRycyIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGF0dHJzKSAtPiBOb25lIil9LAotCXsiQ2hhbmdlZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9DaGFuZ2VkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlJlbW92ZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9SZW1vdmVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiV3JpdGVSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfV3JpdGVSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0UmVzb3VyY2VTaXplIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9TZXRSZXNvdXJjZVNpemUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbmV3U2l6ZSkgLT4gTm9uZSIpfSwKLQl7IkdldE5leHRGT05EIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9HZXROZXh0Rk9ORCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJIb21lUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfSG9tZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJNYWNMb2FkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX01hY0xvYWRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9SZWxlYXNlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkRldGFjaFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9EZXRhY2hSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0UmVzQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldFJlc0F0dHJzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiR2V0UmVzSW5mbyIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgdGhlSUQsIFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIil9LAorICAgIHsiU2V0UmVzSW5mbyIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdGhlSUQsIFN0cjI1NSBuYW1lKSAtPiBOb25lIil9LAorICAgIHsiQWRkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0FkZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlELCBTdHIyNTUgbmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFJlc291cmNlU2l6ZU9uRGlzayIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0UmVzb3VyY2VTaXplT25EaXNrLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRNYXhSZXNvdXJjZVNpemUiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0dldE1heFJlc291cmNlU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0UmVzQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1NldFJlc0F0dHJzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBhdHRycykgLT4gTm9uZSIpfSwKKyAgICB7IkNoYW5nZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfQ2hhbmdlZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJSZW1vdmVSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfUmVtb3ZlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IldyaXRlUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX1dyaXRlUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFJlc291cmNlU2l6ZSIsIChQeUNGdW5jdGlvbilSZXNPYmpfU2V0UmVzb3VyY2VTaXplLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIG5ld1NpemUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXROZXh0Rk9ORCIsIChQeUNGdW5jdGlvbilSZXNPYmpfR2V0TmV4dEZPTkQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfQ29udHJvbCwgMSwKLQkgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBDb250cm9sIil9LAotCXsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfTWVudSwgMSwKLQkgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBNZW51Iil9LAorICAgIHsiYXNfQ29udHJvbCIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfQ29udHJvbCwgMSwKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBDb250cm9sIil9LAorICAgIHsiYXNfTWVudSIsIChQeUNGdW5jdGlvbilSZXNPYmpfYXNfTWVudSwgMSwKKyAgICAgUHlEb2NfU1RSKCJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSBNZW51Iil9LAogI2VuZGlmIC8qICFfX0xQNjRfXyAqLwotCXsiTG9hZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9Mb2FkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVJlc09ial9BdXRvRGlzcG9zZSwgMSwKLQkgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCi0Je05VTEwsIE5VTEwsIDB9CisgICAgeyJMb2FkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0xvYWRSZXNvdXJjZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pUmVzT2JqX0F1dG9EaXNwb3NlLCAxLAorICAgICBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX2dldF9kYXRhKFJlc291cmNlT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewogCi0JICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKLQkgICAgICAgICAgICBjaGFyIHN0YXRlOworICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICAgICAgICAgICAgICBjaGFyIHN0YXRlOwogCi0JICAgICAgICAgICAgc3RhdGUgPSBIR2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIHJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCSAgICAgICAgICAgICAgICAgICAgKnNlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7Ci0JICAgICAgICAgICAgSFVubG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIEhTZXRTdGF0ZShzZWxmLT5vYl9pdHNlbGYsIHN0YXRlKTsKLQkgICAgICAgICAgICByZXR1cm4gcmVzOwotCSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEhHZXRTdGF0ZShzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgICAgICByZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgICAgICAgICAgICAgICAgIEhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgSFNldFN0YXRlKHNlbGYtPm9iX2l0c2VsZiwgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworCiB9CiAKIHN0YXRpYyBpbnQgUmVzT2JqX3NldF9kYXRhKFJlc291cmNlT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKIAotCSAgICAgICAgICAgIGNoYXIgKmRhdGE7Ci0JICAgICAgICAgICAgbG9uZyBzaXplOworICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhOworICAgICAgICAgICAgICAgICAgICBsb25nIHNpemU7CiAKLQkgICAgICAgICAgICBpZiAoIHYgPT0gTlVMTCApCi0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0JICAgICAgICAgICAgaWYgKCAhUHlTdHJpbmdfQ2hlY2sodikgKQotCSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCSAgICAgICAgICAgIHNpemUgPSBQeVN0cmluZ19TaXplKHYpOwotCSAgICAgICAgICAgIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKLQkgICAgICAgICAgICAvKiBYWFhYIERvIEkgbmVlZCB0aGUgR2V0U3RhdGUvU2V0U3RhdGUgY2FsbHM/ICovCi0JICAgICAgICAgICAgU2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYsIHNpemUpOwotCSAgICAgICAgICAgIGlmICggTWVtRXJyb3IoKSkKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQkgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCSAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSpzZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUpOwotCSAgICAgICAgICAgIEhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICAvKiBYWFhYIFNob3VsZCBJIGRvIHRoZSBDaGFuZ2VkIGNhbGwgaW1tZWRlYXRlbHk/ICovCi0JICAgICAgICAgICAgcmV0dXJuIDA7Ci0JICAgICAgICAgICAgCi0JcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIGlmICggdiA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIGlmICggIVB5U3RyaW5nX0NoZWNrKHYpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBQeVN0cmluZ19TaXplKHYpOworICAgICAgICAgICAgICAgICAgICBkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcodik7CisgICAgICAgICAgICAgICAgICAgIC8qIFhYWFggRG8gSSBuZWVkIHRoZSBHZXRTdGF0ZS9TZXRTdGF0ZSBjYWxscz8gKi8KKyAgICAgICAgICAgIFNldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKKyAgICAgICAgICAgIGlmICggTWVtRXJyb3IoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgbWVtY3B5KChjaGFyICopKnNlbGYtPm9iX2l0c2VsZiwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBIVW5sb2NrKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICAvKiBYWFhYIFNob3VsZCBJIGRvIHRoZSBDaGFuZ2VkIGNhbGwgaW1tZWRlYXRlbHk/ICovCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc09ial9nZXRfc2l6ZShSZXNvdXJjZU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsKKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsKIH0KIAogI2RlZmluZSBSZXNPYmpfc2V0X3NpemUgTlVMTAogCiBzdGF0aWMgUHlHZXRTZXREZWYgUmVzT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImRhdGEiLCAoZ2V0dGVyKVJlc09ial9nZXRfZGF0YSwgKHNldHRlcilSZXNPYmpfc2V0X2RhdGEsICJUaGUgcmVzb3VyY2UgZGF0YSJ9LAotCXsic2l6ZSIsIChnZXR0ZXIpUmVzT2JqX2dldF9zaXplLCAoc2V0dGVyKVJlc09ial9zZXRfc2l6ZSwgIlRoZSBsZW5ndGggb2YgdGhlIHJlc291cmNlIGRhdGEifSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJkYXRhIiwgKGdldHRlcilSZXNPYmpfZ2V0X2RhdGEsIChzZXR0ZXIpUmVzT2JqX3NldF9kYXRhLCAiVGhlIHJlc291cmNlIGRhdGEifSwKKyAgICB7InNpemUiLCAoZ2V0dGVyKVJlc09ial9nZXRfc2l6ZSwgKHNldHRlcilSZXNPYmpfc2V0X3NpemUsICJUaGUgbGVuZ3RoIG9mIHRoZSByZXNvdXJjZSBkYXRhIn0sCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAogfTsKIAogCkBAIC01NzgsODkgKzU3OCw4OSBAQAogI2RlZmluZSBSZXNPYmpfaGFzaCBOVUxMCiBzdGF0aWMgaW50IFJlc09ial90cF9pbml0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JY2hhciAqc3JjZGF0YSA9IE5VTEw7Ci0JaW50IHNyY2xlbiA9IDA7Ci0JSGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBjaGFyICpzcmNkYXRhID0gTlVMTDsKKyAgICBpbnQgc3JjbGVuID0gMDsKKyAgICBIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBSZXNPYmpfQ29udmVydCwgJml0c2VsZikpCi0JewotCQkoKFJlc291cmNlT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JCXJldHVybiAwOwotCX0KLQlQeUVycl9DbGVhcigpOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgInxzIyIsIGt3LCAmc3JjZGF0YSwgJnNyY2xlbikpIHJldHVybiAtMTsKLQlpZiAoKGl0c2VsZiA9IE5ld0hhbmRsZShzcmNsZW4pKSA9PSBOVUxMKQotCXsKLQkJUHlFcnJfTm9NZW1vcnkoKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSgoUmVzb3VyY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpZiAoc3JjbGVuICYmIHNyY2RhdGEpCi0JewotCQlITG9jayhpdHNlbGYpOwotCQltZW1jcHkoKml0c2VsZiwgc3JjZGF0YSwgc3JjbGVuKTsKLQkJSFVubG9jayhpdHNlbGYpOwotCX0KLQlyZXR1cm4gMDsKKyAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKF9hcmdzLCBfa3dkcywgIk8mIiwga3csIFJlc09ial9Db252ZXJ0LCAmaXRzZWxmKSkKKyAgICB7CisgICAgICAgICgoUmVzb3VyY2VPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAifHMjIiwga3csICZzcmNkYXRhLCAmc3JjbGVuKSkgcmV0dXJuIC0xOworICAgIGlmICgoaXRzZWxmID0gTmV3SGFuZGxlKHNyY2xlbikpID09IE5VTEwpCisgICAgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKChSZXNvdXJjZU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIGlmIChzcmNsZW4gJiYgc3JjZGF0YSkKKyAgICB7CisgICAgICAgIEhMb2NrKGl0c2VsZik7CisgICAgICAgIG1lbWNweSgqaXRzZWxmLCBzcmNkYXRhLCBzcmNsZW4pOworICAgICAgICBIVW5sb2NrKGl0c2VsZik7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIFJlc09ial90cF9hbGxvYyBQeVR5cGVfR2VuZXJpY0FsbG9jCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzT2JqX3RwX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpfYXJncywgUHlPYmplY3QgKl9rd2RzKQogewotCVB5T2JqZWN0ICpzZWxmOwotCWlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQkoKFJlc291cmNlT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Ci0JKChSZXNvdXJjZU9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBOVUxMOwotCXJldHVybiBzZWxmOworICAgIFB5T2JqZWN0ICpzZWxmOworICAgIGlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFJlc291cmNlT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7CisgICAgKChSZXNvdXJjZU9iamVjdCAqKXNlbGYpLT5vYl9mcmVlaXQgPSBOVUxMOworICAgIHJldHVybiBzZWxmOwogfQogCiAjZGVmaW5lIFJlc09ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBSZXNvdXJjZV9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9SZXMuUmVzb3VyY2UiLCAvKnRwX25hbWUqLwotCXNpemVvZihSZXNvdXJjZU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFJlc09ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBSZXNPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFJlc09ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgUmVzT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVJlc09ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlSZXNPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JUmVzT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlSZXNPYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JUmVzT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JUmVzT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfUmVzLlJlc291cmNlIiwgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoUmVzb3VyY2VPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBSZXNPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpMCwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpMCwgLyp0cF9zZXRhdHRyKi8KKyAgICAoY21wZnVuYykgUmVzT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBSZXNPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFJlc09ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIDAsIC8qdHBfY2FsbCovCisgICAgMCwgLyp0cF9zdHIqLworICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAvKnRwX2dldGF0dHJvKi8KKyAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwgLyp0cF9zZXRhdHRybyAqLworICAgIDAsIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFR8UHlfVFBGTEFHU19CQVNFVFlQRSwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBSZXNPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgUmVzT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIFJlc09ial90cF9pbml0LCAvKiB0cF9pbml0ICovCisgICAgUmVzT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFJlc09ial90cF9uZXcsIC8qIHRwX25ldyAqLworICAgIFJlc09ial90cF9mcmVlLCAvKiB0cF9mcmVlICovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgUmVzb3VyY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTY2OCwxMDI3ICs2NjgsMTAyNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19DbG9zZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgcmVmTnVtOwogI2lmbmRlZiBDbG9zZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhDbG9zZVJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKENsb3NlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCUNsb3NlUmVzRmlsZShyZWZOdW0pOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsb3NlUmVzRmlsZShyZWZOdW0pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfUmVzRXJyb3IoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFJlc0Vycm9yCi0JUHlNYWNfUFJFQ0hFQ0soUmVzRXJyb3IpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlc0Vycm9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzRXJyb3IoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0N1clJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OwogI2lmbmRlZiBDdXJSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soQ3VyUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3VyUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ3VyUmVzRmlsZSgpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDdXJSZXNGaWxlKCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1VzZVJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgcmVmTnVtOwogI2lmbmRlZiBVc2VSZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soVXNlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVXNlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCVVzZVJlc0ZpbGUocmVmTnVtKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBVc2VSZXNGaWxlKHJlZk51bSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19Db3VudFR5cGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgQ291bnRUeXBlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50VHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50VHlwZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IENvdW50VHlwZXMoKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnRUeXBlcygpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19Db3VudDFUeXBlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIENvdW50MVR5cGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ291bnQxVHlwZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50MVR5cGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudDFUeXBlcygpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudDFUeXBlcygpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRJbmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0SW5kVHlwZQotCVB5TWFjX1BSRUNIRUNLKEdldEluZFR5cGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEluZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCUdldEluZFR5cGUoJnRoZVR5cGUsCi0JICAgICAgICAgICBpbmRleCk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldEluZFR5cGUoJnRoZVR5cGUsCisgICAgICAgICAgICAgICBpbmRleCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgdGhlVHlwZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFJbmRUeXBlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0MUluZFR5cGUKLQlQeU1hY19QUkVDSEVDSyhHZXQxSW5kVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0MUluZFR5cGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbmRleCkpCi0JCXJldHVybiBOVUxMOwotCUdldDFJbmRUeXBlKCZ0aGVUeXBlLAotCSAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0MUluZFR5cGUoJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgaW5kZXgpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19TZXRSZXNMb2FkKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIGxvYWQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gbG9hZDsKICNpZm5kZWYgU2V0UmVzTG9hZAotCVB5TWFjX1BSRUNIRUNLKFNldFJlc0xvYWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFJlc0xvYWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZsb2FkKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0UmVzTG9hZChsb2FkKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsb2FkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzTG9hZChsb2FkKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0NvdW50UmVzb3VyY2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBDb3VudFJlc291cmNlcwotCVB5TWFjX1BSRUNIRUNLKENvdW50UmVzb3VyY2VzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb3VudFJlc291cmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudFJlc291cmNlcyh0aGVUeXBlKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBDb3VudFJlc291cmNlcyh0aGVUeXBlKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfQ291bnQxUmVzb3VyY2VzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBDb3VudDFSZXNvdXJjZXMKLQlQeU1hY19QUkVDSEVDSyhDb3VudDFSZXNvdXJjZXMpOworICAgIFB5TWFjX1BSRUNIRUNLKENvdW50MVJlc291cmNlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBDb3VudDFSZXNvdXJjZXModGhlVHlwZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ291bnQxUmVzb3VyY2VzKHRoZVR5cGUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRJbmRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgaW5kZXg7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IGluZGV4OwogI2lmbmRlZiBHZXRJbmRSZXNvdXJjZQotCVB5TWFjX1BSRUNIRUNLKEdldEluZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRJbmRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5kZXgpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRJbmRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0SW5kUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXQxSW5kUmVzb3VyY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUhhbmRsZSBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOwotCXNob3J0IGluZGV4OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OworICAgIFJlc1R5cGUgdGhlVHlwZTsKKyAgICBzaG9ydCBpbmRleDsKICNpZm5kZWYgR2V0MUluZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0MUluZFJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXQxSW5kUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0MUluZFJlc291cmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0MUluZFJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldFJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKLQlzaG9ydCB0aGVJRDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgc2hvcnQgdGhlSUQ7CiAjaWZuZGVmIEdldFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0UmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVJRCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFJlc291cmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgdGhlSUQpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNvdXJjZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHRoZUlEKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0Jc2hvcnQgdGhlSUQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIHNob3J0IHRoZUlEOwogI2lmbmRlZiBHZXQxUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhHZXQxUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldDFSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXQxUmVzb3VyY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgdGhlSUQpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhlSUQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXQxUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlSUQpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0TmFtZWRSZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKLQlSZXNUeXBlIHRoZVR5cGU7Ci0JU3RyMjU1IG5hbWU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEhhbmRsZSBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOworICAgIFN0cjI1NSBuYW1lOwogI2lmbmRlZiBHZXROYW1lZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0TmFtZWRSZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmFtZWRSZXNvdXJjZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmFtZWRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROYW1lZFJlc291cmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0dldDFOYW1lZFJlc291cmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OwotCVJlc1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKKyAgICBSZXNUeXBlIHRoZVR5cGU7CisgICAgU3RyMjU1IG5hbWU7CiAjaWZuZGVmIEdldDFOYW1lZFJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0MU5hbWVkUmVzb3VyY2UpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldDFOYW1lZFJlc291cmNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIG5hbWUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXQxTmFtZWRSZXNvdXJjZSh0aGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0MU5hbWVkUmVzb3VyY2UodGhlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX1VuaXF1ZUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBVbmlxdWVJRAotCVB5TWFjX1BSRUNIRUNLKFVuaXF1ZUlEKTsKKyAgICBQeU1hY19QUkVDSEVDSyhVbmlxdWVJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbmlxdWVJRCh0aGVUeXBlKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBVbmlxdWVJRCh0aGVUeXBlKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfVW5pcXVlMUlEKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUmVzVHlwZSB0aGVUeXBlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgUmVzVHlwZSB0aGVUeXBlOwogI2lmbmRlZiBVbmlxdWUxSUQKLQlQeU1hY19QUkVDSEVDSyhVbmlxdWUxSUQpOworICAgIFB5TWFjX1BSRUNIRUNLKFVuaXF1ZTFJRCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBVbmlxdWUxSUQodGhlVHlwZSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVW5pcXVlMUlEKHRoZVR5cGUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19VcGRhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHJlZk51bTsKICNpZm5kZWYgVXBkYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKFVwZGF0ZVJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFVwZGF0ZVJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlVcGRhdGVSZXNGaWxlKHJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVXBkYXRlUmVzRmlsZShyZWZOdW0pOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfU2V0UmVzUHVyZ2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gaW5zdGFsbDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBpbnN0YWxsOwogI2lmbmRlZiBTZXRSZXNQdXJnZQotCVB5TWFjX1BSRUNIRUNLKFNldFJlc1B1cmdlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNQdXJnZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluc3RhbGwpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNQdXJnZShpbnN0YWxsKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnN0YWxsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzUHVyZ2UoaW5zdGFsbCk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRSZXNGaWxlQXR0cnMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlzaG9ydCByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBzaG9ydCByZWZOdW07CiAjaWZuZGVmIEdldFJlc0ZpbGVBdHRycwotCVB5TWFjX1BSRUNIRUNLKEdldFJlc0ZpbGVBdHRycyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0UmVzRmlsZUF0dHJzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0UmVzRmlsZUF0dHJzKHJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRSZXNGaWxlQXR0cnMocmVmTnVtKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfU2V0UmVzRmlsZUF0dHJzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCByZWZOdW07Ci0Jc2hvcnQgYXR0cnM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IHJlZk51bTsKKyAgICBzaG9ydCBhdHRyczsKICNpZm5kZWYgU2V0UmVzRmlsZUF0dHJzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0UmVzRmlsZUF0dHJzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRSZXNGaWxlQXR0cnMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXR0cnMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRSZXNGaWxlQXR0cnMocmVmTnVtLAotCSAgICAgICAgICAgICAgICBhdHRycyk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UmVzRmlsZUF0dHJzKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpSZXNfT3BlblJGUGVybShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVN0cjI1NSBmaWxlTmFtZTsKLQlzaG9ydCB2UmVmTnVtOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIFNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKICNpZm5kZWYgT3BlblJGUGVybQotCVB5TWFjX1BSRUNIRUNLKE9wZW5SRlBlcm0pOworICAgIFB5TWFjX1BSRUNIRUNLKE9wZW5SRlBlcm0pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE9wZW5SRlBlcm0oZmlsZU5hbWUsCi0JICAgICAgICAgICAgICAgICB2UmVmTnVtLAotCSAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE9wZW5SRlBlcm0oZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICB2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hPcGVuUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCXNob3J0IHZSZWZOdW07Ci0JbG9uZyBkaXJJRDsKLQlTdHIyNTUgZmlsZU5hbWU7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgc2hvcnQgdlJlZk51bTsKKyAgICBsb25nIGRpcklEOworICAgIFN0cjI1NSBmaWxlTmFtZTsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb247CiAjaWZuZGVmIEhPcGVuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhPcGVuUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBIT3BlblJlc0ZpbGUodlJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLAotCSAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2UmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSE9wZW5SZXNGaWxlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgIGRpcklELAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hDcmVhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB2UmVmTnVtOwotCWxvbmcgZGlySUQ7Ci0JU3RyMjU1IGZpbGVOYW1lOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB2UmVmTnVtOworICAgIGxvbmcgZGlySUQ7CisgICAgU3RyMjU1IGZpbGVOYW1lOwogI2lmbmRlZiBIQ3JlYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEhDcmVhdGVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhIQ3JlYXRlUmVzRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCi0JCXJldHVybiBOVUxMOwotCUhDcmVhdGVSZXNGaWxlKHZSZWZOdW0sCi0JICAgICAgICAgICAgICAgZGlySUQsCi0JICAgICAgICAgICAgICAgZmlsZU5hbWUpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaXJJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBmaWxlTmFtZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhDcmVhdGVSZXNGaWxlKHZSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgZGlySUQsCisgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUpOworICAgIHsKKyAgICAgICAgT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgfQorICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlGU1NwZWMgc3BlYzsKLQlTaWduZWRCeXRlIHBlcm1pc3Npb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb247CiAjaWZuZGVmIEZTcE9wZW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRlNwT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTcE9wZW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRlNwT3BlblJlc0ZpbGUoJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGU3BPcGVuUmVzRmlsZSgmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwQ3JlYXRlUmVzRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JRlNTcGVjIHNwZWM7Ci0JT1NUeXBlIGNyZWF0b3I7Ci0JT1NUeXBlIGZpbGVUeXBlOwotCVNjcmlwdENvZGUgc2NyaXB0VGFnOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBGU1NwZWMgc3BlYzsKKyAgICBPU1R5cGUgY3JlYXRvcjsKKyAgICBPU1R5cGUgZmlsZVR5cGU7CisgICAgU2NyaXB0Q29kZSBzY3JpcHRUYWc7CiAjaWZuZGVmIEZTcENyZWF0ZVJlc0ZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU3BDcmVhdGVSZXNGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU3BDcmVhdGVSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1NwZWMsICZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNjcmlwdFRhZykpCi0JCXJldHVybiBOVUxMOwotCUZTcENyZWF0ZVJlc0ZpbGUoJnNwZWMsCi0JICAgICAgICAgICAgICAgICBjcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCi0JICAgICAgICAgICAgICAgICBzY3JpcHRUYWcpOwotCXsKLQkJT1NFcnIgX2VyciA9IFJlc0Vycm9yKCk7Ci0JCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNTcGVjLCAmc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzY3JpcHRUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBGU3BDcmVhdGVSZXNGaWxlKCZzcGVjLAorICAgICAgICAgICAgICAgICAgICAgY3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgc2NyaXB0VGFnKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0luc2VydFJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgcmVmTnVtOwotCVJzcmNDaGFpbkxvY2F0aW9uIHdoZXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiByZWZOdW07CisgICAgUnNyY0NoYWluTG9jYXRpb24gd2hlcmU7CiAjaWZuZGVmIEluc2VydFJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEluc2VydFJlc291cmNlRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSW5zZXJ0UmVzb3VyY2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgJndoZXJlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEluc2VydFJlc291cmNlRmlsZShyZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2hlcmUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW5zZXJ0UmVzb3VyY2VGaWxlKHJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRGV0YWNoUmVzb3VyY2VGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU0ludDE2IHJlZk51bTsKICNpZm5kZWYgRGV0YWNoUmVzb3VyY2VGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRGV0YWNoUmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEZXRhY2hSZXNvdXJjZUZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gRGV0YWNoUmVzb3VyY2VGaWxlKHJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRGV0YWNoUmVzb3VyY2VGaWxlKHJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKICNpZm5kZWYgX19MUDY0X18KIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlGU1NwZWMgcmVzb3VyY2VGaWxlOwotCUJvb2xlYW4gaW5DaGFpbjsKLQlTSW50MTYgcmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBGU1NwZWMgcmVzb3VyY2VGaWxlOworICAgIEJvb2xlYW4gaW5DaGFpbjsKKyAgICBTSW50MTYgcmVmTnVtOwogI2lmbmRlZiBGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbgotCVB5TWFjX1BSRUNIRUNLKEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3Blbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnJlc291cmNlRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKCZyZXNvdXJjZUZpbGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnJlc291cmNlRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuKCZyZXNvdXJjZUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNwT3Blbk9ycGhhblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JRlNTcGVjIHNwZWM7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNTcGVjIHNwZWM7CisgICAgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFNJbnQxNiByZWZOdW07CiAjaWZuZGVmIEZTcE9wZW5PcnBoYW5SZXNGaWxlCi0JUHlNYWNfUFJFQ0hFQ0soRlNwT3Blbk9ycGhhblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTcE9wZW5PcnBoYW5SZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZTcE9wZW5PcnBoYW5SZXNGaWxlKCZzcGVjLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJnNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEZTcE9wZW5PcnBoYW5SZXNGaWxlKCZzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19HZXRUb3BSZXNvdXJjZUZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU0ludDE2IHJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTSW50MTYgcmVmTnVtOwogI2lmbmRlZiBHZXRUb3BSZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHZXRUb3BSZXNvdXJjZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFRvcFJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFRvcFJlc291cmNlRmlsZSgmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0VG9wUmVzb3VyY2VGaWxlKCZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIAogc3RhdGljIFB5T2JqZWN0ICpSZXNfR2V0TmV4dFJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTSW50MTYgY3VyUmVmTnVtOwotCVNJbnQxNiBuZXh0UmVmTnVtOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIFNJbnQxNiBjdXJSZWZOdW07CisgICAgU0ludDE2IG5leHRSZWZOdW07CiAjaWZuZGVmIEdldE5leHRSZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhHZXROZXh0UmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0UmVzb3VyY2VGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY3VyUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldE5leHRSZXNvdXJjZUZpbGUoY3VyUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0UmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBuZXh0UmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1clJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXROZXh0UmVzb3VyY2VGaWxlKGN1clJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dFJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogIV9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTT3BlblJlc0ZpbGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlGU1JlZiByZWY7Ci0JU2lnbmVkQnl0ZSBwZXJtaXNzaW9uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CisgICAgRlNSZWYgcmVmOworICAgIFNpZ25lZEJ5dGUgcGVybWlzc2lvbjsKICNpZm5kZWYgRlNPcGVuUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc0ZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc0ZpbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRlNPcGVuUmVzRmlsZSgmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRlNPcGVuUmVzRmlsZSgmcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbik7CisgICAgeworICAgICAgICBPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIAogI2lmbmRlZiBfX0xQNjRfXwogc3RhdGljIFB5T2JqZWN0ICpSZXNfRlNDcmVhdGVSZXNGaWxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlGU1JlZiBwYXJlbnRSZWY7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCUZTUmVmIG5ld1JlZjsKLQlGU1NwZWMgbmV3U3BlYzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBGU1JlZiBuZXdSZWY7CisgICAgRlNTcGVjIG5ld1NwZWM7CiAjaWZuZGVmIEZTQ3JlYXRlUmVzRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTQ3JlYXRlUmVzRmlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRlNDcmVhdGVSZXNGaWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCW5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187Ci0JRlNDcmVhdGVSZXNGaWxlKCZwYXJlbnRSZWYsCi0JICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAwLAotCSAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCi0JICAgICAgICAgICAgICAgICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKLQl7Ci0JCU9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOwotCQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNDcmVhdGVSZXNGaWxlKCZwYXJlbnRSZWYsCisgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCisgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCisgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlGU1JlZiByZXNvdXJjZUZpbGVSZWY7Ci0JQm9vbGVhbiBpbkNoYWluOwotCVNJbnQxNiByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEZTUmVmIHJlc291cmNlRmlsZVJlZjsKKyAgICBCb29sZWFuIGluQ2hhaW47CisgICAgU0ludDE2IHJlZk51bTsKICNpZm5kZWYgRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbgotCVB5TWFjX1BSRUNIRUNLKEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4pOworICAgIFB5TWFjX1BSRUNIRUNLKEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnJlc291cmNlRmlsZVJlZikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4oJnJlc291cmNlRmlsZVJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkNoYWluLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZk51bSk7Ci0JewotCQlPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsKLQkJaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQl9Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIGluQ2hhaW4sCi0JICAgICAgICAgICAgICAgICAgICAgcmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVzb3VyY2VGaWxlUmVmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gRlNSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbigmcmVzb3VyY2VGaWxlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKKyAgICB7CisgICAgICAgIE9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIH0KKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlJlc19GU0NyZWF0ZVJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiBwYXJlbnRSZWY7Ci0JVW5pQ2hhciAqbmFtZUxlbmd0aF9faW5fXzsKLQlVbmlDaGFyQ291bnQgbmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IG5hbWVMZW5ndGhfX2luX2xlbl9fOwotCVVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOwotCVVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187Ci0JaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlGU1JlZiBuZXdSZWY7Ci0JRlNTcGVjIG5ld1NwZWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgcGFyZW50UmVmOworICAgIFVuaUNoYXIgKm5hbWVMZW5ndGhfX2luX187CisgICAgVW5pQ2hhckNvdW50IG5hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBVbmlDaGFyICpmb3JrTmFtZUxlbmd0aF9faW5fXzsKKyAgICBVbmlDaGFyQ291bnQgZm9ya05hbWVMZW5ndGhfX2xlbl9fOworICAgIGludCBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgRlNSZWYgbmV3UmVmOworICAgIEZTU3BlYyBuZXdTcGVjOwogI2lmbmRlZiBGU0NyZWF0ZVJlc291cmNlRmlsZQotCVB5TWFjX1BSRUNIRUNLKEZTQ3JlYXRlUmVzb3VyY2VGaWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhGU0NyZWF0ZVJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjdSMiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRGU1JlZiwgJnBhcmVudFJlZiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm5hbWVMZW5ndGhfX2luX18sICZuYW1lTGVuZ3RoX19pbl9sZW5fXywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZvcmtOYW1lTGVuZ3RoX19pbl9fLCAmZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JbmFtZUxlbmd0aF9fbGVuX18gPSBuYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlmb3JrTmFtZUxlbmd0aF9fbGVuX18gPSBmb3JrTmFtZUxlbmd0aF9faW5fbGVuX187Ci0JX2VyciA9IEZTQ3JlYXRlUmVzb3VyY2VGaWxlKCZwYXJlbnRSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVMZW5ndGhfX2xlbl9fLCBuYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlNDYXRhbG9nSW5mbyAqKTAsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdTcGVjKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTUmVmLCAmbmV3UmVmLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRlNTcGVjLCAmbmV3U3BlYyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZ1I3UjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZwYXJlbnRSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lTGVuZ3RoX19pbl9fLCAmbmFtZUxlbmd0aF9faW5fbGVuX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIG5hbWVMZW5ndGhfX2xlbl9fID0gbmFtZUxlbmd0aF9faW5fbGVuX187CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU0NyZWF0ZVJlc291cmNlRmlsZSgmcGFyZW50UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lTGVuZ3RoX19sZW5fXywgbmFtZUxlbmd0aF9faW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZTQ2F0YWxvZ0luZm8gKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3UmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3U3BlYyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1JlZiwgJm5ld1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZTU3BlYywgJm5ld1NwZWMpOworICAgIHJldHVybiBfcmVzOwogfQogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0ZTT3BlblJlc291cmNlRmlsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlGU1JlZiByZWY7Ci0JVW5pQ2hhciAqZm9ya05hbWVMZW5ndGhfX2luX187Ci0JVW5pQ2hhckNvdW50IGZvcmtOYW1lTGVuZ3RoX19sZW5fXzsKLQlpbnQgZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOwotCVNpZ25lZEJ5dGUgcGVybWlzc2lvbnM7Ci0JUmVzRmlsZVJlZk51bSByZWZOdW07CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgRlNSZWYgcmVmOworICAgIFVuaUNoYXIgKmZvcmtOYW1lTGVuZ3RoX19pbl9fOworICAgIFVuaUNoYXJDb3VudCBmb3JrTmFtZUxlbmd0aF9fbGVuX187CisgICAgaW50IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKKyAgICBTaWduZWRCeXRlIHBlcm1pc3Npb25zOworICAgIFJlc0ZpbGVSZWZOdW0gcmVmTnVtOwogI2lmbmRlZiBGU09wZW5SZXNvdXJjZUZpbGUKLQlQeU1hY19QUkVDSEVDSyhGU09wZW5SZXNvdXJjZUZpbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEZTT3BlblJlc291cmNlRmlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnUjYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTUmVmLCAmcmVmLAotCSAgICAgICAgICAgICAgICAgICAgICAmZm9ya05hbWVMZW5ndGhfX2luX18sICZmb3JrTmFtZUxlbmd0aF9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgICZwZXJtaXNzaW9ucykpCi0JCXJldHVybiBOVUxMOwotCWZvcmtOYW1lTGVuZ3RoX19sZW5fXyA9IGZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXzsKLQlfZXJyID0gRlNPcGVuUmVzb3VyY2VGaWxlKCZyZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrTmFtZUxlbmd0aF9fbGVuX18sIGZvcmtOYW1lTGVuZ3RoX19pbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWZOdW0pOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdSNiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RlNSZWYsICZyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JrTmFtZUxlbmd0aF9faW5fXywgJmZvcmtOYW1lTGVuZ3RoX19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBlcm1pc3Npb25zKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9ya05hbWVMZW5ndGhfX2xlbl9fID0gZm9ya05hbWVMZW5ndGhfX2luX2xlbl9fOworICAgIF9lcnIgPSBGU09wZW5SZXNvdXJjZUZpbGUoJnJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtOYW1lTGVuZ3RoX19sZW5fXywgZm9ya05hbWVMZW5ndGhfX2luX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk51bSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqUmVzX0hhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JY2hhciAqYnVmOwotCWludCBsZW47Ci0JSGFuZGxlIGg7Ci0JUmVzb3VyY2VPYmplY3QgKnJ2OworICAgIGNoYXIgKmJ1ZjsKKyAgICBpbnQgbGVuOworICAgIEhhbmRsZSBoOworICAgIFJlc291cmNlT2JqZWN0ICpydjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwgJmJ1ZiwgJmxlbikpCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQloID0gTmV3SGFuZGxlKGxlbik7Ci0JaWYgKCBoID09IE5VTEwgKSB7Ci0JICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JfQotCUhMb2NrKGgpOwotCW1lbWNweSgqaCwgYnVmLCBsZW4pOwotCUhVbmxvY2soaCk7Ci0JcnYgPSAoUmVzb3VyY2VPYmplY3QgKilSZXNPYmpfTmV3KGgpOwotCXJ2LT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKLQlfcmVzID0gKFB5T2JqZWN0ICopcnY7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLCAmYnVmLCAmbGVuKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaCA9IE5ld0hhbmRsZShsZW4pOworICAgIGlmICggaCA9PSBOVUxMICkgeworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgSExvY2soaCk7CisgICAgbWVtY3B5KCpoLCBidWYsIGxlbik7CisgICAgSFVubG9jayhoKTsKKyAgICBydiA9IChSZXNvdXJjZU9iamVjdCAqKVJlc09ial9OZXcoaCk7CisgICAgcnYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOworICAgIF9yZXMgPSAoUHlPYmplY3QgKilydjsKKyAgICByZXR1cm4gX3JlczsKIAogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgUmVzX21ldGhvZHNbXSA9IHsKLQl7IkNsb3NlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfQ2xvc2VSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJSZXNFcnJvciIsIChQeUNGdW5jdGlvbilSZXNfUmVzRXJyb3IsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkN1clJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0N1clJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJVc2VSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19Vc2VSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJDb3VudFR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudFR5cGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiQ291bnQxVHlwZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50MVR5cGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiR2V0SW5kVHlwZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0SW5kVHlwZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChSZXNUeXBlIHRoZVR5cGUpIil9LAotCXsiR2V0MUluZFR5cGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldDFJbmRUeXBlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBpbmRleCkgLT4gKFJlc1R5cGUgdGhlVHlwZSkiKX0sCi0JeyJTZXRSZXNMb2FkIiwgKFB5Q0Z1bmN0aW9uKVJlc19TZXRSZXNMb2FkLCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGxvYWQpIC0+IE5vbmUiKX0sCi0JeyJDb3VudFJlc291cmNlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnRSZXNvdXJjZXMsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJDb3VudDFSZXNvdXJjZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50MVJlc291cmNlcywgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldEluZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRJbmRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCBpbmRleCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0MUluZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxSW5kUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBzaG9ydCB0aGVJRCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiR2V0MVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldE5hbWVkUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pUmVzX0dldE5hbWVkUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IkdldDFOYW1lZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxTmFtZWRSZXNvdXJjZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlLCBTdHIyNTUgbmFtZSkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXsiVW5pcXVlSUQiLCAoUHlDRnVuY3Rpb24pUmVzX1VuaXF1ZUlELCAxLAotCSBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVW5pcXVlMUlEIiwgKFB5Q0Z1bmN0aW9uKVJlc19VbmlxdWUxSUQsIDEsCi0JIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCi0JeyJVcGRhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19VcGRhdGVSZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTZXRSZXNQdXJnZSIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzUHVyZ2UsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaW5zdGFsbCkgLT4gTm9uZSIpfSwKLQl7IkdldFJlc0ZpbGVBdHRycyIsIChQeUNGdW5jdGlvbilSZXNfR2V0UmVzRmlsZUF0dHJzLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCByZWZOdW0pIC0+IChzaG9ydCBfcnYpIil9LAotCXsiU2V0UmVzRmlsZUF0dHJzIiwgKFB5Q0Z1bmN0aW9uKVJlc19TZXRSZXNGaWxlQXR0cnMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHJlZk51bSwgc2hvcnQgYXR0cnMpIC0+IE5vbmUiKX0sCisgICAgeyJDbG9zZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0Nsb3NlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiUmVzRXJyb3IiLCAoUHlDRnVuY3Rpb24pUmVzX1Jlc0Vycm9yLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDdXJSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19DdXJSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVXNlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfVXNlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRUeXBlcyIsIChQeUNGdW5jdGlvbilSZXNfQ291bnRUeXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkNvdW50MVR5cGVzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudDFUeXBlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkdldEluZFR5cGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldEluZFR5cGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGluZGV4KSAtPiAoUmVzVHlwZSB0aGVUeXBlKSIpfSwKKyAgICB7IkdldDFJbmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXQxSW5kVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaW5kZXgpIC0+IChSZXNUeXBlIHRoZVR5cGUpIil9LAorICAgIHsiU2V0UmVzTG9hZCIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzTG9hZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBsb2FkKSAtPiBOb25lIil9LAorICAgIHsiQ291bnRSZXNvdXJjZXMiLCAoUHlDRnVuY3Rpb24pUmVzX0NvdW50UmVzb3VyY2VzLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiQ291bnQxUmVzb3VyY2VzIiwgKFB5Q0Z1bmN0aW9uKVJlc19Db3VudDFSZXNvdXJjZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRJbmRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0SW5kUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgaW5kZXgpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldDFJbmRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MUluZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IGluZGV4KSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0UmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgc2hvcnQgdGhlSUQpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldDFSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MVJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIHNob3J0IHRoZUlEKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXROYW1lZFJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXROYW1lZFJlc291cmNlLCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUsIFN0cjI1NSBuYW1lKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXQxTmFtZWRSZXNvdXJjZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0MU5hbWVkUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlc1R5cGUgdGhlVHlwZSwgU3RyMjU1IG5hbWUpIC0+IChIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlVuaXF1ZUlEIiwgKFB5Q0Z1bmN0aW9uKVJlc19VbmlxdWVJRCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVzVHlwZSB0aGVUeXBlKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlVuaXF1ZTFJRCIsIChQeUNGdW5jdGlvbilSZXNfVW5pcXVlMUlELCAxLAorICAgICBQeURvY19TVFIoIihSZXNUeXBlIHRoZVR5cGUpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVXBkYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfVXBkYXRlUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU2V0UmVzUHVyZ2UiLCAoUHlDRnVuY3Rpb24pUmVzX1NldFJlc1B1cmdlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGluc3RhbGwpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRSZXNGaWxlQXR0cnMiLCAoUHlDRnVuY3Rpb24pUmVzX0dldFJlc0ZpbGVBdHRycywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgcmVmTnVtKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlNldFJlc0ZpbGVBdHRycyIsIChQeUNGdW5jdGlvbilSZXNfU2V0UmVzRmlsZUF0dHJzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCByZWZOdW0sIHNob3J0IGF0dHJzKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiT3BlblJGUGVybSIsIChQeUNGdW5jdGlvbilSZXNfT3BlblJGUGVybSwgMSwKLQkgUHlEb2NfU1RSKCIoU3RyMjU1IGZpbGVOYW1lLCBzaG9ydCB2UmVmTnVtLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAotCXsiSE9wZW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IT3BlblJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkhDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IQ3JlYXRlUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdlJlZk51bSwgbG9uZyBkaXJJRCwgU3RyMjU1IGZpbGVOYW1lKSAtPiBOb25lIil9LAotCXsiRlNwT3BlblJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcE9wZW5SZXNGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgc3BlYywgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkZTcENyZWF0ZVJlc0ZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcENyZWF0ZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBzcGVjLCBPU1R5cGUgY3JlYXRvciwgT1NUeXBlIGZpbGVUeXBlLCBTY3JpcHRDb2RlIHNjcmlwdFRhZykgLT4gTm9uZSIpfSwKKyAgICB7Ik9wZW5SRlBlcm0iLCAoUHlDRnVuY3Rpb24pUmVzX09wZW5SRlBlcm0sIDEsCisgICAgIFB5RG9jX1NUUigiKFN0cjI1NSBmaWxlTmFtZSwgc2hvcnQgdlJlZk51bSwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IkhPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSE9wZW5SZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB2UmVmTnVtLCBsb25nIGRpcklELCBTdHIyNTUgZmlsZU5hbWUsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJIQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSENyZWF0ZVJlc0ZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHZSZWZOdW0sIGxvbmcgZGlySUQsIFN0cjI1NSBmaWxlTmFtZSkgLT4gTm9uZSIpfSwKKyAgICB7IkZTcE9wZW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BPcGVuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHNwZWMsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJGU3BDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BDcmVhdGVSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgc3BlYywgT1NUeXBlIGNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU2NyaXB0Q29kZSBzY3JpcHRUYWcpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogIV9fTFA2NF9fICovCi0JeyJJbnNlcnRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0luc2VydFJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHJlZk51bSwgUnNyY0NoYWluTG9jYXRpb24gd2hlcmUpIC0+IE5vbmUiKX0sCi0JeyJEZXRhY2hSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0RldGFjaFJlc291cmNlRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoU0ludDE2IHJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7Ikluc2VydFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfSW5zZXJ0UmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgcmVmTnVtLCBSc3JjQ2hhaW5Mb2NhdGlvbiB3aGVyZSkgLT4gTm9uZSIpfSwKKyAgICB7IkRldGFjaFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRGV0YWNoUmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihTSW50MTYgcmVmTnVtKSAtPiBOb25lIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4iLCAoUHlDRnVuY3Rpb24pUmVzX0ZTcFJlc291cmNlRmlsZUFscmVhZHlPcGVuLCAxLAotCSBQeURvY19TVFIoIihGU1NwZWMgcmVzb3VyY2VGaWxlKSAtPiAoQm9vbGVhbiBfcnYsIEJvb2xlYW4gaW5DaGFpbiwgU0ludDE2IHJlZk51bSkiKX0sCi0JeyJGU3BPcGVuT3JwaGFuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNwT3Blbk9ycGhhblJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBzcGVjLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKLQl7IkdldFRvcFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0VG9wUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTSW50MTYgcmVmTnVtKSIpfSwKLQl7IkdldE5leHRSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0dldE5leHRSZXNvdXJjZUZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKFNJbnQxNiBjdXJSZWZOdW0pIC0+IChTSW50MTYgbmV4dFJlZk51bSkiKX0sCisgICAgeyJGU3BSZXNvdXJjZUZpbGVBbHJlYWR5T3BlbiIsIChQeUNGdW5jdGlvbilSZXNfRlNwUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4sIDEsCisgICAgIFB5RG9jX1NUUigiKEZTU3BlYyByZXNvdXJjZUZpbGUpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBpbkNoYWluLCBTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkZTcE9wZW5PcnBoYW5SZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU3BPcGVuT3JwaGFuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNTcGVjIHNwZWMsIFNpZ25lZEJ5dGUgcGVybWlzc2lvbikgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiR2V0VG9wUmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19HZXRUb3BSZXNvdXJjZUZpbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiR2V0TmV4dFJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfR2V0TmV4dFJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU0ludDE2IGN1clJlZk51bSkgLT4gKFNJbnQxNiBuZXh0UmVmTnVtKSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXsiRlNPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzRmlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoRlNSZWYgcmVmLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiRlNPcGVuUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcmVmLCBTaWduZWRCeXRlIHBlcm1pc3Npb24pIC0+IChzaG9ydCBfcnYpIil9LAogI2lmbmRlZiBfX0xQNjRfXwotCXsiRlNDcmVhdGVSZXNGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU0NyZWF0ZVJlc0ZpbGUsIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHBhcmVudFJlZiwgQnVmZmVyIG5hbWVMZW5ndGgpIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKLQl7IkZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4iLCAoUHlDRnVuY3Rpb24pUmVzX0ZTUmVzb3VyY2VGaWxlQWxyZWFkeU9wZW4sIDEsCi0JIFB5RG9jX1NUUigiKEZTUmVmIHJlc291cmNlRmlsZVJlZikgLT4gKEJvb2xlYW4gX3J2LCBCb29sZWFuIGluQ2hhaW4sIFNJbnQxNiByZWZOdW0pIil9LAotCXsiRlNDcmVhdGVSZXNvdXJjZUZpbGUiLCAoUHlDRnVuY3Rpb24pUmVzX0ZTQ3JlYXRlUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiBwYXJlbnRSZWYsIEJ1ZmZlciBuYW1lTGVuZ3RoLCBCdWZmZXIgZm9ya05hbWVMZW5ndGgpIC0+IChGU1JlZiBuZXdSZWYsIEZTU3BlYyBuZXdTcGVjKSIpfSwKKyAgICB7IkZTQ3JlYXRlUmVzRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNDcmVhdGVSZXNGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiBwYXJlbnRSZWYsIEJ1ZmZlciBuYW1lTGVuZ3RoKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCisgICAgeyJGU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU1Jlc291cmNlRmlsZUFscmVhZHlPcGVuLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZXNvdXJjZUZpbGVSZWYpIC0+IChCb29sZWFuIF9ydiwgQm9vbGVhbiBpbkNoYWluLCBTSW50MTYgcmVmTnVtKSIpfSwKKyAgICB7IkZTQ3JlYXRlUmVzb3VyY2VGaWxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19GU0NyZWF0ZVJlc291cmNlRmlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoRlNSZWYgcGFyZW50UmVmLCBCdWZmZXIgbmFtZUxlbmd0aCwgQnVmZmVyIGZvcmtOYW1lTGVuZ3RoKSAtPiAoRlNSZWYgbmV3UmVmLCBGU1NwZWMgbmV3U3BlYykiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7IkZTT3BlblJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzb3VyY2VGaWxlLCAxLAotCSBQeURvY19TVFIoIihGU1JlZiByZWYsIEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiByZWZOdW0pIil9LAotCXsiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IYW5kbGUsIDEsCi0JIFB5RG9jX1NUUigiQ29udmVydCBhIHN0cmluZyB0byBhIEhhbmRsZSBvYmplY3QuXG5cblJlc291cmNlKCkgYW5kIEhhbmRsZSgpIGFyZSB2ZXJ5IHNpbWlsYXIsIGJ1dCBvYmplY3RzIGNyZWF0ZWQgd2l0aCBIYW5kbGUoKSBhcmVcbmJ5IGRlZmF1bHQgYXV0b21hdGljYWxseSBEaXNwb3NlSGFuZGxlKClkIHVwb24gb2JqZWN0IGNsZWFudXAuIFVzZSBBdXRvRGlzcG9zZSgpXG50byBjaGFuZ2UgdGhpcy5cbiIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkZTT3BlblJlc291cmNlRmlsZSIsIChQeUNGdW5jdGlvbilSZXNfRlNPcGVuUmVzb3VyY2VGaWxlLCAxLAorICAgICBQeURvY19TVFIoIihGU1JlZiByZWYsIEJ1ZmZlciBmb3JrTmFtZUxlbmd0aCwgU2lnbmVkQnl0ZSBwZXJtaXNzaW9ucykgLT4gKFNJbnQxNiByZWZOdW0pIil9LAorICAgIHsiSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVJlc19IYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiQ29udmVydCBhIHN0cmluZyB0byBhIEhhbmRsZSBvYmplY3QuXG5cblJlc291cmNlKCkgYW5kIEhhbmRsZSgpIGFyZSB2ZXJ5IHNpbWlsYXIsIGJ1dCBvYmplY3RzIGNyZWF0ZWQgd2l0aCBIYW5kbGUoKSBhcmVcbmJ5IGRlZmF1bHQgYXV0b21hdGljYWxseSBEaXNwb3NlSGFuZGxlKClkIHVwb24gb2JqZWN0IGNsZWFudXAuIFVzZSBBdXRvRGlzcG9zZSgpXG50byBjaGFuZ2UgdGhpcy5cbiIpfSwKKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTY5Niw2NCArMTY5Niw2NCBAQAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBSZXNPYmpfTmV3LCB3aGljaCByZXR1cm5zIE5vbmUgZm9yIG51bGwgYXJndW1lbnQgKi8KIFB5T2JqZWN0ICpPcHRSZXNPYmpfTmV3KEhhbmRsZSBpdHNlbGYpCiB7Ci0gICAgICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUmVzT2JqX05ldyhpdHNlbGYpOworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgIH0KKyAgICByZXR1cm4gUmVzT2JqX05ldyhpdHNlbGYpOwogfQogCiBpbnQgT3B0UmVzT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0gICAgICAgIFB5T2JqZWN0ICp0bXA7CisgICAgUHlPYmplY3QgKnRtcDsKIAotICAgICAgICBpZiAoIHYgPT0gUHlfTm9uZSApIHsKLSAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChSZXNPYmpfQ2hlY2sodikpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICAvKiBJZiBpdCBpc24ndCBhIHJlc291cmNlIHlldCBzZWUgd2hldGhlciBpdCBpcyBjb252ZXJ0aWJsZSAqLwotICAgICAgICBpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkgewotICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil0bXApLT5vYl9pdHNlbGY7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRtcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7Ci0gICAgICAgIHJldHVybiAwOworICAgIGlmICggdiA9PSBQeV9Ob25lICkgeworICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKFJlc09ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgLyogSWYgaXQgaXNuJ3QgYSByZXNvdXJjZSB5ZXQgc2VlIHdoZXRoZXIgaXQgaXMgY29udmVydGlibGUgKi8KKyAgICBpZiAoICh0bXA9UHlPYmplY3RfQ2FsbE1ldGhvZCh2LCAiYXNfUmVzb3VyY2UiLCAiIikpICkgeworICAgICAgICAqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIFB5RXJyX0NsZWFyKCk7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlJlc291cmNlIHJlcXVpcmVkIik7CisgICAgcmV0dXJuIDA7CiB9CiAKIAogdm9pZCBpbml0X1Jlcyh2b2lkKQogewotCVB5T2JqZWN0ICptOwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICpkOwogCiAKIAotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBSZXNPYmpfTmV3KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIFJlc09ial9Db252ZXJ0KTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgT3B0UmVzT2JqX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoSGFuZGxlLCBPcHRSZXNPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgUmVzT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIFJlc09ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBPcHRSZXNPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEhhbmRsZSwgT3B0UmVzT2JqX0NvbnZlcnQpOwogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1JlcyIsIFJlc19tZXRob2RzKTsKLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlSZXNfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChSZXNfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBSZXNfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlSZXNvdXJjZV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmUmVzb3VyY2VfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZSZXNvdXJjZV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlJlc291cmNlIiwgKFB5T2JqZWN0ICopJlJlc291cmNlX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmUmVzb3VyY2VfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSZXNvdXJjZVR5cGUiLCAoUHlPYmplY3QgKikmUmVzb3VyY2VfVHlwZSk7CisgICAgbSA9IFB5X0luaXRNb2R1bGUoIl9SZXMiLCBSZXNfbWV0aG9kcyk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgUmVzX0Vycm9yID0gUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24oKTsKKyAgICBpZiAoUmVzX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgUmVzX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgUmVzb3VyY2VfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlJlc291cmNlX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmUmVzb3VyY2VfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSZXNvdXJjZSIsIChQeU9iamVjdCAqKSZSZXNvdXJjZV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlJlc291cmNlX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUmVzb3VyY2VUeXBlIiwgKFB5T2JqZWN0ICopJlJlc291cmNlX1R5cGUpOwogfQogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gRW5kIG1vZHVsZSBfUmVzID09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NjcmFwL19TY3JhcG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKaW5kZXggMTRlM2ZkMi4uZjI0ZWQ4YiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvc2NyYXAvX1NjcmFwbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTI3LDE5OSArMjcsMTk5IEBACiAjZGVmaW5lIFNjcmFwT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJlNjcmFwX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNjcmFwX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTY3JhcE9iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVNjcmFwUmVmIG9iX2l0c2VsZjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgU2NyYXBSZWYgb2JfaXRzZWxmOwogfSBTY3JhcE9iamVjdDsKIAogUHlPYmplY3QgKlNjcmFwT2JqX05ldyhTY3JhcFJlZiBpdHNlbGYpCiB7Ci0JU2NyYXBPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFNjcmFwT2JqZWN0LCAmU2NyYXBfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFNjcmFwT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTY3JhcE9iamVjdCwgJlNjcmFwX1R5cGUpOworICAgIGlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBpdC0+b2JfaXRzZWxmID0gaXRzZWxmOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIGludCBTY3JhcE9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBTY3JhcFJlZiAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFTY3JhcE9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTY3JhcCByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChTY3JhcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFTY3JhcE9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTY3JhcCByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChTY3JhcE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFNjcmFwT2JqX2RlYWxsb2MoU2NyYXBPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICAvKiBDbGVhbnVwIG9mIHNlbGYtPm9iX2l0c2VsZiBnb2VzIGhlcmUgKi8KKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX0dldFNjcmFwRmxhdm9yRmxhZ3MoU2NyYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7Ci0JU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckZsYWdzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7CisgICAgU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JGbGFncyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckZsYWdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JTaXplKFNjcmFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOwotCVNpemUgYnl0ZUNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOworICAgIFNpemUgYnl0ZUNvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX0dldFNjcmFwRmxhdm9yRGF0YShTY3JhcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKLQlTaXplIGJ5dGVDb3VudDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZTsKKyAgICBTaXplIGJ5dGVDb3VudDsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmxhdm9yVHlwZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvclNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAoaW50KWJ5dGVDb3VudCk7Ci0JaWYgKCBfcmVzID09IE5VTEwgKSByZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhfcmVzKSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHsKLQkJUHlfWERFQ1JFRihfcmVzKTsKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCX0KLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JTaXplKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVDb3VudCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgKGludClieXRlQ291bnQpOworICAgIGlmICggX3JlcyA9PSBOVUxMICkgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNjcmFwRmxhdm9yRGF0YShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoX3JlcykpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSB7CisgICAgICAgIFB5X1hERUNSRUYoX3Jlcyk7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IoU2NyYXBPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGU7Ci0JU2NyYXBGbGF2b3JGbGFncyBmbGF2b3JGbGFnczsKLQljaGFyICpmbGF2b3JEYXRhX19pbl9fOwotCWludCBmbGF2b3JEYXRhX19pbl9sZW5fXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJktzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZsYXZvclR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgJmZsYXZvckRhdGFfX2luX18sICZmbGF2b3JEYXRhX19pbl9sZW5fXykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBQdXRTY3JhcEZsYXZvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JGbGFncywKLQkgICAgICAgICAgICAgICAgICAgICAgKFNpemUpZmxhdm9yRGF0YV9faW5fbGVuX18sCi0JICAgICAgICAgICAgICAgICAgICAgIGZsYXZvckRhdGFfX2luX18pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlOworICAgIFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3M7CisgICAgY2hhciAqZmxhdm9yRGF0YV9faW5fXzsKKyAgICBpbnQgZmxhdm9yRGF0YV9faW5fbGVuX187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZLcyMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmbGF2b3JUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhdm9yRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGF2b3JEYXRhX19pbl9fLCAmZmxhdm9yRGF0YV9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUHV0U2NyYXBGbGF2b3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChTaXplKWZsYXZvckRhdGFfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3JEYXRhX19pbl9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50KFNjcmFwT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVVJbnQzMiBpbmZvQ291bnQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRTY3JhcEZsYXZvckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9Db3VudCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgaW5mb0NvdW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBVSW50MzIgaW5mb0NvdW50OworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9Db3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdChTY3JhcE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUHlPYmplY3QgKml0ZW07Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgaW5mb0NvdW50OwotCVNjcmFwRmxhdm9ySW5mbyAqaW5mb2xpc3QgPSBOVUxMOwotCWludCBpOwotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JaWYgKGluZm9Db3VudCA9PSAwKSByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiW10iKTsKLQkKLQlpZiAoKGluZm9saXN0ID0gKFNjcmFwRmxhdm9ySW5mbyAqKW1hbGxvYyhpbmZvQ291bnQqc2l6ZW9mKFNjcmFwRmxhdm9ySW5mbykpKSA9PSBOVUxMICkKLQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0JCi0JX2VyciA9IEdldFNjcmFwRmxhdm9ySW5mb0xpc3QoX3NlbGYtPm9iX2l0c2VsZiwgJmluZm9Db3VudCwgaW5mb2xpc3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSB7Ci0JCWZyZWUoaW5mb2xpc3QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JaWYgKChfcmVzID0gUHlMaXN0X05ldyhpbmZvQ291bnQpKSA9PSBOVUxMICkgewotCQlmcmVlKGluZm9saXN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWZvcihpPTA7IGk8aW5mb0NvdW50OyBpKyspIHsKLQkJaXRlbSA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpbmZvbGlzdFtpXS5mbGF2b3JUeXBlLAotCQkJaW5mb2xpc3RbaV0uZmxhdm9yRmxhZ3MpOwotCQlpZiAoICFpdGVtIHx8IFB5TGlzdF9TZXRJdGVtKF9yZXMsIGksIGl0ZW0pIDwgMCApIHsKLQkJCVB5X0RFQ1JFRihfcmVzKTsKLQkJCWZyZWUoaW5mb2xpc3QpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JZnJlZShpbmZvbGlzdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIGluZm9Db3VudDsKKyAgICBTY3JhcEZsYXZvckluZm8gKmluZm9saXN0ID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0U2NyYXBGbGF2b3JDb3VudChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgaWYgKGluZm9Db3VudCA9PSAwKSByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiW10iKTsKKworICAgIGlmICgoaW5mb2xpc3QgPSAoU2NyYXBGbGF2b3JJbmZvICopbWFsbG9jKGluZm9Db3VudCpzaXplb2YoU2NyYXBGbGF2b3JJbmZvKSkpID09IE5VTEwgKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgIF9lcnIgPSBHZXRTY3JhcEZsYXZvckluZm9MaXN0KF9zZWxmLT5vYl9pdHNlbGYsICZpbmZvQ291bnQsIGluZm9saXN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgeworICAgICAgICBmcmVlKGluZm9saXN0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICgoX3JlcyA9IFB5TGlzdF9OZXcoaW5mb0NvdW50KSkgPT0gTlVMTCApIHsKKyAgICAgICAgZnJlZShpbmZvbGlzdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBmb3IoaT0wOyBpPGluZm9Db3VudDsgaSsrKSB7CisgICAgICAgIGl0ZW0gPSBQeV9CdWlsZFZhbHVlKCJPJmwiLCBQeU1hY19CdWlsZE9TVHlwZSwgaW5mb2xpc3RbaV0uZmxhdm9yVHlwZSwKKyAgICAgICAgICAgIGluZm9saXN0W2ldLmZsYXZvckZsYWdzKTsKKyAgICAgICAgaWYgKCAhaXRlbSB8fCBQeUxpc3RfU2V0SXRlbShfcmVzLCBpLCBpdGVtKSA8IDAgKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoX3Jlcyk7CisgICAgICAgICAgICBmcmVlKGluZm9saXN0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGZyZWUoaW5mb2xpc3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU2NyYXBPYmpfbWV0aG9kc1tdID0gewotCXsiR2V0U2NyYXBGbGF2b3JGbGFncyIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckZsYWdzLCAxLAotCSBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSkgLT4gKFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3MpIil9LAotCXsiR2V0U2NyYXBGbGF2b3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9yU2l6ZSwgMSwKLQkgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUpIC0+IChTaXplIGJ5dGVDb3VudCkiKX0sCi0JeyJHZXRTY3JhcEZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JEYXRhLCAxLAotCSBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSwgQnVmZmVyIGRlc3RpbmF0aW9uKSAtPiAoU2l6ZSBieXRlQ291bnQpIil9LAotCXsiUHV0U2NyYXBGbGF2b3IiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IsIDEsCi0JIFB5RG9jX1NUUigiKFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlLCBTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzLCBTaXplIGZsYXZvclNpemUsIEJ1ZmZlciBmbGF2b3JEYXRhKSAtPiBOb25lIil9LAotCXsiR2V0U2NyYXBGbGF2b3JDb3VudCIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaW5mb0NvdW50KSIpfSwKLQl7IkdldFNjcmFwRmxhdm9ySW5mb0xpc3QiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoWyhTY3JhcEZsYXZvclR5cGUsIFNjcmFwRmxhdm9ySW5mbyksIC4uLl0pIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0U2NyYXBGbGF2b3JGbGFncyIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckZsYWdzLCAxLAorICAgICBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSkgLT4gKFNjcmFwRmxhdm9yRmxhZ3MgZmxhdm9yRmxhZ3MpIil9LAorICAgIHsiR2V0U2NyYXBGbGF2b3JTaXplIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwT2JqX0dldFNjcmFwRmxhdm9yU2l6ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU2NyYXBGbGF2b3JUeXBlIGZsYXZvclR5cGUpIC0+IChTaXplIGJ5dGVDb3VudCkiKX0sCisgICAgeyJHZXRTY3JhcEZsYXZvckRhdGEiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JEYXRhLCAxLAorICAgICBQeURvY19TVFIoIihTY3JhcEZsYXZvclR5cGUgZmxhdm9yVHlwZSwgQnVmZmVyIGRlc3RpbmF0aW9uKSAtPiAoU2l6ZSBieXRlQ291bnQpIil9LAorICAgIHsiUHV0U2NyYXBGbGF2b3IiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfUHV0U2NyYXBGbGF2b3IsIDEsCisgICAgIFB5RG9jX1NUUigiKFNjcmFwRmxhdm9yVHlwZSBmbGF2b3JUeXBlLCBTY3JhcEZsYXZvckZsYWdzIGZsYXZvckZsYWdzLCBTaXplIGZsYXZvclNpemUsIEJ1ZmZlciBmbGF2b3JEYXRhKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2NyYXBGbGF2b3JDb3VudCIsIChQeUNGdW5jdGlvbilTY3JhcE9ial9HZXRTY3JhcEZsYXZvckNvdW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChVSW50MzIgaW5mb0NvdW50KSIpfSwKKyAgICB7IkdldFNjcmFwRmxhdm9ySW5mb0xpc3QiLCAoUHlDRnVuY3Rpb24pU2NyYXBPYmpfR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoWyhTY3JhcEZsYXZvclR5cGUsIFNjcmFwRmxhdm9ySW5mbyksIC4uLl0pIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogUHlNZXRob2RDaGFpbiBTY3JhcE9ial9jaGFpbiA9IHsgU2NyYXBPYmpfbWV0aG9kcywgTlVMTCB9OwogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwT2JqX2dldGF0dHIoU2NyYXBPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCiB7Ci0JcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZTY3JhcE9ial9jaGFpbiwgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2RJbkNoYWluKCZTY3JhcE9ial9jaGFpbiwgKFB5T2JqZWN0ICopc2VsZiwgbmFtZSk7CiB9CiAKICNkZWZpbmUgU2NyYXBPYmpfc2V0YXR0ciBOVUxMCkBAIC0yMzEsMTA3ICsyMzEsMTA3IEBACiAjZGVmaW5lIFNjcmFwT2JqX2hhc2ggTlVMTAogCiBQeVR5cGVPYmplY3QgU2NyYXBfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfU2NyYXAuU2NyYXAiLCAvKnRwX25hbWUqLwotCXNpemVvZihTY3JhcE9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFNjcmFwT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKSBTY3JhcE9ial9nZXRhdHRyLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykgU2NyYXBPYmpfc2V0YXR0ciwgLyp0cF9zZXRhdHRyKi8KLQkoY21wZnVuYykgU2NyYXBPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFNjcmFwT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBTY3JhcE9ial9oYXNoLCAvKnRwX2hhc2gqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9TY3JhcC5TY3JhcCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNjcmFwT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLworICAgIDAsIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAoZGVzdHJ1Y3RvcikgU2NyYXBPYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpIFNjcmFwT2JqX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKSBTY3JhcE9ial9zZXRhdHRyLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTY3JhcE9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgU2NyYXBPYmpfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFNjcmFwT2JqX2hhc2gsIC8qdHBfaGFzaCovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFNjcmFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIFB5T2JqZWN0ICpTY3JhcF9Mb2FkU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBMb2FkU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IExvYWRTY3JhcCgpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwX1VubG9hZFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVW5sb2FkU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFVubG9hZFNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBfR2V0Q3VycmVudFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVNjcmFwUmVmIHNjcmFwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0Q3VycmVudFNjcmFwKCZzY3JhcCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFNjcmFwT2JqX05ldywgc2NyYXApOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFNjcmFwUmVmIHNjcmFwOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q3VycmVudFNjcmFwKCZzY3JhcCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmFwT2JqX05ldywgc2NyYXApOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNjcmFwX0NsZWFyQ3VycmVudFNjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ2xlYXJDdXJyZW50U2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsZWFyQ3VycmVudFNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU2NyYXBfQ2FsbEluU2NyYXBQcm9taXNlcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENhbGxJblNjcmFwUHJvbWlzZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENhbGxJblNjcmFwUHJvbWlzZXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgU2NyYXBfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiTG9hZFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0xvYWRTY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVW5sb2FkU2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfVW5sb2FkU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkdldEN1cnJlbnRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9HZXRDdXJyZW50U2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFNjcmFwUmVmIHNjcmFwKSIpfSwKLQl7IkNsZWFyQ3VycmVudFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0NsZWFyQ3VycmVudFNjcmFwLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJDYWxsSW5TY3JhcFByb21pc2VzIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX0NhbGxJblNjcmFwUHJvbWlzZXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkxvYWRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9Mb2FkU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlVubG9hZFNjcmFwIiwgKFB5Q0Z1bmN0aW9uKVNjcmFwX1VubG9hZFNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRDdXJyZW50U2NyYXAiLCAoUHlDRnVuY3Rpb24pU2NyYXBfR2V0Q3VycmVudFNjcmFwLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChTY3JhcFJlZiBzY3JhcCkiKX0sCisgICAgeyJDbGVhckN1cnJlbnRTY3JhcCIsIChQeUNGdW5jdGlvbilTY3JhcF9DbGVhckN1cnJlbnRTY3JhcCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQ2FsbEluU2NyYXBQcm9taXNlcyIsIChQeUNGdW5jdGlvbilTY3JhcF9DYWxsSW5TY3JhcFByb21pc2VzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMzM5LDI1ICszMzksMjUgQEAKIAogdm9pZCBpbml0X1NjcmFwKHZvaWQpCiB7Ci0JUHlPYmplY3QgKm07CisgICAgUHlPYmplY3QgKm07CiAjaWZuZGVmIF9fTFA2NF9fCi0JUHlPYmplY3QgKmQ7CisgICAgUHlPYmplY3QgKmQ7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogCiAKIAotCW0gPSBQeV9Jbml0TW9kdWxlKCJfU2NyYXAiLCBTY3JhcF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1NjcmFwIiwgU2NyYXBfbWV0aG9kcyk7CiAjaWZuZGVmIF9fTFA2NF9fCi0JZCA9IFB5TW9kdWxlX0dldERpY3QobSk7Ci0JU2NyYXBfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChTY3JhcF9FcnJvciA9PSBOVUxMIHx8Ci0JICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFNjcmFwX0Vycm9yKSAhPSAwKQotCQlyZXR1cm47Ci0JU2NyYXBfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCVB5X0lOQ1JFRigmU2NyYXBfVHlwZSk7Ci0JaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTY3JhcFR5cGUiLCAoUHlPYmplY3QgKikmU2NyYXBfVHlwZSkgIT0gMCkKLQkJUHlfRmF0YWxFcnJvcigiY2FuJ3QgaW5pdGlhbGl6ZSBTY3JhcFR5cGUiKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBTY3JhcF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFNjcmFwX0Vycm9yID09IE5VTEwgfHwKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgU2NyYXBfRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBTY3JhcF9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisgICAgUHlfSU5DUkVGKCZTY3JhcF9UeXBlKTsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlNjcmFwVHlwZSIsIChQeU9iamVjdCAqKSZTY3JhcF9UeXBlKSAhPSAwKQorICAgICAgICBQeV9GYXRhbEVycm9yKCJjYW4ndCBpbml0aWFsaXplIFNjcmFwVHlwZSIpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NuZC9fU25kaWhvb2tzLmMgYi9NYWMvTW9kdWxlcy9zbmQvX1NuZGlob29rcy5jCmluZGV4IDc0Y2FkOWIuLjI1NGZjMGMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3NuZC9fU25kaWhvb2tzLmMKKysrIGIvTWFjL01vZHVsZXMvc25kL19TbmRpaG9va3MuYwpAQCAtMzUsMTMgKzM1LDEzIEBACiAKICNwcmFnbWEgb3B0aW9ucyBhbGlnbj1tYWM2OGsKIHN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyB7Ci0Jc2hvcnQJbnVtcmF0ZXM7Ci0JSGFuZGxlCXJhdGVzOworICAgIHNob3J0ICAgICAgIG51bXJhdGVzOworICAgIEhhbmRsZSAgICAgIHJhdGVzOwogfTsKIAogc3RydWN0IFNhbXBsZVNpemVBdmFpbGFibGVfYXJnIHsKLQlzaG9ydAludW1zaXplczsKLQlIYW5kbGUJc2l6ZXM7CisgICAgc2hvcnQgICAgICAgbnVtc2l6ZXM7CisgICAgSGFuZGxlICAgICAgc2l6ZXM7CiB9OwogCiAjcHJhZ21hIG9wdGlvbnMgYWxpZ249cmVzZXQKQEAgLTUzLDI4ICs1MywyOCBAQAogc3RhdGljIGludAogUHlNYWNfR2V0VUZpeGVkKFB5T2JqZWN0ICp2LCBGaXhlZCAqZikKIHsKLQlkb3VibGUgZDsKLQl1bnNpZ25lZCBsb25nIHVuczsKLQkKLQlpZiggIVB5QXJnX1BhcnNlKHYsICJkIiwgJmQpKQotCQlyZXR1cm4gMDsKLQl1bnMgPSAodW5zaWduZWQgbG9uZykoZCAqIDB4MTAwMDApOwotCSpmID0gKEZpeGVkKXVuczsKLQlyZXR1cm4gMTsKKyAgICBkb3VibGUgZDsKKyAgICB1bnNpZ25lZCBsb25nIHVuczsKKworICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgImQiLCAmZCkpCisgICAgICAgIHJldHVybiAwOworICAgIHVucyA9ICh1bnNpZ25lZCBsb25nKShkICogMHgxMDAwMCk7CisgICAgKmYgPSAoRml4ZWQpdW5zOworICAgIHJldHVybiAxOwogfQogCiAvKiBDb252ZXJ0IGEgUG9pbnQgdG8gYSBQeXRob24gb2JqZWN0ICovCiBzdGF0aWMgUHlPYmplY3QgKgogUHlNYWNfQnVpbGRVRml4ZWQoRml4ZWQgZikKIHsKLQlkb3VibGUgZDsKLQl1bnNpZ25lZCBsb25nIGZ1bnM7Ci0JCi0JZnVucyA9ICh1bnNpZ25lZCBsb25nKWY7Ci0JCi0JZCA9IGZ1bnM7Ci0JZCA9IGQgLyAweDEwMDAwOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJkIiwgZCk7CisgICAgZG91YmxlIGQ7CisgICAgdW5zaWduZWQgbG9uZyBmdW5zOworCisgICAgZnVucyA9ICh1bnNpZ25lZCBsb25nKWY7CisKKyAgICBkID0gZnVuczsKKyAgICBkID0gZCAvIDB4MTAwMDA7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImQiLCBkKTsKIH0KIAogCkBAIC04NiwxOSArODYsMTkgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHNuZGloX2dldENoYW5uZWxBdmFpbGFibGUoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBuY2hhbm5lbDsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBuY2hhbm5lbDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNoYW5uZWxBdmFpbGFibGUsIChQdHIpJm5jaGFubmVsKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG5jaGFubmVsKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ2hhbm5lbEF2YWlsYWJsZSwgKFB0cikmbmNoYW5uZWwpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgbmNoYW5uZWwpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX19bXSA9CkBAIC0xMDcsMTkgKzEwNywxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0TnVtYmVyQ2hhbm5lbHMoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBuY2hhbm5lbDsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBuY2hhbm5lbDsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBuY2hhbm5lbCk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBuY2hhbm5lbCk7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldE51bWJlckNoYW5uZWxzX19kb2NfX1tdID0KQEAgLTEyOCwyMCArMTI4LDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXROdW1iZXJDaGFubmVscyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG5jaGFubmVsOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG5jaGFubmVsOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZuY2hhbm5lbCkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpTnVtYmVyQ2hhbm5lbHMsIChQdHIpJm5jaGFubmVsKSkgIT0gbm9FcnIgKQotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JcmV0dXJuIFB5X05vbmU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJm5jaGFubmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaU51bWJlckNoYW5uZWxzLCAoUHRyKSZuY2hhbm5lbCkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX1tdID0KQEAgLTE1MCwxOSArMTUwLDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRDb250aW51b3VzKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgb25vZmY7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgb25vZmY7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lDb250aW51b3VzLCAoUHRyKSZvbm9mZikpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBvbm9mZik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaUNvbnRpbnVvdXMsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0Q29udGludW91c19fZG9jX19bXSA9CkBAIC0xNzEsMjAgKzE3MSwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0Q29udGludW91cyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG9ub2ZmOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG9ub2ZmOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZvbm9mZikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ29udGludW91cywgKFB0cikmb25vZmYpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpQ29udGludW91cywgKFB0cikmb25vZmYpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0SW5wdXRTb3VyY2VOYW1lc19fZG9jX19bXSA9CkBAIC0xOTMsMTkgKzE5MywxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0SW5wdXRTb3VyY2VOYW1lcyhzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCUhhbmRsZSBuYW1lczsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBIYW5kbGUgbmFtZXM7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZU5hbWVzLCAoUHRyKSZuYW1lcykpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgbmFtZXMpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZU5hbWVzLCAoUHRyKSZuYW1lcykpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUmVzT2JqX05ldywgbmFtZXMpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRJbnB1dFNvdXJjZV9fZG9jX19bXSA9CkBAIC0yMTQsMTkgKzIxNCwxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0SW5wdXRTb3VyY2Uoc2VsZiwgYXJncykKLQlQeU9iamVjdCAqc2VsZjsJLyogTm90IHVzZWQgKi8KLQlQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqc2VsZjsgICAgIC8qIE5vdCB1c2VkICovCisgICAgUHlPYmplY3QgKmFyZ3M7CiB7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCBzb3VyY2U7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgc291cmNlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzb3VyY2UpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lJbnB1dFNvdXJjZSwgKFB0cikmc291cmNlKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNvdXJjZSk7CiB9CiAKIHN0YXRpYyBjaGFyIHNuZGloX3NldElucHV0U291cmNlX19kb2NfX1tdID0KQEAgLTIzNSwyMCArMjM1LDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXRJbnB1dFNvdXJjZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IHNvdXJjZTsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBzb3VyY2U7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaCIsICZpblJlZk51bSwgJnNvdXJjZSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZzb3VyY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpSW5wdXRTb3VyY2UsIChQdHIpJnNvdXJjZSkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRQbGF5VGhydU9uT2ZmX19kb2NfX1tdID0KQEAgLTI1NywxOSArMjU3LDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRQbGF5VGhydU9uT2ZmKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgb25vZmY7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgb25vZmY7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCR2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lQbGF5VGhydU9uT2ZmLCAoUHRyKSZvbm9mZikpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBvbm9mZik7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVBsYXlUaHJ1T25PZmYsIChQdHIpJm9ub2ZmKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIG9ub2ZmKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0UGxheVRocnVPbk9mZl9fZG9jX19bXSA9CkBAIC0yNzgsMjAgKzI3OCwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0UGxheVRocnVPbk9mZihzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IG9ub2ZmOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IG9ub2ZmOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZvbm9mZikpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpUGxheVRocnVPbk9mZiwgKFB0cikmb25vZmYpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlyZXR1cm4gUHlfTm9uZTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmb25vZmYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpUGxheVRocnVPbk9mZiwgKFB0cikmb25vZmYpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlUmF0ZV9fZG9jX19bXSA9CkBAIC0zMDAsMTkgKzMwMCwxOSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlUmF0ZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCUZpeGVkIHNhbXBsZV9yYXRlOwotCU9TRXJyIGVycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIEZpeGVkIHNhbXBsZV9yYXRlOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlUmF0ZSwgKFB0cikmc2FtcGxlX3JhdGUpKSAhPSBub0VyciApCi0JCXJldHVybiBQeU1hY19FcnJvcihlcnIpOwotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkVUZpeGVkLCBzYW1wbGVfcmF0ZSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVJhdGUsIChQdHIpJnNhbXBsZV9yYXRlKSkgIT0gbm9FcnIgKQorICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFVGaXhlZCwgc2FtcGxlX3JhdGUpOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9zZXRTYW1wbGVSYXRlX19kb2NfX1tdID0KQEAgLTMyMSwyMCArMzIxLDIwIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9zZXRTYW1wbGVSYXRlKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0JRml4ZWQgc2FtcGxlX3JhdGU7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgRml4ZWQgc2FtcGxlX3JhdGU7CisgICAgT1NFcnIgZXJyOwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsTyYiLCAmaW5SZWZOdW0sIFB5TWFjX0dldFVGaXhlZCwgJnNhbXBsZV9yYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JCi0JaWYoIChlcnI9U1BCU2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVSYXRlLCAoUHRyKSZzYW1wbGVfcmF0ZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibE8mIiwgJmluUmVmTnVtLCBQeU1hY19HZXRVRml4ZWQsICZzYW1wbGVfcmF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYoIChlcnI9U1BCU2V0RGV2aWNlSW5mbyhpblJlZk51bSwgc2lTYW1wbGVSYXRlLCAoUHRyKSZzYW1wbGVfcmF0ZSkpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOwogfQogCiBzdGF0aWMgY2hhciBzbmRpaF9nZXRTYW1wbGVTaXplX19kb2NfX1tdID0KQEAgLTM0MywxOSArMzQzLDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBzbmRpaF9nZXRTYW1wbGVTaXplKHNlbGYsIGFyZ3MpCi0JUHlPYmplY3QgKnNlbGY7CS8qIE5vdCB1c2VkICovCi0JUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnNlbGY7ICAgICAvKiBOb3QgdXNlZCAqLworICAgIFB5T2JqZWN0ICphcmdzOwogewotCWxvbmcgaW5SZWZOdW07Ci0Jc2hvcnQgYml0czsKLQlPU0VyciBlcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBzaG9ydCBiaXRzOworICAgIE9TRXJyIGVycjsKIAotCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibCIsICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmYml0cykpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBiaXRzKTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmYml0cykpICE9IG5vRXJyICkKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBiaXRzKTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfc2V0U2FtcGxlU2l6ZV9fZG9jX19bXSA9CkBAIC0zNjQsMjAgKzM2NCwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfc2V0U2FtcGxlU2l6ZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXNob3J0IHNpemU7Ci0JT1NFcnIgZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgc2hvcnQgc2l6ZTsKKyAgICBPU0VyciBlcnI7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxoIiwgJmluUmVmTnVtLCAmc2l6ZSkpCi0JCXJldHVybiBOVUxMOwotCQotCWlmKCAoZXJyPVNQQlNldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlU2l6ZSwgKFB0cikmc2l6ZSkpICE9IG5vRXJyICkKLQkJcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCXJldHVybiBQeV9Ob25lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGgiLCAmaW5SZWZOdW0sICZzaXplKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJTZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemUsIChQdHIpJnNpemUpKSAhPSBub0VyciApCisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZV9fZG9jX19bXSA9CkBAIC0zODYsMzEgKzM4NiwzMSBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXN0cnVjdCBTYW1wbGVTaXplQXZhaWxhYmxlX2FyZyBhcmc7Ci0JT1NFcnIgZXJyOwotCVB5T2JqZWN0ICpyc2l6ZXM7Ci0Jc2hvcnQgKmZzaXplczsKLQlpbnQgaTsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHN0cnVjdCBTYW1wbGVTaXplQXZhaWxhYmxlX2FyZyBhcmc7CisgICAgT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpyc2l6ZXM7CisgICAgc2hvcnQgKmZzaXplczsKKyAgICBpbnQgaTsKIAotCWFyZy5zaXplcyA9IE5VTEw7Ci0JcnNpemVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgewotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQl9Ci0JZnNpemVzID0gKHNob3J0ICopKihhcmcuc2l6ZXMpOwotCS8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KLQlpZiggKHJzaXplcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1zaXplcykpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCWZvciggaT0wOyBpPGFyZy5udW1zaXplczsgaSsrICkKLQkJUHlUdXBsZV9TZXRJdGVtKHJzaXplcywgaSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpZnNpemVzW2ldKSk7Ci0JcmV0dXJuIHJzaXplczsKKyAgICBhcmcuc2l6ZXMgPSBOVUxMOworICAgIHJzaXplcyA9IE5VTEw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsIiwgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVNpemVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgeworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKyAgICB9CisgICAgZnNpemVzID0gKHNob3J0ICopKihhcmcuc2l6ZXMpOworICAgIC8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KKyAgICBpZiggKHJzaXplcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1zaXplcykpID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZvciggaT0wOyBpPGFyZy5udW1zaXplczsgaSsrICkKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJzaXplcywgaSwgUHlJbnRfRnJvbUxvbmcoKGxvbmcpZnNpemVzW2ldKSk7CisgICAgcmV0dXJuIHJzaXplczsKIH0KIAogc3RhdGljIGNoYXIgc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZV9fZG9jX19bXSA9CkBAIC00MTksOTQgKzQxOSw5NCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZShzZWxmLCBhcmdzKQotCVB5T2JqZWN0ICpzZWxmOwkvKiBOb3QgdXNlZCAqLwotCVB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICpzZWxmOyAgICAgLyogTm90IHVzZWQgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKIHsKLQlsb25nIGluUmVmTnVtOwotCXN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyBhcmc7Ci0JT1NFcnIgZXJyOwotCVB5T2JqZWN0ICpycmF0ZXMsICpvYmo7Ci0JRml4ZWQgKmZyYXRlczsKLQlpbnQgaTsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHN0cnVjdCBTYW1wbGVSYXRlQXZhaWxhYmxlX2FyZyBhcmc7CisgICAgT1NFcnIgZXJyOworICAgIFB5T2JqZWN0ICpycmF0ZXMsICpvYmo7CisgICAgRml4ZWQgKmZyYXRlczsKKyAgICBpbnQgaTsKIAotCWFyZy5yYXRlcyA9IE5VTEw7Ci0JcnJhdGVzID0gTlVMTDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQkKLQlpZiggKGVycj1TUEJHZXREZXZpY2VJbmZvKGluUmVmTnVtLCBzaVNhbXBsZVJhdGVBdmFpbGFibGUsIChQdHIpJmFyZykpICE9IG5vRXJyICkgewotCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQl9Ci0JZnJhdGVzID0gKEZpeGVkICopKihhcmcucmF0ZXMpOwotCWlmKCBhcmcubnVtcmF0ZXMgPT0gMCApIHsKLQkJLyogVGhlIGhhbmRsZSBjb250YWlucyB1cHBlciBhbmQgbG93ZXJib3VuZCAqLwotCQlycmF0ZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgZnJhdGVzWzBdLCBmcmF0ZXNbMV0pOwotCQlpZiAocnJhdGVzID09IE5VTEwpIHJldHVybiBOVUxMOwotCX0gZWxzZSB7Ci0JCS8qIEhhbmRsZSBjb250YWlucyBhIGxpc3Qgb2YgcmF0ZXMgKi8KLQkJaWYoIChycmF0ZXMgPSBQeVR1cGxlX05ldyhhcmcubnVtcmF0ZXMpKSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWZvciggaT0wOyBpPGFyZy5udW1yYXRlczsgaSsrICkgewotCQkJaWYoIChvYmogPSBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkVUZpeGVkLCBmcmF0ZXNbaV0pKT09TlVMTCkKLQkJCQlnb3RvIG91dDsKLQkJCVB5VHVwbGVfU2V0SXRlbShycmF0ZXMsIGksIG9iaik7Ci0JCX0KLQl9Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhPIiwgYXJnLm51bXJhdGVzLCBycmF0ZXMpOworICAgIGFyZy5yYXRlcyA9IE5VTEw7CisgICAgcnJhdGVzID0gTlVMTDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImwiLCAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmKCAoZXJyPVNQQkdldERldmljZUluZm8oaW5SZWZOdW0sIHNpU2FtcGxlUmF0ZUF2YWlsYWJsZSwgKFB0cikmYXJnKSkgIT0gbm9FcnIgKSB7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgIH0KKyAgICBmcmF0ZXMgPSAoRml4ZWQgKikqKGFyZy5yYXRlcyk7CisgICAgaWYoIGFyZy5udW1yYXRlcyA9PSAwICkgeworICAgICAgICAvKiBUaGUgaGFuZGxlIGNvbnRhaW5zIHVwcGVyIGFuZCBsb3dlcmJvdW5kICovCisgICAgICAgIHJyYXRlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBmcmF0ZXNbMF0sIGZyYXRlc1sxXSk7CisgICAgICAgIGlmIChycmF0ZXMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogSGFuZGxlIGNvbnRhaW5zIGEgbGlzdCBvZiByYXRlcyAqLworICAgICAgICBpZiggKHJyYXRlcyA9IFB5VHVwbGVfTmV3KGFyZy5udW1yYXRlcykpID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZm9yKCBpPTA7IGk8YXJnLm51bXJhdGVzOyBpKysgKSB7CisgICAgICAgICAgICBpZiggKG9iaiA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRVRml4ZWQsIGZyYXRlc1tpXSkpPT1OVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJyYXRlcywgaSwgb2JqKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaE8iLCBhcmcubnVtcmF0ZXMsIHJyYXRlcyk7CiBvdXQ6Ci0JUHlfWERFQ1JFRihycmF0ZXMpOwotCXJldHVybiBOVUxMOworICAgIFB5X1hERUNSRUYocnJhdGVzKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyogTGlzdCBvZiBtZXRob2RzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLwogCiBzdGF0aWMgc3RydWN0IFB5TWV0aG9kRGVmIHNuZGloX21ldGhvZHNbXSA9IHsKLSB7ImdldENoYW5uZWxBdmFpbGFibGUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0Q2hhbm5lbEF2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRDaGFubmVsQXZhaWxhYmxlX19kb2NfX30sCi0geyJnZXROdW1iZXJDaGFubmVscyIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXROdW1iZXJDaGFubmVscywJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX199LAotIHsic2V0TnVtYmVyQ2hhbm5lbHMiLAkoUHlDRnVuY3Rpb24pc25kaWhfc2V0TnVtYmVyQ2hhbm5lbHMsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0TnVtYmVyQ2hhbm5lbHNfX2RvY19ffSwKLSB7ImdldENvbnRpbnVvdXMiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0Q29udGludW91cywJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX30sCi0geyJzZXRDb250aW51b3VzIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX3NldENvbnRpbnVvdXMsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0Q29udGludW91c19fZG9jX199LAotIHsiZ2V0SW5wdXRTb3VyY2VOYW1lcyIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRJbnB1dFNvdXJjZU5hbWVzLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldElucHV0U291cmNlTmFtZXNfX2RvY19ffSwKLSB7ImdldElucHV0U291cmNlIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldElucHV0U291cmNlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldElucHV0U291cmNlX19kb2NfX30sCi0geyJzZXRJbnB1dFNvdXJjZSIsCShQeUNGdW5jdGlvbilzbmRpaF9zZXRJbnB1dFNvdXJjZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9zZXRJbnB1dFNvdXJjZV9fZG9jX199LAotIHsiZ2V0UGxheVRocnVPbk9mZiIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRQbGF5VGhydU9uT2ZmLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldFBsYXlUaHJ1T25PZmZfX2RvY19ffSwKLSB7InNldFBsYXlUaHJ1T25PZmYiLAkoUHlDRnVuY3Rpb24pc25kaWhfc2V0UGxheVRocnVPbk9mZiwJTUVUSF9WQVJBUkdTLAlzbmRpaF9zZXRQbGF5VGhydU9uT2ZmX19kb2NfX30sCi0geyJnZXRTYW1wbGVSYXRlIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFNhbXBsZVJhdGUsCU1FVEhfVkFSQVJHUywJc25kaWhfZ2V0U2FtcGxlUmF0ZV9fZG9jX199LAotIHsic2V0U2FtcGxlUmF0ZSIsCShQeUNGdW5jdGlvbilzbmRpaF9zZXRTYW1wbGVSYXRlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX3NldFNhbXBsZVJhdGVfX2RvY19ffSwKLSB7ImdldFNhbXBsZVNpemUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlU2l6ZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRTYW1wbGVTaXplX19kb2NfX30sCi0geyJzZXRTYW1wbGVTaXplIiwJKFB5Q0Z1bmN0aW9uKXNuZGloX3NldFNhbXBsZVNpemUsCU1FVEhfVkFSQVJHUywJc25kaWhfc2V0U2FtcGxlU2l6ZV9fZG9jX199LAotIHsiZ2V0U2FtcGxlU2l6ZUF2YWlsYWJsZSIsCShQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlLAlNRVRIX1ZBUkFSR1MsCXNuZGloX2dldFNhbXBsZVNpemVBdmFpbGFibGVfX2RvY19ffSwKLSB7ImdldFNhbXBsZVJhdGVBdmFpbGFibGUiLAkoUHlDRnVuY3Rpb24pc25kaWhfZ2V0U2FtcGxlUmF0ZUF2YWlsYWJsZSwJTUVUSF9WQVJBUkdTLAlzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlX19kb2NfX30sCi0gCi0Je05VTEwsCSAoUHlDRnVuY3Rpb24pTlVMTCwgMCwgTlVMTH0JCS8qIHNlbnRpbmVsICovCisgeyJnZXRDaGFubmVsQXZhaWxhYmxlIiwgICAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRDaGFubmVsQXZhaWxhYmxlLCBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0Q2hhbm5lbEF2YWlsYWJsZV9fZG9jX199LAorIHsiZ2V0TnVtYmVyQ2hhbm5lbHMiLCAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldE51bWJlckNoYW5uZWxzLCAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXROdW1iZXJDaGFubmVsc19fZG9jX199LAorIHsic2V0TnVtYmVyQ2hhbm5lbHMiLCAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldE51bWJlckNoYW5uZWxzLCAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXROdW1iZXJDaGFubmVsc19fZG9jX199LAorIHsiZ2V0Q29udGludW91cyIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldENvbnRpbnVvdXMsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRDb250aW51b3VzX19kb2NfX30sCisgeyJzZXRDb250aW51b3VzIiwgICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0Q29udGludW91cywgICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldENvbnRpbnVvdXNfX2RvY19ffSwKKyB7ImdldElucHV0U291cmNlTmFtZXMiLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldElucHV0U291cmNlTmFtZXMsIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRJbnB1dFNvdXJjZU5hbWVzX19kb2NfX30sCisgeyJnZXRJbnB1dFNvdXJjZSIsICAgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0SW5wdXRTb3VyY2UsICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX2dldElucHV0U291cmNlX19kb2NfX30sCisgeyJzZXRJbnB1dFNvdXJjZSIsICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0SW5wdXRTb3VyY2UsICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldElucHV0U291cmNlX19kb2NfX30sCisgeyJnZXRQbGF5VGhydU9uT2ZmIiwgICAoUHlDRnVuY3Rpb24pc25kaWhfZ2V0UGxheVRocnVPbk9mZiwgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX2dldFBsYXlUaHJ1T25PZmZfX2RvY19ffSwKKyB7InNldFBsYXlUaHJ1T25PZmYiLCAgIChQeUNGdW5jdGlvbilzbmRpaF9zZXRQbGF5VGhydU9uT2ZmLCAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfc2V0UGxheVRocnVPbk9mZl9fZG9jX199LAorIHsiZ2V0U2FtcGxlUmF0ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX2dldFNhbXBsZVJhdGUsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVSYXRlX19kb2NfX30sCisgeyJzZXRTYW1wbGVSYXRlIiwgICAgICAoUHlDRnVuY3Rpb24pc25kaWhfc2V0U2FtcGxlUmF0ZSwgICAgICAgTUVUSF9WQVJBUkdTLCAgIHNuZGloX3NldFNhbXBsZVJhdGVfX2RvY19ffSwKKyB7ImdldFNhbXBsZVNpemUiLCAgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplLCAgICAgICBNRVRIX1ZBUkFSR1MsICAgc25kaWhfZ2V0U2FtcGxlU2l6ZV9fZG9jX199LAorIHsic2V0U2FtcGxlU2l6ZSIsICAgICAgKFB5Q0Z1bmN0aW9uKXNuZGloX3NldFNhbXBsZVNpemUsICAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9zZXRTYW1wbGVTaXplX19kb2NfX30sCisgeyJnZXRTYW1wbGVTaXplQXZhaWxhYmxlIiwgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlLCAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVTaXplQXZhaWxhYmxlX19kb2NfX30sCisgeyJnZXRTYW1wbGVSYXRlQXZhaWxhYmxlIiwgICAgIChQeUNGdW5jdGlvbilzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlLCAgICAgIE1FVEhfVkFSQVJHUywgICBzbmRpaF9nZXRTYW1wbGVSYXRlQXZhaWxhYmxlX19kb2NfX30sCisKKyAgICB7TlVMTCwgICAgICAgKFB5Q0Z1bmN0aW9uKU5VTEwsIDAsIE5VTEx9ICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIAogLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdFNuZGlob29rcykgKi8KIAotc3RhdGljIGNoYXIgU25kaWhvb2tzX21vZHVsZV9kb2N1bWVudGF0aW9uW10gPSAKK3N0YXRpYyBjaGFyIFNuZGlob29rc19tb2R1bGVfZG9jdW1lbnRhdGlvbltdID0KICIiCiA7CiAKIHZvaWQKIGluaXRfU25kaWhvb2tzKCkKIHsKLQlQeU9iamVjdCAqbSwgKmQ7CisgICAgUHlPYmplY3QgKm0sICpkOwogCi0JLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCi0JbSA9IFB5X0luaXRNb2R1bGU0KCJfU25kaWhvb2tzIiwgc25kaWhfbWV0aG9kcywKLQkJU25kaWhvb2tzX21vZHVsZV9kb2N1bWVudGF0aW9uLAotCQkoUHlPYmplY3QqKU5VTEwsUFlUSE9OX0FQSV9WRVJTSU9OKTsKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTQoIl9TbmRpaG9va3MiLCBzbmRpaF9tZXRob2RzLAorICAgICAgICBTbmRpaG9va3NfbW9kdWxlX2RvY3VtZW50YXRpb24sCisgICAgICAgIChQeU9iamVjdCopTlVMTCxQWVRIT05fQVBJX1ZFUlNJT04pOwogCi0JLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlFcnJvck9iamVjdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIlNuZGlob29rcy5lcnJvciIpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKyAgICAvKiBBZGQgc29tZSBzeW1ib2xpYyBjb25zdGFudHMgdG8gdGhlIG1vZHVsZSAqLworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIEVycm9yT2JqZWN0ID0gUHlTdHJpbmdfRnJvbVN0cmluZygiU25kaWhvb2tzLmVycm9yIik7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImVycm9yIiwgRXJyb3JPYmplY3QpOwogCi0JLyogWFhYWCBBZGQgY29uc3RhbnRzIGhlcmUgKi8KLQkKLQkvKiBDaGVjayBmb3IgZXJyb3JzICovCi0JaWYgKFB5RXJyX09jY3VycmVkKCkpCi0JCVB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIFNuZGlob29rcyIpOworICAgIC8qIFhYWFggQWRkIGNvbnN0YW50cyBoZXJlICovCisKKyAgICAvKiBDaGVjayBmb3IgZXJyb3JzICovCisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNhbid0IGluaXRpYWxpemUgbW9kdWxlIFNuZGlob29rcyIpOwogfQogCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9zbmQvX1NuZG1vZHVsZS5jIGIvTWFjL01vZHVsZXMvc25kL19TbmRtb2R1bGUuYwppbmRleCAxZjY0NjI5Li5kNzEzZWZlIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9zbmQvX1NuZG1vZHVsZS5jCisrKyBiL01hYy9Nb2R1bGVzL3NuZC9fU25kbW9kdWxlLmMKQEAgLTEwLDkgKzEwLDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTIyLDE2ICsyMiwxNiBAQAogc3RhdGljIGludAogU25kQ21kX0NvbnZlcnQoUHlPYmplY3QgKnYsIFNuZENvbW1hbmQgKnBjKQogewotICAgICAgICBpbnQgbGVuOwotICAgICAgICBwYy0+cGFyYW0xID0gMDsKLSAgICAgICAgcGMtPnBhcmFtMiA9IDA7Ci0gICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImh8aGwiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIkhocyMiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yLCAmbGVuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmcGMtPmNtZCk7CisgICAgaW50IGxlbjsKKyAgICBwYy0+cGFyYW0xID0gMDsKKyAgICBwYy0+cGFyYW0yID0gMDsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayh2KSkgeworICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiaHxobCIsICZwYy0+Y21kLCAmcGMtPnBhcmFtMSwgJnBjLT5wYXJhbTIpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJIaHMjIiwgJnBjLT5jbWQsICZwYy0+cGFyYW0xLCAmcGMtPnBhcmFtMiwgJmxlbik7CisgICAgfQorICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiSCIsICZwYy0+Y21kKTsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkIFNuZENoX1VzZXJSb3V0aW5lKFNuZENoYW5uZWxQdHIgY2hhbiwgU25kQ29tbWFuZCAqY21kKTsgLyogRm9yd2FyZCAqLwpAQCAtNDYsMTU2ICs0NiwxNTYgQEAKICNkZWZpbmUgU25kQ2hfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmU25kQ2hhbm5lbF9UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZTbmRDaGFubmVsX1R5cGUpKQogCiB0eXBlZGVmIHN0cnVjdCBTbmRDaGFubmVsT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JU25kQ2hhbm5lbFB0ciBvYl9pdHNlbGY7Ci0JLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCi0JUHlPYmplY3QgKm9iX2NhbGxiYWNrOwotCWxvbmcgb2JfQTU7Ci0JU25kQ29tbWFuZCBvYl9jbWQ7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFNuZENoYW5uZWxQdHIgb2JfaXRzZWxmOworICAgIC8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLworICAgIFB5T2JqZWN0ICpvYl9jYWxsYmFjazsKKyAgICBsb25nIG9iX0E1OworICAgIFNuZENvbW1hbmQgb2JfY21kOwogfSBTbmRDaGFubmVsT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX05ldyhTbmRDaGFubmVsUHRyIGl0c2VsZikKIHsKLQlTbmRDaGFubmVsT2JqZWN0ICppdDsKLQlpdCA9IFB5T2JqZWN0X05FVyhTbmRDaGFubmVsT2JqZWN0LCAmU25kQ2hhbm5lbF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOwotCWl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOwotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBTbmRDaGFubmVsT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTbmRDaGFubmVsT2JqZWN0LCAmU25kQ2hhbm5lbF9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOworICAgIGl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOworICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogc3RhdGljIHZvaWQgU25kQ2hfZGVhbGxvYyhTbmRDaGFubmVsT2JqZWN0ICpzZWxmKQogewotCVNuZERpc3Bvc2VDaGFubmVsKHNlbGYtPm9iX2l0c2VsZiwgMSk7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7Ci0JUHlPYmplY3RfRnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBTbmREaXNwb3NlQ2hhbm5lbChzZWxmLT5vYl9pdHNlbGYsIDEpOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2spOworICAgIFB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kQ2hfU25kRG9Db21tYW5kKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ29tbWFuZCBjbWQ7Ci0JQm9vbGVhbiBub1dhaXQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgU25kQ21kX0NvbnZlcnQsICZjbWQsCi0JICAgICAgICAgICAgICAgICAgICAgICZub1dhaXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kRG9Db21tYW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAmY21kLAotCSAgICAgICAgICAgICAgICAgICAgbm9XYWl0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRDb21tYW5kIGNtZDsKKyAgICBCb29sZWFuIG5vV2FpdDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbmRDbWRfQ29udmVydCwgJmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vV2FpdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmREb0NvbW1hbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICBub1dhaXQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZERvSW1tZWRpYXRlKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ29tbWFuZCBjbWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBTbmRDbWRfQ29udmVydCwgJmNtZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmREb0ltbWVkaWF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAmY21kKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRDb21tYW5kIGNtZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNuZENtZF9Db252ZXJ0LCAmY21kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZERvSW1tZWRpYXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZFBsYXkoU25kQ2hhbm5lbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKLQlCb29sZWFuIGFzeW5jOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYXN5bmMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kUGxheShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHNuZEhhbmRsZSwKLQkgICAgICAgICAgICAgICBhc3luYyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kTGlzdEhhbmRsZSBzbmRIYW5kbGU7CisgICAgQm9vbGVhbiBhc3luYzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFzeW5jKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNuZFBsYXkoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICBzbmRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgYXN5bmMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZENoX1NuZENoYW5uZWxTdGF0dXMoU25kQ2hhbm5lbE9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB0aGVMZW5ndGg7Ci0JU0NTdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRDaGFubmVsU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGVuZ3RoLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVTdGF0dXNfX291dF9fKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlU3RhdHVzX19vdXRfXywgKGludClzaXplb2YoU0NTdGF0dXMpKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCB0aGVMZW5ndGg7CisgICAgU0NTdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRDaGFubmVsU3RhdHVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVTdGF0dXNfX291dF9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmdGhlU3RhdHVzX19vdXRfXywgKGludClzaXplb2YoU0NTdGF0dXMpKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRDaF9TbmRHZXRJbmZvKFNuZENoYW5uZWxPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIHNlbGVjdG9yOwotCXZvaWQgKiBpbmZvUHRyOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdyIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5mb1B0cikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRHZXRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgaW5mb1B0cik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHNlbGVjdG9yOworICAgIHZvaWQgKiBpbmZvUHRyOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mdyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mb1B0cikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRHZXRJbmZvKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgaW5mb1B0cik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kQ2hfU25kU2V0SW5mbyhTbmRDaGFubmVsT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSBzZWxlY3RvcjsKLQl2b2lkICogaW5mb1B0cjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnciLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9QdHIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU25kU2V0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAotCSAgICAgICAgICAgICAgICAgIGluZm9QdHIpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIE9TVHlwZSBzZWxlY3RvcjsKKyAgICB2b2lkICogaW5mb1B0cjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJnciLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9QdHIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kU2V0SW5mbyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGluZm9QdHIpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgU25kQ2hfbWV0aG9kc1tdID0gewotCXsiU25kRG9Db21tYW5kIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZERvQ29tbWFuZCwgMSwKLQkgUHlEb2NfU1RSKCIoU25kQ29tbWFuZCBjbWQsIEJvb2xlYW4gbm9XYWl0KSAtPiBOb25lIil9LAotCXsiU25kRG9JbW1lZGlhdGUiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kRG9JbW1lZGlhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFNuZENvbW1hbmQgY21kKSAtPiBOb25lIil9LAotCXsiU25kUGxheSIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmRQbGF5LCAxLAotCSBQeURvY19TVFIoIihTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSwgQm9vbGVhbiBhc3luYykgLT4gTm9uZSIpfSwKLQl7IlNuZENoYW5uZWxTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kQ2hhbm5lbFN0YXR1cywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgdGhlTGVuZ3RoKSAtPiAoU0NTdGF0dXMgdGhlU3RhdHVzKSIpfSwKLQl7IlNuZEdldEluZm8iLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kR2V0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHNlbGVjdG9yLCB2b2lkICogaW5mb1B0cikgLT4gTm9uZSIpfSwKLQl7IlNuZFNldEluZm8iLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kU2V0SW5mbywgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIHNlbGVjdG9yLCB2b2lkICogaW5mb1B0cikgLT4gTm9uZSIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IlNuZERvQ29tbWFuZCIsIChQeUNGdW5jdGlvbilTbmRDaF9TbmREb0NvbW1hbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNuZENvbW1hbmQgY21kLCBCb29sZWFuIG5vV2FpdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNuZERvSW1tZWRpYXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZERvSW1tZWRpYXRlLCAxLAorICAgICBQeURvY19TVFIoIihTbmRDb21tYW5kIGNtZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNuZFBsYXkiLCAoUHlDRnVuY3Rpb24pU25kQ2hfU25kUGxheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUsIEJvb2xlYW4gYXN5bmMpIC0+IE5vbmUiKX0sCisgICAgeyJTbmRDaGFubmVsU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZENoYW5uZWxTdGF0dXMsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHRoZUxlbmd0aCkgLT4gKFNDU3RhdHVzIHRoZVN0YXR1cykiKX0sCisgICAgeyJTbmRHZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZEdldEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3Rvciwgdm9pZCAqIGluZm9QdHIpIC0+IE5vbmUiKX0sCisgICAgeyJTbmRTZXRJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZENoX1NuZFNldEluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBzZWxlY3Rvciwgdm9pZCAqIGluZm9QdHIpIC0+IE5vbmUiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFNuZENoX2dldHNldGxpc3QgTlVMTApAQCAtMjA4LDQ3ICsyMDgsNDcgQEAKICNkZWZpbmUgU25kQ2hfaGFzaCBOVUxMCiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgU25kQ2hhbm5lbF9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9TbmQuU25kQ2hhbm5lbCIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFNuZENoYW5uZWxPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBTbmRDaF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBTbmRDaF9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU25kQ2hfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFNuZENoX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KLQkwLCAvKnRwX2RvYyovCi0JMCwgLyp0cF90cmF2ZXJzZSovCi0JMCwgLyp0cF9jbGVhciovCi0JMCwgLyp0cF9yaWNoY29tcGFyZSovCi0JMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCi0JMCwgLyp0cF9pdGVyKi8KLQkwLCAvKnRwX2l0ZXJuZXh0Ki8KLQlTbmRDaF9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlTbmRDaF9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCi0JMCwgLyp0cF9iYXNlKi8KLQkwLCAvKnRwX2RpY3QqLwotCTAsIC8qdHBfZGVzY3JfZ2V0Ki8KLQkwLCAvKnRwX2Rlc2NyX3NldCovCi0JMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2luaXQqLwotCTAsIC8qdHBfYWxsb2MqLwotCTAsIC8qdHBfbmV3Ki8KLQkwLCAvKnRwX2ZyZWUqLworICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgIDAsIC8qb2Jfc2l6ZSovCisgICAgIl9TbmQuU25kQ2hhbm5lbCIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNuZENoYW5uZWxPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKSBTbmRDaF9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTbmRDaF9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLworICAgIChyZXByZnVuYykgU25kQ2hfcmVwciwgLyp0cF9yZXByKi8KKyAgICAoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCisgICAgKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAoaGFzaGZ1bmMpIFNuZENoX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTbmRDaF9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBTbmRDaF9nZXRzZXRsaXN0LCAvKnRwX2dldHNldCovCisgICAgMCwgLyp0cF9iYXNlKi8KKyAgICAwLCAvKnRwX2RpY3QqLworICAgIDAsIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2luaXQqLworICAgIDAsIC8qdHBfYWxsb2MqLworICAgIDAsIC8qdHBfbmV3Ki8KKyAgICAwLCAvKnRwX2ZyZWUqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgU25kQ2hhbm5lbCAtLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0yNjEsODkgKzI2MSw4OSBAQAogI2RlZmluZSBTUEJPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmU1BCX1R5cGUgfHwgUHlPYmplY3RfVHlwZUNoZWNrKCh4KSwgJlNQQl9UeXBlKSkKIAogdHlwZWRlZiBzdHJ1Y3QgU1BCT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCi0JUHlPYmplY3QgKm9iX2NvbXBsZXRpb247Ci0JUHlPYmplY3QgKm9iX2ludGVycnVwdDsKLQlQeU9iamVjdCAqb2JfdGhpc2NhbGxiYWNrOwotCWxvbmcgb2JfQTU7Ci0JU1BCIG9iX3NwYjsKKyAgICBQeU9iamVjdF9IRUFECisgICAgLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovCisgICAgUHlPYmplY3QgKm9iX2NvbXBsZXRpb247CisgICAgUHlPYmplY3QgKm9iX2ludGVycnVwdDsKKyAgICBQeU9iamVjdCAqb2JfdGhpc2NhbGxiYWNrOworICAgIGxvbmcgb2JfQTU7CisgICAgU1BCIG9iX3NwYjsKIH0gU1BCT2JqZWN0OwogCiBzdGF0aWMgUHlPYmplY3QgKlNQQk9ial9OZXcodm9pZCkKIHsKLQlTUEJPYmplY3QgKml0OwotCWl0ID0gUHlPYmplY3RfTkVXKFNQQk9iamVjdCwgJlNQQl9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2NvbXBsZXRpb24gPSBOVUxMOwotCWl0LT5vYl9pbnRlcnJ1cHQgPSBOVUxMOwotCWl0LT5vYl90aGlzY2FsbGJhY2sgPSBOVUxMOwotCWl0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOwotCW1lbXNldCgoY2hhciAqKSZpdC0+b2Jfc3BiLCAwLCBzaXplb2YoaXQtPm9iX3NwYikpOwotCWl0LT5vYl9zcGIudXNlckxvbmcgPSAobG9uZylpdDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgU1BCT2JqZWN0ICppdDsKKyAgICBpdCA9IFB5T2JqZWN0X05FVyhTUEJPYmplY3QsICZTUEJfVHlwZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGl0LT5vYl9jb21wbGV0aW9uID0gTlVMTDsKKyAgICBpdC0+b2JfaW50ZXJydXB0ID0gTlVMTDsKKyAgICBpdC0+b2JfdGhpc2NhbGxiYWNrID0gTlVMTDsKKyAgICBpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsKKyAgICBtZW1zZXQoKGNoYXIgKikmaXQtPm9iX3NwYiwgMCwgc2l6ZW9mKGl0LT5vYl9zcGIpKTsKKyAgICBpdC0+b2Jfc3BiLnVzZXJMb25nID0gKGxvbmcpaXQ7CisgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogc3RhdGljIGludCBTUEJPYmpfQ29udmVydChQeU9iamVjdCAqdiwgU1BCUHRyICpwX2l0c2VsZikKIHsKLQlpZiAoIVNQQk9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJTUEIgcmVxdWlyZWQiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCSpwX2l0c2VsZiA9ICYoKFNQQk9iamVjdCAqKXYpLT5vYl9zcGI7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFTUEJPYmpfQ2hlY2sodikpCisgICAgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiU1BCIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqcF9pdHNlbGYgPSAmKChTUEJPYmplY3QgKil2KS0+b2Jfc3BiOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgdm9pZCBTUEJPYmpfZGVhbGxvYyhTUEJPYmplY3QgKnNlbGYpCiB7Ci0JLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCi0Jc2VsZi0+b2Jfc3BiLnVzZXJMb25nID0gMDsKLQlzZWxmLT5vYl90aGlzY2FsbGJhY2sgPSAwOwotCVB5X1hERUNSRUYoc2VsZi0+b2JfY29tcGxldGlvbik7Ci0JUHlfWERFQ1JFRihzZWxmLT5vYl9pbnRlcnJ1cHQpOwotCVB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgLyogQ2xlYW51cCBvZiBzZWxmLT5vYl9pdHNlbGYgZ29lcyBoZXJlICovCisgICAgc2VsZi0+b2Jfc3BiLnVzZXJMb25nID0gMDsKKyAgICBzZWxmLT5vYl90aGlzY2FsbGJhY2sgPSAwOworICAgIFB5X1hERUNSRUYoc2VsZi0+b2JfY29tcGxldGlvbik7CisgICAgUHlfWERFQ1JFRihzZWxmLT5vYl9pbnRlcnJ1cHQpOworICAgIFB5T2JqZWN0X0ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBTUEJPYmpfbWV0aG9kc1tdID0gewotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpTUEJPYmpfZ2V0X2luUmVmTnVtKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5pblJlZk51bSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOwogfQogCiBzdGF0aWMgaW50IFNQQk9ial9zZXRfaW5SZWZOdW0oU1BCT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOwotCXJldHVybiAwOworICAgIHJldHVybiAtMSArIFB5QXJnX1BhcnNlKHYsICJsIiwgJnNlbGYtPm9iX3NwYi5pblJlZk51bSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU1BCT2JqX2dldF9jb3VudChTUEJPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuY291bnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLmNvdW50KTsKIH0KIAogc3RhdGljIGludCBTUEJPYmpfc2V0X2NvdW50KFNQQk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLmNvdW50KTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuY291bnQpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNQQk9ial9nZXRfbWlsbGlzZWNvbmRzKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5taWxsaXNlY29uZHMpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLm1pbGxpc2Vjb25kcyk7CiB9CiAKIHN0YXRpYyBpbnQgU1BCT2JqX3NldF9taWxsaXNlY29uZHMoU1BCT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsKLQlyZXR1cm4gMDsKKyAgICByZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTUEJPYmpfZ2V0X2Vycm9yKFNQQk9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPm9iX3NwYi5lcnJvcik7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCBzZWxmLT5vYl9zcGIuZXJyb3IpOwogfQogCiAjZGVmaW5lIFNQQk9ial9zZXRfZXJyb3IgTlVMTApAQCAtMzUyLDIwICszNTIsMjAgQEAKIAogc3RhdGljIGludCBTUEJPYmpfc2V0X2NvbXBsZXRpb25Sb3V0aW5lKFNQQk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0Jc2VsZi0+b2Jfc3BiLmNvbXBsZXRpb25Sb3V0aW5lID0gTmV3U0lDb21wbGV0aW9uVVBQKFNQQl9jb21wbGV0aW9uKTsKLQkgICAgICAgICAgICBzZWxmLT5vYl9jb21wbGV0aW9uID0gdjsKLQkgICAgICAgICAgICBQeV9JTkNSRUYodik7Ci0JICAgICAgICAgICAgcmV0dXJuIDA7Ci0JcmV0dXJuIDA7CisgICAgc2VsZi0+b2Jfc3BiLmNvbXBsZXRpb25Sb3V0aW5lID0gTmV3U0lDb21wbGV0aW9uVVBQKFNQQl9jb21wbGV0aW9uKTsKKyAgICAgICAgICAgICAgICBzZWxmLT5vYl9jb21wbGV0aW9uID0gdjsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeUdldFNldERlZiBTUEJPYmpfZ2V0c2V0bGlzdFtdID0gewotCXsiaW5SZWZOdW0iLCAoZ2V0dGVyKVNQQk9ial9nZXRfaW5SZWZOdW0sIChzZXR0ZXIpU1BCT2JqX3NldF9pblJlZk51bSwgTlVMTH0sCi0JeyJjb3VudCIsIChnZXR0ZXIpU1BCT2JqX2dldF9jb3VudCwgKHNldHRlcilTUEJPYmpfc2V0X2NvdW50LCBOVUxMfSwKLQl7Im1pbGxpc2Vjb25kcyIsIChnZXR0ZXIpU1BCT2JqX2dldF9taWxsaXNlY29uZHMsIChzZXR0ZXIpU1BCT2JqX3NldF9taWxsaXNlY29uZHMsIE5VTEx9LAotCXsiZXJyb3IiLCAoZ2V0dGVyKVNQQk9ial9nZXRfZXJyb3IsIChzZXR0ZXIpU1BCT2JqX3NldF9lcnJvciwgTlVMTH0sCi0JeyJjb21wbGV0aW9uUm91dGluZSIsIChnZXR0ZXIpU1BCT2JqX2dldF9jb21wbGV0aW9uUm91dGluZSwgKHNldHRlcilTUEJPYmpfc2V0X2NvbXBsZXRpb25Sb3V0aW5lLCBOVUxMfSwKLQl7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCisgICAgeyJpblJlZk51bSIsIChnZXR0ZXIpU1BCT2JqX2dldF9pblJlZk51bSwgKHNldHRlcilTUEJPYmpfc2V0X2luUmVmTnVtLCBOVUxMfSwKKyAgICB7ImNvdW50IiwgKGdldHRlcilTUEJPYmpfZ2V0X2NvdW50LCAoc2V0dGVyKVNQQk9ial9zZXRfY291bnQsIE5VTEx9LAorICAgIHsibWlsbGlzZWNvbmRzIiwgKGdldHRlcilTUEJPYmpfZ2V0X21pbGxpc2Vjb25kcywgKHNldHRlcilTUEJPYmpfc2V0X21pbGxpc2Vjb25kcywgTlVMTH0sCisgICAgeyJlcnJvciIsIChnZXR0ZXIpU1BCT2JqX2dldF9lcnJvciwgKHNldHRlcilTUEJPYmpfc2V0X2Vycm9yLCBOVUxMfSwKKyAgICB7ImNvbXBsZXRpb25Sb3V0aW5lIiwgKGdldHRlcilTUEJPYmpfZ2V0X2NvbXBsZXRpb25Sb3V0aW5lLCAoc2V0dGVyKVNQQk9ial9zZXRfY29tcGxldGlvblJvdXRpbmUsIE5VTEx9LAorICAgIHtOVUxMLCBOVUxMLCBOVUxMLCBOVUxMfSwKIH07CiAKIApAQCAtMzc2LDQ3ICszNzYsNDcgQEAKICNkZWZpbmUgU1BCT2JqX2hhc2ggTlVMTAogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNQQl9UeXBlID0gewotCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQotCTAsIC8qb2Jfc2l6ZSovCi0JIl9TbmQuU1BCIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoU1BCT2JqZWN0KSwgLyp0cF9iYXNpY3NpemUqLwotCTAsIC8qdHBfaXRlbXNpemUqLwotCS8qIG1ldGhvZHMgKi8KLQkoZGVzdHJ1Y3RvcikgU1BCT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCi0JMCwgLyp0cF9wcmludCovCi0JKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCi0JKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCi0JKGNtcGZ1bmMpIFNQQk9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgU1BCT2JqX3JlcHIsIC8qdHBfcmVwciovCi0JKFB5TnVtYmVyTWV0aG9kcyAqKTAsIC8qIHRwX2FzX251bWJlciAqLwotCShQeVNlcXVlbmNlTWV0aG9kcyAqKTAsIC8qIHRwX2FzX3NlcXVlbmNlICovCi0JKFB5TWFwcGluZ01ldGhvZHMgKikwLCAvKiB0cF9hc19tYXBwaW5nICovCi0JKGhhc2hmdW5jKSBTUEJPYmpfaGFzaCwgLyp0cF9oYXNoKi8KLQkwLCAvKnRwX2NhbGwqLwotCTAsIC8qdHBfc3RyKi8KLQlQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCi0JUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KLQkwLCAvKnRwX2FzX2J1ZmZlciovCi0JUHlfVFBGTEFHU19ERUZBVUxULCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVNQQk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlTUEJPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JMCwgLyp0cF9pbml0Ki8KLQkwLCAvKnRwX2FsbG9jKi8KLQkwLCAvKnRwX25ldyovCi0JMCwgLyp0cF9mcmVlKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfU25kLlNQQiIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFNQQk9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFNQQk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBTUEJPYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFNQQk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgU1BCT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgLyogdHBfZmxhZ3MgKi8KKyAgICAwLCAvKnRwX2RvYyovCisgICAgMCwgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgLyp0cF9jbGVhciovCisgICAgMCwgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgLyp0cF9pdGVyKi8KKyAgICAwLCAvKnRwX2l0ZXJuZXh0Ki8KKyAgICBTUEJPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgU1BCT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKnRwX2Jhc2UqLworICAgIDAsIC8qdHBfZGljdCovCisgICAgMCwgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsIC8qdHBfaW5pdCovCisgICAgMCwgLyp0cF9hbGxvYyovCisgICAgMCwgLyp0cF9uZXcqLworICAgIDAsIC8qdHBfZnJlZSovCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVuZCBvYmplY3QgdHlwZSBTUEIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQyNCw2MzQgKzQyNCw2MzQgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlfcmVzID0gU1BCT2JqX05ldygpOyByZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgX3JlcyA9IFNQQk9ial9OZXcoKTsgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1N5c0JlZXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGR1cmF0aW9uOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlTeXNCZWVwKGR1cmF0aW9uKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGR1cmF0aW9uOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTeXNCZWVwKGR1cmF0aW9uKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NuZE5ld0NoYW5uZWwoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU25kQ2hhbm5lbFB0ciBjaGFuID0gMDsKLQlzaG9ydCBzeW50aDsKLQlsb25nIGluaXQ7Ci0JUHlPYmplY3QqIHVzZXJSb3V0aW5lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZzeW50aCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluaXQsCi0JICAgICAgICAgICAgICAgICAgICAgICZ1c2VyUm91dGluZSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1c2VyUm91dGluZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKHVzZXJSb3V0aW5lKSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYWxsYmFjayBtdXN0IGJlIGNhbGxhYmxlIik7Ci0JCWdvdG8gdXNlclJvdXRpbmVfX2Vycm9yX187Ci0JfQotCV9lcnIgPSBTbmROZXdDaGFubmVsKCZjaGFuLAotCSAgICAgICAgICAgICAgICAgICAgIHN5bnRoLAotCSAgICAgICAgICAgICAgICAgICAgIGluaXQsCi0JICAgICAgICAgICAgICAgICAgICAgTmV3U25kQ2FsbEJhY2tVUFAoU25kQ2hfVXNlclJvdXRpbmUpKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgU25kQ2hfTmV3LCBjaGFuKTsKLQlpZiAoX3JlcyAhPSBOVUxMICYmIHVzZXJSb3V0aW5lICE9IFB5X05vbmUpCi0JewotCQlTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilfcmVzOwotCQlwLT5vYl9pdHNlbGYtPnVzZXJJbmZvID0gKGxvbmcpcDsKLQkJUHlfSU5DUkVGKHVzZXJSb3V0aW5lKTsKLQkJcC0+b2JfY2FsbGJhY2sgPSB1c2VyUm91dGluZTsKLQl9CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgU25kQ2hhbm5lbFB0ciBjaGFuID0gMDsKKyAgICBzaG9ydCBzeW50aDsKKyAgICBsb25nIGluaXQ7CisgICAgUHlPYmplY3QqIHVzZXJSb3V0aW5lOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhsTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeW50aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyUm91dGluZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmICh1c2VyUm91dGluZSAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKHVzZXJSb3V0aW5lKSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYWxsYmFjayBtdXN0IGJlIGNhbGxhYmxlIik7CisgICAgICAgIGdvdG8gdXNlclJvdXRpbmVfX2Vycm9yX187CisgICAgfQorICAgIF9lcnIgPSBTbmROZXdDaGFubmVsKCZjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTmV3U25kQ2FsbEJhY2tVUFAoU25kQ2hfVXNlclJvdXRpbmUpKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU25kQ2hfTmV3LCBjaGFuKTsKKyAgICBpZiAoX3JlcyAhPSBOVUxMICYmIHVzZXJSb3V0aW5lICE9IFB5X05vbmUpCisgICAgeworICAgICAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilfcmVzOworICAgICAgICBwLT5vYl9pdHNlbGYtPnVzZXJJbmZvID0gKGxvbmcpcDsKKyAgICAgICAgUHlfSU5DUkVGKHVzZXJSb3V0aW5lKTsKKyAgICAgICAgcC0+b2JfY2FsbGJhY2sgPSB1c2VyUm91dGluZTsKKyAgICB9CiAgdXNlclJvdXRpbmVfX2Vycm9yX186IDsKLQlyZXR1cm4gX3JlczsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kU291bmRNYW5hZ2VyVmVyc2lvbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JTnVtVmVyc2lvbiBfcnY7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFNuZFNvdW5kTWFuYWdlclZlcnNpb24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkTnVtVmVyc2lvbiwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgTnVtVmVyc2lvbiBfcnY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFNuZFNvdW5kTWFuYWdlclZlcnNpb24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkTnVtVmVyc2lvbiwgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kTWFuYWdlclN0YXR1cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCB0aGVMZW5ndGg7Ci0JU01TdGF0dXMgdGhlU3RhdHVzX19vdXRfXzsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnRoZUxlbmd0aCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRNYW5hZ2VyU3RhdHVzKHRoZUxlbmd0aCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAmdGhlU3RhdHVzX19vdXRfXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJnRoZVN0YXR1c19fb3V0X18sIChpbnQpc2l6ZW9mKFNNU3RhdHVzKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgdGhlTGVuZ3RoOworICAgIFNNU3RhdHVzIHRoZVN0YXR1c19fb3V0X187CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aGVMZW5ndGgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kTWFuYWdlclN0YXR1cyh0aGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVN0YXR1c19fb3V0X18pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSZ0aGVTdGF0dXNfX291dF9fLCAoaW50KXNpemVvZihTTVN0YXR1cykpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TbmRHZXRTeXNCZWVwU3RhdGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IHN5c0JlZXBTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU25kR2V0U3lzQmVlcFN0YXRlKCZzeXNCZWVwU3RhdGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKLQkgICAgICAgICAgICAgICAgICAgICBzeXNCZWVwU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBzeXNCZWVwU3RhdGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNuZEdldFN5c0JlZXBTdGF0ZSgmc3lzQmVlcFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3lzQmVlcFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU25kU2V0U3lzQmVlcFN0YXRlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IHN5c0JlZXBTdGF0ZTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnN5c0JlZXBTdGF0ZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRTZXRTeXNCZWVwU3RhdGUoc3lzQmVlcFN0YXRlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBzeXNCZWVwU3RhdGU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzeXNCZWVwU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU25kU2V0U3lzQmVlcFN0YXRlKHN5c0JlZXBTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX0dldFN5c0JlZXBWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBsZXZlbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFN5c0JlZXBWb2x1bWUoJmxldmVsKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBsZXZlbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFN5c0JlZXBWb2x1bWUoJmxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NldFN5c0JlZXBWb2x1bWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBsZXZlbDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFN5c0JlZXBWb2x1bWUobGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgbGV2ZWw7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZsZXZlbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRTeXNCZWVwVm9sdW1lKGxldmVsKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfR2V0RGVmYXVsdE91dHB1dFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGxldmVsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0RGVmYXVsdE91dHB1dFZvbHVtZSgmbGV2ZWwpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGxldmVsOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0RGVmYXVsdE91dHB1dFZvbHVtZSgmbGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU2V0RGVmYXVsdE91dHB1dFZvbHVtZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGxldmVsOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGV2ZWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0RGVmYXVsdE91dHB1dFZvbHVtZShsZXZlbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBsZXZlbDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldERlZmF1bHRPdXRwdXRWb2x1bWUobGV2ZWwpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9HZXRTb3VuZEhlYWRlck9mZnNldChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKLQlsb25nIG9mZnNldDsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFNvdW5kSGVhZGVyT2Zmc2V0KHNuZEhhbmRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZTsKKyAgICBsb25nIG9mZnNldDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc25kSGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNvdW5kSGVhZGVyT2Zmc2V0KHNuZEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfR2V0Q29tcHJlc3Npb25JbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCXNob3J0IGNvbXByZXNzaW9uSUQ7Ci0JT1NUeXBlIGZvcm1hdDsKLQlzaG9ydCBudW1DaGFubmVsczsKLQlzaG9ydCBzYW1wbGVTaXplOwotCUNvbXByZXNzaW9uSW5mbyBjcF9fb3V0X187Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8maGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29tcHJlc3Npb25JRCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgICAmbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVTaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uSW5mbyhjb21wcmVzc2lvbklELAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVTaXplLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgJmNwX19vdXRfXyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgicyMiLAotCSAgICAgICAgICAgICAgICAgICAgIChjaGFyICopJmNwX19vdXRfXywgKGludClzaXplb2YoQ29tcHJlc3Npb25JbmZvKSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgc2hvcnQgY29tcHJlc3Npb25JRDsKKyAgICBPU1R5cGUgZm9ybWF0OworICAgIHNob3J0IG51bUNoYW5uZWxzOworICAgIHNob3J0IHNhbXBsZVNpemU7CisgICAgQ29tcHJlc3Npb25JbmZvIGNwX19vdXRfXzsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2lvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25JbmZvKGNvbXByZXNzaW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3BfX291dF9fKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikmY3BfX291dF9fLCAoaW50KXNpemVvZihDb21wcmVzc2lvbkluZm8pKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU2V0U291bmRQcmVmZXJlbmNlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCU9TVHlwZSB0aGVUeXBlOwotCVN0cjI1NSBuYW1lOwotCUhhbmRsZSBzZXR0aW5nczsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmdGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZzZXR0aW5ncykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRTb3VuZFByZWZlcmVuY2UodGhlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBuYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgdGhlVHlwZTsKKyAgICBTdHIyNTUgbmFtZTsKKyAgICBIYW5kbGUgc2V0dGluZ3M7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2V0dGluZ3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0U291bmRQcmVmZXJlbmNlKHRoZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX0dldFNvdW5kUHJlZmVyZW5jZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlPU1R5cGUgdGhlVHlwZTsKLQlTdHIyNTUgbmFtZTsKLQlIYW5kbGUgc2V0dGluZ3M7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmc2V0dGluZ3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U291bmRQcmVmZXJlbmNlKHRoZVR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgbmFtZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgT1NUeXBlIHRoZVR5cGU7CisgICAgU3RyMjU1IG5hbWU7CisgICAgSGFuZGxlIHNldHRpbmdzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZ0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnNldHRpbmdzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNvdW5kUHJlZmVyZW5jZSh0aGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIG5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9HZXRDb21wcmVzc2lvbk5hbWUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JT1NUeXBlIGNvbXByZXNzaW9uVHlwZTsKLQlTdHIyNTUgY29tcHJlc3Npb25OYW1lOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmY29tcHJlc3Npb25UeXBlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldENvbXByZXNzaW9uTmFtZShjb21wcmVzc2lvblR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbk5hbWUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgY29tcHJlc3Npb25OYW1lKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBPU1R5cGUgY29tcHJlc3Npb25UeXBlOworICAgIFN0cjI1NSBjb21wcmVzc2lvbk5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZjb21wcmVzc2lvblR5cGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0Q29tcHJlc3Npb25OYW1lKGNvbXByZXNzaW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTmFtZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBjb21wcmVzc2lvbk5hbWUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJWZXJzaW9uKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlOdW1WZXJzaW9uIF9ydjsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gU1BCVmVyc2lvbigpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGROdW1WZXJzaW9uLCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBOdW1WZXJzaW9uIF9ydjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gU1BCVmVyc2lvbigpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGROdW1WZXJzaW9uLCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TbmRSZWNvcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JUG9pbnQgY29ybmVyOwotCU9TVHlwZSBxdWFsaXR5OwotCVNuZExpc3RIYW5kbGUgc25kSGFuZGxlOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNvcm5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcXVhbGl0eSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTbmRSZWNvcmQoKE1vZGFsRmlsdGVyVVBQKTAsCi0JICAgICAgICAgICAgICAgICBjb3JuZXIsCi0JICAgICAgICAgICAgICAgICBxdWFsaXR5LAotCSAgICAgICAgICAgICAgICAgJnNuZEhhbmRsZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNuZEhhbmRsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUG9pbnQgY29ybmVyOworICAgIE9TVHlwZSBxdWFsaXR5OworICAgIFNuZExpc3RIYW5kbGUgc25kSGFuZGxlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJmNvcm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcXVhbGl0eSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTbmRSZWNvcmQoKE1vZGFsRmlsdGVyVVBQKTAsCisgICAgICAgICAgICAgICAgICAgICBjb3JuZXIsCisgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgJnNuZEhhbmRsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIHNuZEhhbmRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQlNpZ25JbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBkZXZpY2VSZWZOdW07Ci0JU3RyMjU1IGRldmljZU5hbWU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlNpZ25JbkRldmljZShkZXZpY2VSZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBzaG9ydCBkZXZpY2VSZWZOdW07CisgICAgU3RyMjU1IGRldmljZU5hbWU7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlNpZ25JbkRldmljZShkZXZpY2VSZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCU2lnbk91dERldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlzaG9ydCBkZXZpY2VSZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCU2lnbk91dERldmljZShkZXZpY2VSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGRldmljZVJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZVJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJTaWduT3V0RGV2aWNlKGRldmljZVJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQkdldEluZGV4ZWREZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0Jc2hvcnQgY291bnQ7Ci0JU3RyMjU1IGRldmljZU5hbWU7Ci0JSGFuZGxlIGRldmljZUljb25IYW5kbGU7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb3VudCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJHZXRJbmRleGVkRGV2aWNlKGNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUljb25IYW5kbGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBkZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGRldmljZUljb25IYW5kbGUpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIHNob3J0IGNvdW50OworICAgIFN0cjI1NSBkZXZpY2VOYW1lOworICAgIEhhbmRsZSBkZXZpY2VJY29uSGFuZGxlOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCR2V0SW5kZXhlZERldmljZShjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJY29uSGFuZGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFN0cjI1NSwgZGV2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBkZXZpY2VJY29uSGFuZGxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCT3BlbkRldmljZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlTdHIyNTUgZGV2aWNlTmFtZTsKLQlzaG9ydCBwZXJtaXNzaW9uOwotCWxvbmcgaW5SZWZOdW07Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJPcGVuRGV2aWNlKGRldmljZU5hbWUsCi0JICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIGluUmVmTnVtKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTdHIyNTUgZGV2aWNlTmFtZTsKKyAgICBzaG9ydCBwZXJtaXNzaW9uOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCBkZXZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGVybWlzc2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJPcGVuRGV2aWNlKGRldmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVmTnVtKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCQ2xvc2VEZXZpY2UoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQkNsb3NlRGV2aWNlKGluUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCQ2xvc2VEZXZpY2UoaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJSZWNvcmQoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JU1BCUHRyIGluUGFyYW1QdHI7Ci0JQm9vbGVhbiBhc3luY2hGbGFnOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFNQQk9ial9Db252ZXJ0LCAmaW5QYXJhbVB0ciwKLQkgICAgICAgICAgICAgICAgICAgICAgJmFzeW5jaEZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUmVjb3JkKGluUGFyYW1QdHIsCi0JICAgICAgICAgICAgICAgICBhc3luY2hGbGFnKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBTUEJQdHIgaW5QYXJhbVB0cjsKKyAgICBCb29sZWFuIGFzeW5jaEZsYWc7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU1BCT2JqX0NvbnZlcnQsICZpblBhcmFtUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXN5bmNoRmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJSZWNvcmQoaW5QYXJhbVB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGFzeW5jaEZsYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJQYXVzZVJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUGF1c2VSZWNvcmRpbmcoaW5SZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJQYXVzZVJlY29yZGluZyhpblJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqU25kX1NQQlJlc3VtZVJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCUmVzdW1lUmVjb3JkaW5nKGluUmVmTnVtKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU1BCUmVzdW1lUmVjb3JkaW5nKGluUmVmTnVtKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCU3RvcFJlY29yZGluZyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCU3RvcFJlY29yZGluZyhpblJlZk51bSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlN0b3BSZWNvcmRpbmcoaW5SZWZOdW0pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJHZXRSZWNvcmRpbmdTdGF0dXMoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7Ci0JbG9uZyBpblJlZk51bTsKLQlzaG9ydCByZWNvcmRpbmdTdGF0dXM7Ci0Jc2hvcnQgbWV0ZXJMZXZlbDsKLQl1bnNpZ25lZCBsb25nIHRvdGFsU2FtcGxlc1RvUmVjb3JkOwotCXVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQ7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbE1zZWNzVG9SZWNvcmQ7Ci0JdW5zaWduZWQgbG9uZyBudW1iZXJPZk1zZWNzUmVjb3JkZWQ7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJHZXRSZWNvcmRpbmdTdGF0dXMoaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjb3JkaW5nU3RhdHVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGVyTGV2ZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxTYW1wbGVzVG9SZWNvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZTYW1wbGVzUmVjb3JkZWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG90YWxNc2Vjc1RvUmVjb3JkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bWJlck9mTXNlY3NSZWNvcmRlZCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaGhsbGxsIiwKLQkgICAgICAgICAgICAgICAgICAgICByZWNvcmRpbmdTdGF0dXMsCi0JICAgICAgICAgICAgICAgICAgICAgbWV0ZXJMZXZlbCwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbFNhbXBsZXNUb1JlY29yZCwKLQkgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwKLQkgICAgICAgICAgICAgICAgICAgICB0b3RhbE1zZWNzVG9SZWNvcmQsCi0JICAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKTsKLQlyZXR1cm4gX3JlczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NFcnIgX2VycjsKKyAgICBsb25nIGluUmVmTnVtOworICAgIHNob3J0IHJlY29yZGluZ1N0YXR1czsKKyAgICBzaG9ydCBtZXRlckxldmVsOworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxTYW1wbGVzVG9SZWNvcmQ7CisgICAgdW5zaWduZWQgbG9uZyBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZDsKKyAgICB1bnNpZ25lZCBsb25nIHRvdGFsTXNlY3NUb1JlY29yZDsKKyAgICB1bnNpZ25lZCBsb25nIG51bWJlck9mTXNlY3NSZWNvcmRlZDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQkdldFJlY29yZGluZ1N0YXR1cyhpblJlZk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNvcmRpbmdTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0ZXJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbFNhbXBsZXNUb1JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbE1zZWNzVG9SZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoaGxsbGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZGluZ1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXRlckxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU2FtcGxlc1RvUmVjb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU2FtcGxlc1JlY29yZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTXNlY3NUb1JlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJPZk1zZWNzUmVjb3JkZWQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJHZXREZXZpY2VJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JT1NUeXBlIGluZm9UeXBlOwotCXZvaWQgKiBpbmZvRGF0YTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQkdldERldmljZUluZm8oaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvRGF0YTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQkdldERldmljZUluZm8oaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJTZXREZXZpY2VJbmZvKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JT1NUeXBlIGluZm9UeXBlOwotCXZvaWQgKiBpbmZvRGF0YTsKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNQQlNldERldmljZUluZm8oaW5SZWZOdW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgT1NUeXBlIGluZm9UeXBlOworICAgIHZvaWQgKiBpbmZvRGF0YTsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyZ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpbmZvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm9EYXRhKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQlNldERldmljZUluZm8oaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb0RhdGEpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlNuZF9TUEJNaWxsaXNlY29uZHNUb0J5dGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCWxvbmcgaW5SZWZOdW07Ci0JbG9uZyBtaWxsaXNlY29uZHM7Ci0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTUEJNaWxsaXNlY29uZHNUb0J5dGVzKGluUmVmTnVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaWxsaXNlY29uZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgbG9uZyBpblJlZk51bTsKKyAgICBsb25nIG1pbGxpc2Vjb25kczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVmTnVtKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNQQk1pbGxpc2Vjb25kc1RvQnl0ZXMoaW5SZWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1pbGxpc2Vjb25kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzZWNvbmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpTbmRfU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NFcnIgX2VycjsKLQlsb25nIGluUmVmTnVtOwotCWxvbmcgYnl0ZUNvdW50OwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyhpblJlZk51bSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnl0ZUNvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBieXRlQ291bnQpOwotCXJldHVybiBfcmVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOworICAgIGxvbmcgaW5SZWZOdW07CisgICAgbG9uZyBieXRlQ291bnQ7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTUEJCeXRlc1RvTWlsbGlzZWNvbmRzKGluUmVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlQ291bnQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogc3RhdGljIFB5TWV0aG9kRGVmIFNuZF9tZXRob2RzW10gPSB7CiAjaWZuZGVmIF9fTFA2NF9fCi0JeyJTUEIiLCAoUHlDRnVuY3Rpb24pU25kX1NQQiwgMSwKLQkgUHlEb2NfU1RSKE5VTEwpfSwKLQl7IlN5c0JlZXAiLCAoUHlDRnVuY3Rpb24pU25kX1N5c0JlZXAsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGR1cmF0aW9uKSAtPiBOb25lIil9LAotCXsiU25kTmV3Q2hhbm5lbCIsIChQeUNGdW5jdGlvbilTbmRfU25kTmV3Q2hhbm5lbCwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgc3ludGgsIGxvbmcgaW5pdCwgUHlPYmplY3QqIHVzZXJSb3V0aW5lKSAtPiAoU25kQ2hhbm5lbFB0ciBjaGFuKSIpfSwKLQl7IlNuZFNvdW5kTWFuYWdlclZlcnNpb24iLCAoUHlDRnVuY3Rpb24pU25kX1NuZFNvdW5kTWFuYWdlclZlcnNpb24sIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKE51bVZlcnNpb24gX3J2KSIpfSwKLQl7IlNuZE1hbmFnZXJTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kX1NuZE1hbmFnZXJTdGF0dXMsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHRoZUxlbmd0aCkgLT4gKFNNU3RhdHVzIHRoZVN0YXR1cykiKX0sCi0JeyJTbmRHZXRTeXNCZWVwU3RhdGUiLCAoUHlDRnVuY3Rpb24pU25kX1NuZEdldFN5c0JlZXBTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgc3lzQmVlcFN0YXRlKSIpfSwKLQl7IlNuZFNldFN5c0JlZXBTdGF0ZSIsIChQeUNGdW5jdGlvbilTbmRfU25kU2V0U3lzQmVlcFN0YXRlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBzeXNCZWVwU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRTeXNCZWVwVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRTeXNCZWVwVm9sdW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIGxldmVsKSIpfSwKLQl7IlNldFN5c0JlZXBWb2x1bWUiLCAoUHlDRnVuY3Rpb24pU25kX1NldFN5c0JlZXBWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXREZWZhdWx0T3V0cHV0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXREZWZhdWx0T3V0cHV0Vm9sdW1lLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIGxldmVsKSIpfSwKLQl7IlNldERlZmF1bHRPdXRwdXRWb2x1bWUiLCAoUHlDRnVuY3Rpb24pU25kX1NldERlZmF1bHRPdXRwdXRWb2x1bWUsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgbGV2ZWwpIC0+IE5vbmUiKX0sCi0JeyJHZXRTb3VuZEhlYWRlck9mZnNldCIsIChQeUNGdW5jdGlvbilTbmRfR2V0U291bmRIZWFkZXJPZmZzZXQsIDEsCi0JIFB5RG9jX1NUUigiKFNuZExpc3RIYW5kbGUgc25kSGFuZGxlKSAtPiAobG9uZyBvZmZzZXQpIil9LAotCXsiR2V0Q29tcHJlc3Npb25JbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRDb21wcmVzc2lvbkluZm8sIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvbXByZXNzaW9uSUQsIE9TVHlwZSBmb3JtYXQsIHNob3J0IG51bUNoYW5uZWxzLCBzaG9ydCBzYW1wbGVTaXplKSAtPiAoQ29tcHJlc3Npb25JbmZvIGNwKSIpfSwKLQl7IlNldFNvdW5kUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilTbmRfU2V0U291bmRQcmVmZXJlbmNlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgdGhlVHlwZSwgSGFuZGxlIHNldHRpbmdzKSAtPiAoU3RyMjU1IG5hbWUpIil9LAotCXsiR2V0U291bmRQcmVmZXJlbmNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRTb3VuZFByZWZlcmVuY2UsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSB0aGVUeXBlLCBIYW5kbGUgc2V0dGluZ3MpIC0+IChTdHIyNTUgbmFtZSkiKX0sCi0JeyJHZXRDb21wcmVzc2lvbk5hbWUiLCAoUHlDRnVuY3Rpb24pU25kX0dldENvbXByZXNzaW9uTmFtZSwgMSwKLQkgUHlEb2NfU1RSKCIoT1NUeXBlIGNvbXByZXNzaW9uVHlwZSkgLT4gKFN0cjI1NSBjb21wcmVzc2lvbk5hbWUpIil9LAotCXsiU1BCVmVyc2lvbiIsIChQeUNGdW5jdGlvbilTbmRfU1BCVmVyc2lvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoTnVtVmVyc2lvbiBfcnYpIil9LAotCXsiU25kUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRSZWNvcmQsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGNvcm5lciwgT1NUeXBlIHF1YWxpdHkpIC0+IChTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSkiKX0sCi0JeyJTUEJTaWduSW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlNpZ25JbkRldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZGV2aWNlUmVmTnVtLCBTdHIyNTUgZGV2aWNlTmFtZSkgLT4gTm9uZSIpfSwKLQl7IlNQQlNpZ25PdXREZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlNpZ25PdXREZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRldmljZVJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQkdldEluZGV4ZWREZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldEluZGV4ZWREZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGNvdW50KSAtPiAoU3RyMjU1IGRldmljZU5hbWUsIEhhbmRsZSBkZXZpY2VJY29uSGFuZGxlKSIpfSwKLQl7IlNQQk9wZW5EZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQk9wZW5EZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSBkZXZpY2VOYW1lLCBzaG9ydCBwZXJtaXNzaW9uKSAtPiAobG9uZyBpblJlZk51bSkiKX0sCi0JeyJTUEJDbG9zZURldmljZSIsIChQeUNGdW5jdGlvbilTbmRfU1BCQ2xvc2VEZXZpY2UsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJTUEJSZWNvcmQiLCAoUHlDRnVuY3Rpb24pU25kX1NQQlJlY29yZCwgMSwKLQkgUHlEb2NfU1RSKCIoU1BCUHRyIGluUGFyYW1QdHIsIEJvb2xlYW4gYXN5bmNoRmxhZykgLT4gTm9uZSIpfSwKLQl7IlNQQlBhdXNlUmVjb3JkaW5nIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJQYXVzZVJlY29yZGluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQlJlc3VtZVJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCUmVzdW1lUmVjb3JkaW5nLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAotCXsiU1BCU3RvcFJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCU3RvcFJlY29yZGluZywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKLQl7IlNQQkdldFJlY29yZGluZ1N0YXR1cyIsIChQeUNGdW5jdGlvbilTbmRfU1BCR2V0UmVjb3JkaW5nU3RhdHVzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAoc2hvcnQgcmVjb3JkaW5nU3RhdHVzLCBzaG9ydCBtZXRlckxldmVsLCB1bnNpZ25lZCBsb25nIHRvdGFsU2FtcGxlc1RvUmVjb3JkLCB1bnNpZ25lZCBsb25nIG51bWJlck9mU2FtcGxlc1JlY29yZGVkLCB1bnNpZ25lZCBsb25nIHRvdGFsTXNlY3NUb1JlY29yZCwgdW5zaWduZWQgbG9uZyBudW1iZXJPZk1zZWNzUmVjb3JkZWQpIil9LAotCXsiU1BCR2V0RGV2aWNlSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfU1BCR2V0RGV2aWNlSW5mbywgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mb0RhdGEpIC0+IE5vbmUiKX0sCi0JeyJTUEJTZXREZXZpY2VJbmZvIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTZXREZXZpY2VJbmZvLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtLCBPU1R5cGUgaW5mb1R5cGUsIHZvaWQgKiBpbmZvRGF0YSkgLT4gTm9uZSIpfSwKLQl7IlNQQk1pbGxpc2Vjb25kc1RvQnl0ZXMiLCAoUHlDRnVuY3Rpb24pU25kX1NQQk1pbGxpc2Vjb25kc1RvQnl0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IChsb25nIG1pbGxpc2Vjb25kcykiKX0sCi0JeyJTUEJCeXRlc1RvTWlsbGlzZWNvbmRzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJCeXRlc1RvTWlsbGlzZWNvbmRzLCAxLAotCSBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAobG9uZyBieXRlQ291bnQpIil9LAorICAgIHsiU1BCIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEIsIDEsCisgICAgIFB5RG9jX1NUUihOVUxMKX0sCisgICAgeyJTeXNCZWVwIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TeXNCZWVwLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkdXJhdGlvbikgLT4gTm9uZSIpfSwKKyAgICB7IlNuZE5ld0NoYW5uZWwiLCAoUHlDRnVuY3Rpb24pU25kX1NuZE5ld0NoYW5uZWwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IHN5bnRoLCBsb25nIGluaXQsIFB5T2JqZWN0KiB1c2VyUm91dGluZSkgLT4gKFNuZENoYW5uZWxQdHIgY2hhbikiKX0sCisgICAgeyJTbmRTb3VuZE1hbmFnZXJWZXJzaW9uIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRTb3VuZE1hbmFnZXJWZXJzaW9uLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChOdW1WZXJzaW9uIF9ydikiKX0sCisgICAgeyJTbmRNYW5hZ2VyU3RhdHVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRNYW5hZ2VyU3RhdHVzLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCB0aGVMZW5ndGgpIC0+IChTTVN0YXR1cyB0aGVTdGF0dXMpIil9LAorICAgIHsiU25kR2V0U3lzQmVlcFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TbmRHZXRTeXNCZWVwU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IHN5c0JlZXBTdGF0ZSkiKX0sCisgICAgeyJTbmRTZXRTeXNCZWVwU3RhdGUiLCAoUHlDRnVuY3Rpb24pU25kX1NuZFNldFN5c0JlZXBTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgc3lzQmVlcFN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0U3lzQmVlcFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0U3lzQmVlcFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBsZXZlbCkiKX0sCisgICAgeyJTZXRTeXNCZWVwVm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXRTeXNCZWVwVm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiR2V0RGVmYXVsdE91dHB1dFZvbHVtZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0RGVmYXVsdE91dHB1dFZvbHVtZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBsZXZlbCkiKX0sCisgICAgeyJTZXREZWZhdWx0T3V0cHV0Vm9sdW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TZXREZWZhdWx0T3V0cHV0Vm9sdW1lLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGxldmVsKSAtPiBOb25lIil9LAorICAgIHsiR2V0U291bmRIZWFkZXJPZmZzZXQiLCAoUHlDRnVuY3Rpb24pU25kX0dldFNvdW5kSGVhZGVyT2Zmc2V0LCAxLAorICAgICBQeURvY19TVFIoIihTbmRMaXN0SGFuZGxlIHNuZEhhbmRsZSkgLT4gKGxvbmcgb2Zmc2V0KSIpfSwKKyAgICB7IkdldENvbXByZXNzaW9uSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfR2V0Q29tcHJlc3Npb25JbmZvLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb21wcmVzc2lvbklELCBPU1R5cGUgZm9ybWF0LCBzaG9ydCBudW1DaGFubmVscywgc2hvcnQgc2FtcGxlU2l6ZSkgLT4gKENvbXByZXNzaW9uSW5mbyBjcCkiKX0sCisgICAgeyJTZXRTb3VuZFByZWZlcmVuY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NldFNvdW5kUHJlZmVyZW5jZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHRoZVR5cGUsIEhhbmRsZSBzZXR0aW5ncykgLT4gKFN0cjI1NSBuYW1lKSIpfSwKKyAgICB7IkdldFNvdW5kUHJlZmVyZW5jZSIsIChQeUNGdW5jdGlvbilTbmRfR2V0U291bmRQcmVmZXJlbmNlLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgdGhlVHlwZSwgSGFuZGxlIHNldHRpbmdzKSAtPiAoU3RyMjU1IG5hbWUpIil9LAorICAgIHsiR2V0Q29tcHJlc3Npb25OYW1lIiwgKFB5Q0Z1bmN0aW9uKVNuZF9HZXRDb21wcmVzc2lvbk5hbWUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9TVHlwZSBjb21wcmVzc2lvblR5cGUpIC0+IChTdHIyNTUgY29tcHJlc3Npb25OYW1lKSIpfSwKKyAgICB7IlNQQlZlcnNpb24iLCAoUHlDRnVuY3Rpb24pU25kX1NQQlZlcnNpb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKE51bVZlcnNpb24gX3J2KSIpfSwKKyAgICB7IlNuZFJlY29yZCIsIChQeUNGdW5jdGlvbilTbmRfU25kUmVjb3JkLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBjb3JuZXIsIE9TVHlwZSBxdWFsaXR5KSAtPiAoU25kTGlzdEhhbmRsZSBzbmRIYW5kbGUpIil9LAorICAgIHsiU1BCU2lnbkluRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTaWduSW5EZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGRldmljZVJlZk51bSwgU3RyMjU1IGRldmljZU5hbWUpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJTaWduT3V0RGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJTaWduT3V0RGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkZXZpY2VSZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJHZXRJbmRleGVkRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJHZXRJbmRleGVkRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBjb3VudCkgLT4gKFN0cjI1NSBkZXZpY2VOYW1lLCBIYW5kbGUgZGV2aWNlSWNvbkhhbmRsZSkiKX0sCisgICAgeyJTUEJPcGVuRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJPcGVuRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgZGV2aWNlTmFtZSwgc2hvcnQgcGVybWlzc2lvbikgLT4gKGxvbmcgaW5SZWZOdW0pIil9LAorICAgIHsiU1BCQ2xvc2VEZXZpY2UiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkNsb3NlRGV2aWNlLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiU1BCUmVjb3JkIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJSZWNvcmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFNQQlB0ciBpblBhcmFtUHRyLCBCb29sZWFuIGFzeW5jaEZsYWcpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJQYXVzZVJlY29yZGluZyIsIChQeUNGdW5jdGlvbilTbmRfU1BCUGF1c2VSZWNvcmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJSZXN1bWVSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlJlc3VtZVJlY29yZGluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gTm9uZSIpfSwKKyAgICB7IlNQQlN0b3BSZWNvcmRpbmciLCAoUHlDRnVuY3Rpb24pU25kX1NQQlN0b3BSZWNvcmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0pIC0+IE5vbmUiKX0sCisgICAgeyJTUEJHZXRSZWNvcmRpbmdTdGF0dXMiLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldFJlY29yZGluZ1N0YXR1cywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKHNob3J0IHJlY29yZGluZ1N0YXR1cywgc2hvcnQgbWV0ZXJMZXZlbCwgdW5zaWduZWQgbG9uZyB0b3RhbFNhbXBsZXNUb1JlY29yZCwgdW5zaWduZWQgbG9uZyBudW1iZXJPZlNhbXBsZXNSZWNvcmRlZCwgdW5zaWduZWQgbG9uZyB0b3RhbE1zZWNzVG9SZWNvcmQsIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZNc2Vjc1JlY29yZGVkKSIpfSwKKyAgICB7IlNQQkdldERldmljZUluZm8iLCAoUHlDRnVuY3Rpb24pU25kX1NQQkdldERldmljZUluZm8sIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgaW5SZWZOdW0sIE9TVHlwZSBpbmZvVHlwZSwgdm9pZCAqIGluZm9EYXRhKSAtPiBOb25lIil9LAorICAgIHsiU1BCU2V0RGV2aWNlSW5mbyIsIChQeUNGdW5jdGlvbilTbmRfU1BCU2V0RGV2aWNlSW5mbywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSwgT1NUeXBlIGluZm9UeXBlLCB2b2lkICogaW5mb0RhdGEpIC0+IE5vbmUiKX0sCisgICAgeyJTUEJNaWxsaXNlY29uZHNUb0J5dGVzIiwgKFB5Q0Z1bmN0aW9uKVNuZF9TUEJNaWxsaXNlY29uZHNUb0J5dGVzLCAxLAorICAgICBQeURvY19TVFIoIihsb25nIGluUmVmTnVtKSAtPiAobG9uZyBtaWxsaXNlY29uZHMpIil9LAorICAgIHsiU1BCQnl0ZXNUb01pbGxpc2Vjb25kcyIsIChQeUNGdW5jdGlvbilTbmRfU1BCQnl0ZXNUb01pbGxpc2Vjb25kcywgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBpblJlZk51bSkgLT4gKGxvbmcgYnl0ZUNvdW50KSIpfSwKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwotCXtOVUxMLCBOVUxMLCAwfQorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogCkBAIC0xMDYxLDYyICsxMDYxLDYyIEBACiBzdGF0aWMgaW50CiBTbmRDaF9DYWxsQ2FsbEJhY2sodm9pZCAqYXJnKQogewotICAgICAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilhcmc7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzOwotICAgICAgICBQeU9iamVjdCAqcmVzOwotICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8oaGhsKSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLCBwLT5vYl9jbWQuY21kLCBwLT5vYl9jbWQucGFyYW0xLCBwLT5vYl9jbWQucGFyYW0yKTsKLSAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfY2FsbGJhY2ssIGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoYXJncyk7Ci0gICAgICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gMDsKKyAgICBTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKilhcmc7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8oaGhsKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHAsIHAtPm9iX2NtZC5jbWQsIHAtPm9iX2NtZC5wYXJhbTEsIHAtPm9iX2NtZC5wYXJhbTIpOworICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHAtPm9iX2NhbGxiYWNrLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisgICAgUHlfREVDUkVGKHJlcyk7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFJvdXRpbmUgcGFzc2VkIHRvIE5ld1NuZENoYW5uZWwgLS0gc2NoZWR1bGUgYSBjYWxsIHRvIFNuZENoX0NhbGxDYWxsQmFjayAqLwogc3RhdGljIHBhc2NhbCB2b2lkCiBTbmRDaF9Vc2VyUm91dGluZShTbmRDaGFubmVsUHRyIGNoYW4sIFNuZENvbW1hbmQgKmNtZCkKIHsKLSAgICAgICAgU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopKGNoYW4tPnVzZXJJbmZvKTsKLSAgICAgICAgaWYgKHAtPm9iX2NhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBsb25nIEE1ID0gU2V0QTUocC0+b2JfQTUpOwotICAgICAgICAgICAgICAgIHAtPm9iX2NtZCA9ICpjbWQ7Ci0gICAgICAgICAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU25kQ2hfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOwotICAgICAgICAgICAgICAgIFNldEE1KEE1KTsKLSAgICAgICAgfQorICAgIFNuZENoYW5uZWxPYmplY3QgKnAgPSAoU25kQ2hhbm5lbE9iamVjdCAqKShjaGFuLT51c2VySW5mbyk7CisgICAgaWYgKHAtPm9iX2NhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKKyAgICAgICAgcC0+b2JfY21kID0gKmNtZDsKKyAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU25kQ2hfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOworICAgICAgICBTZXRBNShBNSk7CisgICAgfQogfQogCiAvKiBTUEIgY2FsbGJhY2tzIC0gU2NoZWR1bGUgY2FsbGJhY2tzIHRvIFB5dGhvbiAqLwogc3RhdGljIGludAogU1BCX0NhbGxDYWxsQmFjayh2b2lkICphcmcpCiB7Ci0gICAgICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKilhcmc7Ci0gICAgICAgIFB5T2JqZWN0ICphcmdzOwotICAgICAgICBQeU9iamVjdCAqcmVzOworICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKilhcmc7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlczsKIAotICAgICAgICBpZiAoIHAtPm9iX3RoaXNjYWxsYmFjayA9PSAwICkgcmV0dXJuIDA7Ci0gICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBwKTsKLSAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfdGhpc2NhbGxiYWNrLCBhcmdzKTsKLSAgICAgICAgcC0+b2JfdGhpc2NhbGxiYWNrID0gMDsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBQeV9ERUNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCBwLT5vYl90aGlzY2FsbGJhY2sgPT0gMCApIHJldHVybiAwOworICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTykiLCBwKTsKKyAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChwLT5vYl90aGlzY2FsbGJhY2ssIGFyZ3MpOworICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IDA7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIFNQQl9jb21wbGV0aW9uKFNQQlB0ciBteV9zcGIpCiB7Ci0gICAgICAgIFNQQk9iamVjdCAqcCA9IChTUEJPYmplY3QgKikobXlfc3BiLT51c2VyTG9uZyk7CisgICAgU1BCT2JqZWN0ICpwID0gKFNQQk9iamVjdCAqKShteV9zcGItPnVzZXJMb25nKTsKIAotICAgICAgICBpZiAocCAmJiBwLT5vYl9jb21wbGV0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBBNSA9IFNldEE1KHAtPm9iX0E1KTsKLSAgICAgICAgICAgICAgICBwLT5vYl90aGlzY2FsbGJhY2sgPSBwLT5vYl9jb21wbGV0aW9uOyAgLyogSG9wZSB3ZSBjYW5ub3QgZ2V0IHR3byBhdCB0aGUgc2FtZSB0aW1lICovCi0gICAgICAgICAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU1BCX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKLSAgICAgICAgICAgICAgICBTZXRBNShBNSk7Ci0gICAgICAgIH0KKyAgICBpZiAocCAmJiBwLT5vYl9jb21wbGV0aW9uKSB7CisgICAgICAgIGxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7CisgICAgICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IHAtPm9iX2NvbXBsZXRpb247ICAvKiBIb3BlIHdlIGNhbm5vdCBnZXQgdHdvIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU1BCX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKKyAgICAgICAgU2V0QTUoQTUpOworICAgIH0KIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCkBAIC0xMTI0LDM4ICsxMTI0LDM4IEBACiAKIHZvaWQgaW5pdF9TbmQodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiAKIAogCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1NuZCIsIFNuZF9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1NuZCIsIFNuZF9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlTbmRfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChTbmRfRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBTbmRfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlTbmRDaGFubmVsX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKLQlpZiAoUHlUeXBlX1JlYWR5KCZTbmRDaGFubmVsX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU25kQ2hhbm5lbF9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNuZENoYW5uZWwiLCAoUHlPYmplY3QgKikmU25kQ2hhbm5lbF9UeXBlKTsKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNuZENoYW5uZWxfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTbmRDaGFubmVsVHlwZSIsIChQeU9iamVjdCAqKSZTbmRDaGFubmVsX1R5cGUpOwotCVNQQl9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmU1BCX1R5cGUpIDwgMCkgcmV0dXJuOwotCVB5X0lOQ1JFRigmU1BCX1R5cGUpOworICAgIGQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOworICAgIFNuZF9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7CisgICAgaWYgKFNuZF9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFNuZF9FcnJvcikgIT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIFNuZENoYW5uZWxfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlNuZENoYW5uZWxfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTbmRDaGFubmVsX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU25kQ2hhbm5lbCIsIChQeU9iamVjdCAqKSZTbmRDaGFubmVsX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmU25kQ2hhbm5lbF9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNuZENoYW5uZWxUeXBlIiwgKFB5T2JqZWN0ICopJlNuZENoYW5uZWxfVHlwZSk7CisgICAgU1BCX1R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTUEJfVHlwZSkgPCAwKSByZXR1cm47CisgICAgUHlfSU5DUkVGKCZTUEJfVHlwZSk7CiAjaWYgMAotCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiU1BCIiwgKFB5T2JqZWN0ICopJlNQQl9UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNQQiIsIChQeU9iamVjdCAqKSZTUEJfVHlwZSk7CiAjZW5kaWYKLQkvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KLQlQeV9JTkNSRUYoJlNQQl9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNQQlR5cGUiLCAoUHlPYmplY3QgKikmU1BCX1R5cGUpOworICAgIC8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLworICAgIFB5X0lOQ1JFRigmU1BCX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU1BCVHlwZSIsIChQeU9iamVjdCAqKSZTUEJfVHlwZSk7CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH0KIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvdGUvX1RFbW9kdWxlLmMgYi9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYwppbmRleCBmMTgyNjg4Li5hOTk4ZmM4IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYworKysgYi9NYWMvTW9kdWxlcy90ZS9fVEVtb2R1bGUuYwpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiBNYWNybyB0byB0ZXN0IHdoZXRoZXIgYSB3ZWFrLWxvYWRlZCBDRk0gZnVuY3Rpb24gZXhpc3RzICovCiAjZGVmaW5lIFB5TWFjX1BSRUNIRUNLKHJ0bikgZG8geyBpZiAoICZydG4gPT0gTlVMTCApICB7XAotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAotICAgICAgICAiTm90IGF2YWlsYWJsZSBpbiB0aGlzIHNoYXJlZCBsaWJyYXJ5L09TIHZlcnNpb24iKTsgXAotICAgICAgICByZXR1cm4gTlVMTDsgXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCBcCisgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKKyAgICByZXR1cm4gTlVMTDsgXAogICAgIH19IHdoaWxlKDApCiAKIApAQCAtMzYsMjEgKzM2LDIxIEBACiBUZXh0U3R5bGVfTmV3KFRleHRTdHlsZVB0ciBpdHNlbGYpCiB7CiAKLSAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbE8mIiwgKGxvbmcpaXRzZWxmLT50c0ZvbnQsIChsb25nKWl0c2VsZi0+dHNGYWNlLCAobG9uZylpdHNlbGYtPnRzU2l6ZSwgUWRSR0JfTmV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT50c0NvbG9yKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxsTyYiLCAobG9uZylpdHNlbGYtPnRzRm9udCwgKGxvbmcpaXRzZWxmLT50c0ZhY2UsIChsb25nKWl0c2VsZi0+dHNTaXplLCBRZFJHQl9OZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+dHNDb2xvcik7CiB9CiAKIHN0YXRpYyBpbnQKIFRleHRTdHlsZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBUZXh0U3R5bGVQdHIgcF9pdHNlbGYpCiB7Ci0gICAgICAgIGxvbmcgZm9udCwgZmFjZSwgc2l6ZTsKKyAgICBsb25nIGZvbnQsIGZhY2UsIHNpemU7CiAKLSAgICAgICAgaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGxPJiIsICZmb250LCAmZmFjZSwgJnNpemUsIFFkUkdCX0NvbnZlcnQsICZwX2l0c2VsZi0+dHNDb2xvcikgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwX2l0c2VsZi0+dHNGb250ID0gKHNob3J0KWZvbnQ7Ci0gICAgICAgIHBfaXRzZWxmLT50c0ZhY2UgPSAoU3R5bGUpZmFjZTsKLSAgICAgICAgcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOwotICAgICAgICByZXR1cm4gMTsKKyAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsbE8mIiwgJmZvbnQsICZmYWNlLCAmc2l6ZSwgUWRSR0JfQ29udmVydCwgJnBfaXRzZWxmLT50c0NvbG9yKSApCisgICAgICAgIHJldHVybiAwOworICAgIHBfaXRzZWxmLT50c0ZvbnQgPSAoc2hvcnQpZm9udDsKKyAgICBwX2l0c2VsZi0+dHNGYWNlID0gKFN0eWxlKWZhY2U7CisgICAgcF9pdHNlbGYtPnRzU2l6ZSA9IChzaG9ydClzaXplOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFX0Vycm9yOwpAQCAtNjIsOTE3ICs2Miw5MTcgQEAKICNkZWZpbmUgVEVPYmpfQ2hlY2soeCkgKCh4KS0+b2JfdHlwZSA9PSAmVEVfVHlwZSB8fCBQeU9iamVjdF9UeXBlQ2hlY2soKHgpLCAmVEVfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFRFT2JqZWN0IHsKLQlQeU9iamVjdF9IRUFECi0JVEVIYW5kbGUgb2JfaXRzZWxmOworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBURUhhbmRsZSBvYl9pdHNlbGY7CiB9IFRFT2JqZWN0OwogCiBQeU9iamVjdCAqVEVPYmpfTmV3KFRFSGFuZGxlIGl0c2VsZikKIHsKLQlURU9iamVjdCAqaXQ7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoVEVfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBURSIpOwotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgfQotCWl0ID0gUHlPYmplY3RfTkVXKFRFT2JqZWN0LCAmVEVfVHlwZSk7Ci0JaWYgKGl0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCWl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgIFRFT2JqZWN0ICppdDsKKyAgICBpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhURV9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIFRFIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgaXQgPSBQeU9iamVjdF9ORVcoVEVPYmplY3QsICZURV9UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIGludCBURU9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBURUhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JaWYgKCFURU9ial9DaGVjayh2KSkKLQl7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJURSByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChURU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgaWYgKCFURU9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJURSByZXF1aXJlZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKnBfaXRzZWxmID0gKChURU9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIFRFT2JqX2RlYWxsb2MoVEVPYmplY3QgKnNlbGYpCiB7Ci0JVEVEaXNwb3NlKHNlbGYtPm9iX2l0c2VsZik7Ci0Jc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKKyAgICBURURpc3Bvc2Uoc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCAqKXNlbGYpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2V0VGV4dChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dF9faW5fXzsKLQlsb25nIHRleHRfX2xlbl9fOwotCWludCB0ZXh0X19pbl9sZW5fXzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgY2hhciAqdGV4dF9faW5fXzsKKyAgICBsb25nIHRleHRfX2xlbl9fOworICAgIGludCB0ZXh0X19pbl9sZW5fXzsKICNpZm5kZWYgVEVTZXRUZXh0Ci0JUHlNYWNfUFJFQ0hFQ0soVEVTZXRUZXh0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFRleHQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fKSkKLQkJcmV0dXJuIE5VTEw7Ci0JdGV4dF9fbGVuX18gPSB0ZXh0X19pbl9sZW5fXzsKLQlURVNldFRleHQodGV4dF9faW5fXywgdGV4dF9fbGVuX18sCi0JICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFU2V0VGV4dCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKKyAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0VGV4dChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ2hhcnNIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDaGFyc0hhbmRsZSBfcnY7CiAjaWZuZGVmIFRFR2V0VGV4dAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0VGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFRleHQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURUdldFRleHQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFSWRsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURUlkbGUKLQlQeU1hY19QUkVDSEVDSyhURUlkbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFSWRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVJZGxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNldFNlbGVjdChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBzZWxTdGFydDsKLQlsb25nIHNlbEVuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBzZWxTdGFydDsKKyAgICBsb25nIHNlbEVuZDsKICNpZm5kZWYgVEVTZXRTZWxlY3QKLQlQeU1hY19QUkVDSEVDSyhURVNldFNlbGVjdCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2VsU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZzZWxFbmQpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNldFNlbGVjdChzZWxTdGFydCwKLQkgICAgICAgICAgICBzZWxFbmQsCi0JICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsRW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRTZWxlY3Qoc2VsU3RhcnQsCisgICAgICAgICAgICAgICAgc2VsRW5kLAorICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUFjdGl2YXRlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFQWN0aXZhdGUKLQlQeU1hY19QUkVDSEVDSyhURUFjdGl2YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUFjdGl2YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURUFjdGl2YXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVBY3RpdmF0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVEZWFjdGl2YXRlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFRGVhY3RpdmF0ZQotCVB5TWFjX1BSRUNIRUNLKFRFRGVhY3RpdmF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVEZWFjdGl2YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURURlYWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURURlYWN0aXZhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFS2V5KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlDaGFyUGFyYW1ldGVyIGtleTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ2hhclBhcmFtZXRlciBrZXk7CiAjaWZuZGVmIFRFS2V5Ci0JUHlNYWNfUFJFQ0hFQ0soVEVLZXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFS2V5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAma2V5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVLZXkoa2V5LAotCSAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFS2V5KGtleSwKKyAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVDdXQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVDdXQKLQlQeU1hY19QUkVDSEVDSyhURUN1dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDdXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFQ3V0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDdXQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ29weShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURUNvcHkKLQlQeU1hY19QUkVDSEVDSyhURUNvcHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQ29weSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDb3B5KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVBhc3RlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFUGFzdGUKLQlQeU1hY19QUkVDSEVDSyhURVBhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVBhc3RlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURVBhc3RlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVEZWxldGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVEZWxldGUKLQlQeU1hY19QUkVDSEVDSyhURURlbGV0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVEZWxldGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFRGVsZXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVEZWxldGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFSW5zZXJ0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0X19pbl9fOwotCWxvbmcgdGV4dF9fbGVuX187Ci0JaW50IHRleHRfX2luX2xlbl9fOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0X19pbl9fOworICAgIGxvbmcgdGV4dF9fbGVuX187CisgICAgaW50IHRleHRfX2luX2xlbl9fOwogI2lmbmRlZiBURUluc2VydAotCVB5TWFjX1BSRUNIRUNLKFRFSW5zZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUluc2VydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQotCQlyZXR1cm4gTlVMTDsKLQl0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOwotCVRFSW5zZXJ0KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0X19pbl9fLCAmdGV4dF9faW5fbGVuX18pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFSW5zZXJ0KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAorICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVNldEFsaWdubWVudChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQganVzdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQganVzdDsKICNpZm5kZWYgVEVTZXRBbGlnbm1lbnQKLQlQeU1hY19QUkVDSEVDSyhURVNldEFsaWdubWVudCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTZXRBbGlnbm1lbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZXRBbGlnbm1lbnQoanVzdCwKLQkgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZqdXN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZXRBbGlnbm1lbnQoanVzdCwKKyAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVVcGRhdGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgclVwZGF0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByVXBkYXRlOwogI2lmbmRlZiBURVVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKFRFVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVVwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyVXBkYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVVcGRhdGUoJnJVcGRhdGUsCi0JICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnJVcGRhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVVwZGF0ZSgmclVwZGF0ZSwKKyAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTY3JvbGwoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGRoOwotCXNob3J0IGR2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBkaDsKKyAgICBzaG9ydCBkdjsKICNpZm5kZWYgVEVTY3JvbGwKLQlQeU1hY19QUkVDSEVDSyhURVNjcm9sbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTY3JvbGwpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmZGgsCi0JICAgICAgICAgICAgICAgICAgICAgICZkdikpCi0JCXJldHVybiBOVUxMOwotCVRFU2Nyb2xsKGRoLAotCSAgICAgICAgIGR2LAotCSAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZkaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTY3JvbGwoZGgsCisgICAgICAgICAgICAgZHYsCisgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2VsVmlldyhURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBURVNlbFZpZXcKLQlQeU1hY19QUkVDSEVDSyhURVNlbFZpZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2VsVmlldyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZWxWaWV3KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVTZWxWaWV3KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVBpblNjcm9sbChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgZGg7Ci0Jc2hvcnQgZHY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGRoOworICAgIHNob3J0IGR2OwogI2lmbmRlZiBURVBpblNjcm9sbAotCVB5TWFjX1BSRUNIRUNLKFRFUGluU2Nyb2xsKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVBpblNjcm9sbCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkaCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmR2KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVQaW5TY3JvbGwoZGgsCi0JICAgICAgICAgICAgZHYsCi0JICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZHYpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVBpblNjcm9sbChkaCwKKyAgICAgICAgICAgICAgICBkdiwKKyAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVBdXRvVmlldyhURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBmQXV0bzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmQXV0bzsKICNpZm5kZWYgVEVBdXRvVmlldwotCVB5TWFjX1BSRUNIRUNLKFRFQXV0b1ZpZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFQXV0b1ZpZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmQXV0bykpCi0JCXJldHVybiBOVUxMOwotCVRFQXV0b1ZpZXcoZkF1dG8sCi0JICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmQXV0bykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFQXV0b1ZpZXcoZkF1dG8sCisgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVDYWxUZXh0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFRFQ2FsVGV4dAotCVB5TWFjX1BSRUNIRUNLKFRFQ2FsVGV4dCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDYWxUZXh0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlURUNhbFRleHQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURUNhbFRleHQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0T2Zmc2V0KFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7Ci0JUG9pbnQgcHQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBQb2ludCBwdDsKICNpZm5kZWYgVEVHZXRPZmZzZXQKLQlQeU1hY19QUkVDSEVDSyhURUdldE9mZnNldCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRPZmZzZXQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRPZmZzZXQocHQsCi0JICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVHZXRPZmZzZXQocHQsCisgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRQb2ludChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgX3J2OwotCXNob3J0IG9mZnNldDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgX3J2OworICAgIHNob3J0IG9mZnNldDsKICNpZm5kZWYgVEVHZXRQb2ludAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0UG9pbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0UG9pbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFBvaW50KG9mZnNldCwKLQkgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRQb2ludCwgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0UG9pbnQob2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ2xpY2soVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBvaW50IHB0OwotCUJvb2xlYW4gZkV4dGVuZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUG9pbnQgcHQ7CisgICAgQm9vbGVhbiBmRXh0ZW5kOwogI2lmbmRlZiBURUNsaWNrCi0JUHlNYWNfUFJFQ0hFQ0soVEVDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDbGljayk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmZkV4dGVuZCkpCi0JCXJldHVybiBOVUxMOwotCVRFQ2xpY2socHQsCi0JICAgICAgICBmRXh0ZW5kLAotCSAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmRXh0ZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVDbGljayhwdCwKKyAgICAgICAgZkV4dGVuZCwKKyAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFU2V0U3R5bGVIYW5kbGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVRFU3R5bGVIYW5kbGUgdGhlSGFuZGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBURVN0eWxlSGFuZGxlIHRoZUhhbmRsZTsKICNpZm5kZWYgVEVTZXRTdHlsZUhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRFU2V0U3R5bGVIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU2V0U3R5bGVIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnRoZUhhbmRsZSkpCi0JCXJldHVybiBOVUxMOwotCVRFU2V0U3R5bGVIYW5kbGUodGhlSGFuZGxlLAotCSAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ0aGVIYW5kbGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFN0eWxlSGFuZGxlKHRoZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URUdldFN0eWxlSGFuZGxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlURVN0eWxlSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVTdHlsZUhhbmRsZSBfcnY7CiAjaWZuZGVmIFRFR2V0U3R5bGVIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFN0eWxlSGFuZGxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVHZXRTdHlsZUhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRTdHlsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgb2Zmc2V0OwotCVRleHRTdHlsZSB0aGVTdHlsZTsKLQlzaG9ydCBsaW5lSGVpZ2h0OwotCXNob3J0IGZvbnRBc2NlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IG9mZnNldDsKKyAgICBUZXh0U3R5bGUgdGhlU3R5bGU7CisgICAgc2hvcnQgbGluZUhlaWdodDsKKyAgICBzaG9ydCBmb250QXNjZW50OwogI2lmbmRlZiBURUdldFN0eWxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCi0JCXJldHVybiBOVUxMOwotCVRFR2V0U3R5bGUob2Zmc2V0LAotCSAgICAgICAgICAgJnRoZVN0eWxlLAotCSAgICAgICAgICAgJmxpbmVIZWlnaHQsCi0JICAgICAgICAgICAmZm9udEFzY2VudCwKLQkgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmhoIiwKLQkgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfTmV3LCAmdGhlU3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwKLQkgICAgICAgICAgICAgICAgICAgICBmb250QXNjZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFR2V0U3R5bGUob2Zmc2V0LAorICAgICAgICAgICAgICAgJnRoZVN0eWxlLAorICAgICAgICAgICAgICAgJmxpbmVIZWlnaHQsCisgICAgICAgICAgICAgICAmZm9udEFzY2VudCwKKyAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJmhoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0U3R5bGVfTmV3LCAmdGhlU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb250QXNjZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9URVN0eWxlUGFzdGUoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgVEVTdHlsZVBhc3RlCi0JUHlNYWNfUFJFQ0hFQ0soVEVTdHlsZVBhc3RlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVN0eWxlUGFzdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVRFU3R5bGVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU3R5bGVQYXN0ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTZXRTdHlsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgbW9kZTsKLQlUZXh0U3R5bGUgbmV3U3R5bGU7Ci0JQm9vbGVhbiBmUmVkcmF3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOworICAgIFRleHRTdHlsZSBuZXdTdHlsZTsKKyAgICBCb29sZWFuIGZSZWRyYXc7CiAjaWZuZGVmIFRFU2V0U3R5bGUKLQlQeU1hY19QUkVDSEVDSyhURVNldFN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFN0eWxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQotCQlyZXR1cm4gTlVMTDsKLQlURVNldFN0eWxlKG1vZGUsCi0JICAgICAgICAgICAmbmV3U3R5bGUsCi0JICAgICAgICAgICBmUmVkcmF3LAotCSAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJmIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFN0eWxlKG1vZGUsCisgICAgICAgICAgICAgICAmbmV3U3R5bGUsCisgICAgICAgICAgICAgICBmUmVkcmF3LAorICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFUmVwbGFjZVN0eWxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBtb2RlOwotCVRleHRTdHlsZSBvbGRTdHlsZTsKLQlUZXh0U3R5bGUgbmV3U3R5bGU7Ci0JQm9vbGVhbiBmUmVkcmF3OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBtb2RlOworICAgIFRleHRTdHlsZSBvbGRTdHlsZTsKKyAgICBUZXh0U3R5bGUgbmV3U3R5bGU7CisgICAgQm9vbGVhbiBmUmVkcmF3OwogI2lmbmRlZiBURVJlcGxhY2VTdHlsZQotCVB5TWFjX1BSRUNIRUNLKFRFUmVwbGFjZVN0eWxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVJlcGxhY2VTdHlsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyZPJmIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZvbGRTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX0NvbnZlcnQsICZuZXdTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZSZWRyYXcpKQotCQlyZXR1cm4gTlVMTDsKLQlURVJlcGxhY2VTdHlsZShtb2RlLAotCSAgICAgICAgICAgICAgICZvbGRTdHlsZSwKLQkgICAgICAgICAgICAgICAmbmV3U3R5bGUsCi0JICAgICAgICAgICAgICAgZlJlZHJhdywKLQkgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mTyZiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmb2xkU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmbmV3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgVEVSZXBsYWNlU3R5bGUobW9kZSwKKyAgICAgICAgICAgICAgICAgICAmb2xkU3R5bGUsCisgICAgICAgICAgICAgICAgICAgJm5ld1N0eWxlLAorICAgICAgICAgICAgICAgICAgIGZSZWRyYXcsCisgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RTY3JwSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RTY3JwSGFuZGxlIF9ydjsKICNpZm5kZWYgVEVHZXRTdHlsZVNjcmFwSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVHZXRTdHlsZVNjcmFwSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFN0eWxlU2NyYXBIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFR2V0U3R5bGVTY3JhcEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U3R5bGVTY3JhcEhhbmRsZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVTdHlsZUluc2VydChURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JY2hhciAqdGV4dF9faW5fXzsKLQlsb25nIHRleHRfX2xlbl9fOwotCWludCB0ZXh0X19pbl9sZW5fXzsKLQlTdFNjcnBIYW5kbGUgaFNUOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBjaGFyICp0ZXh0X19pbl9fOworICAgIGxvbmcgdGV4dF9fbGVuX187CisgICAgaW50IHRleHRfX2luX2xlbl9fOworICAgIFN0U2NycEhhbmRsZSBoU1Q7CiAjaWZuZGVmIFRFU3R5bGVJbnNlcnQKLQlQeU1hY19QUkVDSEVDSyhURVN0eWxlSW5zZXJ0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVN0eWxlSW5zZXJ0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmhTVCkpCi0JCXJldHVybiBOVUxMOwotCXRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187Ci0JVEVTdHlsZUluc2VydCh0ZXh0X19pbl9fLCB0ZXh0X19sZW5fXywKLQkgICAgICAgICAgICAgIGhTVCwKLQkgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJzI08mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRfX2luX18sICZ0ZXh0X19pbl9sZW5fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoU1QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB0ZXh0X19sZW5fXyA9IHRleHRfX2luX2xlbl9fOworICAgIFRFU3R5bGVJbnNlcnQodGV4dF9faW5fXywgdGV4dF9fbGVuX18sCisgICAgICAgICAgICAgICAgICBoU1QsCisgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVHZXRIZWlnaHQoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCWxvbmcgZW5kTGluZTsKLQlsb25nIHN0YXJ0TGluZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CisgICAgbG9uZyBlbmRMaW5lOworICAgIGxvbmcgc3RhcnRMaW5lOwogI2lmbmRlZiBURUdldEhlaWdodAotCVB5TWFjX1BSRUNIRUNLKFRFR2V0SGVpZ2h0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldEhlaWdodCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZlbmRMaW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRMaW5lKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVHZXRIZWlnaHQoZW5kTGluZSwKLQkgICAgICAgICAgICAgICAgICBzdGFydExpbmUsCi0JICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5kTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0TGluZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0SGVpZ2h0KGVuZExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFQ29udGludW91c1N0eWxlKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlzaG9ydCBtb2RlOwotCVRleHRTdHlsZSBhU3R5bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIHNob3J0IG1vZGU7CisgICAgVGV4dFN0eWxlIGFTdHlsZTsKICNpZm5kZWYgVEVDb250aW51b3VzU3R5bGUKLQlQeU1hY19QUkVDSEVDSyhURUNvbnRpbnVvdXNTdHlsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVDb250aW51b3VzU3R5bGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmYVN0eWxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVDb250aW51b3VzU3R5bGUoJm1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmFTdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIG1vZGUsCi0JICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX05ldywgJmFTdHlsZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRTdHlsZV9Db252ZXJ0LCAmYVN0eWxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVDb250aW51b3VzU3R5bGUoJm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYmhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFN0eWxlX05ldywgJmFTdHlsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVVc2VTdHlsZVNjcmFwKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIHJhbmdlU3RhcnQ7Ci0JbG9uZyByYW5nZUVuZDsKLQlTdFNjcnBIYW5kbGUgbmV3U3R5bGVzOwotCUJvb2xlYW4gZlJlZHJhdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyByYW5nZVN0YXJ0OworICAgIGxvbmcgcmFuZ2VFbmQ7CisgICAgU3RTY3JwSGFuZGxlIG5ld1N0eWxlczsKKyAgICBCb29sZWFuIGZSZWRyYXc7CiAjaWZuZGVmIFRFVXNlU3R5bGVTY3JhcAotCVB5TWFjX1BSRUNIRUNLKFRFVXNlU3R5bGVTY3JhcCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVVc2VTdHlsZVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyZiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlU3RhcnQsCi0JICAgICAgICAgICAgICAgICAgICAgICZyYW5nZUVuZCwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZuZXdTdHlsZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICZmUmVkcmF3KSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVVc2VTdHlsZVNjcmFwKHJhbmdlU3RhcnQsCi0JICAgICAgICAgICAgICAgIHJhbmdlRW5kLAotCSAgICAgICAgICAgICAgICBuZXdTdHlsZXMsCi0JICAgICAgICAgICAgICAgIGZSZWRyYXcsCi0JICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmbmV3U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlJlZHJhdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFVXNlU3R5bGVTY3JhcChyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICByYW5nZUVuZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICBmUmVkcmF3LAorICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfVEVOdW1TdHlsZXMoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OwotCWxvbmcgcmFuZ2VTdGFydDsKLQlsb25nIHJhbmdlRW5kOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBsb25nIHJhbmdlU3RhcnQ7CisgICAgbG9uZyByYW5nZUVuZDsKICNpZm5kZWYgVEVOdW1TdHlsZXMKLQlQeU1hY19QUkVDSEVDSyhURU51bVN0eWxlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVOdW1TdHlsZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VTdGFydCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnJhbmdlRW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVOdW1TdHlsZXMocmFuZ2VTdGFydCwKLQkgICAgICAgICAgICAgICAgICByYW5nZUVuZCwKLQkgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmFuZ2VFbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBURU51bVN0eWxlcyhyYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIHJhbmdlRW5kLAorICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFRmVhdHVyZUZsYWcoVEVPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IF9ydjsKLQlzaG9ydCBmZWF0dXJlOwotCXNob3J0IGFjdGlvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgc2hvcnQgX3J2OworICAgIHNob3J0IGZlYXR1cmU7CisgICAgc2hvcnQgYWN0aW9uOwogI2lmbmRlZiBURUZlYXR1cmVGbGFnCi0JUHlNYWNfUFJFQ0hFQ0soVEVGZWF0dXJlRmxhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVGZWF0dXJlRmxhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgICAmYWN0aW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVGZWF0dXJlRmxhZyhmZWF0dXJlLAotCSAgICAgICAgICAgICAgICAgICAgYWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdGlvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFRmVhdHVyZUZsYWcoZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX1RFR2V0SGlsaXRlUmduKFRFT2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgVEVHZXRIaWxpdGVSZ24KLQlQeU1hY19QUkVDSEVDSyhURUdldEhpbGl0ZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVHZXRIaWxpdGVSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBURUdldEhpbGl0ZVJnbihyZWdpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVEVHZXRIaWxpdGVSZ24ocmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9hc19SZXNvdXJjZShURU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgYXNfUmVzb3VyY2UKLQlQeU1hY19QUkVDSEVDSyhhc19SZXNvdXJjZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soYXNfUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IGFzX1Jlc291cmNlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gYXNfUmVzb3VyY2UoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgVEVPYmpfbWV0aG9kc1tdID0gewotCXsiVEVTZXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0VGV4dCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQpIC0+IE5vbmUiKX0sCi0JeyJURUdldFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRUZXh0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDaGFyc0hhbmRsZSBfcnYpIil9LAotCXsiVEVJZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFSWRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVTZXRTZWxlY3QiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTZWxlY3QsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgc2VsU3RhcnQsIGxvbmcgc2VsRW5kKSAtPiBOb25lIil9LAotCXsiVEVBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URUFjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURURlYWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVEZWFjdGl2YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURUtleSIsIChQeUNGdW5jdGlvbilURU9ial9URUtleSwgMSwKLQkgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBrZXkpIC0+IE5vbmUiKX0sCi0JeyJURUN1dCIsIChQeUNGdW5jdGlvbilURU9ial9URUN1dCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVDb3B5IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQ29weSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVQYXN0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVBhc3RlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURURlbGV0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URURlbGV0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVJbnNlcnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVJbnNlcnQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0KSAtPiBOb25lIil9LAotCXsiVEVTZXRBbGlnbm1lbnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRBbGlnbm1lbnQsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGp1c3QpIC0+IE5vbmUiKX0sCi0JeyJURVVwZGF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVVwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByVXBkYXRlKSAtPiBOb25lIil9LAotCXsiVEVTY3JvbGwiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTY3JvbGwsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKLQl7IlRFU2VsVmlldyIsIChQeUNGdW5jdGlvbilURU9ial9URVNlbFZpZXcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlRFUGluU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUGluU2Nyb2xsLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCi0JeyJURUF1dG9WaWV3IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQXV0b1ZpZXcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gZkF1dG8pIC0+IE5vbmUiKX0sCi0JeyJURUNhbFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDYWxUZXh0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJURUdldE9mZnNldCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldE9mZnNldCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChzaG9ydCBfcnYpIil9LAotCXsiVEVHZXRQb2ludCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFBvaW50LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChQb2ludCBfcnYpIil9LAotCXsiVEVDbGljayIsIChQeUNGdW5jdGlvbilURU9ial9URUNsaWNrLCAxLAotCSBQeURvY19TVFIoIihQb2ludCBwdCwgQm9vbGVhbiBmRXh0ZW5kKSAtPiBOb25lIil9LAotCXsiVEVTZXRTdHlsZUhhbmRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIihURVN0eWxlSGFuZGxlIHRoZUhhbmRsZSkgLT4gTm9uZSIpfSwKLQl7IlRFR2V0U3R5bGVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRTdHlsZUhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVEVTdHlsZUhhbmRsZSBfcnYpIil9LAotCXsiVEVHZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChUZXh0U3R5bGUgdGhlU3R5bGUsIHNob3J0IGxpbmVIZWlnaHQsIHNob3J0IGZvbnRBc2NlbnQpIil9LAotCXsiVEVTdHlsZVBhc3RlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVQYXN0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVTZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgbmV3U3R5bGUsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKLQl7IlRFUmVwbGFjZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUmVwbGFjZVN0eWxlLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgb2xkU3R5bGUsIFRleHRTdHlsZSBuZXdTdHlsZSwgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAotCXsiVEVHZXRTdHlsZVNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoU3RTY3JwSGFuZGxlIF9ydikiKX0sCi0JeyJURVN0eWxlSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVJbnNlcnQsIDEsCi0JIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBTdFNjcnBIYW5kbGUgaFNUKSAtPiBOb25lIil9LAotCXsiVEVHZXRIZWlnaHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRIZWlnaHQsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgZW5kTGluZSwgbG9uZyBzdGFydExpbmUpIC0+IChsb25nIF9ydikiKX0sCi0JeyJURUNvbnRpbnVvdXNTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUNvbnRpbnVvdXNTdHlsZSwgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIGFTdHlsZSkgLT4gKEJvb2xlYW4gX3J2LCBzaG9ydCBtb2RlLCBUZXh0U3R5bGUgYVN0eWxlKSIpfSwKLQl7IlRFVXNlU3R5bGVTY3JhcCIsIChQeUNGdW5jdGlvbilURU9ial9URVVzZVN0eWxlU2NyYXAsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCwgU3RTY3JwSGFuZGxlIG5ld1N0eWxlcywgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAotCXsiVEVOdW1TdHlsZXMiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVOdW1TdHlsZXMsIDEsCi0JIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCkgLT4gKGxvbmcgX3J2KSIpfSwKLQl7IlRFRmVhdHVyZUZsYWciLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVGZWF0dXJlRmxhZywgMSwKLQkgUHlEb2NfU1RSKCIoc2hvcnQgZmVhdHVyZSwgc2hvcnQgYWN0aW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IlRFR2V0SGlsaXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0SGlsaXRlUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAotCXsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pVEVPYmpfYXNfUmVzb3VyY2UsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiVEVTZXRUZXh0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU2V0VGV4dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQpIC0+IE5vbmUiKX0sCisgICAgeyJURUdldFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRUZXh0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDaGFyc0hhbmRsZSBfcnYpIil9LAorICAgIHsiVEVJZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFSWRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTZWxlY3QiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgc2VsU3RhcnQsIGxvbmcgc2VsRW5kKSAtPiBOb25lIil9LAorICAgIHsiVEVBY3RpdmF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URUFjdGl2YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURURlYWN0aXZhdGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVEZWFjdGl2YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURUtleSIsIChQeUNGdW5jdGlvbilURU9ial9URUtleSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ2hhclBhcmFtZXRlciBrZXkpIC0+IE5vbmUiKX0sCisgICAgeyJURUN1dCIsIChQeUNGdW5jdGlvbilURU9ial9URUN1dCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVDb3B5IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQ29weSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVQYXN0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVBhc3RlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURURlbGV0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URURlbGV0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVJbnNlcnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVJbnNlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0KSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRBbGlnbm1lbnQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTZXRBbGlnbm1lbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGp1c3QpIC0+IE5vbmUiKX0sCisgICAgeyJURVVwZGF0ZSIsIChQeUNGdW5jdGlvbilURU9ial9URVVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCByVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiVEVTY3JvbGwiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVTY3JvbGwsIDEsCisgICAgIFB5RG9jX1NUUigiKHNob3J0IGRoLCBzaG9ydCBkdikgLT4gTm9uZSIpfSwKKyAgICB7IlRFU2VsVmlldyIsIChQeUNGdW5jdGlvbilURU9ial9URVNlbFZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFUGluU2Nyb2xsIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUGluU2Nyb2xsLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBkaCwgc2hvcnQgZHYpIC0+IE5vbmUiKX0sCisgICAgeyJURUF1dG9WaWV3IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFQXV0b1ZpZXcsIDEsCisgICAgIFB5RG9jX1NUUigiKEJvb2xlYW4gZkF1dG8pIC0+IE5vbmUiKX0sCisgICAgeyJURUNhbFRleHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVDYWxUZXh0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJURUdldE9mZnNldCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldE9mZnNldCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgcHQpIC0+IChzaG9ydCBfcnYpIil9LAorICAgIHsiVEVHZXRQb2ludCIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFBvaW50LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChQb2ludCBfcnYpIil9LAorICAgIHsiVEVDbGljayIsIChQeUNGdW5jdGlvbilURU9ial9URUNsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBwdCwgQm9vbGVhbiBmRXh0ZW5kKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTdHlsZUhhbmRsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlSGFuZGxlLCAxLAorICAgICBQeURvY19TVFIoIihURVN0eWxlSGFuZGxlIHRoZUhhbmRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IlRFR2V0U3R5bGVIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRTdHlsZUhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoVEVTdHlsZUhhbmRsZSBfcnYpIil9LAorICAgIHsiVEVHZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUdldFN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBvZmZzZXQpIC0+IChUZXh0U3R5bGUgdGhlU3R5bGUsIHNob3J0IGxpbmVIZWlnaHQsIHNob3J0IGZvbnRBc2NlbnQpIil9LAorICAgIHsiVEVTdHlsZVBhc3RlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVQYXN0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiVEVTZXRTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URVNldFN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgbmV3U3R5bGUsIEJvb2xlYW4gZlJlZHJhdykgLT4gTm9uZSIpfSwKKyAgICB7IlRFUmVwbGFjZVN0eWxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFUmVwbGFjZVN0eWxlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBtb2RlLCBUZXh0U3R5bGUgb2xkU3R5bGUsIFRleHRTdHlsZSBuZXdTdHlsZSwgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAorICAgIHsiVEVHZXRTdHlsZVNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0U3R5bGVTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RTY3JwSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVN0eWxlSW5zZXJ0IiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFU3R5bGVJbnNlcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBTdFNjcnBIYW5kbGUgaFNUKSAtPiBOb25lIil9LAorICAgIHsiVEVHZXRIZWlnaHQiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVHZXRIZWlnaHQsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgZW5kTGluZSwgbG9uZyBzdGFydExpbmUpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJURUNvbnRpbnVvdXNTdHlsZSIsIChQeUNGdW5jdGlvbilURU9ial9URUNvbnRpbnVvdXNTdHlsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgbW9kZSwgVGV4dFN0eWxlIGFTdHlsZSkgLT4gKEJvb2xlYW4gX3J2LCBzaG9ydCBtb2RlLCBUZXh0U3R5bGUgYVN0eWxlKSIpfSwKKyAgICB7IlRFVXNlU3R5bGVTY3JhcCIsIChQeUNGdW5jdGlvbilURU9ial9URVVzZVN0eWxlU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCwgU3RTY3JwSGFuZGxlIG5ld1N0eWxlcywgQm9vbGVhbiBmUmVkcmF3KSAtPiBOb25lIil9LAorICAgIHsiVEVOdW1TdHlsZXMiLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVOdW1TdHlsZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgcmFuZ2VTdGFydCwgbG9uZyByYW5nZUVuZCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlRFRmVhdHVyZUZsYWciLCAoUHlDRnVuY3Rpb24pVEVPYmpfVEVGZWF0dXJlRmxhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgZmVhdHVyZSwgc2hvcnQgYWN0aW9uKSAtPiAoc2hvcnQgX3J2KSIpfSwKKyAgICB7IlRFR2V0SGlsaXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVRFT2JqX1RFR2V0SGlsaXRlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiYXNfUmVzb3VyY2UiLCAoUHlDRnVuY3Rpb24pVEVPYmpfYXNfUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEhhbmRsZSBfcnYpIil9LAorICAgIHtOVUxMLCBOVUxMLCAwfQogfTsKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfZGVzdFJlY3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5kZXN0UmVjdCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5kZXN0UmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2Rlc3RSZWN0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfdmlld1JlY3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT52aWV3UmVjdCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT52aWV3UmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3ZpZXdSZWN0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfc2VsUmVjdChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFJlY3QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+c2VsUmVjdCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3NlbFJlY3QgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9saW5lSGVpZ2h0KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5saW5lSGVpZ2h0KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bGluZUhlaWdodCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2xpbmVIZWlnaHQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9mb250QXNjZW50KFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5mb250QXNjZW50KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+Zm9udEFzY2VudCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2ZvbnRBc2NlbnQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9zZWxQb2ludChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFBvaW50KTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFBvaW50KTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfc2VsUG9pbnQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9zZWxTdGFydChURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+c2VsU3RhcnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxTdGFydCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3NlbFN0YXJ0IE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfc2VsRW5kKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxFbmQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxFbmQpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF9zZWxFbmQgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF9hY3RpdmUoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmFjdGl2ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmFjdGl2ZSk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X2FjdGl2ZSBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X2p1c3QoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmp1c3QpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5qdXN0KTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfanVzdCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3RlTGVuZ3RoKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50ZUxlbmd0aCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnRlTGVuZ3RoKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfdGVMZW5ndGggTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF90eEZvbnQoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4Rm9udCk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4Rm9udCk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3R4Rm9udCBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X3R4RmFjZShURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGYWNlKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGYWNlKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfdHhGYWNlIE5VTEwKIAogc3RhdGljIFB5T2JqZWN0ICpURU9ial9nZXRfdHhNb2RlKFRFT2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eE1vZGUpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eE1vZGUpOwogfQogCiAjZGVmaW5lIFRFT2JqX3NldF90eE1vZGUgTlVMTAogCiBzdGF0aWMgUHlPYmplY3QgKlRFT2JqX2dldF90eFNpemUoVEVPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4U2l6ZSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4U2l6ZSk7CiB9CiAKICNkZWZpbmUgVEVPYmpfc2V0X3R4U2l6ZSBOVUxMCiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfZ2V0X25MaW5lcyhURU9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bkxpbmVzKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+bkxpbmVzKTsKIH0KIAogI2RlZmluZSBURU9ial9zZXRfbkxpbmVzIE5VTEwKIAogc3RhdGljIFB5R2V0U2V0RGVmIFRFT2JqX2dldHNldGxpc3RbXSA9IHsKLQl7ImRlc3RSZWN0IiwgKGdldHRlcilURU9ial9nZXRfZGVzdFJlY3QsIChzZXR0ZXIpVEVPYmpfc2V0X2Rlc3RSZWN0LCAiRGVzdGluYXRpb24gcmVjdGFuZ2xlIn0sCi0JeyJ2aWV3UmVjdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3ZpZXdSZWN0LCAoc2V0dGVyKVRFT2JqX3NldF92aWV3UmVjdCwgIlZpZXdpbmcgcmVjdGFuZ2xlIn0sCi0JeyJzZWxSZWN0IiwgKGdldHRlcilURU9ial9nZXRfc2VsUmVjdCwgKHNldHRlcilURU9ial9zZXRfc2VsUmVjdCwgIlNlbGVjdGlvbiByZWN0YW5nbGUifSwKLQl7ImxpbmVIZWlnaHQiLCAoZ2V0dGVyKVRFT2JqX2dldF9saW5lSGVpZ2h0LCAoc2V0dGVyKVRFT2JqX3NldF9saW5lSGVpZ2h0LCAiSGVpZ2h0IG9mIGEgbGluZSJ9LAotCXsiZm9udEFzY2VudCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2ZvbnRBc2NlbnQsIChzZXR0ZXIpVEVPYmpfc2V0X2ZvbnRBc2NlbnQsICJBc2NlbnQgb2YgYSBsaW5lIn0sCi0JeyJzZWxQb2ludCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbFBvaW50LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxQb2ludCwgIlNlbGVjdGlvbiBQb2ludCJ9LAotCXsic2VsU3RhcnQiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxTdGFydCwgKHNldHRlcilURU9ial9zZXRfc2VsU3RhcnQsICJTdGFydCBvZiBzZWxlY3Rpb24ifSwKLQl7InNlbEVuZCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbEVuZCwgKHNldHRlcilURU9ial9zZXRfc2VsRW5kLCAiRW5kIG9mIHNlbGVjdGlvbiJ9LAotCXsiYWN0aXZlIiwgKGdldHRlcilURU9ial9nZXRfYWN0aXZlLCAoc2V0dGVyKVRFT2JqX3NldF9hY3RpdmUsICJUQkQifSwKLQl7Imp1c3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9qdXN0LCAoc2V0dGVyKVRFT2JqX3NldF9qdXN0LCAiSnVzdGlmaWNhdGlvbiJ9LAotCXsidGVMZW5ndGgiLCAoZ2V0dGVyKVRFT2JqX2dldF90ZUxlbmd0aCwgKHNldHRlcilURU9ial9zZXRfdGVMZW5ndGgsICJUQkQifSwKLQl7InR4Rm9udCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4Rm9udCwgKHNldHRlcilURU9ial9zZXRfdHhGb250LCAiQ3VycmVudCBmb250In0sCi0JeyJ0eEZhY2UiLCAoZ2V0dGVyKVRFT2JqX2dldF90eEZhY2UsIChzZXR0ZXIpVEVPYmpfc2V0X3R4RmFjZSwgIkN1cnJlbnQgZm9udCB2YXJpYW50In0sCi0JeyJ0eE1vZGUiLCAoZ2V0dGVyKVRFT2JqX2dldF90eE1vZGUsIChzZXR0ZXIpVEVPYmpfc2V0X3R4TW9kZSwgIkN1cnJlbnQgdGV4dC1kcmF3aW5nIG1vZGUifSwKLQl7InR4U2l6ZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4U2l6ZSwgKHNldHRlcilURU9ial9zZXRfdHhTaXplLCAiQ3VycmVudCBmb250IHNpemUifSwKLQl7Im5MaW5lcyIsIChnZXR0ZXIpVEVPYmpfZ2V0X25MaW5lcywgKHNldHRlcilURU9ial9zZXRfbkxpbmVzLCAiVEJEIn0sCi0Je05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorICAgIHsiZGVzdFJlY3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9kZXN0UmVjdCwgKHNldHRlcilURU9ial9zZXRfZGVzdFJlY3QsICJEZXN0aW5hdGlvbiByZWN0YW5nbGUifSwKKyAgICB7InZpZXdSZWN0IiwgKGdldHRlcilURU9ial9nZXRfdmlld1JlY3QsIChzZXR0ZXIpVEVPYmpfc2V0X3ZpZXdSZWN0LCAiVmlld2luZyByZWN0YW5nbGUifSwKKyAgICB7InNlbFJlY3QiLCAoZ2V0dGVyKVRFT2JqX2dldF9zZWxSZWN0LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxSZWN0LCAiU2VsZWN0aW9uIHJlY3RhbmdsZSJ9LAorICAgIHsibGluZUhlaWdodCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2xpbmVIZWlnaHQsIChzZXR0ZXIpVEVPYmpfc2V0X2xpbmVIZWlnaHQsICJIZWlnaHQgb2YgYSBsaW5lIn0sCisgICAgeyJmb250QXNjZW50IiwgKGdldHRlcilURU9ial9nZXRfZm9udEFzY2VudCwgKHNldHRlcilURU9ial9zZXRfZm9udEFzY2VudCwgIkFzY2VudCBvZiBhIGxpbmUifSwKKyAgICB7InNlbFBvaW50IiwgKGdldHRlcilURU9ial9nZXRfc2VsUG9pbnQsIChzZXR0ZXIpVEVPYmpfc2V0X3NlbFBvaW50LCAiU2VsZWN0aW9uIFBvaW50In0sCisgICAgeyJzZWxTdGFydCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3NlbFN0YXJ0LCAoc2V0dGVyKVRFT2JqX3NldF9zZWxTdGFydCwgIlN0YXJ0IG9mIHNlbGVjdGlvbiJ9LAorICAgIHsic2VsRW5kIiwgKGdldHRlcilURU9ial9nZXRfc2VsRW5kLCAoc2V0dGVyKVRFT2JqX3NldF9zZWxFbmQsICJFbmQgb2Ygc2VsZWN0aW9uIn0sCisgICAgeyJhY3RpdmUiLCAoZ2V0dGVyKVRFT2JqX2dldF9hY3RpdmUsIChzZXR0ZXIpVEVPYmpfc2V0X2FjdGl2ZSwgIlRCRCJ9LAorICAgIHsianVzdCIsIChnZXR0ZXIpVEVPYmpfZ2V0X2p1c3QsIChzZXR0ZXIpVEVPYmpfc2V0X2p1c3QsICJKdXN0aWZpY2F0aW9uIn0sCisgICAgeyJ0ZUxlbmd0aCIsIChnZXR0ZXIpVEVPYmpfZ2V0X3RlTGVuZ3RoLCAoc2V0dGVyKVRFT2JqX3NldF90ZUxlbmd0aCwgIlRCRCJ9LAorICAgIHsidHhGb250IiwgKGdldHRlcilURU9ial9nZXRfdHhGb250LCAoc2V0dGVyKVRFT2JqX3NldF90eEZvbnQsICJDdXJyZW50IGZvbnQifSwKKyAgICB7InR4RmFjZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4RmFjZSwgKHNldHRlcilURU9ial9zZXRfdHhGYWNlLCAiQ3VycmVudCBmb250IHZhcmlhbnQifSwKKyAgICB7InR4TW9kZSIsIChnZXR0ZXIpVEVPYmpfZ2V0X3R4TW9kZSwgKHNldHRlcilURU9ial9zZXRfdHhNb2RlLCAiQ3VycmVudCB0ZXh0LWRyYXdpbmcgbW9kZSJ9LAorICAgIHsidHhTaXplIiwgKGdldHRlcilURU9ial9nZXRfdHhTaXplLCAoc2V0dGVyKVRFT2JqX3NldF90eFNpemUsICJDdXJyZW50IGZvbnQgc2l6ZSJ9LAorICAgIHsibkxpbmVzIiwgKGdldHRlcilURU9ial9nZXRfbkxpbmVzLCAoc2V0dGVyKVRFT2JqX3NldF9uTGluZXMsICJUQkQifSwKKyAgICB7TlVMTCwgTlVMTCwgTlVMTCwgTlVMTH0sCiB9OwogCiAKQEAgLTk4Nyw2MSArOTg3LDYxIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqVEVPYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVRFSGFuZGxlIGl0c2VsZjsKLQljaGFyICprd1tdID0geyJpdHNlbGYiLCAwfTsKKyAgICBQeU9iamVjdCAqX3NlbGY7CisgICAgVEVIYW5kbGUgaXRzZWxmOworICAgIGNoYXIgKmt3W10gPSB7Iml0c2VsZiIsIDB9OwogCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgVEVPYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChURU9iamVjdCAqKV9zZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOwotCXJldHVybiBfc2VsZjsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBURU9ial9Db252ZXJ0LCAmaXRzZWxmKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChfc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAoKFRFT2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFRFT2JqX3RwX2ZyZWUgUHlPYmplY3RfRGVsCiAKIAogUHlUeXBlT2JqZWN0IFRFX1R5cGUgPSB7Ci0JUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCi0JMCwgLypvYl9zaXplKi8KLQkiX1RFLlRFIiwgLyp0cF9uYW1lKi8KLQlzaXplb2YoVEVPYmplY3QpLCAvKnRwX2Jhc2ljc2l6ZSovCi0JMCwgLyp0cF9pdGVtc2l6ZSovCi0JLyogbWV0aG9kcyAqLwotCShkZXN0cnVjdG9yKSBURU9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBURU9ial9jb21wYXJlLCAvKnRwX2NvbXBhcmUqLwotCShyZXByZnVuYykgVEVPYmpfcmVwciwgLyp0cF9yZXByKi8KLQkoUHlOdW1iZXJNZXRob2RzICopMCwgLyogdHBfYXNfbnVtYmVyICovCi0JKFB5U2VxdWVuY2VNZXRob2RzICopMCwgLyogdHBfYXNfc2VxdWVuY2UgKi8KLQkoUHlNYXBwaW5nTWV0aG9kcyAqKTAsIC8qIHRwX2FzX21hcHBpbmcgKi8KLQkoaGFzaGZ1bmMpIFRFT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVRFT2JqX21ldGhvZHMsIC8qIHRwX21ldGhvZHMgKi8KLQkwLCAvKnRwX21lbWJlcnMqLwotCVRFT2JqX2dldHNldGxpc3QsIC8qdHBfZ2V0c2V0Ki8KLQkwLCAvKnRwX2Jhc2UqLwotCTAsIC8qdHBfZGljdCovCi0JMCwgLyp0cF9kZXNjcl9nZXQqLwotCTAsIC8qdHBfZGVzY3Jfc2V0Ki8KLQkwLCAvKnRwX2RpY3RvZmZzZXQqLwotCVRFT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlURU9ial90cF9hbGxvYywgLyogdHBfYWxsb2MgKi8KLQlURU9ial90cF9uZXcsIC8qIHRwX25ldyAqLwotCVRFT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfVEUuVEUiLCAvKnRwX25hbWUqLworICAgIHNpemVvZihURU9iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFRFT2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgLyp0cF9wcmludCovCisgICAgKGdldGF0dHJmdW5jKTAsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKTAsIC8qdHBfc2V0YXR0ciovCisgICAgKGNtcGZ1bmMpIFRFT2JqX2NvbXBhcmUsIC8qdHBfY29tcGFyZSovCisgICAgKHJlcHJmdW5jKSBURU9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgVEVPYmpfaGFzaCwgLyp0cF9oYXNoKi8KKyAgICAwLCAvKnRwX2NhbGwqLworICAgIDAsIC8qdHBfc3RyKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgLyp0cF9nZXRhdHRybyovCisgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsIC8qdHBfc2V0YXR0cm8gKi8KKyAgICAwLCAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUfFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qIHRwX2ZsYWdzICovCisgICAgMCwgLyp0cF9kb2MqLworICAgIDAsIC8qdHBfdHJhdmVyc2UqLworICAgIDAsIC8qdHBfY2xlYXIqLworICAgIDAsIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsIC8qdHBfaXRlciovCisgICAgMCwgLyp0cF9pdGVybmV4dCovCisgICAgVEVPYmpfbWV0aG9kcywgLyogdHBfbWV0aG9kcyAqLworICAgIDAsIC8qdHBfbWVtYmVycyovCisgICAgVEVPYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgVEVPYmpfdHBfaW5pdCwgLyogdHBfaW5pdCAqLworICAgIFRFT2JqX3RwX2FsbG9jLCAvKiB0cF9hbGxvYyAqLworICAgIFRFT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgVEVPYmpfdHBfZnJlZSwgLyogdHBfZnJlZSAqLwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9iamVjdCB0eXBlIFRFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMDQ5LDI1NyArMTA0OSwyNTcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpURV9URVNjcmFwSGFuZGxlKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlIYW5kbGUgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgX3J2OwogI2lmbmRlZiBURVNjcmFwSGFuZGxlCi0JUHlNYWNfUFJFQ0hFQ0soVEVTY3JhcEhhbmRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVTY3JhcEhhbmRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVTY3JhcEhhbmRsZSgpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVTY3JhcEhhbmRsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URUdldFNjcmFwTGVuZ3RoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBfcnY7CiAjaWZuZGVmIFRFR2V0U2NyYXBMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhURUdldFNjcmFwTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURUdldFNjcmFwTGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBURUdldFNjcmFwTGVuZ3RoKCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U2NyYXBMZW5ndGgoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URU5ldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCVJlY3QgZGVzdFJlY3Q7Ci0JUmVjdCB2aWV3UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVIYW5kbGUgX3J2OworICAgIFJlY3QgZGVzdFJlY3Q7CisgICAgUmVjdCB2aWV3UmVjdDsKICNpZm5kZWYgVEVOZXcKLQlQeU1hY19QUkVDSEVDSyhURU5ldyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVEVOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVOZXcoJmRlc3RSZWN0LAotCSAgICAgICAgICAgICZ2aWV3UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gVEVOZXcoJmRlc3RSZWN0LAorICAgICAgICAgICAgICAgICZ2aWV3UmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVUZXh0Qm94KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQljaGFyICp0ZXh0X19pbl9fOwotCWxvbmcgdGV4dF9fbGVuX187Ci0JaW50IHRleHRfX2luX2xlbl9fOwotCVJlY3QgYm94OwotCXNob3J0IGp1c3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGNoYXIgKnRleHRfX2luX187CisgICAgbG9uZyB0ZXh0X19sZW5fXzsKKyAgICBpbnQgdGV4dF9faW5fbGVuX187CisgICAgUmVjdCBib3g7CisgICAgc2hvcnQganVzdDsKICNpZm5kZWYgVEVUZXh0Qm94Ci0JUHlNYWNfUFJFQ0hFQ0soVEVUZXh0Qm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVRleHRCb3gpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94LAotCSAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCi0JCXJldHVybiBOVUxMOwotCXRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187Ci0JVEVUZXh0Qm94KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAotCSAgICAgICAgICAmYm94LAotCSAgICAgICAgICBqdXN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyNPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdGV4dF9faW5fXywgJnRleHRfX2luX2xlbl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmanVzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHRleHRfX2xlbl9fID0gdGV4dF9faW5fbGVuX187CisgICAgVEVUZXh0Qm94KHRleHRfX2luX18sIHRleHRfX2xlbl9fLAorICAgICAgICAgICAgICAmYm94LAorICAgICAgICAgICAgICBqdXN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVTdHlsZU5ldyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCVJlY3QgZGVzdFJlY3Q7Ci0JUmVjdCB2aWV3UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgVEVIYW5kbGUgX3J2OworICAgIFJlY3QgZGVzdFJlY3Q7CisgICAgUmVjdCB2aWV3UmVjdDsKICNpZm5kZWYgVEVTdHlsZU5ldwotCVB5TWFjX1BSRUNIRUNLKFRFU3R5bGVOZXcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFU3R5bGVOZXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZkZXN0UmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJnZpZXdSZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gVEVTdHlsZU5ldygmZGVzdFJlY3QsCi0JICAgICAgICAgICAgICAgICAmdmlld1JlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgVEVPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZGVzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ2aWV3UmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFU3R5bGVOZXcoJmRlc3RSZWN0LAorICAgICAgICAgICAgICAgICAgICAgJnZpZXdSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRFT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9URVNldFNjcmFwTGVuZ3RoKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGxlbmd0aDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgbG9uZyBsZW5ndGg7CiAjaWZuZGVmIFRFU2V0U2NyYXBMZW5ndGgKLQlQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwTGVuZ3RoKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwTGVuZ3RoKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbGVuZ3RoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JVEVTZXRTY3JhcExlbmd0aChsZW5ndGgpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFRFU2V0U2NyYXBMZW5ndGgobGVuZ3RoKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVGcm9tU2NyYXAoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TRXJyIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TRXJyIF9lcnI7CiAjaWZuZGVmIFRFRnJvbVNjcmFwCi0JUHlNYWNfUFJFQ0hFQ0soVEVGcm9tU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRFRnJvbVNjcmFwKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVEVGcm9tU2NyYXAoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRFRnJvbVNjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVUb1NjcmFwKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU0VyciBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU0VyciBfZXJyOwogI2lmbmRlZiBURVRvU2NyYXAKLQlQeU1hY19QUkVDSEVDSyhURVRvU2NyYXApOworICAgIFB5TWFjX1BSRUNIRUNLKFRFVG9TY3JhcCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRFVG9TY3JhcCgpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVEVUb1NjcmFwKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVHZXRTY3JhcEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgSGFuZGxlIF9ydjsKICNpZm5kZWYgVEVHZXRTY3JhcEhhbmRsZQotCVB5TWFjX1BSRUNIRUNLKFRFR2V0U2NyYXBIYW5kbGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFRFR2V0U2NyYXBIYW5kbGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRFR2V0U2NyYXBIYW5kbGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRFR2V0U2NyYXBIYW5kbGUoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfVEVTZXRTY3JhcEhhbmRsZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JSGFuZGxlIHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBIYW5kbGUgdmFsdWU7CiAjaWZuZGVmIFRFU2V0U2NyYXBIYW5kbGUKLQlQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwSGFuZGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhURVNldFNjcmFwSGFuZGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCVRFU2V0U2NyYXBIYW5kbGUodmFsdWUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBURVNldFNjcmFwSGFuZGxlKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqVEVfTE1HZXRXb3JkUmVkcmF3KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlVSW50OCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFVJbnQ4IF9ydjsKICNpZm5kZWYgTE1HZXRXb3JkUmVkcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1HZXRXb3JkUmVkcmF3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTUdldFdvcmRSZWRyYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IExNR2V0V29yZFJlZHJhdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBMTUdldFdvcmRSZWRyYXcoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9MTVNldFdvcmRSZWRyYXcoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVVJbnQ4IHZhbHVlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBVSW50OCB2YWx1ZTsKICNpZm5kZWYgTE1TZXRXb3JkUmVkcmF3Ci0JUHlNYWNfUFJFQ0hFQ0soTE1TZXRXb3JkUmVkcmF3KTsKKyAgICBQeU1hY19QUkVDSEVDSyhMTVNldFdvcmRSZWRyYXcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkpCi0JCXJldHVybiBOVUxMOwotCUxNU2V0V29yZFJlZHJhdyh2YWx1ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBMTVNldFdvcmRSZWRyYXcodmFsdWUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpURV9hc19URShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JVEVIYW5kbGUgX3J2OwotCUhhbmRsZSBoOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBURUhhbmRsZSBfcnY7CisgICAgSGFuZGxlIGg7CiAjaWZuZGVmIGFzX1RFCi0JUHlNYWNfUFJFQ0hFQ0soYXNfVEUpOworICAgIFB5TWFjX1BSRUNIRUNLKGFzX1RFKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZoKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gYXNfVEUoaCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBURU9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBhc19URShoKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRFT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgVEVfbWV0aG9kc1tdID0gewogI2lmbmRlZiBfX0xQNjRfXwotCXsiVEVTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURV9URVNjcmFwSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlRFR2V0U2NyYXBMZW5ndGgiLCAoUHlDRnVuY3Rpb24pVEVfVEVHZXRTY3JhcExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAotCXsiVEVOZXciLCAoUHlDRnVuY3Rpb24pVEVfVEVOZXcsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgZGVzdFJlY3QsIFJlY3Qgdmlld1JlY3QpIC0+IChURUhhbmRsZSBfcnYpIil9LAotCXsiVEVUZXh0Qm94IiwgKFB5Q0Z1bmN0aW9uKVRFX1RFVGV4dEJveCwgMSwKLQkgUHlEb2NfU1RSKCIoQnVmZmVyIHRleHQsIFJlY3QgYm94LCBzaG9ydCBqdXN0KSAtPiBOb25lIil9LAotCXsiVEVTdHlsZU5ldyIsIChQeUNGdW5jdGlvbilURV9URVN0eWxlTmV3LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGRlc3RSZWN0LCBSZWN0IHZpZXdSZWN0KSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKLQl7IlRFU2V0U2NyYXBMZW5ndGgiLCAoUHlDRnVuY3Rpb24pVEVfVEVTZXRTY3JhcExlbmd0aCwgMSwKLQkgUHlEb2NfU1RSKCIobG9uZyBsZW5ndGgpIC0+IE5vbmUiKX0sCi0JeyJURUZyb21TY3JhcCIsIChQeUNGdW5jdGlvbilURV9URUZyb21TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVUb1NjcmFwIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFVG9TY3JhcCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiVEVHZXRTY3JhcEhhbmRsZSIsIChQeUNGdW5jdGlvbilURV9URUdldFNjcmFwSGFuZGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChIYW5kbGUgX3J2KSIpfSwKLQl7IlRFU2V0U2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVTZXRTY3JhcEhhbmRsZSwgMSwKLQkgUHlEb2NfU1RSKCIoSGFuZGxlIHZhbHVlKSAtPiBOb25lIil9LAotCXsiTE1HZXRXb3JkUmVkcmF3IiwgKFB5Q0Z1bmN0aW9uKVRFX0xNR2V0V29yZFJlZHJhdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDggX3J2KSIpfSwKLQl7IkxNU2V0V29yZFJlZHJhdyIsIChQeUNGdW5jdGlvbilURV9MTVNldFdvcmRSZWRyYXcsIDEsCi0JIFB5RG9jX1NUUigiKFVJbnQ4IHZhbHVlKSAtPiBOb25lIil9LAotCXsiYXNfVEUiLCAoUHlDRnVuY3Rpb24pVEVfYXNfVEUsIDEsCi0JIFB5RG9jX1NUUigiKEhhbmRsZSBoKSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRFU2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJURUdldFNjcmFwTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFR2V0U2NyYXBMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKGxvbmcgX3J2KSIpfSwKKyAgICB7IlRFTmV3IiwgKFB5Q0Z1bmN0aW9uKVRFX1RFTmV3LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGRlc3RSZWN0LCBSZWN0IHZpZXdSZWN0KSAtPiAoVEVIYW5kbGUgX3J2KSIpfSwKKyAgICB7IlRFVGV4dEJveCIsIChQeUNGdW5jdGlvbilURV9URVRleHRCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKEJ1ZmZlciB0ZXh0LCBSZWN0IGJveCwgc2hvcnQganVzdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFU3R5bGVOZXciLCAoUHlDRnVuY3Rpb24pVEVfVEVTdHlsZU5ldywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBkZXN0UmVjdCwgUmVjdCB2aWV3UmVjdCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVNldFNjcmFwTGVuZ3RoIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2V0U2NyYXBMZW5ndGgsIDEsCisgICAgIFB5RG9jX1NUUigiKGxvbmcgbGVuZ3RoKSAtPiBOb25lIil9LAorICAgIHsiVEVGcm9tU2NyYXAiLCAoUHlDRnVuY3Rpb24pVEVfVEVGcm9tU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFVG9TY3JhcCIsIChQeUNGdW5jdGlvbilURV9URVRvU2NyYXAsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlRFR2V0U2NyYXBIYW5kbGUiLCAoUHlDRnVuY3Rpb24pVEVfVEVHZXRTY3JhcEhhbmRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSGFuZGxlIF9ydikiKX0sCisgICAgeyJURVNldFNjcmFwSGFuZGxlIiwgKFB5Q0Z1bmN0aW9uKVRFX1RFU2V0U2NyYXBIYW5kbGUsIDEsCisgICAgIFB5RG9jX1NUUigiKEhhbmRsZSB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7IkxNR2V0V29yZFJlZHJhdyIsIChQeUNGdW5jdGlvbilURV9MTUdldFdvcmRSZWRyYXcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQ4IF9ydikiKX0sCisgICAgeyJMTVNldFdvcmRSZWRyYXciLCAoUHlDRnVuY3Rpb24pVEVfTE1TZXRXb3JkUmVkcmF3LCAxLAorICAgICBQeURvY19TVFIoIihVSW50OCB2YWx1ZSkgLT4gTm9uZSIpfSwKKyAgICB7ImFzX1RFIiwgKFB5Q0Z1bmN0aW9uKVRFX2FzX1RFLCAxLAorICAgICBQeURvY19TVFIoIihIYW5kbGUgaCkgLT4gKFRFSGFuZGxlIF9ydikiKX0sCiAjZW5kaWYgLyogX19MUDY0X18gKi8KLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7TlVMTCwgTlVMTCwgMH0KIH07CiAKIApAQCAtMTMwNywzMSArMTMwNywzMSBAQAogCiB2b2lkIGluaXRfVEUodm9pZCkKIHsKLQlQeU9iamVjdCAqbTsKKyAgICBQeU9iamVjdCAqbTsKICNpZm5kZWYgX19MUDY0X18KLQlQeU9iamVjdCAqZDsKKyAgICBQeU9iamVjdCAqZDsKIAogCiAKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRFSGFuZGxlLCBURU9ial9OZXcpOwotCSAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRFSGFuZGxlLCBURU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVEVIYW5kbGUsIFRFT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChURUhhbmRsZSwgVEVPYmpfQ29udmVydCk7CiAKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCi0JbSA9IFB5X0luaXRNb2R1bGUoIl9URSIsIFRFX21ldGhvZHMpOworICAgIG0gPSBQeV9Jbml0TW9kdWxlKCJfVEUiLCBURV9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlURV9FcnJvciA9IFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKCk7Ci0JaWYgKFRFX0Vycm9yID09IE5VTEwgfHwKLQkgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgVEVfRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlURV9UeXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7Ci0JaWYgKFB5VHlwZV9SZWFkeSgmVEVfVHlwZSkgPCAwKSByZXR1cm47Ci0JUHlfSU5DUkVGKCZURV9UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIlRFIiwgKFB5T2JqZWN0ICopJlRFX1R5cGUpOwotCS8qIEJhY2t3YXJkLWNvbXBhdGlibGUgbmFtZSAqLwotCVB5X0lOQ1JFRigmVEVfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJURVR5cGUiLCAoUHlPYmplY3QgKikmVEVfVHlwZSk7CisgICAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgICAgVEVfRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChURV9FcnJvciA9PSBOVUxMIHx8CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFcnJvciIsIFRFX0Vycm9yKSAhPSAwKQorICAgICAgICByZXR1cm47CisgICAgVEVfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJlRFX1R5cGUpIDwgMCkgcmV0dXJuOworICAgIFB5X0lOQ1JFRigmVEVfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJURSIsIChQeU9iamVjdCAqKSZURV9UeXBlKTsKKyAgICAvKiBCYWNrd2FyZC1jb21wYXRpYmxlIG5hbWUgKi8KKyAgICBQeV9JTkNSRUYoJlRFX1R5cGUpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiVEVUeXBlIiwgKFB5T2JqZWN0ICopJlRFX1R5cGUpOwogI2VuZGlmIC8qIF9fTFA2NF9fICovCiB9CiAKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3dpbi9fV2lubW9kdWxlLmMgYi9NYWMvTW9kdWxlcy93aW4vX1dpbm1vZHVsZS5jCmluZGV4IDg3Zjc1OTEuLjg5MjMzZWQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3dpbi9fV2lubW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvd2luL19XaW5tb2R1bGUuYwpAQCAtOSw5ICs5LDkgQEAKIAogLyogTWFjcm8gdG8gdGVzdCB3aGV0aGVyIGEgd2Vhay1sb2FkZWQgQ0ZNIGZ1bmN0aW9uIGV4aXN0cyAqLwogI2RlZmluZSBQeU1hY19QUkVDSEVDSyhydG4pIGRvIHsgaWYgKCAmcnRuID09IE5VTEwgKSAge1wKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IsIFwKLSAgICAgICAgIk5vdCBhdmFpbGFibGUgaW4gdGhpcyBzaGFyZWQgbGlicmFyeS9PUyB2ZXJzaW9uIik7IFwKLSAgICAgICAgcmV0dXJuIE5VTEw7IFwKKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgXAorICAgICJOb3QgYXZhaWxhYmxlIGluIHRoaXMgc2hhcmVkIGxpYnJhcnkvT1MgdmVyc2lvbiIpOyBcCisgICAgcmV0dXJuIE5VTEw7IFwKICAgICB9fSB3aGlsZSgwKQogCiAKQEAgLTM2LDcgKzM2LDcgQEAKIHN0YXRpYyB2b2lkCiBQeU1hY19BdXRvRGlzcG9zZVdpbmRvdyhXaW5kb3dQdHIgdykKIHsKLSAgICAgICAgRGlzcG9zZVdpbmRvdyh3KTsKKyAgICBEaXNwb3NlV2luZG93KHcpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9FcnJvcjsKQEAgLTQ4LDI1MjIgKzQ4LDI1MjIgQEAKICNkZWZpbmUgV2luT2JqX0NoZWNrKHgpICgoeCktPm9iX3R5cGUgPT0gJldpbmRvd19UeXBlIHx8IFB5T2JqZWN0X1R5cGVDaGVjaygoeCksICZXaW5kb3dfVHlwZSkpCiAKIHR5cGVkZWYgc3RydWN0IFdpbmRvd09iamVjdCB7Ci0JUHlPYmplY3RfSEVBRAotCVdpbmRvd1B0ciBvYl9pdHNlbGY7Ci0Jdm9pZCAoKm9iX2ZyZWVpdCkoV2luZG93UHRyIHB0cik7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFdpbmRvd1B0ciBvYl9pdHNlbGY7CisgICAgdm9pZCAoKm9iX2ZyZWVpdCkoV2luZG93UHRyIHB0cik7CiB9IFdpbmRvd09iamVjdDsKIAogUHlPYmplY3QgKldpbk9ial9OZXcoV2luZG93UHRyIGl0c2VsZikKIHsKLQlXaW5kb3dPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgV2hpY2hXaW5kb3cgY29kZSBoZXJlPyAqLwotCWl0ID0gUHlPYmplY3RfTkVXKFdpbmRvd09iamVjdCwgJldpbmRvd19UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfZnJlZWl0ID0gTlVMTDsKLQlpZiAoR2V0V1JlZkNvbihpdHNlbGYpID09IDApCi0JewotCQlTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOwotCQlpdC0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7Ci0JfQotCXJldHVybiAoUHlPYmplY3QgKilpdDsKKyAgICBXaW5kb3dPYmplY3QgKml0OworICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKKyAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgV2hpY2hXaW5kb3cgY29kZSBoZXJlPyAqLworICAgIGl0ID0gUHlPYmplY3RfTkVXKFdpbmRvd09iamVjdCwgJldpbmRvd19UeXBlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKKyAgICBpdC0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICBpZiAoR2V0V1JlZkNvbihpdHNlbGYpID09IDApCisgICAgeworICAgICAgICBTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOworICAgICAgICBpdC0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7CisgICAgfQorICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogaW50IFdpbk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBXaW5kb3dQdHIgKnBfaXRzZWxmKQogewogCi0JaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCWlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KKyAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQogCi0JewotCQlEaWFsb2dSZWYgZGxnOwotCQlpZiAoRGxnT2JqX0NvbnZlcnQodiwgJmRsZykgJiYgZGxnKSB7Ci0JCQkqcF9pdHNlbGYgPSBHZXREaWFsb2dXaW5kb3coZGxnKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCVB5RXJyX0NsZWFyKCk7Ci0JfQotCWlmICghV2luT2JqX0NoZWNrKHYpKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIldpbmRvdyByZXF1aXJlZCIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JKnBfaXRzZWxmID0gKChXaW5kb3dPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCXJldHVybiAxOworICAgIHsKKyAgICAgICAgRGlhbG9nUmVmIGRsZzsKKyAgICAgICAgaWYgKERsZ09ial9Db252ZXJ0KHYsICZkbGcpICYmIGRsZykgeworICAgICAgICAgICAgKnBfaXRzZWxmID0gR2V0RGlhbG9nV2luZG93KGRsZyk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgICBpZiAoIVdpbk9ial9DaGVjayh2KSkKKyAgICB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJXaW5kb3cgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsKKyAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgV2luT2JqX2RlYWxsb2MoV2luZG93T2JqZWN0ICpzZWxmKQogewotCWlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKQotCXsKLQkJU2V0V1JlZkNvbihzZWxmLT5vYl9pdHNlbGYsIDApOwotCQlzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsKLQl9Ci0Jc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKLQlzZWxmLT5vYl9mcmVlaXQgPSBOVUxMOwotCXNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUoKFB5T2JqZWN0ICopc2VsZik7CisgICAgaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpCisgICAgeworICAgICAgICBTZXRXUmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgMCk7CisgICAgICAgIHNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOworICAgIH0KKyAgICBzZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgIHNlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZSgoUHlPYmplY3QgKilzZWxmKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93T3duZXJDb3VudChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JVUludDMyIG91dENvdW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFVJbnQzMiBvdXRDb3VudDsKICNpZm5kZWYgR2V0V2luZG93T3duZXJDb3VudAotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd093bmVyQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd093bmVyQ291bnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dPd25lckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvdW50KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRDb3VudCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dPd25lckNvdW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dENvdW50KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDb3VudCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0Nsb25lV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgQ2xvbmVXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhDbG9uZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2xvbmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDbG9uZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENsb25lV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dSZXRhaW5Db3VudChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUl0ZW1Db3VudCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEl0ZW1Db3VudCBfcnY7CiAjaWZuZGVmIEdldFdpbmRvd1JldGFpbkNvdW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UmV0YWluQ291bnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1JldGFpbkNvdW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXaW5kb3dSZXRhaW5Db3VudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0V2luZG93UmV0YWluQ291bnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1JldGFpbldpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJldGFpbldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJldGFpbldpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUmV0YWluV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmV0YWluV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmV0YWluV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZWxlYXNlV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgUmVsZWFzZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJlbGVhc2VXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbGVhc2VXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBSZWxlYXNlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gUmVsZWFzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVzaGFwZUN1c3RvbVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlc2hhcGVDdXN0b21XaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhSZXNoYXBlQ3VzdG9tV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNoYXBlQ3VzdG9tV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVzaGFwZUN1c3RvbVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlc2hhcGVDdXN0b21XaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1dpZGdldEhpbGl0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93RGVmUGFydENvZGUgb3V0SGlsaXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd0RlZlBhcnRDb2RlIG91dEhpbGl0ZTsKICNpZm5kZWYgR2V0V2luZG93V2lkZ2V0SGlsaXRlCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93V2lkZ2V0SGlsaXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dXaWRnZXRIaWxpdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dXaWRnZXRIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWxpdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dEhpbGl0ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dXaWRnZXRIaWxpdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRIaWxpdGUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhpbGl0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NsYXNzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dDbGFzcyBvdXRDbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyBvdXRDbGFzczsKICNpZm5kZWYgR2V0V2luZG93Q2xhc3MKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDbGFzcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q2xhc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAmb3V0Q2xhc3MpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dENsYXNzKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd0NsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRDbGFzcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2xhc3MpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dBdHRyaWJ1dGVzIG91dEF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzOwogI2lmbmRlZiBHZXRXaW5kb3dBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93QXR0cmlidXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0QXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dEF0dHJpYnV0ZXMpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlczsKLQlXaW5kb3dBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd0F0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzOworICAgIFdpbmRvd0F0dHJpYnV0ZXMgY2xlYXJUaGVzZUF0dHJpYnV0ZXM7CiAjaWZuZGVmIENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMKLQlQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKLQkgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaGVzZUF0dHJpYnV0ZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldFRoZXNlQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsZWFyVGhlc2VBdHRyaWJ1dGVzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZVdpbmRvd0F0dHJpYnV0ZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaGVzZUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaGVzZUF0dHJpYnV0ZXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dDbGFzcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOwogI2lmbmRlZiBTZXRXaW5kb3dDbGFzcwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0NsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dDbGFzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93Q2xhc3MoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0NsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dNb2RhbGl0eShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQ7Ci0JV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQ7CisgICAgV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3c7CiAjaWZuZGVmIFNldFdpbmRvd01vZGFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93TW9kYWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd01vZGFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblVuYXZhaWxhYmxlV2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd01vZGFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGluTW9kYWxLaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBpblVuYXZhaWxhYmxlV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5Nb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5VbmF2YWlsYWJsZVdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dNb2RhbGl0eShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk1vZGFsS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5VbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd01vZGFsaXR5KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dNb2RhbGl0eSBvdXRNb2RhbEtpbmQ7Ci0JV2luZG93UHRyIG91dFVuYXZhaWxhYmxlV2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd01vZGFsaXR5IG91dE1vZGFsS2luZDsKKyAgICBXaW5kb3dQdHIgb3V0VW5hdmFpbGFibGVXaW5kb3c7CiAjaWZuZGVmIEdldFdpbmRvd01vZGFsaXR5Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93TW9kYWxpdHkpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd01vZGFsaXR5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93TW9kYWxpdHkoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFVuYXZhaWxhYmxlV2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIG91dE1vZGFsS2luZCwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFVuYXZhaWxhYmxlV2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd01vZGFsaXR5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRNb2RhbEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRVbmF2YWlsYWJsZVdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd0NvbnRlbnRDb2xvcihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIFNldFdpbmRvd0NvbnRlbnRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0NvbnRlbnRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Q29udGVudENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJmNvbG9yKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0NvbnRlbnRDb2xvcihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbG9yKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX0NvbnZlcnQsICZjb2xvcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dDb250ZW50Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NvbnRlbnRDb2xvcihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUkdCQ29sb3IgY29sb3I7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUkdCQ29sb3IgY29sb3I7CiAjaWZuZGVmIEdldFdpbmRvd0NvbnRlbnRDb2xvcgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0NvbnRlbnRDb2xvcik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudENvbG9yKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93Q29udGVudENvbG9yKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3IpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBRZFJHQl9OZXcsICZjb2xvcik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dDb250ZW50Q29sb3IoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJmNvbG9yKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93Q29udGVudFBhdHRlcm4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBpeFBhdEhhbmRsZSBvdXRQaXhQYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUGl4UGF0SGFuZGxlIG91dFBpeFBhdDsKICNpZm5kZWYgR2V0V2luZG93Q29udGVudFBhdHRlcm4KLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UGF0dGVybik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Q29udGVudFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dFBpeFBhdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dDb250ZW50UGF0dGVybihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRQaXhQYXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRQaXhQYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93Q29udGVudFBhdHRlcm4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0UGl4UGF0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93Q29udGVudFBhdHRlcm4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVBpeFBhdEhhbmRsZSBwaXhQYXQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUGl4UGF0SGFuZGxlIHBpeFBhdDsKICNpZm5kZWYgU2V0V2luZG93Q29udGVudFBhdHRlcm4KLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dDb250ZW50UGF0dGVybik7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Q29udGVudFBhdHRlcm4pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpeFBhdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dDb250ZW50UGF0dGVybihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhQYXQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaXhQYXQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93Q29udGVudFBhdHRlcm4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4UGF0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2Nyb2xsV2luZG93UmVjdChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmVjdCBpblNjcm9sbFJlY3Q7Ci0JU0ludDE2IGluSFBpeGVsczsKLQlTSW50MTYgaW5WUGl4ZWxzOwotCVNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zOwotCVJnbkhhbmRsZSBvdXRFeHBvc2VkUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5TY3JvbGxSZWN0OworICAgIFNJbnQxNiBpbkhQaXhlbHM7CisgICAgU0ludDE2IGluVlBpeGVsczsKKyAgICBTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9uczsKKyAgICBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbjsKICNpZm5kZWYgU2Nyb2xsV2luZG93UmVjdAotCVB5TWFjX1BSRUNIRUNLKFNjcm9sbFdpbmRvd1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFNjcm9sbFdpbmRvd1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNjcm9sbFJlY3QsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTY3JvbGxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgJmluU2Nyb2xsUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICBvdXRFeHBvc2VkUmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmhobE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluU2Nyb2xsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluSFBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVlBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZvdXRFeHBvc2VkUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNjcm9sbFdpbmRvd1JlY3QoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5TY3JvbGxSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSFBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblZQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEV4cG9zZWRSZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TY3JvbGxXaW5kb3dSZWdpb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSBpblNjcm9sbFJnbjsKLQlTSW50MTYgaW5IUGl4ZWxzOwotCVNJbnQxNiBpblZQaXhlbHM7Ci0JU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnM7Ci0JUmduSGFuZGxlIG91dEV4cG9zZWRSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIGluU2Nyb2xsUmduOworICAgIFNJbnQxNiBpbkhQaXhlbHM7CisgICAgU0ludDE2IGluVlBpeGVsczsKKyAgICBTY3JvbGxXaW5kb3dPcHRpb25zIGluT3B0aW9uczsKKyAgICBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbjsKICNpZm5kZWYgU2Nyb2xsV2luZG93UmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soU2Nyb2xsV2luZG93UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTY3JvbGxXaW5kb3dSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5TY3JvbGxSZ24sCi0JICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTY3JvbGxXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2Nyb2xsUmduLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXhwb3NlZFJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZoaGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5TY3JvbGxSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkhQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblZQaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RXhwb3NlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTY3JvbGxXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2Nyb2xsUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5WUGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RXhwb3NlZFJnbik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NsaXBBYm92ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQ2xpcEFib3ZlCi0JUHlNYWNfUFJFQ0hFQ0soQ2xpcEFib3ZlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDbGlwQWJvdmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUNsaXBBYm92ZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENsaXBBYm92ZShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1BhaW50T25lKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKICNpZm5kZWYgUGFpbnRPbmUKLQlQeU1hY19QUkVDSEVDSyhQYWludE9uZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRPbmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCVBhaW50T25lKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50T25lKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1BhaW50QmVoaW5kKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIGNsb2JiZXJlZFJnbjsKICNpZm5kZWYgUGFpbnRCZWhpbmQKLQlQeU1hY19QUkVDSEVDSyhQYWludEJlaGluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soUGFpbnRCZWhpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCi0JCXJldHVybiBOVUxMOwotCVBhaW50QmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFBhaW50QmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NhbGNWaXMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIENhbGNWaXMKLQlQeU1hY19QUkVDSEVDSyhDYWxjVmlzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDYWxjVmlzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlDYWxjVmlzKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQ2FsY1Zpcyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NhbGNWaXNCZWhpbmQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgY2xvYmJlcmVkUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZ25IYW5kbGUgY2xvYmJlcmVkUmduOwogI2lmbmRlZiBDYWxjVmlzQmVoaW5kCi0JUHlNYWNfUFJFQ0hFQ0soQ2FsY1Zpc0JlaGluZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ2FsY1Zpc0JlaGluZCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmY2xvYmJlcmVkUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JQ2FsY1Zpc0JlaGluZChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgY2xvYmJlcmVkUmduKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmNsb2JiZXJlZFJnbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIENhbGNWaXNCZWhpbmQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgIGNsb2JiZXJlZFJnbik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9CcmluZ1RvRnJvbnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEJyaW5nVG9Gcm9udAotCVB5TWFjX1BSRUNIRUNLKEJyaW5nVG9Gcm9udCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQnJpbmdUb0Zyb250KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlCcmluZ1RvRnJvbnQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBCcmluZ1RvRnJvbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZW5kQmVoaW5kKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIGJlaGluZFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIGJlaGluZFdpbmRvdzsKICNpZm5kZWYgU2VuZEJlaGluZAotCVB5TWFjX1BSRUNIRUNLKFNlbmRCZWhpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNlbmRCZWhpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZFdpbmRvdykpCi0JCXJldHVybiBOVUxMOwotCVNlbmRCZWhpbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIGJlaGluZFdpbmRvdyk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmRXaW5kb3cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZW5kQmVoaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBiZWhpbmRXaW5kb3cpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2VsZWN0V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBTZWxlY3RXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhTZWxlY3RXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFNlbGVjdFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2VsZWN0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2VsZWN0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0TmV4dFdpbmRvd09mQ2xhc3MoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCVdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7Ci0JQm9vbGVhbiBtdXN0QmVWaXNpYmxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3M7CisgICAgQm9vbGVhbiBtdXN0QmVWaXNpYmxlOwogI2lmbmRlZiBHZXROZXh0V2luZG93T2ZDbGFzcwotCVB5TWFjX1BSRUNIRUNLKEdldE5leHRXaW5kb3dPZkNsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXh0V2luZG93T2ZDbGFzcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAmbXVzdEJlVmlzaWJsZSkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5leHRXaW5kb3dPZkNsYXNzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0QmVWaXNpYmxlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm11c3RCZVZpc2libGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXh0V2luZG93T2ZDbGFzcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlVmlzaWJsZSk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dBbHRlcm5hdGVUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgaW5UaXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblRpdGxlOwogI2lmbmRlZiBTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0FsdGVybmF0ZVRpdGxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpblRpdGxlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0FsdGVybmF0ZVRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGl0bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluVGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5UaXRsZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0NvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgb3V0VGl0bGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQ0ZTdHJpbmdSZWYgb3V0VGl0bGU7CiAjaWZuZGVmIENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZQotCVB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0VGl0bGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9OZXcsIG91dFRpdGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFRpdGxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRUaXRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0hpbGl0ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gZkhpbGl0ZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBmSGlsaXRlOwogI2lmbmRlZiBIaWxpdGVXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhIaWxpdGVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpbGl0ZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZIaWxpdGUpKQotCQlyZXR1cm4gTlVMTDsKLQlIaWxpdGVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgZkhpbGl0ZSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZkhpbGl0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpbGl0ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBmSGlsaXRlKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdSZWZDb24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlsb25nIGRhdGE7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgZGF0YTsKICNpZm5kZWYgU2V0V1JlZkNvbgotCVB5TWFjX1BSRUNIRUNLKFNldFdSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZkYXRhKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0V1JlZkNvbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgZGF0YSk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIGRhdGEpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V1JlZkNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCWxvbmcgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKICNpZm5kZWYgR2V0V1JlZkNvbgotCVB5TWFjX1BSRUNIRUNLKEdldFdSZWZDb24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdSZWZDb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdSZWZDb24oX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1BpYyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVBpY0hhbmRsZSBwaWM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBpY0hhbmRsZSBwaWM7CiAjaWZuZGVmIFNldFdpbmRvd1BpYwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1BpYyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UGljKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZwaWMpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRXaW5kb3dQaWMoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgcGljKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnBpYykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICBwaWMpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UGljKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUGljSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUGljSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0V2luZG93UGljCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UGljKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQaWMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd1BpYyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdWYXJpYW50KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBfcnY7CiAjaWZuZGVmIEdldFdWYXJpYW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V1ZhcmlhbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdWYXJpYW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXVmFyaWFudChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0V1ZhcmlhbnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0ZlYXR1cmVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlVSW50MzIgb3V0RmVhdHVyZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgVUludDMyIG91dEZlYXR1cmVzOwogI2lmbmRlZiBHZXRXaW5kb3dGZWF0dXJlcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0ZlYXR1cmVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dGZWF0dXJlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0ZlYXR1cmVzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGZWF0dXJlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgb3V0RmVhdHVyZXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93RmVhdHVyZXMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEZlYXR1cmVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRGZWF0dXJlcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1JlZ2lvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbkNvZGU7Ci0JUmduSGFuZGxlIGlvV2luUmduOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOworICAgIFJnbkhhbmRsZSBpb1dpblJnbjsKICNpZm5kZWYgR2V0V2luZG93UmVnaW9uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UmVnaW9uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dSZWdpb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpb1dpblJnbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dSZWdpb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIGlvV2luUmduKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJITyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmlvV2luUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1JlZ2lvbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9XaW5SZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3Qgb3V0UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IG91dFJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVjdCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93U3RydWN0dXJlV2lkdGhzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0UmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9CZWdpblVwZGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgQmVnaW5VcGRhdGUKLQlQeU1hY19QUkVDSEVDSyhCZWdpblVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmVnaW5VcGRhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUJlZ2luVXBkYXRlKF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgQmVnaW5VcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9FbmRVcGRhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIEVuZFVwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKEVuZFVwZGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kVXBkYXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlFbmRVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBFbmRVcGRhdGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9JbnZhbFdpbmRvd1JnbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUmduSGFuZGxlIHJlZ2lvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZ25IYW5kbGUgcmVnaW9uOwogI2lmbmRlZiBJbnZhbFdpbmRvd1JnbgotCVB5TWFjX1BSRUNIRUNLKEludmFsV2luZG93UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJbnZhbFdpbmRvd1Jnbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcmVnaW9uKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEludmFsV2luZG93UmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBJbnZhbFdpbmRvd1Jnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9JbnZhbFdpbmRvd1JlY3QoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3QgYm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBJbnZhbFdpbmRvd1JlY3QKLQlQeU1hY19QUkVDSEVDSyhJbnZhbFdpbmRvd1JlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKEludmFsV2luZG93UmVjdCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gSW52YWxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gSW52YWxXaW5kb3dSZWN0KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVmFsaWRXaW5kb3dSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJnbkhhbmRsZSByZWdpb247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUmduSGFuZGxlIHJlZ2lvbjsKICNpZm5kZWYgVmFsaWRXaW5kb3dSZ24KLQlQeU1hY19QUkVDSEVDSyhWYWxpZFdpbmRvd1Jnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soVmFsaWRXaW5kb3dSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJnJlZ2lvbikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBWYWxpZFdpbmRvd1Jnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICByZWdpb24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyZWdpb24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gVmFsaWRXaW5kb3dSZ24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVmFsaWRXaW5kb3dSZWN0KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBSZWN0IGJvdW5kczsKICNpZm5kZWYgVmFsaWRXaW5kb3dSZWN0Ci0JUHlNYWNfUFJFQ0hFQ0soVmFsaWRXaW5kb3dSZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhWYWxpZFdpbmRvd1JlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFZhbGlkV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFZhbGlkV2luZG93UmVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0RyYXdHcm93SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgRHJhd0dyb3dJY29uCi0JUHlNYWNfUFJFQ0hFQ0soRHJhd0dyb3dJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEcmF3R3Jvd0ljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCURyYXdHcm93SWNvbihfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIERyYXdHcm93SWNvbihfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdUaXRsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVN0cjI1NSB0aXRsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgU3RyMjU1IHRpdGxlOwogI2lmbmRlZiBTZXRXVGl0bGUKLQlQeU1hY19QUkVDSEVDSyhTZXRXVGl0bGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdUaXRsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQotCQlyZXR1cm4gTlVMTDsKLQlTZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgdGl0bGUpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFN0cjI1NSwgdGl0bGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgdGl0bGUpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V1RpdGxlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JU3RyMjU1IHRpdGxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBTdHIyNTUgdGl0bGU7CiAjaWZuZGVmIEdldFdUaXRsZQotCVB5TWFjX1BSRUNIRUNLKEdldFdUaXRsZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V1RpdGxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRXVGl0bGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgdGl0bGUpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRTdHIyNTUsIHRpdGxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0V1RpdGxlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgIHRpdGxlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCB0aXRsZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlDRlN0cmluZ1JlZiBpblN0cmluZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBDRlN0cmluZ1JlZiBpblN0cmluZzsKICNpZm5kZWYgU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZk9ial9Db252ZXJ0LCAmaW5TdHJpbmcpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TdHJpbmcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJmluU3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQ0ZTdHJpbmdSZWYgb3V0U3RyaW5nOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIENGU3RyaW5nUmVmIG91dFN0cmluZzsKICNpZm5kZWYgQ29weVdpbmRvd1RpdGxlQXNDRlN0cmluZwotCVB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcpOworICAgIFB5TWFjX1BSRUNIRUNLKENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cmluZyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX05ldywgb3V0U3RyaW5nKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0U3RyaW5nKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBvdXRTdHJpbmcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dQcm94eUZTU3BlYyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JRlNTcGVjIGluRmlsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBGU1NwZWMgaW5GaWxlOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUZTU3BlYwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1Byb3h5RlNTcGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dQcm94eUZTU3BlYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRmlsZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dQcm94eUZTU3BlYyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldEZTU3BlYywgJmluRmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUZTU3BlYyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5GaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93UHJveHlGU1NwZWMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUZTU3BlYyBvdXRGaWxlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEZTU3BlYyBvdXRGaWxlOwogI2lmbmRlZiBHZXRXaW5kb3dQcm94eUZTU3BlYwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5RlNTcGVjKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUZTU3BlYyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd1Byb3h5RlNTcGVjKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaWxlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZvdXRGaWxlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFdpbmRvd1Byb3h5RlNTcGVjKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRGaWxlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGU1NwZWMsICZvdXRGaWxlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93UHJveHlBbGlhcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JQWxpYXNIYW5kbGUgaW5BbGlhczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBpbkFsaWFzOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUFsaWFzCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlBbGlhcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlBbGlhcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5BbGlhcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBTZXRXaW5kb3dQcm94eUFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BbGlhcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmluQWxpYXMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93UHJveHlBbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWxpYXMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQcm94eUFsaWFzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlBbGlhc0hhbmRsZSBhbGlhczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBBbGlhc0hhbmRsZSBhbGlhczsKICNpZm5kZWYgR2V0V2luZG93UHJveHlBbGlhcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5QWxpYXMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3h5QWxpYXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dQcm94eUFsaWFzKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWFzKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgYWxpYXMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93UHJveHlBbGlhcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlhcyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGFsaWFzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIGZpbGVDcmVhdG9yOwotCU9TVHlwZSBmaWxlVHlwZTsKLQlTSW50MTYgdlJlZk51bTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgZmlsZUNyZWF0b3I7CisgICAgT1NUeXBlIGZpbGVUeXBlOworICAgIFNJbnQxNiB2UmVmTnVtOwogI2lmbmRlZiBTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZmaWxlVHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZSZWZOdW0pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZSZWZOdW0pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmZpbGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdlJlZk51bSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlJlZk51bSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1Byb3h5SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSWNvblJlZiBvdXRJY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEljb25SZWYgb3V0SWNvbjsKICNpZm5kZWYgR2V0V2luZG93UHJveHlJY29uCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UHJveHlJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQcm94eUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRJY29uKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0SWNvbik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1Byb3h5SWNvbihXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JSWNvblJlZiBpY29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEljb25SZWYgaWNvbjsKICNpZm5kZWYgU2V0V2luZG93UHJveHlJY29uCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93UHJveHlJY29uKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dQcm94eUljb24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJmljb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93UHJveHlJY29uKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaWNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTZXRXaW5kb3dQcm94eUljb24oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZW1vdmVXaW5kb3dQcm94eShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CiAjaWZuZGVmIFJlbW92ZVdpbmRvd1Byb3h5Ci0JUHlNYWNfUFJFQ0hFQ0soUmVtb3ZlV2luZG93UHJveHkpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlbW92ZVdpbmRvd1Byb3h5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVtb3ZlV2luZG93UHJveHkoX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBSZW1vdmVXaW5kb3dQcm94eShfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQmVnaW5XaW5kb3dQcm94eURyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURyYWdSZWZlcmVuY2Ugb3V0TmV3RHJhZzsKLQlSZ25IYW5kbGUgb3V0RHJhZ091dGxpbmVSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgRHJhZ1JlZmVyZW5jZSBvdXROZXdEcmFnOworICAgIFJnbkhhbmRsZSBvdXREcmFnT3V0bGluZVJnbjsKICNpZm5kZWYgQmVnaW5XaW5kb3dQcm94eURyYWcKLQlQeU1hY19QUkVDSEVDSyhCZWdpbldpbmRvd1Byb3h5RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQmVnaW5XaW5kb3dQcm94eURyYWcpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBSZXNPYmpfQ29udmVydCwgJm91dERyYWdPdXRsaW5lUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEJlZ2luV2luZG93UHJveHlEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXROZXdEcmFnLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREcmFnT3V0bGluZVJnbik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIERyYWdPYmpfTmV3LCBvdXROZXdEcmFnKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmb3V0RHJhZ091dGxpbmVSZ24pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQmVnaW5XaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0RyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dERyYWdPdXRsaW5lUmduKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9OZXcsIG91dE5ld0RyYWcpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9FbmRXaW5kb3dQcm94eURyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCURyYWdSZWZlcmVuY2UgdGhlRHJhZzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBEcmFnUmVmZXJlbmNlIHRoZURyYWc7CiAjaWZuZGVmIEVuZFdpbmRvd1Byb3h5RHJhZwotCVB5TWFjX1BSRUNIRUNLKEVuZFdpbmRvd1Byb3h5RHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5kV2luZG93UHJveHlEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmdGhlRHJhZykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBFbmRXaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURyYWcpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmdGhlRHJhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBFbmRXaW5kb3dQcm94eURyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZURyYWcpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgc3RhcnRQdDsKLQlEcmFnUmVmZXJlbmNlIGRyYWc7Ci0JUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ247CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgc3RhcnRQdDsKKyAgICBEcmFnUmVmZXJlbmNlIGRyYWc7CisgICAgUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ247CiAjaWZuZGVmIFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnCi0JUHlNYWNfUFJFQ0hFQ0soVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWcpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKLQkgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmZHJhZywKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRyYWdPdXRsaW5lUmduKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZ091dGxpbmVSZ24pOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhZ09ial9Db252ZXJ0LCAmZHJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRyYWdPdXRsaW5lUmduKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRHJhZ091dGxpbmVSZ24pOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFja1dpbmRvd1Byb3h5RHJhZyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgc3RhcnRQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBQb2ludCBzdGFydFB0OwogI2lmbmRlZiBUcmFja1dpbmRvd1Byb3h5RHJhZwotCVB5TWFjX1BSRUNIRUNLKFRyYWNrV2luZG93UHJveHlEcmFnKTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFja1dpbmRvd1Byb3h5RHJhZyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBUcmFja1dpbmRvd1Byb3h5RHJhZyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFja1dpbmRvd1Byb3h5RHJhZyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFB0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSXNXaW5kb3dNb2RpZmllZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dNb2RpZmllZAotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93TW9kaWZpZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKElzV2luZG93TW9kaWZpZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd01vZGlmaWVkKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIG1vZGlmaWVkOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gbW9kaWZpZWQ7CiAjaWZuZGVmIFNldFdpbmRvd01vZGlmaWVkCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93TW9kaWZpZWQpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd01vZGlmaWVkKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZWQpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gU2V0V2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbW9kaWZpZWQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93TW9kaWZpZWQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd1BhdGhTZWxlY3RDbGljayhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OwotCUV2ZW50UmVjb3JkIGV2ZW50OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKKyAgICBFdmVudFJlY29yZCBldmVudDsKICNpZm5kZWYgSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2sKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd1BhdGhTZWxlY3RDbGljayk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2spOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRFdmVudFJlY29yZCwgJmV2ZW50KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2soX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0RXZlbnRSZWNvcmQsICZldmVudCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93UGF0aFNlbGVjdENsaWNrKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfV2luZG93UGF0aFNlbGVjdChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JTWVudUhhbmRsZSBtZW51OwotCVNJbnQzMiBvdXRNZW51UmVzdWx0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIE1lbnVIYW5kbGUgbWVudTsKKyAgICBTSW50MzIgb3V0TWVudVJlc3VsdDsKICNpZm5kZWYgV2luZG93UGF0aFNlbGVjdAotCVB5TWFjX1BSRUNIRUNLKFdpbmRvd1BhdGhTZWxlY3QpOworICAgIFB5TWFjX1BSRUNIRUNLKFdpbmRvd1BhdGhTZWxlY3QpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX0NvbnZlcnQsICZtZW51KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFdpbmRvd1BhdGhTZWxlY3QoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZW51LAotCSAgICAgICAgICAgICAgICAgICAgICAgICZvdXRNZW51UmVzdWx0KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKLQkgICAgICAgICAgICAgICAgICAgICBvdXRNZW51UmVzdWx0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfQ29udmVydCwgJm1lbnUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gV2luZG93UGF0aFNlbGVjdChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnVSZXN1bHQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dE1lbnVSZXN1bHQpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9IaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gaGlsaXRlZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBCb29sZWFuIGhpbGl0ZWQ7CiAjaWZuZGVmIEhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZwotCVB5TWFjX1BSRUNIRUNLKEhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlZCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZWQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlsaXRlZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbGl0ZWQpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9UcmFuc2l0aW9uV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0OwotCVdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb247Ci0JUmVjdCBpblJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdDsKKyAgICBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uOworICAgIFJlY3QgaW5SZWN0OwogI2lmbmRlZiBUcmFuc2l0aW9uV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soVHJhbnNpdGlvbldpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soVHJhbnNpdGlvbldpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhbnNpdGlvbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIGluQWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICZpblJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5FZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluUmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBUcmFuc2l0aW9uV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5FZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5BY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluUmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1RyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1B0ciBpblBhcmVudFdpbmRvdzsKLQlXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0OwotCVdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb247Ci0JUmVjdCBpblJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgV2luZG93UHRyIGluUGFyZW50V2luZG93OworICAgIFdpbmRvd1RyYW5zaXRpb25FZmZlY3QgaW5FZmZlY3Q7CisgICAgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbjsKKyAgICBSZWN0IGluUmVjdDsKICNpZm5kZWYgVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudAotCVB5TWFjX1BSRUNIRUNLKFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblBhcmVudFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5BY3Rpb24sCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblJlY3QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyZW50V2luZG93LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRWZmZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQWN0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmaW5QYXJlbnRXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5SZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcmVudFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5SZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjTW92ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGhHbG9iYWw7Ci0Jc2hvcnQgdkdsb2JhbDsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoR2xvYmFsOworICAgIHNob3J0IHZHbG9iYWw7CisgICAgQm9vbGVhbiBmcm9udDsKICNpZm5kZWYgTWFjTW92ZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE1hY01vdmVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY01vdmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlNYWNNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBoR2xvYmFsLAotCSAgICAgICAgICAgICAgdkdsb2JhbCwKLQkgICAgICAgICAgICAgIGZyb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNYWNNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBoR2xvYmFsLAorICAgICAgICAgICAgICAgICAgdkdsb2JhbCwKKyAgICAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NpemVXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCB3OwotCXNob3J0IGg7Ci0JQm9vbGVhbiBmVXBkYXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCB3OworICAgIHNob3J0IGg7CisgICAgQm9vbGVhbiBmVXBkYXRlOwogI2lmbmRlZiBTaXplV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2l6ZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2l6ZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoaGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmdywKLQkgICAgICAgICAgICAgICAgICAgICAgJmgsCi0JICAgICAgICAgICAgICAgICAgICAgICZmVXBkYXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2l6ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgdywKLQkgICAgICAgICAgIGgsCi0JICAgICAgICAgICBmVXBkYXRlKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZlVwZGF0ZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNpemVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgIHcsCisgICAgICAgICAgICAgICBoLAorICAgICAgICAgICAgICAgZlVwZGF0ZSk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Hcm93V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUG9pbnQgc3RhcnRQdDsKLQlSZWN0IGJCb3g7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIGxvbmcgX3J2OworICAgIFBvaW50IHN0YXJ0UHQ7CisgICAgUmVjdCBiQm94OwogI2lmbmRlZiBHcm93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR3Jvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR3Jvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYkJveCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdyb3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAgICAgICAmYkJveCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmJCb3gpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHcm93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBzdGFydFB0LAorICAgICAgICAgICAgICAgICAgICAgJmJCb3gpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9EcmFnV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUG9pbnQgc3RhcnRQdDsKLQlSZWN0IGJvdW5kc1JlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFBvaW50IHN0YXJ0UHQ7CisgICAgUmVjdCBib3VuZHNSZWN0OwogI2lmbmRlZiBEcmFnV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRHJhZ1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRHJhZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZzdGFydFB0LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCURyYWdXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgIHN0YXJ0UHQsCi0JICAgICAgICAgICAmYm91bmRzUmVjdCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgRHJhZ1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgc3RhcnRQdCwKKyAgICAgICAgICAgICAgICZib3VuZHNSZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1pvb21XaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZTsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZTsKKyAgICBCb29sZWFuIGZyb250OwogI2lmbmRlZiBab29tV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZwYXJ0Q29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmZyb250KSkKLQkJcmV0dXJuIE5VTEw7Ci0JWm9vbVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgcGFydENvZGUsCi0JICAgICAgICAgICBmcm9udCk7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcnRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBab29tV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBwYXJ0Q29kZSwKKyAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93Q29sbGFwc2FibGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93Q29sbGFwc2FibGUKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNhYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNhYmxlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd0NvbGxhcHNhYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0NvbGxhcHNhYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd0NvbGxhcHNlZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dDb2xsYXBzZWQKLQlQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0NvbGxhcHNlZCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dDb2xsYXBzZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93Q29sbGFwc2VkKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0NvbGxhcHNlZChfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29sbGFwc2VXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUJvb2xlYW4gY29sbGFwc2U7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgQm9vbGVhbiBjb2xsYXBzZTsKICNpZm5kZWYgQ29sbGFwc2VXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhDb2xsYXBzZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29sbGFwc2VXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZjb2xsYXBzZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb2xsYXBzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xsYXBzZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDb2xsYXBzZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0JvdW5kcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UmVnaW9uQ29kZSByZWdpb25Db2RlOwotCVJlY3QgZ2xvYmFsQm91bmRzOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZTsKKyAgICBSZWN0IGdsb2JhbEJvdW5kczsKICNpZm5kZWYgR2V0V2luZG93Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93Qm91bmRzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dCb3VuZHMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZnbG9iYWxCb3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVnaW9uQ29kZSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dCb3VuZHMoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2xvYmFsQm91bmRzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmZ2xvYmFsQm91bmRzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfUmVzaXplV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgaW5TdGFydFBvaW50OwotCVJlY3QgaW5TaXplQ29uc3RyYWludHM7Ci0JUmVjdCBvdXROZXdDb250ZW50UmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgaW5TdGFydFBvaW50OworICAgIFJlY3QgaW5TaXplQ29uc3RyYWludHM7CisgICAgUmVjdCBvdXROZXdDb250ZW50UmVjdDsKICNpZm5kZWYgUmVzaXplV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soUmVzaXplV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhSZXNpemVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5TdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5TaXplQ29uc3RyYWludHMpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBSZXNpemVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgaW5TdGFydFBvaW50LAotCSAgICAgICAgICAgICAgICAgICAmaW5TaXplQ29uc3RyYWludHMsCi0JICAgICAgICAgICAgICAgICAgICZvdXROZXdDb250ZW50UmVjdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dE5ld0NvbnRlbnRSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZpblN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNpemVDb25zdHJhaW50cykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFJlc2l6ZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICBpblN0YXJ0UG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICZpblNpemVDb25zdHJhaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgJm91dE5ld0NvbnRlbnRSZWN0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0TmV3Q29udGVudFJlY3QpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRXaW5kb3dCb3VuZHMoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZTsKLQlSZWN0IGdsb2JhbEJvdW5kczsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGU7CisgICAgUmVjdCBnbG9iYWxCb3VuZHM7CiAjaWZuZGVmIFNldFdpbmRvd0JvdW5kcwotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0JvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93Qm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsQm91bmRzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmZ2xvYmFsQm91bmRzKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNldFdpbmRvd0JvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9iYWxCb3VuZHMpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9SZXBvc2l0aW9uV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgcGFyZW50V2luZG93OwotCVdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dQdHIgcGFyZW50V2luZG93OworICAgIFdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZDsKICNpZm5kZWYgUmVwb3NpdGlvbldpbmRvdwotCVB5TWFjX1BSRUNIRUNLKFJlcG9zaXRpb25XaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKFJlcG9zaXRpb25XaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZwYXJlbnRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgICZtZXRob2QpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gUmVwb3NpdGlvbldpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmcGFyZW50V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0aG9kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFJlcG9zaXRpb25XaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTW92ZVdpbmRvd1N0cnVjdHVyZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0Jc2hvcnQgaEdsb2JhbDsKLQlzaG9ydCB2R2xvYmFsOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIHNob3J0IGhHbG9iYWw7CisgICAgc2hvcnQgdkdsb2JhbDsKICNpZm5kZWYgTW92ZVdpbmRvd1N0cnVjdHVyZQotCVB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3dTdHJ1Y3R1cmUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3dTdHJ1Y3R1cmUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaEdsb2JhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZHbG9iYWwpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gTW92ZVdpbmRvd1N0cnVjdHVyZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgdkdsb2JhbCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaEdsb2JhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnZHbG9iYWwpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gTW92ZVdpbmRvd1N0cnVjdHVyZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkdsb2JhbCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93SW5TdGFuZGFyZFN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgaW5JZGVhbFNpemU7Ci0JUmVjdCBvdXRJZGVhbFN0YW5kYXJkU3RhdGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IGluSWRlYWxTaXplOworICAgIFJlY3Qgb3V0SWRlYWxTdGFuZGFyZFN0YXRlOwogI2lmbmRlZiBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93SW5TdGFuZGFyZFN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5JZGVhbFNpemUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklkZWFsU2l6ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmaW5JZGVhbFNpemUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbklkZWFsU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0SWRlYWxTdGFuZGFyZFN0YXRlKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfWm9vbVdpbmRvd0lkZWFsKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQYXJ0Q29kZSBpblBhcnRDb2RlOwotCVBvaW50IGlvSWRlYWxTaXplOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1BhcnRDb2RlIGluUGFydENvZGU7CisgICAgUG9pbnQgaW9JZGVhbFNpemU7CiAjaWZuZGVmIFpvb21XaW5kb3dJZGVhbAotCVB5TWFjX1BSRUNIRUNLKFpvb21XaW5kb3dJZGVhbCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soWm9vbVdpbmRvd0lkZWFsKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0Q29kZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBab29tV2luZG93SWRlYWwoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGluUGFydENvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAmaW9JZGVhbFNpemUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCBpb0lkZWFsU2l6ZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblBhcnRDb2RlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFpvb21XaW5kb3dJZGVhbChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpb0lkZWFsU2l6ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUG9pbnQsIGlvSWRlYWxTaXplKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93SWRlYWxVc2VyU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVJlY3Qgb3V0VXNlclN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3Qgb3V0VXNlclN0YXRlOwogI2lmbmRlZiBHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0lkZWFsVXNlclN0YXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd0lkZWFsVXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRVc2VyU3RhdGUpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRVc2VyU3RhdGUpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93SWRlYWxVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFVzZXJTdGF0ZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFVzZXJTdGF0ZSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd0lkZWFsVXNlclN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlSZWN0IGluVXNlclN0YXRlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFJlY3QgaW5Vc2VyU3RhdGU7CiAjaWZuZGVmIFNldFdpbmRvd0lkZWFsVXNlclN0YXRlCi0JUHlNYWNfUFJFQ0hFQ0soU2V0V2luZG93SWRlYWxVc2VyU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd0lkZWFsVXNlclN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluVXNlclN0YXRlKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNldFdpbmRvd0lkZWFsVXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblVzZXJTdGF0ZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmaW5Vc2VyU3RhdGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gU2V0V2luZG93SWRlYWxVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluVXNlclN0YXRlKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uOwotCUdESGFuZGxlIG91dEdyZWF0ZXN0RGV2aWNlOwotCVJlY3Qgb3V0R3JlYXRlc3REZXZpY2VSZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb247CisgICAgR0RIYW5kbGUgb3V0R3JlYXRlc3REZXZpY2U7CisgICAgUmVjdCBvdXRHcmVhdGVzdERldmljZVJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIkgiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5SZWdpb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHcmVhdGVzdERldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRHcmVhdGVzdERldmljZVJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIG91dEdyZWF0ZXN0RGV2aWNlLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dEdyZWF0ZXN0RGV2aWNlUmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZ2lvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBHZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdyZWF0ZXN0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEdyZWF0ZXN0RGV2aWNlUmVjdCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX05ldywgb3V0R3JlYXRlc3REZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0R3JlYXRlc3REZXZpY2VSZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ29uc3RyYWluV2luZG93VG9TY3JlZW4oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOwotCVdpbmRvd0NvbnN0cmFpbk9wdGlvbnMgaW5PcHRpb25zOwotCVJlY3QgaW5TY3JlZW5SZWN0OwotCVJlY3Qgb3V0U3RydWN0dXJlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlOworICAgIFdpbmRvd0NvbnN0cmFpbk9wdGlvbnMgaW5PcHRpb25zOworICAgIFJlY3QgaW5TY3JlZW5SZWN0OworICAgIFJlY3Qgb3V0U3RydWN0dXJlOwogI2lmbmRlZiBDb25zdHJhaW5XaW5kb3dUb1NjcmVlbgotCVB5TWFjX1BSRUNIRUNLKENvbnN0cmFpbldpbmRvd1RvU2NyZWVuKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDb25zdHJhaW5XaW5kb3dUb1NjcmVlbik7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJIbE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluUmVnaW9uQ29kZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmluU2NyZWVuUmVjdCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDb25zdHJhaW5XaW5kb3dUb1NjcmVlbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblJlZ2lvbkNvZGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT3B0aW9ucywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU2NyZWVuUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFN0cnVjdHVyZSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJm91dFN0cnVjdHVyZSk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiSGxPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpblJlZ2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZpblNjcmVlblJlY3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ29uc3RyYWluV2luZG93VG9TY3JlZW4oX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5SZWdpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblNjcmVlblJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJ1Y3R1cmUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRTdHJ1Y3R1cmUpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9IaWRlV2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBIaWRlV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soSGlkZVdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSGlkZVdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JSGlkZVdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEhpZGVXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9NYWNTaG93V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogI2lmbmRlZiBNYWNTaG93V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjU2hvd1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjU2hvd1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JTWFjU2hvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIE1hY1Nob3dXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TaG93SGlkZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gc2hvd0ZsYWc7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gc2hvd0ZsYWc7CiAjaWZuZGVmIFNob3dIaWRlCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0hpZGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNob3dIaWRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmc2hvd0ZsYWcpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93SGlkZShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgIHNob3dGbGFnKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzaG93RmxhZykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNob3dIaWRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgc2hvd0ZsYWcpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjSXNXaW5kb3dWaXNpYmxlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OwogI2lmbmRlZiBNYWNJc1dpbmRvd1Zpc2libGUKLQlQeU1hY19QUkVDSEVDSyhNYWNJc1dpbmRvd1Zpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKE1hY0lzV2luZG93VmlzaWJsZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gTWFjSXNXaW5kb3dWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNJc1dpbmRvd1Zpc2libGUoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Nob3dTaGVldFdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JV2luZG93UHRyIGluUGFyZW50V2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdzsKICNpZm5kZWYgU2hvd1NoZWV0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soU2hvd1NoZWV0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93U2hlZXRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmluUGFyZW50V2luZG93KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNob3dTaGVldFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgaW5QYXJlbnRXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZpblBhcmVudFdpbmRvdykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBTaG93U2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyZW50V2luZG93KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfSGlkZVNoZWV0V2luZG93KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSGlkZVNoZWV0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soSGlkZVNoZWV0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhIaWRlU2hlZXRXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWRlU2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlU2hlZXRXaW5kb3coX3NlbGYtPm9iX2l0c2VsZik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFNoZWV0V2luZG93UGFyZW50KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlXaW5kb3dQdHIgb3V0UGFyZW50V2luZG93OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIFdpbmRvd1B0ciBvdXRQYXJlbnRXaW5kb3c7CiAjaWZuZGVmIEdldFNoZWV0V2luZG93UGFyZW50Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0U2hlZXRXaW5kb3dQYXJlbnQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFNoZWV0V2luZG93UGFyZW50KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gR2V0U2hlZXRXaW5kb3dQYXJlbnQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcmVudFdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgb3V0UGFyZW50V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEdldFNoZWV0V2luZG93UGFyZW50KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRQYXJlbnRXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFBhcmVudFdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKLQlPU1R5cGUgcHJvcGVydHlUYWc7Ci0JVUludDMyIGF0dHJpYnV0ZXM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgT1NUeXBlIHByb3BlcnR5Q3JlYXRvcjsKKyAgICBPU1R5cGUgcHJvcGVydHlUYWc7CisgICAgVUludDMyIGF0dHJpYnV0ZXM7CiAjaWZuZGVmIEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcwotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eUNyZWF0b3IsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5VGFnKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCi0JICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnByb3BlcnR5Q3JlYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlUYWcpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUNyZWF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlPU1R5cGUgcHJvcGVydHlDcmVhdG9yOwotCU9TVHlwZSBwcm9wZXJ0eVRhZzsKLQlVSW50MzIgYXR0cmlidXRlc1RvU2V0OwotCVVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPU1R5cGUgcHJvcGVydHlDcmVhdG9yOworICAgIE9TVHlwZSBwcm9wZXJ0eVRhZzsKKyAgICBVSW50MzIgYXR0cmlidXRlc1RvU2V0OworICAgIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcjsKICNpZm5kZWYgQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzCi0JUHlNYWNfUFJFQ0hFQ0soQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwcm9wZXJ0eVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHJpYnV0ZXNUb0NsZWFyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyhfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlDcmVhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9TZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzVG9DbGVhcik7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1RyYWNrQm94KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JUG9pbnQgdGhlUHQ7Ci0JV2luZG93UGFydENvZGUgcGFydENvZGU7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIFBvaW50IHRoZVB0OworICAgIFdpbmRvd1BhcnRDb2RlIHBhcnRDb2RlOwogI2lmbmRlZiBUcmFja0JveAotCVB5TWFjX1BSRUNIRUNLKFRyYWNrQm94KTsKKyAgICBQeU1hY19QUkVDSEVDSyhUcmFja0JveCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0LAotCSAgICAgICAgICAgICAgICAgICAgICAmcGFydENvZGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBUcmFja0JveChfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgIHRoZVB0LAotCSAgICAgICAgICAgICAgIHBhcnRDb2RlKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFydENvZGUpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBUcmFja0JveChfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgIHRoZVB0LAorICAgICAgICAgICAgICAgICAgIHBhcnRDb2RlKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfVHJhY2tHb0F3YXkoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKLQlQb2ludCB0aGVQdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CisgICAgUG9pbnQgdGhlUHQ7CiAjaWZuZGVmIFRyYWNrR29Bd2F5Ci0JUHlNYWNfUFJFQ0hFQ0soVHJhY2tHb0F3YXkpOworICAgIFB5TWFjX1BSRUNIRUNLKFRyYWNrR29Bd2F5KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFRyYWNrR29Bd2F5KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgdGhlUHQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IFRyYWNrR29Bd2F5KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgdGhlUHQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQb3J0KFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQ0dyYWZQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBDR3JhZlB0ciBfcnY7CiAjaWZuZGVmIEdldFdpbmRvd1BvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQb3J0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dQb3J0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRXaW5kb3dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUG9ydChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUNHcmFmUHRyIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQ0dyYWZQdHIgX3J2OwogI2lmbmRlZiBHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUG9ydCk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93U3RydWN0dXJlUG9ydChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIEdyYWZPYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0tpbmQoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlzaG9ydCBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKICNpZm5kZWYgR2V0V2luZG93S2luZAotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0tpbmQpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd0tpbmQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImgiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93SGlsaXRlZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dIaWxpdGVkCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dIaWxpdGVkKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd0hpbGl0ZWQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93SGlsaXRlZChfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dIaWxpdGVkKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9Jc1dpbmRvd1VwZGF0ZVBlbmRpbmcoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlCb29sZWFuIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgQm9vbGVhbiBfcnY7CiAjaWZuZGVmIElzV2luZG93VXBkYXRlUGVuZGluZwotCVB5TWFjX1BSRUNIRUNLKElzV2luZG93VXBkYXRlUGVuZGluZyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dVcGRhdGVQZW5kaW5nKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBJc1dpbmRvd1VwZGF0ZVBlbmRpbmcoX3NlbGYtPm9iX2l0c2VsZik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImIiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IElzV2luZG93VXBkYXRlUGVuZGluZyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTWFjR2V0TmV4dFdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CiAjaWZuZGVmIE1hY0dldE5leHRXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhNYWNHZXROZXh0V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhNYWNHZXROZXh0V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNHZXROZXh0V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTWFjR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd1N0YW5kYXJkU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgR2V0V2luZG93U3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0YW5kYXJkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0YW5kYXJkU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCUdldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJnJlY3QpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dTdGFuZGFyZFN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfR2V0V2luZG93VXNlclN0YXRlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCByZWN0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBSZWN0IHJlY3Q7CiAjaWZuZGVmIEdldFdpbmRvd1VzZXJTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1VzZXJTdGF0ZSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93VXNlclN0YXRlKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlHZXRXaW5kb3dVc2VyU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgJnJlY3QpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmcmVjdCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1VzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZyZWN0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfU2V0V2luZG93S2luZChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGtpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IGtpbmQ7CiAjaWZuZGVmIFNldFdpbmRvd0tpbmQKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dLaW5kKTsKKyAgICBQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dLaW5kKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImgiLAotCSAgICAgICAgICAgICAgICAgICAgICAma2luZCkpCi0JCXJldHVybiBOVUxMOwotCVNldFdpbmRvd0tpbmQoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGtpbmQpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmtpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBTZXRXaW5kb3dLaW5kKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICBraW5kKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1N0YW5kYXJkU3RhdGUoV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZWN0IHJlY3Q7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgcmVjdDsKICNpZm5kZWYgU2V0V2luZG93U3RhbmRhcmRTdGF0ZQotCVB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1N0YW5kYXJkU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1N0YW5kYXJkU3RhdGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCi0JCXJldHVybiBOVUxMOwotCVNldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1N0YW5kYXJkU3RhdGUoX3NlbGYtPm9iX2l0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN0KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1NldFdpbmRvd1VzZXJTdGF0ZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVJlY3QgcmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmVjdCByZWN0OwogI2lmbmRlZiBTZXRXaW5kb3dVc2VyU3RhdGUKLQlQeU1hY19QUkVDSEVDSyhTZXRXaW5kb3dVc2VyU3RhdGUpOworICAgIFB5TWFjX1BSRUNIRUNLKFNldFdpbmRvd1VzZXJTdGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZyZWN0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JU2V0V2luZG93VXNlclN0YXRlKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICZyZWN0KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmcmVjdCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFNldFdpbmRvd1VzZXJTdGF0ZShfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCk7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9TZXRQb3J0V2luZG93UG9ydChXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKICNpZm5kZWYgU2V0UG9ydFdpbmRvd1BvcnQKLQlQeU1hY19QUkVDSEVDSyhTZXRQb3J0V2luZG93UG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2V0UG9ydFdpbmRvd1BvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCVNldFBvcnRXaW5kb3dQb3J0KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2V0UG9ydFdpbmRvd1BvcnQoX3NlbGYtPm9iX2l0c2VsZik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dQb3J0Qm91bmRzKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmVjdCBib3VuZHM7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFJlY3QgYm91bmRzOwogI2lmbmRlZiBHZXRXaW5kb3dQb3J0Qm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UG9ydEJvdW5kcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93UG9ydEJvdW5kcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93UG9ydEJvdW5kcyhfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgJmJvdW5kcyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZib3VuZHMpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBHZXRXaW5kb3dQb3J0Qm91bmRzKF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAmYm91bmRzKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgJmJvdW5kcyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0lzV2luZG93VmlzaWJsZShXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgSXNXaW5kb3dWaXNpYmxlCi0JUHlNYWNfUFJFQ0hFQ0soSXNXaW5kb3dWaXNpYmxlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhJc1dpbmRvd1Zpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IElzV2luZG93VmlzaWJsZShfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gSXNXaW5kb3dWaXNpYmxlKF9zZWxmLT5vYl9pdHNlbGYpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd1N0cnVjdHVyZVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1N0cnVjdHVyZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93U3RydWN0dXJlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93U3RydWN0dXJlUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgICAgIHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1N0cnVjdHVyZVJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICByKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldFdpbmRvd0NvbnRlbnRSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd0NvbnRlbnRSZ24KLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UmduKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dDb250ZW50UmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93Q29udGVudFJnbihfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgICAgICAgcik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgR2V0V2luZG93Q29udGVudFJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgcik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbk9ial9HZXRXaW5kb3dVcGRhdGVSZ24oV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlSZ25IYW5kbGUgcjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIHI7CiAjaWZuZGVmIEdldFdpbmRvd1VwZGF0ZVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldFdpbmRvd1VwZGF0ZVJnbik7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93VXBkYXRlUmduKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZyKSkKLQkJcmV0dXJuIE5VTEw7Ci0JR2V0V2luZG93VXBkYXRlUmduKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICAgICAgIHIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmcikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEdldFdpbmRvd1VwZGF0ZVJnbihfc2VsZi0+b2JfaXRzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICByKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0dldE5leHRXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBHZXROZXh0V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV4dFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV4dFdpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfTW92ZVdpbmRvdyhXaW5kb3dPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCXNob3J0IGhHbG9iYWw7Ci0Jc2hvcnQgdkdsb2JhbDsKLQlCb29sZWFuIGZyb250OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBzaG9ydCBoR2xvYmFsOworICAgIHNob3J0IHZHbG9iYWw7CisgICAgQm9vbGVhbiBmcm9udDsKICNpZm5kZWYgTW92ZVdpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKE1vdmVXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAotCSAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICBoR2xvYmFsLAotCSAgICAgICAgICAgdkdsb2JhbCwKLQkgICAgICAgICAgIGZyb250KTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaGhiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhHbG9iYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ2R2xvYmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBNb3ZlV2luZG93KF9zZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICBoR2xvYmFsLAorICAgICAgICAgICAgICAgdkdsb2JhbCwKKyAgICAgICAgICAgICAgIGZyb250KTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX1Nob3dXaW5kb3coV2luZG93T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CiAjaWZuZGVmIFNob3dXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhTaG93V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhTaG93V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlTaG93V2luZG93KF9zZWxmLT5vYl9pdHNlbGYpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgU2hvd1dpbmRvdyhfc2VsZi0+b2JfaXRzZWxmKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luT2JqX0F1dG9EaXNwb3NlKFdpbmRvd09iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOwogCi0JaW50IG9ub2ZmLCBvbGQgPSAwOwotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmb25vZmYpKQotCSAgICAgICAgcmV0dXJuIE5VTEw7Ci0JaWYgKCBfc2VsZi0+b2JfZnJlZWl0ICkKLQkgICAgICAgIG9sZCA9IDE7Ci0JaWYgKCBvbm9mZiApCi0JICAgICAgICBfc2VsZi0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7Ci0JZWxzZQotCSAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOwotCXJldHVybiBfcmVzOworICAgIGludCBvbm9mZiwgb2xkID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKCBfc2VsZi0+b2JfZnJlZWl0ICkKKyAgICAgICAgb2xkID0gMTsKKyAgICBpZiAoIG9ub2ZmICkKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OworICAgIGVsc2UKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImkiLCBvbGQpOworICAgIHJldHVybiBfcmVzOwogCiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBXaW5PYmpfbWV0aG9kc1tdID0gewotCXsiR2V0V2luZG93T3duZXJDb3VudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93T3duZXJDb3VudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dENvdW50KSIpfSwKLQl7IkNsb25lV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DbG9uZVdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UmV0YWluQ291bnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1JldGFpbkNvdW50LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChJdGVtQ291bnQgX3J2KSIpfSwKLQl7IlJldGFpbldpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmV0YWluV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZWxlYXNlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZWxlYXNlV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJSZXNoYXBlQ3VzdG9tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXNoYXBlQ3VzdG9tV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dXaWRnZXRIaWxpdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1dpZGdldEhpbGl0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93RGVmUGFydENvZGUgb3V0SGlsaXRlKSIpfSwKLQl7IkdldFdpbmRvd0NsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93Q2xhc3Mgb3V0Q2xhc3MpIil9LAotCXsiR2V0V2luZG93QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93QXR0cmlidXRlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93QXR0cmlidXRlcyBvdXRBdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZVdpbmRvd0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NoYW5nZVdpbmRvd0F0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd0F0dHJpYnV0ZXMgc2V0VGhlc2VBdHRyaWJ1dGVzLCBXaW5kb3dBdHRyaWJ1dGVzIGNsZWFyVGhlc2VBdHRyaWJ1dGVzKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93Q2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NsYXNzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93TW9kYWxpdHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd01vZGFsaXR5LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dNb2RhbGl0eSBpbk1vZGFsS2luZCwgV2luZG93UHRyIGluVW5hdmFpbGFibGVXaW5kb3cpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dNb2RhbGl0eSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93TW9kYWxpdHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd01vZGFsaXR5IG91dE1vZGFsS2luZCwgV2luZG93UHRyIG91dFVuYXZhaWxhYmxlV2luZG93KSIpfSwKLQl7IlNldFdpbmRvd0NvbnRlbnRDb2xvciIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93Q29udGVudENvbG9yLCAxLAotCSBQeURvY19TVFIoIihSR0JDb2xvciBjb2xvcikgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd0NvbnRlbnRDb2xvciIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q29udGVudENvbG9yLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSR0JDb2xvciBjb2xvcikiKX0sCi0JeyJHZXRXaW5kb3dDb250ZW50UGF0dGVybiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q29udGVudFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBvdXRQaXhQYXQpIC0+IE5vbmUiKX0sCi0JeyJTZXRXaW5kb3dDb250ZW50UGF0dGVybiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93Q29udGVudFBhdHRlcm4sIDEsCi0JIFB5RG9jX1NUUigiKFBpeFBhdEhhbmRsZSBwaXhQYXQpIC0+IE5vbmUiKX0sCi0JeyJTY3JvbGxXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TY3JvbGxXaW5kb3dSZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGluU2Nyb2xsUmVjdCwgU0ludDE2IGluSFBpeGVscywgU0ludDE2IGluVlBpeGVscywgU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnMsIFJnbkhhbmRsZSBvdXRFeHBvc2VkUmduKSAtPiBOb25lIil9LAotCXsiU2Nyb2xsV2luZG93UmVnaW9uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TY3JvbGxXaW5kb3dSZWdpb24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBpblNjcm9sbFJnbiwgU0ludDE2IGluSFBpeGVscywgU0ludDE2IGluVlBpeGVscywgU2Nyb2xsV2luZG93T3B0aW9ucyBpbk9wdGlvbnMsIFJnbkhhbmRsZSBvdXRFeHBvc2VkUmduKSAtPiBOb25lIil9LAotCXsiQ2xpcEFib3ZlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DbGlwQWJvdmUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IlBhaW50T25lIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9QYWludE9uZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsb2JiZXJlZFJnbikgLT4gTm9uZSIpfSwKLQl7IlBhaW50QmVoaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9QYWludEJlaGluZCwgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIGNsb2JiZXJlZFJnbikgLT4gTm9uZSIpfSwKLQl7IkNhbGNWaXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NhbGNWaXMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkNhbGNWaXNCZWhpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NhbGNWaXNCZWhpbmQsIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCi0JeyJCcmluZ1RvRnJvbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0JyaW5nVG9Gcm9udCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2VuZEJlaGluZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2VuZEJlaGluZCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGJlaGluZFdpbmRvdykgLT4gTm9uZSIpfSwKLQl7IlNlbGVjdFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2VsZWN0V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXROZXh0V2luZG93T2ZDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0TmV4dFdpbmRvd09mQ2xhc3MsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MsIEJvb2xlYW4gbXVzdEJlVmlzaWJsZSkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiU2V0V2luZG93QWx0ZXJuYXRlVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0FsdGVybmF0ZVRpdGxlLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblRpdGxlKSAtPiBOb25lIil9LAotCXsiQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db3B5V2luZG93QWx0ZXJuYXRlVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFRpdGxlKSIpfSwKLQl7IkhpbGl0ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlsaXRlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGZIaWxpdGUpIC0+IE5vbmUiKX0sCi0JeyJTZXRXUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIihsb25nIGRhdGEpIC0+IE5vbmUiKX0sCi0JeyJHZXRXUmVmQ29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXUmVmQ29uLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChsb25nIF9ydikiKX0sCi0JeyJTZXRXaW5kb3dQaWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1BpYywgMSwKLQkgUHlEb2NfU1RSKCIoUGljSGFuZGxlIHBpYykgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd1BpYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UGljLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChQaWNIYW5kbGUgX3J2KSIpfSwKLQl7IkdldFdWYXJpYW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXVmFyaWFudCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IkdldFdpbmRvd0ZlYXR1cmVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dGZWF0dXJlcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoVUludDMyIG91dEZlYXR1cmVzKSIpfSwKLQl7IkdldFdpbmRvd1JlZ2lvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UmVnaW9uLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZSwgUmduSGFuZGxlIGlvV2luUmduKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93U3RydWN0dXJlV2lkdGhzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVXaWR0aHMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3Qgb3V0UmVjdCkiKX0sCi0JeyJCZWdpblVwZGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQmVnaW5VcGRhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkVuZFVwZGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfRW5kVXBkYXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJJbnZhbFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfSW52YWxXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJJbnZhbFdpbmRvd1JlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0ludmFsV2luZG93UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJWYWxpZFdpbmRvd1JnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfVmFsaWRXaW5kb3dSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByZWdpb24pIC0+IE5vbmUiKX0sCi0JeyJWYWxpZFdpbmRvd1JlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1ZhbGlkV2luZG93UmVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHMpIC0+IE5vbmUiKX0sCi0JeyJEcmF3R3Jvd0ljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0RyYXdHcm93SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiU2V0V1RpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXVGl0bGUsIDEsCi0JIFB5RG9jX1NUUigiKFN0cjI1NSB0aXRsZSkgLT4gTm9uZSIpfSwKLQl7IkdldFdUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1RpdGxlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChTdHIyNTUgdGl0bGUpIil9LAotCXsiU2V0V2luZG93VGl0bGVXaXRoQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nLCAxLAotCSBQeURvY19TVFIoIihDRlN0cmluZ1JlZiBpblN0cmluZykgLT4gTm9uZSIpfSwKLQl7IkNvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvcHlXaW5kb3dUaXRsZUFzQ0ZTdHJpbmcsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENGU3RyaW5nUmVmIG91dFN0cmluZykiKX0sCi0JeyJTZXRXaW5kb3dQcm94eUZTU3BlYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlGU1NwZWMsIDEsCi0JIFB5RG9jX1NUUigiKEZTU3BlYyBpbkZpbGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUZTU3BlYyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJveHlGU1NwZWMsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEZTU3BlYyBvdXRGaWxlKSIpfSwKLQl7IlNldFdpbmRvd1Byb3h5QWxpYXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5QWxpYXMsIDEsCi0JIFB5RG9jX1NUUigiKEFsaWFzSGFuZGxlIGluQWxpYXMpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm94eUFsaWFzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChBbGlhc0hhbmRsZSBhbGlhcykiKX0sCi0JeyJTZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUNyZWF0b3JBbmRUeXBlLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgZmlsZUNyZWF0b3IsIE9TVHlwZSBmaWxlVHlwZSwgU0ludDE2IHZSZWZOdW0pIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dQcm94eUljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3h5SWNvbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoSWNvblJlZiBvdXRJY29uKSIpfSwKLQl7IlNldFdpbmRvd1Byb3h5SWNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlJY29uLCAxLAotCSBQeURvY19TVFIoIihJY29uUmVmIGljb24pIC0+IE5vbmUiKX0sCi0JeyJSZW1vdmVXaW5kb3dQcm94eSIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVtb3ZlV2luZG93UHJveHksIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkJlZ2luV2luZG93UHJveHlEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9CZWdpbldpbmRvd1Byb3h5RHJhZywgMSwKLQkgUHlEb2NfU1RSKCIoUmduSGFuZGxlIG91dERyYWdPdXRsaW5lUmduKSAtPiAoRHJhZ1JlZmVyZW5jZSBvdXROZXdEcmFnKSIpfSwKLQl7IkVuZFdpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfRW5kV2luZG93UHJveHlEcmFnLCAxLAotCSBQeURvY19TVFIoIihEcmFnUmVmZXJlbmNlIHRoZURyYWcpIC0+IE5vbmUiKX0sCi0JeyJUcmFja1dpbmRvd1Byb3h5RnJvbUV4aXN0aW5nRHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQsIERyYWdSZWZlcmVuY2UgZHJhZywgUmduSGFuZGxlIGluRHJhZ091dGxpbmVSZ24pIC0+IE5vbmUiKX0sCi0JeyJUcmFja1dpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tXaW5kb3dQcm94eURyYWcsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHN0YXJ0UHQpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd01vZGlmaWVkIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd01vZGlmaWVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJTZXRXaW5kb3dNb2RpZmllZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93TW9kaWZpZWQsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gbW9kaWZpZWQpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd1BhdGhTZWxlY3RDbGljayIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2ssIDEsCi0JIFB5RG9jX1NUUigiKEV2ZW50UmVjb3JkIGV2ZW50KSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiV2luZG93UGF0aFNlbGVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfV2luZG93UGF0aFNlbGVjdCwgMSwKLQkgUHlEb2NfU1RSKCIoTWVudUhhbmRsZSBtZW51KSAtPiAoU0ludDMyIG91dE1lbnVSZXN1bHQpIil9LAotCXsiSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9IaWxpdGVXaW5kb3dGcmFtZUZvckRyYWcsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gaGlsaXRlZCkgLT4gTm9uZSIpfSwKLQl7IlRyYW5zaXRpb25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYW5zaXRpb25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1RyYW5zaXRpb25FZmZlY3QgaW5FZmZlY3QsIFdpbmRvd1RyYW5zaXRpb25BY3Rpb24gaW5BY3Rpb24sIFJlY3QgaW5SZWN0KSAtPiBOb25lIil9LAotCXsiVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhbnNpdGlvbldpbmRvd0FuZFBhcmVudCwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UHRyIGluUGFyZW50V2luZG93LCBXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0LCBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uLCBSZWN0IGluUmVjdCkgLT4gTm9uZSIpfSwKLQl7Ik1hY01vdmVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY01vdmVXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGhHbG9iYWwsIHNob3J0IHZHbG9iYWwsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCi0JeyJTaXplV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TaXplV2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCB3LCBzaG9ydCBoLCBCb29sZWFuIGZVcGRhdGUpIC0+IE5vbmUiKX0sCi0JeyJHcm93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Hcm93V2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBSZWN0IGJCb3gpIC0+IChsb25nIF9ydikiKX0sCi0JeyJEcmFnV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9EcmFnV2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBSZWN0IGJvdW5kc1JlY3QpIC0+IE5vbmUiKX0sCi0JeyJab29tV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9ab29tV2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZSwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKLQl7IklzV2luZG93Q29sbGFwc2FibGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93Q29sbGFwc2FibGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IklzV2luZG93Q29sbGFwc2VkIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0NvbGxhcHNlZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiQ29sbGFwc2VXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvbGxhcHNlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihCb29sZWFuIGNvbGxhcHNlKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dCb3VuZHMsIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZSkgLT4gKFJlY3QgZ2xvYmFsQm91bmRzKSIpfSwKLQl7IlJlc2l6ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVzaXplV2luZG93LCAxLAotCSBQeURvY19TVFIoIihQb2ludCBpblN0YXJ0UG9pbnQsIFJlY3QgaW5TaXplQ29uc3RyYWludHMpIC0+IChCb29sZWFuIF9ydiwgUmVjdCBvdXROZXdDb250ZW50UmVjdCkiKX0sCi0JeyJTZXRXaW5kb3dCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0JvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSByZWdpb25Db2RlLCBSZWN0IGdsb2JhbEJvdW5kcykgLT4gTm9uZSIpfSwKLQl7IlJlcG9zaXRpb25XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JlcG9zaXRpb25XaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBwYXJlbnRXaW5kb3csIFdpbmRvd1Bvc2l0aW9uTWV0aG9kIG1ldGhvZCkgLT4gTm9uZSIpfSwKLQl7Ik1vdmVXaW5kb3dTdHJ1Y3R1cmUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX01vdmVXaW5kb3dTdHJ1Y3R1cmUsIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IGhHbG9iYWwsIHNob3J0IHZHbG9iYWwpIC0+IE5vbmUiKX0sCi0JeyJJc1dpbmRvd0luU3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IGluSWRlYWxTaXplKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3Qgb3V0SWRlYWxTdGFuZGFyZFN0YXRlKSIpfSwKLQl7Ilpvb21XaW5kb3dJZGVhbCIsIChQeUNGdW5jdGlvbilXaW5PYmpfWm9vbVdpbmRvd0lkZWFsLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dQYXJ0Q29kZSBpblBhcnRDb2RlKSAtPiAoUG9pbnQgaW9JZGVhbFNpemUpIil9LAotCXsiR2V0V2luZG93SWRlYWxVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0lkZWFsVXNlclN0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFVzZXJTdGF0ZSkiKX0sCi0JeyJTZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93SWRlYWxVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgaW5Vc2VyU3RhdGUpIC0+IE5vbmUiKX0sCi0JeyJHZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0dyZWF0ZXN0QXJlYURldmljZSwgMSwKLQkgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbikgLT4gKEdESGFuZGxlIG91dEdyZWF0ZXN0RGV2aWNlLCBSZWN0IG91dEdyZWF0ZXN0RGV2aWNlUmVjdCkiKX0sCi0JeyJDb25zdHJhaW5XaW5kb3dUb1NjcmVlbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29uc3RyYWluV2luZG93VG9TY3JlZW4sIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb25Db2RlLCBXaW5kb3dDb25zdHJhaW5PcHRpb25zIGluT3B0aW9ucywgUmVjdCBpblNjcmVlblJlY3QpIC0+IChSZWN0IG91dFN0cnVjdHVyZSkiKX0sCi0JeyJIaWRlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9IaWRlV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJNYWNTaG93V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNTaG93V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJTaG93SGlkZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd0hpZGUsIDEsCi0JIFB5RG9jX1NUUigiKEJvb2xlYW4gc2hvd0ZsYWcpIC0+IE5vbmUiKX0sCi0JeyJNYWNJc1dpbmRvd1Zpc2libGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY0lzV2luZG93VmlzaWJsZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiU2hvd1NoZWV0V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TaG93U2hlZXRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdykgLT4gTm9uZSIpfSwKLQl7IkhpZGVTaGVldFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlkZVNoZWV0V2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJHZXRTaGVldFdpbmRvd1BhcmVudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0U2hlZXRXaW5kb3dQYXJlbnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBvdXRQYXJlbnRXaW5kb3cpIil9LAotCXsiR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMsIDEsCi0JIFB5RG9jX1NUUigiKE9TVHlwZSBwcm9wZXJ0eUNyZWF0b3IsIE9TVHlwZSBwcm9wZXJ0eVRhZykgLT4gKFVJbnQzMiBhdHRyaWJ1dGVzKSIpfSwKLQl7IkNoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2hhbmdlV2luZG93UHJvcGVydHlBdHRyaWJ1dGVzLCAxLAotCSBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcsIFVJbnQzMiBhdHRyaWJ1dGVzVG9TZXQsIFVJbnQzMiBhdHRyaWJ1dGVzVG9DbGVhcikgLT4gTm9uZSIpfSwKLQl7IlRyYWNrQm94IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja0JveCwgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQsIFdpbmRvd1BhcnRDb2RlIHBhcnRDb2RlKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiVHJhY2tHb0F3YXkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrR29Bd2F5LCAxLAotCSBQeURvY19TVFIoIihQb2ludCB0aGVQdCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFdpbmRvd1BvcnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BvcnQsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKENHcmFmUHRyIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdHJ1Y3R1cmVQb3J0LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAotCXsiR2V0V2luZG93S2luZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93S2luZCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoc2hvcnQgX3J2KSIpfSwKLQl7IklzV2luZG93SGlsaXRlZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dIaWxpdGVkLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCi0JeyJJc1dpbmRvd1VwZGF0ZVBlbmRpbmciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93VXBkYXRlUGVuZGluZywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAotCXsiTWFjR2V0TmV4dFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjR2V0TmV4dFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dTdGFuZGFyZFN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dTdGFuZGFyZFN0YXRlLCAxLAotCSBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAotCXsiR2V0V2luZG93VXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgcmVjdCkiKX0sCi0JeyJTZXRXaW5kb3dLaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dLaW5kLCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBraW5kKSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93U3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93U3RhbmRhcmRTdGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCByZWN0KSAtPiBOb25lIil9LAotCXsiU2V0V2luZG93VXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dVc2VyU3RhdGUsIDEsCi0JIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKLQl7IlNldFBvcnRXaW5kb3dQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRQb3J0V2luZG93UG9ydCwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93UG9ydEJvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UG9ydEJvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBib3VuZHMpIil9LAotCXsiSXNXaW5kb3dWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd1Zpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkdldFdpbmRvd1N0cnVjdHVyZVJnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUmduLCAxLAotCSBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKLQl7IkdldFdpbmRvd0NvbnRlbnRSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByKSAtPiBOb25lIil9LAotCXsiR2V0V2luZG93VXBkYXRlUmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dVcGRhdGVSZ24sIDEsCi0JIFB5RG9jX1NUUigiKFJnbkhhbmRsZSByKSAtPiBOb25lIil9LAotCXsiR2V0TmV4dFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0TmV4dFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJNb3ZlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Nb3ZlV2luZG93LCAxLAotCSBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAotCXsiU2hvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAotCXsiQXV0b0Rpc3Bvc2UiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0F1dG9EaXNwb3NlLCAxLAotCSBQeURvY19TVFIoIihpbnQpLT5pbnQuIEF1dG9tYXRpY2FsbHkgRGlzcG9zZUhhbmRsZSB0aGUgb2JqZWN0IG9uIFB5dGhvbiBvYmplY3QgY2xlYW51cCIpfSwKLQl7TlVMTCwgTlVMTCwgMH0KKyAgICB7IkdldFdpbmRvd093bmVyQ291bnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd093bmVyQ291bnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRDb3VudCkiKX0sCisgICAgeyJDbG9uZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2xvbmVXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1JldGFpbkNvdW50IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dSZXRhaW5Db3VudCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoSXRlbUNvdW50IF9ydikiKX0sCisgICAgeyJSZXRhaW5XaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JldGFpbldpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVsZWFzZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVsZWFzZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiUmVzaGFwZUN1c3RvbVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfUmVzaGFwZUN1c3RvbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93V2lkZ2V0SGlsaXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dXaWRnZXRIaWxpdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0RlZlBhcnRDb2RlIG91dEhpbGl0ZSkiKX0sCisgICAgeyJHZXRXaW5kb3dDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Q2xhc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0NsYXNzIG91dENsYXNzKSIpfSwKKyAgICB7IkdldFdpbmRvd0F0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0F0dHJpYnV0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd0F0dHJpYnV0ZXMgb3V0QXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dBdHRyaWJ1dGVzIHNldFRoZXNlQXR0cmlidXRlcywgV2luZG93QXR0cmlidXRlcyBjbGVhclRoZXNlQXR0cmlidXRlcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd0NsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dDbGFzcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcykgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd01vZGFsaXR5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dNb2RhbGl0eSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93TW9kYWxpdHkgaW5Nb2RhbEtpbmQsIFdpbmRvd1B0ciBpblVuYXZhaWxhYmxlV2luZG93KSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93TW9kYWxpdHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd01vZGFsaXR5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dNb2RhbGl0eSBvdXRNb2RhbEtpbmQsIFdpbmRvd1B0ciBvdXRVbmF2YWlsYWJsZVdpbmRvdykiKX0sCisgICAgeyJTZXRXaW5kb3dDb250ZW50Q29sb3IiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NvbnRlbnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUkdCQ29sb3IgY29sb3IpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dDb250ZW50Q29sb3IiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRDb2xvciwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUkdCQ29sb3IgY29sb3IpIil9LAorICAgIHsiR2V0V2luZG93Q29udGVudFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0NvbnRlbnRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgb3V0UGl4UGF0KSAtPiBOb25lIil9LAorICAgIHsiU2V0V2luZG93Q29udGVudFBhdHRlcm4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0NvbnRlbnRQYXR0ZXJuLCAxLAorICAgICBQeURvY19TVFIoIihQaXhQYXRIYW5kbGUgcGl4UGF0KSAtPiBOb25lIil9LAorICAgIHsiU2Nyb2xsV2luZG93UmVjdCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2Nyb2xsV2luZG93UmVjdCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmVjdCBpblNjcm9sbFJlY3QsIFNJbnQxNiBpbkhQaXhlbHMsIFNJbnQxNiBpblZQaXhlbHMsIFNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zLCBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IlNjcm9sbFdpbmRvd1JlZ2lvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2Nyb2xsV2luZG93UmVnaW9uLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgaW5TY3JvbGxSZ24sIFNJbnQxNiBpbkhQaXhlbHMsIFNJbnQxNiBpblZQaXhlbHMsIFNjcm9sbFdpbmRvd09wdGlvbnMgaW5PcHRpb25zLCBSZ25IYW5kbGUgb3V0RXhwb3NlZFJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkNsaXBBYm92ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ2xpcEFib3ZlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJQYWludE9uZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfUGFpbnRPbmUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJQYWludEJlaGluZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfUGFpbnRCZWhpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBjbG9iYmVyZWRSZ24pIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjVmlzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DYWxjVmlzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJDYWxjVmlzQmVoaW5kIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9DYWxjVmlzQmVoaW5kLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgY2xvYmJlcmVkUmduKSAtPiBOb25lIil9LAorICAgIHsiQnJpbmdUb0Zyb250IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9CcmluZ1RvRnJvbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNlbmRCZWhpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NlbmRCZWhpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBiZWhpbmRXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJTZWxlY3RXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NlbGVjdFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0TmV4dFdpbmRvd09mQ2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldE5leHRXaW5kb3dPZkNsYXNzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzLCBCb29sZWFuIG11c3RCZVZpc2libGUpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IlNldFdpbmRvd0FsdGVybmF0ZVRpdGxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dBbHRlcm5hdGVUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5UaXRsZSkgLT4gTm9uZSIpfSwKKyAgICB7IkNvcHlXaW5kb3dBbHRlcm5hdGVUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfQ29weVdpbmRvd0FsdGVybmF0ZVRpdGxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRUaXRsZSkiKX0sCisgICAgeyJIaWxpdGVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpbGl0ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBmSGlsaXRlKSAtPiBOb25lIil9LAorICAgIHsiU2V0V1JlZkNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V1JlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIobG9uZyBkYXRhKSAtPiBOb25lIil9LAorICAgIHsiR2V0V1JlZkNvbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1JlZkNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiU2V0V2luZG93UGljIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQaWMsIDEsCisgICAgIFB5RG9jX1NUUigiKFBpY0hhbmRsZSBwaWMpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dQaWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BpYywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUGljSGFuZGxlIF9ydikiKX0sCisgICAgeyJHZXRXVmFyaWFudCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V1ZhcmlhbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dGZWF0dXJlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93RmVhdHVyZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFVJbnQzMiBvdXRGZWF0dXJlcykiKX0sCisgICAgeyJHZXRXaW5kb3dSZWdpb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1JlZ2lvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UmVnaW9uQ29kZSBpblJlZ2lvbkNvZGUsIFJnbkhhbmRsZSBpb1dpblJnbikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1N0cnVjdHVyZVdpZHRocyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlV2lkdGhzLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IG91dFJlY3QpIil9LAorICAgIHsiQmVnaW5VcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0JlZ2luVXBkYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJFbmRVcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0VuZFVwZGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0ludmFsV2luZG93UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiSW52YWxXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9JbnZhbFdpbmRvd1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAorICAgIHsiVmFsaWRXaW5kb3dSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1ZhbGlkV2luZG93UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcmVnaW9uKSAtPiBOb25lIil9LAorICAgIHsiVmFsaWRXaW5kb3dSZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9WYWxpZFdpbmRvd1JlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzKSAtPiBOb25lIil9LAorICAgIHsiRHJhd0dyb3dJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9EcmF3R3Jvd0ljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdUaXRsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V1RpdGxlLCAxLAorICAgICBQeURvY19TVFIoIihTdHIyNTUgdGl0bGUpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXVGl0bGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdUaXRsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoU3RyMjU1IHRpdGxlKSIpfSwKKyAgICB7IlNldFdpbmRvd1RpdGxlV2l0aENGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dUaXRsZVdpdGhDRlN0cmluZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0ZTdHJpbmdSZWYgaW5TdHJpbmcpIC0+IE5vbmUiKX0sCisgICAgeyJDb3B5V2luZG93VGl0bGVBc0NGU3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db3B5V2luZG93VGl0bGVBc0NGU3RyaW5nLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDRlN0cmluZ1JlZiBvdXRTdHJpbmcpIil9LAorICAgIHsiU2V0V2luZG93UHJveHlGU1NwZWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5RlNTcGVjLCAxLAorICAgICBQeURvY19TVFIoIihGU1NwZWMgaW5GaWxlKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlGU1NwZWMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1Byb3h5RlNTcGVjLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChGU1NwZWMgb3V0RmlsZSkiKX0sCisgICAgeyJTZXRXaW5kb3dQcm94eUFsaWFzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dQcm94eUFsaWFzLCAxLAorICAgICBQeURvY19TVFIoIihBbGlhc0hhbmRsZSBpbkFsaWFzKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlBbGlhcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJveHlBbGlhcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQWxpYXNIYW5kbGUgYWxpYXMpIil9LAorICAgIHsiU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93UHJveHlDcmVhdG9yQW5kVHlwZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIGZpbGVDcmVhdG9yLCBPU1R5cGUgZmlsZVR5cGUsIFNJbnQxNiB2UmVmTnVtKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93UHJveHlJY29uIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQcm94eUljb24sIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEljb25SZWYgb3V0SWNvbikiKX0sCisgICAgeyJTZXRXaW5kb3dQcm94eUljb24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1Byb3h5SWNvbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoSWNvblJlZiBpY29uKSAtPiBOb25lIil9LAorICAgIHsiUmVtb3ZlV2luZG93UHJveHkiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1JlbW92ZVdpbmRvd1Byb3h5LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCisgICAgeyJCZWdpbldpbmRvd1Byb3h5RHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfQmVnaW5XaW5kb3dQcm94eURyYWcsIDEsCisgICAgIFB5RG9jX1NUUigiKFJnbkhhbmRsZSBvdXREcmFnT3V0bGluZVJnbikgLT4gKERyYWdSZWZlcmVuY2Ugb3V0TmV3RHJhZykiKX0sCisgICAgeyJFbmRXaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0VuZFdpbmRvd1Byb3h5RHJhZywgMSwKKyAgICAgUHlEb2NfU1RSKCIoRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKSAtPiBOb25lIil9LAorICAgIHsiVHJhY2tXaW5kb3dQcm94eUZyb21FeGlzdGluZ0RyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrV2luZG93UHJveHlGcm9tRXhpc3RpbmdEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFB0LCBEcmFnUmVmZXJlbmNlIGRyYWcsIFJnbkhhbmRsZSBpbkRyYWdPdXRsaW5lUmduKSAtPiBOb25lIil9LAorICAgIHsiVHJhY2tXaW5kb3dQcm94eURyYWciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYWNrV2luZG93UHJveHlEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBzdGFydFB0KSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dNb2RpZmllZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dNb2RpZmllZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiU2V0V2luZG93TW9kaWZpZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd01vZGlmaWVkLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIG1vZGlmaWVkKSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dQYXRoU2VsZWN0Q2xpY2siLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93UGF0aFNlbGVjdENsaWNrLCAxLAorICAgICBQeURvY19TVFIoIihFdmVudFJlY29yZCBldmVudCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IldpbmRvd1BhdGhTZWxlY3QiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1dpbmRvd1BhdGhTZWxlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKE1lbnVIYW5kbGUgbWVudSkgLT4gKFNJbnQzMiBvdXRNZW51UmVzdWx0KSIpfSwKKyAgICB7IkhpbGl0ZVdpbmRvd0ZyYW1lRm9yRHJhZyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlsaXRlV2luZG93RnJhbWVGb3JEcmFnLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGhpbGl0ZWQpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFuc2l0aW9uV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFuc2l0aW9uV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dUcmFuc2l0aW9uRWZmZWN0IGluRWZmZWN0LCBXaW5kb3dUcmFuc2l0aW9uQWN0aW9uIGluQWN0aW9uLCBSZWN0IGluUmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlRyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1RyYW5zaXRpb25XaW5kb3dBbmRQYXJlbnQsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1B0ciBpblBhcmVudFdpbmRvdywgV2luZG93VHJhbnNpdGlvbkVmZmVjdCBpbkVmZmVjdCwgV2luZG93VHJhbnNpdGlvbkFjdGlvbiBpbkFjdGlvbiwgUmVjdCBpblJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJNYWNNb3ZlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNNb3ZlV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsLCBCb29sZWFuIGZyb250KSAtPiBOb25lIil9LAorICAgIHsiU2l6ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2l6ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgdywgc2hvcnQgaCwgQm9vbGVhbiBmVXBkYXRlKSAtPiBOb25lIil9LAorICAgIHsiR3Jvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR3Jvd1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgUmVjdCBiQm94KSAtPiAobG9uZyBfcnYpIil9LAorICAgIHsiRHJhZ1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfRHJhZ1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgc3RhcnRQdCwgUmVjdCBib3VuZHNSZWN0KSAtPiBOb25lIil9LAorICAgIHsiWm9vbVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfWm9vbVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UGFydENvZGUgcGFydENvZGUsIEJvb2xlYW4gZnJvbnQpIC0+IE5vbmUiKX0sCisgICAgeyJJc1dpbmRvd0NvbGxhcHNhYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd0NvbGxhcHNhYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJJc1dpbmRvd0NvbGxhcHNlZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dDb2xsYXBzZWQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IkNvbGxhcHNlV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Db2xsYXBzZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoQm9vbGVhbiBjb2xsYXBzZSkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd0JvdW5kcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93Qm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIHJlZ2lvbkNvZGUpIC0+IChSZWN0IGdsb2JhbEJvdW5kcykiKX0sCisgICAgeyJSZXNpemVXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Jlc2l6ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgaW5TdGFydFBvaW50LCBSZWN0IGluU2l6ZUNvbnN0cmFpbnRzKSAtPiAoQm9vbGVhbiBfcnYsIFJlY3Qgb3V0TmV3Q29udGVudFJlY3QpIil9LAorICAgIHsiU2V0V2luZG93Qm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9TZXRXaW5kb3dCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgcmVnaW9uQ29kZSwgUmVjdCBnbG9iYWxCb3VuZHMpIC0+IE5vbmUiKX0sCisgICAgeyJSZXBvc2l0aW9uV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9SZXBvc2l0aW9uV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgcGFyZW50V2luZG93LCBXaW5kb3dQb3NpdGlvbk1ldGhvZCBtZXRob2QpIC0+IE5vbmUiKX0sCisgICAgeyJNb3ZlV2luZG93U3RydWN0dXJlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Nb3ZlV2luZG93U3RydWN0dXJlLCAxLAorICAgICBQeURvY19TVFIoIihzaG9ydCBoR2xvYmFsLCBzaG9ydCB2R2xvYmFsKSAtPiBOb25lIil9LAorICAgIHsiSXNXaW5kb3dJblN0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93SW5TdGFuZGFyZFN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCBpbklkZWFsU2l6ZSkgLT4gKEJvb2xlYW4gX3J2LCBSZWN0IG91dElkZWFsU3RhbmRhcmRTdGF0ZSkiKX0sCisgICAgeyJab29tV2luZG93SWRlYWwiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1pvb21XaW5kb3dJZGVhbCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoV2luZG93UGFydENvZGUgaW5QYXJ0Q29kZSkgLT4gKFBvaW50IGlvSWRlYWxTaXplKSIpfSwKKyAgICB7IkdldFdpbmRvd0lkZWFsVXNlclN0YXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dJZGVhbFVzZXJTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCBvdXRVc2VyU3RhdGUpIil9LAorICAgIHsiU2V0V2luZG93SWRlYWxVc2VyU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd0lkZWFsVXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGluVXNlclN0YXRlKSAtPiBOb25lIil9LAorICAgIHsiR2V0V2luZG93R3JlYXRlc3RBcmVhRGV2aWNlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dHcmVhdGVzdEFyZWFEZXZpY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd1JlZ2lvbkNvZGUgaW5SZWdpb24pIC0+IChHREhhbmRsZSBvdXRHcmVhdGVzdERldmljZSwgUmVjdCBvdXRHcmVhdGVzdERldmljZVJlY3QpIil9LAorICAgIHsiQ29uc3RyYWluV2luZG93VG9TY3JlZW4iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NvbnN0cmFpbldpbmRvd1RvU2NyZWVuLCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dSZWdpb25Db2RlIGluUmVnaW9uQ29kZSwgV2luZG93Q29uc3RyYWluT3B0aW9ucyBpbk9wdGlvbnMsIFJlY3QgaW5TY3JlZW5SZWN0KSAtPiAoUmVjdCBvdXRTdHJ1Y3R1cmUpIil9LAorICAgIHsiSGlkZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfSGlkZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiTWFjU2hvd1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTWFjU2hvd1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiU2hvd0hpZGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dIaWRlLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIHNob3dGbGFnKSAtPiBOb25lIil9LAorICAgIHsiTWFjSXNXaW5kb3dWaXNpYmxlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9NYWNJc1dpbmRvd1Zpc2libGUsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlNob3dTaGVldFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2hvd1NoZWV0V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihXaW5kb3dQdHIgaW5QYXJlbnRXaW5kb3cpIC0+IE5vbmUiKX0sCisgICAgeyJIaWRlU2hlZXRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0hpZGVTaGVldFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiR2V0U2hlZXRXaW5kb3dQYXJlbnQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFNoZWV0V2luZG93UGFyZW50LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgb3V0UGFyZW50V2luZG93KSIpfSwKKyAgICB7IkdldFdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcyIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93UHJvcGVydHlBdHRyaWJ1dGVzLCAxLAorICAgICBQeURvY19TVFIoIihPU1R5cGUgcHJvcGVydHlDcmVhdG9yLCBPU1R5cGUgcHJvcGVydHlUYWcpIC0+IChVSW50MzIgYXR0cmlidXRlcykiKX0sCisgICAgeyJDaGFuZ2VXaW5kb3dQcm9wZXJ0eUF0dHJpYnV0ZXMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0NoYW5nZVdpbmRvd1Byb3BlcnR5QXR0cmlidXRlcywgMSwKKyAgICAgUHlEb2NfU1RSKCIoT1NUeXBlIHByb3BlcnR5Q3JlYXRvciwgT1NUeXBlIHByb3BlcnR5VGFnLCBVSW50MzIgYXR0cmlidXRlc1RvU2V0LCBVSW50MzIgYXR0cmlidXRlc1RvQ2xlYXIpIC0+IE5vbmUiKX0sCisgICAgeyJUcmFja0JveCIsIChQeUNGdW5jdGlvbilXaW5PYmpfVHJhY2tCb3gsIDEsCisgICAgIFB5RG9jX1NUUigiKFBvaW50IHRoZVB0LCBXaW5kb3dQYXJ0Q29kZSBwYXJ0Q29kZSkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7IlRyYWNrR29Bd2F5IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9UcmFja0dvQXdheSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUHQpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dQb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dQb3J0LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChDR3JhZlB0ciBfcnYpIil9LAorICAgIHsiR2V0V2luZG93U3RydWN0dXJlUG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RydWN0dXJlUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQ0dyYWZQdHIgX3J2KSIpfSwKKyAgICB7IkdldFdpbmRvd0tpbmQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd0tpbmQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKHNob3J0IF9ydikiKX0sCisgICAgeyJJc1dpbmRvd0hpbGl0ZWQiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0lzV2luZG93SGlsaXRlZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiSXNXaW5kb3dVcGRhdGVQZW5kaW5nIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9Jc1dpbmRvd1VwZGF0ZVBlbmRpbmcsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKKyAgICB7Ik1hY0dldE5leHRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX01hY0dldE5leHRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0V2luZG93U3RhbmRhcmRTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93U3RhbmRhcmRTdGF0ZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoUmVjdCByZWN0KSIpfSwKKyAgICB7IkdldFdpbmRvd1VzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93VXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZWN0IHJlY3QpIil9LAorICAgIHsiU2V0V2luZG93S2luZCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93S2luZCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQga2luZCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd1N0YW5kYXJkU3RhdGUiLCAoUHlDRnVuY3Rpb24pV2luT2JqX1NldFdpbmRvd1N0YW5kYXJkU3RhdGUsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgcmVjdCkgLT4gTm9uZSIpfSwKKyAgICB7IlNldFdpbmRvd1VzZXJTdGF0ZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0V2luZG93VXNlclN0YXRlLCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IHJlY3QpIC0+IE5vbmUiKX0sCisgICAgeyJTZXRQb3J0V2luZG93UG9ydCIsIChQeUNGdW5jdGlvbilXaW5PYmpfU2V0UG9ydFdpbmRvd1BvcnQsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1BvcnRCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1BvcnRCb3VuZHMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFJlY3QgYm91bmRzKSIpfSwKKyAgICB7IklzV2luZG93VmlzaWJsZSIsIChQeUNGdW5jdGlvbilXaW5PYmpfSXNXaW5kb3dWaXNpYmxlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydikiKX0sCisgICAgeyJHZXRXaW5kb3dTdHJ1Y3R1cmVSZ24iLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldFdpbmRvd1N0cnVjdHVyZVJnbiwgMSwKKyAgICAgUHlEb2NfU1RSKCIoUmduSGFuZGxlIHIpIC0+IE5vbmUiKX0sCisgICAgeyJHZXRXaW5kb3dDb250ZW50UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9HZXRXaW5kb3dDb250ZW50UmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldFdpbmRvd1VwZGF0ZVJnbiIsIChQeUNGdW5jdGlvbilXaW5PYmpfR2V0V2luZG93VXBkYXRlUmduLCAxLAorICAgICBQeURvY19TVFIoIihSZ25IYW5kbGUgcikgLT4gTm9uZSIpfSwKKyAgICB7IkdldE5leHRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX0dldE5leHRXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiTW92ZVdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5PYmpfTW92ZVdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgaEdsb2JhbCwgc2hvcnQgdkdsb2JhbCwgQm9vbGVhbiBmcm9udCkgLT4gTm9uZSIpfSwKKyAgICB7IlNob3dXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luT2JqX1Nob3dXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkF1dG9EaXNwb3NlIiwgKFB5Q0Z1bmN0aW9uKVdpbk9ial9BdXRvRGlzcG9zZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiB9OwogCiAjZGVmaW5lIFdpbk9ial9nZXRzZXRsaXN0IE5VTEwKQEAgLTI1NzEsMjEgKzI1NzEsMjEgQEAKIAogc3RhdGljIGludCBXaW5PYmpfY29tcGFyZShXaW5kb3dPYmplY3QgKnNlbGYsIFdpbmRvd09iamVjdCAqb3RoZXIpCiB7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7Ci0JaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOworICAgIGlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICogV2luT2JqX3JlcHIoV2luZG93T2JqZWN0ICpzZWxmKQogewotCWNoYXIgYnVmWzEwMF07Ci0Jc3ByaW50ZihidWYsICI8V2luZG93IG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOworICAgIGNoYXIgYnVmWzEwMF07CisgICAgc3ByaW50ZihidWYsICI8V2luZG93IG9iamVjdCBhdCAweCU4Ljh4IGZvciAweCU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOwogfQogCiBzdGF0aWMgaW50IFdpbk9ial9oYXNoKFdpbmRvd09iamVjdCAqc2VsZikKIHsKLQlyZXR1cm4gKGludClzZWxmLT5vYl9pdHNlbGY7CisgICAgcmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOwogfQogI2RlZmluZSBXaW5PYmpfdHBfaW5pdCAwCiAKQEAgLTI1OTMsNjEgKzI1OTMsNjEgQEAKIAogc3RhdGljIFB5T2JqZWN0ICpXaW5PYmpfdHBfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKl9hcmdzLCBQeU9iamVjdCAqX2t3ZHMpCiB7Ci0JUHlPYmplY3QgKl9zZWxmOwotCVdpbmRvd1B0ciBpdHNlbGY7Ci0JY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CisgICAgUHlPYmplY3QgKl9zZWxmOworICAgIFdpbmRvd1B0ciBpdHNlbGY7CisgICAgY2hhciAqa3dbXSA9IHsiaXRzZWxmIiwgMH07CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhfYXJncywgX2t3ZHMsICJPJiIsIGt3LCBXaW5PYmpfQ29udmVydCwgJml0c2VsZikpIHJldHVybiBOVUxMOwotCWlmICgoX3NlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JKChXaW5kb3dPYmplY3QgKilfc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlyZXR1cm4gX3NlbGY7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoX2FyZ3MsIF9rd2RzLCAiTyYiLCBrdywgV2luT2JqX0NvbnZlcnQsICZpdHNlbGYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoKF9zZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICgoV2luZG93T2JqZWN0ICopX3NlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgcmV0dXJuIF9zZWxmOwogfQogCiAjZGVmaW5lIFdpbk9ial90cF9mcmVlIFB5T2JqZWN0X0RlbAogCiAKIFB5VHlwZU9iamVjdCBXaW5kb3dfVHlwZSA9IHsKLQlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKLQkwLCAvKm9iX3NpemUqLwotCSJfV2luLldpbmRvdyIsIC8qdHBfbmFtZSovCi0Jc2l6ZW9mKFdpbmRvd09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KLQkwLCAvKnRwX2l0ZW1zaXplKi8KLQkvKiBtZXRob2RzICovCi0JKGRlc3RydWN0b3IpIFdpbk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwotCTAsIC8qdHBfcHJpbnQqLwotCShnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLwotCShzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLwotCShjbXBmdW5jKSBXaW5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KLQkocmVwcmZ1bmMpIFdpbk9ial9yZXByLCAvKnRwX3JlcHIqLwotCShQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KLQkoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLwotCShQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLwotCShoYXNoZnVuYykgV2luT2JqX2hhc2gsIC8qdHBfaGFzaCovCi0JMCwgLyp0cF9jYWxsKi8KLQkwLCAvKnRwX3N0ciovCi0JUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLwotCVB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCi0JMCwgLyp0cF9hc19idWZmZXIqLwotCVB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLwotCTAsIC8qdHBfZG9jKi8KLQkwLCAvKnRwX3RyYXZlcnNlKi8KLQkwLCAvKnRwX2NsZWFyKi8KLQkwLCAvKnRwX3JpY2hjb21wYXJlKi8KLQkwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KLQkwLCAvKnRwX2l0ZXIqLwotCTAsIC8qdHBfaXRlcm5leHQqLwotCVdpbk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCi0JMCwgLyp0cF9tZW1iZXJzKi8KLQlXaW5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLwotCTAsIC8qdHBfYmFzZSovCi0JMCwgLyp0cF9kaWN0Ki8KLQkwLCAvKnRwX2Rlc2NyX2dldCovCi0JMCwgLyp0cF9kZXNjcl9zZXQqLwotCTAsIC8qdHBfZGljdG9mZnNldCovCi0JV2luT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KLQlXaW5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCi0JV2luT2JqX3RwX25ldywgLyogdHBfbmV3ICovCi0JV2luT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KKyAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAwLCAvKm9iX3NpemUqLworICAgICJfV2luLldpbmRvdyIsIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFdpbmRvd09iamVjdCksIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpIFdpbk9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYykwLCAvKnRwX2dldGF0dHIqLworICAgIChzZXRhdHRyZnVuYykwLCAvKnRwX3NldGF0dHIqLworICAgIChjbXBmdW5jKSBXaW5PYmpfY29tcGFyZSwgLyp0cF9jb21wYXJlKi8KKyAgICAocmVwcmZ1bmMpIFdpbk9ial9yZXByLCAvKnRwX3JlcHIqLworICAgIChQeU51bWJlck1ldGhvZHMgKikwLCAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAoUHlTZXF1ZW5jZU1ldGhvZHMgKikwLCAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIChQeU1hcHBpbmdNZXRob2RzICopMCwgLyogdHBfYXNfbWFwcGluZyAqLworICAgIChoYXNoZnVuYykgV2luT2JqX2hhc2gsIC8qdHBfaGFzaCovCisgICAgMCwgLyp0cF9jYWxsKi8KKyAgICAwLCAvKnRwX3N0ciovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsIC8qdHBfZ2V0YXR0cm8qLworICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLCAvKnRwX3NldGF0dHJvICovCisgICAgMCwgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVHxQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIDAsIC8qdHBfZG9jKi8KKyAgICAwLCAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAvKnRwX2NsZWFyKi8KKyAgICAwLCAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAvKnRwX2l0ZXIqLworICAgIDAsIC8qdHBfaXRlcm5leHQqLworICAgIFdpbk9ial9tZXRob2RzLCAvKiB0cF9tZXRob2RzICovCisgICAgMCwgLyp0cF9tZW1iZXJzKi8KKyAgICBXaW5PYmpfZ2V0c2V0bGlzdCwgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qdHBfYmFzZSovCisgICAgMCwgLyp0cF9kaWN0Ki8KKyAgICAwLCAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsIC8qdHBfZGljdG9mZnNldCovCisgICAgV2luT2JqX3RwX2luaXQsIC8qIHRwX2luaXQgKi8KKyAgICBXaW5PYmpfdHBfYWxsb2MsIC8qIHRwX2FsbG9jICovCisgICAgV2luT2JqX3RwX25ldywgLyogdHBfbmV3ICovCisgICAgV2luT2JqX3RwX2ZyZWUsIC8qIHRwX2ZyZWUgKi8KIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgb2JqZWN0IHR5cGUgV2luZG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjY1NSw1NTMgKzI2NTUsNTUzIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldE5ld0NXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7Ci0Jc2hvcnQgd2luZG93SUQ7Ci0JV2luZG93UHRyIGJlaGluZDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBzaG9ydCB3aW5kb3dJRDsKKyAgICBXaW5kb3dQdHIgYmVoaW5kOwogI2lmbmRlZiBHZXROZXdDV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV3Q1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0TmV3Q1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2luZG93SUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0TmV3Q1dpbmRvdyh3aW5kb3dJRCwKLQkgICAgICAgICAgICAgICAgICAgICh2b2lkICopMCwKLQkgICAgICAgICAgICAgICAgICAgIGJlaGluZCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBHZXROZXdDV2luZG93KHdpbmRvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikwLAorICAgICAgICAgICAgICAgICAgICAgICAgYmVoaW5kKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX05ld1dpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlSZWN0IGJvdW5kc1JlY3Q7Ci0JU3RyMjU1IHRpdGxlOwotCUJvb2xlYW4gdmlzaWJsZTsKLQlzaG9ydCB0aGVQcm9jOwotCVdpbmRvd1B0ciBiZWhpbmQ7Ci0JQm9vbGVhbiBnb0F3YXlGbGFnOwotCWxvbmcgcmVmQ29uOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OworICAgIFJlY3QgYm91bmRzUmVjdDsKKyAgICBTdHIyNTUgdGl0bGU7CisgICAgQm9vbGVhbiB2aXNpYmxlOworICAgIHNob3J0IHRoZVByb2M7CisgICAgV2luZG93UHRyIGJlaGluZDsKKyAgICBCb29sZWFuIGdvQXdheUZsYWc7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIE5ld1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKE5ld1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTmV3V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZ0aGVQcm9jLAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCwKLQkgICAgICAgICAgICAgICAgICAgICAgJmdvQXdheUZsYWcsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZWZDb24pKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBOZXdXaW5kb3coKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgdGl0bGUsCi0JICAgICAgICAgICAgICAgIHZpc2libGUsCi0JICAgICAgICAgICAgICAgIHRoZVByb2MsCi0JICAgICAgICAgICAgICAgIGJlaGluZCwKLQkgICAgICAgICAgICAgICAgZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoZVByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IE5ld1dpbmRvdygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgdGhlUHJvYywKKyAgICAgICAgICAgICAgICAgICAgYmVoaW5kLAorICAgICAgICAgICAgICAgICAgICBnb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fR2V0TmV3V2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCXNob3J0IHdpbmRvd0lEOwotCVdpbmRvd1B0ciBiZWhpbmQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgc2hvcnQgd2luZG93SUQ7CisgICAgV2luZG93UHRyIGJlaGluZDsKICNpZm5kZWYgR2V0TmV3V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soR2V0TmV3V2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXROZXdXaW5kb3cpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0lELAotCSAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfQ29udmVydCwgJmJlaGluZCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldE5ld1dpbmRvdyh3aW5kb3dJRCwKLQkgICAgICAgICAgICAgICAgICAgKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAgICBiZWhpbmQpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luZG93SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0TmV3V2luZG93KHdpbmRvd0lELAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAgIGJlaGluZCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9OZXdDV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCVJlY3QgYm91bmRzUmVjdDsKLQlTdHIyNTUgdGl0bGU7Ci0JQm9vbGVhbiB2aXNpYmxlOwotCXNob3J0IHByb2NJRDsKLQlXaW5kb3dQdHIgYmVoaW5kOwotCUJvb2xlYW4gZ29Bd2F5RmxhZzsKLQlsb25nIHJlZkNvbjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBSZWN0IGJvdW5kc1JlY3Q7CisgICAgU3RyMjU1IHRpdGxlOworICAgIEJvb2xlYW4gdmlzaWJsZTsKKyAgICBzaG9ydCBwcm9jSUQ7CisgICAgV2luZG93UHRyIGJlaGluZDsKKyAgICBCb29sZWFuIGdvQXdheUZsYWc7CisgICAgbG9uZyByZWZDb247CiAjaWZuZGVmIE5ld0NXaW5kb3cKLQlQeU1hY19QUkVDSEVDSyhOZXdDV2luZG93KTsKKyAgICBQeU1hY19QUkVDSEVDSyhOZXdDV2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZiaE8mYmwiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmYm91bmRzUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0U3RyMjU1LCB0aXRsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgJnZpc2libGUsCi0JICAgICAgICAgICAgICAgICAgICAgICZwcm9jSUQsCi0JICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9Db252ZXJ0LCAmYmVoaW5kLAotCSAgICAgICAgICAgICAgICAgICAgICAmZ29Bd2F5RmxhZywKLQkgICAgICAgICAgICAgICAgICAgICAgJnJlZkNvbikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IE5ld0NXaW5kb3coKHZvaWQgKikwLAotCSAgICAgICAgICAgICAgICAgJmJvdW5kc1JlY3QsCi0JICAgICAgICAgICAgICAgICB0aXRsZSwKLQkgICAgICAgICAgICAgICAgIHZpc2libGUsCi0JICAgICAgICAgICAgICAgICBwcm9jSUQsCi0JICAgICAgICAgICAgICAgICBiZWhpbmQsCi0JICAgICAgICAgICAgICAgICBnb0F3YXlGbGFnLAotCSAgICAgICAgICAgICAgICAgcmVmQ29uKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJmJoTyZibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZib3VuZHNSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRTdHIyNTUsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX0NvbnZlcnQsICZiZWhpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZnb0F3YXlGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmQ29uKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gTmV3Q1dpbmRvdygodm9pZCAqKTAsCisgICAgICAgICAgICAgICAgICAgICAmYm91bmRzUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIHByb2NJRCwKKyAgICAgICAgICAgICAgICAgICAgIGJlaGluZCwKKyAgICAgICAgICAgICAgICAgICAgIGdvQXdheUZsYWcsCisgICAgICAgICAgICAgICAgICAgICByZWZDb24pOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fQ3JlYXRlTmV3V2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCVdpbmRvd0NsYXNzIHdpbmRvd0NsYXNzOwotCVdpbmRvd0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKLQlSZWN0IGNvbnRlbnRCb3VuZHM7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBXaW5kb3dDbGFzcyB3aW5kb3dDbGFzczsKKyAgICBXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXM7CisgICAgUmVjdCBjb250ZW50Qm91bmRzOworICAgIFdpbmRvd1B0ciBvdXRXaW5kb3c7CiAjaWZuZGVmIENyZWF0ZU5ld1dpbmRvdwotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZU5ld1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlTmV3V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxsTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICAmd2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmY29udGVudEJvdW5kcykpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVOZXdXaW5kb3cod2luZG93Q2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRlbnRCb3VuZHMsCi0JICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsbE8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UmVjdCwgJmNvbnRlbnRCb3VuZHMpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gQ3JlYXRlTmV3V2luZG93KHdpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50Qm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdyk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9OZXcsIG91dFdpbmRvdyk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0NyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlTSW50MTYgcmVzSUQ7Ci0JV2luZG93UHRyIG91dFdpbmRvdzsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBTSW50MTYgcmVzSUQ7CisgICAgV2luZG93UHRyIG91dFdpbmRvdzsKICNpZm5kZWYgQ3JlYXRlV2luZG93RnJvbVJlc291cmNlCi0JUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlV2luZG93RnJvbVJlc291cmNlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaCIsCi0JICAgICAgICAgICAgICAgICAgICAgICZyZXNJRCkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UocmVzSUQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93KTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgb3V0V2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc0lEKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZShyZXNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRXaW5kb3cpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBvdXRXaW5kb3cpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9TaG93RmxvYXRpbmdXaW5kb3dzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBTaG93RmxvYXRpbmdXaW5kb3dzCi0JUHlNYWNfUFJFQ0hFQ0soU2hvd0Zsb2F0aW5nV2luZG93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soU2hvd0Zsb2F0aW5nV2luZG93cyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IFNob3dGbG9hdGluZ1dpbmRvd3MoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IFNob3dGbG9hdGluZ1dpbmRvd3MoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fSGlkZUZsb2F0aW5nV2luZG93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKICNpZm5kZWYgSGlkZUZsb2F0aW5nV2luZG93cwotCVB5TWFjX1BSRUNIRUNLKEhpZGVGbG9hdGluZ1dpbmRvd3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEhpZGVGbG9hdGluZ1dpbmRvd3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBIaWRlRmxvYXRpbmdXaW5kb3dzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBIaWRlRmxvYXRpbmdXaW5kb3dzKCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0FyZUZsb2F0aW5nV2luZG93c1Zpc2libGUoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCUJvb2xlYW4gX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBCb29sZWFuIF9ydjsKICNpZm5kZWYgQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZQotCVB5TWFjX1BSRUNIRUNLKEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUpOworICAgIFB5TWFjX1BSRUNIRUNLKEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUoKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSgpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9DaGVja1VwZGF0ZShQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JQm9vbGVhbiBfcnY7Ci0JRXZlbnRSZWNvcmQgdGhlRXZlbnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIEJvb2xlYW4gX3J2OworICAgIEV2ZW50UmVjb3JkIHRoZUV2ZW50OwogI2lmbmRlZiBDaGVja1VwZGF0ZQotCVB5TWFjX1BSRUNIRUNLKENoZWNrVXBkYXRlKTsKKyAgICBQeU1hY19QUkVDSEVDSyhDaGVja1VwZGF0ZSk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gQ2hlY2tVcGRhdGUoJnRoZUV2ZW50KTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBfcnYsCi0JICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gQ2hlY2tVcGRhdGUoJnRoZUV2ZW50KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiYk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfcnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgJnRoZUV2ZW50KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fTWFjRmluZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UGFydENvZGUgX3J2OwotCVBvaW50IHRoZVBvaW50OwotCVdpbmRvd1B0ciB3aW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1BhcnRDb2RlIF9ydjsKKyAgICBQb2ludCB0aGVQb2ludDsKKyAgICBXaW5kb3dQdHIgd2luZG93OwogI2lmbmRlZiBNYWNGaW5kV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soTWFjRmluZFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soTWFjRmluZFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBNYWNGaW5kV2luZG93KHRoZVBvaW50LAotCSAgICAgICAgICAgICAgICAgICAgJndpbmRvdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgd2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBNYWNGaW5kV2luZG93KHRoZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgd2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRnJvbnRXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCVdpbmRvd1B0ciBfcnY7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CiAjaWZuZGVmIEZyb250V2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRnJvbnRXaW5kb3cpOworICAgIFB5TWFjX1BSRUNIRUNLKEZyb250V2luZG93KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGcm9udFdpbmRvdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGcm9udFdpbmRvdygpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9Gcm9udE5vbkZsb2F0aW5nV2luZG93KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBXaW5kb3dQdHIgX3J2OwogI2lmbmRlZiBGcm9udE5vbkZsb2F0aW5nV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRnJvbnROb25GbG9hdGluZ1dpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRnJvbnROb25GbG9hdGluZ1dpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gRnJvbnROb25GbG9hdGluZ1dpbmRvdygpOwotCV9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGcm9udE5vbkZsb2F0aW5nV2luZG93KCk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldEZyb250V2luZG93T2ZDbGFzcyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JV2luZG93UHRyIF9ydjsKLQlXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOwotCUJvb2xlYW4gbXVzdEJlVmlzaWJsZTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgV2luZG93UHRyIF9ydjsKKyAgICBXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzOworICAgIEJvb2xlYW4gbXVzdEJlVmlzaWJsZTsKICNpZm5kZWYgR2V0RnJvbnRXaW5kb3dPZkNsYXNzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0RnJvbnRXaW5kb3dPZkNsYXNzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhHZXRGcm9udFdpbmRvd09mQ2xhc3MpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAibGIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgJm11c3RCZVZpc2libGUpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBHZXRGcm9udFdpbmRvd09mQ2xhc3MoaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdEJlVmlzaWJsZSk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZtdXN0QmVWaXNpYmxlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gR2V0RnJvbnRXaW5kb3dPZkNsYXNzKGluV2luZG93Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3RCZVZpc2libGUpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRmluZFdpbmRvd09mQ2xhc3MoUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOwotCU9TU3RhdHVzIF9lcnI7Ci0JUG9pbnQgd2hlcmU7Ci0JV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKLQlXaW5kb3dQdHIgb3V0V2luZG93OwotCVdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIE9TU3RhdHVzIF9lcnI7CisgICAgUG9pbnQgd2hlcmU7CisgICAgV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzczsKKyAgICBXaW5kb3dQdHIgb3V0V2luZG93OworICAgIFdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQ7CiAjaWZuZGVmIEZpbmRXaW5kb3dPZkNsYXNzCi0JUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvd09mQ2xhc3MpOworICAgIFB5TWFjX1BSRUNIRUNLKEZpbmRXaW5kb3dPZkNsYXNzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mbCIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmd2hlcmUsCi0JICAgICAgICAgICAgICAgICAgICAgICZpbldpbmRvd0NsYXNzKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEZpbmRXaW5kb3dPZkNsYXNzKCZ3aGVyZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgaW5XaW5kb3dDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvdywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFdpbmRvd1BhcnQpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsCi0JICAgICAgICAgICAgICAgICAgICAgV2luT2JqX1doaWNoV2luZG93LCBvdXRXaW5kb3csCi0JICAgICAgICAgICAgICAgICAgICAgb3V0V2luZG93UGFydCk7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ3aGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluV2luZG93Q2xhc3MpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gRmluZFdpbmRvd09mQ2xhc3MoJndoZXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbldpbmRvd0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0V2luZG93UGFydCk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyZoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfV2hpY2hXaW5kb3csIG91dFdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRXaW5kb3dQYXJ0KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCU9wdGlvbkJpdHMgaW5PcHRpb25zOwotCU1lbnVIYW5kbGUgb3V0TWVudTsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBPcHRpb25CaXRzIGluT3B0aW9uczsKKyAgICBNZW51SGFuZGxlIG91dE1lbnU7CiAjaWZuZGVmIENyZWF0ZVN0YW5kYXJkV2luZG93TWVudQotCVB5TWFjX1BSRUNIRUNLKENyZWF0ZVN0YW5kYXJkV2luZG93TWVudSk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImwiLAotCSAgICAgICAgICAgICAgICAgICAgICAmaW5PcHRpb25zKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IENyZWF0ZVN0YW5kYXJkV2luZG93TWVudShpbk9wdGlvbnMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0TWVudSk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIE1lbnVPYmpfTmV3LCBvdXRNZW51KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmluT3B0aW9ucykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBDcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUoaW5PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dE1lbnUpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW51T2JqX05ldywgb3V0TWVudSk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0NvbGxhcHNlQWxsV2luZG93cyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JT1NTdGF0dXMgX2VycjsKLQlCb29sZWFuIGNvbGxhcHNlOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOworICAgIEJvb2xlYW4gY29sbGFwc2U7CiAjaWZuZGVmIENvbGxhcHNlQWxsV2luZG93cwotCVB5TWFjX1BSRUNIRUNLKENvbGxhcHNlQWxsV2luZG93cyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soQ29sbGFwc2VBbGxXaW5kb3dzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImIiLAotCSAgICAgICAgICAgICAgICAgICAgICAmY29sbGFwc2UpKQotCQlyZXR1cm4gTlVMTDsKLQlfZXJyID0gQ29sbGFwc2VBbGxXaW5kb3dzKGNvbGxhcHNlKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbGxhcHNlKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IENvbGxhcHNlQWxsV2luZG93cyhjb2xsYXBzZSk7CisgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgX3JlcyA9IFB5X05vbmU7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOwotCUdESGFuZGxlIGluRGV2aWNlOwotCVJlY3Qgb3V0QXZhaWxhYmxlUmVjdDsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgT1NTdGF0dXMgX2VycjsKKyAgICBHREhhbmRsZSBpbkRldmljZTsKKyAgICBSZWN0IG91dEF2YWlsYWJsZVJlY3Q7CiAjaWZuZGVmIEdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzCi0JUHlNYWNfUFJFQ0hFQ0soR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMpOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzKTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpbkRldmljZSkpCi0JCXJldHVybiBOVUxMOwotCV9lcnIgPSBHZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcyhpbkRldmljZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEF2YWlsYWJsZVJlY3QpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsICZvdXRBdmFpbGFibGVSZWN0KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9Db252ZXJ0LCAmaW5EZXZpY2UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfZXJyID0gR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMoaW5EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRBdmFpbGFibGVSZWN0KTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRSZWN0LCAmb3V0QXZhaWxhYmxlUmVjdCk7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0Rpc2FibGVTY3JlZW5VcGRhdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBEaXNhYmxlU2NyZWVuVXBkYXRlcwotCVB5TWFjX1BSRUNIRUNLKERpc2FibGVTY3JlZW5VcGRhdGVzKTsKKyAgICBQeU1hY19QUkVDSEVDSyhEaXNhYmxlU2NyZWVuVXBkYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IERpc2FibGVTY3JlZW5VcGRhdGVzKCk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9lcnIgPSBEaXNhYmxlU2NyZWVuVXBkYXRlcygpOworICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIF9yZXMgPSBQeV9Ob25lOworICAgIHJldHVybiBfcmVzOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKldpbl9FbmFibGVTY3JlZW5VcGRhdGVzKFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlPU1N0YXR1cyBfZXJyOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBPU1N0YXR1cyBfZXJyOwogI2lmbmRlZiBFbmFibGVTY3JlZW5VcGRhdGVzCi0JUHlNYWNfUFJFQ0hFQ0soRW5hYmxlU2NyZWVuVXBkYXRlcyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRW5hYmxlU2NyZWVuVXBkYXRlcyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JX2VyciA9IEVuYWJsZVNjcmVlblVwZGF0ZXMoKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX2VyciA9IEVuYWJsZVNjcmVlblVwZGF0ZXMoKTsKKyAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICBfcmVzID0gUHlfTm9uZTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fUGluUmVjdChQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JbG9uZyBfcnY7Ci0JUmVjdCB0aGVSZWN0OwotCVBvaW50IHRoZVB0OworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKKyAgICBsb25nIF9ydjsKKyAgICBSZWN0IHRoZVJlY3Q7CisgICAgUG9pbnQgdGhlUHQ7CiAjaWZuZGVmIFBpblJlY3QKLQlQeU1hY19QUkVDSEVDSyhQaW5SZWN0KTsKKyAgICBQeU1hY19QUkVDSEVDSyhQaW5SZWN0KTsKICNlbmRpZgotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRSZWN0LCAmdGhlUmVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0UG9pbnQsICZ0aGVQdCkpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IFBpblJlY3QoJnRoZVJlY3QsCi0JICAgICAgICAgICAgICB0aGVQdCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImwiLAotCSAgICAgICAgICAgICAgICAgICAgIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFJlY3QsICZ0aGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnRoZVB0KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3J2ID0gUGluUmVjdCgmdGhlUmVjdCwKKyAgICAgICAgICAgICAgICAgIHRoZVB0KTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgibCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fR2V0R3JheVJnbihQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0JUmduSGFuZGxlIF9ydjsKKyAgICBQeU9iamVjdCAqX3JlcyA9IE5VTEw7CisgICAgUmduSGFuZGxlIF9ydjsKICNpZm5kZWYgR2V0R3JheVJnbgotCVB5TWFjX1BSRUNIRUNLKEdldEdyYXlSZ24pOworICAgIFB5TWFjX1BSRUNIRUNLKEdldEdyYXlSZ24pOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JCXJldHVybiBOVUxMOwotCV9ydiA9IEdldEdyYXlSZ24oKTsKLQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7Ci0JcmV0dXJuIF9yZXM7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldEdyYXlSZ24oKTsKKyAgICBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIF9ydik7CisgICAgcmV0dXJuIF9yZXM7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqV2luX0dldFdpbmRvd0Zyb21Qb3J0KFB5T2JqZWN0ICpfc2VsZiwgUHlPYmplY3QgKl9hcmdzKQogewotCVB5T2JqZWN0ICpfcmVzID0gTlVMTDsKLQlXaW5kb3dQdHIgX3J2OwotCUNHcmFmUHRyIHBvcnQ7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFdpbmRvd1B0ciBfcnY7CisgICAgQ0dyYWZQdHIgcG9ydDsKICNpZm5kZWYgR2V0V2luZG93RnJvbVBvcnQKLQlQeU1hY19QUkVDSEVDSyhHZXRXaW5kb3dGcm9tUG9ydCk7CisgICAgUHlNYWNfUFJFQ0hFQ0soR2V0V2luZG93RnJvbVBvcnQpOwogI2VuZGlmCi0JaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLAotCSAgICAgICAgICAgICAgICAgICAgICBHcmFmT2JqX0NvbnZlcnQsICZwb3J0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JX3J2ID0gR2V0V2luZG93RnJvbVBvcnQocG9ydCk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwKLQkgICAgICAgICAgICAgICAgICAgICBXaW5PYmpfTmV3LCBfcnYpOwotCXJldHVybiBfcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhZk9ial9Db252ZXJ0LCAmcG9ydCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9ydiA9IEdldFdpbmRvd0Zyb21Qb3J0KHBvcnQpOworICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2luT2JqX05ldywgX3J2KTsKKyAgICByZXR1cm4gX3JlczsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fV2hpY2hXaW5kb3coUHlPYmplY3QgKl9zZWxmLCBQeU9iamVjdCAqX2FyZ3MpCiB7Ci0JUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpfcmVzID0gTlVMTDsKIAotCWxvbmcgcHRyOworICAgIGxvbmcgcHRyOwogCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImkiLCAmcHRyKSApCi0JICAgICAgICByZXR1cm4gTlVMTDsKLQlfcmVzID0gV2luT2JqX1doaWNoV2luZG93KChXaW5kb3dQdHIpcHRyKTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaSIsICZwdHIpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgX3JlcyA9IFdpbk9ial9XaGljaFdpbmRvdygoV2luZG93UHRyKXB0cik7CisgICAgcmV0dXJuIF9yZXM7CiAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICpXaW5fRmluZFdpbmRvdyhQeU9iamVjdCAqX3NlbGYsIFB5T2JqZWN0ICpfYXJncykKIHsKLQlQeU9iamVjdCAqX3JlcyA9IE5VTEw7Ci0Jc2hvcnQgX3J2OwotCVBvaW50IHRoZVBvaW50OwotCVdpbmRvd1B0ciB0aGVXaW5kb3c7CisgICAgUHlPYmplY3QgKl9yZXMgPSBOVUxMOworICAgIHNob3J0IF9ydjsKKyAgICBQb2ludCB0aGVQb2ludDsKKyAgICBXaW5kb3dQdHIgdGhlV2luZG93OwogI2lmbmRlZiBGaW5kV2luZG93Ci0JUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvdyk7CisgICAgUHlNYWNfUFJFQ0hFQ0soRmluZFdpbmRvdyk7CiAjZW5kaWYKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQotCQlyZXR1cm4gTlVMTDsKLQlfcnYgPSBGaW5kV2luZG93KHRoZVBvaW50LAotCSAgICAgICAgICAgICAgICAgJnRoZVdpbmRvdyk7Ci0JX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgX3J2LAotCSAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKLQlyZXR1cm4gX3JlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmdGhlUG9pbnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfcnYgPSBGaW5kV2luZG93KHRoZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgJnRoZVdpbmRvdyk7CisgICAgX3JlcyA9IFB5X0J1aWxkVmFsdWUoImhPJiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgX3J2LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKKyAgICByZXR1cm4gX3JlczsKIH0KICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogCiBzdGF0aWMgUHlNZXRob2REZWYgV2luX21ldGhvZHNbXSA9IHsKICNpZm5kZWYgX19MUDY0X18KLQl7IkdldE5ld0NXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0dldE5ld0NXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpbmRvd0lELCBXaW5kb3dQdHIgYmVoaW5kKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJOZXdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX05ld1dpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUmVjdCBib3VuZHNSZWN0LCBTdHIyNTUgdGl0bGUsIEJvb2xlYW4gdmlzaWJsZSwgc2hvcnQgdGhlUHJvYywgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBsb25nIHJlZkNvbikgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAotCXsiR2V0TmV3V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXROZXdXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKHNob3J0IHdpbmRvd0lELCBXaW5kb3dQdHIgYmVoaW5kKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJOZXdDV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9OZXdDV2luZG93LCAxLAotCSBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBzaG9ydCBwcm9jSUQsIFdpbmRvd1B0ciBiZWhpbmQsIEJvb2xlYW4gZ29Bd2F5RmxhZywgbG9uZyByZWZDb24pIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkNyZWF0ZU5ld1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlTmV3V2luZG93LCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyB3aW5kb3dDbGFzcywgV2luZG93QXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBSZWN0IGNvbnRlbnRCb3VuZHMpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKLQl7IkNyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZSIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlV2luZG93RnJvbVJlc291cmNlLCAxLAotCSBQeURvY19TVFIoIihTSW50MTYgcmVzSUQpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93KSIpfSwKLQl7IlNob3dGbG9hdGluZ1dpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX1Nob3dGbG9hdGluZ1dpbmRvd3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkhpZGVGbG9hdGluZ1dpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX0hpZGVGbG9hdGluZ1dpbmRvd3MsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKLQl7IkFyZUZsb2F0aW5nV2luZG93c1Zpc2libGUiLCAoUHlDRnVuY3Rpb24pV2luX0FyZUZsb2F0aW5nV2luZG93c1Zpc2libGUsIDEsCi0JIFB5RG9jX1NUUigiKCkgLT4gKEJvb2xlYW4gX3J2KSIpfSwKLQl7IkNoZWNrVXBkYXRlIiwgKFB5Q0Z1bmN0aW9uKVdpbl9DaGVja1VwZGF0ZSwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYsIEV2ZW50UmVjb3JkIHRoZUV2ZW50KSIpfSwKLQl7Ik1hY0ZpbmRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX01hY0ZpbmRXaW5kb3csIDEsCi0JIFB5RG9jX1NUUigiKFBvaW50IHRoZVBvaW50KSAtPiAoV2luZG93UGFydENvZGUgX3J2LCBXaW5kb3dQdHIgd2luZG93KSIpfSwKLQl7IkZyb250V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9Gcm9udFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCi0JeyJGcm9udE5vbkZsb2F0aW5nV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9Gcm9udE5vbkZsb2F0aW5nV2luZG93LCAxLAotCSBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkdldEZyb250V2luZG93T2ZDbGFzcyIsIChQeUNGdW5jdGlvbilXaW5fR2V0RnJvbnRXaW5kb3dPZkNsYXNzLCAxLAotCSBQeURvY19TVFIoIihXaW5kb3dDbGFzcyBpbldpbmRvd0NsYXNzLCBCb29sZWFuIG11c3RCZVZpc2libGUpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IkZpbmRXaW5kb3dPZkNsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9GaW5kV2luZG93T2ZDbGFzcywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgd2hlcmUsIFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MpIC0+IChXaW5kb3dQdHIgb3V0V2luZG93LCBXaW5kb3dQYXJ0Q29kZSBvdXRXaW5kb3dQYXJ0KSIpfSwKLQl7IkNyZWF0ZVN0YW5kYXJkV2luZG93TWVudSIsIChQeUNGdW5jdGlvbilXaW5fQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51LCAxLAotCSBQeURvY19TVFIoIihPcHRpb25CaXRzIGluT3B0aW9ucykgLT4gKE1lbnVIYW5kbGUgb3V0TWVudSkiKX0sCi0JeyJDb2xsYXBzZUFsbFdpbmRvd3MiLCAoUHlDRnVuY3Rpb24pV2luX0NvbGxhcHNlQWxsV2luZG93cywgMSwKLQkgUHlEb2NfU1RSKCIoQm9vbGVhbiBjb2xsYXBzZSkgLT4gTm9uZSIpfSwKLQl7IkdldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRBdmFpbGFibGVXaW5kb3dQb3NpdGlvbmluZ0JvdW5kcywgMSwKLQkgUHlEb2NfU1RSKCIoR0RIYW5kbGUgaW5EZXZpY2UpIC0+IChSZWN0IG91dEF2YWlsYWJsZVJlY3QpIil9LAotCXsiRGlzYWJsZVNjcmVlblVwZGF0ZXMiLCAoUHlDRnVuY3Rpb24pV2luX0Rpc2FibGVTY3JlZW5VcGRhdGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJFbmFibGVTY3JlZW5VcGRhdGVzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9FbmFibGVTY3JlZW5VcGRhdGVzLCAxLAotCSBQeURvY19TVFIoIigpIC0+IE5vbmUiKX0sCi0JeyJQaW5SZWN0IiwgKFB5Q0Z1bmN0aW9uKVdpbl9QaW5SZWN0LCAxLAotCSBQeURvY19TVFIoIihSZWN0IHRoZVJlY3QsIFBvaW50IHRoZVB0KSAtPiAobG9uZyBfcnYpIil9LAotCXsiR2V0R3JheVJnbiIsIChQeUNGdW5jdGlvbilXaW5fR2V0R3JheVJnbiwgMSwKLQkgUHlEb2NfU1RSKCIoKSAtPiAoUmduSGFuZGxlIF9ydikiKX0sCi0JeyJHZXRXaW5kb3dGcm9tUG9ydCIsIChQeUNGdW5jdGlvbilXaW5fR2V0V2luZG93RnJvbVBvcnQsIDEsCi0JIFB5RG9jX1NUUigiKENHcmFmUHRyIHBvcnQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKLQl7IldoaWNoV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9XaGljaFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCJSZXNvbHZlIGFuIGludGVnZXIgV2luZG93UHRyIGFkZHJlc3MgdG8gYSBXaW5kb3cgb2JqZWN0Iil9LAotCXsiRmluZFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fRmluZFdpbmRvdywgMSwKLQkgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUG9pbnQpIC0+IChzaG9ydCBfcnYsIFdpbmRvd1B0ciB0aGVXaW5kb3cpIil9LAotCXtOVUxMLCBOVUxMLCAwfQorICAgIHsiR2V0TmV3Q1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fR2V0TmV3Q1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2luZG93SUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld1dpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fTmV3V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihSZWN0IGJvdW5kc1JlY3QsIFN0cjI1NSB0aXRsZSwgQm9vbGVhbiB2aXNpYmxlLCBzaG9ydCB0aGVQcm9jLCBXaW5kb3dQdHIgYmVoaW5kLCBCb29sZWFuIGdvQXdheUZsYWcsIGxvbmcgcmVmQ29uKSAtPiAoV2luZG93UHRyIF9ydikiKX0sCisgICAgeyJHZXROZXdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0dldE5ld1dpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoc2hvcnQgd2luZG93SUQsIFdpbmRvd1B0ciBiZWhpbmQpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7Ik5ld0NXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX05ld0NXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgYm91bmRzUmVjdCwgU3RyMjU1IHRpdGxlLCBCb29sZWFuIHZpc2libGUsIHNob3J0IHByb2NJRCwgV2luZG93UHRyIGJlaGluZCwgQm9vbGVhbiBnb0F3YXlGbGFnLCBsb25nIHJlZkNvbikgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiQ3JlYXRlTmV3V2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVOZXdXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIHdpbmRvd0NsYXNzLCBXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFJlY3QgY29udGVudEJvdW5kcykgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3cpIil9LAorICAgIHsiQ3JlYXRlV2luZG93RnJvbVJlc291cmNlIiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UsIDEsCisgICAgIFB5RG9jX1NUUigiKFNJbnQxNiByZXNJRCkgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3cpIil9LAorICAgIHsiU2hvd0Zsb2F0aW5nV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fU2hvd0Zsb2F0aW5nV2luZG93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiSGlkZUZsb2F0aW5nV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fSGlkZUZsb2F0aW5nV2luZG93cywgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiBOb25lIil9LAorICAgIHsiQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSIsIChQeUNGdW5jdGlvbilXaW5fQXJlRmxvYXRpbmdXaW5kb3dzVmlzaWJsZSwgMSwKKyAgICAgUHlEb2NfU1RSKCIoKSAtPiAoQm9vbGVhbiBfcnYpIil9LAorICAgIHsiQ2hlY2tVcGRhdGUiLCAoUHlDRnVuY3Rpb24pV2luX0NoZWNrVXBkYXRlLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChCb29sZWFuIF9ydiwgRXZlbnRSZWNvcmQgdGhlRXZlbnQpIil9LAorICAgIHsiTWFjRmluZFdpbmRvdyIsIChQeUNGdW5jdGlvbilXaW5fTWFjRmluZFdpbmRvdywgMSwKKyAgICAgUHlEb2NfU1RSKCIoUG9pbnQgdGhlUG9pbnQpIC0+IChXaW5kb3dQYXJ0Q29kZSBfcnYsIFdpbmRvd1B0ciB3aW5kb3cpIil9LAorICAgIHsiRnJvbnRXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0Zyb250V2luZG93LCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChXaW5kb3dQdHIgX3J2KSIpfSwKKyAgICB7IkZyb250Tm9uRmxvYXRpbmdXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX0Zyb250Tm9uRmxvYXRpbmdXaW5kb3csIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiR2V0RnJvbnRXaW5kb3dPZkNsYXNzIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRGcm9udFdpbmRvd09mQ2xhc3MsIDEsCisgICAgIFB5RG9jX1NUUigiKFdpbmRvd0NsYXNzIGluV2luZG93Q2xhc3MsIEJvb2xlYW4gbXVzdEJlVmlzaWJsZSkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiRmluZFdpbmRvd09mQ2xhc3MiLCAoUHlDRnVuY3Rpb24pV2luX0ZpbmRXaW5kb3dPZkNsYXNzLCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB3aGVyZSwgV2luZG93Q2xhc3MgaW5XaW5kb3dDbGFzcykgLT4gKFdpbmRvd1B0ciBvdXRXaW5kb3csIFdpbmRvd1BhcnRDb2RlIG91dFdpbmRvd1BhcnQpIil9LAorICAgIHsiQ3JlYXRlU3RhbmRhcmRXaW5kb3dNZW51IiwgKFB5Q0Z1bmN0aW9uKVdpbl9DcmVhdGVTdGFuZGFyZFdpbmRvd01lbnUsIDEsCisgICAgIFB5RG9jX1NUUigiKE9wdGlvbkJpdHMgaW5PcHRpb25zKSAtPiAoTWVudUhhbmRsZSBvdXRNZW51KSIpfSwKKyAgICB7IkNvbGxhcHNlQWxsV2luZG93cyIsIChQeUNGdW5jdGlvbilXaW5fQ29sbGFwc2VBbGxXaW5kb3dzLCAxLAorICAgICBQeURvY19TVFIoIihCb29sZWFuIGNvbGxhcHNlKSAtPiBOb25lIil9LAorICAgIHsiR2V0QXZhaWxhYmxlV2luZG93UG9zaXRpb25pbmdCb3VuZHMiLCAoUHlDRnVuY3Rpb24pV2luX0dldEF2YWlsYWJsZVdpbmRvd1Bvc2l0aW9uaW5nQm91bmRzLCAxLAorICAgICBQeURvY19TVFIoIihHREhhbmRsZSBpbkRldmljZSkgLT4gKFJlY3Qgb3V0QXZhaWxhYmxlUmVjdCkiKX0sCisgICAgeyJEaXNhYmxlU2NyZWVuVXBkYXRlcyIsIChQeUNGdW5jdGlvbilXaW5fRGlzYWJsZVNjcmVlblVwZGF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IkVuYWJsZVNjcmVlblVwZGF0ZXMiLCAoUHlDRnVuY3Rpb24pV2luX0VuYWJsZVNjcmVlblVwZGF0ZXMsIDEsCisgICAgIFB5RG9jX1NUUigiKCkgLT4gTm9uZSIpfSwKKyAgICB7IlBpblJlY3QiLCAoUHlDRnVuY3Rpb24pV2luX1BpblJlY3QsIDEsCisgICAgIFB5RG9jX1NUUigiKFJlY3QgdGhlUmVjdCwgUG9pbnQgdGhlUHQpIC0+IChsb25nIF9ydikiKX0sCisgICAgeyJHZXRHcmF5UmduIiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRHcmF5UmduLCAxLAorICAgICBQeURvY19TVFIoIigpIC0+IChSZ25IYW5kbGUgX3J2KSIpfSwKKyAgICB7IkdldFdpbmRvd0Zyb21Qb3J0IiwgKFB5Q0Z1bmN0aW9uKVdpbl9HZXRXaW5kb3dGcm9tUG9ydCwgMSwKKyAgICAgUHlEb2NfU1RSKCIoQ0dyYWZQdHIgcG9ydCkgLT4gKFdpbmRvd1B0ciBfcnYpIil9LAorICAgIHsiV2hpY2hXaW5kb3ciLCAoUHlDRnVuY3Rpb24pV2luX1doaWNoV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIlJlc29sdmUgYW4gaW50ZWdlciBXaW5kb3dQdHIgYWRkcmVzcyB0byBhIFdpbmRvdyBvYmplY3QiKX0sCisgICAgeyJGaW5kV2luZG93IiwgKFB5Q0Z1bmN0aW9uKVdpbl9GaW5kV2luZG93LCAxLAorICAgICBQeURvY19TVFIoIihQb2ludCB0aGVQb2ludCkgLT4gKHNob3J0IF9ydiwgV2luZG93UHRyIHRoZVdpbmRvdykiKX0sCisgICAge05VTEwsIE5VTEwsIDB9CiAjZW5kaWYgLyogX19MUDY0X18gKi8KIH07CiAKQEAgLTMyMTMsNTEgKzMyMTMsNTEgQEAKIFB5T2JqZWN0ICoKIFdpbk9ial9XaGljaFdpbmRvdyhXaW5kb3dQdHIgdykKIHsKLSAgICAgICAgUHlPYmplY3QgKml0OworICAgIFB5T2JqZWN0ICppdDsKIAotICAgICAgICBpZiAodyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaXQgPSBQeV9Ob25lOwotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0V1JlZkNvbih3KTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgIUlzUG9pbnRlclZhbGlkKChQdHIpaXQpIHx8ICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gdyB8fCAhV2luT2JqX0NoZWNrKGl0KSkgeworICAgICAgICAgICAgaXQgPSBXaW5PYmpfTmV3KHcpOworICAgICAgICAgICAgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2ZyZWVpdCA9IE5VTEw7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXQgPSAoUHlPYmplY3QgKikgR2V0V1JlZkNvbih3KTsKLSAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAhSXNQb2ludGVyVmFsaWQoKFB0cilpdCkgfHwgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSB3IHx8ICFXaW5PYmpfQ2hlY2soaXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdCA9IFdpbk9ial9OZXcodyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdDsKKyAgICB9CisgICAgcmV0dXJuIGl0OwogfQogCiAjZW5kaWYgLyogX19MUDY0X18gKi8KIAogdm9pZCBpbml0X1dpbih2b2lkKQogewotCVB5T2JqZWN0ICptOworICAgIFB5T2JqZWN0ICptOwogI2lmbmRlZiBfX0xQNjRfXwotCVB5T2JqZWN0ICpkOworICAgIFB5T2JqZWN0ICpkOwogCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhXaW5kb3dQdHIsIFdpbk9ial9XaGljaFdpbmRvdyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFdpbmRvd1B0ciwgV2luT2JqX0NvbnZlcnQpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX05ldyk7CisgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoV2luZG93UHRyLCBXaW5PYmpfV2hpY2hXaW5kb3cpOworICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChXaW5kb3dQdHIsIFdpbk9ial9Db252ZXJ0KTsKIAogI2VuZGlmIC8qIF9fTFA2NF9fICovCiAKLQltID0gUHlfSW5pdE1vZHVsZSgiX1dpbiIsIFdpbl9tZXRob2RzKTsKKyAgICBtID0gUHlfSW5pdE1vZHVsZSgiX1dpbiIsIFdpbl9tZXRob2RzKTsKICNpZm5kZWYgX19MUDY0X18KLQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKLQlXaW5fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOwotCWlmIChXaW5fRXJyb3IgPT0gTlVMTCB8fAotCSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBXaW5fRXJyb3IpICE9IDApCi0JCXJldHVybjsKLQlXaW5kb3dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOwotCWlmIChQeVR5cGVfUmVhZHkoJldpbmRvd19UeXBlKSA8IDApIHJldHVybjsKLQlQeV9JTkNSRUYoJldpbmRvd19UeXBlKTsKLQlQeU1vZHVsZV9BZGRPYmplY3QobSwgIldpbmRvdyIsIChQeU9iamVjdCAqKSZXaW5kb3dfVHlwZSk7Ci0JLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCi0JUHlfSU5DUkVGKCZXaW5kb3dfVHlwZSk7Ci0JUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJXaW5kb3dUeXBlIiwgKFB5T2JqZWN0ICopJldpbmRvd19UeXBlKTsKKyAgICBkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgICBXaW5fRXJyb3IgPSBQeU1hY19HZXRPU0VyckV4Y2VwdGlvbigpOworICAgIGlmIChXaW5fRXJyb3IgPT0gTlVMTCB8fAorICAgICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRXJyb3IiLCBXaW5fRXJyb3IpICE9IDApCisgICAgICAgIHJldHVybjsKKyAgICBXaW5kb3dfVHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworICAgIGlmIChQeVR5cGVfUmVhZHkoJldpbmRvd19UeXBlKSA8IDApIHJldHVybjsKKyAgICBQeV9JTkNSRUYoJldpbmRvd19UeXBlKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIldpbmRvdyIsIChQeU9iamVjdCAqKSZXaW5kb3dfVHlwZSk7CisgICAgLyogQmFja3dhcmQtY29tcGF0aWJsZSBuYW1lICovCisgICAgUHlfSU5DUkVGKCZXaW5kb3dfVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJXaW5kb3dUeXBlIiwgKFB5T2JqZWN0ICopJldpbmRvd19UeXBlKTsKICNlbmRpZiAvKiBfX0xQNjRfXyAqLwogfQogCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvcHl0aG9udy5jIGIvTWFjL1Rvb2xzL3B5dGhvbncuYwppbmRleCAxM2RmNzkwLi43ZjQ1Y2E5IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvcHl0aG9udy5jCisrKyBiL01hYy9Ub29scy9weXRob253LmMKQEAgLTM3LDggKzM3LDggQEAKICAqIEluIGEgcmVndWxhciBmcmFtZXdvcmsgdGhlIHN0cnVjdHVyZSBpczoKICAqCiAgKiAgICBQeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zLzIuNwotICogICAgCQkvUHl0aG9uCi0gKgkJL1Jlc291cmNlcy9QeXRob24uYXBwL0NvbnRlbnRzL01hY09TL1B5dGhvbgorICogICAgICAgICAgICAgIC9QeXRob24KKyAqICAgICAgICAgICAgICAvUmVzb3VyY2VzL1B5dGhvbi5hcHAvQ29udGVudHMvTWFjT1MvUHl0aG9uCiAgKgogICogSW4gYSB2aXJ0dWFsZW52IHN0eWxlIHN0cnVjdHVyZSB0aGUgZXhwZWN0ZWQKICAqIHN0cnVjdHVyZSBpczoKQEAgLTQ4LDEyMyArNDgsMTIzIEBACiAgKiAgICAgICAvLlB5dGhvbiAgIDwtIHRoZSBkeWxpYgogICogICAgICAgLy5SZXNvdXJjZXMvUHl0aG9uLmFwcC9Db250ZW50cy9NYWNPUy9QeXRob24KICAqCi0gKiBOT1RFOiB2aXJ0dWFsZW52J3MgYXJlIG5vdCBhbiBvZmZpY2lhbGx5IHN1cHBvcnRlZCAKKyAqIE5PVEU6IHZpcnR1YWxlbnYncyBhcmUgbm90IGFuIG9mZmljaWFsbHkgc3VwcG9ydGVkCiAgKiBmZWF0dXJlLCBzdXBwb3J0IGZvciB0aGF0IHN0cnVjdHVyZSBpcyBwcm92aWRlZCBhcwogICogYSBjb252ZW5pZW5jZS4KICAqLwogc3RhdGljIGNoYXIqIGdldF9weXRob25fcGF0aCh2b2lkKQogewotCXNpemVfdCBsZW47Ci0JRGxfaW5mbyBpbmZvOwotCWNoYXIqIGVuZDsKLQljaGFyKiBnX3BhdGg7CisgICAgc2l6ZV90IGxlbjsKKyAgICBEbF9pbmZvIGluZm87CisgICAgY2hhciogZW5kOworICAgIGNoYXIqIGdfcGF0aDsKIAotCWlmIChkbGFkZHIoUHlfSW5pdGlhbGl6ZSwgJmluZm8pID09IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorICAgIGlmIChkbGFkZHIoUHlfSW5pdGlhbGl6ZSwgJmluZm8pID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0JbGVuID0gc3RybGVuKGluZm8uZGxpX2ZuYW1lKTsKKyAgICBsZW4gPSBzdHJsZW4oaW5mby5kbGlfZm5hbWUpOwogCi0JZ19wYXRoID0gbWFsbG9jKGxlbis2MCk7Ci0JaWYgKGdfcGF0aCA9PSBOVUxMKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICBnX3BhdGggPSBtYWxsb2MobGVuKzYwKTsKKyAgICBpZiAoZ19wYXRoID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0Jc3RyY3B5KGdfcGF0aCwgaW5mby5kbGlfZm5hbWUpOwotCWVuZCA9IGdfcGF0aCArIGxlbiAtIDE7Ci0Jd2hpbGUgKGVuZCAhPSBnX3BhdGggJiYgKmVuZCAhPSAnLycpIHsKLQkJZW5kIC0tOwotCX0KLQllbmQrKzsKLQlpZiAoKmVuZCA9PSAnLicpIHsKLQkJZW5kKys7Ci0JfQotCXN0cmNweShlbmQsICJSZXNvdXJjZXMvUHl0aG9uLmFwcC9Db250ZW50cy9NYWNPUy8iIFBZVEhPTkZSQU1FV09SSyk7CisgICAgc3RyY3B5KGdfcGF0aCwgaW5mby5kbGlfZm5hbWUpOworICAgIGVuZCA9IGdfcGF0aCArIGxlbiAtIDE7CisgICAgd2hpbGUgKGVuZCAhPSBnX3BhdGggJiYgKmVuZCAhPSAnLycpIHsKKyAgICAgICAgZW5kIC0tOworICAgIH0KKyAgICBlbmQrKzsKKyAgICBpZiAoKmVuZCA9PSAnLicpIHsKKyAgICAgICAgZW5kKys7CisgICAgfQorICAgIHN0cmNweShlbmQsICJSZXNvdXJjZXMvUHl0aG9uLmFwcC9Db250ZW50cy9NYWNPUy8iIFBZVEhPTkZSQU1FV09SSyk7CiAKLQlyZXR1cm4gZ19wYXRoOworICAgIHJldHVybiBnX3BhdGg7CiB9CiAKICNpZmRlZiBIQVZFX1NQQVdOX0gKIHN0YXRpYyB2b2lkCiBzZXR1cF9zcGF3bmF0dHIocG9zaXhfc3Bhd25hdHRyX3QqIHNwYXduYXR0cikKIHsKLQlzaXplX3Qgb2NvdW50OwotCXNpemVfdCBjb3VudDsKLQljcHVfdHlwZV90IGNwdV90eXBlc1sxXTsKLQlzaG9ydCBmbGFncyA9IDA7CisgICAgc2l6ZV90IG9jb3VudDsKKyAgICBzaXplX3QgY291bnQ7CisgICAgY3B1X3R5cGVfdCBjcHVfdHlwZXNbMV07CisgICAgc2hvcnQgZmxhZ3MgPSAwOwogI2lmZGVmIF9fTFA2NF9fCi0JaW50ICAgY2g7CisgICAgaW50ICAgY2g7CiAjZW5kaWYKIAotCWlmICgoZXJybm8gPSBwb3NpeF9zcGF3bmF0dHJfaW5pdChzcGF3bmF0dHIpKSAhPSAwKSB7Ci0JCWVycigyLCAicG9zaXhfc3Bhd25hdHRyX2ludCIpOwotCQkvKiBOT1RSRUFDSFRFRCAqLwotCX0KKyAgICBpZiAoKGVycm5vID0gcG9zaXhfc3Bhd25hdHRyX2luaXQoc3Bhd25hdHRyKSkgIT0gMCkgeworICAgICAgICBlcnIoMiwgInBvc2l4X3NwYXduYXR0cl9pbnQiKTsKKyAgICAgICAgLyogTk9UUkVBQ0hURUQgKi8KKyAgICB9CiAKLQljb3VudCA9IDE7CisgICAgY291bnQgPSAxOwogCi0JLyogUnVuIHRoZSByZWFsIHB5dGhvbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBzYW1lIGFyY2hpdHVyZSBhcyB0aGlzIAotCSAqIGV4ZWN1dGFibGUsIHRoaXMgYWxsb3dzIHVzZXJzIHRvIGNvbnRyb2xlIHRoZSBhcmNoaXRlY3R1cmUgdXNpbmcgCi0JICogImFyY2ggLXBwYyBweXRob24iCi0JICovCisgICAgLyogUnVuIHRoZSByZWFsIHB5dGhvbiBleGVjdXRhYmxlIHVzaW5nIHRoZSBzYW1lIGFyY2hpdHVyZSBhcyB0aGlzCisgICAgICogZXhlY3V0YWJsZSwgdGhpcyBhbGxvd3MgdXNlcnMgdG8gY29udHJvbGUgdGhlIGFyY2hpdGVjdHVyZSB1c2luZworICAgICAqICJhcmNoIC1wcGMgcHl0aG9uIgorICAgICAqLwogCiAjaWYgZGVmaW5lZChfX3BwYzY0X18pCi0JY3B1X3R5cGVzWzBdID0gQ1BVX1RZUEVfUE9XRVJQQzY0OworICAgIGNwdV90eXBlc1swXSA9IENQVV9UWVBFX1BPV0VSUEM2NDsKIAogI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQotCWNwdV90eXBlc1swXSA9IENQVV9UWVBFX1g4Nl82NDsKKyAgICBjcHVfdHlwZXNbMF0gPSBDUFVfVFlQRV9YODZfNjQ7CiAKICNlbGlmIGRlZmluZWQoX19wcGNfXykKLQljcHVfdHlwZXNbMF0gPSBDUFVfVFlQRV9QT1dFUlBDOworICAgIGNwdV90eXBlc1swXSA9IENQVV9UWVBFX1BPV0VSUEM7CiAjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQotCWNwdV90eXBlc1swXSA9IENQVV9UWVBFX1g4NjsKKyAgICBjcHVfdHlwZXNbMF0gPSBDUFVfVFlQRV9YODY7CiAjZWxzZQotIwllcnJvciAiVW5rbm93biBDUFUiCisjICAgICAgIGVycm9yICJVbmtub3duIENQVSIKICNlbmRpZgogCi0JaWYgKHBvc2l4X3NwYXduYXR0cl9zZXRiaW5wcmVmX25wKHNwYXduYXR0ciwgY291bnQsIAotCQkJCWNwdV90eXBlcywgJm9jb3VudCkgPT0gLTEpIHsKLQkJZXJyKDEsICJwb3NpeF9zcGF3bmF0dHJfc2V0YmlucHJlZiIpOwotCQkvKiBOT1RSRUFDSFRFRCAqLwotCX0KLQlpZiAoY291bnQgIT0gb2NvdW50KSB7Ci0JCWZwcmludGYoc3RkZXJyLCAicG9zaXhfc3Bhd25hdHRyX3NldGJpbnByZWYgZmFpbGVkIHRvIGNvcHlcbiIpOwotCQlleGl0KDEpOwotCQkvKiBOT1RSRUFDSFRFRCAqLwotCX0KKyAgICBpZiAocG9zaXhfc3Bhd25hdHRyX3NldGJpbnByZWZfbnAoc3Bhd25hdHRyLCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfdHlwZXMsICZvY291bnQpID09IC0xKSB7CisgICAgICAgIGVycigxLCAicG9zaXhfc3Bhd25hdHRyX3NldGJpbnByZWYiKTsKKyAgICAgICAgLyogTk9UUkVBQ0hURUQgKi8KKyAgICB9CisgICAgaWYgKGNvdW50ICE9IG9jb3VudCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBvc2l4X3NwYXduYXR0cl9zZXRiaW5wcmVmIGZhaWxlZCB0byBjb3B5XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgLyogTk9UUkVBQ0hURUQgKi8KKyAgICB9CiAKIAotCS8qIAotCSAqIFNldCBmbGFnIHRoYXQgY2F1c2VzIHBvc2l4X3NwYXduIHRvIGJlaGF2ZSBsaWtlIGV4ZWN2Ci0JICovCi0JZmxhZ3MgfD0gUE9TSVhfU1BBV05fU0VURVhFQzsKLQlpZiAoKGVycm5vID0gcG9zaXhfc3Bhd25hdHRyX3NldGZsYWdzKHNwYXduYXR0ciwgZmxhZ3MpKSAhPSAwKSB7Ci0JCWVycigxLCAicG9zaXhfc3Bhd25hdHRyX3NldGZsYWdzIik7Ci0JCS8qIE5PVFJFQUNIVEVEICovCi0JfQorICAgIC8qCisgICAgICogU2V0IGZsYWcgdGhhdCBjYXVzZXMgcG9zaXhfc3Bhd24gdG8gYmVoYXZlIGxpa2UgZXhlY3YKKyAgICAgKi8KKyAgICBmbGFncyB8PSBQT1NJWF9TUEFXTl9TRVRFWEVDOworICAgIGlmICgoZXJybm8gPSBwb3NpeF9zcGF3bmF0dHJfc2V0ZmxhZ3Moc3Bhd25hdHRyLCBmbGFncykpICE9IDApIHsKKyAgICAgICAgZXJyKDEsICJwb3NpeF9zcGF3bmF0dHJfc2V0ZmxhZ3MiKTsKKyAgICAgICAgLyogTk9UUkVBQ0hURUQgKi8KKyAgICB9CiB9CiAjZW5kaWYKIAotaW50IAoraW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewotCWNoYXIqIGV4ZWNfcGF0aCA9IGdldF9weXRob25fcGF0aCgpOworICAgIGNoYXIqIGV4ZWNfcGF0aCA9IGdldF9weXRob25fcGF0aCgpOwogCiAjaWZkZWYgSEFWRV9TUEFXTl9ICiAKLQkvKiBXZSdyZSB3ZWFrLWxpbmtpbmcgdG8gcG9zaXgtc3Bhd252IHRvIGVuc3VyZSB0aGF0Ci0JICogYW4gZXhlY3V0YWJsZSBidWlsZCBvbiAxMC41IGNhbiB3b3JrIG9uIDEwLjQuCi0JICovCi0JaWYgKHBvc2l4X3NwYXduICE9IE5VTEwpIHsKLQkJcG9zaXhfc3Bhd25hdHRyX3Qgc3Bhd25hdHRyID0gTlVMTDsKKyAgICAvKiBXZSdyZSB3ZWFrLWxpbmtpbmcgdG8gcG9zaXgtc3Bhd252IHRvIGVuc3VyZSB0aGF0CisgICAgICogYW4gZXhlY3V0YWJsZSBidWlsZCBvbiAxMC41IGNhbiB3b3JrIG9uIDEwLjQuCisgICAgICovCisgICAgaWYgKHBvc2l4X3NwYXduICE9IE5VTEwpIHsKKyAgICAgICAgcG9zaXhfc3Bhd25hdHRyX3Qgc3Bhd25hdHRyID0gTlVMTDsKIAogCi0JCXNldHVwX3NwYXduYXR0cigmc3Bhd25hdHRyKTsJCQotCQlwb3NpeF9zcGF3bihOVUxMLCBleGVjX3BhdGgsIE5VTEwsCi0JCQkmc3Bhd25hdHRyLCBhcmd2LCBlbnZpcm9uKTsKLQkJZXJyKDEsICJwb3NpeF9zcGF3bjogJXMiLCBleGVjX3BhdGgpOwotCX0KKyAgICAgICAgc2V0dXBfc3Bhd25hdHRyKCZzcGF3bmF0dHIpOworICAgICAgICBwb3NpeF9zcGF3bihOVUxMLCBleGVjX3BhdGgsIE5VTEwsCisgICAgICAgICAgICAmc3Bhd25hdHRyLCBhcmd2LCBlbnZpcm9uKTsKKyAgICAgICAgZXJyKDEsICJwb3NpeF9zcGF3bjogJXMiLCBleGVjX3BhdGgpOworICAgIH0KICNlbmRpZgotCWV4ZWN2ZShleGVjX3BhdGgsIGFyZ3YsIGVudmlyb24pOwotCWVycigxLCAiZXhlY3ZlOiAlcyIsIGFyZ3ZbMF0pOwotCS8qIE5PVFJFQUNIRUQgKi8KKyAgICBleGVjdmUoZXhlY19wYXRoLCBhcmd2LCBlbnZpcm9uKTsKKyAgICBlcnIoMSwgImV4ZWN2ZTogJXMiLCBhcmd2WzBdKTsKKyAgICAvKiBOT1RSRUFDSEVEICovCiB9Cg==