LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgY29weXJpZ2h0ZWQgYnk6CiAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiAqIGRpc3RyaWJ1dGVkIHdpdGggdGhlIE5ldC1TTk1QIHBhY2thZ2UuCiAqLwovKgogKiBAZmlsZSB0YWJsZS5oCiAqCiAqIEBhZGR0b2dyb3VwIHRhYmxlCiAqCiAqIEB7CiAqLwojaWZuZGVmIF9UQUJMRV9IQU5ETEVSX0hfCiNkZWZpbmUgX1RBQkxFX0hBTkRMRVJfSF8KCiNpZmRlZiBfX2NwbHVzcGx1cwpleHRlcm4gICAgICAgICAgIkMiIHsKI2VuZGlmCgovKioKICogVGhlIHRhYmxlIGhlbHBlciBpcyBkZXNpZ25lZCB0byBzaW1wbGlmeSB0aGUgdGFzayBvZiB3cml0aW5nIGEKICogdGFibGUgaGFuZGxlciBmb3IgdGhlIG5ldC1zbm1wIGFnZW50LiAgWW91IHNob3VsZCBjcmVhdGUgYSBub3JtYWwKICogaGFuZGxlciBhbmQgcmVnaXN0ZXIgaXQgdXNpbmcgdGhlIG5ldHNubXBfcmVnaXN0ZXJfdGFibGUoKSBmdW5jdGlvbgogKiBpbnN0ZWFkIG9mIHRoZSBuZXRzbm1wX3JlZ2lzdGVyX2hhbmRsZXIoKSBmdW5jdGlvbi4KICovCgovKioKICogTm90ZXM6CiAqCiAqICAgMSkgaWxsZWdhbCBpbmRleGVzIGF1dG9tYXRpY2FsbHkgZ2V0IGhhbmRsZWQgZm9yIGdldC9zZXQgY2FzZXMuCiAqICAgICAgU2ltcGx5IGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgdmFsdWUgaXMgdHlwZSBBU05fTlVMTCBiZWZvcmUKICogICAgICB5b3UgYW5zd2VyIGEgcmVxdWVzdC4KICovCgkKLyoqCiAqIHVzZWQgYXMgYW4gaW5kZXggdG8gcGFyZW50X2RhdGEgbG9va3VwcyAKICovCiNkZWZpbmUgVEFCTEVfSEFORExFUl9OQU1FICJ0YWJsZSIKCi8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9jb2x1bW5faW5mb190IG5ldHNubXBfY29sdW1uX2luZm8KICogVHlwZWRlZnMgdGhlIG5ldHNubXBfY29sdW1uX2luZm9fdCBzdHJ1Y3QgaW50byBuZXRzbm1wX2NvbHVtbl9pbmZvICovCgovKioKICogQHN0cnVjdCBuZXRzbm1wX2NvbHVtbl9pbmZvX3QKICogY29sdW1uIGluZm8gc3RydWN0LiAgT1ZFUkxBUFBJTkcgUkFOR0VTIEFSRSBOT1QgU1VQUE9SVEVELgogKi8KICAgIHR5cGVkZWYgc3RydWN0IG5ldHNubXBfY29sdW1uX2luZm9fdCB7CiAgICAgICAgY2hhciAgICAgICAgICAgIGlzUmFuZ2U7CiAJLyoqIG9ubHkgdXNlZnVsIGlmIGlzUmFuZ2UgPT0gMCAqLwogICAgICAgIGNoYXIgICAgICAgICAgICBsaXN0X2NvdW50OwoKICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgIHVuc2lnbmVkIGludCAgICByYW5nZVsyXTsKICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgKmxpc3Q7CiAgICAgICAgfSBkZXRhaWxzOwoKICAgICAgICBzdHJ1Y3QgbmV0c25tcF9jb2x1bW5faW5mb190ICpuZXh0OwoKICAgIH0gbmV0c25tcF9jb2x1bW5faW5mbzsKCi8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF90YWJsZV9yZWdpc3RyYXRpb25faW5mb19zIG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8KICAqIFR5cGVkZWZzIHRoZSBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvX3MgIHN0cnVjdCBpbnRvCiAgKiBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvICovCgovKioKICogQHN0cnVjdCBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvX3MKICogVGFibGUgcmVnaXN0cmF0aW9uIHN0cnVjdHVyZS4KICovCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvX3MgewogCS8qKiBsaXN0IG9mIHZhcmJpbmRzIHdpdGggb25seSAndHlwZScgc2V0ICovCiAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICppbmRleGVzOwogCS8qKiBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgKi8KICAgICAgICB1bnNpZ25lZCBpbnQgICAgbnVtYmVyX2luZGV4ZXM7CgogICAgICAgLyoqCiAgICAgICAgKiB0aGUgbWluaW11bSBjb2x1bW5zIG51bWJlci4gSWYgdGhlcmUgYXJlIGNvbHVtbnMKICAgICAgICAqIGluLWJldHdlZW4gd2hpY2ggYXJlIG5vdCB2YWxpZCwgdXNlIHZhbGlkX2NvbHVtbnMgdG8gZ2V0CiAgICAgICAgKiBhdXRvbWF0aWMgY29sdW1uIHJhbmdlIGNoZWNraW5nLgogICAgICAgICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIG1pbl9jb2x1bW47CiAJLyoqIHRoZSBtYXhpbXVtIGNvbHVtbnMgbnVtYmVyICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIG1heF9jb2x1bW47CgogCS8qKiBtb3JlIGRldGFpbHMgb24gY29sdW1ucyAqLwogICAgICAgIG5ldHNubXBfY29sdW1uX2luZm8gKnZhbGlkX2NvbHVtbnM7CgogICAgfSBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvOwoKLyoqIEB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX3RhYmxlX3JlcXVlc3RfaW5mb19zIG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvCiAgKiBUeXBlZGVmcyB0aGUgbmV0c25tcF90YWJsZV9yZXF1ZXN0X2luZm9fcyAgc3RydWN0IGludG8KICAqIG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvICovCgovKioKICogQHN0cnVjdCBuZXRzbm1wX3RhYmxlX3JlcXVlc3RfaW5mb19zCiAqIFRoZSB0YWJsZSByZXF1ZXN0IGluZm8gc3RydWN0dXJlLgogKi8KICAgIHR5cGVkZWYgc3RydWN0IG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvX3MgewogCS8qKiAwIGlmIE9JRCBub3QgbG9uZyBlbm91Z2ggKi8KICAgICAgICB1bnNpZ25lZCBpbnQgICAgY29sbnVtOwogICAgICAgIC8qKiAwIGlmIGZhaWx1cmUgdG8gcGFyc2UgYW55ICovCiAgICAgICAgdW5zaWduZWQgaW50ICAgIG51bWJlcl9pbmRleGVzOwogCS8qKiBjb250ZW50cyBmcmVlZCBieSBoZWxwZXIgdXBvbiBleGl0ICovCiAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICppbmRleGVzOwoKICAgICAgICBvaWQgICAgICAgICAgICAgaW5kZXhfb2lkW01BWF9PSURfTEVOXTsKICAgICAgICBzaXplX3QgICAgICAgICAgaW5kZXhfb2lkX2xlbjsKICAgICAgICBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvICpyZWdfaW5mbzsKICAgIH0gbmV0c25tcF90YWJsZV9yZXF1ZXN0X2luZm87CgogICAgbmV0c25tcF9taWJfaGFuZGxlcgogICAgICAgICpuZXRzbm1wX2dldF90YWJsZV9oYW5kbGVyKG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGFicmVxKTsKICAgIGludCAgIG5ldHNubXBfcmVnaXN0ZXJfdGFibGUoICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICAgICpyZWdpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8gKnRhYnJlcSk7CiAgICBpbnQgICBuZXRzbm1wX3VucmVnaXN0ZXJfdGFibGUobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAgICAqcmVnaW5mbyk7CiAgICBpbnQgICBuZXRzbm1wX3RhYmxlX2J1aWxkX29pZCggbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAgICAgICAgICAgICpyZXFpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvICAgKnRhYmxlX2luZm8pOwogICAgaW50ICAgICAgICAgICAgCiAgICAgICAgbmV0c25tcF90YWJsZV9idWlsZF9vaWRfZnJvbV9pbmRleChuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXFpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF90YWJsZV9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0YWJsZV9pbmZvKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX3RhYmxlX2J1aWxkX3Jlc3VsdChuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVxaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3RhYmxlX3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0YWJsZV9pbmZvLCB1X2NoYXIgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiByZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlc3VsdF9sZW4pOwogICAgaW50ICAgICAgICAgICAgCiAgICAgICAgbmV0c25tcF91cGRhdGVfdmFyaWFibGVfbGlzdF9mcm9tX2luZGV4KG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopOwogICAgaW50ICAgICAgICAgICAgCiAgICAgICAgbmV0c25tcF91cGRhdGVfaW5kZXhlc19mcm9tX3ZhcmlhYmxlX2xpc3QKICAgICAgICAobmV0c25tcF90YWJsZV9yZXF1ZXN0X2luZm8gKnRyaSk7CiAgICBuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvCiAgICAgICAgKm5ldHNubXBfZmluZF90YWJsZV9yZWdpc3RyYXRpb25faW5mbyhuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbyk7CiAgICB2b2lkIG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm9fZnJlZShuZXRzbm1wX3RhYmxlX3JlZ2lzdHJhdGlvbl9pbmZvICopOwoKICAgIG5ldHNubXBfaW5kZXggKiBuZXRzbm1wX3RhYmxlX2luZGV4X2ZpbmRfbmV4dF9yb3cobmV0c25tcF9jb250YWluZXIgKmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvICp0YmxyZXEpOwoKICAgIHVuc2lnbmVkIGludCAgICBuZXRzbm1wX2Nsb3Nlc3RfY29sdW1uKHVuc2lnbmVkIGludCBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9jb2x1bW5faW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnZhbGlkX2NvbHVtbnMpOwoKICAgIE5ldHNubXBfTm9kZV9IYW5kbGVyIHRhYmxlX2hlbHBlcl9oYW5kbGVyOwoKI2RlZmluZSBuZXRzbm1wX3RhYmxlX2hlbHBlcl9hZGRfaW5kZXgodGluZm8sIHR5cGUpIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnRpbmZvLT5pbmRleGVzLCBOVUxMLCAwLCAodV9jaGFyKXR5cGUsIE5VTEwsIDApOwoKICAgIHZvaWQgICAgICAgICAgIAogICAgICAgIG5ldHNubXBfdGFibGVfaGVscGVyX2FkZF9pbmRleGVzKG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGluZm8sIC4uLik7CgogICAgaW50IG5ldHNubXBfY2hlY2tfZ2V0bmV4dF9yZXBseShuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2lkICogcHJlZml4LCBzaXplX3QgcHJlZml4X2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICogbmV3dmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKiogb3V0dmFyKTsKCiAgICBuZXRzbm1wX3RhYmxlX3JlcXVlc3RfaW5mbwogICAgICAgICpuZXRzbm1wX2V4dHJhY3RfdGFibGVfaW5mbyhuZXRzbm1wX3JlcXVlc3RfaW5mbyAqKTsKICAgIG5ldHNubXBfb2lkX3N0YXNoX25vZGUKICAgICAgICAqKm5ldHNubXBfdGFibGVfZ2V0X29yX2NyZWF0ZV9yb3dfc3Rhc2gobmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VfbmFtZSk7Cgl1bnNpZ25lZCBpbnQKCQluZXRzbm1wX3RhYmxlX25leHRfY29sdW1uKG5ldHNubXBfdGFibGVfcmVxdWVzdF9pbmZvICp0YWJsZV9pbmZvKTsKCgogICAgaW50ICAgbmV0c25tcF9zcGFyc2VfdGFibGVfcmVnaXN0ZXIobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdGFibGVfcmVnaXN0cmF0aW9uX2luZm8gKnRhYnJlcSk7CgogICAgbmV0c25tcF9taWJfaGFuZGxlciAqbmV0c25tcF9zcGFyc2VfdGFibGVfaGFuZGxlcl9nZXQodm9pZCk7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogX1RBQkxFX0hBTkRMRVJfSF8gKi8KLyoqIEB9ICovCg==