LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcnM6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4KICogICAgICAgICAgVmVybm9uIE1hdWVyeSA8dmVybnV4QHVzLmlibS5jb20+CiAqCiAqLwoKLyogUmVtb3RlIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudCBoYW5kbGluZyBmdW5jdGlvbnMgKi8KCiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgImlibWFzbS5oIgojaW5jbHVkZSAicmVtb3RlLmgiCgojZGVmaW5lIE1PVVNFX1hfTUFYCTE2MDAKI2RlZmluZSBNT1VTRV9ZX01BWAkxMjAwCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgeGxhdGVfaGlnaFtYTEFURV9TSVpFXSA9IHsKCVtLRVlfU1lNX0VOVEVSICYgMHhmZl0gPSBLRVlfRU5URVIsCglbS0VZX1NZTV9LUFNMQVNIICYgMHhmZl0gPSBLRVlfS1BTTEFTSCwKCVtLRVlfU1lNX0tQU1RBUiAmIDB4ZmZdID0gS0VZX0tQQVNURVJJU0ssCglbS0VZX1NZTV9LUE1JTlVTICYgMHhmZl0gPSBLRVlfS1BNSU5VUywKCVtLRVlfU1lNX0tQRE9UICYgMHhmZl0gPSBLRVlfS1BET1QsCglbS0VZX1NZTV9LUFBMVVMgJiAweGZmXSA9IEtFWV9LUFBMVVMsCglbS0VZX1NZTV9LUDAgJiAweGZmXSA9IEtFWV9LUDAsCglbS0VZX1NZTV9LUDEgJiAweGZmXSA9IEtFWV9LUDEsCglbS0VZX1NZTV9LUDIgJiAweGZmXSA9IEtFWV9LUDIsIFtLRVlfU1lNX0tQRE9XTiAmIDB4ZmZdID0gS0VZX0tQMiwKCVtLRVlfU1lNX0tQMyAmIDB4ZmZdID0gS0VZX0tQMywKCVtLRVlfU1lNX0tQNCAmIDB4ZmZdID0gS0VZX0tQNCwgW0tFWV9TWU1fS1BMRUZUICYgMHhmZl0gPSBLRVlfS1A0LAoJW0tFWV9TWU1fS1A1ICYgMHhmZl0gPSBLRVlfS1A1LAoJW0tFWV9TWU1fS1A2ICYgMHhmZl0gPSBLRVlfS1A2LCBbS0VZX1NZTV9LUFJJR0hUICYgMHhmZl0gPSBLRVlfS1A2LAoJW0tFWV9TWU1fS1A3ICYgMHhmZl0gPSBLRVlfS1A3LAoJW0tFWV9TWU1fS1A4ICYgMHhmZl0gPSBLRVlfS1A4LCBbS0VZX1NZTV9LUFVQICYgMHhmZl0gPSBLRVlfS1A4LAoJW0tFWV9TWU1fS1A5ICYgMHhmZl0gPSBLRVlfS1A5LAoJW0tFWV9TWU1fQktfU1BDICYgMHhmZl0gPSBLRVlfQkFDS1NQQUNFLAoJW0tFWV9TWU1fVEFCICYgMHhmZl0gPSBLRVlfVEFCLAoJW0tFWV9TWU1fQ1RSTCAmIDB4ZmZdID0gS0VZX0xFRlRDVFJMLAoJW0tFWV9TWU1fQUxUICYgMHhmZl0gPSBLRVlfTEVGVEFMVCwKCVtLRVlfU1lNX0lOU0VSVCAmIDB4ZmZdID0gS0VZX0lOU0VSVCwKCVtLRVlfU1lNX0RFTEVURSAmIDB4ZmZdID0gS0VZX0RFTEVURSwKCVtLRVlfU1lNX1NISUZUICYgMHhmZl0gPSBLRVlfTEVGVFNISUZULAoJW0tFWV9TWU1fVUFSUk9XICYgMHhmZl0gPSBLRVlfVVAsCglbS0VZX1NZTV9EQVJST1cgJiAweGZmXSA9IEtFWV9ET1dOLAoJW0tFWV9TWU1fTEFSUk9XICYgMHhmZl0gPSBLRVlfTEVGVCwKCVtLRVlfU1lNX1JBUlJPVyAmIDB4ZmZdID0gS0VZX1JJR0hULAoJW0tFWV9TWU1fRVNDQVBFICYgMHhmZl0gPSBLRVlfRVNDLAogICAgICAgIFtLRVlfU1lNX1BBR0VVUCAmIDB4ZmZdID0gS0VZX1BBR0VVUCwKICAgICAgICBbS0VZX1NZTV9QQUdFRE9XTiAmIDB4ZmZdID0gS0VZX1BBR0VET1dOLAogICAgICAgIFtLRVlfU1lNX0hPTUUgJiAweGZmXSA9IEtFWV9IT01FLAogICAgICAgIFtLRVlfU1lNX0VORCAmIDB4ZmZdID0gS0VZX0VORCwKCVtLRVlfU1lNX0YxICYgMHhmZl0gPSBLRVlfRjEsCglbS0VZX1NZTV9GMiAmIDB4ZmZdID0gS0VZX0YyLAoJW0tFWV9TWU1fRjMgJiAweGZmXSA9IEtFWV9GMywKCVtLRVlfU1lNX0Y0ICYgMHhmZl0gPSBLRVlfRjQsCglbS0VZX1NZTV9GNSAmIDB4ZmZdID0gS0VZX0Y1LAoJW0tFWV9TWU1fRjYgJiAweGZmXSA9IEtFWV9GNiwKCVtLRVlfU1lNX0Y3ICYgMHhmZl0gPSBLRVlfRjcsCglbS0VZX1NZTV9GOCAmIDB4ZmZdID0gS0VZX0Y4LAoJW0tFWV9TWU1fRjkgJiAweGZmXSA9IEtFWV9GOSwKCVtLRVlfU1lNX0YxMCAmIDB4ZmZdID0gS0VZX0YxMCwKCVtLRVlfU1lNX0YxMSAmIDB4ZmZdID0gS0VZX0YxMSwKCVtLRVlfU1lNX0YxMiAmIDB4ZmZdID0gS0VZX0YxMiwKCVtLRVlfU1lNX0NBUF9MT0NLICYgMHhmZl0gPSBLRVlfQ0FQU0xPQ0ssCglbS0VZX1NZTV9OVU1fTE9DSyAmIDB4ZmZdID0gS0VZX05VTUxPQ0ssCglbS0VZX1NZTV9TQ1JfTE9DSyAmIDB4ZmZdID0gS0VZX1NDUk9MTExPQ0ssCn07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgeGxhdGVbWExBVEVfU0laRV0gPSB7CglbTk9fS0VZQ09ERV0gPSBLRVlfUkVTRVJWRUQsCglbS0VZX1NZTV9TUEFDRV0gPSBLRVlfU1BBQ0UsCglbS0VZX1NZTV9USUxERV0gPSBLRVlfR1JBVkUsICAgICAgICBbS0VZX1NZTV9CS1RJQ10gPSBLRVlfR1JBVkUsCglbS0VZX1NZTV9PTkVdID0gS0VZXzEsICAgICAgICAgICAgICBbS0VZX1NZTV9CQU5HXSA9IEtFWV8xLAoJW0tFWV9TWU1fVFdPXSA9IEtFWV8yLCAgICAgICAgICAgICAgW0tFWV9TWU1fQVRdID0gS0VZXzIsCglbS0VZX1NZTV9USFJFRV0gPSBLRVlfMywgICAgICAgICAgICBbS0VZX1NZTV9QT1VORF0gPSBLRVlfMywKCVtLRVlfU1lNX0ZPVVJdID0gS0VZXzQsICAgICAgICAgICAgIFtLRVlfU1lNX0RPTExBUl0gPSBLRVlfNCwKCVtLRVlfU1lNX0ZJVkVdID0gS0VZXzUsICAgICAgICAgICAgIFtLRVlfU1lNX1BFUkNFTlRdID0gS0VZXzUsCglbS0VZX1NZTV9TSVhdID0gS0VZXzYsICAgICAgICAgICAgICBbS0VZX1NZTV9DQVJBVF0gPSBLRVlfNiwKCVtLRVlfU1lNX1NFVkVOXSA9IEtFWV83LCAgICAgICAgICAgIFtLRVlfU1lNX0FNUEVSXSA9IEtFWV83LAoJW0tFWV9TWU1fRUlHSFRdID0gS0VZXzgsICAgICAgICAgICAgW0tFWV9TWU1fU1RBUl0gPSBLRVlfOCwKCVtLRVlfU1lNX05JTkVdID0gS0VZXzksICAgICAgICAgICAgIFtLRVlfU1lNX0xQQVJFTl0gPSBLRVlfOSwKCVtLRVlfU1lNX1pFUk9dID0gS0VZXzAsICAgICAgICAgICAgIFtLRVlfU1lNX1JQQVJFTl0gPSBLRVlfMCwKCVtLRVlfU1lNX01JTlVTXSA9IEtFWV9NSU5VUywgICAgICAgIFtLRVlfU1lNX1VTQ09SRV0gPSBLRVlfTUlOVVMsCglbS0VZX1NZTV9FUVVBTF0gPSBLRVlfRVFVQUwsICAgICAgICBbS0VZX1NZTV9QTFVTXSA9IEtFWV9FUVVBTCwKCVtLRVlfU1lNX0xCUktUXSA9IEtFWV9MRUZUQlJBQ0UsICAgIFtLRVlfU1lNX0xDVVJMWV0gPSBLRVlfTEVGVEJSQUNFLAoJW0tFWV9TWU1fUkJSS1RdID0gS0VZX1JJR0hUQlJBQ0UsICAgW0tFWV9TWU1fUkNVUkxZXSA9IEtFWV9SSUdIVEJSQUNFLAoJW0tFWV9TWU1fU0xBU0hdID0gS0VZX0JBQ0tTTEFTSCwgICAgW0tFWV9TWU1fUElQRV0gPSBLRVlfQkFDS1NMQVNILAoJW0tFWV9TWU1fVElDXSA9IEtFWV9BUE9TVFJPUEhFLCAgICAgW0tFWV9TWU1fUVVPVEVdID0gS0VZX0FQT1NUUk9QSEUsCglbS0VZX1NZTV9TRU1JQ10gPSBLRVlfU0VNSUNPTE9OLCAgICBbS0VZX1NZTV9DT0xPTl0gPSBLRVlfU0VNSUNPTE9OLAoJW0tFWV9TWU1fQ09NTUFdID0gS0VZX0NPTU1BLCAgICAgICAgW0tFWV9TWU1fTFRdID0gS0VZX0NPTU1BLAoJW0tFWV9TWU1fUEVSSU9EXSA9IEtFWV9ET1QsICAgICAgICAgW0tFWV9TWU1fR1RdID0gS0VZX0RPVCwKCVtLRVlfU1lNX0JTTEFTSF0gPSBLRVlfU0xBU0gsICAgICAgIFtLRVlfU1lNX1FNQVJLXSA9IEtFWV9TTEFTSCwKCVtLRVlfU1lNX0FdID0gS0VZX0EsICAgICAgICAgICAgICAgIFtLRVlfU1lNX2FdID0gS0VZX0EsCglbS0VZX1NZTV9CXSA9IEtFWV9CLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9iXSA9IEtFWV9CLAoJW0tFWV9TWU1fQ10gPSBLRVlfQywgICAgICAgICAgICAgICAgW0tFWV9TWU1fY10gPSBLRVlfQywKCVtLRVlfU1lNX0RdID0gS0VZX0QsICAgICAgICAgICAgICAgIFtLRVlfU1lNX2RdID0gS0VZX0QsCglbS0VZX1NZTV9FXSA9IEtFWV9FLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9lXSA9IEtFWV9FLAoJW0tFWV9TWU1fRl0gPSBLRVlfRiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fZl0gPSBLRVlfRiwKCVtLRVlfU1lNX0ddID0gS0VZX0csICAgICAgICAgICAgICAgIFtLRVlfU1lNX2ddID0gS0VZX0csCglbS0VZX1NZTV9IXSA9IEtFWV9ILCAgICAgICAgICAgICAgICBbS0VZX1NZTV9oXSA9IEtFWV9ILAoJW0tFWV9TWU1fSV0gPSBLRVlfSSwgICAgICAgICAgICAgICAgW0tFWV9TWU1faV0gPSBLRVlfSSwKCVtLRVlfU1lNX0pdID0gS0VZX0osICAgICAgICAgICAgICAgIFtLRVlfU1lNX2pdID0gS0VZX0osCglbS0VZX1NZTV9LXSA9IEtFWV9LLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9rXSA9IEtFWV9LLAoJW0tFWV9TWU1fTF0gPSBLRVlfTCwgICAgICAgICAgICAgICAgW0tFWV9TWU1fbF0gPSBLRVlfTCwKCVtLRVlfU1lNX01dID0gS0VZX00sICAgICAgICAgICAgICAgIFtLRVlfU1lNX21dID0gS0VZX00sCglbS0VZX1NZTV9OXSA9IEtFWV9OLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9uXSA9IEtFWV9OLAoJW0tFWV9TWU1fT10gPSBLRVlfTywgICAgICAgICAgICAgICAgW0tFWV9TWU1fb10gPSBLRVlfTywKCVtLRVlfU1lNX1BdID0gS0VZX1AsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3BdID0gS0VZX1AsCglbS0VZX1NZTV9RXSA9IEtFWV9RLCAgICAgICAgICAgICAgICBbS0VZX1NZTV9xXSA9IEtFWV9RLAoJW0tFWV9TWU1fUl0gPSBLRVlfUiwgICAgICAgICAgICAgICAgW0tFWV9TWU1fcl0gPSBLRVlfUiwKCVtLRVlfU1lNX1NdID0gS0VZX1MsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3NdID0gS0VZX1MsCglbS0VZX1NZTV9UXSA9IEtFWV9ULCAgICAgICAgICAgICAgICBbS0VZX1NZTV90XSA9IEtFWV9ULAoJW0tFWV9TWU1fVV0gPSBLRVlfVSwgICAgICAgICAgICAgICAgW0tFWV9TWU1fdV0gPSBLRVlfVSwKCVtLRVlfU1lNX1ZdID0gS0VZX1YsICAgICAgICAgICAgICAgIFtLRVlfU1lNX3ZdID0gS0VZX1YsCglbS0VZX1NZTV9XXSA9IEtFWV9XLCAgICAgICAgICAgICAgICBbS0VZX1NZTV93XSA9IEtFWV9XLAoJW0tFWV9TWU1fWF0gPSBLRVlfWCwgICAgICAgICAgICAgICAgW0tFWV9TWU1feF0gPSBLRVlfWCwKCVtLRVlfU1lNX1ldID0gS0VZX1ksICAgICAgICAgICAgICAgIFtLRVlfU1lNX3ldID0gS0VZX1ksCglbS0VZX1NZTV9aXSA9IEtFWV9aLCAgICAgICAgICAgICAgICBbS0VZX1NZTV96XSA9IEtFWV9aLAp9OwoKc3RhdGljIHZvaWQgcHJpbnRfaW5wdXQoc3RydWN0IHJlbW90ZV9pbnB1dCAqaW5wdXQpCnsKCWlmIChpbnB1dC0+dHlwZSA9PSBJTlBVVF9UWVBFX01PVVNFKSB7CgkJdW5zaWduZWQgY2hhciBidXR0b25zID0gaW5wdXQtPm1vdXNlX2J1dHRvbnM7CgkJZGJnKCJyZW1vdGUgbW91c2UgbW92ZW1lbnQ6ICh4LHkpPSglZCwlZCklcyVzJXMlc1xuIiwKCQkJaW5wdXQtPmRhdGEubW91c2UueCwgaW5wdXQtPmRhdGEubW91c2UueSwKCQkJKGJ1dHRvbnMpID8gIiAtLSBidXR0b25zOiIgOiAiIiwKCQkJKGJ1dHRvbnMgJiBSRU1PVEVfQlVUVE9OX0xFRlQpID8gImxlZnQgIiA6ICIiLAoJCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fTUlERExFKSA/ICJtaWRkbGUgIiA6ICIiLAoJCQkoYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fUklHSFQpID8gInJpZ2h0IiA6ICIiCgkJICAgICAgKTsKCX0gZWxzZSB7CgkJZGJnKCJyZW1vdGUga2V5cHJlc3MgKGNvZGUsIGZsYWcsIGRvd24pOiIKCQkJICAgIiVkICgweCV4KSBbMHgleF0gWzB4JXhdXG4iLAoJCQkJaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2NvZGUsCgkJCQlpbnB1dC0+ZGF0YS5rZXlib2FyZC5rZXlfY29kZSwKCQkJCWlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9mbGFnLAoJCQkJaW5wdXQtPmRhdGEua2V5Ym9hcmQua2V5X2Rvd24KCQkgICAgICApOwoJfQp9CgpzdGF0aWMgdm9pZCBzZW5kX21vdXNlX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgc3RydWN0IHJlbW90ZV9pbnB1dCAqaW5wdXQpCnsKCXVuc2lnbmVkIGNoYXIgYnV0dG9ucyA9IGlucHV0LT5tb3VzZV9idXR0b25zOwoKCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgaW5wdXQtPmRhdGEubW91c2UueCk7CglpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGlucHV0LT5kYXRhLm1vdXNlLnkpOwoJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCBidXR0b25zICYgUkVNT1RFX0JVVFRPTl9MRUZUKTsKCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBidXR0b25zICYgUkVNT1RFX0JVVFRPTl9NSURETEUpOwoJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgYnV0dG9ucyAmIFJFTU9URV9CVVRUT05fUklHSFQpOwoJaW5wdXRfc3luYyhkZXYpOwp9CgpzdGF0aWMgdm9pZCBzZW5kX2tleWJvYXJkX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKCQlzdHJ1Y3QgcmVtb3RlX2lucHV0ICppbnB1dCkKewoJdW5zaWduZWQgaW50IGtleTsKCXVuc2lnbmVkIHNob3J0IGNvZGUgPSBpbnB1dC0+ZGF0YS5rZXlib2FyZC5rZXlfY29kZTsKCglpZiAoY29kZSAmIDB4ZmYwMCkKCQlrZXkgPSB4bGF0ZV9oaWdoW2NvZGUgJiAweGZmXTsKCWVsc2UKCQlrZXkgPSB4bGF0ZVtjb2RlXTsKCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBrZXksIGlucHV0LT5kYXRhLmtleWJvYXJkLmtleV9kb3duKTsKCWlucHV0X3N5bmMoZGV2KTsKfQoKdm9pZCBpYm1hc21faGFuZGxlX21vdXNlX2ludGVycnVwdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQp7Cgl1bnNpZ25lZCBsb25nIHJlYWRlcjsKCXVuc2lnbmVkIGxvbmcgd3JpdGVyOwoJc3RydWN0IHJlbW90ZV9pbnB1dCBpbnB1dDsKCglyZWFkZXIgPSBnZXRfcXVldWVfcmVhZGVyKHNwKTsKCXdyaXRlciA9IGdldF9xdWV1ZV93cml0ZXIoc3ApOwoKCXdoaWxlIChyZWFkZXIgIT0gd3JpdGVyKSB7CgkJbWVtY3B5X2Zyb21pbygmaW5wdXQsIGdldF9xdWV1ZV9lbnRyeShzcCwgcmVhZGVyKSwKCQkJCXNpemVvZihzdHJ1Y3QgcmVtb3RlX2lucHV0KSk7CgoJCXByaW50X2lucHV0KCZpbnB1dCk7CgkJaWYgKGlucHV0LnR5cGUgPT0gSU5QVVRfVFlQRV9NT1VTRSkgewoJCQlzZW5kX21vdXNlX2V2ZW50KHNwLT5yZW1vdGUubW91c2VfZGV2LCAmaW5wdXQpOwoJCX0gZWxzZSBpZiAoaW5wdXQudHlwZSA9PSBJTlBVVF9UWVBFX0tFWUJPQVJEKSB7CgkJCXNlbmRfa2V5Ym9hcmRfZXZlbnQoc3AtPnJlbW90ZS5rZXliZF9kZXYsICZpbnB1dCk7CgkJfSBlbHNlCgkJCWJyZWFrOwoKCQlyZWFkZXIgPSBhZHZhbmNlX3F1ZXVlX3JlYWRlcihzcCwgcmVhZGVyKTsKCQl3cml0ZXIgPSBnZXRfcXVldWVfd3JpdGVyKHNwKTsKCX0KfQoKaW50IGlibWFzbV9pbml0X3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKewoJLyogc2V0IHVwIHRoZSBtb3VzZSBpbnB1dCBkZXZpY2UgKi8KCXN0cnVjdCBpbnB1dF9kZXYgKm1vdXNlX2RldiwgKmtleWJkX2RldjsKCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihzcC0+ZGV2KTsKCWludCBlcnJvciA9IC1FTk9NRU07CglpbnQgaTsKCglzcC0+cmVtb3RlLm1vdXNlX2RldiA9IG1vdXNlX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwoJc3AtPnJlbW90ZS5rZXliZF9kZXYgPSBrZXliZF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKCglpZiAoIW1vdXNlX2RldiB8fCAha2V5YmRfZGV2KQoJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlczsKCgltb3VzZV9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOwoJbW91c2VfZGV2LT5pZC52ZW5kb3IgPSBwZGV2LT52ZW5kb3I7Cgltb3VzZV9kZXYtPmlkLnByb2R1Y3QgPSBwZGV2LT5kZXZpY2U7Cgltb3VzZV9kZXYtPmlkLnZlcnNpb24gPSAxOwoJbW91c2VfZGV2LT5kZXYucGFyZW50ID0gc3AtPmRldjsKCW1vdXNlX2Rldi0+ZXZiaXRbMF0gID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfQUJTKTsKCW1vdXNlX2Rldi0+a2V5Yml0W0xPTkcoQlROX01PVVNFKV0gPSBCSVQoQlROX0xFRlQpIHwKCQlCSVQoQlROX1JJR0hUKSB8IEJJVChCVE5fTUlERExFKTsKCXNldF9iaXQoQlROX1RPVUNILCBtb3VzZV9kZXYtPmtleWJpdCk7Cgltb3VzZV9kZXYtPm5hbWUgPSAiaWJtYXNtIFJTQSBJIHJlbW90ZSBtb3VzZSI7CglpbnB1dF9zZXRfYWJzX3BhcmFtcyhtb3VzZV9kZXYsIEFCU19YLCAwLCBNT1VTRV9YX01BWCwgMCwgMCk7CglpbnB1dF9zZXRfYWJzX3BhcmFtcyhtb3VzZV9kZXYsIEFCU19ZLCAwLCBNT1VTRV9ZX01BWCwgMCwgMCk7CgoJa2V5YmRfZGV2LT5pZC5idXN0eXBlID0gQlVTX1BDSTsKCWtleWJkX2Rldi0+aWQudmVuZG9yID0gcGRldi0+dmVuZG9yOwoJa2V5YmRfZGV2LT5pZC5wcm9kdWN0ID0gcGRldi0+ZGV2aWNlOwoJa2V5YmRfZGV2LT5pZC52ZXJzaW9uID0gMjsKCWtleWJkX2Rldi0+ZGV2LnBhcmVudCA9IHNwLT5kZXY7CglrZXliZF9kZXYtPmV2Yml0WzBdICA9IEJJVChFVl9LRVkpOwoJa2V5YmRfZGV2LT5uYW1lID0gImlibWFzbSBSU0EgSSByZW1vdGUga2V5Ym9hcmQiOwoKCWZvciAoaSA9IDA7IGkgPCBYTEFURV9TSVpFOyBpKyspIHsKCQlpZiAoeGxhdGVfaGlnaFtpXSkKCQkJc2V0X2JpdCh4bGF0ZV9oaWdoW2ldLCBrZXliZF9kZXYtPmtleWJpdCk7CgkJaWYgKHhsYXRlW2ldKQoJCQlzZXRfYml0KHhsYXRlW2ldLCBrZXliZF9kZXYtPmtleWJpdCk7Cgl9CgoJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UobW91c2VfZGV2KTsKCWlmIChlcnJvcikKCQlnb3RvIGVycl9mcmVlX2RldmljZXM7CgoJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2V5YmRfZGV2KTsKCWlmIChlcnJvcikKCQlnb3RvIGVycl91bnJlZ2lzdGVyX21vdXNlX2RldjsKCgllbmFibGVfbW91c2VfaW50ZXJydXB0cyhzcCk7CgoJcHJpbnRrKEtFUk5fSU5GTyAiaWJtYXNtIHJlbW90ZSByZXNwb25kaW5nIHRvIGV2ZW50cyBvbiBSU0EgY2FyZCAlZFxuIiwgc3AtPm51bWJlcik7CgoJcmV0dXJuIDA7CgogZXJyX3VucmVnaXN0ZXJfbW91c2VfZGV2OgoJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UobW91c2VfZGV2KTsKCW1vdXNlX2RldiA9IE5VTEw7IC8qIHNvIHdlIGRvbid0IHRyeSB0byBmcmVlIGl0IGFnYWluIGJlbG93ICovCiBlcnJfZnJlZV9kZXZpY2VzOgoJaW5wdXRfZnJlZV9kZXZpY2UobW91c2VfZGV2KTsKCWlucHV0X2ZyZWVfZGV2aWNlKGtleWJkX2Rldik7CgoJcmV0dXJuIGVycm9yOwp9Cgp2b2lkIGlibWFzbV9mcmVlX3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCkKewoJZGlzYWJsZV9tb3VzZV9pbnRlcnJ1cHRzKHNwKTsKCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNwLT5yZW1vdGUubW91c2VfZGV2KTsKCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHNwLT5yZW1vdGUua2V5YmRfZGV2KTsKfQoK