ZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2xpYmNvbW1vbi9pbmNsdWRlL2Fzc2VydC5oIGIvZmlybXdhcmUvbGliY29tbW9uL2luY2x1ZGUvYXNzZXJ0LmgKaW5kZXggYTUyZmZhOS4uMjJiYjEwMSAxMDA2NDQKLS0tIGEvZmlybXdhcmUvbGliY29tbW9uL2luY2x1ZGUvYXNzZXJ0LmgKKysrIGIvZmlybXdhcmUvbGliY29tbW9uL2luY2x1ZGUvYXNzZXJ0LmgKQEAgLTY1LDQxICs2NSw0MSBAQAogLy8gICAgICAgICBEZWZpbml0aW9ucwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICNpZiBkZWZpbmVkKE5PQVNTRVJUKQotICAgICNkZWZpbmUgQVNTRVJUKC4uLikKLSAgICAjZGVmaW5lIFNBTklUWV9DSEVDSyguLi4pCisJI2RlZmluZSBBU1NFUlQoLi4uKQorCSNkZWZpbmUgU0FOSVRZX0NIRUNLKC4uLikKICNlbHNlCiAKLSAgICAjaWYgKFRSQUNFX0xFVkVMID09IDApCi0gICAgICAgIC8vLyBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzIHRydWUsIAotICAgICAgICAvLy8gb3RoZXJ3aXNlIHN0b3BzIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbi4KLSAgICAgICAgLy8vIFxwYXJhbSBjb25kaXRpb24gIENvbmRpdGlvbiB0byB2ZXJpZnkuCi0gICAgICAgICNkZWZpbmUgQVNTRVJUKGNvbmRpdGlvbikgIHsgXAotICAgICAgICAgICAgaWYgKCEoY29uZGl0aW9uKSkgeyBcCi0gICAgICAgICAgICAgICAgd2hpbGUgKDEpOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfQorCSNpZiAoVFJBQ0VfTEVWRUwgPT0gMCkKKwkJLy8vIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBjb25kaXRpb24gaXMgdHJ1ZSwgCisJCS8vLyBvdGhlcndpc2Ugc3RvcHMgdGhlIHByb2dyYW0gZXhlY3V0aW9uLgorCQkvLy8gXHBhcmFtIGNvbmRpdGlvbiAgQ29uZGl0aW9uIHRvIHZlcmlmeS4KKwkJI2RlZmluZSBBU1NFUlQoY29uZGl0aW9uKSAgeyBcCisJCQlpZiAoIShjb25kaXRpb24pKSB7IFwKKwkJCQl3aGlsZSAoMSk7IFwKKwkJCX0gXAorCQl9CiAKLSAgICAgICAgLy8vIFBlcmZvcm1zIHRoZSBzYW1lIGR1dHkgYXMgdGhlIEFTU0VSVCgpIG1hY3JvCi0gICAgICAgIC8vLyBccGFyYW0gY29uZGl0aW9uICBDb25kaXRpb24gdG8gdmVyaWZ5LgotICAgICAgICAjZGVmaW5lIFNBTklUWV9DSEVDSyhjb25kaXRpb24pIEFTU0VSVChjb25kaXRpb24sIC4uLikKKwkJLy8vIFBlcmZvcm1zIHRoZSBzYW1lIGR1dHkgYXMgdGhlIEFTU0VSVCgpIG1hY3JvCisJCS8vLyBccGFyYW0gY29uZGl0aW9uICBDb25kaXRpb24gdG8gdmVyaWZ5LgorCQkjZGVmaW5lIFNBTklUWV9DSEVDSyhjb25kaXRpb24pIEFTU0VSVChjb25kaXRpb24sIC4uLikKIAotICAgICNlbHNlCi0gICAgICAgIC8vLyBDaGVja3MgdGhhdCB0aGUgZ2l2ZW4gY29uZGl0aW9uIGlzIHRydWUsIG90aGVyd2lzZSBkaXNwbGF5cyBhbiBlcnJvcgotICAgICAgICAvLy8gbWVzc2FnZSBhbmQgc3RvcHMgdGhlIHByb2dyYW0gZXhlY3V0aW9uLgotICAgICAgICAvLy8gXHBhcmFtIGNvbmRpdGlvbiAgQ29uZGl0aW9uIHRvIHZlcmlmeS4KLSAgICAgICAgI2RlZmluZSBBU1NFUlQoY29uZGl0aW9uKSAgeyBcCi0gICAgICAgICAgICBpZiAoIShjb25kaXRpb24pKSB7IFwKLSAgICAgICAgICAgICAgICBwcmludGYoIi1GLSBBU1NFUlQ6ICVzICVzOiVkXG5cciIsICNjb25kaXRpb24sIF9fQkFTRV9GSUxFX18sIF9fTElORV9fKTsgXAotICAgICAgICAgICAgICAgIHdoaWxlICgxKTsgXAotICAgICAgICAgICAgfSBcCi0gICAgICAgIH0KLSAgICAgICAgI2RlZmluZSBTQU5JVFlfRVJST1IgICAgICAgICAgICAiU2FuaXR5IGNoZWNrIGZhaWxlZCBhdCAlczolZFxuXHIiCi0gICAgCi0gICAgICAgIC8vLyBQZXJmb3JtcyB0aGUgc2FtZSBkdXR5IGFzIHRoZSBBU1NFUlQoKSBtYWNybywgZXhjZXB0IGEgZGVmYXVsdCBlcnJvcgotICAgICAgICAvLy8gbWVzc2FnZSBpcyBvdXRwdXQgaWYgdGhlIGNvbmRpdGlvbiBpcyBmYWxzZS4KLSAgICAgICAgLy8vIFxwYXJhbSBjb25kaXRpb24gIENvbmRpdGlvbiB0byB2ZXJpZnkuCi0gICAgICAgICNkZWZpbmUgU0FOSVRZX0NIRUNLKGNvbmRpdGlvbikgQVNTRVJUKGNvbmRpdGlvbiwgU0FOSVRZX0VSUk9SLCBfX0ZJTEVfXywgX19MSU5FX18pCi0gICAgI2VuZGlmCisJI2Vsc2UKKwkJLy8vIENoZWNrcyB0aGF0IHRoZSBnaXZlbiBjb25kaXRpb24gaXMgdHJ1ZSwgb3RoZXJ3aXNlIGRpc3BsYXlzIGFuIGVycm9yCisJCS8vLyBtZXNzYWdlIGFuZCBzdG9wcyB0aGUgcHJvZ3JhbSBleGVjdXRpb24uCisJCS8vLyBccGFyYW0gY29uZGl0aW9uICBDb25kaXRpb24gdG8gdmVyaWZ5LgorCQkjZGVmaW5lIEFTU0VSVChjb25kaXRpb24pICB7IFwKKwkJCWlmICghKGNvbmRpdGlvbikpIHsgXAorCQkJCXByaW50ZigiLUYtIEFTU0VSVDogJXMgJXM6JWRcblxyIiwgI2NvbmRpdGlvbiwgX19CQVNFX0ZJTEVfXywgX19MSU5FX18pOyBcCisJCQkJd2hpbGUgKDEpOyBcCisJCQl9IFwKKwkJfQorCQkjZGVmaW5lIFNBTklUWV9FUlJPUiAgICAgICAgICAgICJTYW5pdHkgY2hlY2sgZmFpbGVkIGF0ICVzOiVkXG5cciIKKwkKKwkJLy8vIFBlcmZvcm1zIHRoZSBzYW1lIGR1dHkgYXMgdGhlIEFTU0VSVCgpIG1hY3JvLCBleGNlcHQgYSBkZWZhdWx0IGVycm9yCisJCS8vLyBtZXNzYWdlIGlzIG91dHB1dCBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLgorCQkvLy8gXHBhcmFtIGNvbmRpdGlvbiAgQ29uZGl0aW9uIHRvIHZlcmlmeS4KKwkJI2RlZmluZSBTQU5JVFlfQ0hFQ0soY29uZGl0aW9uKSBBU1NFUlQoY29uZGl0aW9uLCBTQU5JVFlfRVJST1IsIF9fRklMRV9fLCBfX0xJTkVfXykKKwkjZW5kaWYKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2xpYmNvbW1vbi9pbmNsdWRlL2NjaWRkcml2ZXIuaCBiL2Zpcm13YXJlL2xpYmNvbW1vbi9pbmNsdWRlL2NjaWRkcml2ZXIuaAppbmRleCBlZTVlMDI4Li5mOWJlMDI3IDEwMDY0NAotLS0gYS9maXJtd2FyZS9saWJjb21tb24vaW5jbHVkZS9jY2lkZHJpdmVyLmgKKysrIGIvZmlybXdhcmUvbGliY29tbW9uL2luY2x1ZGUvY2NpZGRyaXZlci5oCkBAIC0xNDUsMTI5ICsxNDUsMTI5IEBACiAvLy8gNi4xLjExLjIgUElOIFZlcmlmaWNhdGlvbiBEYXRhIFN0cnVjdHVyZQogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICAvLy8gTnVtYmVyIG9mIHNlY29uZHMuCi0gICAgdW5zaWduZWQgY2hhciBiVGltZXJPdXQ7Ci0gICAgLy8vIFNldmVyYWwgcGFyYW1ldGVycyBmb3IgdGhlIFBJTiBmb3JtYXQgb3B0aW9ucwotICAgIHVuc2lnbmVkIGNoYXIgYm1Gb3JtYXRTdHJpbmc7Ci0gICAgLy8vIERlZmluZSB0aGUgbGVuZ3RoIG9mIHRoZSBQSU4gdG8gcHJlc2VudCBpbiB0aGUgQVBEVSBjb21tYW5kCi0gICAgdW5zaWduZWQgY2hhciBibVBJTkJsb2NrU3RyaW5nOwotICAgIC8vLyBBbGxvd3MgdGhlIGxlbmd0aCBQSU4gaW5zZXJ0aW9uIGluIHRoZSBBUERVIGNvbW1hbmQKLSAgICB1bnNpZ25lZCBjaGFyIGJtUElOTGVuZ3RoRm9ybWF0OwotICAgIC8vLyBNaW5pbXVtIFBJTiBzaXplIGluIGRpZ2l0IGFuZCBNYXhpbXVtIFBJTiBzaXplIGluIGRpZ2l0Ci0gICAgdW5zaWduZWQgY2hhciB3UElOTWF4RXh0cmFEaWdpdDsKLSAgICAvLy8gVGhlIHZhbHVlIGlzIGEgYml0IHdpc2UgT1Igb3BlcmF0aW9uLgotICAgIHVuc2lnbmVkIGNoYXIgYkVudHJ5VmFsaWRhdGlvbkNvbmRpdGlvbjsKLSAgICAvLy8gTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGRpc3BsYXkgZm9yIHRoZSBQSU4gbW9kaWZ5IGNvbW1hbmQKLSAgICB1bnNpZ25lZCBjaGFyIGJOdW1iZXJNZXNzYWdlOwotICAgIC8vLyBMYW5ndWFnZSB1c2VkIHRvIGRpc3BsYXkgdGhlIG1lc3NhZ2VzLgotICAgIHVuc2lnbmVkIGNoYXIgd0xhbmdJZDsKLSAgICAvLy8gTWVzc2FnZSBpbmRleCBpbiB0aGUgUmVhZGVyIG1lc3NhZ2UgdGFibGUKLSAgICB1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDsKLSAgICAvLy8gVD0xIEktYmxvY2sgcHJvbG9ndWUgZmllbGQgdG8gdXNlCi0gICAgdW5zaWduZWQgY2hhciBiVGVvUHJvbG9ndWVbM107Ci0gICAgLy8vIEFQRFUgdG8gc2VuZCB0byB0aGUgSUNDCi0gICAgdW5zaWduZWQgY2hhciBhYlBJTkFwZHVbMjU1XTsKKwkvLy8gTnVtYmVyIG9mIHNlY29uZHMuCisJdW5zaWduZWQgY2hhciBiVGltZXJPdXQ7CisJLy8vIFNldmVyYWwgcGFyYW1ldGVycyBmb3IgdGhlIFBJTiBmb3JtYXQgb3B0aW9ucworCXVuc2lnbmVkIGNoYXIgYm1Gb3JtYXRTdHJpbmc7CisJLy8vIERlZmluZSB0aGUgbGVuZ3RoIG9mIHRoZSBQSU4gdG8gcHJlc2VudCBpbiB0aGUgQVBEVSBjb21tYW5kCisJdW5zaWduZWQgY2hhciBibVBJTkJsb2NrU3RyaW5nOworCS8vLyBBbGxvd3MgdGhlIGxlbmd0aCBQSU4gaW5zZXJ0aW9uIGluIHRoZSBBUERVIGNvbW1hbmQKKwl1bnNpZ25lZCBjaGFyIGJtUElOTGVuZ3RoRm9ybWF0OworCS8vLyBNaW5pbXVtIFBJTiBzaXplIGluIGRpZ2l0IGFuZCBNYXhpbXVtIFBJTiBzaXplIGluIGRpZ2l0CisJdW5zaWduZWQgY2hhciB3UElOTWF4RXh0cmFEaWdpdDsKKwkvLy8gVGhlIHZhbHVlIGlzIGEgYml0IHdpc2UgT1Igb3BlcmF0aW9uLgorCXVuc2lnbmVkIGNoYXIgYkVudHJ5VmFsaWRhdGlvbkNvbmRpdGlvbjsKKwkvLy8gTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGRpc3BsYXkgZm9yIHRoZSBQSU4gbW9kaWZ5IGNvbW1hbmQKKwl1bnNpZ25lZCBjaGFyIGJOdW1iZXJNZXNzYWdlOworCS8vLyBMYW5ndWFnZSB1c2VkIHRvIGRpc3BsYXkgdGhlIG1lc3NhZ2VzLgorCXVuc2lnbmVkIGNoYXIgd0xhbmdJZDsKKwkvLy8gTWVzc2FnZSBpbmRleCBpbiB0aGUgUmVhZGVyIG1lc3NhZ2UgdGFibGUKKwl1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDsKKwkvLy8gVD0xIEktYmxvY2sgcHJvbG9ndWUgZmllbGQgdG8gdXNlCisJdW5zaWduZWQgY2hhciBiVGVvUHJvbG9ndWVbM107CisJLy8vIEFQRFUgdG8gc2VuZCB0byB0aGUgSUNDCisJdW5zaWduZWQgY2hhciBhYlBJTkFwZHVbMjU1XTsKIH1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU19jY2lkX1BJTl9WZXJpZmljYXRpb247CiAKIAogLy8vIDYuMS4xMS43IFBJTiBNb2RpZmljYXRpb24gRGF0YSBTdHJ1Y3R1cmUKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgLy8vIE51bWJlciBvZiBzZWNvbmRzLiBJZiAwMGggdGhlbiBDQ0lEIGRlZmF1bHQgdmFsdWUgaXMgdXNlZC4KLSAgICB1bnNpZ25lZCBjaGFyIGJUaW1lT3V0OwotICAgIC8vLyBTZXZlcmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBQSU4gZm9ybWF0IG9wdGlvbnMgKGRlZmluZWQgaW4gpyA2LjEuMTEuNCkKLSAgICB1bnNpZ25lZCBjaGFyIGJtRm9ybWF0U3RyaW5nNDsKLSAgICAvLy8gRGVmaW5lIHRoZSBsZW5ndGggb2YgdGhlIFBJTiB0byBwcmVzZW50IGluIHRoZSBBUERVIGNvbW1hbmQKLSAgICB1bnNpZ25lZCBjaGFyIGJtUElOQmxvY2tTdHJpbmc7Ci0gICAgLy8vIEFsbG93cyB0aGUgbGVuZ3RoIFBJTiBpbnNlcnRpb24gaW4gdGhlIEFQRFUgY29tbWFuZCAoZGVmaW5lZCBpbiCnIDYuMS4xMS42KQotICAgIHVuc2lnbmVkIGNoYXIgYm1QaW5MZW5ndGhGb3JtYXQ7Ci0gICAgLy8vIEluc2VydGlvbiBwb3NpdGlvbiBvZmZzZXQgaW4gYnl0ZSBmb3IgdGhlIGN1cnJlbnQgUElOCi0gICAgdW5zaWduZWQgY2hhciBiSW5zZXJ0aW9uT2Zmc2V0T2xkOwotICAgIC8vLyBJbnNlcnRpb24gcG9zaXRpb24gb2Zmc2V0IGluIGJ5dGUgZm9yIHRoZSBuZXcgUElOCi0gICAgdW5zaWduZWQgY2hhciBiSW5zZXJ0aW9uT2Zmc2V0TmV3OwotICAgIC8vLyBYWFlZaAotICAgIC8vLyBYWDogTWluaW11bSBQSU4gc2l6ZSBpbiBkaWdpdAotICAgIC8vLyBZWTogTWF4aW11bSBQSU4gc2l6ZSBpbiBkaWdpdAotICAgIHVuc2lnbmVkIGNoYXIgd1BJTk1heEV4dHJhRGlnaXQ7Ci0gICAgLy8vIDAwaCwwMWgsMDJoLDAzaAotICAgIC8vLyBJbmRpY2F0ZXMgaWYgYSBjb25maXJtYXRpb24gaXMgcmVxdWVzdGVkIGJlZm9yZSBhY2NlcHRhbmNlIG9mIGEgbmV3IFBJTiAobWVhbmluZyB0aGF0IHRoZSB1c2VyIGhhcyB0byBlbnRlciB0aGlzIG5ldyBQSU4gdHdpY2UgYmVmb3JlIGl0IGlzIGFjY2VwdGVkKQotICAgIC8vLyBJbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgUElOIG11c3QgYmUgZW50ZXJlZCBhbmQgc2V0IGluIHRoZSBzYW1lIEFQRFUgZmllbGQgb2Ygbm90LgotICAgIHVuc2lnbmVkIGNoYXIgYkNvbmZpcm1QSU47Ci0gICAgLy8vIFRoZSB2YWx1ZSBpcyBhIGJpdCB3aXNlIE9SIG9wZXJhdGlvbi4KLSAgICAvLy8gMDFoIE1heCBzaXplIHJlYWNoZWQKLSAgICAvLy8gMDJoIFZhbGlkYXRpb24ga2V5IHByZXNzZWQKLSAgICAvLy8gMDRoIFRpbWVvdXQgb2NjdXJyZWQKLSAgICB1bnNpZ25lZCBjaGFyIGJFbnRyeVZhbGlkYXRpb25Db25kaXRpb247Ci0gICAgLy8vIDAwaCwwMWgsMDJoLDAzaCxvciBGRmgKLSAgICAvLy8gTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGRpc3BsYXkgZm9yIHRoZSBQSU4gbW9kaWZ5IGNvbW1hbmQuCi0gICAgdW5zaWduZWQgY2hhciBiTnVtYmVyTWVzc2FnZTsKLSAgICAvLy8gTGFuZ3VhZ2UgdXNlZCB0byBkaXNwbGF5IHRoZSBtZXNzYWdlcy4gVGhlIDE2IGJpdAotICAgIHVuc2lnbmVkIGNoYXIgd0xhbmdJZDsKLSAgICAvLy8gTWVzc2FnZSBpbmRleCBpbiB0aGUgUmVhZGVyIG1lc3NhZ2UgdGFibGUgKHNob3VsZCBiZSAwMGggb3IgMDFoKS4KLSAgICB1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDE7Ci0gICAgLy8vIE1lc3NhZ2UgaW5kZXggaW4gdGhlIFJlYWRlciBtZXNzYWdlIHRhYmxlIChzaG91bGQgYmUgMDFoIG9yIDAyaCkuCi0gICAgdW5zaWduZWQgY2hhciBiTXNnSW5kZXgyOwotICAgIC8vLyBNZXNzYWdlIGluZGV4IGluIHRoZSBSZWFkZXIgbWVzc2FnZSB0YWJsZSAoc2hvdWxkIGJlIDAyaCkuCi0gICAgdW5zaWduZWQgY2hhciBiTXNnSW5kZXgzOwotICAgIC8vLyBUPTEgSS1ibG9jayBwcm9sb2d1ZSBmaWVsZCB0byB1c2UuIFNpZ25pZmljYW50IG9ubHkgaWYgcHJvdG9jb2wgaW4gdXNlIGlzIFQ9MS4KLSAgICB1bnNpZ25lZCBjaGFyIGJUZW9Qcm9sb2d1ZVszXTsKLSAgICAvLy8gQnl0ZSBhcnJheSBBUERVIHRvIHNlbmQgdG8gdGhlIElDQwotICAgIHVuc2lnbmVkIGNoYXIgYWJQSU5BcGR1WzI1NV07CisJLy8vIE51bWJlciBvZiBzZWNvbmRzLiBJZiAwMGggdGhlbiBDQ0lEIGRlZmF1bHQgdmFsdWUgaXMgdXNlZC4KKwl1bnNpZ25lZCBjaGFyIGJUaW1lT3V0OworCS8vLyBTZXZlcmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBQSU4gZm9ybWF0IG9wdGlvbnMgKGRlZmluZWQgaW4gpyA2LjEuMTEuNCkKKwl1bnNpZ25lZCBjaGFyIGJtRm9ybWF0U3RyaW5nNDsKKwkvLy8gRGVmaW5lIHRoZSBsZW5ndGggb2YgdGhlIFBJTiB0byBwcmVzZW50IGluIHRoZSBBUERVIGNvbW1hbmQKKwl1bnNpZ25lZCBjaGFyIGJtUElOQmxvY2tTdHJpbmc7CisJLy8vIEFsbG93cyB0aGUgbGVuZ3RoIFBJTiBpbnNlcnRpb24gaW4gdGhlIEFQRFUgY29tbWFuZCAoZGVmaW5lZCBpbiCnIDYuMS4xMS42KQorCXVuc2lnbmVkIGNoYXIgYm1QaW5MZW5ndGhGb3JtYXQ7CisJLy8vIEluc2VydGlvbiBwb3NpdGlvbiBvZmZzZXQgaW4gYnl0ZSBmb3IgdGhlIGN1cnJlbnQgUElOCisJdW5zaWduZWQgY2hhciBiSW5zZXJ0aW9uT2Zmc2V0T2xkOworCS8vLyBJbnNlcnRpb24gcG9zaXRpb24gb2Zmc2V0IGluIGJ5dGUgZm9yIHRoZSBuZXcgUElOCisJdW5zaWduZWQgY2hhciBiSW5zZXJ0aW9uT2Zmc2V0TmV3OworCS8vLyBYWFlZaAorCS8vLyBYWDogTWluaW11bSBQSU4gc2l6ZSBpbiBkaWdpdAorCS8vLyBZWTogTWF4aW11bSBQSU4gc2l6ZSBpbiBkaWdpdAorCXVuc2lnbmVkIGNoYXIgd1BJTk1heEV4dHJhRGlnaXQ7CisJLy8vIDAwaCwwMWgsMDJoLDAzaAorCS8vLyBJbmRpY2F0ZXMgaWYgYSBjb25maXJtYXRpb24gaXMgcmVxdWVzdGVkIGJlZm9yZSBhY2NlcHRhbmNlIG9mIGEgbmV3IFBJTiAobWVhbmluZyB0aGF0IHRoZSB1c2VyIGhhcyB0byBlbnRlciB0aGlzIG5ldyBQSU4gdHdpY2UgYmVmb3JlIGl0IGlzIGFjY2VwdGVkKQorCS8vLyBJbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgUElOIG11c3QgYmUgZW50ZXJlZCBhbmQgc2V0IGluIHRoZSBzYW1lIEFQRFUgZmllbGQgb2Ygbm90LgorCXVuc2lnbmVkIGNoYXIgYkNvbmZpcm1QSU47CisJLy8vIFRoZSB2YWx1ZSBpcyBhIGJpdCB3aXNlIE9SIG9wZXJhdGlvbi4KKwkvLy8gMDFoIE1heCBzaXplIHJlYWNoZWQKKwkvLy8gMDJoIFZhbGlkYXRpb24ga2V5IHByZXNzZWQKKwkvLy8gMDRoIFRpbWVvdXQgb2NjdXJyZWQKKwl1bnNpZ25lZCBjaGFyIGJFbnRyeVZhbGlkYXRpb25Db25kaXRpb247CisJLy8vIDAwaCwwMWgsMDJoLDAzaCxvciBGRmgKKwkvLy8gTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGRpc3BsYXkgZm9yIHRoZSBQSU4gbW9kaWZ5IGNvbW1hbmQuCisJdW5zaWduZWQgY2hhciBiTnVtYmVyTWVzc2FnZTsKKwkvLy8gTGFuZ3VhZ2UgdXNlZCB0byBkaXNwbGF5IHRoZSBtZXNzYWdlcy4gVGhlIDE2IGJpdAorCXVuc2lnbmVkIGNoYXIgd0xhbmdJZDsKKwkvLy8gTWVzc2FnZSBpbmRleCBpbiB0aGUgUmVhZGVyIG1lc3NhZ2UgdGFibGUgKHNob3VsZCBiZSAwMGggb3IgMDFoKS4KKwl1bnNpZ25lZCBjaGFyIGJNc2dJbmRleDE7CisJLy8vIE1lc3NhZ2UgaW5kZXggaW4gdGhlIFJlYWRlciBtZXNzYWdlIHRhYmxlIChzaG91bGQgYmUgMDFoIG9yIDAyaCkuCisJdW5zaWduZWQgY2hhciBiTXNnSW5kZXgyOworCS8vLyBNZXNzYWdlIGluZGV4IGluIHRoZSBSZWFkZXIgbWVzc2FnZSB0YWJsZSAoc2hvdWxkIGJlIDAyaCkuCisJdW5zaWduZWQgY2hhciBiTXNnSW5kZXgzOworCS8vLyBUPTEgSS1ibG9jayBwcm9sb2d1ZSBmaWVsZCB0byB1c2UuIFNpZ25pZmljYW50IG9ubHkgaWYgcHJvdG9jb2wgaW4gdXNlIGlzIFQ9MS4KKwl1bnNpZ25lZCBjaGFyIGJUZW9Qcm9sb2d1ZVszXTsKKwkvLy8gQnl0ZSBhcnJheSBBUERVIHRvIHNlbmQgdG8gdGhlIElDQworCXVuc2lnbmVkIGNoYXIgYWJQSU5BcGR1WzI1NV07CiB9X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIFNfY2NpZF9QSU5fTW9kaWZpY2F0aW9uOwogCiAvLy8gUHJvdG9jb2wgRGF0YSBTdHJ1Y3R1cmUgZm9yIFByb3RvY29sIFQ9MCAoYlByb3RvY29sTnVtPTAsIGR3TGVuZ3RoPTAwMDAwMDA1aCkKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgLy8vIEI3LTQgliBGSSCWIEluZGV4IGludG8gdGhlIHRhYmxlIDcgaW4gSVNPL0lFQyA3ODE2LTM6MTk5NyBzZWxlY3RpbmcgYSAKLSAgICAvLy8gY2xvY2sgcmF0ZSBjb252ZXJzaW9uIGZhY3RvcgotICAgIC8vLyBCMy0wIJYgREkgLSBJbmRleCBpbnRvIHRoZSB0YWJsZSA4IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCi0gICAgLy8vIGJhdWQgcmF0ZSBjb252ZXJzaW9uIGZhY3RvcgotICAgIHVuc2lnbmVkIGNoYXIgYm1GaW5kZXhEaW5kZXg7Ci0gICAgLy8vIEZvciBUPTAgLEIwIJYgMGIsIEI3LTIgliAwMDAwMDBiCi0gICAgLy8vIEIxIJYgQ29udmVudGlvbiB1c2VkIChiMT0wIGZvciBkaXJlY3QsIGIxPTEgZm9yIGludmVyc2UpCi0gICAgdW5zaWduZWQgY2hhciBibVRDQ0tTVDA7ICAgICAgICAgLy8gMCB0byAyCi0gICAgLy8vIEV4dHJhIEd1YXJkdGltZSBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzLiBBZGQgMCB0byAyNTQgZXR1IHRvIHRoZSBub3JtYWwgCi0gICAgLy8vIGd1YXJkdGltZSBvZiAxMmV0dS4gRkZoIGlzIHRoZSBzYW1lIGFzIDAwaC4KLSAgICB1bnNpZ25lZCBjaGFyIGJHdWFyZFRpbWVUMDsgICAgICAvLyAwIHRvIEZGCi0gICAgLy8vIFdJIGZvciBUPTAgdXNlZCB0byBkZWZpbmUgV1dUCi0gICAgdW5zaWduZWQgY2hhciBiV2FpdGluZ0ludGVnZXJUMDsgLy8gMCB0byBGRgotICAgIC8vLyBJQ0MgQ2xvY2sgU3RvcCBTdXBwb3J0Ci0gICAgLy8vIDAwID0gU3RvcHBpbmcgdGhlIENsb2NrIGlzIG5vdCBhbGxvd2VkCi0gICAgLy8vIDAxID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBMb3cKLSAgICAvLy8gMDIgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIEhpZ2gKLSAgICAvLy8gMDMgPSBTdG9wIHdpdGggQ2xvY2sgZWl0aGVyIEhpZ2ggb3IgTG93Ci0gICAgdW5zaWduZWQgY2hhciBiQ2xvY2tTdG9wOyAgICAgICAgLy8gMCB0byAzCisJLy8vIEI3LTQgliBGSSCWIEluZGV4IGludG8gdGhlIHRhYmxlIDcgaW4gSVNPL0lFQyA3ODE2LTM6MTk5NyBzZWxlY3RpbmcgYSAKKwkvLy8gY2xvY2sgcmF0ZSBjb252ZXJzaW9uIGZhY3RvcgorCS8vLyBCMy0wIJYgREkgLSBJbmRleCBpbnRvIHRoZSB0YWJsZSA4IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCisJLy8vIGJhdWQgcmF0ZSBjb252ZXJzaW9uIGZhY3RvcgorCXVuc2lnbmVkIGNoYXIgYm1GaW5kZXhEaW5kZXg7CisJLy8vIEZvciBUPTAgLEIwIJYgMGIsIEI3LTIgliAwMDAwMDBiCisJLy8vIEIxIJYgQ29udmVudGlvbiB1c2VkIChiMT0wIGZvciBkaXJlY3QsIGIxPTEgZm9yIGludmVyc2UpCisJdW5zaWduZWQgY2hhciBibVRDQ0tTVDA7ICAgICAgICAgLy8gMCB0byAyCisJLy8vIEV4dHJhIEd1YXJkdGltZSBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzLiBBZGQgMCB0byAyNTQgZXR1IHRvIHRoZSBub3JtYWwgCisJLy8vIGd1YXJkdGltZSBvZiAxMmV0dS4gRkZoIGlzIHRoZSBzYW1lIGFzIDAwaC4KKwl1bnNpZ25lZCBjaGFyIGJHdWFyZFRpbWVUMDsgICAgICAvLyAwIHRvIEZGCisJLy8vIFdJIGZvciBUPTAgdXNlZCB0byBkZWZpbmUgV1dUCisJdW5zaWduZWQgY2hhciBiV2FpdGluZ0ludGVnZXJUMDsgLy8gMCB0byBGRgorCS8vLyBJQ0MgQ2xvY2sgU3RvcCBTdXBwb3J0CisJLy8vIDAwID0gU3RvcHBpbmcgdGhlIENsb2NrIGlzIG5vdCBhbGxvd2VkCisJLy8vIDAxID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBMb3cKKwkvLy8gMDIgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIEhpZ2gKKwkvLy8gMDMgPSBTdG9wIHdpdGggQ2xvY2sgZWl0aGVyIEhpZ2ggb3IgTG93CisJdW5zaWduZWQgY2hhciBiQ2xvY2tTdG9wOyAgICAgICAgLy8gMCB0byAzCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfcHJvdG9jb2xfdDA7CiAKIAogLy8vIFByb3RvY29sIERhdGEgU3RydWN0dXJlIGZvciBQcm90b2NvbCBUPTEgKGJQcm90b2NvbE51bT0xLCBkd0xlbmd0aD0wMDAwMDAwN2gpCiB0eXBlZGVmIHN0cnVjdAogewotICAgIC8vLyBCNy00IJYgRkkgliBJbmRleCBpbnRvIHRoZSB0YWJsZSA3IGluIElTTy9JRUMgNzgxNi0zOjE5OTcgc2VsZWN0aW5nIGEgCi0gICAgLy8vIGNsb2NrIHJhdGUgY29udmVyc2lvbiBmYWN0b3IKLSAgICAvLy8gQjMtMCCWIERJIC0gSW5kZXggaW50byB0aGUgdGFibGUgOCBpbiBJU08vSUVDIDc4MTYtMzoxOTk3IHNlbGVjdGluZyBhIAotICAgIC8vLyBiYXVkIHJhdGUgY29udmVyc2lvbiBmYWN0b3IKLSAgICB1bnNpZ25lZCBjaGFyIGJtRmluZGV4RGluZGV4OwotICAgIC8vLyBGb3IgVD0xLCBCNy0yIJYgMDAwMTAwYgotICAgIC8vLyBCMCCWIENoZWNrc3VtIHR5cGUgKGIwPTAgZm9yIExSQywgYjA9MSBmb3IgQ1JDCi0gICAgLy8vIEIxIJYgQ29udmVudGlvbiB1c2VkIChiMT0wIGZvciBkaXJlY3QsIGIxPTEgZm9yIGludmVyc2UpCi0gICAgdW5zaWduZWQgY2hhciBibVRDQ0tTVDE7ICAgICAgICAgICAvLyAxMGgsIDExaCwgMTJoLCAxM2gKLSAgICAvLy8gRXh0cmEgR3VhcmR0aW1lICgwIHRvIDI1NCBldHUgYmV0d2VlbiB0d28gY2hhcmFjdGVycykuIAotICAgIC8vLyBJZiB2YWx1ZSBpcyBGRmgsIHRoZW4gZ3VhcmR0aW1lIGlzIHJlZHVjZWQgYnkgMS4KLSAgICB1bnNpZ25lZCBjaGFyIGJHdWFyZFRpbWVUMTsgICAgICAgIC8vIDAgdG8gRkYKLSAgICAvLy8gQjctNCA9IEJXSQotICAgIC8vLyBCMy0wID0gQ1dJCi0gICAgdW5zaWduZWQgY2hhciBibVdhaXRpbmdJbnRlZ2Vyc1QxOyAvLyAwIHRvIDkKLSAgICAvLy8gSUNDIENsb2NrIFN0b3AgU3VwcG9ydAotICAgIC8vLyAwMCA9IFN0b3BwaW5nIHRoZSBDbG9jayBpcyBub3QgYWxsb3dlZAotICAgIC8vLyAwMSA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgTG93Ci0gICAgLy8vIDAyID0gU3RvcCB3aXRoIENsb2NrIHNpZ25hbCBIaWdoCi0gICAgLy8vIDAzID0gU3RvcCB3aXRoIENsb2NrIGVpdGhlciBIaWdoIG9yIExvdwotICAgIHVuc2lnbmVkIGNoYXIgYkNsb2NrU3RvcDsgICAgICAgICAgLy8gMCB0byAzCi0gICAgLy8vIFNpemUgb2YgbmVnb3RpYXRlZCBJRlNDCi0gICAgdW5zaWduZWQgY2hhciBiSUZTQzsgICAgICAgICAgICAgICAvLyAwIHRvIEZFCi0gICAgLy8vIE5hZCB2YWx1ZSB1c2VkIGJ5IENDSUQKLSAgICB1bnNpZ25lZCBjaGFyIGJOYWRWYWx1ZTsgICAgICAgICAgIC8vIDAgdG8gRkYKKwkvLy8gQjctNCCWIEZJIJYgSW5kZXggaW50byB0aGUgdGFibGUgNyBpbiBJU08vSUVDIDc4MTYtMzoxOTk3IHNlbGVjdGluZyBhIAorCS8vLyBjbG9jayByYXRlIGNvbnZlcnNpb24gZmFjdG9yCisJLy8vIEIzLTAgliBESSAtIEluZGV4IGludG8gdGhlIHRhYmxlIDggaW4gSVNPL0lFQyA3ODE2LTM6MTk5NyBzZWxlY3RpbmcgYSAKKwkvLy8gYmF1ZCByYXRlIGNvbnZlcnNpb24gZmFjdG9yCisJdW5zaWduZWQgY2hhciBibUZpbmRleERpbmRleDsKKwkvLy8gRm9yIFQ9MSwgQjctMiCWIDAwMDEwMGIKKwkvLy8gQjAgliBDaGVja3N1bSB0eXBlIChiMD0wIGZvciBMUkMsIGIwPTEgZm9yIENSQworCS8vLyBCMSCWIENvbnZlbnRpb24gdXNlZCAoYjE9MCBmb3IgZGlyZWN0LCBiMT0xIGZvciBpbnZlcnNlKQorCXVuc2lnbmVkIGNoYXIgYm1UQ0NLU1QxOyAgICAgICAgICAgLy8gMTBoLCAxMWgsIDEyaCwgMTNoCisJLy8vIEV4dHJhIEd1YXJkdGltZSAoMCB0byAyNTQgZXR1IGJldHdlZW4gdHdvIGNoYXJhY3RlcnMpLiAKKwkvLy8gSWYgdmFsdWUgaXMgRkZoLCB0aGVuIGd1YXJkdGltZSBpcyByZWR1Y2VkIGJ5IDEuCisJdW5zaWduZWQgY2hhciBiR3VhcmRUaW1lVDE7ICAgICAgICAvLyAwIHRvIEZGCisJLy8vIEI3LTQgPSBCV0kKKwkvLy8gQjMtMCA9IENXSQorCXVuc2lnbmVkIGNoYXIgYm1XYWl0aW5nSW50ZWdlcnNUMTsgLy8gMCB0byA5CisJLy8vIElDQyBDbG9jayBTdG9wIFN1cHBvcnQKKwkvLy8gMDAgPSBTdG9wcGluZyB0aGUgQ2xvY2sgaXMgbm90IGFsbG93ZWQKKwkvLy8gMDEgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIExvdworCS8vLyAwMiA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgSGlnaAorCS8vLyAwMyA9IFN0b3Agd2l0aCBDbG9jayBlaXRoZXIgSGlnaCBvciBMb3cKKwl1bnNpZ25lZCBjaGFyIGJDbG9ja1N0b3A7ICAgICAgICAgIC8vIDAgdG8gMworCS8vLyBTaXplIG9mIG5lZ290aWF0ZWQgSUZTQworCXVuc2lnbmVkIGNoYXIgYklGU0M7ICAgICAgICAgICAgICAgLy8gMCB0byBGRQorCS8vLyBOYWQgdmFsdWUgdXNlZCBieSBDQ0lECisJdW5zaWduZWQgY2hhciBiTmFkVmFsdWU7ICAgICAgICAgICAvLyAwIHRvIEZGCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBTX2NjaWRfcHJvdG9jb2xfdDE7CiAKIApAQCAtMzU3LDggKzM1Nyw4IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBleHRlcm4gdW5zaWduZWQgY2hhciBSRFJ0b1BDSGFyZHdhcmVFcnJvciggdW5zaWduZWQgY2hhciBiU2xvdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiU2VxLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJIYXJkd2FyZUVycm9yQ29kZSApOworCQkJCQkgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYlNlcSwgCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiSGFyZHdhcmVFcnJvckNvZGUgKTsKIAogLyoKICNpZiAhZGVmaW5lZChOT0FVVE9DQUxMQkFDSykKQEAgLTM2OCwxMyArMzY4LDEzIEBACiBleHRlcm4gdm9pZCBDQ0lEX1NtYXJ0Q2FyZFJlcXVlc3QoIHZvaWQgKTsKIGV4dGVybiB2b2lkIENDSUREcml2ZXJfSW5pdGlhbGl6ZSggdm9pZCApOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgQ0NJRF9SZWFkKHZvaWQgKnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJDYWxsYmFjayBmQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEFyZ3VtZW50KTsKKwkJCQkJICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKKwkJCQkJICAgICAgICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKKwkJCQkJICAgICAgICAgICB2b2lkICpwQXJndW1lbnQpOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgQ0NJRF9Xcml0ZSh2b2lkICpwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJDYWxsYmFjayBmQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBBcmd1bWVudCk7CisJCQkJCSAgICAgICAgICAgIHVuc2lnbmVkIGludCBkTGVuZ3RoLAorCQkJCQkgICAgICAgICAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKKwkJCQkJICAgICAgICAgICAgdm9pZCAqcEFyZ3VtZW50KTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIENDSURfSW5zZXJ0aW9uKCB2b2lkICk7CiBleHRlcm4gdW5zaWduZWQgY2hhciBDQ0lEX1JlbW92YWwoIHZvaWQgKTsKIApkaWZmIC0tZ2l0IGEvZmlybXdhcmUvbGliY29tbW9uL2luY2x1ZGUvaXNvNzgxNl80LmggYi9maXJtd2FyZS9saWJjb21tb24vaW5jbHVkZS9pc283ODE2XzQuaAppbmRleCA3YzM3MWIyLi5lMjIxNWM3IDEwMDY0NAotLS0gYS9maXJtd2FyZS9saWJjb21tb24vaW5jbHVkZS9pc283ODE2XzQuaAorKysgYi9maXJtd2FyZS9saWJjb21tb24vaW5jbHVkZS9pc283ODE2XzQuaApAQCAtNzYsOSArNzYsOSBAQAogCiBleHRlcm4gdm9pZCBJU083ODE2X0ljY1Bvd2VyT2ZmKHZvaWQpOwogZXh0ZXJuIHVpbnQzMl90IElTTzc4MTZfWGZyQmxvY2tUUERVX1QwKGNvbnN0IHVpbnQ4X3QgKnBBUERVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnJldGxlbik7CisJCQkJCSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcE1lc3NhZ2UsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0xlbmd0aCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcmV0bGVuKTsKIGV4dGVybiB2b2lkIElTTzc4MTZfRXNjYXBlKCB2b2lkICk7CiBleHRlcm4gdm9pZCBJU083ODE2X1Jlc3RhcnRDbG9jayh2b2lkKTsKIGV4dGVybiB2b2lkIElTTzc4MTZfU3RvcENsb2NrKCB2b2lkICk7CmRpZmYgLS1naXQgYS9maXJtd2FyZS9saWJjb21tb24vaW5jbHVkZS9zaW10cmFjZS5oIGIvZmlybXdhcmUvbGliY29tbW9uL2luY2x1ZGUvc2ltdHJhY2UuaAppbmRleCA1ZWRlYTE3Li4wNDg2NTgxIDEwMDY0NAotLS0gYS9maXJtd2FyZS9saWJjb21tb24vaW5jbHVkZS9zaW10cmFjZS5oCisrKyBiL2Zpcm13YXJlL2xpYmNvbW1vbi9pbmNsdWRlL3NpbXRyYWNlLmgKQEAgLTY1LDE5ICs2NSwxOSBAQAogLy8vIGRldmljZSB1c2luZyB0aGUgQ0NJRCBkcml2ZXIuCiB0eXBlZGVmIHN0cnVjdCB7CiAKLSAgICAvLy8gQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yCi0gICAgVVNCQ29uZmlndXJhdGlvbkRlc2NyaXB0b3IgY29uZmlndXJhdGlvbjsKLSAgICAvLy8gSW50ZXJmYWNlIGRlc2NyaXB0b3IKLSAgICBVU0JJbnRlcmZhY2VEZXNjcmlwdG9yICAgICBpbnRlcmZhY2U7Ci0gICAgLy8vIENDSUQgZGVzY3JpcHRvcgotICAgIENDSUREZXNjcmlwdG9yICAgICAgICAgICAgIGNjaWQ7Ci0gICAgLy8vIEJ1bGsgT1VUIGVuZHBvaW50IGRlc2NyaXB0b3IKLSAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgICAgICBidWxrT3V0OwotICAgIC8vLyBCdWxrIElOIGVuZHBvaW50IGRlc2NyaXB0b3IKLSAgICBVU0JFbmRwb2ludERlc2NyaXB0b3IgICAgICBidWxrSW47Ci0gICAgLy8vIEludGVycnVwdCBPVVQgZW5kcG9pbnQgZGVzY3JpcHRvcgotICAgIFVTQkVuZHBvaW50RGVzY3JpcHRvciAgICAgIGludGVycnVwdEluOwotICAgIERGVVJUX0lGX0RFU0NSSVBUT1JfU1RSVUNUCisJLy8vIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcgorCVVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yIGNvbmZpZ3VyYXRpb247CisJLy8vIEludGVyZmFjZSBkZXNjcmlwdG9yCisJVVNCSW50ZXJmYWNlRGVzY3JpcHRvciAgICAgaW50ZXJmYWNlOworCS8vLyBDQ0lEIGRlc2NyaXB0b3IKKwlDQ0lERGVzY3JpcHRvciAgICAgICAgICAgICBjY2lkOworCS8vLyBCdWxrIE9VVCBlbmRwb2ludCBkZXNjcmlwdG9yCisJVVNCRW5kcG9pbnREZXNjcmlwdG9yICAgICAgYnVsa091dDsKKwkvLy8gQnVsayBJTiBlbmRwb2ludCBkZXNjcmlwdG9yCisJVVNCRW5kcG9pbnREZXNjcmlwdG9yICAgICAgYnVsa0luOworCS8vLyBJbnRlcnJ1cHQgT1VUIGVuZHBvaW50IGRlc2NyaXB0b3IKKwlVU0JFbmRwb2ludERlc2NyaXB0b3IgICAgICBpbnRlcnJ1cHRJbjsKKwlERlVSVF9JRl9ERVNDUklQVE9SX1NUUlVDVAogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgQ0NJRERyaXZlckNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yczsKIAogZXh0ZXJuIGNvbnN0IFVTQkNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yICpjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNBcnJbXTsKZGlmZiAtLWdpdCBhL2Zpcm13YXJlL2xpYmNvbW1vbi9zb3VyY2UvY2NpZGRyaXZlci5jIGIvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9jY2lkZHJpdmVyLmMKaW5kZXggOGNmMjhjYS4uMWRiZGYyMyAxMDA2NDQKLS0tIGEvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9jY2lkZHJpdmVyLmMKKysrIGIvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9jY2lkZHJpdmVyLmMKQEAgLTgzLDI0ICs4MywyNCBAQAogLy8vIERyaXZlciBzdHJ1Y3R1cmUgZm9yIGFuIENDSUQgZGV2aWNlCiB0eXBlZGVmIHN0cnVjdCB7CiAKLSAgICAvLy8gQ0NJRCBtZXNzYWdlCi0gICAgU19jY2lkX2J1bGtfaW5faGVhZGVyICBzQ2NpZE1lc3NhZ2U7Ci0gICAgLy8vIENDSUQgY29tbWFuZAotICAgIFNfY2NpZF9idWxrX291dF9oZWFkZXIgc0NjaWRDb21tYW5kOwotICAgIC8vLyBJbnRlcnJ1cHQgbWVzc2FnZSBhbnN3ZXIKLSAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIEJ1ZmZlcklOVFs0XTsKLSAgICAvLy8gQnVmZmVyIGRhdGEgb2YgbWVzc2FnZQotICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgUHJvdG9jb2xEYXRhU3RydWN0dXJlWzEwXTsKLSAgICAvLy8gUHJvdG9jb2wgdXNlZAotICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgYlByb3RvY29sOwotICAgIC8vLyBTbG90U3RhdHVzCi0gICAgLy8vIEJpdCAwID0gU2xvdCAwIGN1cnJlbnQgc3RhdGUKLSAgICAvLy8gQml0IDEgPSBTbG90IDAgY2hhbmdlZCBzdGF0dXMKLSAgICAvLy8gQml0IDIgPSBTbG90IDEgY3VycmVudCBzdGF0ZQotICAgIC8vLyBCaXQgMyA9IFNsb3QgMSBjaGFuZ2VkIHN0YXR1cwotICAgIC8vLyBCaXQgNCA9IFNsb3QgMiBjdXJyZW50IHN0YXRlCi0gICAgLy8vIEJpdCA1ID0gU2xvdCAyIGNoYW5nZWQgc3RhdHVzCi0gICAgdW5zaWduZWQgY2hhciAgICAgICAgICBTbG90U3RhdHVzOworCS8vLyBDQ0lEIG1lc3NhZ2UKKwlTX2NjaWRfYnVsa19pbl9oZWFkZXIgIHNDY2lkTWVzc2FnZTsKKwkvLy8gQ0NJRCBjb21tYW5kCisJU19jY2lkX2J1bGtfb3V0X2hlYWRlciBzQ2NpZENvbW1hbmQ7CisJLy8vIEludGVycnVwdCBtZXNzYWdlIGFuc3dlcgorCXVuc2lnbmVkIGNoYXIgICAgICAgICAgQnVmZmVySU5UWzRdOworCS8vLyBCdWZmZXIgZGF0YSBvZiBtZXNzYWdlCisJdW5zaWduZWQgY2hhciAgICAgICAgICBQcm90b2NvbERhdGFTdHJ1Y3R1cmVbMTBdOworCS8vLyBQcm90b2NvbCB1c2VkCisJdW5zaWduZWQgY2hhciAgICAgICAgICBiUHJvdG9jb2w7CisJLy8vIFNsb3RTdGF0dXMKKwkvLy8gQml0IDAgPSBTbG90IDAgY3VycmVudCBzdGF0ZQorCS8vLyBCaXQgMSA9IFNsb3QgMCBjaGFuZ2VkIHN0YXR1cworCS8vLyBCaXQgMiA9IFNsb3QgMSBjdXJyZW50IHN0YXRlCisJLy8vIEJpdCAzID0gU2xvdCAxIGNoYW5nZWQgc3RhdHVzCisJLy8vIEJpdCA0ID0gU2xvdCAyIGN1cnJlbnQgc3RhdGUKKwkvLy8gQml0IDUgPSBTbG90IDIgY2hhbmdlZCBzdGF0dXMKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgIFNsb3RTdGF0dXM7CiAKIH0gQ0NJRERyaXZlcjsKIApAQCAtMTIxLDcgKzEyMSw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdm9pZCBDQ0lERHJpdmVyX0luaXRpYWxpemUoIHZvaWQgKQogewotICAgIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTID0gKENDSUREcml2ZXJDb25maWd1cmF0aW9uRGVzY3JpcHRvcnMgKikgY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzQXJyW0NGR19OVU1fQ0NJRC0xXTsKKwljb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUyA9IChDQ0lERHJpdmVyQ29uZmlndXJhdGlvbkRlc2NyaXB0b3JzICopIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0FycltDRkdfTlVNX0NDSUQtMV07CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMzcsMjUgKzEzNywyNSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIFJEUnRvUENTbG90U3RhdHVzKCB2b2lkICkKIHsKLSAgICAvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1NMT1RTVEFUVVM7Ci0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gMDsKKwkvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1NMT1RTVEFUVVM7CisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gMDsKIAotICAgIGlmIChjY2lkRHJpdmVyLlNsb3RTdGF0dXMgPT0gSUNDX0lOU0VSVEVEX0VWRU5UKSB7Ci0gICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOyAgICAvKiBJQ0MgcHJlc2VudCBhbmQgYWN0aXZlIGNhcmQgKi8KLSAgICB9IGVsc2UgaWYgKGNjaWREcml2ZXIuU2xvdFN0YXR1cyA9PSBJQ0NfTk9UX1BSRVNFTlQpIHsKLSAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDI7ICAgIC8qIE5vIElDQyBwcmVzZW50Ki8KLSAgICB9IGVsc2V7Ci0gICAgICAgIFRSQUNFX0VSUk9SKCJTdHJhbmdlIGJTdGF0dXMiKTsKLSAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7Ci0gICAgfQotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgICA9IDA7Ci0gICAgLy8gMDBoIENsb2NrIHJ1bm5pbmcKLSAgICAvLyAwMWggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBMCi0gICAgLy8gMDJoIENsb2NrIHN0b3BwZWQgaW4gc3RhdGUgSAotICAgIC8vIDAzaCBDbG9jayBzdG9wcGVkIGluIGFuIHVua25vd24gc3RhdGUKLSAgICAvLyBBbGwgb3RoZXIgdmFsdWVzIGFyZSBSZXNlcnZlZCBmb3IgRnV0dXJlIFVzZS4KLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOworCWlmIChjY2lkRHJpdmVyLlNsb3RTdGF0dXMgPT0gSUNDX0lOU0VSVEVEX0VWRU5UKSB7CisJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOyAgICAvKiBJQ0MgcHJlc2VudCBhbmQgYWN0aXZlIGNhcmQgKi8KKwl9IGVsc2UgaWYgKGNjaWREcml2ZXIuU2xvdFN0YXR1cyA9PSBJQ0NfTk9UX1BSRVNFTlQpIHsKKwkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDI7ICAgIC8qIE5vIElDQyBwcmVzZW50Ki8KKwl9IGVsc2V7CisJCVRSQUNFX0VSUk9SKCJTdHJhbmdlIGJTdGF0dXMiKTsKKwkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CisJfQorCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgICA9IDA7CisJLy8gMDBoIENsb2NrIHJ1bm5pbmcKKwkvLyAwMWggQ2xvY2sgc3RvcHBlZCBpbiBzdGF0ZSBMCisJLy8gMDJoIENsb2NrIHN0b3BwZWQgaW4gc3RhdGUgSAorCS8vIDAzaCBDbG9jayBzdG9wcGVkIGluIGFuIHVua25vd24gc3RhdGUKKwkvLyBBbGwgb3RoZXIgdmFsdWVzIGFyZSBSZXNlcnZlZCBmb3IgRnV0dXJlIFVzZS4KKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTY0LDcxICsxNjQsNzEgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YWJsb2NrX0FUUiggdm9pZCApCiB7Ci0gICAgdW5zaWduZWQgY2hhciBpOwotICAgIHVuc2lnbmVkIGNoYXIgQXRyW0FUUl9TSVpFX01BWF07Ci0gICAgdW5zaWduZWQgY2hhciBsZW5ndGg7Ci0gICAgdWludDMyX3Qgc3RhdHVzOyAKKwl1bnNpZ25lZCBjaGFyIGk7CisJdW5zaWduZWQgY2hhciBBdHJbQVRSX1NJWkVfTUFYXTsKKwl1bnNpZ25lZCBjaGFyIGxlbmd0aDsKKwl1aW50MzJfdCBzdGF0dXM7IAogCi0gICAgVFJBQ0VfREVCVUcoIi4iKTsKKwlUUkFDRV9ERUJVRygiLiIpOwogCi0gICAgc3RhdHVzID0gSVNPNzgxNl9EYXRhYmxvY2tfQVRSKCBBdHIsICZsZW5ndGggKTsKLSAgICBJU083ODE2X0RlY29kZV9BVFIoIEF0ciApOworCXN0YXR1cyA9IElTTzc4MTZfRGF0YWJsb2NrX0FUUiggQXRyLCAmbGVuZ3RoICk7CisJSVNPNzgxNl9EZWNvZGVfQVRSKCBBdHIgKTsKIAotICAgIGlmIChzdGF0dXMgPT0gMCkgewotICAgICAgICBUUkFDRV9ERUJVRygiVGltZW91dCBvY2N1cmVkIHdoaWxlIHJlYWRpbmcgQVRSIik7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCVRSQUNFX0RFQlVHKCJUaW1lb3V0IG9jY3VyZWQgd2hpbGUgcmVhZGluZyBBVFIiKTsKIC8vIEZJWE1FOiByZWFjdCBwcm9wZXJseSB0byB0aW1lb3V0Li4KIC8vICAgICAgICByZXR1cm47Ci0gICAgfQorCX0KIAogLy8gRklYTUU6IE1vcmUgdGVzdHM/IElzIGJQcm90b2NvbCA9IEF0clszXSA/Ci0gICAgaWYoIGxlbmd0aCA+IDUgKSB7Ci0gICAgICAgIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID0gQXRyWzNdJjB4MEY7IC8vIFREKDEpCi0gICAgICAgIGNjaWREcml2ZXIuYlByb3RvY29sID0gQXRyWzNdJjB4MEY7ICAgICAgICAgICAvLyBURCgxKQotICAgICAgICBUUkFDRV9JTkZPKCJQcm90b2NvbCBkYXRhIHN0cnVjdHVyZTogMHgleFxuXHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0pOwotICAgIH0KKwlpZiggbGVuZ3RoID4gNSApIHsKKwkJY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPSBBdHJbM10mMHgwRjsgLy8gVEQoMSkKKwkJY2NpZERyaXZlci5iUHJvdG9jb2wgPSBBdHJbM10mMHgwRjsgICAgICAgICAgIC8vIFREKDEpCisJCVRSQUNFX0lORk8oIlByb3RvY29sIGRhdGEgc3RydWN0dXJlOiAweCV4XG5cciIsCisJCQkJCSAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSk7CisJfQogCi0gICAgLy8gU19jY2lkX3Byb3RvY29sX3QwCi0gICAgLy8gYm1GaW5kZXhEaW5kZXgKLSAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVswXSA9IEF0clsyXTsgICAgIC8vIFRBKDEpCisJLy8gU19jY2lkX3Byb3RvY29sX3QwCisJLy8gYm1GaW5kZXhEaW5kZXgKKwljY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVswXSA9IEF0clsyXTsgICAgIC8vIFRBKDEpCiAKLSAgICAvLyBibVRDQ0tTVDAKLSAgICAvLyBGb3IgVD0wICxCMCCWIDBiLCBCNy0yIJYgMDAwMDAwYgotICAgIC8vIEIxIJYgQ29udmVudGlvbiB1c2VkIChiMT0wIGZvciBkaXJlY3QsIGIxPTEgZm9yIGludmVyc2UpCisJLy8gYm1UQ0NLU1QwCisJLy8gRm9yIFQ9MCAsQjAgliAwYiwgQjctMiCWIDAwMDAwMGIKKwkvLyBCMSCWIENvbnZlbnRpb24gdXNlZCAoYjE9MCBmb3IgZGlyZWN0LCBiMT0xIGZvciBpbnZlcnNlKQogCi0gICAgLy8gYkd1YXJkVGltZVQwCi0gICAgLy8gRXh0cmEgR3VhcmR0aW1lIGJldHdlZW4gdHdvIGNoYXJhY3RlcnMuIEFkZCAwIHRvIDI1NCBldHUgdG8gdGhlIG5vcm1hbCAKLSAgICAvLyBndWFyZHRpbWUgb2YgMTJldHUuIEZGaCBpcyB0aGUgc2FtZSBhcyAwMGguCi0gICAgY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMl0gPSBBdHJbNF07ICAgICAvLyBUQygxKQotICAgIC8vIEFUOTFDX0JBU0VfVVMwLT5VU19UVEdSID0gMDsgIC8vIFRDMQorCS8vIGJHdWFyZFRpbWVUMAorCS8vIEV4dHJhIEd1YXJkdGltZSBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzLiBBZGQgMCB0byAyNTQgZXR1IHRvIHRoZSBub3JtYWwgCisJLy8gZ3VhcmR0aW1lIG9mIDEyZXR1LiBGRmggaXMgdGhlIHNhbWUgYXMgMDBoLgorCWNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzJdID0gQXRyWzRdOyAgICAgLy8gVEMoMSkKKwkvLyBBVDkxQ19CQVNFX1VTMC0+VVNfVFRHUiA9IDA7ICAvLyBUQzEKIAotICAgIC8vIGJXYWl0aW5nSW50ZWdlclQwCi0gICAgLy8gV0kgZm9yIFQ9MCB1c2VkIHRvIGRlZmluZSBXV1QKLSAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVszXSA9IEF0cls3XTsgICAgIC8vIFRDKDIpCisJLy8gYldhaXRpbmdJbnRlZ2VyVDAKKwkvLyBXSSBmb3IgVD0wIHVzZWQgdG8gZGVmaW5lIFdXVAorCWNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzNdID0gQXRyWzddOyAgICAgLy8gVEMoMikKIAotICAgIC8vIGJDbG9ja1N0b3AKLSAgICAvLyBJQ0MgQ2xvY2sgU3RvcCBTdXBwb3J0Ci0gICAgLy8gMDAgPSBTdG9wcGluZyB0aGUgQ2xvY2sgaXMgbm90IGFsbG93ZWQKLSAgICAvLyAwMSA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgTG93Ci0gICAgLy8gMDIgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIEhpZ2gKLSAgICAvLyAwMyA9IFN0b3Agd2l0aCBDbG9jayBlaXRoZXIgSGlnaCBvciBMb3cKLSAgICBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVs0XSA9IDB4MDA7ICAgICAgIC8vIDAgdG8gMworCS8vIGJDbG9ja1N0b3AKKwkvLyBJQ0MgQ2xvY2sgU3RvcCBTdXBwb3J0CisJLy8gMDAgPSBTdG9wcGluZyB0aGUgQ2xvY2sgaXMgbm90IGFsbG93ZWQKKwkvLyAwMSA9IFN0b3Agd2l0aCBDbG9jayBzaWduYWwgTG93CisJLy8gMDIgPSBTdG9wIHdpdGggQ2xvY2sgc2lnbmFsIEhpZ2gKKwkvLyAwMyA9IFN0b3Agd2l0aCBDbG9jayBlaXRoZXIgSGlnaCBvciBMb3cKKwljY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVs0XSA9IDB4MDA7ICAgICAgIC8vIDAgdG8gMwogCi0gICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7Ci0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgICAgID0gbGVuZ3RoOyAgLy8gU2l6ZSBvZiBBVFIKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBsZW5ndGg7ICAvLyBTaXplIG9mIEFUUgotICAgIC8vIGJDaGFpblBhcmFtZXRlcjogMDAgdGhlIHJlc3BvbnNlIEFQRFUgYmVnaW5zIGFuZCBlbmRzIGluIHRoaXMgY29tbWFuZAotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyAgICA9IDA7CisJLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7CisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgICAgID0gbGVuZ3RoOyAgLy8gU2l6ZSBvZiBBVFIKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBsZW5ndGg7ICAvLyBTaXplIG9mIEFUUgorCS8vIGJDaGFpblBhcmFtZXRlcjogMDAgdGhlIHJlc3BvbnNlIEFQRFUgYmVnaW5zIGFuZCBlbmRzIGluIHRoaXMgY29tbWFuZAorCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyAgICA9IDA7CiAKLSAgICBmb3IoIGk9MDsgaTxsZW5ndGg7IGkrKyApIHsKKwlmb3IoIGk9MDsgaTxsZW5ndGg7IGkrKyApIHsKIAotICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbaV0gID0gQXRyW2ldOwotICAgIH0KKwkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhW2ldICA9IEF0cltpXTsKKwl9CiAKLSAgICAvLyBTZXQgdGhlIHNsb3QgdG8gYW4gYWN0aXZlIHN0YXR1cwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7CisJLy8gU2V0IHRoZSBzbG90IHRvIGFuIGFjdGl2ZSBzdGF0dXMKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjQzLDE3ICsyNDMsMTcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBSRFJ0b1BDRGF0YWJsb2NrKCB2b2lkICkKIHsKLSAgICAvL1RSQUNFX0RFQlVHKCIuIik7CisJLy9UUkFDRV9ERUJVRygiLiIpOwogCi0gICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBQkxPQ0s7Ci0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgKz0gY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aDsKLSAgICAvLyBiQ2hhaW5QYXJhbWV0ZXI6IDAwIHRoZSByZXNwb25zZSBBUERVIGJlZ2lucyBhbmQgZW5kcyBpbiB0aGlzIGNvbW1hbmQKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOworCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfREFUQUJMT0NLOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kICs9IGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGg7CisJLy8gYkNoYWluUGFyYW1ldGVyOiAwMCB0aGUgcmVzcG9uc2UgQVBEVSBiZWdpbnMgYW5kIGVuZHMgaW4gdGhpcyBjb21tYW5kCisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsKIAotICAgIC8vIFNldCB0aGUgc2xvdCB0byBhbiBhY3RpdmUgc3RhdHVzCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7Ci0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKKwkvLyBTZXQgdGhlIHNsb3QgdG8gYW4gYWN0aXZlIHN0YXR1cworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciA9IDA7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNjUsMzQgKzI2NSwzNCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIFJEUnRvUENQYXJhbWV0ZXJzKCB2b2lkICkKIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAotICAgIFRSQUNFX0RFQlVHKCIuIik7CisJVFJBQ0VfREVCVUcoIi4iKTsKIAotICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfUEFSQU1FVEVSUzsKKwkvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1BBUkFNRVRFUlM7CiAKLSAgICAvL2NjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOworCS8vY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7CiAKLSAgICBpZiggY2NpZERyaXZlci5Qcm90b2NvbERhdGFTdHJ1Y3R1cmVbMV0gPT0gUFJPVE9DT0xfVE8gKSB7CisJaWYoIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID09IFBST1RPQ09MX1RPICkgewogCi0gICAgICAgIC8vIFQ9MAotICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoICAgPSBzaXplb2YoU19jY2lkX3Byb3RvY29sX3QwKTsKLSAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gUFJPVE9DT0xfVE87Ci0gICAgfQotICAgIGVsc2UgeworCQkvLyBUPTAKKwkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gc2l6ZW9mKFNfY2NpZF9wcm90b2NvbF90MCk7CisJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IFBST1RPQ09MX1RPOworCX0KKwllbHNlIHsKIAotICAgICAgICAvLyBUPTEKLSAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gc2l6ZW9mKFNfY2NpZF9wcm90b2NvbF90MSk7Ci0gICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTcGVjaWZpYyA9IFBST1RPQ09MX1QxOwotICAgIH0KKwkJLy8gVD0xCisJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IHNpemVvZihTX2NjaWRfcHJvdG9jb2xfdDEpOworCQljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSBQUk9UT0NPTF9UMTsKKwl9CiAKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCArPSBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTaXplVG9TZW5kICs9IGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGg7CiAKLSAgICBmb3IoIGk9MDsgaTxjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlW2ldOwotICAgIH0KKwlmb3IoIGk9MDsgaTxjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoOyBpKysgKSB7CisJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlW2ldOworCX0KIAogfQogCkBAIC0zMDMsMjMgKzMwMywyMyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIFJEUnRvUENFc2NhcGUoIHVuc2lnbmVkIGNoYXIgbGVuZ3RoLCB1bnNpZ25lZCBjaGFyICpkYXRhX3NlbmRfZnJvbV9DQ0lEICkKIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAotICAgIFRSQUNFX0RFQlVHKCIuIik7CisJVFJBQ0VfREVCVUcoIi4iKTsKIAotICAgIC8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfRVNDQVBFOworCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfRVNDQVBFOwogCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gbGVuZ3RoOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IGxlbmd0aDsKIAotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOwogCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsgIC8vIGJSRlUKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOyAgLy8gYlJGVQogCi0gICAgZm9yKCBpPTA7IGk8bGVuZ3RoOyBpKysgKSB7Ci0gICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVtpXSA9IGRhdGFfc2VuZF9mcm9tX0NDSURbaV07Ci0gICAgfQorCWZvciggaT0wOyBpPGxlbmd0aDsgaSsrICkgeworCQljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbaV0gPSBkYXRhX3NlbmRfZnJvbV9DQ0lEW2ldOworCX0KIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMyOCwyMyArMzI4LDIzIEBACiAvLy8gICBQQ190b19SRFJfU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIFJEUnRvUENEYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCB1bnNpZ25lZCBpbnQgZHdDbG9ja0ZyZXF1ZW5jeSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHdEYXRhUmF0ZSApCisJCQkJCSAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHdEYXRhUmF0ZSApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIi4iKTsKKwlUUkFDRV9ERUJVRygiLiIpOwogCi0gICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19EQVRBUkFURUFORENMT0NLRlJFUVVFTkNZOworCS8vIEhlYWRlciBmaWVsZHMgc2V0dGluZ3MKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iTWVzc2FnZVR5cGUgPSBSRFJfVE9fUENfREFUQVJBVEVBTkRDTE9DS0ZSRVFVRU5DWTsKIAotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICA9IDg7CisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgID0gODsKIAotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAwOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOwogCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljID0gMDsgIC8vIGJSRlUKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgPSAwOyAgLy8gYlJGVQogCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzBdID0gZHdDbG9ja0ZyZXF1ZW5jeTsKLSAgICAKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbNF0gPSBkd0RhdGFSYXRlOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVswXSA9IGR3Q2xvY2tGcmVxdWVuY3k7CisJCisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzRdID0gZHdEYXRhUmF0ZTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM1NCwyNyArMzU0LDI3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgUEN0b1JEUkljY1Bvd2VyT24oIHZvaWQgKQogewotICAgIFRSQUNFX0RFQlVHKCIuIik7Ci0gICAgaWYoIENDSURfRkVBVFVSRVNfQVVUT19WT0xUID09IChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzICYgQ0NJRF9GRUFUVVJFU19BVVRPX1ZPTFQpICkgeworCVRSQUNFX0RFQlVHKCIuIik7CisJaWYoIENDSURfRkVBVFVSRVNfQVVUT19WT0xUID09IChjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzICYgQ0NJRF9GRUFUVVJFU19BVVRPX1ZPTFQpICkgewogCi0gICAgICAgIC8vYlBvd2VyU2VsZWN0ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzA7Ci0gICAgICAgIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wID0gVk9MVFNfQVVUTzsKLSAgICB9CisJCS8vYlBvd2VyU2VsZWN0ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzA7CisJCWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wID0gVk9MVFNfQVVUTzsKKwl9CiAKLSAgICBJU083ODE2X3dhcm1fcmVzZXQoKTsKKwlJU083ODE2X3dhcm1fcmVzZXQoKTsKIC8vICAgIElTTzc4MTZfY29sZF9yZXNldCgpOwogCi0gICAgLy8gZm9yIGVtdWxhdGlvbiBvbmx5IC8vSkNCIAotICAgIGlmICggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAgIT0gVk9MVFNfNV8wICkgeworCS8vIGZvciBlbXVsYXRpb24gb25seSAvL0pDQiAKKwlpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wICE9IFZPTFRTXzVfMCApIHsKIAotICAgICAgICBUUkFDRV9FUlJPUigiUE9XRVJfTk9UX1NVUFBPUlRFRFxuXHIiKTsKLSAgICB9CisJCVRSQUNFX0VSUk9SKCJQT1dFUl9OT1RfU1VQUE9SVEVEXG5cciIpOworCX0KIAotICAgIGVsc2UgeworCWVsc2UgewogCi0gICAgICAgIFJEUnRvUENEYXRhYmxvY2tfQVRSKCk7CisJCVJEUnRvUENEYXRhYmxvY2tfQVRSKCk7CiAKLSAgICB9CisJfQogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzg0LDIzICszODQsMjMgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBQQ3RvUkRSSWNjUG93ZXJPZmYoIHZvaWQgKQogewotICAgIHVuc2lnbmVkIGNoYXIgYlN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CiAKLSAgICBUUkFDRV9ERUJVRygiLiIpOworCVRSQUNFX0RFQlVHKCIuIik7CiAKLSAgICBJU083ODE2X0ljY1Bvd2VyT2ZmKCk7CisJSVNPNzgxNl9JY2NQb3dlck9mZigpOwogCi0gICAgLy9KQ0Igc3R1YgotICAgIGJTdGF0dXMgPSBJQ0NfQlNfUFJFU0VOVF9OT1RBQ1RJVkFURUQ7CisJLy9KQ0Igc3R1YgorCWJTdGF0dXMgPSBJQ0NfQlNfUFJFU0VOVF9OT1RBQ1RJVkFURUQ7CiAKLSAgICAvLyBTZXQgdGhlIHNsb3QgdG8gYW4gaW5hY3RpdmUgc3RhdHVzCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7Ci0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKKwkvLyBTZXQgdGhlIHNsb3QgdG8gYW4gaW5hY3RpdmUgc3RhdHVzCisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7CisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKIAotICAgIC8vIGlmIGVycm9yLCBzZWUgVGFibGUgNi4xLTIgZXJyb3JzCisJLy8gaWYgZXJyb3IsIHNlZSBUYWJsZSA2LjEtMiBlcnJvcnMKIAotICAgIC8vIFJldHVybiB0aGUgc2xvdCBzdGF0dXMgdG8gdGhlIGhvc3QKLSAgICBSRFJ0b1BDU2xvdFN0YXR1cygpOworCS8vIFJldHVybiB0aGUgc2xvdCBzdGF0dXMgdG8gdGhlIGhvc3QKKwlSRFJ0b1BDU2xvdFN0YXR1cygpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDA5LDEzICs0MDksMTMgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBQQ3RvUkRSR2V0U2xvdFN0YXR1cyggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIi4iKTsKKwlUUkFDRV9ERUJVRygiLiIpOwogCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDA7Ci0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yID0gMDsKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iRXJyb3IgPSAwOwogCi0gICAgLy8gUmV0dXJuIHRoZSBzbG90IHN0YXR1cyB0byB0aGUgaG9zdAotICAgIFJEUnRvUENTbG90U3RhdHVzKCk7CisJLy8gUmV0dXJuIHRoZSBzbG90IHN0YXR1cyB0byB0aGUgaG9zdAorCVJEUnRvUENTbG90U3RhdHVzKCk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MjUsNjkgKzQyNSw2OSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIFBDdG9SRFJYZnJCbG9jayggdm9pZCApCiB7Ci0gICAgdWludDE2X3QgbXNnbGVuID0gMDsKLSAgICB1aW50MzJfdCByZXQ7CisJdWludDE2X3QgbXNnbGVuID0gMDsKKwl1aW50MzJfdCByZXQ7CiAKLSAgICBUUkFDRV9ERUJVRygiUEN0b1JEUlhmckJsb2NrXG4iKTsKKwlUUkFDRV9ERUJVRygiUEN0b1JEUlhmckJsb2NrXG4iKTsKIAotICAgIC8vIENoZWNrIHRoZSBibG9jayBsZW5ndGgKLSAgICBpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLndMZW5ndGggPiAoY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdNYXhDQ0lETWVzc2FnZUxlbmd0aC0xMCkgKSB7Ci0gICAgICAgIFRSQUNFX0RFQlVHKCJFcnIgYmxvY2svbXNnIGxlbiIpOwotICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMTsKLSAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYkVycm9yICA9IDA7Ci0gICAgfQotICAgIC8vIGNoZWNrIGJCV0kKLSAgICBlbHNlIGlmICggMCAhPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKKwkvLyBDaGVjayB0aGUgYmxvY2sgbGVuZ3RoCisJaWYgKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoID4gKGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3TWF4Q0NJRE1lc3NhZ2VMZW5ndGgtMTApICkgeworCQlUUkFDRV9ERUJVRygiRXJyIGJsb2NrL21zZyBsZW4iKTsKKwkJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyA9IDE7CisJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJFcnJvciAgPSAwOworCX0KKwkvLyBjaGVjayBiQldJCisJZWxzZSBpZiAoIDAgIT0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAgKSB7CiAKLSAgICAgICAgIFRSQUNFX0VSUk9SKCJCYWQgYkJXSVxuXHIiKTsKLSAgICB9Ci0gICAgZWxzZSB7CisJCSBUUkFDRV9FUlJPUigiQmFkIGJCV0lcblxyIik7CisJfQorCWVsc2UgewogCi0gICAgICAgIC8vIEFQRFUgb3IgVFBEVQotICAgICAgICBzd2l0Y2goY29uZmlndXJhdGlvbkRlc2NyaXB0b3JzRlMtPmNjaWQuZHdGZWF0dXJlcyAKLSAgICAgICAgICAgICAgJiAoQ0NJRF9GRUFUVVJFU19FWENfVFBEVXxDQ0lEX0ZFQVRVUkVTX0VYQ19TQVBEVXxDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVKSkgeworCQkvLyBBUERVIG9yIFRQRFUKKwkJc3dpdGNoKGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMgCisJCQkgICYgKENDSURfRkVBVFVSRVNfRVhDX1RQRFV8Q0NJRF9GRUFUVVJFU19FWENfU0FQRFV8Q0NJRF9GRUFUVVJFU19FWENfQVBEVSkpIHsKIAotICAgICAgICAgICAgY2FzZSBDQ0lEX0ZFQVRVUkVTX0VYQ19UUERVOgotICAgICAgICAgICAgICAgIGlmIChjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSA9PSBQUk9UT0NPTF9UTykgewotICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiQVBEVSBjbWQ6ICV4ICV4ICV4IC4uIiwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVswXSwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsxXSxjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzJdICk7CisJCQljYXNlIENDSURfRkVBVFVSRVNfRVhDX1RQRFU6CisJCQkJaWYgKGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID09IFBST1RPQ09MX1RPKSB7CisJCQkJCVRSQUNFX0RFQlVHKCJBUERVIGNtZDogJXggJXggJXggLi4iLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzBdLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzFdLGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMl0gKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGNvbW1hbmRlIEFQRFUKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gSVNPNzgxNl9YZnJCbG9ja1RQRFVfVDAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFUgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLndMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dsZW4gKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9FUlJPUigiQVBEVSBjb3VsZCBub3QgYmUgc2VudDogKFVTX0NTUiA9IDB4JXgpIiwgcmV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdID09IFBST1RPQ09MX1QxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZCBUPTFcblxyIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZCAweCV4XG5cciIsIGNjaWREcml2ZXIuUHJvdG9jb2xEYXRhU3RydWN0dXJlWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKKwkJCQkJLy8gU2VuZCBjb21tYW5kZSBBUERVCisJCQkJCXJldCA9IElTTzc4MTZfWGZyQmxvY2tUUERVX1QwKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVICwKKwkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAmbXNnbGVuICk7CisJCQkJCWlmIChyZXQgIT0gMCkgeworCQkJCQkgICAgVFJBQ0VfRVJST1IoIkFQRFUgY291bGQgbm90IGJlIHNlbnQ6IChVU19DU1IgPSAweCV4KSIsIHJldCk7CisJCQkJCSAgICByZXR1cm47CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWlmIChjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSA9PSBQUk9UT0NPTF9UMSkgeworCQkJCQkgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQgVD0xXG5cciIpOworCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkgICAgVFJBQ0VfREVCVUcoIk5vdCBzdXBwb3J0ZWQgMHgleFxuXHIiLCBjY2lkRHJpdmVyLlByb3RvY29sRGF0YVN0cnVjdHVyZVsxXSk7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgQ0NJRF9GRUFUVVJFU19FWENfQVBEVToKLSAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZCBDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVXG5cciIpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSBDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVOgorCQkJCVRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkIENDSURfRkVBVFVSRVNfRVhDX0FQRFVcblxyIik7CisJCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KIAotICAgIH0KKwl9CiAKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS53TGVuZ3RoID0gbXNnbGVuOwotICAgIFRSQUNFX0RFQlVHKCJVU0I6IDB4JVgsIDB4JVgsIDB4JVgsIDB4JVgsIDB4JVhcblxyIiwgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzBdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzFdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzJdLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYWJEYXRhWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbNF0gKTsKLSAgICAgUkRSdG9QQ0RhdGFibG9jaygpOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggPSBtc2dsZW47CisJVFJBQ0VfREVCVUcoIlVTQjogMHglWCwgMHglWCwgMHglWCwgMHglWCwgMHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMF0sIAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMV0sIAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbMl0sIAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5hYkRhdGFbM10sCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmFiRGF0YVs0XSApOworCSBSRFJ0b1BDRGF0YWJsb2NrKCk7CiAKIH0KIApAQCAtNDk3LDIxICs0OTcsMjEgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBQQ3RvUkRSR2V0UGFyYW1ldGVycyggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIi4iKTsKKwlUUkFDRV9ERUJVRygiLiIpOwogCi0gICAgLy8gV2Ugc3VwcG9ydCBvbmx5IG9uZSBzbG90CisJLy8gV2Ugc3VwcG9ydCBvbmx5IG9uZSBzbG90CiAKLSAgICAvLyBibUljY1N0YXR1cwotICAgIGlmKCBJU083ODE2X1N0YXR1c1Jlc2V0KCkgKSB7Ci0gICAgICAgIC8vIDA6IEFuIElDQyBpcyBwcmVzZW50IGFuZCBhY3RpdmUgKHBvd2VyIGlzIG9uIGFuZCBzdGFibGUsIFJTVCBpcyBpbmFjdGl2ZQotICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIDE6IEFuIElDQyBpcyBwcmVzZW50IGFuZCBpbmFjdGl2ZSAobm90IGFjdGl2YXRlZCBvciBzaHV0IGRvd24gYnkgaGFyZHdhcmUgZXJyb3IpCi0gICAgICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAxOwotICAgIH0KKwkvLyBibUljY1N0YXR1cworCWlmKCBJU083ODE2X1N0YXR1c1Jlc2V0KCkgKSB7CisJCS8vIDA6IEFuIElDQyBpcyBwcmVzZW50IGFuZCBhY3RpdmUgKHBvd2VyIGlzIG9uIGFuZCBzdGFibGUsIFJTVCBpcyBpbmFjdGl2ZQorCQljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKKwl9CisJZWxzZSB7CisJCS8vIDE6IEFuIElDQyBpcyBwcmVzZW50IGFuZCBpbmFjdGl2ZSAobm90IGFjdGl2YXRlZCBvciBzaHV0IGRvd24gYnkgaGFyZHdhcmUgZXJyb3IpCisJCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSAxOworCX0KIAotICAgIFJEUnRvUENQYXJhbWV0ZXJzKCk7CisJUkRSdG9QQ1BhcmFtZXRlcnMoKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUyMCwxMiArNTIwLDEyIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgUEN0b1JEUlJlc2V0UGFyYW1ldGVycyggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIi4iKTsKKwlUUkFDRV9ERUJVRygiLiIpOwogCi0gICAgY2NpZERyaXZlci5TbG90U3RhdHVzID0gSUNDX05PVF9QUkVTRU5UOwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CisJY2NpZERyaXZlci5TbG90U3RhdHVzID0gSUNDX05PVF9QUkVTRU5UOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgPSBjY2lkRHJpdmVyLlNsb3RTdGF0dXM7CiAKLSAgICBSRFJ0b1BDUGFyYW1ldGVycygpOworCVJEUnRvUENQYXJhbWV0ZXJzKCk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01MzQsMTMgKzUzNCwxMyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIFBDdG9SRFJTZXRQYXJhbWV0ZXJzKCB2b2lkICkKIHsKLSAgICBUUkFDRV9ERUJVRygiLiIpOworCVRSQUNFX0RFQlVHKCIuIik7CiAKLSAgICBjY2lkRHJpdmVyLlNsb3RTdGF0dXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdDsKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gY2NpZERyaXZlci5TbG90U3RhdHVzOwotICAgIC8vIE5vdCBhbGwgZmVhdHVyZSBzdXBwb3J0ZWQKKwljY2lkRHJpdmVyLlNsb3RTdGF0dXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2xvdDsKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gY2NpZERyaXZlci5TbG90U3RhdHVzOworCS8vIE5vdCBhbGwgZmVhdHVyZSBzdXBwb3J0ZWQKIAotICAgIFJEUnRvUENQYXJhbWV0ZXJzKCk7CisJUkRSdG9QQ1BhcmFtZXRlcnMoKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU1MSwxMyArNTUxLDEzIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgUEN0b1JEUkVzY2FwZSggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIi4iKTsKKwlUUkFDRV9ERUJVRygiLiIpOwogCi0gICAgLy8gSWYgbmVlZGVkIGJ5IHRoZSB1c2VyCi0gICAgSVNPNzgxNl9Fc2NhcGUoKTsKKwkvLyBJZiBuZWVkZWQgYnkgdGhlIHVzZXIKKwlJU083ODE2X0VzY2FwZSgpOwogCi0gICAgLy8gc3R1YiwgcmV0dXJuIGFsbCB2YWx1ZSBzZW5kCi0gICAgUkRSdG9QQ0VzY2FwZSggY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCwgY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVSk7ICAgIAorCS8vIHN0dWIsIHJldHVybiBhbGwgdmFsdWUgc2VuZAorCVJEUnRvUENFc2NhcGUoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLndMZW5ndGgsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFUpOyAgICAKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU2NiwxOCArNTY2LDE4IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgUEN0b1JEUklDQ0Nsb2NrKCB2b2lkICkKIHsKLSAgICBUUkFDRV9ERUJVRygiLiIpOworCVRSQUNFX0RFQlVHKCIuIik7CiAKLSAgICBpZiggMCA9PSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKLSAgICAgICAgLy8gcmVzdGFydHMgdGhlIGNsb2NrCi0gICAgICAgIElTTzc4MTZfUmVzdGFydENsb2NrKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvLyBzdG9wIGNsb2NrIGluIHRoZSBzdGF0ZSBzaG93biBpbiB0aGUgYkNsb2NrU3RvcCBmaWVsZAotICAgICAgICBJU083ODE2X1N0b3BDbG9jaygpOwotICAgIH0KKwlpZiggMCA9PSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMCApIHsKKwkJLy8gcmVzdGFydHMgdGhlIGNsb2NrCisJCUlTTzc4MTZfUmVzdGFydENsb2NrKCk7CisJfQorCWVsc2UgeworCQkvLyBzdG9wIGNsb2NrIGluIHRoZSBzdGF0ZSBzaG93biBpbiB0aGUgYkNsb2NrU3RvcCBmaWVsZAorCQlJU083ODE2X1N0b3BDbG9jaygpOworCX0KIAotICAgIFJEUnRvUENTbG90U3RhdHVzKCApOyAgICAKKwlSRFJ0b1BDU2xvdFN0YXR1cyggKTsgICAgCiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01ODcsMjIgKzU4NywyMiBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIFBDdG9SRFJ0b0FQRFUoIHZvaWQgKQogewotICAgIHVuc2lnbmVkIGNoYXIgYm1DaGFuZ2VzOwotICAgIHVuc2lnbmVkIGNoYXIgYkNsYXNzR2V0UmVzcG9uc2U7Ci0gICAgdW5zaWduZWQgY2hhciBiQ2xhc3NFbnZlbG9wZTsKKwl1bnNpZ25lZCBjaGFyIGJtQ2hhbmdlczsKKwl1bnNpZ25lZCBjaGFyIGJDbGFzc0dldFJlc3BvbnNlOworCXVuc2lnbmVkIGNoYXIgYkNsYXNzRW52ZWxvcGU7CiAKLSAgICBUUkFDRV9JTkZPKCIuIik7CisJVFJBQ0VfSU5GTygiLiIpOwogCi0gICAgaWYoIGNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVfENDSURfRkVBVFVSRVNfRVhDX0FQRFUpICkgeworCWlmKCBjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzID09IChDQ0lEX0ZFQVRVUkVTX0VYQ19TQVBEVXxDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVKSApIHsKIAotICAgICAgICBibUNoYW5nZXMgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMDsKLSAgICAgICAgYkNsYXNzR2V0UmVzcG9uc2UgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMTsKLSAgICAgICAgYkNsYXNzRW52ZWxvcGUgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMjsKKwkJYm1DaGFuZ2VzID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzA7CisJCWJDbGFzc0dldFJlc3BvbnNlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzE7CisJCWJDbGFzc0VudmVsb3BlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzI7CiAKLSAgICAgICAgSVNPNzgxNl90b0FQRFUoKTsKLSAgICB9CisJCUlTTzc4MTZfdG9BUERVKCk7CisJfQogCi0gICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsgICAgCisJUkRSdG9QQ1Nsb3RTdGF0dXMoKTsgICAgCiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MTIsOSArNjEyLDkgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBQQ3RvUkRSU2VjdXJlKCB2b2lkICkKIHsKLSAgICBUUkFDRV9ERUJVRygiLiIpOworCVRSQUNFX0RFQlVHKCIuIik7CiAKLSAgICBUUkFDRV9ERUJVRygiRm9yIHVzZXJcblxyIik7CisJVFJBQ0VfREVCVUcoIkZvciB1c2VyXG5cciIpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjI3LDEwICs2MjcsMTAgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBQQ3RvUkRSTWVjaGFuaWNhbCggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIi4iKTsKLSAgICBUUkFDRV9ERUJVRygiTm90IGltcGxlbWVudGVkXG5cciIpOworCVRSQUNFX0RFQlVHKCIuIik7CisJVFJBQ0VfREVCVUcoIk5vdCBpbXBsZW1lbnRlZFxuXHIiKTsKIAotICAgIFJEUnRvUENTbG90U3RhdHVzKCk7CisJUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTY0MSw5ICs2NDEsOSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIFBDdG9SRFJBYm9ydCggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIi4iKTsKKwlUUkFDRV9ERUJVRygiLiIpOwogCi0gICAgUkRSdG9QQ1Nsb3RTdGF0dXMoKTsKKwlSRFJ0b1BDU2xvdFN0YXR1cygpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjUzLDI0ICs2NTMsMjQgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCBQQ3RvUkRSU2V0RGF0YVJhdGVBbmRDbG9ja0ZyZXF1ZW5jeSggdm9pZCApCiB7Ci0gICAgdW5zaWduZWQgaW50IGR3Q2xvY2tGcmVxdWVuY3k7Ci0gICAgdW5zaWduZWQgaW50IGR3RGF0YVJhdGU7CisJdW5zaWduZWQgaW50IGR3Q2xvY2tGcmVxdWVuY3k7CisJdW5zaWduZWQgaW50IGR3RGF0YVJhdGU7CiAKLSAgICBUUkFDRV9ERUJVRygiLiIpOworCVRSQUNFX0RFQlVHKCIuIik7CiAKLSAgICBkd0Nsb2NrRnJlcXVlbmN5ID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVswXQotICAgICAgICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsxXTw8OCkKLSAgICAgICAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbMl08PDE2KQotICAgICAgICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVszXTw8MjQpOworCWR3Q2xvY2tGcmVxdWVuY3kgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzBdCisJCQkJCSArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzFdPDw4KQorCQkJCQkgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVsyXTw8MTYpCisJCQkJCSArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzNdPDwyNCk7CiAKLSAgICBkd0RhdGFSYXRlID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs0XQotICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs1XTw8OCkKLSAgICAgICAgICAgICAgICsgKGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLkFQRFVbNl08PDE2KQotICAgICAgICAgICAgICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs3XTw8MjQpOworCWR3RGF0YVJhdGUgPSBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzRdCisJCQkgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzVdPDw4KQorCQkJICAgKyAoY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuQVBEVVs2XTw8MTYpCisJCQkgICArIChjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5BUERVWzddPDwyNCk7CiAKLSAgICBJU083ODE2X1NldERhdGFSYXRlYW5kQ2xvY2tGcmVxdWVuY3koIGR3Q2xvY2tGcmVxdWVuY3ksIGR3RGF0YVJhdGUgKTsKKwlJU083ODE2X1NldERhdGFSYXRlYW5kQ2xvY2tGcmVxdWVuY3koIGR3Q2xvY2tGcmVxdWVuY3ksIGR3RGF0YVJhdGUgKTsKIAotICAgIFJEUnRvUENEYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCBkd0Nsb2NrRnJlcXVlbmN5LCBkd0RhdGFSYXRlICk7CisJUkRSdG9QQ0RhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3koIGR3Q2xvY2tGcmVxdWVuY3ksIGR3RGF0YVJhdGUgKTsKIAogfQogCkBAIC02NzksMjAgKzY3OSwyMCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIHZDQ0lEQ29tbWFuZE5vdFN1cHBvcnRlZCggdm9pZCApCiB7Ci0gICAgLy8gQ29tbWFuZCBub3Qgc3VwcG9ydGVkCi0gICAgLy8gdkNDSURSZXBvcnRFcnJvcihDTURfTk9UX1NVUFBPUlRFRCk7CisJLy8gQ29tbWFuZCBub3Qgc3VwcG9ydGVkCisJLy8gdkNDSURSZXBvcnRFcnJvcihDTURfTk9UX1NVUFBPUlRFRCk7CiAKLSAgICBUUkFDRV9ERUJVRygiQ01EX05PVF9TVVBQT1JURURcblxyIik7CisJVFJBQ0VfREVCVUcoIkNNRF9OT1RfU1VQUE9SVEVEXG5cciIpOwogCi0gICAgLy8gSGVhZGVyIGZpZWxkcyBzZXR0aW5ncwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJNZXNzYWdlVHlwZSA9IFJEUl9UT19QQ19TTE9UU1RBVFVTOwotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLndMZW5ndGggICAgICA9IDA7Ci0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNwZWNpZmljICAgID0gMDsKKwkvLyBIZWFkZXIgZmllbGRzIHNldHRpbmdzCisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYk1lc3NhZ2VUeXBlID0gUkRSX1RPX1BDX1NMT1RTVEFUVVM7CisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2Uud0xlbmd0aCAgICAgID0gMDsKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3BlY2lmaWMgICAgPSAwOwogCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlN0YXR1cyB8PSBJQ0NfQ1NfRkFJTEVEOworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTdGF0dXMgfD0gSUNDX0NTX0ZBSUxFRDsKIAotICAgIC8vIFNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSBob3N0Ci0gICAgLy92Q0NJRFNlbmRSZXNwb25zZSgpOworCS8vIFNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSBob3N0CisJLy92Q0NJRFNlbmRSZXNwb25zZSgpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzAwLDE1ICs3MDAsMTUgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzdGF0aWMgdm9pZCB2Q0NJRFNlbmRSZXNwb25zZSggdm9pZCApCiB7Ci0gICAgdW5zaWduZWQgY2hhciBiU3RhdHVzOwotICAgIFRSQUNFX0RFQlVHKCIuIik7CisJdW5zaWduZWQgY2hhciBiU3RhdHVzOworCVRSQUNFX0RFQlVHKCIuIik7CiAKLSAgICBkbyB7Ci0gICAgICAgIGJTdGF0dXMgPSBDQ0lEX1dyaXRlKCh2b2lkKikmY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2l6ZVRvU2VuZCwgMCwgMCApOwotICAgIH0gd2hpbGUgKGJTdGF0dXMgIT0gVVNCRF9TVEFUVVNfU1VDQ0VTUyk7CisJZG8geworCQliU3RhdHVzID0gQ0NJRF9Xcml0ZSgodm9pZCopJmNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLAorCQkJCQkgICAgICAgICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQsIDAsIDAgKTsKKwl9IHdoaWxlIChiU3RhdHVzICE9IFVTQkRfU1RBVFVTX1NVQ0NFU1MpOwogCi0gICAgVFJBQ0VfREVCVUcoImJTdGF0dXM6IDB4JXhcblxyIiwgYlN0YXR1cyk7CisJVFJBQ0VfREVCVUcoImJTdGF0dXM6IDB4JXhcblxyIiwgYlN0YXR1cyk7CiB9CiAKIApAQCAtNzE3LDEzMyArNzE3LDEzMyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHN0YXRpYyB2b2lkIENDSURDb21tYW5kRGlzcGF0Y2hlciggdm9pZCAqcEFyZywgdWludDhfdCBzdGF0dXMsIHVpbnQzMl90IHRyYW5zZmVycmVkLCB1aW50MzJfdCByZW1haW5pbmcgKQogewotICAgIHVuc2lnbmVkIGNoYXIgTWVzc2FnZVRvU2VuZCA9IDA7CisJdW5zaWduZWQgY2hhciBNZXNzYWdlVG9TZW5kID0gMDsKIAotICAgIGlmIChzdGF0dXMgIT0gVVNCRF9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgICBUUkFDRV9FUlJPUigiVVNCIGVycm9yOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgVFJBQ0VfREVCVUcoIkNvbW1hbmQ6IDB4JVggMHgleCAweCVYIDB4JVggMHglWCAweCVYIDB4JVhcblxyXG5cciIsCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC53TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNsb3QsCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU2VxLAotICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzAsCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMSwKLSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18yKTsKKwlpZiAoc3RhdHVzICE9IFVTQkRfU1RBVFVTX1NVQ0NFU1MpIHsKKwkJVFJBQ0VfRVJST1IoIlVTQiBlcnJvcjogJWQiLCBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCVRSQUNFX0RFQlVHKCJDb21tYW5kOiAweCVYIDB4JXggMHglWCAweCVYIDB4JVggMHglWCAweCVYXG5cclxuXHIiLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYk1lc3NhZ2VUeXBlLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQud0xlbmd0aCwKKwkJCQkgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90LAorCQkJCSAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcSwKKwkJCQkgICAodW5zaWduZWQgaW50KWNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTcGVjaWZpY18wLAorCQkJCSAgICh1bnNpZ25lZCBpbnQpY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNwZWNpZmljXzEsCisJCQkJICAgKHVuc2lnbmVkIGludCljY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iU3BlY2lmaWNfMik7CiAKLSAgICAvLyBDaGVjayB0aGUgc2xvdCBudW1iZXIKLSAgICBpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90ID4gMCApIHsKKwkvLyBDaGVjayB0aGUgc2xvdCBudW1iZXIKKwlpZiAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90ID4gMCApIHsKIAotICAgICAgICBUUkFDRV9FUlJPUigiQkFEX1NMT1RfTlVNQkVSXG5cciIpOwotICAgIH0KKwkJVFJBQ0VfRVJST1IoIkJBRF9TTE9UX05VTUJFUlxuXHIiKTsKKwl9CiAKLSAgICBUUkFDRV9JTkZPKCJ0eXA9MHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUpOworCVRSQUNFX0lORk8oInR5cD0weCVYXG5cciIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSk7CiAKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU3RhdHVzID0gMDsKIAotICAgIGNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTZXEgID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcTsKLSAgICBjY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2xvdCA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90OworCWNjaWREcml2ZXIuc0NjaWRNZXNzYWdlLmJTZXEgID0gY2NpZERyaXZlci5zQ2NpZENvbW1hbmQuYlNlcTsKKwljY2lkRHJpdmVyLnNDY2lkTWVzc2FnZS5iU2xvdCA9IGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJTbG90OwogCi0gICAgY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgPSBzaXplb2YoU19jY2lkX2J1bGtfaW5faGVhZGVyKS0oQUJEQVRBX1NJWkUrMSk7CisJY2NpZERyaXZlci5zQ2NpZE1lc3NhZ2UuYlNpemVUb1NlbmQgPSBzaXplb2YoU19jY2lkX2J1bGtfaW5faGVhZGVyKS0oQUJEQVRBX1NJWkUrMSk7CiAKIAotICAgIC8vIENvbW1hbmQgZGlzcGF0Y2hlcgotICAgIHN3aXRjaCAoIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSApIHsKKwkvLyBDb21tYW5kIGRpc3BhdGNoZXIKKwlzd2l0Y2ggKCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUgKSB7CiAKLSAgICAgICAgY2FzZSBQQ19UT19SRFJfSUNDUE9XRVJPTjoKLSAgICAgICAgICAgIFBDdG9SRFJJY2NQb3dlck9uKCk7Ci0gICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKLSAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFBDX1RPX1JEUl9JQ0NQT1dFUk9OOgorCQkJUEN0b1JEUkljY1Bvd2VyT24oKTsKKwkJCU1lc3NhZ2VUb1NlbmQgPSAxOworCQkJYnJlYWs7CiAKLSAgICAgICAgY2FzZSBQQ19UT19SRFJfSUNDUE9XRVJPRkY6Ci0gICAgICAgICAgICBQQ3RvUkRSSWNjUG93ZXJPZmYoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwotICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUENfVE9fUkRSX0lDQ1BPV0VST0ZGOgorCQkJUEN0b1JEUkljY1Bvd2VyT2ZmKCk7CisJCQlNZXNzYWdlVG9TZW5kID0gMTsKKwkJCWJyZWFrOwogCi0gICAgICAgIGNhc2UgUENfVE9fUkRSX0dFVFNMT1RTVEFUVVM6Ci0gICAgICAgICAgICBQQ3RvUkRSR2V0U2xvdFN0YXR1cygpOwotICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKKwkJY2FzZSBQQ19UT19SRFJfR0VUU0xPVFNUQVRVUzoKKwkJCVBDdG9SRFJHZXRTbG90U3RhdHVzKCk7CisJCQlNZXNzYWdlVG9TZW5kID0gMTsKKwkJCWJyZWFrOwogCi0gICAgICAgIGNhc2UgUENfVE9fUkRSX1hGUkJMT0NLOgotICAgICAgICAgICAgUEN0b1JEUlhmckJsb2NrKCk7Ci0gICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKLSAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFBDX1RPX1JEUl9YRlJCTE9DSzoKKwkJCVBDdG9SRFJYZnJCbG9jaygpOworCQkJTWVzc2FnZVRvU2VuZCA9IDE7CisJCQlicmVhazsKIAotICAgICAgICBjYXNlIFBDX1RPX1JEUl9HRVRQQVJBTUVURVJTOgotICAgICAgICAgICAgUEN0b1JEUkdldFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwotICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUENfVE9fUkRSX0dFVFBBUkFNRVRFUlM6CisJCQlQQ3RvUkRSR2V0UGFyYW1ldGVycygpOworCQkJTWVzc2FnZVRvU2VuZCA9IDE7CisJCQlicmVhazsKIAotICAgICAgICBjYXNlIFBDX1RPX1JEUl9SRVNFVFBBUkFNRVRFUlM6Ci0gICAgICAgICAgICBQQ3RvUkRSUmVzZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKLSAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFBDX1RPX1JEUl9SRVNFVFBBUkFNRVRFUlM6CisJCQlQQ3RvUkRSUmVzZXRQYXJhbWV0ZXJzKCk7CisJCQlNZXNzYWdlVG9TZW5kID0gMTsKKwkJCWJyZWFrOwogCi0gICAgICAgIGNhc2UgUENfVE9fUkRSX1NFVFBBUkFNRVRFUlM6Ci0gICAgICAgICAgICBQQ3RvUkRSU2V0UGFyYW1ldGVycygpOwotICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKKwkJY2FzZSBQQ19UT19SRFJfU0VUUEFSQU1FVEVSUzoKKwkJCVBDdG9SRFJTZXRQYXJhbWV0ZXJzKCk7CisJCQlNZXNzYWdlVG9TZW5kID0gMTsKKwkJCWJyZWFrOwogCi0gICAgICAgIGNhc2UgUENfVE9fUkRSX0VTQ0FQRToKLSAgICAgICAgICAgIFBDdG9SRFJFc2NhcGUoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwotICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUENfVE9fUkRSX0VTQ0FQRToKKwkJCVBDdG9SRFJFc2NhcGUoKTsKKwkJCU1lc3NhZ2VUb1NlbmQgPSAxOworCQkJYnJlYWs7CiAKLSAgICAgICAgY2FzZSBQQ19UT19SRFJfSUNDQ0xPQ0s6Ci0gICAgICAgICAgICBQQ3RvUkRSSUNDQ2xvY2soKTsKLSAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwotICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUENfVE9fUkRSX0lDQ0NMT0NLOgorCQkJUEN0b1JEUklDQ0Nsb2NrKCk7CisJCQlNZXNzYWdlVG9TZW5kID0gMTsKKwkJCWJyZWFrOwogCi0gICAgICAgIGNhc2UgUENfVE9fUkRSX1QwQVBEVToKLSAgICAgICAgICAgIC8vIE9ubHkgQ0NJRHMgcmVwb3J0aW5nIGEgc2hvcnQgb3IgZXh0ZW5kZWQgQVBEVSBsZXZlbCBpbiB0aGUgZHdGZWF0dXJlcyAKLSAgICAgICAgICAgIC8vIGZpZWxkIG9mIHRoZSBDQ0lEIGNsYXNzIGRlc2NyaXB0b3IgbWF5IHRha2UgdGhpcyBjb21tYW5kIGludG8gYWNjb3VudC4KLSAgICAgICAgICAgIGlmKCAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFUgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKQotICAgICAgICAgICAgfHwgKENDSURfRkVBVFVSRVNfRVhDX0FQRFUgID09IChDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVICZjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzKSkgKSB7CisJCWNhc2UgUENfVE9fUkRSX1QwQVBEVToKKwkJCS8vIE9ubHkgQ0NJRHMgcmVwb3J0aW5nIGEgc2hvcnQgb3IgZXh0ZW5kZWQgQVBEVSBsZXZlbCBpbiB0aGUgZHdGZWF0dXJlcyAKKwkJCS8vIGZpZWxkIG9mIHRoZSBDQ0lEIGNsYXNzIGRlc2NyaXB0b3IgbWF5IHRha2UgdGhpcyBjb21tYW5kIGludG8gYWNjb3VudC4KKwkJCWlmKCAoQ0NJRF9GRUFUVVJFU19FWENfU0FQRFUgPT0gKENDSURfRkVBVFVSRVNfRVhDX1NBUERVJmNvbmZpZ3VyYXRpb25EZXNjcmlwdG9yc0ZTLT5jY2lkLmR3RmVhdHVyZXMpKQorCQkJfHwgKENDSURfRkVBVFVSRVNfRVhDX0FQRFUgID09IChDQ0lEX0ZFQVRVUkVTX0VYQ19BUERVICZjb25maWd1cmF0aW9uRGVzY3JpcHRvcnNGUy0+Y2NpZC5kd0ZlYXR1cmVzKSkgKSB7CiAKLSAgICAgICAgICAgICAgICAvLyBjb21tYW5kIHN1cHBvcnRlZAotICAgICAgICAgICAgICAgIFBDdG9SRFJ0b0FQRFUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNvbW1hbmQgbm90IHN1cHBvcnRlZAotICAgICAgICAgICAgICAgIFRSQUNFX0lORk8oIk5vdCBzdXBwb3J0ZWQ6IFBDX1RPX1JEUl9UMEFQRFVcblxyIik7Ci0gICAgICAgICAgICAgICAgdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKLSAgICAgICAgICAgIGJyZWFrOworCQkJCS8vIGNvbW1hbmQgc3VwcG9ydGVkCisJCQkJUEN0b1JEUnRvQVBEVSgpOworCQkJfQorCQkJZWxzZSB7CisJCQkJLy8gY29tbWFuZCBub3Qgc3VwcG9ydGVkCisJCQkJVFJBQ0VfSU5GTygiTm90IHN1cHBvcnRlZDogUENfVE9fUkRSX1QwQVBEVVxuXHIiKTsKKwkJCQl2Q0NJRENvbW1hbmROb3RTdXBwb3J0ZWQoKTsKKwkJCX0KKwkJCU1lc3NhZ2VUb1NlbmQgPSAxOworCQkJYnJlYWs7CiAKLSAgICAgICAgY2FzZSBQQ19UT19SRFJfU0VDVVJFOgotICAgICAgICAgICAgUEN0b1JEUlNlY3VyZSgpOwotICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKKwkJY2FzZSBQQ19UT19SRFJfU0VDVVJFOgorCQkJUEN0b1JEUlNlY3VyZSgpOworCQkJTWVzc2FnZVRvU2VuZCA9IDE7CisJCQlicmVhazsKIAotICAgICAgICBjYXNlIFBDX1RPX1JEUl9NRUNIQU5JQ0FMOgotICAgICAgICAgICAgUEN0b1JEUk1lY2hhbmljYWwoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwotICAgICAgICAgICAgYnJlYWs7CisJCWNhc2UgUENfVE9fUkRSX01FQ0hBTklDQUw6CisJCQlQQ3RvUkRSTWVjaGFuaWNhbCgpOworCQkJTWVzc2FnZVRvU2VuZCA9IDE7CisJCQlicmVhazsKIAotICAgICAgICBjYXNlIFBDX1RPX1JEUl9BQk9SVDoKLSAgICAgICAgICAgIFBDdG9SRFJBYm9ydCgpOwotICAgICAgICAgICAgTWVzc2FnZVRvU2VuZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKKwkJY2FzZSBQQ19UT19SRFJfQUJPUlQ6CisJCQlQQ3RvUkRSQWJvcnQoKTsKKwkJCU1lc3NhZ2VUb1NlbmQgPSAxOworCQkJYnJlYWs7CiAKLSAgICAgICAgY2FzZSBQQ19UT19SRFJfU0VUREFUQVJBVEVBTkRDTE9DS0ZSRVFVRU5DWToKLSAgICAgICAgICAgIFBDdG9SRFJTZXREYXRhUmF0ZUFuZENsb2NrRnJlcXVlbmN5KCk7Ci0gICAgICAgICAgICBNZXNzYWdlVG9TZW5kID0gMTsKLSAgICAgICAgICAgIGJyZWFrOworCQljYXNlIFBDX1RPX1JEUl9TRVREQVRBUkFURUFORENMT0NLRlJFUVVFTkNZOgorCQkJUEN0b1JEUlNldERhdGFSYXRlQW5kQ2xvY2tGcmVxdWVuY3koKTsKKwkJCU1lc3NhZ2VUb1NlbmQgPSAxOworCQkJYnJlYWs7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJkZWZhdWx0OiBOb3Qgc3VwcG9ydGVkOiAweCVYXG5cciIsIGNjaWREcml2ZXIuc0NjaWRDb21tYW5kLmJNZXNzYWdlVHlwZSk7Ci0gICAgICAgICAgICB2Q0NJRENvbW1hbmROb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgICAgIE1lc3NhZ2VUb1NlbmQgPSAxOwotICAgICAgICAgICAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlUUkFDRV9ERUJVRygiZGVmYXVsdDogTm90IHN1cHBvcnRlZDogMHglWFxuXHIiLCBjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZC5iTWVzc2FnZVR5cGUpOworCQkJdkNDSURDb21tYW5kTm90U3VwcG9ydGVkKCk7CisJCQlNZXNzYWdlVG9TZW5kID0gMTsKKwkJCWJyZWFrOwogCi0gICAgfQorCX0KIAotICAgIGlmKCBNZXNzYWdlVG9TZW5kID09IDEgKSB7Ci0gICAgICAgIHZDQ0lEU2VuZFJlc3BvbnNlKCk7Ci0gICAgfQorCWlmKCBNZXNzYWdlVG9TZW5kID09IDEgKSB7CisJCXZDQ0lEU2VuZFJlc3BvbnNlKCk7CisJfQogfQogCiAKQEAgLTg1Myw0OSArODUzLDQ5IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc3RhdGljIHZvaWQgQ0NJRF9SZXF1ZXN0SGFuZGxlcihjb25zdCBVU0JHZW5lcmljUmVxdWVzdCAqcFJlcXVlc3QpCiB7Ci0gICAgVFJBQ0VfREVCVUcoIkNDSURfUkhsXG5cciIpOworCVRSQUNFX0RFQlVHKCJDQ0lEX1JIbFxuXHIiKTsKIAotICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBjbGFzcyByZXF1ZXN0Ci0gICAgaWYgKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpID09IFVTQkdlbmVyaWNSZXF1ZXN0X0NMQVNTKSB7CisJLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNsYXNzIHJlcXVlc3QKKwlpZiAoVVNCR2VuZXJpY1JlcXVlc3RfR2V0VHlwZShwUmVxdWVzdCkgPT0gVVNCR2VuZXJpY1JlcXVlc3RfQ0xBU1MpIHsKIAotICAgICAgICAvLyBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBzdXBwb3J0ZWQKLSAgICAgICAgc3dpdGNoIChVU0JHZW5lcmljUmVxdWVzdF9HZXRSZXF1ZXN0KHBSZXF1ZXN0KSkgeworCQkvLyBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBzdXBwb3J0ZWQKKwkJc3dpdGNoIChVU0JHZW5lcmljUmVxdWVzdF9HZXRSZXF1ZXN0KHBSZXF1ZXN0KSkgewogCi0gICAgICAgICAgICBjYXNlIENDSURHZW5lcmljUmVxdWVzdF9BQk9SVDoKLSAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiQ0NJREdlbmVyaWNSZXF1ZXN0X0FCT1JUXG5cciIpOwotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfQUJPUlQ6CisJCQkJVFJBQ0VfREVCVUcoIkNDSURHZW5lcmljUmVxdWVzdF9BQk9SVFxuXHIiKTsKKwkJCQlicmVhazsKIAotICAgICAgICAgICAgY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0NMT0NLX0ZSRVFVRU5DSUVTOgotICAgICAgICAgICAgICAgIFRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkOiBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0NMT0NLX0ZSRVFVRU5DSUVTXG5cciIpOwotICAgICAgICAgICAgICAgIC8vIEEgQ0NJRCB3aXRoIGJOdW1DbG9ja1N1cHBvcnRlZCBlcXVhbCB0byAwMGggZG9lcyBub3QgaGF2ZSAKLSAgICAgICAgICAgICAgICAvLyB0byBzdXBwb3J0IHRoaXMgcmVxdWVzdAotICAgICAgICAgICAgICAgIGJyZWFrOworCQkJY2FzZSBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0NMT0NLX0ZSRVFVRU5DSUVTOgorCQkJCVRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkOiBDQ0lER2VuZXJpY1JlcXVlc3RfR0VUX0NMT0NLX0ZSRVFVRU5DSUVTXG5cciIpOworCQkJCS8vIEEgQ0NJRCB3aXRoIGJOdW1DbG9ja1N1cHBvcnRlZCBlcXVhbCB0byAwMGggZG9lcyBub3QgaGF2ZSAKKwkJCQkvLyB0byBzdXBwb3J0IHRoaXMgcmVxdWVzdAorCQkJCWJyZWFrOwogCi0gICAgICAgICAgICBjYXNlIENDSURHZW5lcmljUmVxdWVzdF9HRVRfREFUQV9SQVRFUzoKLSAgICAgICAgICAgICAgICBUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZDogQ0NJREdlbmVyaWNSZXF1ZXN0X0dFVF9EQVRBX1JBVEVTXG5cciIpOwotICAgICAgICAgICAgICAgIC8vIEEgQ0NJRCB3aXRoIGJOdW1EYXRhUmF0ZXNTdXBwb3J0ZWQgZXF1YWwgdG8gMDBoIGRvZXMgbm90IGhhdmUgCi0gICAgICAgICAgICAgICAgLy8gdG8gc3VwcG9ydCB0aGlzIHJlcXVlc3QuCi0gICAgICAgICAgICAgICAgYnJlYWs7CisJCQljYXNlIENDSURHZW5lcmljUmVxdWVzdF9HRVRfREFUQV9SQVRFUzoKKwkJCQlUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZDogQ0NJREdlbmVyaWNSZXF1ZXN0X0dFVF9EQVRBX1JBVEVTXG5cciIpOworCQkJCS8vIEEgQ0NJRCB3aXRoIGJOdW1EYXRhUmF0ZXNTdXBwb3J0ZWQgZXF1YWwgdG8gMDBoIGRvZXMgbm90IGhhdmUgCisJCQkJLy8gdG8gc3VwcG9ydCB0aGlzIHJlcXVlc3QuCisJCQkJYnJlYWs7CiAKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgVFJBQ0VfV0FSTklORyggIkNDSUREcml2ZXJfUmVxdWVzdEhhbmRsZXI6IFVuc3VwcG9ydGVkIHJlcXVlc3QgKCVkKVxuXHIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQkdlbmVyaWNSZXF1ZXN0X0dldFJlcXVlc3QocFJlcXVlc3QpKTsKLSAgICAgICAgICAgICAgICBVU0JEX1N0YWxsKDApOwotICAgICAgICB9Ci0gICAgfQorCQkJZGVmYXVsdDoKKwkJCQlUUkFDRV9XQVJOSU5HKCAiQ0NJRERyaXZlcl9SZXF1ZXN0SGFuZGxlcjogVW5zdXBwb3J0ZWQgcmVxdWVzdCAoJWQpXG5cciIsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCR2VuZXJpY1JlcXVlc3RfR2V0UmVxdWVzdChwUmVxdWVzdCkpOworCQkJCVVTQkRfU3RhbGwoMCk7CisJCX0KKwl9CiAKLSAgICBlbHNlIGlmIChVU0JHZW5lcmljUmVxdWVzdF9HZXRUeXBlKHBSZXF1ZXN0KSA9PSBVU0JHZW5lcmljUmVxdWVzdF9TVEFOREFSRCkgeworCWVsc2UgaWYgKFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpID09IFVTQkdlbmVyaWNSZXF1ZXN0X1NUQU5EQVJEKSB7CiAKLSAgICAgICAgLy8gRm9yd2FyZCByZXF1ZXN0IHRvIHRoZSBzdGFuZGFyZCBoYW5kbGVyCi0gICAgICAgIFVTQkREcml2ZXJfUmVxdWVzdEhhbmRsZXIoVVNCRF9HZXREcml2ZXIoKSwgcFJlcXVlc3QpOwotICAgIH0KLSAgICBlbHNlIHsKKwkJLy8gRm9yd2FyZCByZXF1ZXN0IHRvIHRoZSBzdGFuZGFyZCBoYW5kbGVyCisJCVVTQkREcml2ZXJfUmVxdWVzdEhhbmRsZXIoVVNCRF9HZXREcml2ZXIoKSwgcFJlcXVlc3QpOworCX0KKwllbHNlIHsKIAotICAgICAgICAvLyBVbnN1cHBvcnRlZCByZXF1ZXN0IHR5cGUKLSAgICAgICAgVFJBQ0VfV0FSTklORyggIkNDSUREcml2ZXJfUmVxdWVzdEhhbmRsZXI6IFVuc3VwcG9ydGVkIHJlcXVlc3QgdHlwZSAoJWQpXG5cciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNCR2VuZXJpY1JlcXVlc3RfR2V0VHlwZShwUmVxdWVzdCkpOwotICAgICAgICBVU0JEX1N0YWxsKDApOwotICAgIH0KKwkJLy8gVW5zdXBwb3J0ZWQgcmVxdWVzdCB0eXBlCisJCVRSQUNFX1dBUk5JTkcoICJDQ0lERHJpdmVyX1JlcXVlc3RIYW5kbGVyOiBVbnN1cHBvcnRlZCByZXF1ZXN0IHR5cGUgKCVkKVxuXHIiLAorCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQkdlbmVyaWNSZXF1ZXN0X0dldFR5cGUocFJlcXVlc3QpKTsKKwkJVVNCRF9TdGFsbCgwKTsKKwl9CiB9CiAKIApAQCAtOTEwLDcgKzkxMCw3IEBACiAvLyBub3Qgc3RhdGljIGZ1bmN0aW9uCiB2b2lkIFVTQkRDYWxsYmFja3NfUmVxdWVzdFJlY2VpdmVkKGNvbnN0IFVTQkdlbmVyaWNSZXF1ZXN0ICpyZXF1ZXN0KQogewotICAgIENDSURfUmVxdWVzdEhhbmRsZXIocmVxdWVzdCk7CisJQ0NJRF9SZXF1ZXN0SGFuZGxlcihyZXF1ZXN0KTsKIH0KICNlbmRpZgogCkBAIC05MjAsMTcgKzkyMCwxNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgQ0NJRF9TbWFydENhcmRSZXF1ZXN0KCB2b2lkICkKIHsKLSAgICB1bnNpZ25lZCBjaGFyIGJTdGF0dXM7Ci0gICAgVFJBQ0VfREVCVUcoIkNDSURfcmVxXG4iKTsKKwl1bnNpZ25lZCBjaGFyIGJTdGF0dXM7CisJVFJBQ0VfREVCVUcoIkNDSURfcmVxXG4iKTsKIAotICAgIGRvIHsKKwlkbyB7CiAKLSAgICAgICAgYlN0YXR1cyA9IENDSURfUmVhZCggKHZvaWQqKSZjY2lkRHJpdmVyLnNDY2lkQ29tbWFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNfY2NpZF9idWxrX291dF9oZWFkZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVHJhbnNmZXJDYWxsYmFjaykmQ0NJRENvbW1hbmREaXNwYXRjaGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopMCApOwotICAgIH0KLSAgICB3aGlsZSAoMCk7CisJCWJTdGF0dXMgPSBDQ0lEX1JlYWQoICh2b2lkKikmY2NpZERyaXZlci5zQ2NpZENvbW1hbmQsCisJCQkJCSAgICAgICAgIHNpemVvZihTX2NjaWRfYnVsa19vdXRfaGVhZGVyKSwKKwkJCQkJICAgICAgICAgKFRyYW5zZmVyQ2FsbGJhY2spJkNDSURDb21tYW5kRGlzcGF0Y2hlciwKKwkJCQkJICAgICAgICAgKHZvaWQqKTAgKTsKKwl9CisJd2hpbGUgKDApOwogfQogCiAKQEAgLTk0MywxMSArOTQzLDExIEBACiAvLy8gXHJldHVybiBVU0JEX1NUQVRVU19MT0NLRUQgb3IgVVNCRF9TVEFUVVNfU1VDQ0VTUwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHVuc2lnbmVkIGNoYXIgQ0NJRF9SZWFkKHZvaWQgKnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZmVyQ2FsbGJhY2sgZkNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEFyZ3VtZW50KQorCQkJCQkgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCisJCQkJCSAgICBUcmFuc2ZlckNhbGxiYWNrIGZDYWxsYmFjaywKKwkJCQkJICAgIHZvaWQgKnBBcmd1bWVudCkKIHsKLSAgICByZXR1cm4gVVNCRF9SZWFkKENDSURfRVBUX0RBVEFfT1VULCBwQnVmZmVyLCBkTGVuZ3RoLCBmQ2FsbGJhY2ssIHBBcmd1bWVudCk7CisJcmV0dXJuIFVTQkRfUmVhZChDQ0lEX0VQVF9EQVRBX09VVCwgcEJ1ZmZlciwgZExlbmd0aCwgZkNhbGxiYWNrLCBwQXJndW1lbnQpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTU5LDExICs5NTksMTEgQEAKIC8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdW5zaWduZWQgY2hhciBDQ0lEX1dyaXRlKHZvaWQgKnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmZXJDYWxsYmFjayBmQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEFyZ3VtZW50KQorCQkJCQkgICAgIHVuc2lnbmVkIGludCBkTGVuZ3RoLAorCQkJCQkgICAgIFRyYW5zZmVyQ2FsbGJhY2sgZkNhbGxiYWNrLAorCQkJCQkgICAgIHZvaWQgKnBBcmd1bWVudCkKIHsKLSAgICByZXR1cm4gVVNCRF9Xcml0ZShDQ0lEX0VQVF9EQVRBX0lOLCBwQnVmZmVyLCBkTGVuZ3RoLCBmQ2FsbGJhY2ssIHBBcmd1bWVudCk7CisJcmV0dXJuIFVTQkRfV3JpdGUoQ0NJRF9FUFRfREFUQV9JTiwgcEJ1ZmZlciwgZExlbmd0aCwgZkNhbGxiYWNrLCBwQXJndW1lbnQpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTczLDE1ICs5NzMsMTUgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB1bnNpZ25lZCBjaGFyIENDSURfSW5zZXJ0aW9uKCB2b2lkICkKIHsKLSAgICBUUkFDRV9ERUJVRygiLiIpOworCVRSQUNFX0RFQlVHKCIuIik7CiAKLSAgICAvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKLSAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19OT1RJRllTTE9UQ0hBTkdFOwotICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gSUNDX0lOU0VSVEVEX0VWRU5UOwotICAgIGNjaWREcml2ZXIuU2xvdFN0YXR1cyAgID0gSUNDX0lOU0VSVEVEX0VWRU5UOworCS8vIEJ1aWxkIHRoZSBJbnRlcnJ1cHQtSU4gbWVzc2FnZQorCWNjaWREcml2ZXIuQnVmZmVySU5UWzBdID0gUkRSX1RPX1BDX05PVElGWVNMT1RDSEFOR0U7CisJY2NpZERyaXZlci5CdWZmZXJJTlRbMV0gPSBJQ0NfSU5TRVJURURfRVZFTlQ7CisJY2NpZERyaXZlci5TbG90U3RhdHVzICAgPSBJQ0NfSU5TRVJURURfRVZFTlQ7CiAKLSAgICAvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCBhIElDQyBpcyBpbnNlcnRlZAotICAgIHJldHVybiBVU0JEX1dyaXRlKCBDQ0lEX0VQVF9OT1RJRklDQVRJT04sIGNjaWREcml2ZXIuQnVmZmVySU5ULCAyLCAwLCAwICk7CisJLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKKwlyZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgMiwgMCwgMCApOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTkxLDE1ICs5OTEsMTUgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB1bnNpZ25lZCBjaGFyIENDSURfUmVtb3ZhbCggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIi4iKTsKKwlUUkFDRV9ERUJVRygiLiIpOwogCi0gICAgLy8gQnVpbGQgdGhlIEludGVycnVwdC1JTiBtZXNzYWdlCi0gICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMF0gPSBSRFJfVE9fUENfTk9USUZZU0xPVENIQU5HRTsKLSAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFsxXSA9IElDQ19OT1RfUFJFU0VOVDsKLSAgICBjY2lkRHJpdmVyLlNsb3RTdGF0dXMgICA9IElDQ19OT1RfUFJFU0VOVDsKKwkvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKKwljY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19OT1RJRllTTE9UQ0hBTkdFOworCWNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gSUNDX05PVF9QUkVTRU5UOworCWNjaWREcml2ZXIuU2xvdFN0YXR1cyAgID0gSUNDX05PVF9QUkVTRU5UOwogCi0gICAgLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKLSAgICByZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgMiwgMCwgMCApOworCS8vIE5vdGlmeSB0aGUgaG9zdCB0aGF0IGEgSUNDIGlzIGluc2VydGVkCisJcmV0dXJuIFVTQkRfV3JpdGUoIENDSURfRVBUX05PVElGSUNBVElPTiwgY2NpZERyaXZlci5CdWZmZXJJTlQsIDIsIDAsIDAgKTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEwMTQsMTkgKzEwMTQsMTkgQEAKIC8vLyBccmV0dXJuIFVTQkRfU1RBVFVTX0xPQ0tFRCBvciBVU0JEX1NUQVRVU19TVUNDRVNTCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogdW5zaWduZWQgY2hhciBSRFJ0b1BDSGFyZHdhcmVFcnJvciggdW5zaWduZWQgY2hhciBiU2xvdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGJTZXEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiSGFyZHdhcmVFcnJvckNvZGUgKQorCQkJCQkgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBiU2VxLCAKKwkJCQkJICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYkhhcmR3YXJlRXJyb3JDb2RlICkKIHsKLSAgICBUUkFDRV9ERUJVRygiLiIpOworCVRSQUNFX0RFQlVHKCIuIik7CiAKLSAgICAvLyBCdWlsZCB0aGUgSW50ZXJydXB0LUlOIG1lc3NhZ2UKLSAgICBjY2lkRHJpdmVyLkJ1ZmZlcklOVFswXSA9IFJEUl9UT19QQ19IQVJEV0FSRUVSUk9SOwotICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzFdID0gYlNsb3Q7Ci0gICAgY2NpZERyaXZlci5CdWZmZXJJTlRbMl0gPSBiU2VxOwotICAgIGNjaWREcml2ZXIuQnVmZmVySU5UWzNdID0gYkhhcmR3YXJlRXJyb3JDb2RlOworCS8vIEJ1aWxkIHRoZSBJbnRlcnJ1cHQtSU4gbWVzc2FnZQorCWNjaWREcml2ZXIuQnVmZmVySU5UWzBdID0gUkRSX1RPX1BDX0hBUkRXQVJFRVJST1I7CisJY2NpZERyaXZlci5CdWZmZXJJTlRbMV0gPSBiU2xvdDsKKwljY2lkRHJpdmVyLkJ1ZmZlcklOVFsyXSA9IGJTZXE7CisJY2NpZERyaXZlci5CdWZmZXJJTlRbM10gPSBiSGFyZHdhcmVFcnJvckNvZGU7CiAKLSAgICAvLyBOb3RpZnkgdGhlIGhvc3QgdGhhdCBhIElDQyBpcyBpbnNlcnRlZAotICAgIHJldHVybiBVU0JEX1dyaXRlKCBDQ0lEX0VQVF9OT1RJRklDQVRJT04sIGNjaWREcml2ZXIuQnVmZmVySU5ULCA0LCAwLCAwICk7CisJLy8gTm90aWZ5IHRoZSBob3N0IHRoYXQgYSBJQ0MgaXMgaW5zZXJ0ZWQKKwlyZXR1cm4gVVNCRF9Xcml0ZSggQ0NJRF9FUFRfTk9USUZJQ0FUSU9OLCBjY2lkRHJpdmVyLkJ1ZmZlcklOVCwgNCwgMCwgMCApOwogfQogCiAjZW5kaWYgLyogSEFWRV9DQ0lEICovCmRpZmYgLS1naXQgYS9maXJtd2FyZS9saWJjb21tb24vc291cmNlL2lzbzc4MTZfNC5jIGIvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9pc283ODE2XzQuYwppbmRleCA3MjE5NzQxLi5hYzE1MzA2IDEwMDY0NAotLS0gYS9maXJtd2FyZS9saWJjb21tb24vc291cmNlL2lzbzc4MTZfNC5jCisrKyBiL2Zpcm13YXJlL2xpYmNvbW1vbi9zb3VyY2UvaXNvNzgxNl80LmMKQEAgLTc2LDQ1ICs3Niw0NSBAQAogICovCiB1aW50MzJfdCBJU083ODE2X0dldENoYXIoIHVpbnQ4X3QgKnBDaGFyVG9SZWNlaXZlLCBVc2FydF9pbmZvICp1c2FydCkKIHsKLSAgICB1aW50MzJfdCBzdGF0dXM7Ci0gICAgdWludDMyX3QgdGltZW91dD0wOworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCB0aW1lb3V0PTA7CiAKLSAgICBVc2FydCAqdXNfYmFzZSA9IHVzYXJ0LT5iYXNlOwotICAgIHVpbnQzMl90IHVzX2lkID0gdXNhcnQtPmlkOworCVVzYXJ0ICp1c19iYXNlID0gdXNhcnQtPmJhc2U7CisJdWludDMyX3QgdXNfaWQgPSB1c2FydC0+aWQ7CiAKLSAgICBpZiggdXNhcnQtPnN0YXRlID09IFVTQVJUX1NFTkQgKSB7Ci0gICAgICAgIHdoaWxlKCh1c19iYXNlLT5VU19DU1IgJiBVU19DU1JfVFhFTVBUWSkgPT0gMCkge30KLSAgICAgICAgdXNfYmFzZS0+VVNfQ1IgPSBVU19DUl9SU1RTVEEgfCBVU19DUl9SU1RJVCB8IFVTX0NSX1JTVE5BQ0s7Ci0gICAgICAgIHVzYXJ0LT5zdGF0ZSA9IFVTQVJUX1JDVjsKLSAgICB9CisJaWYoIHVzYXJ0LT5zdGF0ZSA9PSBVU0FSVF9TRU5EICkgeworCQl3aGlsZSgodXNfYmFzZS0+VVNfQ1NSICYgVVNfQ1NSX1RYRU1QVFkpID09IDApIHt9CisJCXVzX2Jhc2UtPlVTX0NSID0gVVNfQ1JfUlNUU1RBIHwgVVNfQ1JfUlNUSVQgfCBVU19DUl9SU1ROQUNLOworCQl1c2FydC0+c3RhdGUgPSBVU0FSVF9SQ1Y7CisJfQogCi0gICAgLyogV2FpdCBVU0FSVCByZWFkeSBmb3IgcmVjZXB0aW9uICovCi0gICAgd2hpbGUoICgodXNfYmFzZS0+VVNfQ1NSICYgVVNfQ1NSX1JYUkRZKSA9PSAwKSApIHsKKwkvKiBXYWl0IFVTQVJUIHJlYWR5IGZvciByZWNlcHRpb24gKi8KKwl3aGlsZSggKCh1c19iYXNlLT5VU19DU1IgJiBVU19DU1JfUlhSRFkpID09IDApICkgewogCVdEVF9SZXN0YXJ0KFdEVCk7Ci0gICAgICAgIGlmKHRpbWVvdXQrKyA+IDEyMDAwICogKEJPQVJEX01DSy8xMDAwMDAwKSkgewotICAgICAgICAgICAgVFJBQ0VfV0FSTklORygiVGltZU91dFxuXHIiKTsKLSAgICAgICAgICAgIHJldHVybiggMCApOwotICAgICAgICB9Ci0gICAgfQorCQlpZih0aW1lb3V0KysgPiAxMjAwMCAqIChCT0FSRF9NQ0svMTAwMDAwMCkpIHsKKwkJCVRSQUNFX1dBUk5JTkcoIlRpbWVPdXRcblxyIik7CisJCQlyZXR1cm4oIDAgKTsKKwkJfQorCX0KIAotICAgIC8qIEF0IGxlYXN0IG9uZSBjb21wbGV0ZSBjaGFyYWN0ZXIgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIFVTX1JIUiBoYXMgbm90IHlldCBiZWVuIHJlYWQuICovCisJLyogQXQgbGVhc3Qgb25lIGNvbXBsZXRlIGNoYXJhY3RlciBoYXMgYmVlbiByZWNlaXZlZCBhbmQgVVNfUkhSIGhhcyBub3QgeWV0IGJlZW4gcmVhZC4gKi8KIAotICAgIC8qIEdldCBhIGNoYXIgKi8KLSAgICAqcENoYXJUb1JlY2VpdmUgPSAoKHVzX2Jhc2UtPlVTX1JIUikgJiAweEZGKTsKKwkvKiBHZXQgYSBjaGFyICovCisJKnBDaGFyVG9SZWNlaXZlID0gKCh1c19iYXNlLT5VU19SSFIpICYgMHhGRik7CiAKLSAgICBzdGF0dXMgPSAodXNfYmFzZS0+VVNfQ1NSJihVU19DU1JfT1ZSRXxVU19DU1JfRlJBTUV8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTX0NTUl9QQVJFfFVTX0NTUl9USU1FT1VUfFVTX0NTUl9OQUNLfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTw8MTApKSk7CisJc3RhdHVzID0gKHVzX2Jhc2UtPlVTX0NTUiYoVVNfQ1NSX09WUkV8VVNfQ1NSX0ZSQU1FfAorCQkJCQkgICAgICAgICAgICAgICAgICBVU19DU1JfUEFSRXxVU19DU1JfVElNRU9VVHxVU19DU1JfTkFDS3wKKwkJCQkJICAgICAgICAgICAgICAgICAgKDE8PDEwKSkpOwogCi0gICAgaWYgKHN0YXR1cyAhPSAwICkgewotICAgICAgICBUUkFDRV9ERUJVRygiUjoweCUiIFBSSVgzMiAiXG5cciIsIHN0YXR1cyk7IAotICAgICAgICBUUkFDRV9ERUJVRygiUjoweCUiIFBSSVgzMiAiXG5cciIsIHVzX2Jhc2UtPlVTX0NTUik7Ci0gICAgICAgIFRSQUNFX0RFQlVHKCJOYjoweCUiIFBSSVgzMiAiXG5cciIsIHVzX2Jhc2UtPlVTX05FUiApOwotICAgICAgICB1c19iYXNlLT5VU19DUiA9IFVTX0NSX1JTVFNUQTsKLSAgICB9CisJaWYgKHN0YXR1cyAhPSAwICkgeworCQlUUkFDRV9ERUJVRygiUjoweCUiIFBSSVgzMiAiXG5cciIsIHN0YXR1cyk7IAorCQlUUkFDRV9ERUJVRygiUjoweCUiIFBSSVgzMiAiXG5cciIsIHVzX2Jhc2UtPlVTX0NTUik7CisJCVRSQUNFX0RFQlVHKCJOYjoweCUiIFBSSVgzMiAiXG5cciIsIHVzX2Jhc2UtPlVTX05FUiApOworCQl1c19iYXNlLT5VU19DUiA9IFVTX0NSX1JTVFNUQTsKKwl9CiAKLSAgICAvKiBSZXR1cm4gc3RhdHVzICovCi0gICAgcmV0dXJuKCBzdGF0dXMgKTsKKwkvKiBSZXR1cm4gc3RhdHVzICovCisJcmV0dXJuKCBzdGF0dXMgKTsKIH0KIAogCkBAIC0xMjUsNTAgKzEyNSw1MCBAQAogICovCiB1aW50MzJfdCBJU083ODE2X1NlbmRDaGFyKCB1aW50OF90IENoYXJUb1NlbmQsIFVzYXJ0X2luZm8gKnVzYXJ0ICkKIHsKLSAgICB1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3Qgc3RhdHVzOwogCi0gICAgVXNhcnQgKnVzX2Jhc2UgPSB1c2FydC0+YmFzZTsKLSAgICB1aW50MzJfdCB1c19pZCA9IHVzYXJ0LT5pZDsKKwlVc2FydCAqdXNfYmFzZSA9IHVzYXJ0LT5iYXNlOworCXVpbnQzMl90IHVzX2lkID0gdXNhcnQtPmlkOwogCi0gICAgaWYoIHVzYXJ0LT5zdGF0ZSA9PSBVU0FSVF9SQ1YgKSB7Ci0gICAgICAgIHVzX2Jhc2UtPlVTX0NSID0gVVNfQ1JfUlNUU1RBIHwgVVNfQ1JfUlNUSVQgfCBVU19DUl9SU1ROQUNLOwotICAgICAgICB1c2FydC0+c3RhdGUgPSBVU0FSVF9TRU5EOwotICAgIH0KKwlpZiggdXNhcnQtPnN0YXRlID09IFVTQVJUX1JDViApIHsKKwkJdXNfYmFzZS0+VVNfQ1IgPSBVU19DUl9SU1RTVEEgfCBVU19DUl9SU1RJVCB8IFVTX0NSX1JTVE5BQ0s7CisJCXVzYXJ0LT5zdGF0ZSA9IFVTQVJUX1NFTkQ7CisJfQogCi0gICAgLyogV2FpdCBVU0FSVCByZWFkeSBmb3IgdHJhbnNtaXQgKi8KLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUoKHVzX2Jhc2UtPlVTX0NTUiAmIChVU19DU1JfVFhSRFkpKSA9PSAwKSAgewotICAgICAgICBpKys7Ci0gICAgICAgIGlmICghKGklMTAwMDAwMCkpIHsKLSAgICAgICAgICAgIHByaW50ZigiczogJXggIiwgdXNfYmFzZS0+VVNfQ1NSKTsKLSAgICAgICAgICAgIHByaW50ZigiczogJXhcclxuIiwgdXNfYmFzZS0+VVNfUkhSICYgMHhGRik7Ci0gICAgICAgICAgICB1c19iYXNlLT5VU19DUiA9IFVTX0NSX1JTVFRYOwotICAgICAgICAgICAgdXNfYmFzZS0+VVNfQ1IgPSBVU19DUl9SU1RSWDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogVGhlcmUgaXMgbm8gY2hhcmFjdGVyIGluIHRoZSBVU19USFIgKi8KKwkvKiBXYWl0IFVTQVJUIHJlYWR5IGZvciB0cmFuc21pdCAqLworCWludCBpID0gMDsKKwl3aGlsZSgodXNfYmFzZS0+VVNfQ1NSICYgKFVTX0NTUl9UWFJEWSkpID09IDApICB7CisJCWkrKzsKKwkJaWYgKCEoaSUxMDAwMDAwKSkgeworCQkJcHJpbnRmKCJzOiAleCAiLCB1c19iYXNlLT5VU19DU1IpOworCQkJcHJpbnRmKCJzOiAleFxyXG4iLCB1c19iYXNlLT5VU19SSFIgJiAweEZGKTsKKwkJCXVzX2Jhc2UtPlVTX0NSID0gVVNfQ1JfUlNUVFg7CisJCQl1c19iYXNlLT5VU19DUiA9IFVTX0NSX1JTVFJYOworCSAgfQorCX0KKwkvKiBUaGVyZSBpcyBubyBjaGFyYWN0ZXIgaW4gdGhlIFVTX1RIUiAqLwogCi0gICAgLyogVHJhbnNtaXQgYSBjaGFyICovCi0gICAgdXNfYmFzZS0+VVNfVEhSID0gQ2hhclRvU2VuZDsKKwkvKiBUcmFuc21pdCBhIGNoYXIgKi8KKwl1c19iYXNlLT5VU19USFIgPSBDaGFyVG9TZW5kOwogCi0gICAgVFJBQ0VfRVJST1IoIlN4JTAyWFxyXG4iLCBDaGFyVG9TZW5kKTsKKwlUUkFDRV9FUlJPUigiU3glMDJYXHJcbiIsIENoYXJUb1NlbmQpOwogCi0gICAgc3RhdHVzID0gKHVzX2Jhc2UtPlVTX0NTUiYoVVNfQ1NSX09WUkV8VVNfQ1NSX0ZSQU1FfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU19DU1JfUEFSRXxVU19DU1JfVElNRU9VVHxVU19DU1JfTkFDS3wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE8PDEwKSkpOworCXN0YXR1cyA9ICh1c19iYXNlLT5VU19DU1ImKFVTX0NTUl9PVlJFfFVTX0NTUl9GUkFNRXwKKwkJCQkJICAgICAgICAgICAgICAgICAgVVNfQ1NSX1BBUkV8VVNfQ1NSX1RJTUVPVVR8VVNfQ1NSX05BQ0t8CisJCQkJCSAgICAgICAgICAgICAgICAgICgxPDwxMCkpKTsKIAotICAgIGlmIChzdGF0dXMgIT0gMCApIHsKLSAgICAgICAgVFJBQ0VfSU5GTygiKioqKioqKiBzdGF0dXM6IDB4JSIgUFJJWDMyICIgKE92ZXJydW46ICUiIFBSSVgzMgotICAgICAgICAgICAgICAgICAgICAiLCBOQUNLOiAlIiBQUklYMzIgIiwgVGltZW91dDogJSIgUFJJWDMyICIsIHVuZGVycnVuOiAlIiBQUklYMzIgIilcblxyIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCAoKHN0YXR1cyAmIFVTX0NTUl9PVlJFKT4+IDUpLCAoKHN0YXR1cyAmIFVTX0NTUl9OQUNLKSA+PiAxMyksCi0gICAgICAgICAgICAgICAgICAgICgoc3RhdHVzICYgVVNfQ1NSX1RJTUVPVVQpID4+IDgpLCAoKHN0YXR1cyAmICgxIDw8IDEwKSkgPj4gMTApKTsKLSAgICAgICAgVFJBQ0VfSU5GTygiRSAoVVNBUlQgQ1NSIHJlZyk6MHglIiBQUklYMzIgIlxuXHIiLCB1c19iYXNlLT5VU19DU1IpOwotICAgICAgICBUUkFDRV9JTkZPKCJOYiAoTnVtYmVyIG9mIGVycm9ycyk6MHglIiBQUklYMzIgIlxuXHIiLCB1c19iYXNlLT5VU19ORVIgKTsKLSAgICAgICAgdXNfYmFzZS0+VVNfQ1IgPSBVU19DUl9SU1RTVEE7Ci0gICAgfQorCWlmIChzdGF0dXMgIT0gMCApIHsKKwkJVFJBQ0VfSU5GTygiKioqKioqKiBzdGF0dXM6IDB4JSIgUFJJWDMyICIgKE92ZXJydW46ICUiIFBSSVgzMgorCQkJCQkiLCBOQUNLOiAlIiBQUklYMzIgIiwgVGltZW91dDogJSIgUFJJWDMyICIsIHVuZGVycnVuOiAlIiBQUklYMzIgIilcblxyIiwKKwkJCQkJc3RhdHVzLCAoKHN0YXR1cyAmIFVTX0NTUl9PVlJFKT4+IDUpLCAoKHN0YXR1cyAmIFVTX0NTUl9OQUNLKSA+PiAxMyksCisJCQkJCSgoc3RhdHVzICYgVVNfQ1NSX1RJTUVPVVQpID4+IDgpLCAoKHN0YXR1cyAmICgxIDw8IDEwKSkgPj4gMTApKTsKKwkJVFJBQ0VfSU5GTygiRSAoVVNBUlQgQ1NSIHJlZyk6MHglIiBQUklYMzIgIlxuXHIiLCB1c19iYXNlLT5VU19DU1IpOworCQlUUkFDRV9JTkZPKCJOYiAoTnVtYmVyIG9mIGVycm9ycyk6MHglIiBQUklYMzIgIlxuXHIiLCB1c19iYXNlLT5VU19ORVIgKTsKKwkJdXNfYmFzZS0+VVNfQ1IgPSBVU19DUl9SU1RTVEE7CisJfQogCi0gICAgLyogUmV0dXJuIHN0YXR1cyAqLwotICAgIHJldHVybiggc3RhdHVzICk7CisJLyogUmV0dXJuIHN0YXR1cyAqLworCXJldHVybiggc3RhdHVzICk7CiB9CiAKIApAQCAtMTc3LDEwICsxNzcsMTAgQEAKICAqLwogc3RhdGljIHZvaWQgSVNPNzgxNl9JY2NQb3dlck9uKCB2b2lkICkKIHsKLSAgICAvKiBTZXQgUkVTRVQgTWFzdGVyIENhcmQgKi8KLSAgICBpZiAoc3RfcGluSXNvNzgxNlJzdE1DKSB7Ci0gICAgICAgIFBJT19TZXQoc3RfcGluSXNvNzgxNlJzdE1DKTsKLSAgICB9CisJLyogU2V0IFJFU0VUIE1hc3RlciBDYXJkICovCisJaWYgKHN0X3Bpbklzbzc4MTZSc3RNQykgeworCQlQSU9fU2V0KHN0X3Bpbklzbzc4MTZSc3RNQyk7CisJfQogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE5MiwxMCArMTkyLDEwIEBACiAgKi8KIHZvaWQgSVNPNzgxNl9JY2NQb3dlck9mZiggdm9pZCApCiB7Ci0gICAgLyogQ2xlYXIgUkVTRVQgTWFzdGVyIENhcmQgKi8KLSAgICBpZiAoc3RfcGluSXNvNzgxNlJzdE1DKSB7Ci0gICAgICAgIFBJT19DbGVhcihzdF9waW5Jc283ODE2UnN0TUMpOwotICAgIH0KKwkvKiBDbGVhciBSRVNFVCBNYXN0ZXIgQ2FyZCAqLworCWlmIChzdF9waW5Jc283ODE2UnN0TUMpIHsKKwkJUElPX0NsZWFyKHN0X3Bpbklzbzc4MTZSc3RNQyk7CisJfQogfQogCiAvKioKQEAgLTIwNywxNTkgKzIwNywxNTkgQEAKICAqIFxyZXR1cm4gICAgICAgICAgICAgIDAgb24gc3VjY2VzcywgY29udGVudCBvZiBVU19DU1Igb3RoZXJ3aXNlCiAgKi8KIHVpbnQzMl90IElTTzc4MTZfWGZyQmxvY2tUUERVX1QwKGNvbnN0IHVpbnQ4X3QgKnBBUERVLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnJldGxlbiApCisJCQkJCSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcE1lc3NhZ2UsCisJCQkJCSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0xlbmd0aCwKKwkJCQkJICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcmV0bGVuICkKIHsKLSAgICB1aW50MTZfdCBOZU5jOwotICAgIHVpbnQxNl90IGluZGV4QXBkdSA9IDQ7Ci0gICAgdWludDE2X3QgaW5kZXhNc2cgPSAwOwotICAgIHVpbnQ4X3QgU1cxID0gMDsKLSAgICB1aW50OF90IHByb2NCeXRlOwotICAgIHVpbnQ4X3QgY21kQ2FzZTsKLSAgICB1aW50MzJfdCBzdGF0dXMgPSAwOworCXVpbnQxNl90IE5lTmM7CisJdWludDE2X3QgaW5kZXhBcGR1ID0gNDsKKwl1aW50MTZfdCBpbmRleE1zZyA9IDA7CisJdWludDhfdCBTVzEgPSAwOworCXVpbnQ4X3QgcHJvY0J5dGU7CisJdWludDhfdCBjbWRDYXNlOworCXVpbnQzMl90IHN0YXR1cyA9IDA7CiAKLSAgICBUUkFDRV9JTkZPKCJwQVBEVVswXT0weCVYXG5cciIscEFQRFVbMF0pOwotICAgIFRSQUNFX0lORk8oInBBUERVWzFdPTB4JVhcblxyIixwQVBEVVsxXSk7Ci0gICAgVFJBQ0VfSU5GTygicEFQRFVbMl09MHglWFxuXHIiLHBBUERVWzJdKTsKLSAgICBUUkFDRV9JTkZPKCJwQVBEVVszXT0weCVYXG5cciIscEFQRFVbM10pOwotICAgIFRSQUNFX0lORk8oInBBUERVWzRdPTB4JVhcblxyIixwQVBEVVs0XSk7Ci0gICAgVFJBQ0VfSU5GTygicEFQRFVbNV09MHglWFxuXHIiLHBBUERVWzVdKTsKLSAgICBUUkFDRV9JTkZPKCJ3bGVuZ3RoPSVkXG5cciIsd0xlbmd0aCk7CisJVFJBQ0VfSU5GTygicEFQRFVbMF09MHglWFxuXHIiLHBBUERVWzBdKTsKKwlUUkFDRV9JTkZPKCJwQVBEVVsxXT0weCVYXG5cciIscEFQRFVbMV0pOworCVRSQUNFX0lORk8oInBBUERVWzJdPTB4JVhcblxyIixwQVBEVVsyXSk7CisJVFJBQ0VfSU5GTygicEFQRFVbM109MHglWFxuXHIiLHBBUERVWzNdKTsKKwlUUkFDRV9JTkZPKCJwQVBEVVs0XT0weCVYXG5cciIscEFQRFVbNF0pOworCVRSQUNFX0lORk8oInBBUERVWzVdPTB4JVhcblxyIixwQVBEVVs1XSk7CisJVFJBQ0VfSU5GTygid2xlbmd0aD0lZFxuXHIiLHdMZW5ndGgpOwogCi0gICAgSVNPNzgxNl9TZW5kQ2hhciggcEFQRFVbMF0sICZ1c2FydF9zaW0gKTsgLyogQ0xBICovCi0gICAgSVNPNzgxNl9TZW5kQ2hhciggcEFQRFVbMV0sICZ1c2FydF9zaW0gKTsgLyogSU5TICovCi0gICAgSVNPNzgxNl9TZW5kQ2hhciggcEFQRFVbMl0sICZ1c2FydF9zaW0gKTsgLyogUDEgKi8KLSAgICBJU083ODE2X1NlbmRDaGFyKCBwQVBEVVszXSwgJnVzYXJ0X3NpbSApOyAvKiBQMiAqLwotICAgIElTTzc4MTZfU2VuZENoYXIoIHBBUERVWzRdLCAmdXNhcnRfc2ltICk7IC8qIFAzICovCisJSVNPNzgxNl9TZW5kQ2hhciggcEFQRFVbMF0sICZ1c2FydF9zaW0gKTsgLyogQ0xBICovCisJSVNPNzgxNl9TZW5kQ2hhciggcEFQRFVbMV0sICZ1c2FydF9zaW0gKTsgLyogSU5TICovCisJSVNPNzgxNl9TZW5kQ2hhciggcEFQRFVbMl0sICZ1c2FydF9zaW0gKTsgLyogUDEgKi8KKwlJU083ODE2X1NlbmRDaGFyKCBwQVBEVVszXSwgJnVzYXJ0X3NpbSApOyAvKiBQMiAqLworCUlTTzc4MTZfU2VuZENoYXIoIHBBUERVWzRdLCAmdXNhcnRfc2ltICk7IC8qIFAzICovCiAKLSAgICAvKiBIYW5kbGUgdGhlIGZvdXIgc3RydWN0dXJlcyBvZiBjb21tYW5kIEFQRFUgKi8KLSAgICBpbmRleEFwZHUgPSA1OworCS8qIEhhbmRsZSB0aGUgZm91ciBzdHJ1Y3R1cmVzIG9mIGNvbW1hbmQgQVBEVSAqLworCWluZGV4QXBkdSA9IDU7CiAKLSAgICBpZiggd0xlbmd0aCA9PSA0ICkgewotICAgICAgICBjbWRDYXNlID0gQ0FTRTE7Ci0gICAgICAgIE5lTmMgPSAwOwotICAgIH0KLSAgICBlbHNlIGlmKCB3TGVuZ3RoID09IDUpIHsKLSAgICAgICAgY21kQ2FzZSA9IENBU0UyOwotICAgICAgICBOZU5jID0gcEFQRFVbNF07IC8qIEM1ICovCi0gICAgICAgIGlmIChOZU5jID09IDApIHsKLSAgICAgICAgICAgIE5lTmMgPSAyNTY7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiggd0xlbmd0aCA9PSA2KSB7Ci0gICAgICAgIE5lTmMgPSBwQVBEVVs0XTsgLyogQzUgKi8KLSAgICAgICAgY21kQ2FzZSA9IENBU0UzOwotICAgIH0KLSAgICBlbHNlIGlmKCB3TGVuZ3RoID09IDcpIHsKLSAgICAgICAgTmVOYyA9IHBBUERVWzRdOyAvKiBDNSAqLwotICAgICAgICBpZiggTmVOYyA9PSAwICkgewotICAgICAgICAgICAgY21kQ2FzZSA9IENBU0UyOwotICAgICAgICAgICAgTmVOYyA9IChwQVBEVVs1XTw8OCkrcEFQRFVbNl07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjbWRDYXNlID0gQ0FTRTM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIE5lTmMgPSBwQVBEVVs0XTsgLyogQzUgKi8KLSAgICAgICAgaWYoIE5lTmMgPT0gMCApIHsKLSAgICAgICAgICAgIGNtZENhc2UgPSBDQVNFMzsKLSAgICAgICAgICAgIE5lTmMgPSAocEFQRFVbNV08PDgpK3BBUERVWzZdOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY21kQ2FzZSA9IENBU0UzOwotICAgICAgICB9Ci0gICAgfQorCWlmKCB3TGVuZ3RoID09IDQgKSB7CisJCWNtZENhc2UgPSBDQVNFMTsKKwkJTmVOYyA9IDA7CisJfQorCWVsc2UgaWYoIHdMZW5ndGggPT0gNSkgeworCQljbWRDYXNlID0gQ0FTRTI7CisJCU5lTmMgPSBwQVBEVVs0XTsgLyogQzUgKi8KKwkJaWYgKE5lTmMgPT0gMCkgeworCQkJTmVOYyA9IDI1NjsKKwkJfQorCX0KKwllbHNlIGlmKCB3TGVuZ3RoID09IDYpIHsKKwkJTmVOYyA9IHBBUERVWzRdOyAvKiBDNSAqLworCQljbWRDYXNlID0gQ0FTRTM7CisJfQorCWVsc2UgaWYoIHdMZW5ndGggPT0gNykgeworCQlOZU5jID0gcEFQRFVbNF07IC8qIEM1ICovCisJCWlmKCBOZU5jID09IDAgKSB7CisJCQljbWRDYXNlID0gQ0FTRTI7CisJCQlOZU5jID0gKHBBUERVWzVdPDw4KStwQVBEVVs2XTsKKwkJfQorCQllbHNlIHsKKwkJCWNtZENhc2UgPSBDQVNFMzsKKwkJfQorCX0KKwllbHNlIHsKKwkJTmVOYyA9IHBBUERVWzRdOyAvKiBDNSAqLworCQlpZiggTmVOYyA9PSAwICkgeworCQkJY21kQ2FzZSA9IENBU0UzOworCQkJTmVOYyA9IChwQVBEVVs1XTw8OCkrcEFQRFVbNl07CisJCX0KKwkJZWxzZSB7CisJCQljbWRDYXNlID0gQ0FTRTM7CisJCX0KKwl9CiAKLSAgICBUUkFDRV9ERUJVRygiQ0FTRT0weCVYIE5lTmM9MHglWFxuXHIiLCBjbWRDYXNlLCBOZU5jKTsKKwlUUkFDRV9ERUJVRygiQ0FTRT0weCVYIE5lTmM9MHglWFxuXHIiLCBjbWRDYXNlLCBOZU5jKTsKIAotICAgIC8qIEhhbmRsZSBQcm9jZWR1cmUgQnl0ZXMgKi8KLSAgICBkbyB7Ci0gICAgICAgIHN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcHJvY0J5dGUsICZ1c2FydF9zaW0pOwotICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgVFJBQ0VfSU5GTygicHJvY0J5dGU6IDB4JVhcblxyIiwgcHJvY0J5dGUpOwotICAgICAgICAvKiBIYW5kbGUgTlVMTCAqLwotICAgICAgICBpZiAoIHByb2NCeXRlID09IElTT19OVUxMX1ZBTCApIHsKLSAgICAgICAgICAgIFRSQUNFX0lORk8oIklOU1xuXHIiKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8qIEhhbmRsZSBTVzEgKi8KLSAgICAgICAgZWxzZSBpZiAoICgocHJvY0J5dGUgJiAweEYwKSA9PTB4NjApIHx8ICgocHJvY0J5dGUgJiAweEYwKSA9PTB4OTApICkgewotICAgICAgICAgICAgVFJBQ0VfSU5GTygiU1cxXG5cciIpOwotICAgICAgICAgICAgU1cxID0gMTsKLSAgICAgICAgfQotICAgICAgICAvKiBIYW5kbGUgSU5TICovCi0gICAgICAgIGVsc2UgaWYgKCBwQVBEVVsxXSA9PSBwcm9jQnl0ZSkgewotICAgICAgICAgICAgVFJBQ0VfSU5GTygiSGRsSU5TXG5cciIpOwotICAgICAgICAgICAgaWYgKGNtZENhc2UgPT0gQ0FTRTIpIHsKLSAgICAgICAgICAgICAgICAvKiByZWNlaXZlIGRhdGEgZnJvbSBjYXJkICovCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJU083ODE2X0dldENoYXIoJnBNZXNzYWdlW2luZGV4TXNnKytdLCAmdXNhcnRfc2ltKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlKCggMCAhPSAtLU5lTmMpICYmIChzdGF0dXMgPT0gMCkgKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgLyogU2VuZCBkYXRhICovCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBUUkFDRV9JTkZPKCJTZW5kICVYIiwgcEFQRFVbaW5kZXhBcGR1XSk7Ci0gICAgICAgICAgICAgICAgICAgIElTTzc4MTZfU2VuZENoYXIocEFQRFVbaW5kZXhBcGR1KytdLCAmdXNhcnRfc2ltKTsKLSAgICAgICAgICAgICAgICB9IHdoaWxlKCAwICE9IC0tTmVOYyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIEhhbmRsZSBJTlMgXiAweGZmICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0gICAgICAgICNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdzaWduLWNvbXBhcmUiCi0gICAgICAgIGlmICggcEFQRFVbMV0gPT0gKHByb2NCeXRlIF4gMHhmZikpIHsKLSAgICAgICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKLSAgICAgICAgICAgIFRSQUNFX0lORk8oIkhkbElOUytcblxyIik7Ci0gICAgICAgICAgICBpZiAoY21kQ2FzZSA9PSBDQVNFMikgewotICAgICAgICAgICAgICAgIC8qIHJlY2VpdmUgZGF0YSBmcm9tIGNhcmQgKi8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBJU083ODE2X0dldENoYXIoJnBNZXNzYWdlW2luZGV4TXNnKytdLCAmdXNhcnRfc2ltKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgVFJBQ0VfSU5GTygiUmN2OiAweCVYXG5cciIsIHBNZXNzYWdlW2luZGV4TXNnLTFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElTTzc4MTZfU2VuZENoYXIocEFQRFVbaW5kZXhBcGR1KytdLCAmdXNhcnRfc2ltKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOZU5jLS07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvKiA/PyAqLwotICAgICAgICAgICAgVFJBQ0VfSU5GTygicHJvY0J5dGU9MHglWFxuXHIiLCBwcm9jQnl0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKE5lTmMgIT0gMCk7CisJLyogSGFuZGxlIFByb2NlZHVyZSBCeXRlcyAqLworCWRvIHsKKwkJc3RhdHVzID0gSVNPNzgxNl9HZXRDaGFyKCZwcm9jQnl0ZSwgJnVzYXJ0X3NpbSk7CisJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlUUkFDRV9JTkZPKCJwcm9jQnl0ZTogMHglWFxuXHIiLCBwcm9jQnl0ZSk7CisJCS8qIEhhbmRsZSBOVUxMICovCisJCWlmICggcHJvY0J5dGUgPT0gSVNPX05VTExfVkFMICkgeworCQkJVFJBQ0VfSU5GTygiSU5TXG5cciIpOworCQkJY29udGludWU7CisJCX0KKwkJLyogSGFuZGxlIFNXMSAqLworCQllbHNlIGlmICggKChwcm9jQnl0ZSAmIDB4RjApID09MHg2MCkgfHwgKChwcm9jQnl0ZSAmIDB4RjApID09MHg5MCkgKSB7CisJCQlUUkFDRV9JTkZPKCJTVzFcblxyIik7CisJCQlTVzEgPSAxOworCQl9CisJCS8qIEhhbmRsZSBJTlMgKi8KKwkJZWxzZSBpZiAoIHBBUERVWzFdID09IHByb2NCeXRlKSB7CisJCQlUUkFDRV9JTkZPKCJIZGxJTlNcblxyIik7CisJCQlpZiAoY21kQ2FzZSA9PSBDQVNFMikgeworCQkJCS8qIHJlY2VpdmUgZGF0YSBmcm9tIGNhcmQgKi8KKwkJCQlkbyB7CisJCQkJCXN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcE1lc3NhZ2VbaW5kZXhNc2crK10sICZ1c2FydF9zaW0pOworCQkJCX0gd2hpbGUoKCAwICE9IC0tTmVOYykgJiYgKHN0YXR1cyA9PSAwKSApOworCQkJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgeworCQkJCSAvKiBTZW5kIGRhdGEgKi8KKwkJCQlkbyB7CisJCQkJCVRSQUNFX0lORk8oIlNlbmQgJVgiLCBwQVBEVVtpbmRleEFwZHVdKTsKKwkJCQkJSVNPNzgxNl9TZW5kQ2hhcihwQVBEVVtpbmRleEFwZHUrK10sICZ1c2FydF9zaW0pOworCQkJCX0gd2hpbGUoIDAgIT0gLS1OZU5jICk7CisJCQl9CisJCX0KKwkJLyogSGFuZGxlIElOUyBeIDB4ZmYgKi8KKwkJZWxzZQorCQkjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKwkJI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3NpZ24tY29tcGFyZSIKKwkJaWYgKCBwQVBEVVsxXSA9PSAocHJvY0J5dGUgXiAweGZmKSkgeworCQkjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorCQkJVFJBQ0VfSU5GTygiSGRsSU5TK1xuXHIiKTsKKwkJCWlmIChjbWRDYXNlID09IENBU0UyKSB7CisJCQkJLyogcmVjZWl2ZSBkYXRhIGZyb20gY2FyZCAqLworCQkJCXN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcE1lc3NhZ2VbaW5kZXhNc2crK10sICZ1c2FydF9zaW0pOworCQkJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKwkJCQlUUkFDRV9JTkZPKCJSY3Y6IDB4JVhcblxyIiwgcE1lc3NhZ2VbaW5kZXhNc2ctMV0pOworCQkJfQorCQkJZWxzZSB7CisJCQkJc3RhdHVzID0gSVNPNzgxNl9TZW5kQ2hhcihwQVBEVVtpbmRleEFwZHUrK10sICZ1c2FydF9zaW0pOworCQkJCWlmIChzdGF0dXMgIT0gMCkgeworCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKwkJCX0KKwkJCU5lTmMtLTsKKwkJfQorCQllbHNlIHsKKwkJCS8qID8/ICovCisJCQlUUkFDRV9JTkZPKCJwcm9jQnl0ZT0weCVYXG5cciIsIHByb2NCeXRlKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoTmVOYyAhPSAwKTsKIAotICAgIC8qIFN0YXR1cyBCeXRlcyAqLwotICAgIGlmIChTVzEgPT0gMCkgewotICAgICAgICBzdGF0dXMgPSBJU083ODE2X0dldENoYXIoJnBNZXNzYWdlW2luZGV4TXNnKytdLCAmdXNhcnRfc2ltKTsgLyogU1cxICovCi0gICAgICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcE1lc3NhZ2VbaW5kZXhNc2crK10gPSBwcm9jQnl0ZTsKLSAgICB9Ci0gICAgc3RhdHVzID0gSVNPNzgxNl9HZXRDaGFyKCZwTWVzc2FnZVtpbmRleE1zZysrXSwgJnVzYXJ0X3NpbSk7IC8qIFNXMiAqLwotICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KKwkvKiBTdGF0dXMgQnl0ZXMgKi8KKwlpZiAoU1cxID09IDApIHsKKwkJc3RhdHVzID0gSVNPNzgxNl9HZXRDaGFyKCZwTWVzc2FnZVtpbmRleE1zZysrXSwgJnVzYXJ0X3NpbSk7IC8qIFNXMSAqLworCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwl9CisJZWxzZSB7CisJCXBNZXNzYWdlW2luZGV4TXNnKytdID0gcHJvY0J5dGU7CisJfQorCXN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcE1lc3NhZ2VbaW5kZXhNc2crK10sICZ1c2FydF9zaW0pOyAvKiBTVzIgKi8KKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLSAgICBUUkFDRV9XQVJOSU5HKCJTVzE9MHglWCwgU1cyPTB4JVhcblxyIiwgcE1lc3NhZ2VbaW5kZXhNc2ctMl0sIHBNZXNzYWdlW2luZGV4TXNnLTFdKTsKKwlUUkFDRV9XQVJOSU5HKCJTVzE9MHglWCwgU1cyPTB4JVhcblxyIiwgcE1lc3NhZ2VbaW5kZXhNc2ctMl0sIHBNZXNzYWdlW2luZGV4TXNnLTFdKTsKIAotICAgICpyZXRsZW4gPSBpbmRleE1zZzsKLSAgICByZXR1cm4gc3RhdHVzOworCSpyZXRsZW4gPSBpbmRleE1zZzsKKwlyZXR1cm4gc3RhdHVzOwogCiB9CiAKQEAgLTM2OCw3ICszNjgsNyBAQAogICovCiB2b2lkIElTTzc4MTZfRXNjYXBlKCB2b2lkICkKIHsKLSAgICBUUkFDRV9ERUJVRygiRm9yIHVzZXIsIGlmIG5lZWRlZFxuXHIiKTsKKwlUUkFDRV9ERUJVRygiRm9yIHVzZXIsIGlmIG5lZWRlZFxuXHIiKTsKIH0KIAogLyoqCkBAIC0zNzYsOCArMzc2LDggQEAKICAqLwogdm9pZCBJU083ODE2X1Jlc3RhcnRDbG9jayggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIklTTzc4MTZfUmVzdGFydENsb2NrXG5cciIpOwotICAgIFVTQVJUX1NJTS0+VVNfQlJHUiA9IDEzOworCVRSQUNFX0RFQlVHKCJJU083ODE2X1Jlc3RhcnRDbG9ja1xuXHIiKTsKKwlVU0FSVF9TSU0tPlVTX0JSR1IgPSAxMzsKIH0KIAogLyoqCkBAIC0zODUsOCArMzg1LDggQEAKICAqLwogdm9pZCBJU083ODE2X1N0b3BDbG9jayggdm9pZCApCiB7Ci0gICAgVFJBQ0VfREVCVUcoIklTTzc4MTZfU3RvcENsb2NrXG5cciIpOwotICAgIFVTQVJUX1NJTS0+VVNfQlJHUiA9IDA7CisJVFJBQ0VfREVCVUcoIklTTzc4MTZfU3RvcENsb2NrXG5cciIpOworCVVTQVJUX1NJTS0+VVNfQlJHUiA9IDA7CiB9CiAKIC8qKgpAQCAtMzk0LDggKzM5NCw4IEBACiAgKi8KIHZvaWQgSVNPNzgxNl90b0FQRFUoIHZvaWQgKQogewotICAgIFRSQUNFX0RFQlVHKCJJU083ODE2X3RvQVBEVVxuXHIiKTsKLSAgICBUUkFDRV9ERUJVRygiTm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWVcblxyIik7CisJVFJBQ0VfREVCVUcoIklTTzc4MTZfdG9BUERVXG5cciIpOworCVRSQUNFX0RFQlVHKCJOb3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZVxuXHIiKTsKIH0KIAogLyoqCkBAIC00MDYsNjQgKzQwNiw2NCBAQAogICovCiB1aW50MzJfdCBJU083ODE2X0RhdGFibG9ja19BVFIoIHVpbnQ4X3QqIHBBdHIsIHVpbnQ4X3QqIHBMZW5ndGggKQogewotICAgIHVpbnQzMl90IGk7Ci0gICAgdWludDMyX3QgajsKLSAgICB1aW50MzJfdCB5OwotICAgIHVpbnQzMl90IHN0YXR1cyA9IDA7IAorCXVpbnQzMl90IGk7CisJdWludDMyX3QgajsKKwl1aW50MzJfdCB5OworCXVpbnQzMl90IHN0YXR1cyA9IDA7IAogCi0gICAgKnBMZW5ndGggPSAwOworCSpwTGVuZ3RoID0gMDsKIAotICAgIC8qIFJlYWQgQVRSIFRTICovCi0gICAgLy8gRklYTUU6IFRoZXJlIHNob3VsZCBhbHdheXMgYmUgYSBjaGVjayBmb3IgdGhlIEdldENoYXIgcmV0dXJuIHZhbHVlLi4wIG1lYW5zIHRpbWVvdXQKLSAgICBzdGF0dXMgPSBJU083ODE2X0dldENoYXIoJnBBdHJbMF0sICZ1c2FydF9zaW0pOwotICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KKwkvKiBSZWFkIEFUUiBUUyAqLworCS8vIEZJWE1FOiBUaGVyZSBzaG91bGQgYWx3YXlzIGJlIGEgY2hlY2sgZm9yIHRoZSBHZXRDaGFyIHJldHVybiB2YWx1ZS4uMCBtZWFucyB0aW1lb3V0CisJc3RhdHVzID0gSVNPNzgxNl9HZXRDaGFyKCZwQXRyWzBdLCAmdXNhcnRfc2ltKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLSAgICAvKiBSZWFkIEFUUiBUMCAqLwotICAgIHN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcEF0clsxXSwgJnVzYXJ0X3NpbSk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHkgPSBwQXRyWzFdICYgMHhGMDsKLSAgICBpID0gMjsKKwkvKiBSZWFkIEFUUiBUMCAqLworCXN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcEF0clsxXSwgJnVzYXJ0X3NpbSk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXkgPSBwQXRyWzFdICYgMHhGMDsKKwlpID0gMjsKIAotICAgIC8qIFJlYWQgQVRSIFRpICovCi0gICAgd2hpbGUgKHkgJiYgKHN0YXR1cyA9PSAwKSkgeworCS8qIFJlYWQgQVRSIFRpICovCisJd2hpbGUgKHkgJiYgKHN0YXR1cyA9PSAwKSkgewogCi0gICAgICAgIGlmICh5ICYgMHgxMCkgeyAgLyogVEFbaV0gKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcEF0cltpKytdLCAmdXNhcnRfc2ltKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoeSAmIDB4MjApIHsgIC8qIFRCW2ldICovCi0gICAgICAgICAgICBzdGF0dXMgPSBJU083ODE2X0dldENoYXIoJnBBdHJbaSsrXSwgJnVzYXJ0X3NpbSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHkgJiAweDQwKSB7ICAvKiBUQ1tpXSAqLwotICAgICAgICAgICAgc3RhdHVzID0gSVNPNzgxNl9HZXRDaGFyKCZwQXRyW2krK10sICZ1c2FydF9zaW0pOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5ICYgMHg4MCkgeyAgLyogVERbaV0gKi8KLSAgICAgICAgICAgIHN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcEF0cltpXSwgJnVzYXJ0X3NpbSk7Ci0gICAgICAgICAgICB5ID0gIHBBdHJbaSsrXSAmIDB4RjA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9CisJCWlmICh5ICYgMHgxMCkgeyAgLyogVEFbaV0gKi8KKwkJCXN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcEF0cltpKytdLCAmdXNhcnRfc2ltKTsKKwkJfQorCQlpZiAoeSAmIDB4MjApIHsgIC8qIFRCW2ldICovCisJCQlzdGF0dXMgPSBJU083ODE2X0dldENoYXIoJnBBdHJbaSsrXSwgJnVzYXJ0X3NpbSk7CisJCX0KKwkJaWYgKHkgJiAweDQwKSB7ICAvKiBUQ1tpXSAqLworCQkJc3RhdHVzID0gSVNPNzgxNl9HZXRDaGFyKCZwQXRyW2krK10sICZ1c2FydF9zaW0pOworCQl9CisJCWlmICh5ICYgMHg4MCkgeyAgLyogVERbaV0gKi8KKwkJCXN0YXR1cyA9IElTTzc4MTZfR2V0Q2hhcigmcEF0cltpXSwgJnVzYXJ0X3NpbSk7CisJCQl5ID0gIHBBdHJbaSsrXSAmIDB4RjA7CisJCX0KKwkJZWxzZSB7CisJCQl5ID0gMDsKKwkJfQorCX0KKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLSAgICAvKiBIaXN0b3JpY2FsIEJ5dGVzICovCi0gICAgeSA9IHBBdHJbMV0gJiAweDBGOwotICAgIGZvciggaj0wOyAoaiA8IHkpICYmIChzdGF0dXMgPT0gMCk7IGorKyApIHsKLSAgICAgICAgc3RhdHVzID0gSVNPNzgxNl9HZXRDaGFyKCZwQXRyW2krK10sICZ1c2FydF9zaW0pOwotICAgIH0KKwkvKiBIaXN0b3JpY2FsIEJ5dGVzICovCisJeSA9IHBBdHJbMV0gJiAweDBGOworCWZvciggaj0wOyAoaiA8IHkpICYmIChzdGF0dXMgPT0gMCk7IGorKyApIHsKKwkJc3RhdHVzID0gSVNPNzgxNl9HZXRDaGFyKCZwQXRyW2krK10sICZ1c2FydF9zaW0pOworCX0KIAotICAgIGlmIChzdGF0dXMgIT0gMCkgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CiAKLSAgICAqcExlbmd0aCA9IGk7Ci0gICAgcmV0dXJuIHN0YXR1czsKKwkqcExlbmd0aCA9IGk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogLyoqCkBAIC00NzMsMTggKzQ3MywxOCBAQAogICovCiB2b2lkIElTTzc4MTZfU2V0RGF0YVJhdGVhbmRDbG9ja0ZyZXF1ZW5jeSggdWludDMyX3QgZHdDbG9ja0ZyZXF1ZW5jeSwgdWludDMyX3QgZHdEYXRhUmF0ZSApCiB7Ci0gICAgdWludDhfdCBDbG9ja0ZyZXF1ZW5jeTsKKwl1aW50OF90IENsb2NrRnJlcXVlbmN5OwogCi0gICAgLyogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlciAqLwotICAgIC8qIENEICA9IE1DSyAvIFNDSyAqLwotICAgIC8qIFNDSyA9IEZJREkgeCBCQVVEID0gMzcyIHggOTYwMCAqLwotICAgIC8qIEJPQVJEX01DSyAqLwotICAgIC8qIENEID0gTUNLLyhGSURJIHggQkFVRCkgPSA0ODAwMDAwMCAvICgzNzJ4OTYwMCkgPSAxMyAqLwotICAgIFVTQVJUX1NJTS0+VVNfQlJHUiA9IEJPQVJEX01DSyAvIChkd0Nsb2NrRnJlcXVlbmN5KjEwMDApOworCS8qIERlZmluZSB0aGUgYmF1ZCByYXRlIGRpdmlzb3IgcmVnaXN0ZXIgKi8KKwkvKiBDRCAgPSBNQ0sgLyBTQ0sgKi8KKwkvKiBTQ0sgPSBGSURJIHggQkFVRCA9IDM3MiB4IDk2MDAgKi8KKwkvKiBCT0FSRF9NQ0sgKi8KKwkvKiBDRCA9IE1DSy8oRklESSB4IEJBVUQpID0gNDgwMDAwMDAgLyAoMzcyeDk2MDApID0gMTMgKi8KKwlVU0FSVF9TSU0tPlVTX0JSR1IgPSBCT0FSRF9NQ0sgLyAoZHdDbG9ja0ZyZXF1ZW5jeSoxMDAwKTsKIAotICAgIENsb2NrRnJlcXVlbmN5ID0gQk9BUkRfTUNLIC8gVVNBUlRfU0lNLT5VU19CUkdSOworCUNsb2NrRnJlcXVlbmN5ID0gQk9BUkRfTUNLIC8gVVNBUlRfU0lNLT5VU19CUkdSOwogCi0gICAgVVNBUlRfU0lNLT5VU19GSURJID0gKENsb2NrRnJlcXVlbmN5KS9kd0RhdGFSYXRlOworCVVTQVJUX1NJTS0+VVNfRklESSA9IChDbG9ja0ZyZXF1ZW5jeSkvZHdEYXRhUmF0ZTsKIAogfQogCkBAIC00OTQsMTAgKzQ5NCwxMCBAQAogICovCiB1aW50OF90IElTTzc4MTZfU3RhdHVzUmVzZXQoIHZvaWQgKQogewotICAgIGlmIChzdF9waW5Jc283ODE2UnN0TUMpIHsKLSAgICAgICAgcmV0dXJuIFBJT19HZXQoc3RfcGluSXNvNzgxNlJzdE1DKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisJaWYgKHN0X3Bpbklzbzc4MTZSc3RNQykgeworCQlyZXR1cm4gUElPX0dldChzdF9waW5Jc283ODE2UnN0TUMpOworCX0KKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC01MDUsMTYgKzUwNSwxNiBAQAogICovCiB2b2lkIElTTzc4MTZfY29sZF9yZXNldCggdm9pZCApCiB7Ci0gICAgdm9sYXRpbGUgdWludDMyX3QgaTsKKwl2b2xhdGlsZSB1aW50MzJfdCBpOwogCi0gICAgLyogdGI6IHdhaXQgPz8/IGN5Y2xlcyovCi0gICAgZm9yKCBpPTA7IGk8KDQwMCooQk9BUkRfTUNLLzEwMDAwMDApKTsgaSsrICkgewotICAgIH0KKwkvKiB0Yjogd2FpdCA/Pz8gY3ljbGVzKi8KKwlmb3IoIGk9MDsgaTwoNDAwKihCT0FSRF9NQ0svMTAwMDAwMCkpOyBpKysgKSB7CisJfQogCi0gICAgVVNBUlRfU0lNLT5VU19SSFI7Ci0gICAgVVNBUlRfU0lNLT5VU19DUiA9IFVTX0NSX1JTVFNUQSB8IFVTX0NSX1JTVElUIHwgVVNfQ1JfUlNUTkFDSzsKKwlVU0FSVF9TSU0tPlVTX1JIUjsKKwlVU0FSVF9TSU0tPlVTX0NSID0gVVNfQ1JfUlNUU1RBIHwgVVNfQ1JfUlNUSVQgfCBVU19DUl9SU1ROQUNLOwogCi0gICAgSVNPNzgxNl9JY2NQb3dlck9uKCk7CisJSVNPNzgxNl9JY2NQb3dlck9uKCk7CiB9CiAKIC8qKgpAQCAtNTIyLDIwICs1MjIsMjAgQEAKICAqLwogdm9pZCBJU083ODE2X3dhcm1fcmVzZXQoIHZvaWQgKQogewotICAgIHZvbGF0aWxlIHVpbnQzMl90IGk7CisJdm9sYXRpbGUgdWludDMyX3QgaTsKIAogLy8gQ2xlYXJzIFJlc2V0Ci0gICAgSVNPNzgxNl9JY2NQb3dlck9mZigpOworCUlTTzc4MTZfSWNjUG93ZXJPZmYoKTsKIAotICAgIC8qIHRiOiB3YWl0ID8/PyBjeWNsZXMgKi8KLSAgICBmb3IoIGk9MDsgaTwoNDAwKihCT0FSRF9NQ0svMTAwMDAwMCkpOyBpKysgKSB7Ci0gICAgfQorCS8qIHRiOiB3YWl0ID8/PyBjeWNsZXMgKi8KKwlmb3IoIGk9MDsgaTwoNDAwKihCT0FSRF9NQ0svMTAwMDAwMCkpOyBpKysgKSB7CisJfQogCi0gICAgVVNBUlRfU0lNLT5VU19SSFI7Ci0gICAgVVNBUlRfU0lNLT5VU19DUiA9IFVTX0NSX1JTVFNUQSB8IFVTX0NSX1JTVElUIHwgVVNfQ1JfUlNUTkFDSzsKKwlVU0FSVF9TSU0tPlVTX1JIUjsKKwlVU0FSVF9TSU0tPlVTX0NSID0gVVNfQ1JfUlNUU1RBIHwgVVNfQ1JfUlNUSVQgfCBVU19DUl9SU1ROQUNLOwogCiAvLyBTZXRzIFJlc2V0Ci0gICAgSVNPNzgxNl9JY2NQb3dlck9uKCk7CisJSVNPNzgxNl9JY2NQb3dlck9uKCk7CiB9CiAKIC8qKgpAQCAtNTQ0LDk5ICs1NDQsOTkgQEAKICAqLwogdm9pZCBJU083ODE2X0RlY29kZV9BVFIoIHVpbnQ4X3QqIHBBdHIgKQogewotICAgIHVpbnQzMl90IGk7Ci0gICAgdWludDMyX3QgajsKLSAgICB1aW50MzJfdCB5OwotICAgIHVpbnQ4X3Qgb2Zmc2V0OworCXVpbnQzMl90IGk7CisJdWludDMyX3QgajsKKwl1aW50MzJfdCB5OworCXVpbnQ4X3Qgb2Zmc2V0OwogCi0gICAgcHJpbnRmKCJcblxyIik7Ci0gICAgcHJpbnRmKCJBVFI6IEFuc3dlciBUbyBSZXNldDpcblxyIik7Ci0gICAgcHJpbnRmKCJUUyA9IDB4JVggSW5pdGlhbCBjaGFyYWN0ZXIgIixwQXRyWzBdKTsKLSAgICBpZiggcEF0clswXSA9PSAweDNCICkgeworCXByaW50ZigiXG5cciIpOworCXByaW50ZigiQVRSOiBBbnN3ZXIgVG8gUmVzZXQ6XG5cciIpOworCXByaW50ZigiVFMgPSAweCVYIEluaXRpYWwgY2hhcmFjdGVyICIscEF0clswXSk7CisJaWYoIHBBdHJbMF0gPT0gMHgzQiApIHsKIAotICAgICAgICBwcmludGYoIkRpcmVjdCBDb252ZW50aW9uXG5cciIpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYoIHBBdHJbMF0gPT0gMHgzRiApIHsKKwkJcHJpbnRmKCJEaXJlY3QgQ29udmVudGlvblxuXHIiKTsKKwl9CisJZWxzZSB7CisJCWlmKCBwQXRyWzBdID09IDB4M0YgKSB7CiAKLSAgICAgICAgICAgIHByaW50ZigiSW52ZXJzZSBDb252ZW50aW9uXG5cciIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcHJpbnRmKCJCQUQgQ29udmVudGlvblxuXHIiKTsKLSAgICAgICAgfQotICAgIH0KKwkJCXByaW50ZigiSW52ZXJzZSBDb252ZW50aW9uXG5cciIpOworCQl9CisJCWVsc2UgeworCQkJcHJpbnRmKCJCQUQgQ29udmVudGlvblxuXHIiKTsKKwkJfQorCX0KIAotICAgIHByaW50ZigiVDAgPSAweCVYIEZvcm1hdCBjYXJhY3RlclxuXHIiLHBBdHJbMV0pOwotICAgIHByaW50ZigiICAgIE51bWJlciBvZiBoaXN0b3JpY2FsIGJ5dGVzOiBLID0gJWRcblxyIiwgcEF0clsxXSYweDBGKTsKLSAgICBwcmludGYoIiAgICBQcmVzZW5jZSBmdXJ0aGVyIGludGVyZmFjZSBieXRlOlxuXHIiKTsKLSAgICBpZiggcEF0clsxXSYweDgwICkgewotICAgICAgICBwcmludGYoIlRBICIpOwotICAgIH0KLSAgICBpZiggcEF0clsxXSYweDQwICkgewotICAgICAgICBwcmludGYoIlRCICIpOwotICAgIH0KLSAgICBpZiggcEF0clsxXSYweDIwICkgewotICAgICAgICBwcmludGYoIlRDICIpOwotICAgIH0KLSAgICBpZiggcEF0clsxXSYweDEwICkgewotICAgICAgICBwcmludGYoIlREICIpOwotICAgIH0KLSAgICBpZiggcEF0clsxXSAhPSAwICkgewotICAgICAgICBwcmludGYoIiBwcmVzZW50XG5cciIpOwotICAgIH0KKwlwcmludGYoIlQwID0gMHglWCBGb3JtYXQgY2FyYWN0ZXJcblxyIixwQXRyWzFdKTsKKwlwcmludGYoIiAgICBOdW1iZXIgb2YgaGlzdG9yaWNhbCBieXRlczogSyA9ICVkXG5cciIsIHBBdHJbMV0mMHgwRik7CisJcHJpbnRmKCIgICAgUHJlc2VuY2UgZnVydGhlciBpbnRlcmZhY2UgYnl0ZTpcblxyIik7CisJaWYoIHBBdHJbMV0mMHg4MCApIHsKKwkJcHJpbnRmKCJUQSAiKTsKKwl9CisJaWYoIHBBdHJbMV0mMHg0MCApIHsKKwkJcHJpbnRmKCJUQiAiKTsKKwl9CisJaWYoIHBBdHJbMV0mMHgyMCApIHsKKwkJcHJpbnRmKCJUQyAiKTsKKwl9CisJaWYoIHBBdHJbMV0mMHgxMCApIHsKKwkJcHJpbnRmKCJURCAiKTsKKwl9CisJaWYoIHBBdHJbMV0gIT0gMCApIHsKKwkJcHJpbnRmKCIgcHJlc2VudFxuXHIiKTsKKwl9CiAKLSAgICBpID0gMjsKLSAgICB5ID0gcEF0clsxXSAmIDB4RjA7CisJaSA9IDI7CisJeSA9IHBBdHJbMV0gJiAweEYwOwogCi0gICAgLyogUmVhZCBBVFIgVGkgKi8KLSAgICBvZmZzZXQgPSAxOwotICAgIHdoaWxlICh5KSB7CisJLyogUmVhZCBBVFIgVGkgKi8KKwlvZmZzZXQgPSAxOworCXdoaWxlICh5KSB7CiAKLSAgICAgICAgaWYgKHkgJiAweDEwKSB7ICAvKiBUQVtpXSAqLwotICAgICAgICAgICAgcHJpbnRmKCJUQVslZF0gPSAweCVYICIsIG9mZnNldCwgcEF0cltpXSk7Ci0gICAgICAgICAgICBpZiggb2Zmc2V0ID09IDEgKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJGSSA9ICVkICIsIChwQXRyW2ldPj44KSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJESSA9ICVkIiwgKHBBdHJbaV0mMHgwRikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCJcblxyIik7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHkgJiAweDIwKSB7ICAvKiBUQltpXSAqLwotICAgICAgICAgICAgcHJpbnRmKCJUQlslZF0gPSAweCVYXG5cciIsIG9mZnNldCwgcEF0cltpXSk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHkgJiAweDQwKSB7ICAvKiBUQ1tpXSAqLwotICAgICAgICAgICAgcHJpbnRmKCJUQ1slZF0gPSAweCVYICIsIG9mZnNldCwgcEF0cltpXSk7Ci0gICAgICAgICAgICBpZiggb2Zmc2V0ID09IDEgKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJFeHRyYSBHdWFyZCBUaW1lOiBOID0gJWQiLCBwQXRyW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50ZigiXG5cciIpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh5ICYgMHg4MCkgeyAgLyogVERbaV0gKi8KLSAgICAgICAgICAgIHByaW50ZigiVERbJWRdID0gMHglWFxuXHIiLCBvZmZzZXQsIHBBdHJbaV0pOwotICAgICAgICAgICAgeSA9ICBwQXRyW2krK10gJiAweEYwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgeSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0Kys7Ci0gICAgfQorCQlpZiAoeSAmIDB4MTApIHsgIC8qIFRBW2ldICovCisJCQlwcmludGYoIlRBWyVkXSA9IDB4JVggIiwgb2Zmc2V0LCBwQXRyW2ldKTsKKwkJCWlmKCBvZmZzZXQgPT0gMSApIHsKKwkJCQlwcmludGYoIkZJID0gJWQgIiwgKHBBdHJbaV0+PjgpKTsKKwkJCQlwcmludGYoIkRJID0gJWQiLCAocEF0cltpXSYweDBGKSk7CisJCQl9CisJCQlwcmludGYoIlxuXHIiKTsKKwkJCWkrKzsKKwkJfQorCQlpZiAoeSAmIDB4MjApIHsgIC8qIFRCW2ldICovCisJCQlwcmludGYoIlRCWyVkXSA9IDB4JVhcblxyIiwgb2Zmc2V0LCBwQXRyW2ldKTsKKwkJCWkrKzsKKwkJfQorCQlpZiAoeSAmIDB4NDApIHsgIC8qIFRDW2ldICovCisJCQlwcmludGYoIlRDWyVkXSA9IDB4JVggIiwgb2Zmc2V0LCBwQXRyW2ldKTsKKwkJCWlmKCBvZmZzZXQgPT0gMSApIHsKKwkJCQlwcmludGYoIkV4dHJhIEd1YXJkIFRpbWU6IE4gPSAlZCIsIHBBdHJbaV0pOworCQkJfQorCQkJcHJpbnRmKCJcblxyIik7CisJCQlpKys7CisJCX0KKwkJaWYgKHkgJiAweDgwKSB7ICAvKiBURFtpXSAqLworCQkJcHJpbnRmKCJURFslZF0gPSAweCVYXG5cciIsIG9mZnNldCwgcEF0cltpXSk7CisJCQl5ID0gIHBBdHJbaSsrXSAmIDB4RjA7CisJCX0KKwkJZWxzZSB7CisJCQl5ID0gMDsKKwkJfQorCQlvZmZzZXQrKzsKKwl9CiAKLSAgICAvKiBIaXN0b3JpY2FsIEJ5dGVzICovCi0gICAgcHJpbnRmKCJIaXN0b3JpY2FsIGJ5dGVzOlxuXHIiKTsKLSAgICB5ID0gcEF0clsxXSAmIDB4MEY7Ci0gICAgZm9yKCBqPTA7IGogPCB5OyBqKysgKSB7Ci0gICAgICAgIHByaW50ZigiIDB4JVgiLCBwQXRyW2ldKTsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICBwcmludGYoIlxuXHJcblxyIik7CisJLyogSGlzdG9yaWNhbCBCeXRlcyAqLworCXByaW50ZigiSGlzdG9yaWNhbCBieXRlczpcblxyIik7CisJeSA9IHBBdHJbMV0gJiAweDBGOworCWZvciggaj0wOyBqIDwgeTsgaisrICkgeworCQlwcmludGYoIiAweCVYIiwgcEF0cltpXSk7CisJCWkrKzsKKwl9CisJcHJpbnRmKCJcblxyXG5cciIpOwogCiB9CiAKIHZvaWQgSVNPNzgxNl9TZXRfUmVzZXRfUGluKGNvbnN0IFBpbiAqcFBpbklzbzc4MTZSc3RNQykgewotICAgIC8qIFBpbiBJU083ODE2IGluaXRpYWxpemUgKi8KLSAgICBzdF9waW5Jc283ODE2UnN0TUMgID0gKFBpbiAqKXBQaW5Jc283ODE2UnN0TUM7CisJLyogUGluIElTTzc4MTYgaW5pdGlhbGl6ZSAqLworCXN0X3Bpbklzbzc4MTZSc3RNQyAgPSAoUGluICopcFBpbklzbzc4MTZSc3RNQzsKIH0KIAogLyoqIEluaXRpYWxpemVzIGEgSVNPIGRyaXZlcgpAQCAtNjQ0LDQ2ICs2NDQsNDYgQEAKICAqLwogdm9pZCBJU083ODE2X0luaXQoIFVzYXJ0X2luZm8gKnVzYXJ0LCBib29sIG1hc3Rlcl9jbG9jayApCiB7Ci0gICAgdWludDMyX3QgY2xrOwotICAgIFRSQUNFX0RFQlVHKCJJU09fSW5pdFxuXHIiKTsKKwl1aW50MzJfdCBjbGs7CisJVFJBQ0VfREVCVUcoIklTT19Jbml0XG5cciIpOwogCi0gICAgVXNhcnQgKnVzX2Jhc2UgPSB1c2FydC0+YmFzZTsKLSAgICB1aW50MzJfdCB1c19pZCA9IHVzYXJ0LT5pZDsKKwlVc2FydCAqdXNfYmFzZSA9IHVzYXJ0LT5iYXNlOworCXVpbnQzMl90IHVzX2lkID0gdXNhcnQtPmlkOwogCi0gICAgaWYgKG1hc3Rlcl9jbG9jayA9PSB0cnVlKSB7Ci0gICAgICAgIGNsayA9IFVTX01SX1VTQ0xLU19NQ0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2xrID0gVVNfTVJfVVNDTEtTX1NDSzsKLSAgICB9CisJaWYgKG1hc3Rlcl9jbG9jayA9PSB0cnVlKSB7CisJCWNsayA9IFVTX01SX1VTQ0xLU19NQ0s7CisJfSBlbHNlIHsKKwkJY2xrID0gVVNfTVJfVVNDTEtTX1NDSzsKKwl9CiAKLSAgICBVU0FSVF9Db25maWd1cmUoIHVzX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICBVU19NUl9VU0FSVF9NT0RFX0lTMDc4MTZfVF8wCi0gICAgICAgICAgICAgICAgICAgICB8IGNsawotICAgICAgICAgICAgICAgICAgICAgfCBVU19NUl9OQlNUT1BfMV9CSVQKLSAgICAgICAgICAgICAgICAgICAgIHwgVVNfTVJfUEFSX0VWRU4KLSAgICAgICAgICAgICAgICAgICAgIHwgVVNfTVJfQ0hSTF84X0JJVAotICAgICAgICAgICAgICAgICAgICAgfCBVU19NUl9DTEtPCi0gICAgICAgICAgICAgICAgICAgICB8IFVTX01SX0lOQUNLICAvKiBJbmhpYml0IGVycm9ycyAqLwotICAgICAgICAgICAgICAgICAgICAgfCAoMzw8MjQpLCAvKiBNQVhfSVRFUkFUSU9OICovCi0gICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgMCk7CisJVVNBUlRfQ29uZmlndXJlKCB1c19iYXNlLAorCQkJCQkgVVNfTVJfVVNBUlRfTU9ERV9JUzA3ODE2X1RfMAorCQkJCQkgfCBjbGsKKwkJCQkJIHwgVVNfTVJfTkJTVE9QXzFfQklUCisJCQkJCSB8IFVTX01SX1BBUl9FVkVOCisJCQkJCSB8IFVTX01SX0NIUkxfOF9CSVQKKwkJCQkJIHwgVVNfTVJfQ0xLTworCQkJCQkgfCBVU19NUl9JTkFDSyAgLyogSW5oaWJpdCBlcnJvcnMgKi8KKwkJCQkJIHwgKDM8PDI0KSwgLyogTUFYX0lURVJBVElPTiAqLworCQkJCQkgMSwKKwkJCQkJIDApOwogCi0gICAgLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCi0gICAgdXNfYmFzZS0+VVNfSURSID0gKHVpbnQzMl90KSAtMTsKKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KKwl1c19iYXNlLT5VU19JRFIgPSAodWludDMyX3QpIC0xOwogCi0gICAgLyogQ29uZmlndXJlIFVTQVJUICovCi0gICAgUE1DX0VuYWJsZVBlcmlwaGVyYWwodXNfaWQpOworCS8qIENvbmZpZ3VyZSBVU0FSVCAqLworCVBNQ19FbmFibGVQZXJpcGhlcmFsKHVzX2lkKTsKIAotICAgIHVzX2Jhc2UtPlVTX0ZJREkgPSAzNzI7ICAvKiBieSBkZWZhdWx0ICovCi0gICAgLyogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlciAqLwotICAgIC8qIENEICA9IE1DSyAvIFNDSyAqLwotICAgIC8qIFNDSyA9IEZJREkgeCBCQVVEID0gMzcyIHggOTYwMCAqLwotICAgIC8qIEJPQVJEX01DSyAqLwotICAgIC8qIENEID0gTUNLLyhGSURJIHggQkFVRCkgPSA0ODAwMDAwMCAvICgzNzJ4OTYwMCkgPSAxMyAqLwotICAgIGlmIChtYXN0ZXJfY2xvY2sgPT0gdHJ1ZSkgewotICAgICAgICB1c19iYXNlLT5VU19CUkdSID0gQk9BUkRfTUNLIC8gKDM3Mio5NjAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICB1c19iYXNlLT5VU19CUkdSID0gVVNfQlJHUl9DRCgxKTsKLSAgICB9CisJdXNfYmFzZS0+VVNfRklESSA9IDM3MjsgIC8qIGJ5IGRlZmF1bHQgKi8KKwkvKiBEZWZpbmUgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyICovCisJLyogQ0QgID0gTUNLIC8gU0NLICovCisJLyogU0NLID0gRklESSB4IEJBVUQgPSAzNzIgeCA5NjAwICovCisJLyogQk9BUkRfTUNLICovCisJLyogQ0QgPSBNQ0svKEZJREkgeCBCQVVEKSA9IDQ4MDAwMDAwIC8gKDM3Mng5NjAwKSA9IDEzICovCisJaWYgKG1hc3Rlcl9jbG9jayA9PSB0cnVlKSB7CisJCXVzX2Jhc2UtPlVTX0JSR1IgPSBCT0FSRF9NQ0sgLyAoMzcyKjk2MDApOworCX0gZWxzZSB7CisJCXVzX2Jhc2UtPlVTX0JSR1IgPSBVU19CUkdSX0NEKDEpOworCX0KIH0KIApkaWZmIC0tZ2l0IGEvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9tb2RlX2NhcmRlbXUuYyBiL2Zpcm13YXJlL2xpYmNvbW1vbi9zb3VyY2UvbW9kZV9jYXJkZW11LmMKaW5kZXggYmM5MTI3My4uYzczNjJjZiAxMDA2NDQKLS0tIGEvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9tb2RlX2NhcmRlbXUuYworKysgYi9maXJtd2FyZS9saWJjb21tb24vc291cmNlL21vZGVfY2FyZGVtdS5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIAljc3IgPSB1c2FydC0+VVNfQ1NSICYgdXNhcnQtPlVTX0lNUjsKIAogCWlmIChjc3IgJiBVU19DU1JfUlhSRFkpIHsKLSAgICAgICAgCWJ5dGUgPSAodXNhcnQtPlVTX1JIUikgJiAweEZGOworCQkJYnl0ZSA9ICh1c2FydC0+VVNfUkhSKSAmIDB4RkY7CiAJCWlmIChyYnVmX3dyaXRlKCZjaS0+cmIsIGJ5dGUpIDwgMCkKIAkJCVRSQUNFX0VSUk9SKCJyYnVmIG92ZXJydW5cclxuIik7CiAJfQpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9tb2RlX2NjaWQuYyBiL2Zpcm13YXJlL2xpYmNvbW1vbi9zb3VyY2UvbW9kZV9jY2lkLmMKaW5kZXggNzdkNDE1OC4uNTE2ODI2ZSAxMDA2NDQKLS0tIGEvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9tb2RlX2NjaWQuYworKysgYi9maXJtd2FyZS9saWJjb21tb24vc291cmNlL21vZGVfY2NpZC5jCkBAIC04NCwxMSArODQsMTEgQEAKIHN0YXRpYyB2b2lkIElTUl9QaW9TbWFydENhcmQoY29uc3QgUGluICogcFBpbikKIHsKIC8qIEZJWE1FOiB3aHkgaXMgcGluU21hcnRDYXJkLnBpby0+UElPX0lTUiB0aGUgd3JvbmcgbnVtYmVyPwotICAgIHByaW50ZigiKysrKysgVHJ5aW5nIHRvIGNoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMgKFBJTyBJU1I6IDB4JVgpXG5cciIsIHBpblNtYXJ0Q2FyZC5waW8tPlBJT19JU1IpOwotICAgIHByaW50ZigiKysrKysgTWFzazogMHglWFxuXHIiLCBwaW5TbWFydENhcmQubWFzayk7CisJcHJpbnRmKCIrKysrKyBUcnlpbmcgdG8gY2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cyAoUElPIElTUjogMHglWClcblxyIiwgcGluU21hcnRDYXJkLnBpby0+UElPX0lTUik7CisJcHJpbnRmKCIrKysrKyBNYXNrOiAweCVYXG5cciIsIHBpblNtYXJ0Q2FyZC5tYXNrKTsKIE91dHB1dDoKLSAgICArKysrKyBUcnlpbmcgdG8gY2hlY2sgZm9yIHBlbmRpbmcgaW50ZXJydXB0cyAoUElPIElTUjogMHg0MDApKSA9IDE8PDEwCi0gICAgKysrKysgTWFzazogMHgxMDAgPSAxPDw4CisJKysrKysgVHJ5aW5nIHRvIGNoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMgKFBJTyBJU1I6IDB4NDAwKSkgPSAxPDwxMAorCSsrKysrIE1hc2s6IDB4MTAwID0gMTw8OAogKi8KIAkvLyBQQTEwIGlzIERUWEQsIHdoaWNoIGlzIHRoZSBkZWJ1ZyB1YXJ0IHRyYW5zbWl0IHBpbgogCmRpZmYgLS1naXQgYS9maXJtd2FyZS9saWJjb21tb24vc291cmNlL3N0ZGlvLmMgYi9maXJtd2FyZS9saWJjb21tb24vc291cmNlL3N0ZGlvLmMKaW5kZXggMzJiZDYxNy4uNTA1Yzg5NSAxMDA2NDQKLS0tIGEvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9zdGRpby5jCisrKyBiL2Zpcm13YXJlL2xpYmNvbW1vbi9zb3VyY2Uvc3RkaW8uYwpAQCAtNzYsOCArNzYsOCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNpZ25lZCBpbnQgUHV0Q2hhcihjaGFyICpwU3RyLCBjaGFyIGMpCiB7Ci0gICAgKnBTdHIgPSBjOwotICAgIHJldHVybiAxOworCSpwU3RyID0gYzsKKwlyZXR1cm4gMTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTg5LDE1ICs4OSwxNSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNpZ25lZCBpbnQgUHV0U3RyaW5nKGNoYXIgKnBTdHIsIGNvbnN0IGNoYXIgKnBTb3VyY2UpCiB7Ci0gICAgc2lnbmVkIGludCBudW0gPSAwOworCXNpZ25lZCBpbnQgbnVtID0gMDsKIAotICAgIHdoaWxlICgqcFNvdXJjZSAhPSAwKSB7CisJd2hpbGUgKCpwU291cmNlICE9IDApIHsKIAotICAgICAgICAqcFN0cisrID0gKnBTb3VyY2UrKzsKLSAgICAgICAgbnVtKys7Ci0gICAgfQorCQkqcFN0cisrID0gKnBTb3VyY2UrKzsKKwkJbnVtKys7CisJfQogCi0gICAgcmV0dXJuIG51bTsKKwlyZXR1cm4gbnVtOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDM4ICsxMTAsMzggQEAKIC8vIFxwYXJhbSB2YWx1ZSAgSW50ZWdlciB2YWx1ZS4KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzaWduZWQgaW50IFB1dFVuc2lnbmVkSW50KAotICAgIGNoYXIgKnBTdHIsCi0gICAgY2hhciBmaWxsLAotICAgIHNpZ25lZCBpbnQgd2lkdGgsCi0gICAgdW5zaWduZWQgaW50IHZhbHVlKQorCWNoYXIgKnBTdHIsCisJY2hhciBmaWxsLAorCXNpZ25lZCBpbnQgd2lkdGgsCisJdW5zaWduZWQgaW50IHZhbHVlKQogewotICAgIHNpZ25lZCBpbnQgbnVtID0gMDsKKwlzaWduZWQgaW50IG51bSA9IDA7CiAKLSAgICAvLyBUYWtlIGN1cnJlbnQgZGlnaXQgaW50byBhY2NvdW50IHdoZW4gY2FsY3VsYXRpbmcgd2lkdGgKLSAgICB3aWR0aC0tOworCS8vIFRha2UgY3VycmVudCBkaWdpdCBpbnRvIGFjY291bnQgd2hlbiBjYWxjdWxhdGluZyB3aWR0aAorCXdpZHRoLS07CiAKLSAgICAvLyBSZWN1cnNpdmVseSB3cml0ZSB1cHBlciBkaWdpdHMKLSAgICBpZiAoKHZhbHVlIC8gMTApID4gMCkgeworCS8vIFJlY3Vyc2l2ZWx5IHdyaXRlIHVwcGVyIGRpZ2l0cworCWlmICgodmFsdWUgLyAxMCkgPiAwKSB7CiAKLSAgICAgICAgbnVtID0gUHV0VW5zaWduZWRJbnQocFN0ciwgZmlsbCwgd2lkdGgsIHZhbHVlIC8gMTApOwotICAgICAgICBwU3RyICs9IG51bTsKLSAgICB9Ci0gICAgLy8gV3JpdGUgZmlsbGVyIGNoYXJhY3RlcnMKLSAgICBlbHNlIHsKKwkJbnVtID0gUHV0VW5zaWduZWRJbnQocFN0ciwgZmlsbCwgd2lkdGgsIHZhbHVlIC8gMTApOworCQlwU3RyICs9IG51bTsKKwl9CisJLy8gV3JpdGUgZmlsbGVyIGNoYXJhY3RlcnMKKwllbHNlIHsKIAotICAgICAgICB3aGlsZSAod2lkdGggPiAwKSB7CisJCXdoaWxlICh3aWR0aCA+IDApIHsKIAotICAgICAgICAgICAgUHV0Q2hhcihwU3RyLCBmaWxsKTsKLSAgICAgICAgICAgIHBTdHIrKzsKLSAgICAgICAgICAgIG51bSsrOwotICAgICAgICAgICAgd2lkdGgtLTsKLSAgICAgICAgfQotICAgIH0KKwkJCVB1dENoYXIocFN0ciwgZmlsbCk7CisJCQlwU3RyKys7CisJCQludW0rKzsKKwkJCXdpZHRoLS07CisJCX0KKwl9CiAKLSAgICAvLyBXcml0ZSBsb3dlciBkaWdpdAotICAgIG51bSArPSBQdXRDaGFyKHBTdHIsICh2YWx1ZSAlIDEwKSArICcwJyk7CisJLy8gV3JpdGUgbG93ZXIgZGlnaXQKKwludW0gKz0gUHV0Q2hhcihwU3RyLCAodmFsdWUgJSAxMCkgKyAnMCcpOwogCi0gICAgcmV0dXJuIG51bTsKKwlyZXR1cm4gbnVtOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTU0LDY5ICsxNTQsNjkgQEAKIC8vIFxwYXJhbSB2YWx1ZSAgU2lnbmVkIGludGVnZXIgdmFsdWUuCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc2lnbmVkIGludCBQdXRTaWduZWRJbnQoCi0gICAgY2hhciAqcFN0ciwKLSAgICBjaGFyIGZpbGwsCi0gICAgc2lnbmVkIGludCB3aWR0aCwKLSAgICBzaWduZWQgaW50IHZhbHVlKQorCWNoYXIgKnBTdHIsCisJY2hhciBmaWxsLAorCXNpZ25lZCBpbnQgd2lkdGgsCisJc2lnbmVkIGludCB2YWx1ZSkKIHsKLSAgICBzaWduZWQgaW50IG51bSA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGFic29sdXRlOworCXNpZ25lZCBpbnQgbnVtID0gMDsKKwl1bnNpZ25lZCBpbnQgYWJzb2x1dGU7CiAKLSAgICAvLyBDb21wdXRlIGFic29sdXRlIHZhbHVlCi0gICAgaWYgKHZhbHVlIDwgMCkgeworCS8vIENvbXB1dGUgYWJzb2x1dGUgdmFsdWUKKwlpZiAodmFsdWUgPCAwKSB7CiAKLSAgICAgICAgYWJzb2x1dGUgPSAtdmFsdWU7Ci0gICAgfQotICAgIGVsc2UgeworCQlhYnNvbHV0ZSA9IC12YWx1ZTsKKwl9CisJZWxzZSB7CiAKLSAgICAgICAgYWJzb2x1dGUgPSB2YWx1ZTsKLSAgICB9CisJCWFic29sdXRlID0gdmFsdWU7CisJfQogCi0gICAgLy8gVGFrZSBjdXJyZW50IGRpZ2l0IGludG8gYWNjb3VudCB3aGVuIGNhbGN1bGF0aW5nIHdpZHRoCi0gICAgd2lkdGgtLTsKKwkvLyBUYWtlIGN1cnJlbnQgZGlnaXQgaW50byBhY2NvdW50IHdoZW4gY2FsY3VsYXRpbmcgd2lkdGgKKwl3aWR0aC0tOwogCi0gICAgLy8gUmVjdXJzaXZlbHkgd3JpdGUgdXBwZXIgZGlnaXRzCi0gICAgaWYgKChhYnNvbHV0ZSAvIDEwKSA+IDApIHsKKwkvLyBSZWN1cnNpdmVseSB3cml0ZSB1cHBlciBkaWdpdHMKKwlpZiAoKGFic29sdXRlIC8gMTApID4gMCkgewogCi0gICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgCi0gICAgICAgICAgICBudW0gPSBQdXRTaWduZWRJbnQocFN0ciwgZmlsbCwgd2lkdGgsIC0oYWJzb2x1dGUgLyAxMCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworCQlpZiAodmFsdWUgPCAwKSB7CisJCQorCQkJbnVtID0gUHV0U2lnbmVkSW50KHBTdHIsIGZpbGwsIHdpZHRoLCAtKGFic29sdXRlIC8gMTApKTsKKwkJfQorCQllbHNlIHsKIAotICAgICAgICAgICAgbnVtID0gUHV0U2lnbmVkSW50KHBTdHIsIGZpbGwsIHdpZHRoLCBhYnNvbHV0ZSAvIDEwKTsKLSAgICAgICAgfQotICAgICAgICBwU3RyICs9IG51bTsKLSAgICB9Ci0gICAgZWxzZSB7CisJCQludW0gPSBQdXRTaWduZWRJbnQocFN0ciwgZmlsbCwgd2lkdGgsIGFic29sdXRlIC8gMTApOworCQl9CisJCXBTdHIgKz0gbnVtOworCX0KKwllbHNlIHsKIAotICAgICAgICAvLyBSZXNlcnZlIHNwYWNlIGZvciBzaWduCi0gICAgICAgIGlmICh2YWx1ZSA8IDApIHsKKwkJLy8gUmVzZXJ2ZSBzcGFjZSBmb3Igc2lnbgorCQlpZiAodmFsdWUgPCAwKSB7CiAKLSAgICAgICAgICAgIHdpZHRoLS07Ci0gICAgICAgIH0KKwkJCXdpZHRoLS07CisJCX0KIAotICAgICAgICAvLyBXcml0ZSBmaWxsZXIgY2hhcmFjdGVycwotICAgICAgICB3aGlsZSAod2lkdGggPiAwKSB7CisJCS8vIFdyaXRlIGZpbGxlciBjaGFyYWN0ZXJzCisJCXdoaWxlICh3aWR0aCA+IDApIHsKIAotICAgICAgICAgICAgUHV0Q2hhcihwU3RyLCBmaWxsKTsKLSAgICAgICAgICAgIHBTdHIrKzsKLSAgICAgICAgICAgIG51bSsrOwotICAgICAgICAgICAgd2lkdGgtLTsKLSAgICAgICAgfQorCQkJUHV0Q2hhcihwU3RyLCBmaWxsKTsKKwkJCXBTdHIrKzsKKwkJCW51bSsrOworCQkJd2lkdGgtLTsKKwkJfQogCi0gICAgICAgIC8vIFdyaXRlIHNpZ24KLSAgICAgICAgaWYgKHZhbHVlIDwgMCkgeworCQkvLyBXcml0ZSBzaWduCisJCWlmICh2YWx1ZSA8IDApIHsKIAotICAgICAgICAgICAgbnVtICs9IFB1dENoYXIocFN0ciwgJy0nKTsKLSAgICAgICAgICAgIHBTdHIrKzsKLSAgICAgICAgfQotICAgIH0KKwkJCW51bSArPSBQdXRDaGFyKHBTdHIsICctJyk7CisJCQlwU3RyKys7CisJCX0KKwl9CiAKLSAgICAvLyBXcml0ZSBsb3dlciBkaWdpdAotICAgIG51bSArPSBQdXRDaGFyKHBTdHIsIChhYnNvbHV0ZSAlIDEwKSArICcwJyk7CisJLy8gV3JpdGUgbG93ZXIgZGlnaXQKKwludW0gKz0gUHV0Q2hhcihwU3RyLCAoYWJzb2x1dGUgJSAxMCkgKyAnMCcpOwogCi0gICAgcmV0dXJuIG51bTsKKwlyZXR1cm4gbnVtOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjMwLDUxICsyMzAsNTEgQEAKIC8vIFxwYXJhbSB2YWx1ZSAgSGV4YWRlY2ltYWwgdmFsdWUuCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc2lnbmVkIGludCBQdXRIZXhhKAotICAgIGNoYXIgKnBTdHIsCi0gICAgY2hhciBmaWxsLAotICAgIHNpZ25lZCBpbnQgd2lkdGgsCi0gICAgdW5zaWduZWQgY2hhciBtYWosCi0gICAgdW5zaWduZWQgaW50IHZhbHVlKQorCWNoYXIgKnBTdHIsCisJY2hhciBmaWxsLAorCXNpZ25lZCBpbnQgd2lkdGgsCisJdW5zaWduZWQgY2hhciBtYWosCisJdW5zaWduZWQgaW50IHZhbHVlKQogewotICAgIHNpZ25lZCBpbnQgbnVtID0gMDsKKwlzaWduZWQgaW50IG51bSA9IDA7CiAKLSAgICAvLyBEZWNyZW1lbnQgd2lkdGgKLSAgICB3aWR0aC0tOworCS8vIERlY3JlbWVudCB3aWR0aAorCXdpZHRoLS07CiAKLSAgICAvLyBSZWN1cnNpdmVseSBvdXRwdXQgdXBwZXIgZGlnaXRzCi0gICAgaWYgKCh2YWx1ZSA+PiA0KSA+IDApIHsKKwkvLyBSZWN1cnNpdmVseSBvdXRwdXQgdXBwZXIgZGlnaXRzCisJaWYgKCh2YWx1ZSA+PiA0KSA+IDApIHsKIAotICAgICAgICBudW0gKz0gUHV0SGV4YShwU3RyLCBmaWxsLCB3aWR0aCwgbWFqLCB2YWx1ZSA+PiA0KTsKLSAgICAgICAgcFN0ciArPSBudW07Ci0gICAgfQotICAgIC8vIFdyaXRlIGZpbGxlciBjaGFycwotICAgIGVsc2UgeworCQludW0gKz0gUHV0SGV4YShwU3RyLCBmaWxsLCB3aWR0aCwgbWFqLCB2YWx1ZSA+PiA0KTsKKwkJcFN0ciArPSBudW07CisJfQorCS8vIFdyaXRlIGZpbGxlciBjaGFycworCWVsc2UgewogCi0gICAgICAgIHdoaWxlICh3aWR0aCA+IDApIHsKKwkJd2hpbGUgKHdpZHRoID4gMCkgewogCi0gICAgICAgICAgICBQdXRDaGFyKHBTdHIsIGZpbGwpOwotICAgICAgICAgICAgcFN0cisrOwotICAgICAgICAgICAgbnVtKys7Ci0gICAgICAgICAgICB3aWR0aC0tOwotICAgICAgICB9Ci0gICAgfQorCQkJUHV0Q2hhcihwU3RyLCBmaWxsKTsKKwkJCXBTdHIrKzsKKwkJCW51bSsrOworCQkJd2lkdGgtLTsKKwkJfQorCX0KIAotICAgIC8vIFdyaXRlIGN1cnJlbnQgZGlnaXQKLSAgICBpZiAoKHZhbHVlICYgMHhGKSA8IDEwKSB7CisJLy8gV3JpdGUgY3VycmVudCBkaWdpdAorCWlmICgodmFsdWUgJiAweEYpIDwgMTApIHsKIAotICAgICAgICBQdXRDaGFyKHBTdHIsICh2YWx1ZSAmIDB4RikgKyAnMCcpOwotICAgIH0KLSAgICBlbHNlIGlmIChtYWopIHsKKwkJUHV0Q2hhcihwU3RyLCAodmFsdWUgJiAweEYpICsgJzAnKTsKKwl9CisJZWxzZSBpZiAobWFqKSB7CiAKLSAgICAgICAgUHV0Q2hhcihwU3RyLCAodmFsdWUgJiAweEYpIC0gMTAgKyAnQScpOwotICAgIH0KLSAgICBlbHNlIHsKKwkJUHV0Q2hhcihwU3RyLCAodmFsdWUgJiAweEYpIC0gMTAgKyAnQScpOworCX0KKwllbHNlIHsKIAotICAgICAgICBQdXRDaGFyKHBTdHIsICh2YWx1ZSAmIDB4RikgLSAxMCArICdhJyk7Ci0gICAgfQotICAgIG51bSsrOworCQlQdXRDaGFyKHBTdHIsICh2YWx1ZSAmIDB4RikgLSAxMCArICdhJyk7CisJfQorCW51bSsrOwogCi0gICAgcmV0dXJuIG51bTsKKwlyZXR1cm4gbnVtOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjkyLDkxICsyOTIsOTEgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzaWduZWQgaW50IHZzbnByaW50ZihjaGFyICpwU3RyLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpwRm9ybWF0LCB2YV9saXN0IGFwKQogewotICAgIGNoYXIgICAgICAgICAgZmlsbDsKLSAgICB1bnNpZ25lZCBjaGFyIHdpZHRoOwotICAgIHNpZ25lZCBpbnQgICAgbnVtID0gMDsKLSAgICBzaXplX3QgICAgICAgIHNpemUgPSAwOworCWNoYXIgICAgICAgICAgZmlsbDsKKwl1bnNpZ25lZCBjaGFyIHdpZHRoOworCXNpZ25lZCBpbnQgICAgbnVtID0gMDsKKwlzaXplX3QgICAgICAgIHNpemUgPSAwOwogCi0gICAgLy8gQ2xlYXIgdGhlIHN0cmluZwotICAgIGlmIChwU3RyKSB7CisJLy8gQ2xlYXIgdGhlIHN0cmluZworCWlmIChwU3RyKSB7CiAKLSAgICAgICAgKnBTdHIgPSAwOwotICAgIH0KKwkJKnBTdHIgPSAwOworCX0KIAotICAgIC8vIFBoYXNlIHN0cmluZwotICAgIHdoaWxlICgqcEZvcm1hdCAhPSAwICYmIHNpemUgPCBsZW5ndGgpIHsKKwkvLyBQaGFzZSBzdHJpbmcKKwl3aGlsZSAoKnBGb3JtYXQgIT0gMCAmJiBzaXplIDwgbGVuZ3RoKSB7CiAKLSAgICAgICAgLy8gTm9ybWFsIGNoYXJhY3RlcgotICAgICAgICBpZiAoKnBGb3JtYXQgIT0gJyUnKSB7CisJCS8vIE5vcm1hbCBjaGFyYWN0ZXIKKwkJaWYgKCpwRm9ybWF0ICE9ICclJykgewogCi0gICAgICAgICAgICAqcFN0cisrID0gKnBGb3JtYXQrKzsKLSAgICAgICAgICAgIHNpemUrKzsKLSAgICAgICAgfQotICAgICAgICAvLyBFc2NhcGVkICclJwotICAgICAgICBlbHNlIGlmICgqKHBGb3JtYXQrMSkgPT0gJyUnKSB7CisJCQkqcFN0cisrID0gKnBGb3JtYXQrKzsKKwkJCXNpemUrKzsKKwkJfQorCQkvLyBFc2NhcGVkICclJworCQllbHNlIGlmICgqKHBGb3JtYXQrMSkgPT0gJyUnKSB7CiAKLSAgICAgICAgICAgICpwU3RyKysgPSAnJSc7Ci0gICAgICAgICAgICBwRm9ybWF0ICs9IDI7Ci0gICAgICAgICAgICBzaXplKys7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVG9rZW4gZGVsaW1pdGVyCi0gICAgICAgIGVsc2UgeworCQkJKnBTdHIrKyA9ICclJzsKKwkJCXBGb3JtYXQgKz0gMjsKKwkJCXNpemUrKzsKKwkJfQorCQkvLyBUb2tlbiBkZWxpbWl0ZXIKKwkJZWxzZSB7CiAKLSAgICAgICAgICAgIGZpbGwgPSAnICc7Ci0gICAgICAgICAgICB3aWR0aCA9IDA7Ci0gICAgICAgICAgICBwRm9ybWF0Kys7CisJCQlmaWxsID0gJyAnOworCQkJd2lkdGggPSAwOworCQkJcEZvcm1hdCsrOwogCi0gICAgICAgICAgICAvLyBQYXJzZSBmaWxsZXIKLSAgICAgICAgICAgIGlmICgqcEZvcm1hdCA9PSAnMCcpIHsKKwkJCS8vIFBhcnNlIGZpbGxlcgorCQkJaWYgKCpwRm9ybWF0ID09ICcwJykgewogCi0gICAgICAgICAgICAgICAgZmlsbCA9ICcwJzsKLSAgICAgICAgICAgICAgICBwRm9ybWF0Kys7Ci0gICAgICAgICAgICB9CisJCQkJZmlsbCA9ICcwJzsKKwkJCQlwRm9ybWF0Kys7CisJCQl9CiAKLSAgICAgICAgICAgIC8vIFBhcnNlIHdpZHRoCi0gICAgICAgICAgICB3aGlsZSAoKCpwRm9ybWF0ID49ICcwJykgJiYgKCpwRm9ybWF0IDw9ICc5JykpIHsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgd2lkdGggPSAod2lkdGgqMTApICsgKnBGb3JtYXQtJzAnOwotICAgICAgICAgICAgICAgIHBGb3JtYXQrKzsKLSAgICAgICAgICAgIH0KKwkJCS8vIFBhcnNlIHdpZHRoCisJCQl3aGlsZSAoKCpwRm9ybWF0ID49ICcwJykgJiYgKCpwRm9ybWF0IDw9ICc5JykpIHsKKwkJCisJCQkJd2lkdGggPSAod2lkdGgqMTApICsgKnBGb3JtYXQtJzAnOworCQkJCXBGb3JtYXQrKzsKKwkJCX0KIAotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlCi0gICAgICAgICAgICBpZiAoc2l6ZSArIHdpZHRoID4gbGVuZ3RoKSB7CisJCQkvLyBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UKKwkJCWlmIChzaXplICsgd2lkdGggPiBsZW5ndGgpIHsKIAotICAgICAgICAgICAgICAgIHdpZHRoID0gbGVuZ3RoIC0gc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICAgICAvLyBQYXJzZSB0eXBlCi0gICAgICAgICAgICBzd2l0Y2ggKCpwRm9ybWF0KSB7Ci0gICAgICAgICAgICBjYXNlICdkJzogCi0gICAgICAgICAgICBjYXNlICdpJzogbnVtID0gUHV0U2lnbmVkSW50KHBTdHIsIGZpbGwsIHdpZHRoLCB2YV9hcmcoYXAsIHNpZ25lZCBpbnQpKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICd1JzogbnVtID0gUHV0VW5zaWduZWRJbnQocFN0ciwgZmlsbCwgd2lkdGgsIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAneCc6IG51bSA9IFB1dEhleGEocFN0ciwgZmlsbCwgd2lkdGgsIDAsIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnWCc6IG51bSA9IFB1dEhleGEocFN0ciwgZmlsbCwgd2lkdGgsIDEsIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6IG51bSA9IFB1dFN0cmluZyhwU3RyLCB2YV9hcmcoYXAsIGNoYXIgKikpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2MnOiBudW0gPSBQdXRDaGFyKHBTdHIsIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSk7IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gRU9GOwotICAgICAgICAgICAgfQorCQkJCXdpZHRoID0gbGVuZ3RoIC0gc2l6ZTsKKwkJCX0KKwkJCisJCQkvLyBQYXJzZSB0eXBlCisJCQlzd2l0Y2ggKCpwRm9ybWF0KSB7CisJCQljYXNlICdkJzogCisJCQljYXNlICdpJzogbnVtID0gUHV0U2lnbmVkSW50KHBTdHIsIGZpbGwsIHdpZHRoLCB2YV9hcmcoYXAsIHNpZ25lZCBpbnQpKTsgYnJlYWs7CisJCQljYXNlICd1JzogbnVtID0gUHV0VW5zaWduZWRJbnQocFN0ciwgZmlsbCwgd2lkdGgsIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSk7IGJyZWFrOworCQkJY2FzZSAneCc6IG51bSA9IFB1dEhleGEocFN0ciwgZmlsbCwgd2lkdGgsIDAsIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSk7IGJyZWFrOworCQkJY2FzZSAnWCc6IG51bSA9IFB1dEhleGEocFN0ciwgZmlsbCwgd2lkdGgsIDEsIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSk7IGJyZWFrOworCQkJY2FzZSAncyc6IG51bSA9IFB1dFN0cmluZyhwU3RyLCB2YV9hcmcoYXAsIGNoYXIgKikpOyBicmVhazsKKwkJCWNhc2UgJ2MnOiBudW0gPSBQdXRDaGFyKHBTdHIsIHZhX2FyZyhhcCwgdW5zaWduZWQgaW50KSk7IGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gRU9GOworCQkJfQogCi0gICAgICAgICAgICBwRm9ybWF0Kys7Ci0gICAgICAgICAgICBwU3RyICs9IG51bTsKLSAgICAgICAgICAgIHNpemUgKz0gbnVtOwotICAgICAgICB9Ci0gICAgfQorCQkJcEZvcm1hdCsrOworCQkJcFN0ciArPSBudW07CisJCQlzaXplICs9IG51bTsKKwkJfQorCX0KIAotICAgIC8vIE5VTEwtdGVybWluYXRlZCAoZmluYWwgXDAgaXMgbm90IGNvdW50ZWQpCi0gICAgaWYgKHNpemUgPCBsZW5ndGgpIHsKKwkvLyBOVUxMLXRlcm1pbmF0ZWQgKGZpbmFsIFwwIGlzIG5vdCBjb3VudGVkKQorCWlmIChzaXplIDwgbGVuZ3RoKSB7CiAKLSAgICAgICAgKnBTdHIgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKKwkJKnBTdHIgPSAwOworCX0KKwllbHNlIHsKIAotICAgICAgICAqKC0tcFN0cikgPSAwOwotICAgICAgICBzaXplLS07Ci0gICAgfQorCQkqKC0tcFN0cikgPSAwOworCQlzaXplLS07CisJfQogCi0gICAgcmV0dXJuIHNpemU7CisJcmV0dXJuIHNpemU7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zOTAsMTQgKzM5MCwxNCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNpZ25lZCBpbnQgc25wcmludGYoY2hhciAqcFN0cmluZywgc2l6ZV90IGxlbmd0aCwgY29uc3QgY2hhciAqcEZvcm1hdCwgLi4uKQogewotICAgIHZhX2xpc3QgICAgYXA7Ci0gICAgc2lnbmVkIGludCByYzsKKwl2YV9saXN0ICAgIGFwOworCXNpZ25lZCBpbnQgcmM7CiAKLSAgICB2YV9zdGFydChhcCwgcEZvcm1hdCk7Ci0gICAgcmMgPSB2c25wcmludGYocFN0cmluZywgbGVuZ3RoLCBwRm9ybWF0LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKKwl2YV9zdGFydChhcCwgcEZvcm1hdCk7CisJcmMgPSB2c25wcmludGYocFN0cmluZywgbGVuZ3RoLCBwRm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKIAotICAgIHJldHVybiByYzsKKwlyZXR1cm4gcmM7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MTAsNyArNDEwLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzaWduZWQgaW50IHZzcHJpbnRmKGNoYXIgKnBTdHJpbmcsIGNvbnN0IGNoYXIgKnBGb3JtYXQsIHZhX2xpc3QgYXApCiB7Ci0gICAgcmV0dXJuIHZzbnByaW50ZihwU3RyaW5nLCBNQVhfU1RSSU5HX1NJWkUsIHBGb3JtYXQsIGFwKTsKKwlyZXR1cm4gdnNucHJpbnRmKHBTdHJpbmcsIE1BWF9TVFJJTkdfU0laRSwgcEZvcm1hdCwgYXApOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDIyLDE3ICs0MjIsMTcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzaWduZWQgaW50IHZmcHJpbnRmKEZJTEUgKnBTdHJlYW0sIGNvbnN0IGNoYXIgKnBGb3JtYXQsIHZhX2xpc3QgYXApCiB7Ci0gICAgY2hhciBwU3RyW01BWF9TVFJJTkdfU0laRV07Ci0gICAgY2hhciBwRXJyb3JbXSA9ICJzdGRpby5jOiBpbmNyZWFzZSBNQVhfU1RSSU5HX1NJWkVcblxyIjsKKwljaGFyIHBTdHJbTUFYX1NUUklOR19TSVpFXTsKKwljaGFyIHBFcnJvcltdID0gInN0ZGlvLmM6IGluY3JlYXNlIE1BWF9TVFJJTkdfU0laRVxuXHIiOwogCi0gICAgLy8gV3JpdGUgZm9ybWF0dGVkIHN0cmluZyBpbiBidWZmZXIKLSAgICBpZiAodnNwcmludGYocFN0ciwgcEZvcm1hdCwgYXApID49IE1BWF9TVFJJTkdfU0laRSkgeworCS8vIFdyaXRlIGZvcm1hdHRlZCBzdHJpbmcgaW4gYnVmZmVyCisJaWYgKHZzcHJpbnRmKHBTdHIsIHBGb3JtYXQsIGFwKSA+PSBNQVhfU1RSSU5HX1NJWkUpIHsKIAotICAgICAgICBmcHV0cyhwRXJyb3IsIHN0ZGVycik7Ci0gICAgfQorCQlmcHV0cyhwRXJyb3IsIHN0ZGVycik7CisJfQogCi0gICAgLy8gRGlzcGxheSBzdHJpbmcKLSAgICByZXR1cm4gZnB1dHMocFN0ciwgcFN0cmVhbSk7CisJLy8gRGlzcGxheSBzdHJpbmcKKwlyZXR1cm4gZnB1dHMocFN0ciwgcFN0cmVhbSk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDMsNyArNDQzLDcgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzaWduZWQgaW50IHZwcmludGYoY29uc3QgY2hhciAqcEZvcm1hdCwgdmFfbGlzdCBhcCkKIHsKLSAgICByZXR1cm4gdmZwcmludGYoc3Rkb3V0LCBwRm9ybWF0LCBhcCk7CisJcmV0dXJuIHZmcHJpbnRmKHN0ZG91dCwgcEZvcm1hdCwgYXApOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDU0LDE1ICs0NTQsMTUgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzaWduZWQgaW50IGZwcmludGYoRklMRSAqcFN0cmVhbSwgY29uc3QgY2hhciAqcEZvcm1hdCwgLi4uKQogewotICAgIHZhX2xpc3QgYXA7Ci0gICAgc2lnbmVkIGludCByZXN1bHQ7CisJdmFfbGlzdCBhcDsKKwlzaWduZWQgaW50IHJlc3VsdDsKIAotICAgIC8vIEZvcndhcmQgY2FsbCB0byB2ZnByaW50ZgotICAgIHZhX3N0YXJ0KGFwLCBwRm9ybWF0KTsKLSAgICByZXN1bHQgPSB2ZnByaW50ZihwU3RyZWFtLCBwRm9ybWF0LCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKKwkvLyBGb3J3YXJkIGNhbGwgdG8gdmZwcmludGYKKwl2YV9zdGFydChhcCwgcEZvcm1hdCk7CisJcmVzdWx0ID0gdmZwcmludGYocFN0cmVhbSwgcEZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7CiAKLSAgICByZXR1cm4gcmVzdWx0OworCXJldHVybiByZXN1bHQ7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NzIsMTUgKzQ3MiwxNSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNpZ25lZCBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKnBGb3JtYXQsIC4uLikKIHsKLSAgICB2YV9saXN0IGFwOwotICAgIHNpZ25lZCBpbnQgcmVzdWx0OworCXZhX2xpc3QgYXA7CisJc2lnbmVkIGludCByZXN1bHQ7CiAKLSAgICAvLyBGb3J3YXJkIGNhbGwgdG8gdnByaW50ZgotICAgIHZhX3N0YXJ0KGFwLCBwRm9ybWF0KTsKLSAgICByZXN1bHQgPSB2cHJpbnRmKHBGb3JtYXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOworCS8vIEZvcndhcmQgY2FsbCB0byB2cHJpbnRmCisJdmFfc3RhcnQoYXAsIHBGb3JtYXQpOworCXJlc3VsdCA9IHZwcmludGYocEZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7CiAKLSAgICByZXR1cm4gcmVzdWx0OworCXJldHVybiByZXN1bHQ7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00OTAsMTUgKzQ5MCwxNSBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNpZ25lZCBpbnQgc3ByaW50ZihjaGFyICpwU3RyLCBjb25zdCBjaGFyICpwRm9ybWF0LCAuLi4pCiB7Ci0gICAgdmFfbGlzdCBhcDsKLSAgICBzaWduZWQgaW50IHJlc3VsdDsKKwl2YV9saXN0IGFwOworCXNpZ25lZCBpbnQgcmVzdWx0OwogCi0gICAgLy8gRm9yd2FyZCBjYWxsIHRvIHZzcHJpbnRmCi0gICAgdmFfc3RhcnQoYXAsIHBGb3JtYXQpOwotICAgIHJlc3VsdCA9IHZzcHJpbnRmKHBTdHIsIHBGb3JtYXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOworCS8vIEZvcndhcmQgY2FsbCB0byB2c3ByaW50ZgorCXZhX3N0YXJ0KGFwLCBwRm9ybWF0KTsKKwlyZXN1bHQgPSB2c3ByaW50ZihwU3RyLCBwRm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKIAotICAgIHJldHVybiByZXN1bHQ7CisJcmV0dXJuIHJlc3VsdDsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUwNyw2ICs1MDcsNiBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNpZ25lZCBpbnQgcHV0cyhjb25zdCBjaGFyICpwU3RyKQogewotICAgIHJldHVybiBmcHV0cyhwU3RyLCBzdGRvdXQpOworCXJldHVybiBmcHV0cyhwU3RyLCBzdGRvdXQpOwogfQogCmRpZmYgLS1naXQgYS9maXJtd2FyZS9saWJjb21tb24vc291cmNlL3N0cmluZy5jIGIvZmlybXdhcmUvbGliY29tbW9uL3NvdXJjZS9zdHJpbmcuYwppbmRleCBkYmJiMGU5Li4wZDc4OWEwIDEwMDY0NAotLS0gYS9maXJtd2FyZS9saWJjb21tb24vc291cmNlL3N0cmluZy5jCisrKyBiL2Zpcm13YXJlL2xpYmNvbW1vbi9zb3VyY2Uvc3RyaW5nLmMKQEAgLTYxLDMzICs2MSwzMyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHZvaWQgKiBtZW1jcHkodm9pZCAqcERlc3RpbmF0aW9uLCBjb25zdCB2b2lkICpwU291cmNlLCBzaXplX3QgbnVtKQogewotICAgIHVuc2lnbmVkIGNoYXIgKnBCeXRlRGVzdGluYXRpb247Ci0gICAgdW5zaWduZWQgY2hhciAqcEJ5dGVTb3VyY2U7Ci0gICAgdW5zaWduZWQgaW50ICpwQWxpZ25lZFNvdXJjZSA9ICh1bnNpZ25lZCBpbnQgKikgcFNvdXJjZTsKLSAgICB1bnNpZ25lZCBpbnQgKnBBbGlnbmVkRGVzdGluYXRpb24gPSAodW5zaWduZWQgaW50ICopIHBEZXN0aW5hdGlvbjsKKwl1bnNpZ25lZCBjaGFyICpwQnl0ZURlc3RpbmF0aW9uOworCXVuc2lnbmVkIGNoYXIgKnBCeXRlU291cmNlOworCXVuc2lnbmVkIGludCAqcEFsaWduZWRTb3VyY2UgPSAodW5zaWduZWQgaW50ICopIHBTb3VyY2U7CisJdW5zaWduZWQgaW50ICpwQWxpZ25lZERlc3RpbmF0aW9uID0gKHVuc2lnbmVkIGludCAqKSBwRGVzdGluYXRpb247CiAKLSAgICAvLyBJZiBudW0gaXMgbW9yZSB0aGFuIDQgYnl0ZXMsIGFuZCBib3RoIGRlc3QuIGFuZCBzb3VyY2UgYXJlIGFsaWduZWQsCi0gICAgLy8gdGhlbiBjb3B5IGR3b3JkcwotICAgIGlmICgoKCh1bnNpZ25lZCBpbnQpIHBBbGlnbmVkRGVzdGluYXRpb24gJiAweDMpID09IDApCi0gICAgICAgICYmICgoKHVuc2lnbmVkIGludCkgcEFsaWduZWRTb3VyY2UgJiAweDMpID09IDApCi0gICAgICAgICYmIChudW0gPj0gNCkpIHsKKwkvLyBJZiBudW0gaXMgbW9yZSB0aGFuIDQgYnl0ZXMsIGFuZCBib3RoIGRlc3QuIGFuZCBzb3VyY2UgYXJlIGFsaWduZWQsCisJLy8gdGhlbiBjb3B5IGR3b3JkcworCWlmICgoKCh1bnNpZ25lZCBpbnQpIHBBbGlnbmVkRGVzdGluYXRpb24gJiAweDMpID09IDApCisJCSYmICgoKHVuc2lnbmVkIGludCkgcEFsaWduZWRTb3VyY2UgJiAweDMpID09IDApCisJCSYmIChudW0gPj0gNCkpIHsKIAotICAgICAgICB3aGlsZSAobnVtID49IDQpIHsKKwkJd2hpbGUgKG51bSA+PSA0KSB7CiAKLSAgICAgICAgICAgICpwQWxpZ25lZERlc3RpbmF0aW9uKysgPSAqcEFsaWduZWRTb3VyY2UrKzsKLSAgICAgICAgICAgIG51bSAtPSA0OwotICAgICAgICB9Ci0gICAgfQorCQkJKnBBbGlnbmVkRGVzdGluYXRpb24rKyA9ICpwQWxpZ25lZFNvdXJjZSsrOworCQkJbnVtIC09IDQ7CisJCX0KKwl9CiAKLSAgICAvLyBDb3B5IHJlbWFpbmluZyBieXRlcwotICAgIHBCeXRlRGVzdGluYXRpb24gPSAodW5zaWduZWQgY2hhciAqKSBwQWxpZ25lZERlc3RpbmF0aW9uOwotICAgIHBCeXRlU291cmNlID0gKHVuc2lnbmVkIGNoYXIgKikgcEFsaWduZWRTb3VyY2U7Ci0gICAgd2hpbGUgKG51bS0tKSB7CisJLy8gQ29weSByZW1haW5pbmcgYnl0ZXMKKwlwQnl0ZURlc3RpbmF0aW9uID0gKHVuc2lnbmVkIGNoYXIgKikgcEFsaWduZWREZXN0aW5hdGlvbjsKKwlwQnl0ZVNvdXJjZSA9ICh1bnNpZ25lZCBjaGFyICopIHBBbGlnbmVkU291cmNlOworCXdoaWxlIChudW0tLSkgewogCi0gICAgICAgICpwQnl0ZURlc3RpbmF0aW9uKysgPSAqcEJ5dGVTb3VyY2UrKzsKLSAgICB9CisJCSpwQnl0ZURlc3RpbmF0aW9uKysgPSAqcEJ5dGVTb3VyY2UrKzsKKwl9CiAKLSAgICByZXR1cm4gcERlc3RpbmF0aW9uOworCXJldHVybiBwRGVzdGluYXRpb247CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05OSwyMyArOTksMjMgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB2b2lkICogbWVtc2V0KHZvaWQgKnBCdWZmZXIsIGludCB2YWx1ZSwgc2l6ZV90IG51bSkKIHsKLSAgICB1bnNpZ25lZCBjaGFyICpwQnl0ZURlc3RpbmF0aW9uOwotICAgIHVuc2lnbmVkIGludCAgKnBBbGlnbmVkRGVzdGluYXRpb24gPSAodW5zaWduZWQgaW50ICopIHBCdWZmZXI7Ci0gICAgdW5zaWduZWQgaW50ICBhbGlnbmVkVmFsdWUgPSAodmFsdWUgPDwgMjQpIHwgKHZhbHVlIDw8IDE2KSB8ICh2YWx1ZSA8PCA4KSB8IHZhbHVlOworCXVuc2lnbmVkIGNoYXIgKnBCeXRlRGVzdGluYXRpb247CisJdW5zaWduZWQgaW50ICAqcEFsaWduZWREZXN0aW5hdGlvbiA9ICh1bnNpZ25lZCBpbnQgKikgcEJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgIGFsaWduZWRWYWx1ZSA9ICh2YWx1ZSA8PCAyNCkgfCAodmFsdWUgPDwgMTYpIHwgKHZhbHVlIDw8IDgpIHwgdmFsdWU7CiAKLSAgICAvLyBTZXQgd29yZHMgaWYgcG9zc2libGUKLSAgICBpZiAoKCgodW5zaWduZWQgaW50KSBwQWxpZ25lZERlc3RpbmF0aW9uICYgMHgzKSA9PSAwKSAmJiAobnVtID49IDQpKSB7Ci0gICAgICAgIHdoaWxlIChudW0gPj0gNCkgewotICAgICAgICAgICAgKnBBbGlnbmVkRGVzdGluYXRpb24rKyA9IGFsaWduZWRWYWx1ZTsKLSAgICAgICAgICAgIG51bSAtPSA0OwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIFNldCByZW1haW5pbmcgYnl0ZXMKLSAgICBwQnl0ZURlc3RpbmF0aW9uID0gKHVuc2lnbmVkIGNoYXIgKikgcEFsaWduZWREZXN0aW5hdGlvbjsKLSAgICB3aGlsZSAobnVtLS0pIHsKLSAgICAgICAgKnBCeXRlRGVzdGluYXRpb24rKyA9IHZhbHVlOwotICAgIH0KLSAgICByZXR1cm4gcEJ1ZmZlcjsKKwkvLyBTZXQgd29yZHMgaWYgcG9zc2libGUKKwlpZiAoKCgodW5zaWduZWQgaW50KSBwQWxpZ25lZERlc3RpbmF0aW9uICYgMHgzKSA9PSAwKSAmJiAobnVtID49IDQpKSB7CisJCXdoaWxlIChudW0gPj0gNCkgeworCQkJKnBBbGlnbmVkRGVzdGluYXRpb24rKyA9IGFsaWduZWRWYWx1ZTsKKwkJCW51bSAtPSA0OworCQl9CisJfQorCS8vIFNldCByZW1haW5pbmcgYnl0ZXMKKwlwQnl0ZURlc3RpbmF0aW9uID0gKHVuc2lnbmVkIGNoYXIgKikgcEFsaWduZWREZXN0aW5hdGlvbjsKKwl3aGlsZSAobnVtLS0pIHsKKwkJKnBCeXRlRGVzdGluYXRpb24rKyA9IHZhbHVlOworCX0KKwlyZXR1cm4gcEJ1ZmZlcjsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTI2LDE2ICsxMjYsMTYgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGNoYXIgKiBzdHJjaHIoY29uc3QgY2hhciAqcFN0cmluZywgaW50IGNoYXJhY3RlcikKIHsKLSAgICBjaGFyICogcCA9IChjaGFyICopcFN0cmluZzsKLSAgICBjaGFyICAgYyA9IGNoYXJhY3RlciAmIDB4RkY7CisJY2hhciAqIHAgPSAoY2hhciAqKXBTdHJpbmc7CisJY2hhciAgIGMgPSBjaGFyYWN0ZXIgJiAweEZGOwogCi0gICAgd2hpbGUoKnAgIT0gYykgewotICAgICAgICBpZiAoKnAgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcCsrOwotICAgIH0KLSAgICByZXR1cm4gcDsKKwl3aGlsZSgqcCAhPSBjKSB7CisJCWlmICgqcCA9PSAwKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwKys7CisJfQorCXJldHVybiBwOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDQsMTIgKzE0NCwxMiBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogc2l6ZV90IHN0cmxlbihjb25zdCBjaGFyICpwU3RyaW5nKQogewotICAgIHVuc2lnbmVkIGludCBsZW5ndGggPSAwOworCXVuc2lnbmVkIGludCBsZW5ndGggPSAwOwogCi0gICAgd2hpbGUoKnBTdHJpbmcrKyAhPSAwKSB7Ci0gICAgICAgIGxlbmd0aCsrOwotICAgIH0KLSAgICByZXR1cm4gbGVuZ3RoOworCXdoaWxlKCpwU3RyaW5nKysgIT0gMCkgeworCQlsZW5ndGgrKzsKKwl9CisJcmV0dXJuIGxlbmd0aDsKIH0KIAogCkBAIC0xNjEsMTQgKzE2MSwxNCBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogY2hhciAqIHN0cnJjaHIoY29uc3QgY2hhciAqcFN0cmluZywgaW50IGNoYXJhY3RlcikKIHsKLSAgICBjaGFyICpwID0gMDsKKwljaGFyICpwID0gMDsKIAotICAgIHdoaWxlKCpwU3RyaW5nICE9IDApIHsKLSAgICAgICAgaWYgKCpwU3RyaW5nKysgPT0gY2hhcmFjdGVyKSB7Ci0gICAgICAgICAgICBwID0gKGNoYXIqKXBTdHJpbmc7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHA7CisJd2hpbGUoKnBTdHJpbmcgIT0gMCkgeworCQlpZiAoKnBTdHJpbmcrKyA9PSBjaGFyYWN0ZXIpIHsKKwkJCXAgPSAoY2hhciopcFN0cmluZzsKKwkJfQorCX0KKwlyZXR1cm4gcDsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTc5LDEwICsxNzksMTAgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGNoYXIgKiBzdHJjcHkoY2hhciAqcERlc3RpbmF0aW9uLCBjb25zdCBjaGFyICpwU291cmNlKQogewotICAgIGNoYXIgKnBTYXZlRGVzdCA9IHBEZXN0aW5hdGlvbjsKKwljaGFyICpwU2F2ZURlc3QgPSBwRGVzdGluYXRpb247CiAKLSAgICBmb3IoOyAoKnBEZXN0aW5hdGlvbiA9ICpwU291cmNlKSAhPSAwOyArK3BTb3VyY2UsICsrcERlc3RpbmF0aW9uKTsKLSAgICByZXR1cm4gcFNhdmVEZXN0OworCWZvcig7ICgqcERlc3RpbmF0aW9uID0gKnBTb3VyY2UpICE9IDA7ICsrcFNvdXJjZSwgKytwRGVzdGluYXRpb24pOworCXJldHVybiBwU2F2ZURlc3Q7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE5NiwyMiArMTk2LDIyIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbnQgc3RybmNtcChjb25zdCBjaGFyICpwU3RyaW5nMSwgY29uc3QgY2hhciAqcFN0cmluZzIsIHNpemVfdCBjb3VudCkKIHsKLSAgICBpbnQgcjsKKwlpbnQgcjsKIAotICAgIHdoaWxlKGNvdW50KSB7Ci0gICAgICAgIHIgPSAqcFN0cmluZzEgLSAqcFN0cmluZzI7Ci0gICAgICAgIGlmIChyID09IDApIHsKLSAgICAgICAgICAgIGlmICgqcFN0cmluZzEgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcFN0cmluZzErKzsKLSAgICAgICAgICAgIHBTdHJpbmcyKys7Ci0gICAgICAgICAgICBjb3VudC0tOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHI7Ci0gICAgfQotICAgIHJldHVybiAwOworCXdoaWxlKGNvdW50KSB7CisJCXIgPSAqcFN0cmluZzEgLSAqcFN0cmluZzI7CisJCWlmIChyID09IDApIHsKKwkJCWlmICgqcFN0cmluZzEgPT0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCQkJcFN0cmluZzErKzsKKwkJCXBTdHJpbmcyKys7CisJCQljb3VudC0tOworCQkJY29udGludWU7CisJCX0KKwkJcmV0dXJuIHI7CisJfQorCXJldHVybiAwOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMjMsMTcgKzIyMywxNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogY2hhciAqIHN0cm5jcHkoY2hhciAqcERlc3RpbmF0aW9uLCBjb25zdCBjaGFyICpwU291cmNlLCBzaXplX3QgY291bnQpCiB7Ci0gICAgY2hhciAqcFNhdmVEZXN0ID0gcERlc3RpbmF0aW9uOworCWNoYXIgKnBTYXZlRGVzdCA9IHBEZXN0aW5hdGlvbjsKIAotICAgIHdoaWxlIChjb3VudCkgewotICAgICAgICAqcERlc3RpbmF0aW9uID0gKnBTb3VyY2U7Ci0gICAgICAgIGlmICgqcFNvdXJjZSA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwRGVzdGluYXRpb24rKzsKLSAgICAgICAgcFNvdXJjZSsrOwotICAgICAgICBjb3VudC0tOwotICAgIH0KLSAgICByZXR1cm4gcFNhdmVEZXN0OworCXdoaWxlIChjb3VudCkgeworCQkqcERlc3RpbmF0aW9uID0gKnBTb3VyY2U7CisJCWlmICgqcFNvdXJjZSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCQlwRGVzdGluYXRpb24rKzsKKwkJcFNvdXJjZSsrOworCQljb3VudC0tOworCX0KKwlyZXR1cm4gcFNhdmVEZXN0OwogfQogCg==