Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBYQk0gTG9hZGVyCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKLy8gLSBIZXJ26SBEcm9sb24gPGRyb2xvbkBpbmZvbmllLmZyPgovLyBwYXJ0IG9mIHRoZSBjb2RlIGFkYXB0ZWQgZnJvbSB0aGUgbmV0UEJNIHBhY2thZ2UgKHhibXRvcGJtLmMpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8KLy8KLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgojaW5jbHVkZSAiVXRpbGl0aWVzLmgiCgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEludGVybmFsIGZ1bmN0aW9ucwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojZGVmaW5lIE1BWF9MSU5FCTUxMgoKc3RhdGljIGNvbnN0IGNoYXIgKkVSUl9YQk1fU1lOVEFYCT0gIlN5bnRheCBlcnJvciI7CnN0YXRpYyBjb25zdCBjaGFyICpFUlJfWEJNX0xJTkUJCT0gIkxpbmUgdG9vIGxvbmciOwpzdGF0aWMgY29uc3QgY2hhciAqRVJSX1hCTV9ERUNMCQk9ICJVbmFibGUgdG8gZmluZCBhIGxpbmUgaW4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc3RhcnQgb2YgQyBhcnJheSBkZWNsYXJhdGlvbiAoXCJzdGF0aWMgY2hhclwiIG9yIHdoYXRldmVyKSI7CnN0YXRpYyBjb25zdCBjaGFyICpFUlJfWEJNX0VPRlJFQUQJPSAiRU9GIC8gcmVhZCBlcnJvciI7CnN0YXRpYyBjb25zdCBjaGFyICpFUlJfWEJNX1dJRFRICT0gIkludmFsaWQgd2lkdGgiOwpzdGF0aWMgY29uc3QgY2hhciAqRVJSX1hCTV9IRUlHSFQJPSAiSW52YWxpZCBoZWlnaHQiOwpzdGF0aWMgY29uc3QgY2hhciAqRVJSX1hCTV9NRU1PUlkJPSAiT3V0IG9mIG1lbW9yeSI7CgovKioKR2V0IGEgc3RyaW5nIGZyb20gYSBzdHJlYW0uIApSZWFkIHRoZSBzdHJpbmcgZnJvbSB0aGUgY3VycmVudCBzdHJlYW0gdG8gdGhlIGZpcnN0IG5ld2xpbmUgY2hhcmFjdGVyLiAKVGhlIHJlc3VsdCBzdG9yZWQgaW4gc3RyIGlzIGFwcGVuZGVkIHdpdGggYSBudWxsIGNoYXJhY3Rlci4KQHBhcmFtIHN0ciBTdG9yYWdlIGxvY2F0aW9uIGZvciBkYXRhIApAcGFyYW0gbiBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgCkBwYXJhbSBpbyBQb2ludGVyIHRvIHRoZSBGcmVlSW1hZ2VJTyBzdHJ1Y3R1cmUKQHBhcmFtIGhhbmRsZSBIYW5kbGUgdG8gdGhlIHN0cmVhbQpAcmV0dXJuIFJldHVybnMgc3RyLiBOVUxMIGlzIHJldHVybmVkIHRvIGluZGljYXRlIGFuIGVycm9yIG9yIGFuIGVuZC1vZi1maWxlIGNvbmRpdGlvbi4KKi8Kc3RhdGljIGNoYXIqIApyZWFkTGluZShjaGFyICpzdHIsIGludCBuLCBGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKCWNoYXIgYzsKCWludCBjb3VudCwgaSA9IDA7CglkbyB7CgkJY291bnQgPSBpby0+cmVhZF9wcm9jKCZjLCAxLCAxLCBoYW5kbGUpOwoJCXN0cltpKytdID0gYzsKCX0gd2hpbGUoKGMgIT0gJ1xuJykgJiYgKGkgPCBuKSk7CglpZihjb3VudCA8PSAwKQoJCXJldHVybiBOVUxMOwoJc3RyW2ldID0gJ1wwJzsKCXJldHVybiBzdHI7Cn0KCi8qKgpHZXQgYSBjaGFyIGZyb20gdGhlIHN0cmVhbQpAcGFyYW0gaW8gUG9pbnRlciB0byB0aGUgRnJlZUltYWdlSU8gc3RydWN0dXJlCkBwYXJhbSBoYW5kbGUgSGFuZGxlIHRvIHRoZSBzdHJlYW0KQHJldHVybiBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgc3RyZWFtCiovCnN0YXRpYyBpbnQgCnJlYWRDaGFyKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSkgewoJQllURSBjOwoJaW8tPnJlYWRfcHJvYygmYywgMSwgMSwgaGFuZGxlKTsKCXJldHVybiBjOwp9CgovKioKUmVhZCBhbiBYQk0gZmlsZSBpbnRvIGEgYnVmZmVyCkBwYXJhbSBpbyBQb2ludGVyIHRvIHRoZSBGcmVlSW1hZ2VJTyBzdHJ1Y3R1cmUKQHBhcmFtIGhhbmRsZSBIYW5kbGUgdG8gdGhlIHN0cmVhbQpAcGFyYW0gd2lkdGhQIChyZXR1cm4gdmFsdWUpIFBvaW50ZXIgdG8gdGhlIGJpdG1hcCB3aWR0aApAcGFyYW0gaGVpZ2h0UCAocmV0dXJuIHZhbHVlKSBQb2ludGVyIHRvIHRoZSBiaXRtYXAgaGVpZ2h0CkBwYXJhbSBkYXRhUCAocmV0dXJuIHZhbHVlKSBQb2ludGVyIHRvIHRoZSBiaXRtYXAgYnVmZmVyCkByZXR1cm4gUmV0dXJucyBOVUxMIGlmIE9LLCByZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlCiovCnN0YXRpYyBjb25zdCBjaGFyKiAKcmVhZFhCTUZpbGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgKndpZHRoUCwgaW50ICpoZWlnaHRQLCBjaGFyICoqZGF0YVApIHsKCWNoYXIgbGluZVtNQVhfTElORV0sIG5hbWVfYW5kX3R5cGVbTUFYX0xJTkVdOwoJY2hhciogcHRyOwoJY2hhciogdDsKCWludCB2ZXJzaW9uID0gMDsKCWludCByYXN0ZXJfbGVuZ3RoLCB2OwoJaW50IGJ5dGVzLCBieXRlc19wZXJfbGluZSwgcGFkZGluZzsKCWludCBjMSwgYzIsIHZhbHVlMSwgdmFsdWUyOwoJaW50IGhleF90YWJsZVsyNTZdOwoJQk9PTCBmb3VuZF9kZWNsYXJhdGlvbjsKCS8qIGluIHNjYW5uaW5nIHRocm91Z2ggdGhlIGJpdG1hcCBmaWxlLCB3ZSBoYXZlIGZvdW5kIHRoZSBmaXJzdAoJIGxpbmUgb2YgdGhlIEMgZGVjbGFyYXRpb24gb2YgdGhlIGFycmF5ICh0aGUgInN0YXRpYyBjaGFyIC4uLiIKCSBvciB3aGF0ZXZlciBsaW5lKQoJICovCglCT09MIGVvZjsJLy8gd2UndmUgZW5jb3VudGVyZWQgZW5kIG9mIGZpbGUgd2hpbGUgc2VhcmNoaW5nIGZpbGUKCgkqd2lkdGhQID0gKmhlaWdodFAgPSAtMTsKCglmb3VuZF9kZWNsYXJhdGlvbiA9IEZBTFNFOyAgICAvLyBoYXZlbid0IGZvdW5kIGl0IHlldDsgaGF2ZW4ndCBldmVuIGxvb2tlZAoJZW9mID0gRkFMU0U7ICAgICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBlbmNvdW50ZXJlZCBlbmQgb2YgZmlsZSB5ZXQgCgkKCXdoaWxlKCFmb3VuZF9kZWNsYXJhdGlvbiAmJiAhZW9mKSB7CgoJCWlmKCByZWFkTGluZShsaW5lLCBNQVhfTElORSwgaW8sIGhhbmRsZSkgPT0gTlVMTCkgewoJCQllb2YgPSBUUlVFOwoJCX0KCQllbHNlIHsKCQkJaWYoIHN0cmxlbiggbGluZSApID09IE1BWF9MSU5FIC0gMSApCgkJCQlyZXR1cm4oIEVSUl9YQk1fTElORSApOwoJCQlpZiggc3NjYW5mKGxpbmUsICIjZGVmaW5lICVzICVkIiwgbmFtZV9hbmRfdHlwZSwgJnYpID09IDIgKSB7CgkJCQlpZiggKCB0ID0gc3RycmNociggbmFtZV9hbmRfdHlwZSwgJ18nICkgKSA9PSBOVUxMICkKCQkJCQl0ID0gbmFtZV9hbmRfdHlwZTsKCQkJCWVsc2UKCQkJCQl0Kys7CgkJCQlpZiAoICEgc3RyY21wKCAid2lkdGgiLCB0ICkgKQoJCQkJCSp3aWR0aFAgPSB2OwoJCQkJZWxzZSBpZiAoICEgc3RyY21wKCAiaGVpZ2h0IiwgdCApICkKCQkJCQkqaGVpZ2h0UCA9IHY7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYoIHNzY2FuZiggbGluZSwgInN0YXRpYyBzaG9ydCAlcyA9IHsiLCBuYW1lX2FuZF90eXBlICkgPT0gMSApIHsKCQkJCXZlcnNpb24gPSAxMDsKCQkJCWZvdW5kX2RlY2xhcmF0aW9uID0gVFJVRTsKCQkJfQoJCQllbHNlIGlmKCBzc2NhbmYoIGxpbmUsICJzdGF0aWMgY2hhciAlcyA9IHsiLCBuYW1lX2FuZF90eXBlICkgPT0gMSApIHsKCQkJCXZlcnNpb24gPSAxMTsKCQkJCWZvdW5kX2RlY2xhcmF0aW9uID0gVFJVRTsKCQkJfQoJCQllbHNlIGlmKHNzY2FuZihsaW5lLCAic3RhdGljIHVuc2lnbmVkIGNoYXIgJXMgPSB7IiwgbmFtZV9hbmRfdHlwZSApID09IDEgKSB7CgkJCQl2ZXJzaW9uID0gMTE7CgkJCQlmb3VuZF9kZWNsYXJhdGlvbiA9IFRSVUU7CgkJCX0KCQl9Cgl9CgoJaWYoIWZvdW5kX2RlY2xhcmF0aW9uKSAKCQlyZXR1cm4oIEVSUl9YQk1fREVDTCApOwoKCWlmKCp3aWR0aFAgPT0gLTEgKQoJCXJldHVybiggRVJSX1hCTV9XSURUSCApOwoJaWYoICpoZWlnaHRQID09IC0xICkKCQlyZXR1cm4oIEVSUl9YQk1fSEVJR0hUICk7CgoJcGFkZGluZyA9IDA7CglpZiAoICgoKndpZHRoUCAlIDE2KSA+PSAxKSAmJiAoKCp3aWR0aFAgJSAxNikgPD0gOCkgJiYgKHZlcnNpb24gPT0gMTApICkKCQlwYWRkaW5nID0gMTsKCglieXRlc19wZXJfbGluZSA9ICgqd2lkdGhQICsgNykgLyA4ICsgcGFkZGluZzsKCglyYXN0ZXJfbGVuZ3RoID0gIGJ5dGVzX3Blcl9saW5lICogKmhlaWdodFA7CgkqZGF0YVAgPSAoY2hhciopIG1hbGxvYyggcmFzdGVyX2xlbmd0aCApOwoJaWYgKCAqZGF0YVAgPT0gKGNoYXIqKSAwICkKCQlyZXR1cm4oIEVSUl9YQk1fTUVNT1JZICk7CgoJLy8gaW5pdGlhbGl6ZSBoZXhfdGFibGUKCWZvciAoIGMxID0gMDsgYzEgPCAyNTY7IGMxKysgKSB7CgkJaGV4X3RhYmxlW2MxXSA9IDI1NjsKCX0KCWhleF90YWJsZVsnMCddID0gMDsKCWhleF90YWJsZVsnMSddID0gMTsKCWhleF90YWJsZVsnMiddID0gMjsKCWhleF90YWJsZVsnMyddID0gMzsKCWhleF90YWJsZVsnNCddID0gNDsKCWhleF90YWJsZVsnNSddID0gNTsKCWhleF90YWJsZVsnNiddID0gNjsKCWhleF90YWJsZVsnNyddID0gNzsKCWhleF90YWJsZVsnOCddID0gODsKCWhleF90YWJsZVsnOSddID0gOTsKCWhleF90YWJsZVsnQSddID0gMTA7CgloZXhfdGFibGVbJ0InXSA9IDExOwoJaGV4X3RhYmxlWydDJ10gPSAxMjsKCWhleF90YWJsZVsnRCddID0gMTM7CgloZXhfdGFibGVbJ0UnXSA9IDE0OwoJaGV4X3RhYmxlWydGJ10gPSAxNTsKCWhleF90YWJsZVsnYSddID0gMTA7CgloZXhfdGFibGVbJ2InXSA9IDExOwoJaGV4X3RhYmxlWydjJ10gPSAxMjsKCWhleF90YWJsZVsnZCddID0gMTM7CgloZXhfdGFibGVbJ2UnXSA9IDE0OwoJaGV4X3RhYmxlWydmJ10gPSAxNTsKCglpZih2ZXJzaW9uID09IDEwKSB7CgkJZm9yKCBieXRlcyA9IDAsIHB0ciA9ICpkYXRhUDsgYnl0ZXMgPCByYXN0ZXJfbGVuZ3RoOyBieXRlcyArPSAyICkgewoJCQl3aGlsZSggKCBjMSA9IHJlYWRDaGFyKGlvLCBoYW5kbGUpICkgIT0gJ3gnICkgewoJCQkJaWYgKCBjMSA9PSBFT0YgKQoJCQkJCXJldHVybiggRVJSX1hCTV9FT0ZSRUFEICk7CgkJCX0KCgkJCWMxID0gcmVhZENoYXIoaW8sIGhhbmRsZSk7CgkJCWMyID0gcmVhZENoYXIoaW8sIGhhbmRsZSk7CgkJCWlmKCBjMSA9PSBFT0YgfHwgYzIgPT0gRU9GICkKCQkJCXJldHVybiggRVJSX1hCTV9FT0ZSRUFEICk7CgkJCXZhbHVlMSA9ICggaGV4X3RhYmxlW2MxXSA8PCA0ICkgKyBoZXhfdGFibGVbYzJdOwoJCQlpZiAoIHZhbHVlMSA+PSAyNTYgKQoJCQkJcmV0dXJuKCBFUlJfWEJNX1NZTlRBWCApOwoJCQljMSA9IHJlYWRDaGFyKGlvLCBoYW5kbGUpOwoJCQljMiA9IHJlYWRDaGFyKGlvLCBoYW5kbGUpOwoJCQlpZiggYzEgPT0gRU9GIHx8IGMyID09IEVPRiApCgkJCQlyZXR1cm4oIEVSUl9YQk1fRU9GUkVBRCApOwoJCQl2YWx1ZTIgPSAoIGhleF90YWJsZVtjMV0gPDwgNCApICsgaGV4X3RhYmxlW2MyXTsKCQkJaWYgKCB2YWx1ZTIgPj0gMjU2ICkKCQkJCXJldHVybiggRVJSX1hCTV9TWU5UQVggKTsKCQkJKnB0cisrID0gKGNoYXIpdmFsdWUyOwoJCQlpZiAoICggISBwYWRkaW5nICkgfHwgKCAoIGJ5dGVzICsgMiApICUgYnl0ZXNfcGVyX2xpbmUgKSApCgkJCQkqcHRyKysgPSAoY2hhcil2YWx1ZTE7CgkJfQoJfQoJZWxzZSB7CgkJZm9yKGJ5dGVzID0gMCwgcHRyID0gKmRhdGFQOyBieXRlcyA8IHJhc3Rlcl9sZW5ndGg7IGJ5dGVzKysgKSB7CgkJCS8qCgkJCSoqIHNraXAgdW50aWwgZGlnaXQgaXMgZm91bmQKCQkJKi8KCQkJZm9yKCA7IDsgKSB7CgkJCQljMSA9IHJlYWRDaGFyKGlvLCBoYW5kbGUpOwoJCQkJaWYgKCBjMSA9PSBFT0YgKQoJCQkJCXJldHVybiggRVJSX1hCTV9FT0ZSRUFEICk7CgkJCQl2YWx1ZTEgPSBoZXhfdGFibGVbYzFdOwoJCQkJaWYgKCB2YWx1ZTEgIT0gMjU2ICkKCQkJCQlicmVhazsKCQkJfQoJCQkvKgoJCQkqKiBsb29wIG9uIGRpZ2l0cwoJCQkqLwoJCQlmb3IoIDsgOyApIHsKCQkJCWMyID0gcmVhZENoYXIoaW8sIGhhbmRsZSk7CgkJCQlpZiAoIGMyID09IEVPRiApCgkJCQkJcmV0dXJuKCBFUlJfWEJNX0VPRlJFQUQgKTsKCQkJCXZhbHVlMiA9IGhleF90YWJsZVtjMl07CgkJCQlpZiAoIHZhbHVlMiAhPSAyNTYgKSB7CgkJCQkJdmFsdWUxID0gKHZhbHVlMSA8PCA0KSB8IHZhbHVlMjsKCQkJCQlpZiAoIHZhbHVlMSA+PSAyNTYgKQoJCQkJCQlyZXR1cm4oIEVSUl9YQk1fU1lOVEFYICk7CgkJCQl9CgkJCQllbHNlIGlmICggYzIgPT0gJ3gnIHx8IGMyID09ICdYJyApIHsKCQkJCQlpZiAoIHZhbHVlMSA9PSAwICkKCQkJCQkJY29udGludWU7CgkJCQkJZWxzZSByZXR1cm4oIEVSUl9YQk1fU1lOVEFYICk7CgkJCQl9CgkJCQllbHNlIGJyZWFrOwoJCQl9CgkJCSpwdHIrKyA9IChjaGFyKXZhbHVlMTsKCQl9Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gUGx1Z2luIEludGVyZmFjZQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGF0aWMgaW50IHNfZm9ybWF0X2lkOwoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRm9ybWF0KCkgewoJcmV0dXJuICJYQk0iOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpEZXNjcmlwdGlvbigpIHsKCXJldHVybiAiWDExIEJpdG1hcCBGb3JtYXQiOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpFeHRlbnNpb24oKSB7CglyZXR1cm4gInhibSI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WClJlZ0V4cHIoKSB7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKTWltZVR5cGUoKSB7CglyZXR1cm4gImltYWdlL3gteGJpdG1hcCI7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKCWNoYXIgbWFnaWNbOF07CglpZihyZWFkTGluZShtYWdpYywgNywgaW8sIGhhbmRsZSkpIHsKCQlpZihzdHJjbXAobWFnaWMsICIjZGVmaW5lIikgPT0gMCkKCQkJcmV0dXJuIFRSVUU7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpTdXBwb3J0c0V4cG9ydERlcHRoKGludCBkZXB0aCkgewoJcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYgClN1cHBvcnRzRXhwb3J0VHlwZShGUkVFX0lNQUdFX1RZUEUgdHlwZSkgewoJcmV0dXJuIEZBTFNFOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgRklCSVRNQVAgKiBETExfQ0FMTENPTlYKTG9hZChGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBwYWdlLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEpIHsKCWNoYXIgKmJ1ZmZlciA9IE5VTEw7CglpbnQgd2lkdGgsIGhlaWdodDsKCUZJQklUTUFQICpkaWIgPSBOVUxMOwoKCXRyeSB7CgoJCS8vIGxvYWQgdGhlIGJpdG1hcCBkYXRhCgkJY29uc3QgY2hhciogZXJyb3IgPSByZWFkWEJNRmlsZShpbywgaGFuZGxlLCAmd2lkdGgsICZoZWlnaHQsICZidWZmZXIpOwoJCS8vIE1pY3Jvc29mdCBkb2Vzbid0IGltcGxlbWVudCB0aHJvdyBiZXR3ZWVuIGZ1bmN0aW9ucyA6KAoJCWlmKGVycm9yKSB0aHJvdyAoY2hhciopZXJyb3I7CgoKCQkvLyBhbGxvY2F0ZSBhIG5ldyBkaWIKCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgMSk7CgkJaWYoIWRpYikgdGhyb3cgKGNoYXIqKUVSUl9YQk1fTUVNT1JZOwoKCQkvLyB3cml0ZSB0aGUgcGFsZXR0ZSBkYXRhCgkJUkdCUVVBRCAqcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKCQlwYWxbMF0ucmdiUmVkID0gcGFsWzBdLnJnYkdyZWVuID0gcGFsWzBdLnJnYkJsdWUgPSAwOwoJCXBhbFsxXS5yZ2JSZWQgPSBwYWxbMV0ucmdiR3JlZW4gPSBwYWxbMV0ucmdiQmx1ZSA9IDI1NTsKCgkJLy8gY29weSB0aGUgYml0bWFwCgkJQllURSAqYlAgPSAoQllURSopYnVmZmVyOwoJCWZvcihpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQlCWVRFIGNvdW50ID0gMDsKCQkJQllURSBtYXNrID0gMTsKCQkJQllURSAqYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKCgkJCWZvcihpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CgkJCQlpZihjb3VudCA+PSA4KSB7CgkJCQkJYlArKzsKCQkJCQljb3VudCA9IDA7CgkJCQkJbWFzayA9IDE7CgkJCQl9CgkJCQlpZigqYlAgJiBtYXNrKSB7CgkJCQkJLy8gU2V0IGJpdCh4LCB5KSB0byAwCgkJCQkJYml0c1t4ID4+IDNdICY9ICgweEZGN0YgPj4gKHggJiAweDcpKTsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gU2V0IGJpdCh4LCB5KSB0byAxCgkJCQkJYml0c1t4ID4+IDNdIHw9ICgweDgwID4+ICh4ICYgMHg3KSk7CgkJCQl9CgkJCQljb3VudCsrOwoJCQkJbWFzayA8PD0gMTsKCQkJfQoJCQliUCsrOwoJCX0KCgkJZnJlZShidWZmZXIpOwoJCXJldHVybiBkaWI7CgoJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CgkJaWYoYnVmZmVyKQlmcmVlKGJ1ZmZlcik7CgkJaWYoZGliKQkJRnJlZUltYWdlX1VubG9hZChkaWIpOwoJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CgkJcmV0dXJuIE5VTEw7Cgl9Cn0KCgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vICAgSW5pdAovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp2b2lkIERMTF9DQUxMQ09OVgpJbml0WEJNKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CiAgICBzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKCglwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OwoJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CglwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOwoJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOwoJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOwoJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOwp9Cgo=