LyoKICogQ29weXJpZ2h0IKkgMjAxMyBHb29nbGUKICogQ29weXJpZ2h0IKkgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKICogSU4gVEhFIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBLZWVzIENvb2sgPGtlZXNjb29rQGNocm9taXVtLm9yZz4KICogICAgRGFuaWVsIFZldHRlciA8ZGFuaWVsLnZldHRlckBmZndsbC5jaD4KICogICAgUmFmYWVsIEJhcmJhbGhvIDxyYWZhZWwuYmFyYmFsaG9AaW50ZWwuY29tPgogKgogKi8KCiNpbmNsdWRlICJpZ3QuaCIKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8aW50dHlwZXMuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgojaW5jbHVkZSA8bGltaXRzLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlICJkcm0uaCIKCklHVF9URVNUX0RFU0NSSVBUSU9OKCJDaGVjayB0aGF0IGtlcm5lbCByZWxvY2F0aW9uIG92ZXJmbG93cyBhcmUgY2F1Z2h0LiIpOwoKLyoKICogVGVzdGNhc2U6IEtlcm5lbCByZWxvY2F0aW9uIG92ZXJmbG93cyBhcmUgY2F1Z2h0LgogKi8KCmludCBmZCwgZW50cmllcywgbnVtOwpzaXplX3QgcmVsb2Nfc2l6ZTsKdWludDMyX3QgKmhhbmRsZXM7CnN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjb2JqczsKc3RydWN0IGRybV9pOTE1X2dlbV9leGVjYnVmZmVyMiBleGVjYnVmID0geyAwIH07CnN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSAqcmVsb2M7Cgp1aW50MzJfdCBoYW5kbGU7CnVpbnQzMl90IGJhdGNoX2hhbmRsZTsKCnN0YXRpYyB2b2lkIHNvdXJjZV9vZmZzZXRfdGVzdHMoaW50IGRldmlkLCBib29sIHJlbG9jX2d0dCkKewoJc3RydWN0IGRybV9pOTE1X2dlbV9yZWxvY2F0aW9uX2VudHJ5IHNpbmdsZV9yZWxvYzsKCXZvaWQgKmRzdF9ndHQ7Cgljb25zdCBjaGFyICpyZWxvY2F0aW9uX3R5cGU7CgoJaWYgKHJlbG9jX2d0dCkKCQlyZWxvY2F0aW9uX3R5cGUgPSAicmVsb2MtZ3R0IjsKCWVsc2UKCQlyZWxvY2F0aW9uX3R5cGUgPSAicmVsb2MtY3B1IjsKCglpZ3RfZml4dHVyZSB7CgkJaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgODE5Mik7CgoJCWV4ZWNvYmpzWzFdLmhhbmRsZSA9IGJhdGNoX2hhbmRsZTsKCQlleGVjb2Jqc1sxXS5yZWxvY2F0aW9uX2NvdW50ID0gMDsKCQlleGVjb2Jqc1sxXS5yZWxvY3NfcHRyID0gMDsKCgkJZXhlY29ianNbMF0uaGFuZGxlID0gaGFuZGxlOwoJCWV4ZWNvYmpzWzBdLnJlbG9jYXRpb25fY291bnQgPSAxOwoJCWV4ZWNvYmpzWzBdLnJlbG9jc19wdHIgPSAodWludHB0cl90KSAmc2luZ2xlX3JlbG9jOwoJCWV4ZWNidWYuYnVmZmVyX2NvdW50ID0gMjsKCgkJaWYgKHJlbG9jX2d0dCkgewoJCQlkc3RfZ3R0ID0gZ2VtX21tYXAoZmQsIGhhbmRsZSwgODE5MiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CgkJCWlndF9hc3NlcnQoZHN0X2d0dCAhPSBNQVBfRkFJTEVEKTsKCQkJZ2VtX3NldF9kb21haW4oZmQsIGhhbmRsZSwgSTkxNV9HRU1fRE9NQUlOX0dUVCwgSTkxNV9HRU1fRE9NQUlOX0dUVCk7CgkJCW1lbXNldChkc3RfZ3R0LCAwLCA4MTkyKTsKCQkJbXVubWFwKGRzdF9ndHQsIDgxOTIpOwoJCQlyZWxvY2F0aW9uX3R5cGUgPSAicmVsb2MtZ3R0IjsKCQl9IGVsc2UgewoJCQlyZWxvY2F0aW9uX3R5cGUgPSAicmVsb2MtY3B1IjsKCQl9Cgl9CgoJLyogU3BlY2lhbCB0ZXN0cyBmb3IgNjRiIHJlbG9jcy4gKi8KCWlndF9zdWJ0ZXN0X2YoInNvdXJjZS1vZmZzZXQtcGFnZS1zdHJhZGxlLWdlbjgtJXMiLCByZWxvY2F0aW9uX3R5cGUpIHsKCQlpZ3RfcmVxdWlyZShpbnRlbF9nZW4oZGV2aWQpID49IDgpOwoJCXNpbmdsZV9yZWxvYy5vZmZzZXQgPSA0MDk2IC0gNDsKCQlzaW5nbGVfcmVsb2MuZGVsdGEgPSAwOwoJCXNpbmdsZV9yZWxvYy50YXJnZXRfaGFuZGxlID0gaGFuZGxlOwoJCXNpbmdsZV9yZWxvYy5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwoJCXNpbmdsZV9yZWxvYy53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwoJCXNpbmdsZV9yZWxvYy5wcmVzdW1lZF9vZmZzZXQgPSAwOwoKCQlpZ3RfYXNzZXJ0KGlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKSA9PSAwKTsKCQlzaW5nbGVfcmVsb2MuZGVsdGEgPSAxMDI0OwoJCWlndF9hc3NlcnQoaW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMiwgJmV4ZWNidWYpID09IDApOwoJfQoKCWlndF9zdWJ0ZXN0X2YoInNvdXJjZS1vZmZzZXQtZW5kLWdlbjgtJXMiLCByZWxvY2F0aW9uX3R5cGUpIHsKCQlpZ3RfcmVxdWlyZShpbnRlbF9nZW4oZGV2aWQpID49IDgpOwoJCXNpbmdsZV9yZWxvYy5vZmZzZXQgPSA4MTkyIC0gODsKCQlzaW5nbGVfcmVsb2MuZGVsdGEgPSAwOwoJCXNpbmdsZV9yZWxvYy50YXJnZXRfaGFuZGxlID0gaGFuZGxlOwoJCXNpbmdsZV9yZWxvYy5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwoJCXNpbmdsZV9yZWxvYy53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwoJCXNpbmdsZV9yZWxvYy5wcmVzdW1lZF9vZmZzZXQgPSAwOwoKCQlpZ3RfYXNzZXJ0KGlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKSA9PSAwKTsKCX0KCglpZ3Rfc3VidGVzdF9mKCJzb3VyY2Utb2Zmc2V0LW92ZXJmbG93LWdlbjgtJXMiLCByZWxvY2F0aW9uX3R5cGUpIHsKCQlpZ3RfcmVxdWlyZShpbnRlbF9nZW4oZGV2aWQpID49IDgpOwoJCXNpbmdsZV9yZWxvYy5vZmZzZXQgPSA4MTkyIC0gNDsKCQlzaW5nbGVfcmVsb2MuZGVsdGEgPSAwOwoJCXNpbmdsZV9yZWxvYy50YXJnZXRfaGFuZGxlID0gaGFuZGxlOwoJCXNpbmdsZV9yZWxvYy5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwoJCXNpbmdsZV9yZWxvYy53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwoJCXNpbmdsZV9yZWxvYy5wcmVzdW1lZF9vZmZzZXQgPSAwOwoKCQlpZ3RfYXNzZXJ0KGlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKSAhPSAwKTsKCQlpZ3RfYXNzZXJ0KGVycm5vID09IEVJTlZBTCk7Cgl9CgoJLyogVGVzdHMgZm9yIG9sZCA0Ynl0ZSByZWxvY3Mgb24gcHJlLWdlbjguICovCglpZ3Rfc3VidGVzdF9mKCJzb3VyY2Utb2Zmc2V0LWVuZC0lcyIsIHJlbG9jYXRpb25fdHlwZSkgewoJCWlndF9yZXF1aXJlKGludGVsX2dlbihkZXZpZCkgPCA4KTsKCQlzaW5nbGVfcmVsb2Mub2Zmc2V0ID0gODE5MiAtIDQ7CgkJc2luZ2xlX3JlbG9jLmRlbHRhID0gMDsKCQlzaW5nbGVfcmVsb2MudGFyZ2V0X2hhbmRsZSA9IGhhbmRsZTsKCQlzaW5nbGVfcmVsb2MucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKCQlzaW5nbGVfcmVsb2Mud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKCQlzaW5nbGVfcmVsb2MucHJlc3VtZWRfb2Zmc2V0ID0gMDsKCgkJaWd0X2Fzc2VydChpb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIyLCAmZXhlY2J1ZikgPT0gMCk7Cgl9CgoJaWd0X3N1YnRlc3RfZigic291cmNlLW9mZnNldC1iaWctJXMiLCByZWxvY2F0aW9uX3R5cGUpIHsKCQlzaW5nbGVfcmVsb2Mub2Zmc2V0ID0gODE5MjsKCQlzaW5nbGVfcmVsb2MuZGVsdGEgPSAwOwoJCXNpbmdsZV9yZWxvYy50YXJnZXRfaGFuZGxlID0gaGFuZGxlOwoJCXNpbmdsZV9yZWxvYy5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwoJCXNpbmdsZV9yZWxvYy53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fUkVOREVSOwoJCXNpbmdsZV9yZWxvYy5wcmVzdW1lZF9vZmZzZXQgPSAwOwoKCQlpZ3RfYXNzZXJ0KGlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKSAhPSAwKTsKCQlpZ3RfYXNzZXJ0KGVycm5vID09IEVJTlZBTCk7Cgl9CgoJaWd0X3N1YnRlc3RfZigic291cmNlLW9mZnNldC1uZWdhdGl2ZS0lcyIsIHJlbG9jYXRpb25fdHlwZSkgewoJCXNpbmdsZV9yZWxvYy5vZmZzZXQgPSAoaW50NjRfdCkgLTQ7CgkJc2luZ2xlX3JlbG9jLmRlbHRhID0gMDsKCQlzaW5nbGVfcmVsb2MudGFyZ2V0X2hhbmRsZSA9IGhhbmRsZTsKCQlzaW5nbGVfcmVsb2MucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKCQlzaW5nbGVfcmVsb2Mud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKCQlzaW5nbGVfcmVsb2MucHJlc3VtZWRfb2Zmc2V0ID0gMDsKCgkJaWd0X2Fzc2VydChpb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIyLCAmZXhlY2J1ZikgIT0gMCk7CgkJaWd0X2Fzc2VydChlcnJubyA9PSBFSU5WQUwpOwoJfQoKCWlndF9zdWJ0ZXN0X2YoInNvdXJjZS1vZmZzZXQtdW5hbGlnbmVkLSVzIiwgcmVsb2NhdGlvbl90eXBlKSB7CgkJc2luZ2xlX3JlbG9jLm9mZnNldCA9IDE7CgkJc2luZ2xlX3JlbG9jLmRlbHRhID0gMDsKCQlzaW5nbGVfcmVsb2MudGFyZ2V0X2hhbmRsZSA9IGhhbmRsZTsKCQlzaW5nbGVfcmVsb2MucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKCQlzaW5nbGVfcmVsb2Mud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX1JFTkRFUjsKCQlzaW5nbGVfcmVsb2MucHJlc3VtZWRfb2Zmc2V0ID0gMDsKCgkJaWd0X2Fzc2VydChpb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIyLCAmZXhlY2J1ZikgIT0gMCk7CgkJaWd0X2Fzc2VydChlcnJubyA9PSBFSU5WQUwpOwoJfQoKCWlndF9maXh0dXJlIHsKCQlnZW1fY2xvc2UoZmQsIGhhbmRsZSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIHJlbG9jX3Rlc3RzKHZvaWQpCnsKCWludCBpOwoJdW5zaWduZWQgaW50IHRvdGFsX3Vuc2lnbmVkID0gMDsKCglpZ3Rfc3VidGVzdCgiaW52YWxpZC1hZGRyZXNzIikgewoJCS8qIEF0dGVtcHQgdW5tYXBwZWQgc2luZ2xlIGVudHJ5LiAqLwoJCWV4ZWNvYmpzWzBdLnJlbG9jYXRpb25fY291bnQgPSAxOwoJCWV4ZWNvYmpzWzBdLnJlbG9jc19wdHIgPSAwOwoJCWV4ZWNidWYuYnVmZmVyX2NvdW50ID0gMTsKCgkJZXJybm8gPSAwOwoJCWlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKTsKCQlpZ3RfYXNzZXJ0KGVycm5vID09IEVGQVVMVCk7Cgl9CgoJaWd0X3N1YnRlc3QoInNpbmdsZS1vdmVyZmxvdyIpIHsKCQkvKiBBdHRlbXB0IHNpbmdsZSBvdmVyZmxvd2VkIGVudHJ5LiAqLwoJCWV4ZWNvYmpzWzBdLnJlbG9jYXRpb25fY291bnQgPSAoMSA8PCAzMSk7CgkJZXhlY29ianNbMF0ucmVsb2NzX3B0ciA9ICh1aW50cHRyX3QpcmVsb2M7CgkJZXhlY2J1Zi5idWZmZXJfY291bnQgPSAxOwoKCQllcnJubyA9IDA7CgkJaW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMiwgJmV4ZWNidWYpOwoJCWlndF9hc3NlcnQoZXJybm8gPT0gRUlOVkFMKTsKCX0KCglpZ3RfZml4dHVyZSB7CgkJZXhlY29ianNbMF0uaGFuZGxlID0gYmF0Y2hfaGFuZGxlOwoJCWV4ZWNvYmpzWzBdLnJlbG9jYXRpb25fY291bnQgPSAwOwoJCWV4ZWNvYmpzWzBdLnJlbG9jc19wdHIgPSAwOwoKCQlleGVjYnVmLmJ1ZmZlcl9jb3VudCA9IDE7CgoJCS8qIE1ha2Ugc3VyZSB0aGUgYmF0Y2ggd291bGQgc3VjY2VlZCBleGNlcHQgZm9yIHRoZSB0aGluZyB3ZSdyZQoJCSAqIHRlc3RpbmcuICovCgkJZXhlY2J1Zi5iYXRjaF9zdGFydF9vZmZzZXQgPSAwOwoJCWV4ZWNidWYuYmF0Y2hfbGVuID0gODsKCQlpZ3RfYXNzZXJ0KGlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKSA9PSAwKTsKCX0KCglpZ3Rfc3VidGVzdCgiYmF0Y2gtc3RhcnQtdW5hbGlnbmVkIikgewoJCWV4ZWNidWYuYmF0Y2hfc3RhcnRfb2Zmc2V0ID0gMTsKCQlleGVjYnVmLmJhdGNoX2xlbiA9IDg7CgoJCWlndF9hc3NlcnQoaW9jdGwoZmQsIERSTV9JT0NUTF9JOTE1X0dFTV9FWEVDQlVGRkVSMiwgJmV4ZWNidWYpICE9IDApOwoJCWlndF9hc3NlcnQoZXJybm8gPT0gRUlOVkFMKTsKCX0KCglpZ3Rfc3VidGVzdCgiYmF0Y2gtZW5kLXVuYWxpZ25lZCIpIHsKCQlleGVjYnVmLmJhdGNoX3N0YXJ0X29mZnNldCA9IDA7CgkJZXhlY2J1Zi5iYXRjaF9sZW4gPSA3OwoKCQlpZ3RfYXNzZXJ0KGlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKSAhPSAwKTsKCQlpZ3RfYXNzZXJ0KGVycm5vID09IEVJTlZBTCk7Cgl9CgoJaWd0X2ZpeHR1cmUgewoJCS8qIFVuZG8gZGFtYWdlIGZvciBuZXh0IHRlc3RzLiAqLwoJCWV4ZWNidWYuYmF0Y2hfc3RhcnRfb2Zmc2V0ID0gMDsKCQlleGVjYnVmLmJhdGNoX2xlbiA9IDg7Cgl9CgoJaWd0X3N1YnRlc3QoIndyYXBwZWQtb3ZlcmZsb3ciKSB7CgkJLyogQXR0ZW1wdCB3cmFwcGVkIG92ZXJmbG93IGVudHJpZXMuICovCgkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CgkJCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpvYmogPSAmZXhlY29ianNbaV07CgkJCW9iai0+aGFuZGxlID0gaGFuZGxlc1tpXTsKCgkJCWlmIChpID09IG51bSAtIDEpIHsKCQkJCS8qIFdyYXBzIHRvIDEgb24gbGFzdCBjb3VudC4gKi8KCQkJCW9iai0+cmVsb2NhdGlvbl9jb3VudCA9IDEgLSB0b3RhbF91bnNpZ25lZDsKCQkJCW9iai0+cmVsb2NzX3B0ciA9ICh1aW50cHRyX3QpcmVsb2M7CgkJCX0gZWxzZSB7CgkJCQlvYmotPnJlbG9jYXRpb25fY291bnQgPSBlbnRyaWVzOwoJCQkJb2JqLT5yZWxvY3NfcHRyID0gKHVpbnRwdHJfdClyZWxvYzsKCQkJfQoKCQkJdG90YWxfdW5zaWduZWQgKz0gb2JqLT5yZWxvY2F0aW9uX2NvdW50OwoJCX0KCQlleGVjYnVmLmJ1ZmZlcl9jb3VudCA9IG51bTsKCgkJZXJybm8gPSAwOwoJCWlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKTsKCQlpZ3RfYXNzZXJ0KGVycm5vID09IEVJTlZBTCk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGJ1ZmZlcl9jb3VudF90ZXN0cyh2b2lkKQp7CglpZ3Rfc3VidGVzdCgiYnVmZmVyY291bnQtb3ZlcmZsb3ciKSB7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewoJCQlleGVjb2Jqc1tpXS5yZWxvY2F0aW9uX2NvdW50ID0gMDsKCQkJZXhlY29ianNbaV0ucmVsb2NzX3B0ciA9IDA7CgkJCWV4ZWNvYmpzW2ldLmhhbmRsZSA9IGhhbmRsZXNbaV07CgkJfQoKCQlleGVjb2Jqc1swXS5yZWxvY2F0aW9uX2NvdW50ID0gMDsKCQlleGVjb2Jqc1swXS5yZWxvY3NfcHRyID0gMDsKCQkvKiBXZSBvbmx5IGhhdmUgbnVtIGJ1ZmZlcnMgYWN0dWFsbHksIGJ1dCB0aGUgb3ZlcmZsb3cgd2lsbCBtYWtlCgkJICogc3VyZSB3ZSBibG93IHVwIHRoZSBrZXJuZWwgYmVmb3JlIHdlIGJsb3cgdXAgdXNlcnNwYWNlLiAqLwoJCWV4ZWNidWYuYnVmZmVyX2NvdW50ID0gbnVtOwoKCQkvKiBQdXQgYSByZWFsIGJhdGNoIGF0IHRoZSBlbmQuICovCgkJZXhlY29ianNbbnVtIC0gMV0uaGFuZGxlID0gYmF0Y2hfaGFuZGxlOwoKCQkvKiBNYWtlIHN1cmUgdGhlIGJhc2ljIHRoaW5nIHdvdWxkIHdvcmsgZmlyc3QgLi4uICovCgkJZXJybm8gPSAwOwoJCWlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKTsKCQlpZ3RfYXNzZXJ0KGVycm5vID09IDApOwoKCQkvKiAuLi4gdGhlbiBiZSBldmlsOiBPdmVyZmxvdyBvZiB0aGUgcG9pbnRlciB0YWJsZSAod2hpY2ggaGFzIGEKCQkgKiBiaXQgb2YgbGVhZCBkYXRhc3RydWN0dXJlcywgc28gbm8gKyAxIG5lZWRlZCB0byBvdmVyZmxvdykuICovCgkJZXhlY2J1Zi5idWZmZXJfY291bnQgPSBJTlRfTUFYIC8gc2l6ZW9mKHZvaWQgKik7CgoJCWVycm5vID0gMDsKCQlpb2N0bChmZCwgRFJNX0lPQ1RMX0k5MTVfR0VNX0VYRUNCVUZGRVIyLCAmZXhlY2J1Zik7CgkJaWd0X2Fzc2VydChlcnJubyA9PSBFSU5WQUwpOwoKCQkvKiAuLi4gdGhlbiBiZSBldmlsOiBDb3B5aW5nL2FsbG9jYXRpbmcgdGhlIGFycmF5LiAqLwoJCWV4ZWNidWYuYnVmZmVyX2NvdW50ID0gVUlOVF9NQVggLyBzaXplb2YoZXhlY29ianNbMF0pICsgMTsKCgkJZXJybm8gPSAwOwoJCWlvY3RsKGZkLCBEUk1fSU9DVExfSTkxNV9HRU1fRVhFQ0JVRkZFUjIsICZleGVjYnVmKTsKCQlpZ3RfYXNzZXJ0KGVycm5vID09IEVJTlZBTCk7Cgl9Cn0KCmlndF9tYWluCnsKCWludCBkZXZpZCA9IDA7CgoJaWd0X2ZpeHR1cmUgewoJCWludCByaW5nOwoJCXVpbnQzMl90IGJhdGNoX2RhdGEgWzJdID0geyBNSV9OT09QLCBNSV9CQVRDSF9CVUZGRVJfRU5EIH07CgoJCWZkID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9JTlRFTCk7CgoJCWRldmlkID0gaW50ZWxfZ2V0X2RybV9kZXZpZChmZCk7CgoJCS8qIENyZWF0ZSBnaWFudCByZWxvYyBidWZmZXIgYXJlYS4gKi8KCQludW0gPSAyNTc7CgkJZW50cmllcyA9ICgoMVVMTCA8PCAzMikgLyAobnVtIC0gMSkpOwoJCXJlbG9jX3NpemUgPSBlbnRyaWVzICogc2l6ZW9mKHN0cnVjdCBkcm1faTkxNV9nZW1fcmVsb2NhdGlvbl9lbnRyeSk7CgkJcmVsb2MgPSBtbWFwKE5VTEwsIHJlbG9jX3NpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCgkJCSAgICAgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwgLTEsIDApOwoJCWlndF9hc3NlcnQocmVsb2MgIT0gTUFQX0ZBSUxFRCk7CgoJCS8qIEFsbG9jYXRlIHRoZSBoYW5kbGVzIHdlJ2xsIG5lZWQgdG8gd3JhcC4gKi8KCQloYW5kbGVzID0gY2FsbG9jKG51bSwgc2l6ZW9mKCpoYW5kbGVzKSk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykKCQkJaGFuZGxlc1tpXSA9IGdlbV9jcmVhdGUoZmQsIDQwOTYpOwoKCQlpZiAoaW50ZWxfZ2VuKGRldmlkKSA+PSA2KQoJCQlyaW5nID0gSTkxNV9FWEVDX0JMVDsKCQllbHNlCgkJCXJpbmcgPSAwOwoKCQkvKiBDcmVhdGUgcmVsb2NhdGlvbiBvYmplY3RzLiAqLwoJCWV4ZWNvYmpzID0gY2FsbG9jKG51bSwgc2l6ZW9mKCpleGVjb2JqcykpOwoJCWV4ZWNidWYuYnVmZmVyc19wdHIgPSAodWludHB0cl90KWV4ZWNvYmpzOwoJCWV4ZWNidWYuYmF0Y2hfc3RhcnRfb2Zmc2V0ID0gMDsKCQlleGVjYnVmLmJhdGNoX2xlbiA9IDg7CgkJZXhlY2J1Zi5jbGlwcmVjdHNfcHRyID0gMDsKCQlleGVjYnVmLm51bV9jbGlwcmVjdHMgPSAwOwoJCWV4ZWNidWYuRFIxID0gMDsKCQlleGVjYnVmLkRSNCA9IDA7CgkJZXhlY2J1Zi5mbGFncyA9IHJpbmc7CgkJaTkxNV9leGVjYnVmZmVyMl9zZXRfY29udGV4dF9pZChleGVjYnVmLCAwKTsKCQlleGVjYnVmLnJzdmQyID0gMDsKCgkJYmF0Y2hfaGFuZGxlID0gZ2VtX2NyZWF0ZShmZCwgNDA5Nik7CgoJCWdlbV93cml0ZShmZCwgYmF0Y2hfaGFuZGxlLCAwLCBiYXRjaF9kYXRhLCBzaXplb2YoYmF0Y2hfZGF0YSkpOwoJfQoKCXJlbG9jX3Rlc3RzKCk7CgoJc291cmNlX29mZnNldF90ZXN0cyhkZXZpZCwgZmFsc2UpOwoJc291cmNlX29mZnNldF90ZXN0cyhkZXZpZCwgdHJ1ZSk7CgoJYnVmZmVyX2NvdW50X3Rlc3RzKCk7CgoJaWd0X2ZpeHR1cmUgewoJCWdlbV9jbG9zZShmZCwgYmF0Y2hfaGFuZGxlKTsKCQljbG9zZShmZCk7Cgl9Cn0K