LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKiAKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMsIEdtYkggPHd3dy5lbGlub3MuY29tPgogKiBBbGV4IFp1ZXBrZSA8YXp1QHN5c2dvLmRlPgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKdWxvbmcgbXlmbHVzaCh2b2lkKTsKCgojZGVmaW5lIFNDNTIwX01BWF9GTEFTSF9CQU5LUyAgMwojZGVmaW5lIFNDNTIwX0ZMQVNIX0JBTkswX0JBU0UgMHgzODAwMDAwMCAgLyogQk9PVENTICovCiNkZWZpbmUgU0M1MjBfRkxBU0hfQkFOSzFfQkFTRSAweDMwMDAwMDAwICAvKiBST01DUzAgKi8KI2RlZmluZSBTQzUyMF9GTEFTSF9CQU5LMl9CQVNFIDB4MjgwMDAwMDAgIC8qIFJPTUNTMSAqLwojZGVmaW5lIFNDNTIwX0ZMQVNIX0JBTktTSVpFICAgMHg4MDAwMDAwCgojZGVmaW5lIEFNRDI5TFYwMTZfU0laRSAgICAgICAgMHgyMDAwMDAKI2RlZmluZSBBTUQyOUxWMDE2X1NFQ1RPUlMgICAgIDMyCgpmbGFzaF9pbmZvX3QgICAgZmxhc2hfaW5mb1tTQzUyMF9NQVhfRkxBU0hfQkFOS1NdOwoKI2RlZmluZSBDTURfUkVBRF9BUlJBWQkJMHgwMEYwMDBGMAojZGVmaW5lIENNRF9VTkxPQ0sxCQkweDAwQUEwMEFBCiNkZWZpbmUgQ01EX1VOTE9DSzIJCTB4MDA1NTAwNTUKI2RlZmluZSBDTURfRVJBU0VfU0VUVVAJCTB4MDA4MDAwODAKI2RlZmluZSBDTURfRVJBU0VfQ09ORklSTQkweDAwMzAwMDMwCiNkZWZpbmUgQ01EX1BST0dSQU0JCTB4MDBBMDAwQTAKI2RlZmluZSBDTURfVU5MT0NLX0JZUEFTUwkweDAwMjAwMDIwCgoKI2RlZmluZSBCSVRfRVJBU0VfRE9ORQkJMHgwMDgwMDA4MAojZGVmaW5lIEJJVF9SRFlfTUFTSwkJMHgwMDgwMDA4MAojZGVmaW5lIEJJVF9QUk9HUkFNX0VSUk9SCTB4MDAyMDAwMjAKI2RlZmluZSBCSVRfVElNRU9VVAkJMHg4MDAwMDAwMCAvKiBvdXIgZmxhZyAqLwoKI2RlZmluZSBSRUFEWSAxCiNkZWZpbmUgRVJSICAgMgojZGVmaW5lIFRNTyAgIDQKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgp1bG9uZyBmbGFzaF9pbml0KHZvaWQpCnsKCWludCBpLCBqOwoJdWxvbmcgc2l6ZSA9IDA7CgkKCWZvciAoaSA9IDA7IGkgPCBTQzUyMF9NQVhfRkxBU0hfQkFOS1M7IGkrKykgewoJCXVsb25nIGZsYXNoYmFzZSA9IDA7CgkJaW50IHNlY3RzaXplID0gMDsgCgkJaWYgKGk9PTAgfHwgaT09MikgewoJCQkvKiBGaXhNZTogdGhpcyBhc3N1bWVzIHRoYXQgYmFuayAwIGFuZCAyIAoJCQkgKiBhcmUgbWFwcGVkIHRvIHRoZSB0d28gOE1iIGJhbmtzICovCgkJCWZsYXNoX2luZm9baV0uZmxhc2hfaWQgPQoJCQkJKEFNRF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKSB8CgkJCQkoQU1EX0lEX0xWMDE2QiAmIEZMQVNIX1RZUEVNQVNLKTsKCQkJCgkJCWZsYXNoX2luZm9baV0uc2l6ZSA9IEFNRDI5TFYwMTZfU0laRSo0OwoJCQlmbGFzaF9pbmZvW2ldLnNlY3Rvcl9jb3VudCA9IEFNRDI5TFYwMTZfU0VDVE9SUzsKCQkJc2VjdHNpemUgPSAoQU1EMjlMVjAxNl9TSVpFKjQpL0FNRDI5TFYwMTZfU0VDVE9SUzsKCQl9IGVsc2UgewoJCQkvKiBGaXhNZTogdGhpcyBhc3N1bWVzIHRoYXQgYmFuazEgaXMgdW5tYXBwZWQgCgkJCSAqIChvciBtYXBwZWQgdG8gdGhlIHNhbWUgZmxhc2ggYmFuayBhcyBCT09UQ1MpICovCgkJCWZsYXNoX2luZm9baV0uZmxhc2hfaWQgPSAwOwoJCQlmbGFzaF9pbmZvW2ldLnNpemUgPSAwOwoJCQlmbGFzaF9pbmZvW2ldLnNlY3Rvcl9jb3VudCA9IDA7CgkJCXNlY3RzaXplPTA7CgkJfQoJCW1lbXNldChmbGFzaF9pbmZvW2ldLnByb3RlY3QsIDAsIENGR19NQVhfRkxBU0hfU0VDVCk7CgkJc3dpdGNoIChpKSB7CgkJY2FzZSAwOgoJCQlmbGFzaGJhc2UgPSBTQzUyMF9GTEFTSF9CQU5LMF9CQVNFOwoJCQlicmVhazsKCQljYXNlIDE6CgkJCWZsYXNoYmFzZSA9IFNDNTIwX0ZMQVNIX0JBTksxX0JBU0U7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJZmxhc2hiYXNlID0gU0M1MjBfRkxBU0hfQkFOSzBfQkFTRTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJcGFuaWMoImNvbmZpZ3VyZWQgdG8gbWFueSBmbGFzaCBiYW5rcyFcbiIpOwoJCX0KCQkKCQlmb3IgKGogPSAwOyBqIDwgZmxhc2hfaW5mb1tpXS5zZWN0b3JfY291bnQ7IGorKykgewoJCQlmbGFzaF9pbmZvW2ldLnN0YXJ0W2pdID0gc2VjdHNpemU7CgkJCWZsYXNoX2luZm9baV0uc3RhcnRbal0gPSBmbGFzaGJhc2UgKyBqICogc2VjdHNpemU7CgkJfQoJCXNpemUgKz0gZmxhc2hfaW5mb1tpXS5zaXplOwoJfQoJCgkvKgoJICogUHJvdGVjdCBtb25pdG9yIGFuZCBlbnZpcm9ubWVudCBzZWN0b3JzCgkgKi8KCWZsYXNoX3Byb3RlY3QoRkxBR19QUk9URUNUX1NFVCwKCQkgICAgICBpMzg2Ym9vdF9zdGFydC1TQzUyMF9GTEFTSF9CQU5LMF9CQVNFLAoJCSAgICAgIGkzODZib290X2VuZC1TQzUyMF9GTEFTSF9CQU5LMF9CQVNFLAoJCSAgICAgICZmbGFzaF9pbmZvWzBdKTsKCQojaWZkZWYgQ0ZHX0VOVl9BRERSCglmbGFzaF9wcm90ZWN0KEZMQUdfUFJPVEVDVF9TRVQsCgkJICAgICAgQ0ZHX0VOVl9BRERSLAoJCSAgICAgIENGR19FTlZfQUREUiArIENGR19FTlZfU0laRSAtIDEsCgkJICAgICAgJmZsYXNoX2luZm9bMF0pOwojZW5kaWYKCXJldHVybiBzaXplOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwp2b2lkIGZsYXNoX3ByaW50X2luZm8oZmxhc2hfaW5mb190ICppbmZvKQp7CglpbnQgaTsKCglzd2l0Y2ggKGluZm8tPmZsYXNoX2lkICYgRkxBU0hfVkVORE1BU0spIHsKCWNhc2UgKEFNRF9NQU5VRkFDVCAmIEZMQVNIX1ZFTkRNQVNLKToKCQlwcmludGYoIkFNRDogIik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXByaW50ZigiVW5rbm93biBWZW5kb3IgIik7CgkJYnJlYWs7Cgl9CgkKCXN3aXRjaCAoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9UWVBFTUFTSykgewoJY2FzZSAoQU1EX0lEX0xWMDE2QiAmIEZMQVNIX1RZUEVNQVNLKToKCQlwcmludGYoIjR4IEFtZDI5TFYwMTZCICgxNk1iaXQpXG4iKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcHJpbnRmKCJVbmtub3duIENoaXAgVHlwZVxuIik7CgkJZ290byBkb25lOwoJCWJyZWFrOwoJfQoJCglwcmludGYoIiAgU2l6ZTogJWxkIE1CIGluICVkIFNlY3RvcnNcbiIsCgkgICAgICAgaW5mby0+c2l6ZSA+PiAyMCwgaW5mby0+c2VjdG9yX2NvdW50KTsKCQoJcHJpbnRmKCIgIFNlY3RvciBTdGFydCBBZGRyZXNzZXM6Iik7Cglmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2VjdG9yX2NvdW50OyBpKyspIHsKCQlpZiAoKGkgJSA1KSA9PSAwKSB7CgkJCXByaW50ZiAoIlxuICAgIik7CgkJfQoJCXByaW50ZiAoIiAlMDhsWCVzIiwgaW5mby0+c3RhcnRbaV0sCgkJCWluZm8tPnByb3RlY3RbaV0gPyAiIChSTykiIDogIiAgICAgIik7Cgl9CglwcmludGYgKCJcbiIpOwoJCglkb25lOgp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwoKaW50IGZsYXNoX2VyYXNlKGZsYXNoX2luZm9fdCAqaW5mbywgaW50IHNfZmlyc3QsIGludCBzX2xhc3QpCnsKCXVsb25nIHJlc3VsdDsKCWludCBpZmxhZywgcHJvdCwgc2VjdDsKCWludCByYyA9IEVSUl9PSzsKCWludCBjaGlwMSwgY2hpcDI7CgoJLyogZmlyc3QgbG9vayBmb3IgcHJvdGVjdGlvbiBiaXRzICovCgkKCWlmIChpbmZvLT5mbGFzaF9pZCA9PSBGTEFTSF9VTktOT1dOKSB7CgkJcmV0dXJuIEVSUl9VTktOT1dOX0ZMQVNIX1RZUEU7Cgl9CgkKCWlmICgoc19maXJzdCA8IDApIHx8IChzX2ZpcnN0ID4gc19sYXN0KSkgewoJCXJldHVybiBFUlJfSU5WQUw7Cgl9CgkKCWlmICgoaW5mby0+Zmxhc2hfaWQgJiBGTEFTSF9WRU5ETUFTSykgIT0KCSAgICAoQU1EX01BTlVGQUNUICYgRkxBU0hfVkVORE1BU0spKSB7CgkJcmV0dXJuIEVSUl9VTktOT1dOX0ZMQVNIX1ZFTkRPUjsKCX0KCQoJcHJvdCA9IDA7Cglmb3IgKHNlY3Q9c19maXJzdDsgc2VjdDw9c19sYXN0OyArK3NlY3QpIHsKCQlpZiAoaW5mby0+cHJvdGVjdFtzZWN0XSkgewoJCQlwcm90Kys7CgkJfQoJfQoJaWYgKHByb3QpIHsKCQlyZXR1cm4gRVJSX1BST1RFQ1RFRDsKCX0KCQoJLyoKCSAqIERpc2FibGUgaW50ZXJydXB0cyB3aGljaCBtaWdodCBjYXVzZSBhIHRpbWVvdXQKCSAqIGhlcmUuIFJlbWVtYmVyIHRoYXQgb3VyIGV4Y2VwdGlvbiB2ZWN0b3JzIGFyZQoJICogYXQgYWRkcmVzcyAwIGluIHRoZSBmbGFzaCwgYW5kIHdlIGRvbid0IHdhbnQgYQoJICogKHRpY2tlcikgZXhjZXB0aW9uIHRvIGhhcHBlbiB3aGlsZSB0aGUgZmxhc2gKCSAqIGNoaXAgaXMgaW4gcHJvZ3JhbW1pbmcgbW9kZS4KCSAqLwoJaWZsYWcgPSBkaXNhYmxlX2ludGVycnVwdHMoKTsKCQoJLyogU3RhcnQgZXJhc2Ugb24gdW5wcm90ZWN0ZWQgc2VjdG9ycyAqLwoJZm9yIChzZWN0ID0gc19maXJzdDsgc2VjdDw9c19sYXN0ICYmICFjdHJsYygpOyBzZWN0KyspIHsKCQlwcmludGYoIkVyYXNpbmcgc2VjdG9yICUyZCAuLi4gIiwgc2VjdCk7CgkJCgkJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KCQlyZXNldF90aW1lcigpOwoJCQoJCWlmIChpbmZvLT5wcm90ZWN0W3NlY3RdID09IDApIHsJCgkJCS8qIG5vdCBwcm90ZWN0ZWQgKi8KCQkJdWxvbmcgYWRkciA9IGluZm8tPnN0YXJ0W3NlY3RdOwoJCQkKCQkJd3JpdGVsKENNRF9VTkxPQ0sxLCBhZGRyICsgMSk7CgkJCXdyaXRlbChDTURfVU5MT0NLMiwgYWRkciArIDIpOwoJCQl3cml0ZWwoQ01EX0VSQVNFX1NFVFVQLCBhZGRyICsgMSk7CgkJCQoJCQl3cml0ZWwoQ01EX1VOTE9DSzEsIGFkZHIgKyAxKTsKCQkJd3JpdGVsKENNRF9VTkxPQ0syLCBhZGRyICsgMik7CgkJCXdyaXRlbChDTURfRVJBU0VfQ09ORklSTSwgYWRkcik7CgoJCQkKCQkJLyogd2FpdCB1bnRpbCBmbGFzaCBpcyByZWFkeSAqLwoJCQljaGlwMSA9IGNoaXAyID0gMDsKCQkJCgkJCWRvIHsKCQkJCXJlc3VsdCA9IHJlYWRsKGFkZHIpOwoJCQkJCgkJCQkvKiBjaGVjayB0aW1lb3V0ICovCgkJCQlpZiAoZ2V0X3RpbWVyKDApID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKCQkJCQl3cml0ZWwoQ01EX1JFQURfQVJSQVksIGFkZHIgKyAxKTsKCQkJCQljaGlwMSA9IFRNTzsKCQkJCQlicmVhazsKCQkJCX0KCQkJCQoJCQkJaWYgKCFjaGlwMSAmJiAocmVzdWx0ICYgMHhGRkZGKSAmIEJJVF9FUkFTRV9ET05FKSB7CgkJCQkJY2hpcDEgPSBSRUFEWTsKCQkJCX0KCQkJCQoJCQkJaWYgKCFjaGlwMSAmJiAocmVzdWx0ICYgMHhGRkZGKSAmIEJJVF9QUk9HUkFNX0VSUk9SKSB7CgkJCQkJY2hpcDEgPSBFUlI7CgkJCQl9CgkJCQkKCQkJCWlmICghY2hpcDIgJiYgKHJlc3VsdCA+PiAxNikgJiBCSVRfRVJBU0VfRE9ORSkgewoJCQkJCWNoaXAyID0gUkVBRFk7CgkJCQl9CgkJCQkKCQkJCWlmICghY2hpcDIgJiYgKHJlc3VsdCA+PiAxNikgJiBCSVRfUFJPR1JBTV9FUlJPUikgewoJCQkJCWNoaXAyID0gRVJSOwoJCQkJfQoJCQkJCgkJCX0gIHdoaWxlICghY2hpcDEgfHwgIWNoaXAyKTsKCQkJCgkJCXdyaXRlbChDTURfUkVBRF9BUlJBWSwgYWRkciArIDEpOwoJCQkKCQkJaWYgKGNoaXAxID09IEVSUiB8fCBjaGlwMiA9PSBFUlIpIHsKCQkJCXJjID0gRVJSX1BST0dfRVJST1I7CgkJCQlnb3RvIG91dGFoZXJlOwoJCQl9CgkJCQoJCQlpZiAoY2hpcDEgPT0gVE1PKSB7CgkJCQlyYyA9IEVSUl9USU1PVVQ7CgkJCQlnb3RvIG91dGFoZXJlOwoJCQl9CgkJCQoJCQlwcmludGYoIm9rLlxuIik7CgkJfSBlbHNlIHsgLyogaXQgd2FzIHByb3RlY3RlZCAqLwoJCQkKCQkJcHJpbnRmKCJwcm90ZWN0ZWQhXG4iKTsKCQl9Cgl9CgkKCWlmIChjdHJsYygpKSB7CgkJcHJpbnRmKCJVc2VyIEludGVycnVwdCFcbiIpOwoJfQoKb3V0YWhlcmU6CgkvKiBhbGxvdyBmbGFzaCB0byBzZXR0bGUgLSB3YWl0IDEwIG1zICovCgl1ZGVsYXkoMTAwMDApOwoJCglpZiAoaWZsYWcpIHsKCQllbmFibGVfaW50ZXJydXB0cygpOwoJfQoJCglyZXR1cm4gcmM7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogQ29weSBtZW1vcnkgdG8gZmxhc2gKICovCgp2b2xhdGlsZSBzdGF0aWMgaW50IHdyaXRlX3dvcmQoZmxhc2hfaW5mb190ICppbmZvLCB1bG9uZyBkZXN0LCB1bG9uZyBkYXRhKQp7Cgl1bG9uZyBhZGRyID0gZGVzdDsKCXVsb25nIHJlc3VsdDsKCWludCByYyA9IEVSUl9PSzsKCWludCBpZmxhZzsKCWludCBjaGlwMSwgY2hpcDI7CgkKCS8qCgkgKiBDaGVjayBpZiBGbGFzaCBpcyAoc3VmZmljaWVudGx5KSBlcmFzZWQKCSAqLwoJcmVzdWx0ID0gcmVhZGwoYWRkcik7CglpZiAoKHJlc3VsdCAmIGRhdGEpICE9IGRhdGEpIHsKCQlyZXR1cm4gRVJSX05PVF9FUkFTRUQ7Cgl9CgkKCS8qCgkgKiBEaXNhYmxlIGludGVycnVwdHMgd2hpY2ggbWlnaHQgY2F1c2UgYSB0aW1lb3V0CgkgKiBoZXJlLiBSZW1lbWJlciB0aGF0IG91ciBleGNlcHRpb24gdmVjdG9ycyBhcmUKCSAqIGF0IGFkZHJlc3MgMCBpbiB0aGUgZmxhc2gsIGFuZCB3ZSBkb24ndCB3YW50IGEKCSAqICh0aWNrZXIpIGV4Y2VwdGlvbiB0byBoYXBwZW4gd2hpbGUgdGhlIGZsYXNoCgkgKiBjaGlwIGlzIGluIHByb2dyYW1taW5nIG1vZGUuCgkgKi8KCWlmbGFnID0gZGlzYWJsZV9pbnRlcnJ1cHRzKCk7CgoJd3JpdGVsKENNRF9VTkxPQ0sxLCBhZGRyICsgMSk7Cgl3cml0ZWwoQ01EX1VOTE9DSzIsIGFkZHIgKyAyKTsKCXdyaXRlbChDTURfVU5MT0NLX0JZUEFTUywgYWRkciArIDEpOwoJd3JpdGVsKGFkZHIsIENNRF9QUk9HUkFNKTsKCXdyaXRlbChhZGRyLCBkYXRhKTsKCQoJLyogYXJtIHNpbXBsZSwgbm9uIGludGVycnVwdCBkZXBlbmRlbnQgdGltZXIgKi8KCXJlc2V0X3RpbWVyKCk7CgkKCS8qIHdhaXQgdW50aWwgZmxhc2ggaXMgcmVhZHkgKi8KCWNoaXAxID0gY2hpcDIgPSAwOwoJZG8gewoJCXJlc3VsdCA9IHJlYWRsKGFkZHIpOwoJCQoJCS8qIGNoZWNrIHRpbWVvdXQgKi8KCQlpZiAoZ2V0X3RpbWVyKDApID4gQ0ZHX0ZMQVNIX0VSQVNFX1RPVVQpIHsKCQkJY2hpcDEgPSBFUlIgfCBUTU87CgkJCWJyZWFrOwoJCX0KCQkKCQlpZiAoIWNoaXAxICYmICgocmVzdWx0ICYgMHg4MCkgPT0gKGRhdGEgJiAweDgwKSkpIHsKCQkJY2hpcDEgPSBSRUFEWTsKCQl9CgkJCgkJaWYgKCFjaGlwMSAmJiAoKHJlc3VsdCAmIDB4RkZGRikgJiBCSVRfUFJPR1JBTV9FUlJPUikpIHsKCQkJcmVzdWx0ID0gcmVhZGwoYWRkcik7CgkJCQoJCQlpZiAoKHJlc3VsdCAmIDB4ODApID09IChkYXRhICYgMHg4MCkpIHsKCQkJCWNoaXAxID0gUkVBRFk7CgkJCX0gZWxzZSB7CgkJCQljaGlwMSA9IEVSUjsKCQkJfQoJCX0KCQkKCQlpZiAoIWNoaXAyICYmICgocmVzdWx0ICYgKDB4ODAgPDwgMTYpKSA9PSAoZGF0YSAmICgweDgwIDw8IDE2KSkpKSB7CgkJCWNoaXAyID0gUkVBRFk7CgkJfQoJCQoJCWlmICghY2hpcDIgJiYgKChyZXN1bHQgPj4gMTYpICYgQklUX1BST0dSQU1fRVJST1IpKSB7CgkJCXJlc3VsdCA9IHJlYWRsKGFkZHIpOwoJCQkKCQkJaWYgKChyZXN1bHQgJiAoMHg4MCA8PCAxNikpID09IChkYXRhICYgKDB4ODAgPDwgMTYpKSkgewoJCQkJY2hpcDIgPSBSRUFEWTsKCQkJfSBlbHNlIHsKCQkJCWNoaXAyID0gRVJSOwoJCQl9CgkJfQoJCQoJfSAgd2hpbGUgKCFjaGlwMSB8fCAhY2hpcDIpOwoJCgl3cml0ZWwoQ01EX1JFQURfQVJSQVksIGFkZHIpOwoJCglpZiAoY2hpcDEgPT0gRVJSIHx8IGNoaXAyID09IEVSUiB8fCByZWFkbChhZGRyKSAhPSBkYXRhKSB7CgkJcmMgPSBFUlJfUFJPR19FUlJPUjsKCX0KCQoJaWYgKGlmbGFnKSB7CgkJZW5hYmxlX2ludGVycnVwdHMoKTsKCX0KCQoJcmV0dXJuIHJjOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIENvcHkgbWVtb3J5IHRvIGZsYXNoLgogKi8KCmludCB3cml0ZV9idWZmKGZsYXNoX2luZm9fdCAqaW5mbywgdWNoYXIgKnNyYywgdWxvbmcgYWRkciwgdWxvbmcgY250KQp7Cgl1bG9uZyBjcCwgd3AsIGRhdGE7CglpbnQgbDsKCWludCBpLCByYzsKCQoJd3AgPSAoYWRkciAmIH4zKTsJLyogZ2V0IGxvd2VyIHdvcmQgYWxpZ25lZCBhZGRyZXNzICovCgkKCS8qCgkgKiBoYW5kbGUgdW5hbGlnbmVkIHN0YXJ0IGJ5dGVzCgkgKi8KCWlmICgobCA9IGFkZHIgLSB3cCkgIT0gMCkgewoJCWRhdGEgPSAwOwoJCWZvciAoaT0wLCBjcD13cDsgaTxsOyArK2ksICsrY3ApIHsKCQkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCAyNCk7CgkJfQoJCWZvciAoOyBpPDQgJiYgY250PjA7ICsraSkgewoJCQlkYXRhID0gKGRhdGEgPj4gOCkgfCAoKnNyYysrIDw8IDI0KTsKCQkJLS1jbnQ7CgkJCSsrY3A7CgkJfQoJCWZvciAoOyBjbnQ9PTAgJiYgaTw0OyArK2ksICsrY3ApIHsKCQkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCoodWNoYXIgKiljcCA8PCAyNCk7CgkJfQoJCQoJCWlmICgocmMgPSB3cml0ZV93b3JkKGluZm8sIHdwLCBkYXRhKSkgIT0gMCkgewoJCQlyZXR1cm4gcmM7CgkJfQoJCXdwICs9IDQ7Cgl9CgkKCS8qCgkgKiBoYW5kbGUgd29yZCBhbGlnbmVkIHBhcnQKCSAqLwoJd2hpbGUgKGNudCA+PSA0KSB7CgkJZGF0YSA9ICooKHZ1X2xvbmcqKXNyYyk7CgkJaWYgKChyYyA9IHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpKSAhPSAwKSB7CgkJCXJldHVybiByYzsKCQl9CgkJc3JjICs9IDQ7CgkJd3AgICs9IDQ7CgkJY250IC09IDQ7Cgl9CgkKCWlmIChjbnQgPT0gMCkgewoJCXJldHVybiBFUlJfT0s7Cgl9CgkKCS8qCgkgKiBoYW5kbGUgdW5hbGlnbmVkIHRhaWwgYnl0ZXMKCSAqLwoJZGF0YSA9IDA7Cglmb3IgKGk9MCwgY3A9d3A7IGk8NCAmJiBjbnQ+MDsgKytpLCArK2NwKSB7CgkJZGF0YSA9IChkYXRhID4+IDgpIHwgKCpzcmMrKyA8PCAyNCk7CgkJLS1jbnQ7Cgl9Cglmb3IgKDsgaTw0OyArK2ksICsrY3ApIHsKCQlkYXRhID0gKGRhdGEgPj4gOCkgfCAoKih1Y2hhciAqKWNwIDw8IDI0KTsKCX0KCQoJcmV0dXJuIHdyaXRlX3dvcmQoaW5mbywgd3AsIGRhdGEpOwp9Cg==