LyoKICogKEMpIENvcHlyaWdodCAyMDA5CiAqIEdyYWVtZSBSdXNzLCBncmFlbWUucnVzc0BnbWFpbC5jb20KICoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKgogKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVycnVwdCBoYW5kbGluZyBmdW5jdGlvbmFsaXR5IGZvciBzeXN0ZW1zCiAqIGJhc2VkIG9uIHRoZSBzdGFuZGFyZCBQQy9BVCBhcmNoaXRlY3R1cmUgdXNpbmcgdHdvIGNhc2NhZGVkIGk4MjU5CiAqIFByb2dyYW1tYWJsZSBJbnRlcnJ1cHQgQ29udHJvbGxlcnMuCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaTgyNTkuaD4KI2luY2x1ZGUgPGFzbS9pYm1wYy5oPgojaW5jbHVkZSA8YXNtL2ludGVycnVwdC5oPgoKI2lmIENPTkZJR19TWVNfTlVNX0lSUVMgIT0gMTYKI2Vycm9yICJDT05GSUdfU1lTX05VTV9JUlFTIG11c3QgZXF1YWwgMTYgaWYgQ09ORklHX1NZU19OVU1fSVJRUyBpcyBkZWZpbmVkIgojZW5kaWYKCmludCBpbnRlcnJ1cHRfaW5pdCh2b2lkKQp7Cgl1OCBpOwoKCWRpc2FibGVfaW50ZXJydXB0cygpOwoKCS8qIE1hc2sgYWxsIGludGVycnVwdHMgKi8KCW91dGIoMHhmZiwgTUFTVEVSX1BJQyArIElNUik7CglvdXRiKDB4ZmYsIFNMQVZFX1BJQyArIElNUik7CgoJLyogTWFzdGVyIFBJQyAqLwoJLyogUGxhY2UgbWFzdGVyIFBJQyBpbnRlcnJ1cHRzIGF0IElOVDIwICovCgkvKiBJQ1czLCBPbmUgc2xhdmUgUElDIGlzIHByZXNlbnQgKi8KCW91dGIoSUNXMV9TRUx8SUNXMV9FSUNXNCwgTUFTVEVSX1BJQyArIElDVzEpOwoJb3V0YigweDIwLCBNQVNURVJfUElDICsgSUNXMik7CglvdXRiKElSMiwgTUFTVEVSX1BJQyArIElDVzMpOwoJb3V0YihJQ1c0X1BNLCBNQVNURVJfUElDICsgSUNXNCk7CgoJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKCQlvdXRiKE9DVzJfU0VPSSB8IGksIE1BU1RFUl9QSUMgKyBPQ1cyKTsKCgkvKiBTbGF2ZSBQSUMgKi8KCS8qIFBsYWNlIHNsYXZlIFBJQyBpbnRlcnJ1cHRzIGF0IElOVDI4ICovCgkvKiBTbGF2ZSBJRCAqLwoJb3V0YihJQ1cxX1NFTHxJQ1cxX0VJQ1c0LCBTTEFWRV9QSUMgKyBJQ1cxKTsKCW91dGIoMHgyOCwgU0xBVkVfUElDICsgSUNXMik7CglvdXRiKDB4MDIsIFNMQVZFX1BJQyArIElDVzMpOwoJb3V0YihJQ1c0X1BNLCBTTEFWRV9QSUMgKyBJQ1c0KTsKCglmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQoJCW91dGIoT0NXMl9TRU9JIHwgaSwgU0xBVkVfUElDICsgT0NXMik7CgoJLyoKCSAqIEVuYWJsZSBjYXNjYWRlZCBpbnRlcnJ1cHRzIGJ5IHVubWFza2luZyB0aGUgY2FzY2FkZSBJUlEgcGluIG9mCgkgKiB0aGUgbWFzdGVyIFBJQwoJICovCgl1bm1hc2tfaXJxICgyKTsKCgllbmFibGVfaW50ZXJydXB0cygpOwoKCXJldHVybiAwOwp9Cgp2b2lkIG1hc2tfaXJxKGludCBpcnEpCnsKCWludCBpbXJfcG9ydDsKCglpZiAoaXJxID49IENPTkZJR19TWVNfTlVNX0lSUVMpCgkJcmV0dXJuOwoKCWlmIChpcnEgPiA3KQoJCWltcl9wb3J0ID0gU0xBVkVfUElDICsgSU1SOwoJZWxzZQoJCWltcl9wb3J0ID0gTUFTVEVSX1BJQyArIElNUjsKCglvdXRiKGluYihpbXJfcG9ydCkgfCAoMSA8PCAoaXJxICYgNykpLCBpbXJfcG9ydCk7Cn0KCnZvaWQgdW5tYXNrX2lycShpbnQgaXJxKQp7CglpbnQgaW1yX3BvcnQ7CgoJaWYgKGlycSA+PSBDT05GSUdfU1lTX05VTV9JUlFTKQoJCXJldHVybjsKCglpZiAoaXJxID4gNykKCQlpbXJfcG9ydCA9IFNMQVZFX1BJQyArIElNUjsKCWVsc2UKCQlpbXJfcG9ydCA9IE1BU1RFUl9QSUMgKyBJTVI7CgoJb3V0YihpbmIoaW1yX3BvcnQpICYgfigxIDw8IChpcnEgJiA3KSksIGltcl9wb3J0KTsKfQoKdm9pZCBzcGVjaWZpY19lb2koaW50IGlycSkKewoJaWYgKGlycSA+PSBDT05GSUdfU1lTX05VTV9JUlFTKQoJCXJldHVybjsKCglpZiAoaXJxID4gNykgewoJCS8qCgkJICogIElSUSBpcyBvbiB0aGUgc2xhdmUgLSBJc3N1ZSBhIGNvcnJlc3BvbmRpbmcgRU9JIHRvIHRoZQoJCSAqICBzbGF2ZSBQSUMgYW5kIGFuIEVPSSBmb3IgSVJRMiAodGhlIGNhc2NhZGUgaW50ZXJydXB0KQoJCSAqICBvbiB0aGUgbWFzdGVyIFBJQwoJCSAqLwoJCW91dGIoT0NXMl9TRU9JIHwgKGlycSAmIDcpLCBTTEFWRV9QSUMgKyBPQ1cyKTsKCQlpcnEgPSBTRU9JX0lSMjsKCX0KCglvdXRiKE9DVzJfU0VPSSB8IGlycSwgTUFTVEVSX1BJQyArIE9DVzIpOwp9Cg==