From mboxrd@z Thu Jan 1 00:00:00 1970 From: Felix Kuehling Subject: [PATCH 7/8] lib: Closed hash table with low overhead Date: Tue, 29 Aug 2017 18:25:23 -0400 Message-ID: <1504045524-23853-8-git-send-email-Felix.Kuehling@amd.com> References: <1504045524-23853-1-git-send-email-Felix.Kuehling@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1504045524-23853-1-git-send-email-Felix.Kuehling-5C7GfCeVMHo@public.gmane.org> List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: Felix Kuehling VGhpcyBhZGRzIGEgc3RhdGljYWxseSBzaXplZCBjbG9zZWQgaGFzaCB0YWJsZSBpbXBsZW1lbnRh dGlvbiB3aXRoCmxvdyBtZW1vcnkgYW5kIENQVSBvdmVyaGVhZC4gVGhlIEFQSSBpcyBpbnNwaXJl ZCBieSBrZmlmby4KClN0b3JpbmcsIHJldHJpZXZpbmcgYW5kIGRlbGV0aW5nIGRhdGEgZG9lcyBu b3QgaW52b2x2ZSBhbnkgZHluYW1pYwptZW1vcnkgbWFuYWdlbWVudCwgd2hpY2ggbWFrZXMgaXQg aWRlYWwgZm9yIHVzZSBpbiBpbnRlcnJ1cHQgY29udGV4dC4KU3RhdGljIG1lbW9yeSB1c2FnZSBw ZXIgZW50cnkgY29tcHJpc2VzIGEgMzIgb3IgNjQgYml0IGhhc2gga2V5LCB0d28KYml0cyBmb3Ig b2NjdXBhbmN5IHRyYWNraW5nIGFuZCB0aGUgdmFsdWUgc2l6ZSBzdG9yZWQgaW4gdGhlIHRhYmxl LgpObyBsaXN0IGhlYWRzIG9yIHBvaW50ZXJzIGFyZSBuZWVkZWQuIFRoZXJlZm9yZSB0aGlzIGRh dGEgc3RydWN0dXJlCnNob3VsZCBiZSBxdWl0ZSBjYWNoZS1mcmllbmRseSwgdG9vLgoKSXQgdXNl cyBsaW5lYXIgcHJvYmluZyBhbmQgbGF6eSBkZWxldGlvbi4gRHVyaW5nIGxvb2t1cHMgZnJlZSBz cGFjZQppcyByZWNsYWltZWQgYW5kIGVudHJpZXMgcmVsb2NhdGVkIHRvIHNwZWVkIHVwIGZ1dHVy ZSBsb29rdXBzLgoKU2lnbmVkLW9mZi1ieTogRmVsaXggS3VlaGxpbmcgPEZlbGl4Lkt1ZWhsaW5n QGFtZC5jb20+CkFja2VkLWJ5OiBDaHJpc3RpYW4gS8O2bmlnIDxjaHJpc3RpYW4ua29lbmlnQGFt ZC5jb20+Ci0tLQogaW5jbHVkZS9saW51eC9jaGFzaC5oIHwgMzU4ICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrCiBsaWIvS2NvbmZpZyAgICAgICAgICAgfCAgMjQgKysKIGxpYi9NYWtlZmls ZSAgICAgICAgICB8ICAgMiArCiBsaWIvY2hhc2guYyAgICAgICAgICAgfCA2MjIgKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdl ZCwgMTAwNiBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9saW51eC9j aGFzaC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgbGliL2NoYXNoLmMKCmRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L2NoYXNoLmggYi9pbmNsdWRlL2xpbnV4L2NoYXNoLmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5YjkyYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUv bGludXgvY2hhc2guaApAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IEFk dmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAor ICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJz b25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmln aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGlu CisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4K KyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5U WSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1Qg TElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZF TlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFC TEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVS IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5H IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBV U0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lm bmRlZiBfTElOVVhfQ0hBU0hfSAorI2RlZmluZSBfTElOVVhfQ0hBU0hfSAorCisjaW5jbHVkZSA8 bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgv YnVnLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKK3N0cnVjdCBfX2NoYXNoX3RhYmxl IHsKKwl1OCBiaXRzOworCXU4IGtleV9zaXplOworCXVuc2lnbmVkIGludCB2YWx1ZV9zaXplOwor CXUzMiBzaXplX21hc2s7CisJdW5zaWduZWQgbG9uZyAqb2NjdXBfYml0bWFwLCAqdmFsaWRfYml0 bWFwOworCXVuaW9uIHsKKwkJdTMyICprZXlzMzI7CisJCXU2NCAqa2V5czY0OworCX07CisJdTgg KnZhbHVlczsKKworI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUworCXU2NCBoaXRzLCBoaXRzX3N0 ZXBzLCBoaXRzX3RpbWVfbnM7CisJdTY0IG1pc3MsIG1pc3Nfc3RlcHMsIG1pc3NfdGltZV9uczsK Kwl1NjQgcmVsb2NzLCByZWxvY19kaXN0OworI2VuZGlmCit9OworCisjZGVmaW5lIF9fQ0hBU0hf QklUTUFQX1NJWkUoYml0cykJCQkJXAorCSgoKDEgPDwgKGJpdHMpKSArIEJJVFNfUEVSX0xPTkcg LSAxKSAvIEJJVFNfUEVSX0xPTkcpCisjZGVmaW5lIF9fQ0hBU0hfQVJSQVlfU0laRShiaXRzLCBz aXplKQkJCQlcCisJKCgoKHNpemUpIDw8IChiaXRzKSkgKyBzaXplb2YobG9uZykgLSAxKSAvIHNp emVvZihsb25nKSkKKworI2RlZmluZSBfX0NIQVNIX0RBVEFfU0laRShiaXRzLCBrZXlfc2l6ZSwg dmFsdWVfc2l6ZSkJXAorCShfX0NIQVNIX0JJVE1BUF9TSVpFKGJpdHMpICogMiArCQlcCisJIF9f Q0hBU0hfQVJSQVlfU0laRShiaXRzLCBrZXlfc2l6ZSkgKwkJXAorCSBfX0NIQVNIX0FSUkFZX1NJ WkUoYml0cywgdmFsdWVfc2l6ZSkpCisKKyNkZWZpbmUgU1RSVUNUX0NIQVNIX1RBQkxFKGJpdHMs IGtleV9zaXplLCB2YWx1ZV9zaXplKQkJCVwKKwlzdHJ1Y3QgewkJCQkJCQlcCisJCXN0cnVjdCBf X2NoYXNoX3RhYmxlIHRhYmxlOwkJCQlcCisJCXVuc2lnbmVkIGxvbmcgZGF0YQkJCQkJXAorCQkJ W19fQ0hBU0hfREFUQV9TSVpFKGJpdHMsIGtleV9zaXplLCB2YWx1ZV9zaXplKV07XAorCX0KKwor LyoqCisgKiBzdHJ1Y3QgY2hhc2hfdGFibGUgLSBEeW5hbWljYWxseSBhbGxvY2F0ZWQgY2xvc2Vk IGhhc2ggdGFibGUKKyAqCisgKiBVc2UgdGhpcyBzdHJ1Y3QgZm9yIGR5bmFtaWNhbGx5IGFsbG9j YXRlZCBoYXNoIHRhYmxlcyAodXNpbmcKKyAqIGNoYXNoX3RhYmxlX2FsbG9jIGFuZCBjaGFzaF90 YWJsZV9mcmVlKSwgd2hlcmUgdGhlIHNpemUgaXMKKyAqIGRldGVybWluZWQgYXQgcnVudGltZS4K KyAqLworc3RydWN0IGNoYXNoX3RhYmxlIHsKKwlzdHJ1Y3QgX19jaGFzaF90YWJsZSB0YWJsZTsK Kwl1bnNpZ25lZCBsb25nICpkYXRhOworfTsKKworLyoqCisgKiBERUNMQVJFX0NIQVNIX1RBQkxF IC0gbWFjcm8gdG8gZGVjbGFyZSBhIGNsb3NlZCBoYXNoIHRhYmxlCisgKiBAdGFibGU6IG5hbWUg b2YgdGhlIGRlY2xhcmVkIGhhc2ggdGFibGUKKyAqIEBidHM6IFRhYmxlIHNpemUgd2lsbCBiZSAy XmJpdHMgZW50cmllcworICogQGtleV9zejogU2l6ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQg b3IgOAorICogQHZhbF9zejogU2l6ZSBvZiBkYXRhIHZhbHVlcyBpbiBieXRlcywgY2FuIGJlIDAK KyAqCisgKiBUaGlzIGRlY2xhcmVzIHRoZSBoYXNoIHRhYmxlIHZhcmlhYmxlIHdpdGggYSBzdGF0 aWMgc2l6ZS4KKyAqCisgKiBUaGUgY2xvc2VkIGhhc2ggdGFibGUgc3RvcmVzIGtleS12YWx1ZSBw YWlycyB3aXRoIGxvdyBtZW1vcnkgYW5kCisgKiBsb29rdXAgb3ZlcmhlYWQuIEluIG9wZXJhdGlv biBpdCBwZXJmb3JtcyBubyBkeW5hbWljIG1lbW9yeQorICogbWFuYWdlbWVudC4gVGhlIGRhdGEg YmVpbmcgc3RvcmVkIGRvZXMgbm90IHJlcXVpcmUgYW55CisgKiBsaXN0X2hlYWRzLiBUaGUgaGFz aCB0YWJsZSBwZXJmb3JtcyBiZXN0IHdpdGggc21hbGwgQHZhbF9zeiBhbmQgYXMKKyAqIGxvbmcg YXMgc29tZSBzcGFjZSAoYWJvdXQgNTAlKSBpcyBsZWZ0IGZyZWUgaW4gdGhlIHRhYmxlLiBCdXQg dGhlCisgKiB0YWJsZSBjYW4gc3RpbGwgd29yayByZWFzb25hYmx5IGVmZmljaWVudGx5IGV2ZW4g d2hlbiBmaWxsZWQgdXAgdG8KKyAqIGFib3V0IDkwJS4gSWYgYmlnZ2VyIGRhdGEgaXRlbXMgbmVl ZCB0byBiZSBzdG9yZWQgYW5kIGxvb2tlZCB1cCwKKyAqIHN0b3JlIHRoZSBwb2ludGVyIHRvIGl0 IGFzIHZhbHVlIGluIHRoZSBoYXNoIHRhYmxlLgorICoKKyAqIEB2YWxfc3ogbWF5IGJlIDAuIFRo aXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGFsbCB0aGUgc3RvcmVkCisgKiBpbmZvcm1hdGlvbiBpcyBj b250YWluZWQgaW4gdGhlIGtleSBpdHNlbGYgYW5kIHRoZSBmYWN0IHRoYXQgaXQgaXMKKyAqIGlu IHRoZSBoYXNoIHRhYmxlIChvciBub3QpLgorICovCisjZGVmaW5lIERFQ0xBUkVfQ0hBU0hfVEFC TEUodGFibGUsIGJ0cywga2V5X3N6LCB2YWxfc3opCQlcCisJU1RSVUNUX0NIQVNIX1RBQkxFKGJ0 cywga2V5X3N6LCB2YWxfc3opIHRhYmxlCisKKyNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKKyNk ZWZpbmUgX19DSEFTSF9TVEFUU19JTklUKHByZWZpeCksCQlcCisJCXByZWZpeC5oaXRzID0gMCwJ CVwKKwkJcHJlZml4LmhpdHNfc3RlcHMgPSAwLAkJXAorCQlwcmVmaXguaGl0c190aW1lX25zID0g MCwJXAorCQlwcmVmaXgubWlzcyA9IDAsCQlcCisJCXByZWZpeC5taXNzX3N0ZXBzID0gMCwJCVwK KwkJcHJlZml4Lm1pc3NfdGltZV9ucyA9IDAsCVwKKwkJcHJlZml4LnJlbG9jcyA9IDAsCQlcCisJ CXByZWZpeC5yZWxvY19kaXN0ID0gMAorI2Vsc2UKKyNkZWZpbmUgX19DSEFTSF9TVEFUU19JTklU KHByZWZpeCkKKyNlbmRpZgorCisjZGVmaW5lIF9fQ0hBU0hfVEFCTEVfSU5JVChwcmVmaXgsIGRh dGEsIGJ0cywga2V5X3N6LCB2YWxfc3opCVwKKwlwcmVmaXguYml0cyA9IChidHMpLAkJCQkJXAor CQlwcmVmaXgua2V5X3NpemUgPSAoa2V5X3N6KSwJCQlcCisJCXByZWZpeC52YWx1ZV9zaXplID0g KHZhbF9zeiksCQkJXAorCQlwcmVmaXguc2l6ZV9tYXNrID0gKCgxIDw8IGJ0cykgLSAxKSwJCVwK KwkJcHJlZml4Lm9jY3VwX2JpdG1hcCA9ICZkYXRhWzBdLAkJCVwKKwkJcHJlZml4LnZhbGlkX2Jp dG1hcCA9ICZkYXRhCQkJXAorCQkJW19fQ0hBU0hfQklUTUFQX1NJWkUoYnRzKV0sCQlcCisJCXBy ZWZpeC5rZXlzNjQgPSAodTY0ICopJmRhdGEJCQlcCisJCQlbX19DSEFTSF9CSVRNQVBfU0laRShi dHMpICogMl0sCQlcCisJCXByZWZpeC52YWx1ZXMgPSAodTggKikmZGF0YQkJCVwKKwkJCVtfX0NI QVNIX0JJVE1BUF9TSVpFKGJ0cykgKiAyICsJCVwKKwkJCSBfX0NIQVNIX0FSUkFZX1NJWkUoYnRz LCBrZXlfc3opXQlcCisJCV9fQ0hBU0hfU1RBVFNfSU5JVChwcmVmaXgpCisKKy8qKgorICogREVG SU5FX0NIQVNIX1RBQkxFIC0gbWFjcm8gdG8gZGVmaW5lIGFuZCBpbml0aWFsaXplIGEgY2xvc2Vk IGhhc2ggdGFibGUKKyAqIEB0Ymw6IG5hbWUgb2YgdGhlIGRlY2xhcmVkIGhhc2ggdGFibGUKKyAq IEBidHM6IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMgZW50cmllcworICogQGtleV9zejogU2l6 ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOAorICogQHZhbF9zejogU2l6ZSBvZiBkYXRh IHZhbHVlcyBpbiBieXRlcywgY2FuIGJlIDAKKyAqCisgKiBOb3RlOiB0aGUgbWFjcm8gY2FuIGJl IHVzZWQgZm9yIGdsb2JhbCBhbmQgbG9jYWwgaGFzaCB0YWJsZSB2YXJpYWJsZXMuCisgKi8KKyNk ZWZpbmUgREVGSU5FX0NIQVNIX1RBQkxFKHRibCwgYnRzLCBrZXlfc3osIHZhbF9zeikJCQlcCisJ REVDTEFSRV9DSEFTSF9UQUJMRSh0YmwsIGJ0cywga2V5X3N6LCB2YWxfc3opID0gewkJXAorCQku dGFibGUgPSB7CQkJCQkJXAorCQkJX19DSEFTSF9UQUJMRV9JTklUKCwgKHRibCkuZGF0YSwgYnRz LCBrZXlfc3osIHZhbF9zeikgXAorCQl9LAkJCQkJCQlcCisJCS5kYXRhID0gezB9CQkJCQkJXAor CX0KKworLyoqCisgKiBJTklUX0NIQVNIX1RBQkxFIC0gSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUg ZGVjbGFyZWQgYnkgREVDTEFSRV9DSEFTSF9UQUJMRQorICogQHRibDogbmFtZSBvZiB0aGUgZGVj bGFyZWQgaGFzaCB0YWJsZQorICogQGJ0czogVGFibGUgc2l6ZSB3aWxsIGJlIDJeYml0cyBlbnRy aWVzCisgKiBAa2V5X3N6OiBTaXplIG9mIGhhc2gga2V5cyBpbiBieXRlcywgNCBvciA4CisgKiBA dmFsX3N6OiBTaXplIG9mIGRhdGEgdmFsdWVzIGluIGJ5dGVzLCBjYW4gYmUgMAorICovCisjZGVm aW5lIElOSVRfQ0hBU0hfVEFCTEUodGJsLCBidHMsIGtleV9zeiwgdmFsX3N6KQkJCVwKKwlfX0NI QVNIX1RBQkxFX0lOSVQoKCh0YmwpLnRhYmxlKSwgKHRibCkuZGF0YSwgYnRzLCBrZXlfc3osIHZh bF9zeikKKworaW50IGNoYXNoX3RhYmxlX2FsbG9jKHN0cnVjdCBjaGFzaF90YWJsZSAqdGFibGUs IHU4IGJpdHMsIHU4IGtleV9zaXplLAorCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZSwg Z2ZwX3QgZ2ZwX21hc2spOwordm9pZCBjaGFzaF90YWJsZV9mcmVlKHN0cnVjdCBjaGFzaF90YWJs ZSAqdGFibGUpOworCisvKioKKyAqIGNoYXNoX3RhYmxlX2R1bXBfc3RhdHMgLSBEdW1wIHN0YXRp c3RpY3Mgb2YgYSBjbG9zZWQgaGFzaCB0YWJsZQorICogQHRibDogUG9pbnRlciB0byB0aGUgdGFi bGUgc3RydWN0dXJlCisgKgorICogRHVtcHMgc29tZSBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIG9m IHRoZSB0YWJsZSBnYXRoZXJlZCBpbiBvcGVyYXRpb24KKyAqIGluIHRoZSBrZXJuZWwgbG9nIHVz aW5nIHByX2RlYnVnLiBJZiBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBlbmFibGVkLAorICogdXNl ciBtdXN0IHR1cm4gb24gbWVzc2FnZXMgZm9yIGNoYXNoLmMgKGZpbGUgY2hhc2guYyArcCkuCisg Ki8KKyNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKKyNkZWZpbmUgY2hhc2hfdGFibGVfZHVtcF9z dGF0cyh0YmwpIF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cygmKCp0YmwpLnRhYmxlKQorCit2b2lk IF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cyhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUpOwor I2Vsc2UKKyNkZWZpbmUgY2hhc2hfdGFibGVfZHVtcF9zdGF0cyh0YmwpCisjZW5kaWYKKworLyoq CisgKiBjaGFzaF90YWJsZV9yZXNldF9zdGF0cyAtIFJlc2V0IHN0YXRpc3RpY3Mgb2YgYSBjbG9z ZWQgaGFzaCB0YWJsZQorICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCisg Ki8KKyNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKKyNkZWZpbmUgY2hhc2hfdGFibGVfcmVzZXRf c3RhdHModGJsKSBfX2NoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKCYoKnRibCkudGFibGUpCisKK3N0 YXRpYyBpbmxpbmUgdm9pZCBfX2NoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKHN0cnVjdCBfX2NoYXNo X3RhYmxlICp0YWJsZSkKK3sKKwkodm9pZCl0YWJsZSBfX0NIQVNIX1NUQVRTX0lOSVQoKCp0YWJs ZSkpOworfQorI2Vsc2UKKyNkZWZpbmUgY2hhc2hfdGFibGVfcmVzZXRfc3RhdHModGJsKQorI2Vu ZGlmCisKKy8qKgorICogY2hhc2hfdGFibGVfY29weV9pbiAtIENvcHkgYSBuZXcgdmFsdWUgaW50 byB0aGUgaGFzaCB0YWJsZQorICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJl CisgKiBAa2V5OiBLZXkgb2YgdGhlIGVudHJ5IHRvIGFkZCBvciB1cGRhdGUKKyAqIEB2YWx1ZTog UG9pbnRlciB0byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUgTlVMTAorICoKKyAqIElmIEBrZXkgYWxy ZWFkeSBoYXMgYW4gZW50cnksIGl0cyB2YWx1ZSBpcyByZXBsYWNlZC4gT3RoZXJ3aXNlIGEKKyAq IG5ldyBlbnRyeSBpcyBhZGRlZC4gSWYgQHZhbHVlIGlzIE5VTEwsIHRoZSB2YWx1ZSBpcyBsZWZ0 IHVuY2hhbmdlZAorICogb3IgdW5pbml0aWFsaXplZC4gUmV0dXJucyAxIGlmIGFuIGVudHJ5IGFs cmVhZHkgZXhpc3RlZCwgMCBpZiBhIG5ldworICogZW50cnkgd2FzIGFkZGVkIG9yICUtRU5PTUVN IGlmIHRoZXJlIHdhcyBubyBmcmVlIHNwYWNlIGluIHRoZQorICogdGFibGUuCisgKi8KKyNkZWZp bmUgY2hhc2hfdGFibGVfY29weV9pbih0YmwsIGtleSwgdmFsdWUpCQkJXAorCV9fY2hhc2hfdGFi bGVfY29weV9pbigmKCp0YmwpLnRhYmxlLCBrZXksIHZhbHVlKQorCitpbnQgX19jaGFzaF90YWJs ZV9jb3B5X2luKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0IGtleSwKKwkJCSAgY29u c3Qgdm9pZCAqdmFsdWUpOworCisvKioKKyAqIGNoYXNoX3RhYmxlX2NvcHlfb3V0IC0gQ29weSBh IHZhbHVlIG91dCBvZiB0aGUgaGFzaCB0YWJsZQorICogQHRibDogUG9pbnRlciB0byB0aGUgdGFi bGUgc3RydWN0dXJlCisgKiBAa2V5OiBLZXkgb2YgdGhlIGVudHJ5IHRvIGZpbmQKKyAqIEB2YWx1 ZTogUG9pbnRlciB0byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUgTlVMTAorICoKKyAqIElmIEB2YWx1 ZSBpcyBub3QgTlVMTCBhbmQgdGhlIHRhYmxlIGhhcyBhIG5vbi0wIHZhbHVlX3NpemUsIHRoZQor ICogdmFsdWUgYXQgQGtleSBpcyBjb3BpZWQgdG8gQHZhbHVlLiBSZXR1cm5zIHRoZSBzbG90IGlu ZGV4IG9mIHRoZQorICogZW50cnkgb3IgJS1FSU5WQUwgaWYgQGtleSB3YXMgbm90IGZvdW5kLgor ICovCisjZGVmaW5lIGNoYXNoX3RhYmxlX2NvcHlfb3V0KHRibCwga2V5LCB2YWx1ZSkJCQlcCisJ X19jaGFzaF90YWJsZV9jb3B5X291dCgmKCp0YmwpLnRhYmxlLCBrZXksIHZhbHVlLCBmYWxzZSkK KworaW50IF9fY2hhc2hfdGFibGVfY29weV9vdXQoc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxl LCB1NjQga2V5LAorCQkJICAgdm9pZCAqdmFsdWUsIGJvb2wgcmVtb3ZlKTsKKworLyoqCisgKiBj aGFzaF90YWJsZV9yZW1vdmUgLSBSZW1vdmUgYW4gZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZQor ICogQHRibDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCisgKiBAa2V5OiBLZXkgb2Yg dGhlIGVudHJ5IHRvIGZpbmQKKyAqIEB2YWx1ZTogUG9pbnRlciB0byB2YWx1ZSB0byBjb3B5LCBt YXkgYmUgTlVMTAorICoKKyAqIElmIEB2YWx1ZSBpcyBub3QgTlVMTCBhbmQgdGhlIHRhYmxlIGhh cyBhIG5vbi0wIHZhbHVlX3NpemUsIHRoZQorICogdmFsdWUgYXQgQGtleSBpcyBjb3BpZWQgdG8g QHZhbHVlLiBUaGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZQorICogdGFibGUuIFJldHVybnMg dGhlIHNsb3QgaW5kZXggb2YgdGhlIHJlbW92ZWQgZW50cnkgb3IgJS1FSU5WQUwgaWYKKyAqIEBr ZXkgd2FzIG5vdCBmb3VuZC4KKyAqLworI2RlZmluZSBjaGFzaF90YWJsZV9yZW1vdmUodGJsLCBr ZXksIHZhbHVlKQkJCVwKKwlfX2NoYXNoX3RhYmxlX2NvcHlfb3V0KCYoKnRibCkudGFibGUsIGtl eSwgdmFsdWUsIHRydWUpCisKKy8qCisgKiBMb3cgbGV2ZWwgaXRlcmF0b3IgQVBJIHVzZWQgaW50 ZXJuYWxseSBieSB0aGUgYWJvdmUgZnVuY3Rpb25zLgorICovCitzdHJ1Y3QgY2hhc2hfaXRlciB7 CisJc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlp bnQgc2xvdDsKK307CisKKy8qKgorICogQ0hBU0hfSVRFUl9JTklUIC0gSW5pdGlhbGl6ZSBhIGhh c2ggdGFibGUgaXRlcmF0b3IKKyAqIEB0Ymw6IFBvaW50ZXIgdG8gaGFzaCB0YWJsZSB0byBpdGVy YXRlIG92ZXIKKyAqIEBzOiBJbml0aWFsIHNsb3QgbnVtYmVyCisgKi8KKyNkZWZpbmUgQ0hBU0hf SVRFUl9JTklUKHRhYmxlLCBzKSB7CQkJXAorCQl0YWJsZSwJCQkJCVwKKwkJMVVMIDw8ICgocykg JiAoQklUU19QRVJfTE9ORyAtIDEpKSwJXAorCQlzCQkJCQlcCisJfQorLyoqCisgKiBDSEFTSF9J VEVSX1NFVCAtIFNldCBoYXNoIHRhYmxlIGl0ZXJhdG9yIHRvIG5ldyBzbG90CisgKiBAaXRlcjog SXRlcmF0b3IKKyAqIEBzOiBTbG90IG51bWJlcgorICovCisjZGVmaW5lIENIQVNIX0lURVJfU0VU KGl0ZXIsIHMpCQkJCQlcCisJKGl0ZXIpLm1hc2sgPSAxVUwgPDwgKChzKSAmIChCSVRTX1BFUl9M T05HIC0gMSkpLAlcCisJKGl0ZXIpLnNsb3QgPSAocykKKy8qKgorICogQ0hBU0hfSVRFUl9JTkMg LSBJbmNyZW1lbnQgaGFzaCB0YWJsZSBpdGVyYXRvcgorICogQHRhYmxlOiBIYXNoIHRhYmxlIHRv IGl0ZXJhdGUgb3ZlcgorICoKKyAqIFdyYXBzIGFyb3VuZCBhdCB0aGUgZW5kLgorICovCisjZGVm aW5lIENIQVNIX0lURVJfSU5DKGl0ZXIpIGRvIHsJCQkJCVwKKwkJKGl0ZXIpLm1hc2sgPSAoaXRl cikubWFzayA8PCAxIHwJCQlcCisJCQkoaXRlcikubWFzayA+PiAoQklUU19QRVJfTE9ORyAtIDEp OwkJXAorCQkoaXRlcikuc2xvdCA9ICgoaXRlcikuc2xvdCArIDEpICYgKGl0ZXIpLnRhYmxlLT5z aXplX21hc2s7IFwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIGJvb2wgY2hhc2hfaXRl cl9pc192YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQoreworCUJVR19PTigodW5z aWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsKKwlyZXR1cm4gISEo aXRlci50YWJsZS0+dmFsaWRfYml0bWFwW2l0ZXIuc2xvdCA+PiBfQklUT1BTX0xPTkdfU0hJRlRd ICYKKwkJICBpdGVyLm1hc2spOworfQorc3RhdGljIGlubGluZSBib29sIGNoYXNoX2l0ZXJfaXNf ZW1wdHkoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikKK3sKKwlCVUdfT04oKHVuc2lnbmVk KWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7CisJcmV0dXJuICEoaXRlci50 YWJsZS0+b2NjdXBfYml0bWFwW2l0ZXIuc2xvdCA+PiBfQklUT1BTX0xPTkdfU0hJRlRdICYKKwkJ IGl0ZXIubWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFzaF9pdGVyX3NldF92YWxp ZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQoreworCUJVR19PTigodW5zaWduZWQpaXRl ci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsKKwlpdGVyLnRhYmxlLT52YWxpZF9i aXRtYXBbaXRlci5zbG90ID4+IF9CSVRPUFNfTE9OR19TSElGVF0gfD0gaXRlci5tYXNrOworCWl0 ZXIudGFibGUtPm9jY3VwX2JpdG1hcFtpdGVyLnNsb3QgPj4gX0JJVE9QU19MT05HX1NISUZUXSB8 PSBpdGVyLm1hc2s7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgY2hhc2hfaXRlcl9zZXRfaW52YWxp ZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQoreworCUJVR19PTigodW5zaWduZWQpaXRl ci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsKKwlpdGVyLnRhYmxlLT52YWxpZF9i aXRtYXBbaXRlci5zbG90ID4+IF9CSVRPUFNfTE9OR19TSElGVF0gJj0gfml0ZXIubWFzazsKK30K K3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFzaF9pdGVyX3NldF9lbXB0eShjb25zdCBzdHJ1Y3QgY2hh c2hfaXRlciBpdGVyKQoreworCUJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0 ZXIudGFibGUtPmJpdHMpKTsKKwlpdGVyLnRhYmxlLT5vY2N1cF9iaXRtYXBbaXRlci5zbG90ID4+ IF9CSVRPUFNfTE9OR19TSElGVF0gJj0gfml0ZXIubWFzazsKK30KKworc3RhdGljIGlubGluZSB1 MzIgY2hhc2hfaXRlcl9rZXkzMihjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQoreworCUJV R19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA0KTsKKwlCVUdfT04oKHVuc2lnbmVkKWl0ZXIu c2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7CisJcmV0dXJuIGl0ZXIudGFibGUtPmtl eXMzMltpdGVyLnNsb3RdOworfQorc3RhdGljIGlubGluZSB1NjQgY2hhc2hfaXRlcl9rZXk2NChj b25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQoreworCUJVR19PTihpdGVyLnRhYmxlLT5rZXlf c2l6ZSAhPSA4KTsKKwlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRh YmxlLT5iaXRzKSk7CisJcmV0dXJuIGl0ZXIudGFibGUtPmtleXM2NFtpdGVyLnNsb3RdOworfQor c3RhdGljIGlubGluZSB1NjQgY2hhc2hfaXRlcl9rZXkoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIg aXRlcikKK3sKKwlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxl LT5iaXRzKSk7CisJcmV0dXJuIChpdGVyLnRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/CisJCWl0ZXIu dGFibGUtPmtleXMzMltpdGVyLnNsb3RdIDogaXRlci50YWJsZS0+a2V5czY0W2l0ZXIuc2xvdF07 Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGNoYXNoX2l0ZXJfaGFzaDMyKGNvbnN0IHN0cnVjdCBj aGFzaF9pdGVyIGl0ZXIpCit7CisJQlVHX09OKGl0ZXIudGFibGUtPmtleV9zaXplICE9IDQpOwor CXJldHVybiBoYXNoXzMyKGNoYXNoX2l0ZXJfa2V5MzIoaXRlciksIGl0ZXIudGFibGUtPmJpdHMp OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjaGFzaF9pdGVyX2hhc2g2NChjb25zdCBzdHJ1Y3Qg Y2hhc2hfaXRlciBpdGVyKQoreworCUJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsK KwlyZXR1cm4gaGFzaF82NChjaGFzaF9pdGVyX2tleTY0KGl0ZXIpLCBpdGVyLnRhYmxlLT5iaXRz KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgY2hhc2hfaXRlcl9oYXNoKGNvbnN0IHN0cnVjdCBj aGFzaF9pdGVyIGl0ZXIpCit7CisJcmV0dXJuIChpdGVyLnRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/ CisJCWhhc2hfMzIoY2hhc2hfaXRlcl9rZXkzMihpdGVyKSwgaXRlci50YWJsZS0+Yml0cykgOgor CQloYXNoXzY0KGNoYXNoX2l0ZXJfa2V5NjQoaXRlciksIGl0ZXIudGFibGUtPmJpdHMpOworfQor CitzdGF0aWMgaW5saW5lIHZvaWQgKmNoYXNoX2l0ZXJfdmFsdWUoY29uc3Qgc3RydWN0IGNoYXNo X2l0ZXIgaXRlcikKK3sKKwlCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVy LnRhYmxlLT5iaXRzKSk7CisJcmV0dXJuIGl0ZXIudGFibGUtPnZhbHVlcyArCisJCSgodW5zaWdu ZWQgbG9uZylpdGVyLnNsb3QgKiBpdGVyLnRhYmxlLT52YWx1ZV9zaXplKTsKK30KKworI2VuZGlm IC8qIF9MSU5VWF9DSEFTSF9IICovCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZyBiL2xpYi9LY29u ZmlnCmluZGV4IDY3NjI1MjkuLjllNDkxMjkgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBi L2xpYi9LY29uZmlnCkBAIC01NzUsNCArNTc1LDI4IEBAIGNvbmZpZyBQQVJNQU4KIGNvbmZpZyBQ UklNRV9OVU1CRVJTCiAJdHJpc3RhdGUKIAorIworIyBDbG9zZWQgaGFzaCB0YWJsZQorIworY29u ZmlnIENIQVNICisJdHJpc3RhdGUgIkNsb3NlZCBoYXNoIHRhYmxlIgorCWhlbHAKKwkgU3RhdGlj YWxseSBzaXplZCBjbG9zZWQgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGxvdworCSBt ZW1vcnkgYW5kIENQVSBvdmVyaGVhZC4KKworY29uZmlnIENIQVNIX1NUQVRTCisJYm9vbCAiQ2xv c2VkIGhhc2ggdGFibGUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyIKKwlkZXBlbmRzIG9uIENIQVNI CisJZGVmYXVsdCBuCisJaGVscAorCSBFbmFibGUgY29sbGVjdGlvbiBvZiBwZXJmb3JtYW5jZSBz dGF0aXN0aWNzIGZvciBjbG9zZWQgaGFzaCB0YWJsZXMuCisKK2NvbmZpZyBDSEFTSF9TRUxGVEVT VAorCWJvb2wgIkNsb3NlZCBoYXNoIHRhYmxlIHNlbGYgdGVzdCIKKwlkZXBlbmRzIG9uIENIQVNI CisJZGVmYXVsdCBuCisJaGVscAorCSBSdW5zIGEgc2VsZnRlc3QgZHVyaW5nIG1vZHVsZSBsb2Fk LiBTZXZlcmFsIG1vZHVsZSBwYXJhbWV0ZXJzCisJIGFyZSBhdmFpbGFibGUgdG8gbW9kaWZ5IHRo ZSBiZWhhdmlvdXIgb2YgdGhlIHRlc3QuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2xpYi9NYWtl ZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCA0MGMxODM3Li5jMzMyZWQ5IDEwMDY0NAotLS0gYS9s aWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC0yNDMsMyArMjQzLDUgQEAgVUJTQU5f U0FOSVRJWkVfdWJzYW4ubyA6PSBuCiBvYmotJChDT05GSUdfU0JJVE1BUCkgKz0gc2JpdG1hcC5v CiAKIG9iai0kKENPTkZJR19QQVJNQU4pICs9IHBhcm1hbi5vCisKK29iai0kKENPTkZJR19DSEFT SCkgKz0gY2hhc2gubwpkaWZmIC0tZ2l0IGEvbGliL2NoYXNoLmMgYi9saWIvY2hhc2guYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM0Mjg3Ci0tLSAvZGV2L251bGwKKysr IGIvbGliL2NoYXNoLmMKQEAgLTAsMCArMSw2MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBB ZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkg Z3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNv cHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0 aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3Ry aWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVz ZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwK KyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVy c29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJq ZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBp bgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUu CisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFO VFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9U IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVW RU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElB QkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhF UiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lO RyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUg VVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNp bmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRl IDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgv bW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51 eC9jaGFzaC5oPgorCisvKioKKyAqIGNoYXNoX3RhYmxlX2FsbG9jIC0gQWxsb2NhdGUgY2xvc2Vk IGhhc2ggdGFibGUKKyAqIEB0YWJsZTogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlCisg KiBAYml0czogVGFibGUgc2l6ZSB3aWxsIGJlIDJeYml0cyBlbnRyaWVzCisgKiBAa2V5X3NpemU6 IFNpemUgb2YgaGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgKKyAqIEB2YWx1ZV9zaXplOiBTaXpl IG9mIGRhdGEgdmFsdWVzIGluIGJ5dGVzLCBjYW4gYmUgMAorICovCitpbnQgY2hhc2hfdGFibGVf YWxsb2Moc3RydWN0IGNoYXNoX3RhYmxlICp0YWJsZSwgdTggYml0cywgdTgga2V5X3NpemUsCisJ CSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZV9zaXplLCBnZnBfdCBnZnBfbWFzaykKK3sKKwlpZiAo Yml0cyA+IDMxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChrZXlfc2l6ZSAhPSA0ICYmIGtl eV9zaXplICE9IDgpCisJCXJldHVybiAtRUlOVkFMOworCisJdGFibGUtPmRhdGEgPSBrY2FsbG9j KF9fQ0hBU0hfREFUQV9TSVpFKGJpdHMsIGtleV9zaXplLCB2YWx1ZV9zaXplKSwKKwkJICAgICAg IHNpemVvZihsb25nKSwgZ2ZwX21hc2spOworCWlmICghdGFibGUtPmRhdGEpCisJCXJldHVybiAt RU5PTUVNOworCisJX19DSEFTSF9UQUJMRV9JTklUKHRhYmxlLT50YWJsZSwgdGFibGUtPmRhdGEs CisJCQkgICBiaXRzLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VY UE9SVF9TWU1CT0woY2hhc2hfdGFibGVfYWxsb2MpOworCisvKioKKyAqIGNoYXNoX3RhYmxlX2Zy ZWUgLSBGcmVlIGNsb3NlZCBoYXNoIHRhYmxlCisgKiBAdGFibGU6IFBvaW50ZXIgdG8gdGhlIHRh YmxlIHN0cnVjdHVyZQorICovCit2b2lkIGNoYXNoX3RhYmxlX2ZyZWUoc3RydWN0IGNoYXNoX3Rh YmxlICp0YWJsZSkKK3sKKwlrZnJlZSh0YWJsZS0+ZGF0YSk7Cit9CitFWFBPUlRfU1lNQk9MKGNo YXNoX3RhYmxlX2ZyZWUpOworCisjaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTCisKKyNkZWZpbmUg RElWX0ZSQUMobm9tLCBkZW5vbSwgcXVvdCwgZnJhYywgZnJhY19kaWdpdHMpIGRvIHsJCVwKKwkJ KHF1b3QpID0gKG5vbSkgLyAoZGVub20pOwkJCQlcCisJCShmcmFjKSA9ICgobm9tKSAlIChkZW5v bSkgKiAoZnJhY19kaWdpdHMpICsJCVwKKwkJCSAgKGRlbm9tKSAvIDIpIC8gKGRlbm9tKTsJCQlc CisJfSB3aGlsZSAoMCkKKwordm9pZCBfX2NoYXNoX3RhYmxlX2R1bXBfc3RhdHMoc3RydWN0IF9f Y2hhc2hfdGFibGUgKnRhYmxlKQoreworCXN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIgPSBDSEFTSF9J VEVSX0lOSVQodGFibGUsIDApOworCXUzMiBmaWxsZWQgPSAwLCBlbXB0eSA9IDAsIHRvbWJzdG9u ZXMgPSAwOworCXU2NCBxdW90MSwgcXVvdDI7CisJdTMyIGZyYWMxLCBmcmFjMjsKKworCWRvIHsK KwkJaWYgKGNoYXNoX2l0ZXJfaXNfdmFsaWQoaXRlcikpCisJCQlmaWxsZWQrKzsKKwkJZWxzZSBp ZiAoY2hhc2hfaXRlcl9pc19lbXB0eShpdGVyKSkKKwkJCWVtcHR5Kys7CisJCWVsc2UKKwkJCXRv bWJzdG9uZXMrKzsKKwkJQ0hBU0hfSVRFUl9JTkMoaXRlcik7CisJfSB3aGlsZSAoaXRlci5zbG90 KTsKKworCXByX2RlYnVnKCJjaGFzaDoga2V5IHNpemUgJXUsIHZhbHVlIHNpemUgJXVcbiIsCisJ CSB0YWJsZS0+a2V5X3NpemUsIHRhYmxlLT52YWx1ZV9zaXplKTsKKwlwcl9kZWJ1ZygiICBTbG90 cyB0b3RhbC9maWxsZWQvZW1wdHkvdG9tYnN0b25lczogJXUgLyAldSAvICV1IC8gJXVcbiIsCisJ CSAxIDw8IHRhYmxlLT5iaXRzLCBmaWxsZWQsIGVtcHR5LCB0b21ic3RvbmVzKTsKKwlpZiAodGFi bGUtPmhpdHMgPiAwKSB7CisJCURJVl9GUkFDKHRhYmxlLT5oaXRzX3N0ZXBzLCB0YWJsZS0+aGl0 cywgcXVvdDEsIGZyYWMxLCAxMDAwKTsKKwkJRElWX0ZSQUModGFibGUtPmhpdHMgKiAxMDAwLCB0 YWJsZS0+aGl0c190aW1lX25zLAorCQkJIHF1b3QyLCBmcmFjMiwgMTAwMCk7CisJfSBlbHNlIHsK KwkJcXVvdDEgPSBxdW90MiA9IDA7CisJCWZyYWMxID0gZnJhYzIgPSAwOworCX0KKwlwcl9kZWJ1 ZygiICBIaXRzICAgKGF2Zy5jb3N0LCByYXRlKTogJWxsdSAoJWxsdS4lMDN1LCAlbGx1LiUwM3Ug TS9zKVxuIiwKKwkJIHRhYmxlLT5oaXRzLCBxdW90MSwgZnJhYzEsIHF1b3QyLCBmcmFjMik7CisJ aWYgKHRhYmxlLT5taXNzID4gMCkgeworCQlESVZfRlJBQyh0YWJsZS0+bWlzc19zdGVwcywgdGFi bGUtPm1pc3MsIHF1b3QxLCBmcmFjMSwgMTAwMCk7CisJCURJVl9GUkFDKHRhYmxlLT5taXNzICog MTAwMCwgdGFibGUtPm1pc3NfdGltZV9ucywKKwkJCSBxdW90MiwgZnJhYzIsIDEwMDApOworCX0g ZWxzZSB7CisJCXF1b3QxID0gcXVvdDIgPSAwOworCQlmcmFjMSA9IGZyYWMyID0gMDsKKwl9CisJ cHJfZGVidWcoIiAgTWlzc2VzIChhdmcuY29zdCwgcmF0ZSk6ICVsbHUgKCVsbHUuJTAzdSwgJWxs dS4lMDN1IE0vcylcbiIsCisJCSB0YWJsZS0+bWlzcywgcXVvdDEsIGZyYWMxLCBxdW90MiwgZnJh YzIpOworCWlmICh0YWJsZS0+aGl0cyArIHRhYmxlLT5taXNzID4gMCkgeworCQlESVZfRlJBQyh0 YWJsZS0+aGl0c19zdGVwcyArIHRhYmxlLT5taXNzX3N0ZXBzLAorCQkJIHRhYmxlLT5oaXRzICsg dGFibGUtPm1pc3MsIHF1b3QxLCBmcmFjMSwgMTAwMCk7CisJCURJVl9GUkFDKCh0YWJsZS0+aGl0 cyArIHRhYmxlLT5taXNzKSAqIDEwMDAsCisJCQkgKHRhYmxlLT5oaXRzX3RpbWVfbnMgKyB0YWJs ZS0+bWlzc190aW1lX25zKSwKKwkJCSBxdW90MiwgZnJhYzIsIDEwMDApOworCX0gZWxzZSB7CisJ CXF1b3QxID0gcXVvdDIgPSAwOworCQlmcmFjMSA9IGZyYWMyID0gMDsKKwl9CisJcHJfZGVidWco IiAgVG90YWwgIChhdmcuY29zdCwgcmF0ZSk6ICVsbHUgKCVsbHUuJTAzdSwgJWxsdS4lMDN1IE0v cylcbiIsCisJCSB0YWJsZS0+aGl0cyArIHRhYmxlLT5taXNzLCBxdW90MSwgZnJhYzEsIHF1b3Qy LCBmcmFjMik7CisJaWYgKHRhYmxlLT5yZWxvY3MgPiAwKSB7CisJCURJVl9GUkFDKHRhYmxlLT5o aXRzICsgdGFibGUtPm1pc3MsIHRhYmxlLT5yZWxvY3MsCisJCQkgcXVvdDEsIGZyYWMxLCAxMDAw KTsKKwkJRElWX0ZSQUModGFibGUtPnJlbG9jX2Rpc3QsIHRhYmxlLT5yZWxvY3MsIHF1b3QyLCBm cmFjMiwgMTAwMCk7CisJCXByX2RlYnVnKCIgIFJlbG9jYXRpb25zIChmcmVxLCBhdmcuZGlzdCk6 ICVsbHUgKDE6JWxsdS4lMDN1LCAlbGx1LiUwM3UpXG4iLAorCQkJIHRhYmxlLT5yZWxvY3MsIHF1 b3QxLCBmcmFjMSwgcXVvdDIsIGZyYWMyKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiICBObyBy ZWxvY2F0aW9uc1xuIik7CisJfQorfQorRVhQT1JUX1NZTUJPTChfX2NoYXNoX3RhYmxlX2R1bXBf c3RhdHMpOworCisjdW5kZWYgRElWX0ZSQUMKKyNlbmRpZgorCisjZGVmaW5lIENIQVNIX0lOQyh0 YWJsZSwgYSkgKChhKSA9ICgoYSkgKyAxKSAmICh0YWJsZSktPnNpemVfbWFzaykKKyNkZWZpbmUg Q0hBU0hfQUREKHRhYmxlLCBhLCBiKSAoKChhKSArIChiKSkgJiAodGFibGUpLT5zaXplX21hc2sp CisjZGVmaW5lIENIQVNIX1NVQih0YWJsZSwgYSwgYikgKCgoYSkgLSAoYikpICYgKHRhYmxlKS0+ c2l6ZV9tYXNrKQorI2RlZmluZSBDSEFTSF9JTl9SQU5HRSh0YWJsZSwgc2xvdCwgZmlyc3QsIGxh c3QpIFwKKwkoQ0hBU0hfU1VCKHRhYmxlLCBzbG90LCBmaXJzdCkgPD0gQ0hBU0hfU1VCKHRhYmxl LCBsYXN0LCBmaXJzdCkpCisKKy8qI2RlZmluZSBDSEFTSF9ERUJVRyBVbmNvbW1lbnQgdGhpcyB0 byBlbmFibGUgdmVyYm9zZSBkZWJ1ZyBvdXRwdXQqLworI2lmZGVmIENIQVNIX0RFQlVHCitzdGF0 aWMgdm9pZCBjaGFzaF90YWJsZV9kdW1wKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSkKK3sK KwlzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyID0gQ0hBU0hfSVRFUl9JTklUKHRhYmxlLCAwKTsKKwor CWRvIHsKKwkJaWYgKChpdGVyLnNsb3QgJiAzKSA9PSAwKQorCQkJcHJfZGVidWcoIiUwNHg6ICIs IGl0ZXIuc2xvdCk7CisKKwkJaWYgKGNoYXNoX2l0ZXJfaXNfdmFsaWQoaXRlcikpCisJCQlwcl9k ZWJ1ZygiWyUwMTZsbHhdICIsIGNoYXNoX2l0ZXJfa2V5KGl0ZXIpKTsKKwkJZWxzZSBpZiAoY2hh c2hfaXRlcl9pc19lbXB0eShpdGVyKSkKKwkJCXByX2RlYnVnKCJbICAgIDxlbXB0eT4gICAgIF0g Iik7CisJCWVsc2UKKwkJCXByX2RlYnVnKCJbICA8dG9tYnN0b25lPiAgIF0gIik7CisKKwkJaWYg KChpdGVyLnNsb3QgJiAzKSA9PSAzKQorCQkJcHJfZGVidWcoIlxuIik7CisKKwkJQ0hBU0hfSVRF Ul9JTkMoaXRlcik7CisJfSB3aGlsZSAoaXRlci5zbG90KTsKKworCWlmICgoaXRlci5zbG90ICYg MykgIT0gMCkKKwkJcHJfZGVidWcoIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgY2hhc2hfdGFibGVf Y2hlY2soc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlKQoreworCXUzMiBoYXNoOworCXN0cnVj dCBjaGFzaF9pdGVyIGl0ZXIgPSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIDApOworCXN0cnVjdCBj aGFzaF9pdGVyIGN1ciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7CisKKwlkbyB7CisJCWlm ICghY2hhc2hfaXRlcl9pc192YWxpZChpdGVyKSkgeworCQkJQ0hBU0hfSVRFUl9JTkMoaXRlcik7 CisJCQljb250aW51ZTsKKwkJfQorCisJCWhhc2ggPSBjaGFzaF9pdGVyX2hhc2goaXRlcik7CisJ CUNIQVNIX0lURVJfU0VUKGN1ciwgaGFzaCk7CisJCXdoaWxlIChjdXIuc2xvdCAhPSBpdGVyLnNs b3QpIHsKKwkJCWlmIChjaGFzaF9pdGVyX2lzX2VtcHR5KGN1cikpIHsKKwkJCQlwcl9lcnIoIlBh dGggdG8gZWxlbWVudCBhdCAleCB3aXRoIGhhc2ggJXggYnJva2VuIGF0IHNsb3QgJXhcbiIsCisJ CQkJICAgICAgIGl0ZXIuc2xvdCwgaGFzaCwgY3VyLnNsb3QpOworCQkJCWNoYXNoX3RhYmxlX2R1 bXAodGFibGUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJQ0hBU0hfSVRFUl9JTkMo Y3VyKTsKKwkJfQorCisJCUNIQVNIX0lURVJfSU5DKGl0ZXIpOworCX0gd2hpbGUgKGl0ZXIuc2xv dCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjaGFzaF9pdGVyX3Jl bG9jYXRlKHN0cnVjdCBjaGFzaF9pdGVyIGRzdCwgc3RydWN0IGNoYXNoX2l0ZXIgc3JjKQorewor CUJVR19PTihzcmMudGFibGUgPT0gZHN0LnRhYmxlICYmIHNyYy5zbG90ID09IGRzdC5zbG90KTsK KwlCVUdfT04oc3JjLnRhYmxlLT5rZXlfc2l6ZSAhPSBzcmMudGFibGUtPmtleV9zaXplKTsKKwlC VUdfT04oc3JjLnRhYmxlLT52YWx1ZV9zaXplICE9IHNyYy50YWJsZS0+dmFsdWVfc2l6ZSk7CisK KwlpZiAoZHN0LnRhYmxlLT5rZXlfc2l6ZSA9PSA0KQorCQlkc3QudGFibGUtPmtleXMzMltkc3Qu c2xvdF0gPSBzcmMudGFibGUtPmtleXMzMltzcmMuc2xvdF07CisJZWxzZQorCQlkc3QudGFibGUt PmtleXM2NFtkc3Quc2xvdF0gPSBzcmMudGFibGUtPmtleXM2NFtzcmMuc2xvdF07CisKKwlpZiAo ZHN0LnRhYmxlLT52YWx1ZV9zaXplKQorCQltZW1jcHkoY2hhc2hfaXRlcl92YWx1ZShkc3QpLCBj aGFzaF9pdGVyX3ZhbHVlKHNyYyksCisJCSAgICAgICBkc3QudGFibGUtPnZhbHVlX3NpemUpOwor CisJY2hhc2hfaXRlcl9zZXRfdmFsaWQoZHN0KTsKKwljaGFzaF9pdGVyX3NldF9pbnZhbGlkKHNy Yyk7CisKKyNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKKwlpZiAoc3JjLnRhYmxlID09IGRzdC50 YWJsZSkgeworCQlkc3QudGFibGUtPnJlbG9jcysrOworCQlkc3QudGFibGUtPnJlbG9jX2Rpc3Qg Kz0KKwkJCUNIQVNIX1NVQihkc3QudGFibGUsIHNyYy5zbG90LCBkc3Quc2xvdCk7CisJfQorI2Vu ZGlmCit9CisKKy8qKgorICogX19jaGFzaF90YWJsZV9maW5kIC0gSGVscGVyIGZvciBsb29raW5n IHVwIGEgaGFzaCB0YWJsZSBlbnRyeQorICogQGl0ZXI6IFBvaW50ZXIgdG8gaGFzaCB0YWJsZSBp dGVyYXRvcgorICogQGtleTogS2V5IG9mIHRoZSBlbnRyeSB0byBmaW5kCisgKiBAZm9yX3JlbW92 YWw6IHNldCB0byB0cnVlIGlmIHRoZSBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZCBzb29uCisgKgor ICogU2VhcmNoZXMgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIHdpdGggYSBnaXZlbiBr ZXkuIGl0ZXIgbXVzdAorICogYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIGNhbGxlciB0byBwb2ludCB0 byB0aGUgaG9tZSBwb3NpdGlvbiBvZiB0aGUKKyAqIGh5cG90aGV0aWNhbCBlbnRyeSwgaS5lLiBp dCBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGhhc2ggdGFibGUKKyAqIGFuZCB0aGUga2V5 J3MgaGFzaCBhcyB0aGUgaW5pdGlhbCBzbG90IGZvciB0aGUgc2VhcmNoLgorICoKKyAqIFRoaXMg ZnVuY3Rpb24gYWxzbyBkb2VzIHNvbWUgbG9jYWwgY2xlYW4tdXAgdG8gc3BlZWQgdXAgZnV0dXJl CisgKiBsb29rLXVwcyBieSByZWxvY2F0aW5nIGVudHJpZXMgdG8gYmV0dGVyIHNsb3RzIGFuZCBy ZW1vdmluZworICogdG9tYnN0b25lcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkLgorICoKKyAq IElmIEBmb3JfcmVtb3ZhbCBpcyB0cnVlLCB0aGUgZnVuY3Rpb24gYXZvaWRzIHJlbG9jYXRpbmcg dGhlIGVudHJ5CisgKiB0aGF0IGlzIGJlaW5nIHJldHVybmVkLgorICoKKyAqIFJldHVybnMgMCBp ZiB0aGUgc2VhcmNoIGlzIHN1Y2Nlc3NmdWwuIEluIHRoaXMgY2FzZSBpdGVyIGlzIHVwZGF0ZWQK KyAqIHRvIHBvaW50IHRvIHRoZSBmb3VuZCBlbnRyeS4gT3RoZXJ3aXNlICUtRUlOVkFMIGlzIHJl dHVybmVkIGFuZCB0aGUKKyAqIGl0ZXIgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgZmlyc3Qg YXZhaWxhYmxlIHNsb3QgZm9yIHRoZSBnaXZlbgorICoga2V5LiBJZiB0aGUgdGFibGUgaXMgZnVs bCwgdGhlIHNsb3QgaXMgc2V0IHRvIC0xLgorICovCitzdGF0aWMgaW50IGNoYXNoX3RhYmxlX2Zp bmQoc3RydWN0IGNoYXNoX2l0ZXIgKml0ZXIsIHU2NCBrZXksCisJCQkgICAgYm9vbCBmb3JfcmVt b3ZhbCkKK3sKKyNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKKwl1NjQgdHMxID0gbG9jYWxfY2xv Y2soKTsKKyNlbmRpZgorCXUzMiBoYXNoID0gaXRlci0+c2xvdDsKKwlzdHJ1Y3QgY2hhc2hfaXRl ciBmaXJzdF9yZWR1bmRhbnQgPSBDSEFTSF9JVEVSX0lOSVQoaXRlci0+dGFibGUsIC0xKTsKKwlp bnQgZmlyc3RfYXZhaWwgPSAoZm9yX3JlbW92YWwgPyAtMiA6IC0xKTsKKworCXdoaWxlICghY2hh c2hfaXRlcl9pc192YWxpZCgqaXRlcikgfHwgY2hhc2hfaXRlcl9rZXkoKml0ZXIpICE9IGtleSkg eworCQlpZiAoY2hhc2hfaXRlcl9pc19lbXB0eSgqaXRlcikpIHsKKwkJCS8qIEZvdW5kIGFuIGVt cHR5IHNsb3QsIHdoaWNoIGVuZHMgdGhlCisJCQkgKiBzZWFyY2guIENsZWFuIHVwIGFueSBwcmVj ZWRpbmcgdG9tYnN0b25lcworCQkJICogdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZCBiZWNhdXNl IHRoZXkgbGVhZAorCQkJICogdG8gbm8td2hlcmUKKwkJCSAqLworCQkJaWYgKChpbnQpZmlyc3Rf cmVkdW5kYW50LnNsb3QgPCAwKQorCQkJCWdvdG8gbm90X2ZvdW5kOworCQkJd2hpbGUgKGZpcnN0 X3JlZHVuZGFudC5zbG90ICE9IGl0ZXItPnNsb3QpIHsKKwkJCQlpZiAoIWNoYXNoX2l0ZXJfaXNf dmFsaWQoZmlyc3RfcmVkdW5kYW50KSkKKwkJCQkJY2hhc2hfaXRlcl9zZXRfZW1wdHkoZmlyc3Rf cmVkdW5kYW50KTsKKwkJCQlDSEFTSF9JVEVSX0lOQyhmaXJzdF9yZWR1bmRhbnQpOworCQkJfQor I2lmZGVmIENIQVNIX0RFQlVHCisJCQljaGFzaF90YWJsZV9jaGVjayhpdGVyLT50YWJsZSk7Cisj ZW5kaWYKKwkJCWdvdG8gbm90X2ZvdW5kOworCQl9IGVsc2UgaWYgKCFjaGFzaF9pdGVyX2lzX3Zh bGlkKCppdGVyKSkgeworCQkJLyogRm91bmQgYSB0b21ic3RvbmUuIFJlbWVtYmVyIGl0IGFzIGNh bmRpZGF0ZQorCQkJICogZm9yIHJlbG9jYXRpbmcgdGhlIGVudHJ5IHdlJ3JlIGxvb2tpbmcgZm9y CisJCQkgKiBvciBmb3IgYWRkaW5nIGEgbmV3IGVudHJ5IHdpdGggdGhlIGdpdmVuIGtleQorCQkJ ICovCisJCQlpZiAoZmlyc3RfYXZhaWwgPT0gLTEpCisJCQkJZmlyc3RfYXZhaWwgPSBpdGVyLT5z bG90OworCQkJLyogT3IgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2YgYSBzZXJpZXMgb2YKKwkJCSAq IHBvdGVudGlhbGx5IHJlZHVuZGFudCB0b21ic3RvbmVzCisJCQkgKi8KKwkJCWVsc2UgaWYgKGZp cnN0X3JlZHVuZGFudC5zbG90ID09IC0xKQorCQkJCUNIQVNIX0lURVJfU0VUKGZpcnN0X3JlZHVu ZGFudCwgaXRlci0+c2xvdCk7CisJCX0gZWxzZSBpZiAoZmlyc3RfcmVkdW5kYW50LnNsb3QgPj0g MCkgeworCQkJLyogRm91bmQgYSB2YWxpZCwgb2NjdXBpZWQgc2xvdCB3aXRoIGEKKwkJCSAqIHBy ZWNlZGluZyBzZXJpZXMgb2YgdG9tYnN0b25lcy4gUmVsb2NhdGUgaXQKKwkJCSAqIHRvIGEgYmV0 dGVyIHBvc2l0aW9uIHRoYXQgbm8gbG9uZ2VyIGRlcGVuZHMKKwkJCSAqIG9uIHRob3NlIHRvbWJz dG9uZXMKKwkJCSAqLworCQkJdTMyIGN1cl9oYXNoID0gY2hhc2hfaXRlcl9oYXNoKCppdGVyKTsK KworCQkJaWYgKCFDSEFTSF9JTl9SQU5HRShpdGVyLT50YWJsZSwgY3VyX2hhc2gsCisJCQkJCSAg ICBmaXJzdF9yZWR1bmRhbnQuc2xvdCArIDEsCisJCQkJCSAgICBpdGVyLT5zbG90KSkgeworCQkJ CS8qIFRoaXMgZW50cnkgaGFzIGEgaGFzaCBhdCBvciBiZWZvcmUKKwkJCQkgKiB0aGUgZmlyc3Qg dG9tYnN0b25lIHdlIGZvdW5kLiBXZQorCQkJCSAqIGNhbiByZWxvY2F0ZSBpdCB0byB0aGF0IHRv bWJzdG9uZQorCQkJCSAqIGFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IHRvbWJzdG9uZQorCQkJCSAq LworCQkJCWNoYXNoX2l0ZXJfcmVsb2NhdGUoZmlyc3RfcmVkdW5kYW50LCAqaXRlcik7CisJCQkJ ZG8geworCQkJCQlDSEFTSF9JVEVSX0lOQyhmaXJzdF9yZWR1bmRhbnQpOworCQkJCX0gd2hpbGUg KGNoYXNoX2l0ZXJfaXNfdmFsaWQoZmlyc3RfcmVkdW5kYW50KSk7CisJCQl9IGVsc2UgaWYgKGN1 cl9oYXNoICE9IGl0ZXItPnNsb3QpIHsKKwkJCQkvKiBSZWxvY2F0ZSBlbnRyeSB0byBpdHMgaG9t ZSBwb3NpdGlvbgorCQkJCSAqIG9yIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHNvIGl0IG5vCisJCQkJ ICogbG9uZ2VyIGRlcGVuZHMgb24gYW55IHByZWNlZGluZworCQkJCSAqIHRvbWJzdG9uZXMKKwkJ CQkgKi8KKwkJCQlzdHJ1Y3QgY2hhc2hfaXRlciBuZXdfaXRlciA9CisJCQkJCUNIQVNIX0lURVJf SU5JVChpdGVyLT50YWJsZSwgY3VyX2hhc2gpOworCisJCQkJd2hpbGUgKG5ld19pdGVyLnNsb3Qg IT0gaXRlci0+c2xvdCAmJgorCQkJCSAgICAgICBjaGFzaF9pdGVyX2lzX3ZhbGlkKG5ld19pdGVy KSkKKwkJCQkJQ0hBU0hfSVRFUl9JTkMobmV3X2l0ZXIpOworCisJCQkJaWYgKG5ld19pdGVyLnNs b3QgIT0gaXRlci0+c2xvdCkKKwkJCQkJY2hhc2hfaXRlcl9yZWxvY2F0ZShuZXdfaXRlciwgKml0 ZXIpOworCQkJfQorCQl9CisKKwkJQ0hBU0hfSVRFUl9JTkMoKml0ZXIpOworCQlpZiAoaXRlci0+ c2xvdCA9PSBoYXNoKSB7CisJCQlpdGVyLT5zbG90ID0gLTE7CisJCQlnb3RvIG5vdF9mb3VuZDsK KwkJfQorCX0KKworI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUworCWl0ZXItPnRhYmxlLT5oaXRz Kys7CisJaXRlci0+dGFibGUtPmhpdHNfc3RlcHMgKz0gQ0hBU0hfU1VCKGl0ZXItPnRhYmxlLCBp dGVyLT5zbG90LCBoYXNoKSArIDE7CisjZW5kaWYKKworCWlmIChmaXJzdF9hdmFpbCA+PSAwKSB7 CisJCUNIQVNIX0lURVJfU0VUKGZpcnN0X3JlZHVuZGFudCwgZmlyc3RfYXZhaWwpOworCQljaGFz aF9pdGVyX3JlbG9jYXRlKGZpcnN0X3JlZHVuZGFudCwgKml0ZXIpOworCQlpdGVyLT5zbG90ID0g Zmlyc3RfcmVkdW5kYW50LnNsb3Q7CisJCWl0ZXItPm1hc2sgPSBmaXJzdF9yZWR1bmRhbnQubWFz azsKKwl9CisKKyNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMKKwlpdGVyLT50YWJsZS0+aGl0c190 aW1lX25zICs9IGxvY2FsX2Nsb2NrKCkgLSB0czE7CisjZW5kaWYKKworCXJldHVybiAwOworCitu b3RfZm91bmQ6CisjaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTCisJaXRlci0+dGFibGUtPm1pc3Mr KzsKKwlpdGVyLT50YWJsZS0+bWlzc19zdGVwcyArPSAoaXRlci0+c2xvdCA8IDApID8KKwkJKDEg PDwgaXRlci0+dGFibGUtPmJpdHMpIDoKKwkJQ0hBU0hfU1VCKGl0ZXItPnRhYmxlLCBpdGVyLT5z bG90LCBoYXNoKSArIDE7CisjZW5kaWYKKworCWlmIChmaXJzdF9hdmFpbCA+PSAwKQorCQlDSEFT SF9JVEVSX1NFVCgqaXRlciwgZmlyc3RfYXZhaWwpOworCisjaWZkZWYgQ09ORklHX0NIQVNIX1NU QVRTCisJaXRlci0+dGFibGUtPm1pc3NfdGltZV9ucyArPSBsb2NhbF9jbG9jaygpIC0gdHMxOwor I2VuZGlmCisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IF9fY2hhc2hfdGFibGVfY29weV9p bihzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUsIHU2NCBrZXksCisJCQkgIGNvbnN0IHZvaWQg KnZhbHVlKQoreworCXUzMiBoYXNoID0gKHRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/CisJCWhhc2hf MzIoa2V5LCB0YWJsZS0+Yml0cykgOiBoYXNoXzY0KGtleSwgdGFibGUtPmJpdHMpOworCXN0cnVj dCBjaGFzaF9pdGVyIGl0ZXIgPSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIGhhc2gpOworCWludCBy ID0gY2hhc2hfdGFibGVfZmluZCgmaXRlciwga2V5LCBmYWxzZSk7CisKKwkvKiBGb3VuZCBhbiBl eGlzdGluZyBlbnRyeSAqLworCWlmICghcikgeworCQlpZiAodmFsdWUgJiYgdGFibGUtPnZhbHVl X3NpemUpCisJCQltZW1jcHkoY2hhc2hfaXRlcl92YWx1ZShpdGVyKSwgdmFsdWUsCisJCQkgICAg ICAgdGFibGUtPnZhbHVlX3NpemUpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBJcyB0aGVyZSBh IHBsYWNlIHRvIGFkZCBhIG5ldyBlbnRyeT8gKi8KKwlpZiAoaXRlci5zbG90IDwgMCkgeworCQlw cl9lcnIoIkhhc2ggdGFibGUgb3ZlcmZsb3dcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisK KwljaGFzaF9pdGVyX3NldF92YWxpZChpdGVyKTsKKworCWlmICh0YWJsZS0+a2V5X3NpemUgPT0g NCkKKwkJdGFibGUtPmtleXMzMltpdGVyLnNsb3RdID0ga2V5OworCWVsc2UKKwkJdGFibGUtPmtl eXM2NFtpdGVyLnNsb3RdID0ga2V5OworCWlmICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6ZSkK KwkJbWVtY3B5KGNoYXNoX2l0ZXJfdmFsdWUoaXRlciksIHZhbHVlLCB0YWJsZS0+dmFsdWVfc2l6 ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19jaGFzaF90YWJsZV9jb3B5X2lu KTsKKworaW50IF9fY2hhc2hfdGFibGVfY29weV9vdXQoc3RydWN0IF9fY2hhc2hfdGFibGUgKnRh YmxlLCB1NjQga2V5LAorCQkJICAgdm9pZCAqdmFsdWUsIGJvb2wgcmVtb3ZlKQoreworCXUzMiBo YXNoID0gKHRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/CisJCWhhc2hfMzIoa2V5LCB0YWJsZS0+Yml0 cykgOiBoYXNoXzY0KGtleSwgdGFibGUtPmJpdHMpOworCXN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIg PSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIGhhc2gpOworCWludCByID0gY2hhc2hfdGFibGVfZmlu ZCgmaXRlciwga2V5LCByZW1vdmUpOworCisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWlm ICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6ZSkKKwkJbWVtY3B5KHZhbHVlLCBjaGFzaF9pdGVy X3ZhbHVlKGl0ZXIpLCB0YWJsZS0+dmFsdWVfc2l6ZSk7CisKKwlpZiAocmVtb3ZlKQorCQljaGFz aF9pdGVyX3NldF9pbnZhbGlkKGl0ZXIpOworCisJcmV0dXJuIGl0ZXIuc2xvdDsKK30KK0VYUE9S VF9TWU1CT0woX19jaGFzaF90YWJsZV9jb3B5X291dCk7CisKKyNpZmRlZiBDT05GSUdfQ0hBU0hf U0VMRlRFU1QKKy8qKgorICogY2hhc2hfc2VsZl90ZXN0IC0gUnVuIGEgc2VsZi10ZXN0IG9mIHRo ZSBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uCisgKiBAYml0czogVGFibGUgc2l6ZSB3aWxsIGJl IDJeYml0cyBlbnRyaWVzCisgKiBAa2V5X3NpemU6IFNpemUgb2YgaGFzaCBrZXlzIGluIGJ5dGVz LCA0IG9yIDgKKyAqIEBtaW5fZmlsbDogTWluaW11bSBmaWxsIGxldmVsIGR1cmluZyB0aGUgdGVz dAorICogQG1heF9maWxsOiBNYXhpbXVtIGZpbGwgbGV2ZWwgZHVyaW5nIHRoZSB0ZXN0CisgKiBA aXRlcmF0aW9uczogTnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucworICoKKyAqIFRoZSB0ZXN0IGFk ZHMgYW5kIHJlbW92ZXMgZW50cmllcyBmcm9tIGEgaGFzaCB0YWJsZSwgY3ljbGluZyB0aGUKKyAq IGZpbGwgbGV2ZWwgYmV0d2VlbiBtaW5fZmlsbCBhbmQgbWF4X2ZpbGwgZW50cmllcy4gQWxzbyB0 ZXN0cyBsb29rdXAKKyAqIGFuZCB2YWx1ZSByZXRyaWV2YWwuCisgKi8KK3N0YXRpYyBpbnQgX19p bml0IGNoYXNoX3NlbGZfdGVzdCh1OCBiaXRzLCB1OCBrZXlfc2l6ZSwKKwkJCQkgIGludCBtaW5f ZmlsbCwgaW50IG1heF9maWxsLAorCQkJCSAgdTY0IGl0ZXJhdGlvbnMpCit7CisJc3RydWN0IGNo YXNoX3RhYmxlIHRhYmxlOworCWludCByZXQ7CisJdTY0IGFkZF9jb3VudCwgcm12X2NvdW50Owor CXU2NCB2YWx1ZTsKKworCWlmIChrZXlfc2l6ZSA9PSA0ICYmIGl0ZXJhdGlvbnMgPiAweGZmZmZm ZmZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobWluX2ZpbGwgPj0gbWF4X2ZpbGwpCisJCXJl dHVybiAtRUlOVkFMOworCisJcmV0ID0gY2hhc2hfdGFibGVfYWxsb2MoJnRhYmxlLCBiaXRzLCBr ZXlfc2l6ZSwgc2l6ZW9mKHU2NCksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKHJldCkgeworCQlw cl9lcnIoImNoYXNoX3RhYmxlX2FsbG9jIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybiBy ZXQ7CisJfQorCisJZm9yIChhZGRfY291bnQgPSAwLCBybXZfY291bnQgPSAwOyBhZGRfY291bnQg PCBpdGVyYXRpb25zOworCSAgICAgYWRkX2NvdW50KyspIHsKKwkJLyogV2hlbiB3ZSBoaXQgdGhl IG1heF9maWxsIGxldmVsLCByZW1vdmUgZW50cmllcyBkb3duCisJCSAqIHRvIG1pbl9maWxsCisJ CSAqLworCQlpZiAoYWRkX2NvdW50IC0gcm12X2NvdW50ID09IG1heF9maWxsKSB7CisJCQl1NjQg ZmluZF9jb3VudCA9IHJtdl9jb3VudDsKKworCQkJLyogRmlyc3QgdHJ5IHRvIGZpbmQgYWxsIGVu dHJpZXMgdGhhdCB3ZSdyZQorCQkJICogYWJvdXQgdG8gcmVtb3ZlLCBjb25maXJtIHRoZWlyIHZh bHVlLCB0ZXN0CisJCQkgKiB3cml0aW5nIHRoZW0gYmFjayBhIHNlY29uZCB0aW1lLgorCQkJICov CisJCQlmb3IgKDsgYWRkX2NvdW50IC0gZmluZF9jb3VudCA+IG1pbl9maWxsOworCQkJICAgICBm aW5kX2NvdW50KyspIHsKKwkJCQlyZXQgPSBjaGFzaF90YWJsZV9jb3B5X291dCgmdGFibGUsIGZp bmRfY291bnQsCisJCQkJCQkJICAgJnZhbHVlKTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQlw cl9lcnIoImNoYXNoX3RhYmxlX2NvcHlfb3V0IGZhaWxlZDogJWRcbiIsCisJCQkJCSAgICAgICBy ZXQpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKHZhbHVlICE9IH5maW5kX2NvdW50 KSB7CisJCQkJCXByX2VycigiV3JvbmcgdmFsdWUgcmV0cmlldmVkIGZvciBrZXkgMHglbGx4LCBl eHBlY3RlZCAweCVsbHggZ290IDB4JWxseFxuIiwKKwkJCQkJICAgICAgIGZpbmRfY291bnQsIH5m aW5kX2NvdW50LCB2YWx1ZSk7CisjaWZkZWYgQ0hBU0hfREVCVUcKKwkJCQkJY2hhc2hfdGFibGVf ZHVtcCgmdGFibGUudGFibGUpOworI2VuZGlmCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWdv dG8gb3V0OworCQkJCX0KKwkJCQlyZXQgPSBjaGFzaF90YWJsZV9jb3B5X2luKCZ0YWJsZSwgZmlu ZF9jb3VudCwKKwkJCQkJCQkgICZ2YWx1ZSk7CisJCQkJaWYgKHJldCAhPSAxKSB7CisJCQkJCXBy X2VycigiY29weV9pbiBzZWNvbmQgdGltZSByZXR1cm5lZCAlZCwgZXhwZWN0ZWQgMVxuIiwKKwkJ CQkJICAgICAgIHJldCk7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gb3V0OworCQkJ CX0KKwkJCX0KKwkJCS8qIFJlbW92ZSB0aGVtIHVudGlsIHdlIGhpdCBtaW5fZmlsbCBsZXZlbCAq LworCQkJZm9yICg7IGFkZF9jb3VudCAtIHJtdl9jb3VudCA+IG1pbl9maWxsOyBybXZfY291bnQr KykgeworCQkJCXJldCA9IGNoYXNoX3RhYmxlX3JlbW92ZSgmdGFibGUsIHJtdl9jb3VudCwKKwkJ CQkJCQkgTlVMTCk7CisJCQkJaWYgKHJldCA8IDApIHsKKwkJCQkJcHJfZXJyKCJjaGFzaF90YWJs ZV9yZW1vdmUgZmFpbGVkOiAlZFxuIiwKKwkJCQkJICAgICAgIHJldCk7CisJCQkJCWdvdG8gb3V0 OworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIEFkZCBhIG5ldyB2YWx1ZSAqLworCQl2YWx1ZSA9 IH5hZGRfY291bnQ7CisJCXJldCA9IGNoYXNoX3RhYmxlX2NvcHlfaW4oJnRhYmxlLCBhZGRfY291 bnQsICZ2YWx1ZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJcHJfZXJyKCJjb3B5X2luIGZpcnN0 IHRpbWUgcmV0dXJuZWQgJWQsIGV4cGVjdGVkIDBcbiIsCisJCQkgICAgICAgcmV0KTsKKwkJCXJl dCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWNoYXNoX3RhYmxlX2R1bXBf c3RhdHMoJnRhYmxlKTsKKwljaGFzaF90YWJsZV9yZXNldF9zdGF0cygmdGFibGUpOworCitvdXQ6 CisJY2hhc2hfdGFibGVfZnJlZSgmdGFibGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1 bnNpZ25lZCBpbnQgY2hhc2hfdGVzdF9iaXRzID0gMTA7CitNT0RVTEVfUEFSTV9ERVNDKHRlc3Rf Yml0cywKKwkJICJTZWxmdGVzdCBudW1iZXIgb2YgaGFzaCBiaXRzIChbNC4uMjBdLCBkZWZhdWx0 PTEwKSIpOworbW9kdWxlX3BhcmFtX25hbWVkKHRlc3RfYml0cywgY2hhc2hfdGVzdF9iaXRzLCB1 aW50LCAwNDQ0KTsKKworc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X2tleXNpemUgPSA4 OworTU9EVUxFX1BBUk1fREVTQyh0ZXN0X2tleXNpemUsICJTZWxmdGVzdCBrZXlzaXplICg0IG9y IDgsIGRlZmF1bHQ9OCkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0X2tleXNpemUsIGNoYXNo X3Rlc3Rfa2V5c2l6ZSwgdWludCwgMDQ0NCk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2hhc2hf dGVzdF9taW5maWxsOworTU9EVUxFX1BBUk1fREVTQyh0ZXN0X21pbmZpbGwsICJTZWxmdGVzdCBt aW5pbXVtICNlbnRyaWVzIChkZWZhdWx0PTUwJSkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0 X21pbmZpbGwsIGNoYXNoX3Rlc3RfbWluZmlsbCwgdWludCwgMDQ0NCk7CisKK3N0YXRpYyB1bnNp Z25lZCBpbnQgY2hhc2hfdGVzdF9tYXhmaWxsOworTU9EVUxFX1BBUk1fREVTQyh0ZXN0X21heGZp bGwsICJTZWxmdGVzdCBtYXhpbXVtICNlbnRyaWVzIChkZWZhdWx0PTgwJSkiKTsKK21vZHVsZV9w YXJhbV9uYW1lZCh0ZXN0X21heGZpbGwsIGNoYXNoX3Rlc3RfbWF4ZmlsbCwgdWludCwgMDQ0NCk7 CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNoYXNoX3Rlc3RfaXRlcnM7CitNT0RVTEVfUEFSTV9E RVNDKHRlc3RfaXRlcnMsICJTZWxmdGVzdCBpdGVyYXRpb25zIChkZWZhdWx0PTEwMDAgeCAjZW50 cmllcykiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0X2l0ZXJzLCBjaGFzaF90ZXN0X2l0ZXJz LCB1bG9uZywgMDQ0NCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNoYXNoX2luaXQodm9pZCkKK3sK KwlpbnQgcmV0OworCXU2NCB0czFfbnMsIHRzX2RlbHRhX3VzOworCisJLyogU2tpcCBzZWxmIHRl c3Qgb24gdXNlciBlcnJvcnMgKi8KKwlpZiAoY2hhc2hfdGVzdF9iaXRzIDwgNCB8fCBjaGFzaF90 ZXN0X2JpdHMgPiAyMCkgeworCQlwcl9lcnIoImNoYXNoOiB0ZXN0X2JpdHMgb3V0IG9mIHJhbmdl IFs0Li4yMF0uXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjaGFzaF90ZXN0X2tleXNpemUg IT0gNCAmJiBjaGFzaF90ZXN0X2tleXNpemUgIT0gOCkgeworCQlwcl9lcnIoImNoYXNoOiB0ZXN0 X2tleXNpemUgaW52YWxpZC4gTXVzdCBiZSA0IG9yIDguXG4iKTsKKwkJcmV0dXJuIDA7CisJfQor CisJaWYgKCFjaGFzaF90ZXN0X21pbmZpbGwpCisJCWNoYXNoX3Rlc3RfbWluZmlsbCA9ICgxIDw8 IGNoYXNoX3Rlc3RfYml0cykgLyAyOworCWlmICghY2hhc2hfdGVzdF9tYXhmaWxsKQorCQljaGFz aF90ZXN0X21heGZpbGwgPSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpICogNCAvIDU7CisJaWYgKCFj aGFzaF90ZXN0X2l0ZXJzKQorCQljaGFzaF90ZXN0X2l0ZXJzID0gKDEgPDwgY2hhc2hfdGVzdF9i aXRzKSAqIDEwMDA7CisKKwlpZiAoY2hhc2hfdGVzdF9taW5maWxsID49ICgxIDw8IGNoYXNoX3Rl c3RfYml0cykpIHsKKwkJcHJfZXJyKCJjaGFzaDogdGVzdF9taW5maWxsIHRvbyBiaWcuIE11c3Qg YmUgPCB0YWJsZSBzaXplLlxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoY2hhc2hfdGVzdF9t YXhmaWxsID49ICgxIDw8IGNoYXNoX3Rlc3RfYml0cykpIHsKKwkJcHJfZXJyKCJjaGFzaDogdGVz dF9tYXhmaWxsIHRvbyBiaWcuIE11c3QgYmUgPCB0YWJsZSBzaXplLlxuIik7CisJCXJldHVybiAw OworCX0KKwlpZiAoY2hhc2hfdGVzdF9taW5maWxsID49IGNoYXNoX3Rlc3RfbWF4ZmlsbCkgewor CQlwcl9lcnIoImNoYXNoOiB0ZXN0X21pbmZpbGwgbXVzdCBiZSA8IHRlc3RfbWF4ZmlsbC5cbiIp OworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNoYXNoX3Rlc3Rfa2V5c2l6ZSA9PSA0ICYmIGNoYXNo X3Rlc3RfaXRlcnMgPiAweGZmZmZmZmZmKSB7CisJCXByX2VycigiY2hhc2g6IHRlc3RfaXRlcnMg bXVzdCBiZSA8IDRHIGZvciA0IGJ5dGUga2V5cy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0 czFfbnMgPSBsb2NhbF9jbG9jaygpOworCXJldCA9IGNoYXNoX3NlbGZfdGVzdChjaGFzaF90ZXN0 X2JpdHMsIGNoYXNoX3Rlc3Rfa2V5c2l6ZSwKKwkJCSAgICAgIGNoYXNoX3Rlc3RfbWluZmlsbCwg Y2hhc2hfdGVzdF9tYXhmaWxsLAorCQkJICAgICAgY2hhc2hfdGVzdF9pdGVycyk7CisJaWYgKCFy ZXQpIHsKKwkJdHNfZGVsdGFfdXMgPSAobG9jYWxfY2xvY2soKSAtIHRzMV9ucykgLyAxMDAwOwor CQlwcl9pbmZvKCJjaGFzaDogc2VsZiB0ZXN0IHRvb2sgJWxsdSB1cywgJWxsdSBpdGVyYXRpb25z L3NcbiIsCisJCQl0c19kZWx0YV91cywKKwkJCSh1NjQpY2hhc2hfdGVzdF9pdGVycyAqIDEwMDAw MDAgLyB0c19kZWx0YV91cyk7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJjaGFzaDogc2VsZiB0ZXN0 IGZhaWxlZDogJWRcbiIsIHJldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworbW9kdWxlX2lu aXQoY2hhc2hfaW5pdCk7CisKKyNlbmRpZiAvKiBDT05GSUdfQ0hBU0hfU0VMRlRFU1QgKi8KKwor TU9EVUxFX0RFU0NSSVBUSU9OKCJDbG9zZWQgaGFzaCB0YWJsZSIpOworTU9EVUxFX0xJQ0VOU0Uo IkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiKTsKLS0gCjIuNy40CgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwphbWQtZ2Z4IG1haWxpbmcgbGlzdAphbWQt Z2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2FtZC1nZngK