LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBDb3B5cmlnaHQgqSAyMDA3IEludGVsIENvcnBvcmF0aW9uCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAogKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICogCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqICAgICAgICAgIEtlaXRoIFdoaXR3ZWxsIDxrZWl0aHctYXQtdHVuZ3N0ZW5ncmFwaGljcy1kb3QtY29tPgogKgkgICAgRXJpYyBBbmhvbHQgPGVyaWNAYW5ob2x0Lm5ldD4KICovCgojaWZuZGVmIF9EUklfQlVGTUdSX0hfCiNkZWZpbmUgX0RSSV9CVUZNR1JfSF8KI2luY2x1ZGUgPHhmODZkcm0uaD4KCnR5cGVkZWYgc3RydWN0IF9kcmlfYnVmbWdyIGRyaV9idWZtZ3I7CnR5cGVkZWYgc3RydWN0IF9kcmlfYm8gZHJpX2JvOwp0eXBlZGVmIHN0cnVjdCBfZHJpX2ZlbmNlIGRyaV9mZW5jZTsKCnN0cnVjdCBfZHJpX2JvIHsKICAgLyoqIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciBvYmplY3QuICovCiAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKICAgLyoqCiAgICAqIENhcmQgdmlydHVhbCBhZGRyZXNzIChvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcGVydHVyZSkgZm9yIHRoZQogICAgKiBvYmplY3QuICBPbmx5IHZhbGlkIHdoaWxlIHZhbGlkYXRlZC4KICAgICovCiAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogICAvKioKICAgICogVmlydHVhbCBhZGRyZXNzIGZvciBhY2Nlc3NpbmcgdGhlIGJ1ZmZlciBkYXRhLiAgT25seSB2YWxpZCB3aGlsZSBtYXBwZWQuCiAgICAqLwogICB2b2lkICp2aXJ0dWFsOwogICAvKiogQnVmZmVyIG1hbmFnZXIgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIgb2JqZWN0ICovCiAgIGRyaV9idWZtZ3IgKmJ1Zm1ncjsKfTsKCnN0cnVjdCBfZHJpX2ZlbmNlIHsKICAgLyoqCiAgICAqIFRoaXMgaXMgYW4gT1JlZCBtYXNrIG9mIERSTV9CT19GTEFHX1JFQUQsIERSTV9CT19GTEFHX1dSSVRFLCBhbmQKICAgICogRFJNX0ZMQUdfRVhFIGluZGljYXRpbmcgdGhlIG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmVuY2UuCiAgICAqCiAgICAqIEl0IGlzIGNvbnN0YW50IGZvciB0aGUgbGlmZSBvZiB0aGUgZmVuY2Ugb2JqZWN0LgogICAgKi8KICAgdW5zaWduZWQgaW50IHR5cGU7CiAgIC8qKiBCdWZmZXIgbWFuYWdlciBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZlbmNlICovCiAgIGRyaV9idWZtZ3IgKmJ1Zm1ncjsKfTsKCi8qKgogKiBDb250ZXh0IGZvciBhIGJ1ZmZlciBtYW5hZ2VyIGluc3RhbmNlLgogKgogKiBDb250YWlucyBwdWJsaWMgbWV0aG9kcyBmb2xsb3dlZCBieSBwcml2YXRlIHN0b3JhZ2UgZm9yIHRoZSBidWZmZXIgbWFuYWdlci4KICovCnN0cnVjdCBfZHJpX2J1Zm1nciB7CiAgIC8qKgogICAgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvYmplY3QuCiAgICAqCiAgICAqIEJ1ZmZlciBvYmplY3RzIGFyZSBub3QgbmVjZXNzYXJpbHkgaW5pdGlhbGx5IG1hcHBlZCBpbnRvIENQVSB2aXJ0dWFsCiAgICAqIGFkZHJlc3Mgc3BhY2Ugb3IgZ3JhcGhpY3MgZGV2aWNlIGFwZXJ0dXJlLiAgVGhleSBtdXN0IGJlIG1hcHBlZCB1c2luZwogICAgKiBib19tYXAoKSB0byBiZSB1c2VkIGJ5IHRoZSBDUFUsIGFuZCB2YWxpZGF0ZWQgZm9yIHVzZSB1c2luZyBib192YWxpZGF0ZSgpCiAgICAqIHRvIGJlIHVzZWQgZnJvbSB0aGUgZ3JhcGhpY3MgZGV2aWNlLgogICAgKi8KICAgZHJpX2JvICooKmJvX2FsbG9jKShkcmlfYnVmbWdyICpidWZtZ3JfY3R4LCBjb25zdCBjaGFyICpuYW1lLAoJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGludCBhbGlnbm1lbnQsCgkJICAgICAgIHVpbnQ2NF90IGxvY2F0aW9uX21hc2spOwoKICAgLyoqCiAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBvYmplY3QgZm9yIGEgc3RhdGljIGFsbG9jYXRpb24uCiAgICAqCiAgICAqIFN0YXRpYyBhbGxvY2F0aW9ucyBhcmUgb25lcyBzdWNoIGFzIHRoZSBmcm9udCBidWZmZXIgdGhhdCBhcmUgb2ZmZXJlZCBieQogICAgKiB0aGUgWCBTZXJ2ZXIsIHdoaWNoIGFyZSBuZXZlciBldmljdGVkIGFuZCBuZXZlciBtb3ZlZC4KICAgICovCiAgIGRyaV9ibyAqKCpib19hbGxvY19zdGF0aWMpKGRyaV9idWZtZ3IgKmJ1Zm1ncl9jdHgsIGNvbnN0IGNoYXIgKm5hbWUsCgkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHNpemUsCgkJCSAgICAgIHZvaWQgKnZpcnR1YWwsIHVpbnQ2NF90IGxvY2F0aW9uX21hc2spOwoKICAgLyoqIFRha2VzIGEgcmVmZXJlbmNlIG9uIGEgYnVmZmVyIG9iamVjdCAqLwogICB2b2lkICgqYm9fcmVmZXJlbmNlKShkcmlfYm8gKmJvKTsKCiAgIC8qKgogICAgKiBSZWxlYXNlcyBhIHJlZmVyZW5jZSBvbiBhIGJ1ZmZlciBvYmplY3QsIGZyZWVpbmcgdGhlIGRhdGEgaWYKICAgICogcmVyZWZlbmNlcyByZW1haW4uCiAgICAqLwogICB2b2lkICgqYm9fdW5yZWZlcmVuY2UpKGRyaV9ibyAqYm8pOwoKICAgLyoqCiAgICAqIE1hcHMgdGhlIGJ1ZmZlciBpbnRvIHVzZXJzcGFjZS4KICAgICoKICAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHdhaXRpbmcgZm9yIGFueSBleGlzdGluZyBmZW5jZSBvbiB0aGUgYnVmZmVyIHRvCiAgICAqIGNsZWFyLCBmaXJzdC4gIFRoZSByZXN1bHRpbmcgbWFwcGluZyBpcyBhdmFpbGFibGUgYXQgYnVmLT52aXJ0dWFsLgpcICAgICovCiAgIGludCAoKmJvX21hcCkoZHJpX2JvICpidWYsIEdMYm9vbGVhbiB3cml0ZV9lbmFibGUpOwoKICAgLyoqIFJlZHVjZXMgdGhlIHJlZmNvdW50IG9uIHRoZSB1c2Vyc3BhY2UgbWFwcGluZyBvZiB0aGUgYnVmZmVyIG9iamVjdC4gKi8KICAgaW50ICgqYm9fdW5tYXApKGRyaV9ibyAqYnVmKTsKCiAgIC8qKiBUYWtlcyBhIHJlZmVyZW5jZSBvbiBhIGZlbmNlIG9iamVjdCAqLwogICB2b2lkICgqZmVuY2VfcmVmZXJlbmNlKShkcmlfZmVuY2UgKmZlbmNlKTsKCiAgIC8qKgogICAgKiBSZWxlYXNlcyBhIHJlZmVyZW5jZSBvbiBhIGZlbmNlIG9iamVjdCwgZnJlZWluZyB0aGUgZGF0YSBpZgogICAgKiByZXJlZmVuY2VzIHJlbWFpbi4KICAgICovCiAgIHZvaWQgKCpmZW5jZV91bnJlZmVyZW5jZSkoZHJpX2ZlbmNlICpmZW5jZSk7CgogICAvKioKICAgICogQmxvY2tzIHVudGlsIHRoZSBnaXZlbiBmZW5jZSBpcyBzaWduYWxlZC4KICAgICovCiAgIHZvaWQgKCpmZW5jZV93YWl0KShkcmlfZmVuY2UgKmZlbmNlKTsKCiAgIC8qKgogICAgKiBUZWFycyBkb3duIHRoZSBidWZmZXIgbWFuYWdlciBpbnN0YW5jZS4KICAgICovCiAgIHZvaWQgKCpkZXN0cm95KShkcmlfYnVmbWdyICpidWZtZ3IpOwoKICAgLyoqCiAgICAqIEFkZCByZWxvY2F0aW9uIGVudHJ5IGluIHJlbG9jX2J1Ziwgd2hpY2ggd2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlCiAgICAqIHRhcmdldCBidWZmZXIncyByZWFsIG9mZnNldCBvbiBvbiBjb21tYW5kIHN1Ym1pc3Npb24uCiAgICAqCiAgICAqIFJlbG9jYXRpb25zIHJlbWFpbiBpbiBwbGFjZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBidWZmZXIgb2JqZWN0LgogICAgKgogICAgKiBccGFyYW0gcmVsb2NfYnVmIEJ1ZmZlciB0byB3cml0ZSB0aGUgcmVsb2NhdGlvbiBpbnRvLgogICAgKiBccGFyYW0gZmxhZ3MgQk8gZmxhZ3MgdG8gYmUgdXNlZCBpbiB2YWxpZGF0aW5nIHRoZSB0YXJnZXQgYnVmZmVyLgogICAgKgkgICAgIEFwcGxpY2FibGUgZmxhZ3MgaW5jbHVkZToKICAgICoJICAgICAtIERSTV9CT19GTEFHX1JFQUQ6IFRoZSBidWZmZXIgd2lsbCBiZSByZWFkIGluIHRoZSBwcm9jZXNzIG9mCiAgICAqCSAgICAgICBjb21tYW5kIGV4ZWN1dGlvbi4KICAgICoJICAgICAtIERSTV9CT19GTEFHX1dSSVRFOiBUaGUgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbiBpbiB0aGUgcHJvY2VzcyBvZgogICAgKgkgICAgICAgY29tbWFuZCBleGVjdXRpb24uCiAgICAqCSAgICAgLSBEUk1fQk9fRkxBR19NRU1fVFQ6IFRoZSBidWZmZXIgc2hvdWxkIGJlIHZhbGlkYXRlZCBpbiBUVCBtZW1vcnkuCiAgICAqCSAgICAgLSBEUk1fQk9fRkxBR19NRU1fVlJBTTogVGhlIGJ1ZmZlciBzaG91bGQgYmUgdmFsaWRhdGVkIGluIHZpZGVvCiAgICAqCSAgICAgICBtZW1vcnkuCiAgICAqIFxwYXJhbSBkZWx0YSBDb25zdGFudCB2YWx1ZSB0byBiZSBhZGRlZCB0byB0aGUgcmVsb2NhdGlvbiB0YXJnZXQncyBvZmZzZXQuCiAgICAqIFxwYXJhbSBvZmZzZXQgQnl0ZSBvZmZzZXQgd2l0aGluIGJhdGNoX2J1ZiBvZiB0aGUgcmVsb2NhdGVkIHBvaW50ZXIuCiAgICAqIFxwYXJhbSB0YXJnZXQgQnVmZmVyIHdob3NlIG9mZnNldCBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIHRoZSByZWxvY2F0aW9uCiAgICAqCSAgICAgZW50cnkuCiAgICAqLwogICBpbnQgKCplbWl0X3JlbG9jKShkcmlfYm8gKnJlbG9jX2J1ZiwgdWludDY0X3QgZmxhZ3MsIEdMdWludCBkZWx0YSwKCQkgICAgICBHTHVpbnQgb2Zmc2V0LCBkcmlfYm8gKnRhcmdldCk7CgogICAvKioKICAgICogUHJvY2Vzc2VzIHRoZSByZWxvY2F0aW9ucywgZWl0aGVyIGluIHVzZXJsYW5kIG9yIGJ5IGNvbnZlcnRpbmcgdGhlIGxpc3QKICAgICogZm9yIHVzZSBpbiBiYXRjaGJ1ZmZlciBzdWJtaXNzaW9uLgogICAgKgogICAgKiBLZXJuZWwtYmFzZWQgaW1wbGVtZW50YXRpb25zIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYXJndW1lbnRzCiAgICAqIHRvIGJlIGhhbmRlZCB3aXRoIGJhdGNoYnVmZmVyIHN1Ym1pc3Npb24gdG8gdGhlIGtlcm5lbC4gIFRoZSB1c2VybGFuZAogICAgKiBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyB0aGUgYnVmZmVyIHZhbGlkYXRpb24gYW5kIGVtaXRzIHJlbG9jYXRpb25zCiAgICAqIGludG8gdGhlbSB0aGUgYXBwb3ByaWF0ZSBvcmRlci4KICAgICoKICAgICogXHBhcmFtIGJhdGNoX2J1ZiBidWZmZXIgYXQgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgb2YgcmVsb2NhdGlvbnMKICAgICogXHBhcmFtIGNvdW50IHJldHVybnMgdGhlIG51bWJlciBvZiBidWZmZXJzIHZhbGlkYXRlZC4KICAgICogXHJldHVybiByZWxvY2F0aW9uIHJlY29yZCBmb3IgdXNlIGluIGNvbW1hbmQgc3VibWlzc2lvbi4KICAgICogKi8KICAgdm9pZCAqKCpwcm9jZXNzX3JlbG9jcykoZHJpX2JvICpiYXRjaF9idWYsIEdMdWludCAqY291bnQpOwoKICAgdm9pZCAoKnBvc3Rfc3VibWl0KShkcmlfYm8gKmJhdGNoX2J1ZiwgZHJpX2ZlbmNlICoqZmVuY2UpOwoKICAgaW50ICgqY2hlY2tfYXBlcnR1cmVfc3BhY2UpKGRyaV9ibyAqYm8pOwogICBHTGJvb2xlYW4gZGVidWc7IC8qKjwgRW5hYmxlcyB2ZXJib3NlIGRlYnVnZ2luZyBwcmludG91dHMgKi8KfTsKCmRyaV9ibyAqZHJpX2JvX2FsbG9jKGRyaV9idWZtZ3IgKmJ1Zm1nciwgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBzaXplLAoJCSAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudCwgdWludDY0X3QgbG9jYXRpb25fbWFzayk7CmRyaV9ibyAqZHJpX2JvX2FsbG9jX3N0YXRpYyhkcmlfYnVmbWdyICpidWZtZ3IsIGNvbnN0IGNoYXIgKm5hbWUsCgkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkgICAgdm9pZCAqdmlydHVhbCwgdWludDY0X3QgbG9jYXRpb25fbWFzayk7CnZvaWQgZHJpX2JvX3JlZmVyZW5jZShkcmlfYm8gKmJvKTsKdm9pZCBkcmlfYm9fdW5yZWZlcmVuY2UoZHJpX2JvICpibyk7CmludCBkcmlfYm9fbWFwKGRyaV9ibyAqYnVmLCBHTGJvb2xlYW4gd3JpdGVfZW5hYmxlKTsKaW50IGRyaV9ib191bm1hcChkcmlfYm8gKmJ1Zik7CnZvaWQgZHJpX2ZlbmNlX3dhaXQoZHJpX2ZlbmNlICpmZW5jZSk7CnZvaWQgZHJpX2ZlbmNlX3JlZmVyZW5jZShkcmlfZmVuY2UgKmZlbmNlKTsKdm9pZCBkcmlfZmVuY2VfdW5yZWZlcmVuY2UoZHJpX2ZlbmNlICpmZW5jZSk7Cgp2b2lkIGRyaV9ib19zdWJkYXRhKGRyaV9ibyAqYm8sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAoJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IHZvaWQgKmRhdGEpOwp2b2lkIGRyaV9ib19nZXRfc3ViZGF0YShkcmlfYm8gKmJvLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKCQkJdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKTsKCnZvaWQgZHJpX2J1Zm1ncl9mYWtlX2NvbnRlbmRlZF9sb2NrX3Rha2UoZHJpX2J1Zm1nciAqYnVmbWdyKTsKZHJpX2J1Zm1nciAqZHJpX2J1Zm1ncl9mYWtlX2luaXQodW5zaWduZWQgbG9uZyBsb3dfb2Zmc2V0LCB2b2lkICpsb3dfdmlydHVhbCwKCQkJCSB1bnNpZ25lZCBsb25nIHNpemUsCgkJCQkgdW5zaWduZWQgaW50ICgqZmVuY2VfZW1pdCkodm9pZCAqcHJpdmF0ZSksCgkJCQkgaW50ICgqZmVuY2Vfd2FpdCkodm9pZCAqcHJpdmF0ZSwKCQkJCQkJICAgdW5zaWduZWQgaW50IGNvb2tpZSksCgkJCQkgdm9pZCAqZHJpdmVyX3ByaXYpOwp2b2lkIGRyaV9idWZtZ3Jfc2V0X2RlYnVnKGRyaV9idWZtZ3IgKmJ1Zm1nciwgR0xib29sZWFuIGVuYWJsZV9kZWJ1Zyk7CnZvaWQgZHJpX2JvX2Zha2VfZGlzYWJsZV9iYWNraW5nX3N0b3JlKGRyaV9ibyAqYm8sCgkJCQkgICAgICAgdm9pZCAoKmludmFsaWRhdGVfY2IpKGRyaV9ibyAqYm8sCgkJCQkJCQkgICAgIHZvaWQgKnB0ciksCgkJCQkgICAgICAgdm9pZCAqcHRyKTsKdm9pZCBkcmlfYnVmbWdyX2Rlc3Ryb3koZHJpX2J1Zm1nciAqYnVmbWdyKTsKCmludCBkcmlfZW1pdF9yZWxvYyhkcmlfYm8gKnJlbG9jX2J1ZiwgdWludDY0X3QgZmxhZ3MsIEdMdWludCBkZWx0YSwKCQkgICBHTHVpbnQgb2Zmc2V0LCBkcmlfYm8gKnRhcmdldF9idWYpOwp2b2lkICpkcmlfcHJvY2Vzc19yZWxvY3MoZHJpX2JvICpiYXRjaF9idWYsIHVpbnQzMl90ICpjb3VudCk7CnZvaWQgZHJpX3Bvc3RfcHJvY2Vzc19yZWxvY3MoZHJpX2JvICpiYXRjaF9idWYpOwp2b2lkIGRyaV9wb3N0X3N1Ym1pdChkcmlfYm8gKmJhdGNoX2J1ZiwgZHJpX2ZlbmNlICoqbGFzdF9mZW5jZSk7CmludCBkcmlfYnVmbWdyX2NoZWNrX2FwZXJ0dXJlX3NwYWNlKGRyaV9ibyAqYm8pOwoKI2lmbmRlZiBUVE1fQVBJCi8qIHJldXNlIHNvbWUgVFRNIEFQSSAqLwoKI2RlZmluZSBEUk1fQk9fTUVNX0xPQ0FMIDAKI2RlZmluZSBEUk1fQk9fTUVNX1RUIDEKI2RlZmluZSBEUk1fQk9fTUVNX1ZSQU0gMgojZGVmaW5lIERSTV9CT19NRU1fUFJJVjAgMwojZGVmaW5lIERSTV9CT19NRU1fUFJJVjEgNAojZGVmaW5lIERSTV9CT19NRU1fUFJJVjIgNQojZGVmaW5lIERSTV9CT19NRU1fUFJJVjMgNgojZGVmaW5lIERSTV9CT19NRU1fUFJJVjQgNwoKI2RlZmluZSBEUk1fQk9fRkxBR19SRUFEICAgICAgICAoMVVMTCA8PCAwKQojZGVmaW5lIERSTV9CT19GTEFHX1dSSVRFICAgICAgICgxVUxMIDw8IDEpCiNkZWZpbmUgRFJNX0JPX0ZMQUdfRVhFICAgICAgICAgKDFVTEwgPDwgMikKI2RlZmluZSBEUk1fQk9fTUFTS19BQ0NFU1MJKERSTV9CT19GTEFHX1JFQUQgfCBEUk1fQk9fRkxBR19XUklURSB8IERSTV9CT19GTEFHX0VYRSkKI2RlZmluZSBEUk1fQk9fRkxBR19OT19FVklDVCAgICAoMVVMTCA8PCA0KQoKI2RlZmluZSBEUk1fQk9fRkxBR19NQVBQQUJMRSAgICAoMVVMTCA8PCA1KQojZGVmaW5lIERSTV9CT19GTEFHX1NIQVJFQUJMRSAgICgxVUxMIDw8IDYpCgojZGVmaW5lIERSTV9CT19GTEFHX0NBQ0hFRCAgICAgICgxVUxMIDw8IDcpCgojZGVmaW5lIERSTV9CT19GTEFHX05PX01PVkUgICAgICgxVUxMIDw8IDgpCiNkZWZpbmUgRFJNX0JPX0ZMQUdfQ0FDSEVEX01BUFBFRCAgICAoMVVMTCA8PCAxOSkKI2RlZmluZSBEUk1fQk9fRkxBR19GT1JDRV9DQUNISU5HICAoMVVMTCA8PCAxMykKI2RlZmluZSBEUk1fQk9fRkxBR19GT1JDRV9NQVBQQUJMRSAoMVVMTCA8PCAxNCkKI2RlZmluZSBEUk1fQk9fRkxBR19USUxFICAgICAgICAgICAoMVVMTCA8PCAxNSkKCiNkZWZpbmUgRFJNX0JPX0ZMQUdfTUVNX0xPQ0FMICAoMVVMTCA8PCAyNCkKI2RlZmluZSBEUk1fQk9fRkxBR19NRU1fVFQgICAgICgxVUxMIDw8IDI1KQojZGVmaW5lIERSTV9CT19GTEFHX01FTV9WUkFNICAgKDFVTEwgPDwgMjYpCgojZGVmaW5lIERSTV9CT19NQVNLX01FTSAgICAgICAgIDB4MDAwMDAwMDBGRjAwMDAwMFVMTAoKI2RlZmluZSBEUk1fRkVOQ0VfVFlQRV9FWEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKI2VuZGlmCgojZW5kaWYK