From mboxrd@z Thu Jan 1 00:00:00 1970 From: bcrowder@station.sony.com To: gcc-gnats@gcc.gnu.org Subject: c++/3175: CTOR/DTOR Mismatch Error Date: Wed, 13 Jun 2001 11:26:00 -0000 Message-id: <20010613181840.13470.qmail@sourceware.cygnus.com> X-SW-Source: 2001-06/msg00589.html List-Id: >Number: 3175 >Category: c++ >Synopsis: CTOR/DTOR Mismatch Error >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: wrong-code >Submitter-Id: net >Arrival-Date: Wed Jun 13 11:26:01 PDT 2001 >Closed-Date: >Last-Modified: >Originator: Brian Crowder >Release: gcc version 2.95.3 20010315 (release) >Organization: >Environment: Linux 2.4.2 SMP >Description: The attached C++ code generates an unbalanced cascade of constructor/destructor pairs resulting in one-too-many DTORs being executed. We discovered this bug while porting a piece of C++ code Win32/MSVC++6.0. The code frequently passes handles for reference counted objects by value, and we were finding that at the end of a given call-stack, our reference count was short by one, causing the associated data to be released prematurely. Changing any of several pass-by-value functions to accept or return values via const reference provides a workaround. Also, explicitly creating temporary variables before function calls also seems to provide a workaround of sorts. Interestingly, instrumented with Insure++, our application behaves correctly, but not when built normally. My insure license just ran out, so I haven't had a chance to test this demonstration code. >How-To-Repeat: test.cpp is my demo C++ code savetemps.out is the reporting from "g++ -v -save-temps test.cpp" test.ii is the preprocessed source gcc was built with no additional command-line options (just "configure; make bootstrap") The source is built with the following command line: g++ -o test test.cpp >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="test.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test.ii" IyAxICJ0ZXN0LmNwcCIKIyAxICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAxIDMKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCgoK IAoKCgoKCgoKIAojIDE0MiAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDMKCgogCgoKCgoKCgoK CiAKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjA4ICIvdXNyL2luY2x1 ZGUvZmVhdHVyZXMuaCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgog CgoKIAoKCgoKCgoKCiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCiAKCgojIDEgIi91c3IvaW5jbHVk ZS9zeXMvY2RlZnMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgogCgoKCgoKCiAK CgoKCgogCgoKCgoKCgoKIAoKCgojIDY1ICIvdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmgiIDMKCgog CgoKCgoKIAoKCgoKIAoKCgoKCgoKCgogCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCgogCgoKCgoKCiAKCgoKCgoKCgogCgoKCgoKCgoKIAoKCgoKCgoK CiAKCgoKCgoKCgoKCiAKCgoKCgoKCiAKCgoKCiAKCgoKCgoKIyAyODMgIi91c3IvaW5jbHVkZS9m ZWF0dXJlcy5oIiAyIDMKCgoKIAoKCgoKCgoKCiAKCgoKCiAKCiAKCgoKCgoKCgojIDEgIi91c3Iv aW5jbHVkZS9nbnUvc3R1YnMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDMxMSAi L3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDIgMwoKCgoKIyAyNyAiL3Vzci9pbmNsdWRlL3N0ZGlv LmgiIDIgMwoKCmV4dGVybiAiQyIgeyAKCgoKIyAxICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2 ODYtcGMtbGludXgtZ251LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMg MTkgIi91c3IvbG9jYWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9sb2NhbC9saWIvZ2Nj LWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoK CgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9sb2NhbC9saWIv Z2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAK CiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgdW5zaWduZWQgaW50 IHNpemVfdDsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCiAKCiMgMjcxICIvdXNyL2xvY2Fs L2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAz CgoKIyAyODMgIi91c3IvbG9jYWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4z L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgojIDMxNyAiL3Vzci9sb2NhbC9saWIvZ2NjLWxp Yi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgojIDMzICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMiAzCgoKIyAxICIv dXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoK CgoKIyAxICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzIuOTUuMy9p bmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbG9jYWwvbGliL2djYy1s aWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAK CgoKCgogCgoKIyA2MSAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8y Ljk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAK CgoKCgogCgogCgojIDEzMSAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdu dS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCgojIDE4OCAiL3Vzci9sb2NhbC9s aWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CgoKCiAKCgoKCiAKCiMgMjcxICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgt Z251LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMgIi91c3IvbG9jYWwvbGliL2dj Yy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgog CgojIDMxNyAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMv aW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDI5ICIvdXNy L2luY2x1ZGUvYml0cy90eXBlcy5oIiAyIDMKCgogCnR5cGVkZWYgdW5zaWduZWQgY2hhciBfX3Vf Y2hhcjsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBfX3Vfc2hvcnQ7CnR5cGVkZWYgdW5zaWduZWQg aW50IF9fdV9pbnQ7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX3VfbG9uZzsKCl9fZXh0ZW5zaW9u X18gdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fdV9xdWFkX3Q7Cl9fZXh0ZW5zaW9u X18gdHlwZWRlZiBsb25nIGxvbmcgaW50IF9fcXVhZF90OwojIDQ4ICIvdXNyL2luY2x1ZGUvYml0 cy90eXBlcy5oIiAzCgp0eXBlZGVmIHNpZ25lZCBjaGFyIF9faW50OF90Owp0eXBlZGVmIHVuc2ln bmVkIGNoYXIgX191aW50OF90Owp0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQgX19pbnQxNl90Owp0 eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBfX3VpbnQxNl90Owp0eXBlZGVmIHNpZ25lZCBpbnQg X19pbnQzMl90Owp0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VpbnQzMl90OwoKX19leHRlbnNpb25f XyB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgaW50IF9faW50NjRfdDsKX19leHRlbnNpb25fXyB0 eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgX191aW50NjRfdDsKCnR5cGVkZWYgX19xdWFk X3QgKl9fcWFkZHJfdDsKCnR5cGVkZWYgX191X3F1YWRfdCBfX2Rldl90OwkJIAp0eXBlZGVmIF9f dV9pbnQgX191aWRfdDsJCSAKdHlwZWRlZiBfX3VfaW50IF9fZ2lkX3Q7CQkgCnR5cGVkZWYgX191 X2xvbmcgX19pbm9fdDsJCSAKdHlwZWRlZiBfX3VfaW50IF9fbW9kZV90OwkJIAp0eXBlZGVmIF9f dV9pbnQgX19ubGlua190OyAJCSAKdHlwZWRlZiBsb25nIGludCBfX29mZl90OwkJIAp0eXBlZGVm IF9fcXVhZF90IF9fbG9mZl90OwkJIAp0eXBlZGVmIGludCBfX3BpZF90OwkJCSAKdHlwZWRlZiBp bnQgX19zc2l6ZV90OwkJCSAKdHlwZWRlZiBfX3VfbG9uZyBfX3JsaW1fdDsJCSAKdHlwZWRlZiBf X3VfcXVhZF90IF9fcmxpbTY0X3Q7CQkgCnR5cGVkZWYgX191X2ludCBfX2lkX3Q7CQkJIAoKdHlw ZWRlZiBzdHJ1Y3QKICB7CiAgICBpbnQgX192YWxbMl07CiAgfSBfX2ZzaWRfdDsJCQkJIAoKIAp0 eXBlZGVmIGludCBfX2RhZGRyX3Q7CQkJIAp0eXBlZGVmIGNoYXIgKl9fY2FkZHJfdDsKdHlwZWRl ZiBsb25nIGludCBfX3RpbWVfdDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX191c2Vjb25kc190Owp0 eXBlZGVmIGxvbmcgaW50IF9fc3VzZWNvbmRzX3Q7CnR5cGVkZWYgbG9uZyBpbnQgX19zd2Jsa190 OwkJIAoMCnR5cGVkZWYgbG9uZyBpbnQgX19jbG9ja190OwoKIAp0eXBlZGVmIGludCBfX2Nsb2Nr aWRfdDsKCiAKdHlwZWRlZiBpbnQgX190aW1lcl90OwoKCiAKCgoKdHlwZWRlZiBpbnQgX19rZXlf dDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX19pcGNfcGlkX3Q7CgoKIAp0eXBlZGVm IGxvbmcgaW50IF9fYmxrc2l6ZV90OwoKIAoKIAp0eXBlZGVmIGxvbmcgaW50IF9fYmxrY250X3Q7 CnR5cGVkZWYgX19xdWFkX3QgX19ibGtjbnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9sb25nIF9fZnNi bGtjbnRfdDsKdHlwZWRlZiBfX3VfcXVhZF90IF9fZnNibGtjbnQ2NF90OwoKIAp0eXBlZGVmIF9f dV9sb25nIF9fZnNmaWxjbnRfdDsKdHlwZWRlZiBfX3VfcXVhZF90IF9fZnNmaWxjbnQ2NF90OwoK IAp0eXBlZGVmIF9fdV9xdWFkX3QgX19pbm82NF90OwoKIAp0eXBlZGVmIF9fbG9mZl90IF9fb2Zm NjRfdDsKCiAKdHlwZWRlZiBsb25nIGludCBfX3Rfc2NhbGFyX3Q7CnR5cGVkZWYgdW5zaWduZWQg bG9uZyBpbnQgX190X3VzY2FsYXJfdDsKCiAKdHlwZWRlZiBpbnQgX19pbnRwdHJfdDsKCiAKdHlw ZWRlZiB1bnNpZ25lZCBpbnQgX19zb2NrbGVuX3Q7CgoKIAoKIyAxICIvdXNyL2luY2x1ZGUvYml0 cy9wdGhyZWFkdHlwZXMuaCIgMSAzCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgoK IyAxICIvdXNyL2luY2x1ZGUvYml0cy9zY2hlZC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoK IyA2MiAiL3Vzci9pbmNsdWRlL2JpdHMvc2NoZWQuaCIgMwoKCgoKCiAKc3RydWN0IF9fc2NoZWRf cGFyYW0KICB7CiAgICBpbnQgX19zY2hlZF9wcmlvcml0eTsKICB9OwoKCiMgMjMgIi91c3IvaW5j bHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAyIDMKCgogCnN0cnVjdCBfcHRocmVhZF9mYXN0bG9j awp7CiAgbG9uZyBpbnQgX19zdGF0dXM7ICAgIAogIGludCBfX3NwaW5sb2NrOyAgICAgICAKCn07 CgoKIAp0eXBlZGVmIHN0cnVjdCBfcHRocmVhZF9kZXNjcl9zdHJ1Y3QgKl9wdGhyZWFkX2Rlc2Ny OwoKCgoKIAp0eXBlZGVmIHN0cnVjdCBfX3B0aHJlYWRfYXR0cl9zCnsKICBpbnQgX19kZXRhY2hz dGF0ZTsKICBpbnQgX19zY2hlZHBvbGljeTsKICBzdHJ1Y3QgX19zY2hlZF9wYXJhbSBfX3NjaGVk cGFyYW07CiAgaW50IF9faW5oZXJpdHNjaGVkOwogIGludCBfX3Njb3BlOwogIHNpemVfdCBfX2d1 YXJkc2l6ZTsKICBpbnQgX19zdGFja2FkZHJfc2V0OwogIHZvaWQgKl9fc3RhY2thZGRyOwogIHNp emVfdCBfX3N0YWNrc2l6ZTsKfSBwdGhyZWFkX2F0dHJfdDsKCgogCnR5cGVkZWYgc3RydWN0CnsK ICBzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19jX2xvY2s7ICAKICBfcHRocmVhZF9kZXNjciBf X2Nfd2FpdGluZzsgICAgICAgICAKfSBwdGhyZWFkX2NvbmRfdDsKCgogCnR5cGVkZWYgc3RydWN0 CnsKICBpbnQgX19kdW1teTsKfSBwdGhyZWFkX2NvbmRhdHRyX3Q7CgogCnR5cGVkZWYgdW5zaWdu ZWQgaW50IHB0aHJlYWRfa2V5X3Q7CgoKIAogCgp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IF9fbV9y ZXNlcnZlZDsgICAgICAgICAgICAgICAgCiAgaW50IF9fbV9jb3VudDsgICAgICAgICAgICAgICAg ICAgCiAgX3B0aHJlYWRfZGVzY3IgX19tX293bmVyOyAgICAgICAgCiAgaW50IF9fbV9raW5kOyAg ICAgICAgICAgICAgICAgICAgCiAgc3RydWN0IF9wdGhyZWFkX2Zhc3Rsb2NrIF9fbV9sb2NrOyAg Cn0gcHRocmVhZF9tdXRleF90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QKewogIGludCBfX211dGV4a2lu ZDsKfSBwdGhyZWFkX211dGV4YXR0cl90OwoKCiAKdHlwZWRlZiBpbnQgcHRocmVhZF9vbmNlX3Q7 CgoKIyAxMTcgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAzCgoKIyAxMzYgIi91 c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAzCgoKCiAKdHlwZWRlZiB1bnNpZ25lZCBs b25nIGludCBwdGhyZWFkX3Q7CgoKIyAxNDMgIi91c3IvaW5jbHVkZS9iaXRzL3R5cGVzLmgiIDIg MwoKCgoKIyAzNSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDIgMwoKCgoKCgoKCiAKdHlwZWRlZiBz dHJ1Y3QgX0lPX0ZJTEUgRklMRTsKCgoKCgoKCgogCnR5cGVkZWYgc3RydWN0IF9JT19GSUxFIF9f RklMRTsKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL19HX2NvbmZpZy5oIiAxIDMKIAoK CgoKCiAKCgoKCgoKIyAxICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251 LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbG9jYWwv bGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMK CgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxp bnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBj LWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCgojIDE4OCAiL3Vz ci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCgoKCiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgdW5z aWduZWQgaW50ICB3aW50X3Q7CgoKCgogCgogCgojIDMxNyAiL3Vzci9sb2NhbC9saWIvZ2NjLWxp Yi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgojIDE0ICIvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgiIDIgMwoKCgoK CgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgog CgoKCgoKCgoKCgoKIyA0NiAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDMKCgojIDEgIi91c3IvbG9j YWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgi IDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4 LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIv dXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzIuOTUuMy9pbmNsdWRlL3N0 ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAKCiMgMTMx ICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKIAoKIAoKIyAxOTAgIi91c3IvbG9jYWwvbGliL2djYy1saWIvaTY4Ni1w Yy1saW51eC1nbnUvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCgoKIAoKIyAyNzEg Ii91c3IvbG9jYWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1ZGUv c3RkZGVmLmgiIDMKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9sb2NhbC9saWIvZ2Nj LWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgojIDQ4ICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMiAzCgoKIyAx ICIvdXNyL2luY2x1ZGUvYml0cy93Y2hhci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIyA1MCAiL3Vzci9pbmNsdWRlL3djaGFyLmgiIDIgMwoKCiAKCgoKCgoKCgoKCgoKCiAKdHlw ZWRlZiBzdHJ1Y3QKewogIGludCBfX2NvdW50OwogIHVuaW9uCiAgewogICAgd2ludF90IF9fd2No OwogICAgY2hhciBfX3djaGJbNF07CiAgfSBfX3ZhbHVlOwkJIAp9IF9fbWJzdGF0ZV90OwoKCgoK IAoKIyA2ODMgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAzCgoKCiMgMjQgIi91c3IvaW5jbHVkZS9f R19jb25maWcuaCIgMiAzCgoKdHlwZWRlZiBzdHJ1Y3QKewogIF9fb2ZmX3QgX19wb3M7CiAgX19t YnN0YXRlX3QgX19zdGF0ZTsKfSBfR19mcG9zX3Q7CnR5cGVkZWYgc3RydWN0CnsKICBfX29mZjY0 X3QgX19wb3M7CiAgX19tYnN0YXRlX3QgX19zdGF0ZTsKfSBfR19mcG9zNjRfdDsKCgoKCgoKCgoj IDEgIi91c3IvaW5jbHVkZS9nY29udi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoK CgojIDEgIi91c3IvaW5jbHVkZS93Y2hhci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoK CgoKCgoKCgojIDQ2ICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMwoKCiMgMSAiL3Vzci9sb2NhbC9s aWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAz CgoKCgoKCiAKCgojIDE5ICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251 LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3Iv bG9jYWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1ZGUvc3RkZGVm LmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKIyAxMzEgIi91 c3IvbG9jYWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1ZGUvc3Rk ZGVmLmgiIDMKCgogCgogCgojIDE5MCAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxp bnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKCgogCgojIDI3MSAiL3Vz ci9sb2NhbC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCgoKCgoKCgoKCgoKCiAKCiAKCiMgMzE3ICIvdXNyL2xvY2FsL2xpYi9nY2MtbGli L2k2ODYtcGMtbGludXgtZ251LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiMgNDggIi91c3IvaW5jbHVkZS93Y2hhci5oIiAyIDMKCgoKCiAKCgoK CgoKCgoKCgojIDc2ICIvdXNyL2luY2x1ZGUvd2NoYXIuaCIgMwoKCgoKIAoKIyA2ODMgIi91c3Iv aW5jbHVkZS93Y2hhci5oIiAzCgoKCiMgMjggIi91c3IvaW5jbHVkZS9nY29udi5oIiAyIDMKCgoj IDEgIi91c3IvbG9jYWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9sb2NhbC9saWIvZ2NjLWxpYi9p Njg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgogCgoKIAoKCgoK CiAKCgojIDYxICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzIuOTUu My9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoK CiAKCiAKCiMgMTMxICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzIu OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xvY2FsL2xpYi9n Y2MtbGliL2k2ODYtcGMtbGludXgtZ251LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoK IAoKCgoKIAoKIyAyNzEgIi91c3IvbG9jYWwvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUv Mi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgojIDI4MyAiL3Vzci9sb2NhbC9saWIvZ2NjLWxp Yi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMg MzE3ICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzIuOTUuMy9pbmNs dWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMzAgIi91c3IvaW5j bHVkZS9nY29udi5oIiAyIDMKCgogCgoKIAplbnVtCnsKICBfX0dDT05WX09LID0gMCwKICBfX0dD T05WX05PQ09OViwKICBfX0dDT05WX05PREIsCiAgX19HQ09OVl9OT01FTSwKCiAgX19HQ09OVl9F TVBUWV9JTlBVVCwKICBfX0dDT05WX0ZVTExfT1VUUFVULAogIF9fR0NPTlZfSUxMRUdBTF9JTlBV VCwKICBfX0dDT05WX0lOQ09NUExFVEVfSU5QVVQsCgogIF9fR0NPTlZfSUxMRUdBTF9ERVNDUklQ VE9SLAogIF9fR0NPTlZfSU5URVJOQUxfRVJST1IKfTsKCgogCmVudW0KewogIF9fR0NPTlZfSVNf TEFTVCA9IDB4MDAwMSwKICBfX0dDT05WX0lHTk9SRV9FUlJPUlMgPSAweDAwMDIKfTsKCgogCnN0 cnVjdCBfX2djb252X3N0ZXA7CnN0cnVjdCBfX2djb252X3N0ZXBfZGF0YTsKc3RydWN0IF9fZ2Nv bnZfbG9hZGVkX29iamVjdDsKc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YTsKCgogCnR5cGVkZWYg aW50ICgqX19nY29udl9mY3QpIChzdHJ1Y3QgX19nY29udl9zdGVwICosIHN0cnVjdCBfX2djb252 X3N0ZXBfZGF0YSAqLAoJCQkgICAgX19jb25zdCB1bnNpZ25lZCBjaGFyICoqLCBfX2NvbnN0IHVu c2lnbmVkIGNoYXIgKiwKCQkJICAgIHVuc2lnbmVkIGNoYXIgKiosIHNpemVfdCAqLCBpbnQsIGlu dCk7CgogCnR5cGVkZWYgaW50ICgqX19nY29udl9pbml0X2ZjdCkgKHN0cnVjdCBfX2djb252X3N0 ZXAgKik7CnR5cGVkZWYgdm9pZCAoKl9fZ2NvbnZfZW5kX2ZjdCkgKHN0cnVjdCBfX2djb252X3N0 ZXAgKik7CgoKIAp0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJhbnNfZmN0KSAoc3RydWN0IF9fZ2Nv bnZfc3RlcCAqLAoJCQkJICBzdHJ1Y3QgX19nY29udl9zdGVwX2RhdGEgKiwgdm9pZCAqLAoJCQkJ ICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwKCQkJCSAgX19jb25zdCB1bnNpZ25lZCBjaGFyICoq LAoJCQkJICBfX2NvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKiwKCQkJCSAg c2l6ZV90ICopOwoKIAp0eXBlZGVmIGludCAoKl9fZ2NvbnZfdHJhbnNfY29udGV4dF9mY3QpICh2 b2lkICosIF9fY29uc3QgdW5zaWduZWQgY2hhciAqLAoJCQkJCSAgX19jb25zdCB1bnNpZ25lZCBj aGFyICosCgkJCQkJICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKik7CgogCnR5cGVk ZWYgaW50ICgqX19nY29udl90cmFuc19xdWVyeV9mY3QpIChfX2NvbnN0IGNoYXIgKiwgX19jb25z dCBjaGFyICoqKiwKCQkJCQlzaXplX3QgKik7CgogCnR5cGVkZWYgaW50ICgqX19nY29udl90cmFu c19pbml0X2ZjdCkgKHZvaWQgKiosIGNvbnN0IGNoYXIgKik7CnR5cGVkZWYgdm9pZCAoKl9fZ2Nv bnZfdHJhbnNfZW5kX2ZjdCkgKHZvaWQgKik7CgpzdHJ1Y3QgX19nY29udl90cmFuc19kYXRhCnsK ICAgCiAgX19nY29udl90cmFuc19mY3QgX190cmFuc19mY3Q7CiAgX19nY29udl90cmFuc19jb250 ZXh0X2ZjdCBfX3RyYW5zX2NvbnRleHRfZmN0OwogIF9fZ2NvbnZfdHJhbnNfZW5kX2ZjdCBfX3Ry YW5zX2VuZF9mY3Q7CiAgdm9pZCAqX19kYXRhOwogIHN0cnVjdCBfX2djb252X3RyYW5zX2RhdGEg Kl9fbmV4dDsKfTsKCgogCnN0cnVjdCBfX2djb252X3N0ZXAKewogIHN0cnVjdCBfX2djb252X2xv YWRlZF9vYmplY3QgKl9fc2hsaWJfaGFuZGxlOwogIF9fY29uc3QgY2hhciAqX19tb2RuYW1lOwoK ICBpbnQgX19jb3VudGVyOwoKICBjaGFyICpfX2Zyb21fbmFtZTsKICBjaGFyICpfX3RvX25hbWU7 CgogIF9fZ2NvbnZfZmN0IF9fZmN0OwogIF9fZ2NvbnZfaW5pdF9mY3QgX19pbml0X2ZjdDsKICBf X2djb252X2VuZF9mY3QgX19lbmRfZmN0OwoKICAgCgogIGludCBfX21pbl9uZWVkZWRfZnJvbTsK ICBpbnQgX19tYXhfbmVlZGVkX2Zyb207CiAgaW50IF9fbWluX25lZWRlZF90bzsKICBpbnQgX19t YXhfbmVlZGVkX3RvOwoKICAgCiAgaW50IF9fc3RhdGVmdWw7CgogIHZvaWQgKl9fZGF0YTsJCSAK fTsKCiAKCnN0cnVjdCBfX2djb252X3N0ZXBfZGF0YQp7CiAgdW5zaWduZWQgY2hhciAqX19vdXRi dWY7ICAgICAKICB1bnNpZ25lZCBjaGFyICpfX291dGJ1ZmVuZDsgIAoKCiAgIAogIGludCBfX2Zs YWdzOwoKICAgCgogIGludCBfX2ludm9jYXRpb25fY291bnRlcjsKCiAgIAoKICBpbnQgX19pbnRl cm5hbF91c2U7CgogIF9fbWJzdGF0ZV90ICpfX3N0YXRlcDsKICBfX21ic3RhdGVfdCBfX3N0YXRl OwkgCgoKICAgCiAgc3RydWN0IF9fZ2NvbnZfdHJhbnNfZGF0YSAqX190cmFuczsKfTsKCgogCnR5 cGVkZWYgc3RydWN0IF9fZ2NvbnZfaW5mbwp7CiAgc2l6ZV90IF9fbnN0ZXBzOwogIHN0cnVjdCBf X2djb252X3N0ZXAgKl9fc3RlcHM7CiAgX19leHRlbnNpb25fXyBzdHJ1Y3QgX19nY29udl9zdGVw X2RhdGEgX19kYXRhIFswXSA7Cn0gKl9fZ2NvbnZfdDsKCgojIDQ0ICIvdXNyL2luY2x1ZGUvX0df Y29uZmlnLmgiIDIgMwoKdHlwZWRlZiB1bmlvbgp7CiAgc3RydWN0IF9fZ2NvbnZfaW5mbyBfX2Nk OwogIHN0cnVjdAogIHsKICAgIHN0cnVjdCBfX2djb252X2luZm8gX19jZDsKICAgIHN0cnVjdCBf X2djb252X3N0ZXBfZGF0YSBfX2RhdGE7CiAgfSBfX2NvbWJpbmVkOwp9IF9HX2ljb252X3Q7Cgp0 eXBlZGVmIGludCBfR19pbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ISV9fKSkp Owp0eXBlZGVmIGludCBfR19pbnQzMl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19TSV9f KSkpOwp0eXBlZGVmIHVuc2lnbmVkIGludCBfR191aW50MTZfdCBfX2F0dHJpYnV0ZV9fICgoX19t b2RlX18gKF9fSElfXykpKTsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgX0dfdWludDMyX3QgX19hdHRy aWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7CgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAK CgoKCiAKCgoKCgoKCgoKCgoKCgojIDMwICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMiAzCgogCgoK CgoKCgoKCgoKCgoKCgoKIAoKIyAxICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGlu dXgtZ251LzIuOTUuMy9pbmNsdWRlL3N0ZGFyZy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgp0eXBl ZGVmIHZvaWQgKl9fZ251Y192YV9saXN0OwoKCgogCgojIDEyMiAiL3Vzci9sb2NhbC9saWIvZ2Nj LWxpYi9pNjg2LXBjLWxpbnV4LWdudS8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCgoKCgoK CgoKCgoKCgoKCgoKCiMgMjA5ICIvdXNyL2xvY2FsL2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgt Z251LzIuOTUuMy9pbmNsdWRlL3N0ZGFyZy5oIiAzCgoKCgojIDUxICIvdXNyL2luY2x1ZGUvbGli aW8uaCIgMiAzCgoKCgoKCgojIDcwICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMwoKCiAKCgoKCgoK CgoKCgoKCgoKCgojIDEwMSAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMKCgoKCgoKCgoKCgogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgpzdHJ1Y3QgX0lPX2p1 bXBfdDsgIHN0cnVjdCBfSU9fRklMRTsKCiAKCgoKCgoKCnR5cGVkZWYgdm9pZCBfSU9fbG9ja190 OwoKCgogCgpzdHJ1Y3QgX0lPX21hcmtlciB7CiAgc3RydWN0IF9JT19tYXJrZXIgKl9uZXh0Owog IHN0cnVjdCBfSU9fRklMRSAqX3NidWY7CiAgIAoKICAgCiAgaW50IF9wb3M7CiMgMTkwICIvdXNy L2luY2x1ZGUvbGliaW8uaCIgMwoKfTsKCiAKZW51bSBfX2NvZGVjdnRfcmVzdWx0CnsKICBfX2Nv ZGVjdnRfb2ssCiAgX19jb2RlY3Z0X3BhcnRpYWwsCiAgX19jb2RlY3Z0X2Vycm9yLAogIF9fY29k ZWN2dF9ub2NvbnYKfTsKCiMgMjU3ICIvdXNyL2luY2x1ZGUvbGliaW8uaCIgMwoKCnN0cnVjdCBf SU9fRklMRSB7CiAgaW50IF9mbGFnczsJCSAKCgogICAKICAgCiAgY2hhciogX0lPX3JlYWRfcHRy OwkgCiAgY2hhciogX0lPX3JlYWRfZW5kOwkgCiAgY2hhciogX0lPX3JlYWRfYmFzZTsJIAogIGNo YXIqIF9JT193cml0ZV9iYXNlOwkgCiAgY2hhciogX0lPX3dyaXRlX3B0cjsJIAogIGNoYXIqIF9J T193cml0ZV9lbmQ7CSAKICBjaGFyKiBfSU9fYnVmX2Jhc2U7CSAKICBjaGFyKiBfSU9fYnVmX2Vu ZDsJIAogICAKICBjaGFyICpfSU9fc2F2ZV9iYXNlOyAgCiAgY2hhciAqX0lPX2JhY2t1cF9iYXNl OyAgIAogIGNoYXIgKl9JT19zYXZlX2VuZDsgIAoKICBzdHJ1Y3QgX0lPX21hcmtlciAqX21hcmtl cnM7CgogIHN0cnVjdCBfSU9fRklMRSAqX2NoYWluOwoKICBpbnQgX2ZpbGVubzsKICBpbnQgX2Js a3NpemU7CiAgX19vZmZfdCAgIF9vbGRfb2Zmc2V0OyAgCgoKICAgCiAgdW5zaWduZWQgc2hvcnQg X2N1cl9jb2x1bW47CiAgc2lnbmVkIGNoYXIgX3Z0YWJsZV9vZmZzZXQ7CiAgY2hhciBfc2hvcnRi dWZbMV07CgogICAKCiAgX0lPX2xvY2tfdCAqX2xvY2s7CgoKCgoKCgoKICBfX29mZjY0X3QgICBf b2Zmc2V0OwoKCgoKCiAgdm9pZCAqX19wYWQxOwogIHZvaWQgKl9fcGFkMjsKCiAgaW50IF9tb2Rl OwogICAKICBjaGFyIF91bnVzZWQyWzE1ICogc2l6ZW9mIChpbnQpIC0gMiAqIHNpemVvZiAodm9p ZCAqKV07Cgp9OwoKCgoKCnN0cnVjdCBfSU9fRklMRV9wbHVzOwoKZXh0ZXJuIHN0cnVjdCBfSU9f RklMRV9wbHVzIF9JT18yXzFfc3RkaW5fOwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lP XzJfMV9zdGRvdXRfOwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRlcnJf OwoKCgoKCgoKCgoKCiAKCiAKCnR5cGVkZWYgX19zc2l6ZV90IF9faW9fcmVhZF9mbiAodm9pZCAq X19jb29raWUsIGNoYXIgKl9fYnVmLCBzaXplX3QgX19uYnl0ZXMpOwoKIAoKCgoKCnR5cGVkZWYg X19zc2l6ZV90IF9faW9fd3JpdGVfZm4gKHZvaWQgKl9fY29va2llLCBfX2NvbnN0IGNoYXIgKl9f YnVmLAoJCQkJIHNpemVfdCBfX24pOwoKIAoKCgoKCnR5cGVkZWYgaW50IF9faW9fc2Vla19mbiAo dm9pZCAqX19jb29raWUsIF9fb2ZmNjRfdCAgICpfX3BvcywgaW50IF9fdyk7CgogCnR5cGVkZWYg aW50IF9faW9fY2xvc2VfZm4gKHZvaWQgKl9fY29va2llKTsKCgojIDM4NyAiL3Vzci9pbmNsdWRl L2xpYmlvLmgiIDMKCgoKCmV4dGVybiAiQyIgewoKCmV4dGVybiBpbnQgX191bmRlcmZsb3cgKF9J T19GSUxFICopIHRocm93ICgpIDsKZXh0ZXJuIGludCBfX3VmbG93IChfSU9fRklMRSAqKSB0aHJv dyAoKSA7CmV4dGVybiBpbnQgX19vdmVyZmxvdyAoX0lPX0ZJTEUgKiwgaW50KSB0aHJvdyAoKSA7 CmV4dGVybiB3aW50X3QgICBfX3d1bmRlcmZsb3cgKF9JT19GSUxFICopIHRocm93ICgpIDsKZXh0 ZXJuIHdpbnRfdCAgIF9fd3VmbG93IChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CmV4dGVybiB3aW50 X3QgICBfX3dvdmVyZmxvdyAoX0lPX0ZJTEUgKiwgd2ludF90ICApIHRocm93ICgpIDsKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKZXh0ZXJuIGludCBfSU9fZ2V0YyAoX0lPX0ZJTEUgKl9fZnApIHRo cm93ICgpIDsKZXh0ZXJuIGludCBfSU9fcHV0YyAoaW50IF9fYywgX0lPX0ZJTEUgKl9fZnApIHRo cm93ICgpIDsKZXh0ZXJuIGludCBfSU9fZmVvZiAoX0lPX0ZJTEUgKl9fZnApIHRocm93ICgpIDsK ZXh0ZXJuIGludCBfSU9fZmVycm9yIChfSU9fRklMRSAqX19mcCkgdGhyb3cgKCkgOwoKZXh0ZXJu IGludCBfSU9fcGVla2NfbG9ja2VkIChfSU9fRklMRSAqX19mcCkgdGhyb3cgKCkgOwoKIAoKCgpl eHRlcm4gdm9pZCBfSU9fZmxvY2tmaWxlIChfSU9fRklMRSAqKSB0aHJvdyAoKSA7CmV4dGVybiB2 b2lkIF9JT19mdW5sb2NrZmlsZSAoX0lPX0ZJTEUgKikgdGhyb3cgKCkgOwpleHRlcm4gaW50IF9J T19mdHJ5bG9ja2ZpbGUgKF9JT19GSUxFICopIHRocm93ICgpIDsKCgoKCgoKCgoKCgoKCgoKCmV4 dGVybiBpbnQgX0lPX3Zmc2NhbmYgKF9JT19GSUxFICogX19yZXN0cmljdCwgY29uc3QgY2hhciAq IF9fcmVzdHJpY3QsCgkJCV9fZ251Y192YV9saXN0ICwgaW50ICpfX3Jlc3RyaWN0KSB0aHJvdyAo KSA7CmV4dGVybiBpbnQgX0lPX3ZmcHJpbnRmIChfSU9fRklMRSAqX19yZXN0cmljdCwgY29uc3Qg Y2hhciAqX19yZXN0cmljdCwKCQkJIF9fZ251Y192YV9saXN0ICkgdGhyb3cgKCkgOwpleHRlcm4g X19zc2l6ZV90ICAgX0lPX3BhZG4gKF9JT19GSUxFICosIGludCwgX19zc2l6ZV90ICApIHRocm93 ICgpIDsKZXh0ZXJuIHNpemVfdCAgIF9JT19zZ2V0biAoX0lPX0ZJTEUgKiwgdm9pZCAqLCBzaXpl X3QgICkgdGhyb3cgKCkgOwoKZXh0ZXJuIF9fb2ZmNjRfdCAgIF9JT19zZWVrb2ZmIChfSU9fRklM RSAqLCBfX29mZjY0X3QgICwgaW50LCBpbnQpIHRocm93ICgpIDsKZXh0ZXJuIF9fb2ZmNjRfdCAg IF9JT19zZWVrcG9zIChfSU9fRklMRSAqLCBfX29mZjY0X3QgICwgaW50KSB0aHJvdyAoKSA7Cgpl eHRlcm4gdm9pZCBfSU9fZnJlZV9iYWNrdXBfYXJlYSAoX0lPX0ZJTEUgKikgdGhyb3cgKCkgOwoK IyA1MDcgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKCn0KCgoKIyA2NCAiL3Vzci9pbmNsdWRl L3N0ZGlvLmgiIDIgMwoKCiMgNzUgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAzCgoKIAoKdHlwZWRl ZiBfR19mcG9zX3QgZnBvc190OwoKCgoKCgoKIAoKCgoKCiAKCgoKCgogCgoKCgoKCiAKCgoKCgoK CiAKCgoKCiAKCgoKCgoKCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3N0ZGlvX2xpbS5oIiAxIDMK IAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxMjggIi91c3IvaW5j bHVkZS9zdGRpby5oIiAyIDMKCgoKIApleHRlcm4gRklMRSAqc3RkaW47CQkgCmV4dGVybiBGSUxF ICpzdGRvdXQ7CQkgCmV4dGVybiBGSUxFICpzdGRlcnI7CQkgCgogCgoKCgoKIApleHRlcm4gaW50 IHJlbW92ZSAoX19jb25zdCBjaGFyICpfX2ZpbGVuYW1lKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGlu dCByZW5hbWUgKF9fY29uc3QgY2hhciAqX19vbGQsIF9fY29uc3QgY2hhciAqX19uZXcpIHRocm93 ICgpIDsKCgogCgpleHRlcm4gRklMRSAqdG1wZmlsZSAodm9pZCkgdGhyb3cgKCkgOwoKCgoKCgoK CgoKIApleHRlcm4gY2hhciAqdG1wbmFtIChjaGFyICpfX3MpIHRocm93ICgpIDsKCgogCgpleHRl cm4gY2hhciAqdG1wbmFtX3IgKGNoYXIgKl9fcykgdGhyb3cgKCkgOwoKCgoKIAoKCgoKCgpleHRl cm4gY2hhciAqdGVtcG5hbSAoX19jb25zdCBjaGFyICpfX2RpciwgX19jb25zdCBjaGFyICpfX3Bm eCkKICAgICB0aHJvdyAoKSAgIDsKCgoKIApleHRlcm4gaW50IGZjbG9zZSAoRklMRSAqX19zdHJl YW0pIHRocm93ICgpIDsKIApleHRlcm4gaW50IGZmbHVzaCAoRklMRSAqX19zdHJlYW0pIHRocm93 ICgpIDsKCgogCmV4dGVybiBpbnQgZmZsdXNoX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgdGhy b3cgKCkgOwoKCgoKCgoKCgogCmV4dGVybiBGSUxFICpmb3BlbiAoX19jb25zdCBjaGFyICpfX3Jl c3RyaWN0IF9fZmlsZW5hbWUsCgkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVz KSB0aHJvdyAoKSA7CiAKZXh0ZXJuIEZJTEUgKmZyZW9wZW4gKF9fY29uc3QgY2hhciAqX19yZXN0 cmljdCBfX2ZpbGVuYW1lLAoJCSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX21vZGVz LAoJCSAgICAgIEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0pIHRocm93ICgpIDsKIyAyMjEgIi91 c3IvaW5jbHVkZS9zdGRpby5oIiAzCgoKCgoKCgoKCgogCmV4dGVybiBGSUxFICpmZG9wZW4gKGlu dCBfX2ZkLCBfX2NvbnN0IGNoYXIgKl9fbW9kZXMpIHRocm93ICgpIDsKCgojIDI1MCAiL3Vzci9p bmNsdWRlL3N0ZGlvLmgiIDMKCgoKIAoKZXh0ZXJuIHZvaWQgc2V0YnVmIChGSUxFICpfX3Jlc3Ry aWN0IF9fc3RyZWFtLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSB0aHJvdyAoKSA7CiAKCgpleHRl cm4gaW50IHNldHZidWYgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJp Y3QgX19idWYsCgkJICAgIGludCBfX21vZGVzLCBzaXplX3QgX19uKSB0aHJvdyAoKSA7CgoKIAoK ZXh0ZXJuIHZvaWQgc2V0YnVmZmVyIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFyICpf X3Jlc3RyaWN0IF9fYnVmLAoJCSAgICAgICBzaXplX3QgX19zaXplKSB0aHJvdyAoKSA7CgogCmV4 dGVybiB2b2lkIHNldGxpbmVidWYgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCiAKZXh0 ZXJuIGludCBmcHJpbnRmIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAoJCSAgICBfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgdGhyb3cgKCkgOwogCmV4dGVybiBpbnQg cHJpbnRmIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgdGhyb3cgKCkg OwogCmV4dGVybiBpbnQgc3ByaW50ZiAoY2hhciAqX19yZXN0cmljdCBfX3MsCgkJICAgIF9fY29u c3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSB0aHJvdyAoKSA7CgogCmV4dGVybiBp bnQgdmZwcmludGYgKEZJTEUgKl9fcmVzdHJpY3QgX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVzdHJp Y3QgX19mb3JtYXQsCgkJICAgICBfX2dudWNfdmFfbGlzdCAgX19hcmcpIHRocm93ICgpIDsKIApl eHRlcm4gaW50IHZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgX19n bnVjX3ZhX2xpc3QgIF9fYXJnKQogICAgIHRocm93ICgpIDsKIApleHRlcm4gaW50IHZzcHJpbnRm IChjaGFyICpfX3Jlc3RyaWN0IF9fcywgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0 LAoJCSAgICAgX19nbnVjX3ZhX2xpc3QgIF9fYXJnKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gaW50 IHNucHJpbnRmIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVuLAoJCSAgICAg X19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pCiAgICAgdGhyb3cgKCkgIF9f YXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOwoKZXh0ZXJuIGlu dCB2c25wcmludGYgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19tYXhsZW4sCgkJICAg ICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCBfX2dudWNfdmFfbGlzdCAgX19h cmcpCiAgICAgdGhyb3cgKCkgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9f LCAzLCAwKSkpOwoKCiMgMzIyICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoKCgogCmV4dGVybiBp bnQgZnNjYW5mIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLAoJCSAgIF9fY29uc3QgY2hhciAq X19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIGludCBzY2FuZiAo X19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pIHRocm93ICgpIDsKIApleHRl cm4gaW50IHNzY2FuZiAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKCQkgICBfX2NvbnN0 IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgdGhyb3cgKCkgOwoKIyAzNDggIi91c3Iv aW5jbHVkZS9zdGRpby5oIiAzCgoKCiAKZXh0ZXJuIGludCBmZ2V0YyAoRklMRSAqX19zdHJlYW0p IHRocm93ICgpIDsKZXh0ZXJuIGludCBnZXRjIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoK IApleHRlcm4gaW50IGdldGNoYXIgKHZvaWQpIHRocm93ICgpIDsKCiAKCgoKCiAKZXh0ZXJuIGlu dCBnZXRjX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwpleHRlcm4gaW50IGdl dGNoYXJfdW5sb2NrZWQgKHZvaWQpIHRocm93ICgpIDsKCgoKIApleHRlcm4gaW50IGZnZXRjX3Vu bG9ja2VkIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCgogCmV4dGVybiBpbnQgZnB1dGMg KGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CmV4dGVybiBpbnQgcHV0YyAoaW50 IF9fYywgRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCiAKZXh0ZXJuIGludCBwdXRjaGFyIChp bnQgX19jKSB0aHJvdyAoKSA7CgogCgoKCgogCmV4dGVybiBpbnQgZnB1dGNfdW5sb2NrZWQgKGlu dCBfX2MsIEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIGludCBwdXRjX3Vu bG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwpleHRlcm4gaW50IHB1 dGNoYXJfdW5sb2NrZWQgKGludCBfX2MpIHRocm93ICgpIDsKCgoKCiAKZXh0ZXJuIGludCBnZXR3 IChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHB1dHcgKGludCBfX3cs IEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIGNoYXIgKmZnZXRzIChjaGFy ICpfX3Jlc3RyaWN0IF9fcywgaW50IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkKICAg ICB0aHJvdyAoKSA7CgoKCgoKCgogCgpleHRlcm4gY2hhciAqZ2V0cyAoY2hhciAqX19zKSB0aHJv dyAoKSA7CgoKIyA0MzggIi91c3IvaW5jbHVkZS9zdGRpby5oIiAzCgoKCiAKZXh0ZXJuIGludCBm cHV0cyAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgRklMRSAqX19yZXN0cmljdCBfX3N0 cmVhbSkKICAgICB0aHJvdyAoKSA7CgoKCgoKCgogCmV4dGVybiBpbnQgcHV0cyAoX19jb25zdCBj aGFyICpfX3MpIHRocm93ICgpIDsKCgogCmV4dGVybiBpbnQgdW5nZXRjIChpbnQgX19jLCBGSUxF ICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKCiAKZXh0ZXJuIHNpemVfdCBmcmVhZCAodm9pZCAqX19y ZXN0cmljdCBfX3B0ciwgc2l6ZV90IF9fc2l6ZSwKCQkgICAgIHNpemVfdCBfX24sIEZJTEUgKl9f cmVzdHJpY3QgX19zdHJlYW0pIHRocm93ICgpIDsKIApleHRlcm4gc2l6ZV90IGZ3cml0ZSAoX19j b25zdCB2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAoJCSAgICAgIHNpemVf dCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zKSB0aHJvdyAoKSA7CgoKIApleHRlcm4gc2l6ZV90 IGZyZWFkX3VubG9ja2VkICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXplLAoJ CQkgICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSB0aHJvdyAoKSA7 CmV4dGVybiBzaXplX3QgZndyaXRlX3VubG9ja2VkIChfX2NvbnN0IHZvaWQgKl9fcmVzdHJpY3Qg X19wdHIsIHNpemVfdCBfX3NpemUsCgkJCSAgICAgICBzaXplX3QgX19uLCBGSUxFICpfX3Jlc3Ry aWN0IF9fc3RyZWFtKSB0aHJvdyAoKSA7CgoKCiAKZXh0ZXJuIGludCBmc2VlayAoRklMRSAqX19z dHJlYW0sIGxvbmcgaW50IF9fb2ZmLCBpbnQgX193aGVuY2UpIHRocm93ICgpIDsKIApleHRlcm4g bG9uZyBpbnQgZnRlbGwgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7CiAKZXh0ZXJuIHZvaWQg cmV3aW5kIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoKIAoKCgoKCgoKCgoKCgogCmV4dGVy biBpbnQgZmdldHBvcyAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgZnBvc190ICpfX3Jlc3Ry aWN0IF9fcG9zKQogICAgIHRocm93ICgpIDsKIApleHRlcm4gaW50IGZzZXRwb3MgKEZJTEUgKl9f c3RyZWFtLCBfX2NvbnN0IGZwb3NfdCAqX19wb3MpIHRocm93ICgpIDsKIyA1MjEgIi91c3IvaW5j bHVkZS9zdGRpby5oIiAzCgoKCgoKCgoKCgogCmV4dGVybiB2b2lkIGNsZWFyZXJyIChGSUxFICpf X3N0cmVhbSkgdGhyb3cgKCkgOwogCmV4dGVybiBpbnQgZmVvZiAoRklMRSAqX19zdHJlYW0pIHRo cm93ICgpIDsKIApleHRlcm4gaW50IGZlcnJvciAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsK CgogCmV4dGVybiB2b2lkIGNsZWFyZXJyX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgdGhyb3cg KCkgOwpleHRlcm4gaW50IGZlb2ZfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSB0aHJvdyAoKSA7 CmV4dGVybiBpbnQgZmVycm9yX3VubG9ja2VkIChGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgOwoK CgogCmV4dGVybiB2b2lkIHBlcnJvciAoX19jb25zdCBjaGFyICpfX3MpIHRocm93ICgpIDsKCiAK CgpleHRlcm4gaW50IHN5c19uZXJyOwpleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IHN5c19l cnJsaXN0W107CgoKCgoKCgoKIApleHRlcm4gaW50IGZpbGVubyAoRklMRSAqX19zdHJlYW0pIHRo cm93ICgpIDsKCgoKIApleHRlcm4gaW50IGZpbGVub191bmxvY2tlZCAoRklMRSAqX19zdHJlYW0p IHRocm93ICgpIDsKCgoKCgogCmV4dGVybiBGSUxFICpwb3BlbiAoX19jb25zdCBjaGFyICpfX2Nv bW1hbmQsIF9fY29uc3QgY2hhciAqX19tb2RlcykgdGhyb3cgKCkgOwoKIApleHRlcm4gaW50IHBj bG9zZSAoRklMRSAqX19zdHJlYW0pIHRocm93ICgpIDsKCgoKCiAKZXh0ZXJuIGNoYXIgKmN0ZXJt aWQgKGNoYXIgKl9fcykgdGhyb3cgKCkgOwoKCgoKCgoKCgojIDYwMyAiL3Vzci9pbmNsdWRlL3N0 ZGlvLmgiIDMKCgoKCiAKCiAKZXh0ZXJuIHZvaWQgZmxvY2tmaWxlIChGSUxFICpfX3N0cmVhbSkg dGhyb3cgKCkgOwoKIAoKZXh0ZXJuIGludCBmdHJ5bG9ja2ZpbGUgKEZJTEUgKl9fc3RyZWFtKSB0 aHJvdyAoKSA7CgogCmV4dGVybiB2b2lkIGZ1bmxvY2tmaWxlIChGSUxFICpfX3N0cmVhbSkgdGhy b3cgKCkgOwoKCgoKCgoKCgoKIAoKCgoKCn0gCgoKCgojIDEgInRlc3QuY3BwIiAyCgoKIApjbGFz cyBGb29SZWYKewpwdWJsaWM6CiAgRm9vUmVmKGludCBpbmNvbikgOiBjb250ZW50cyhpbmNvbikK ICB7CiAgICBjb3VudCA9IDE7CiAgICBwcmludGYoIigweCUwOHgpIEZvb1JlZiBDVE9SKCVkKVxu IiwgdGhpcywgaW5jb24pOwogIH0KCiAgfkZvb1JlZigpCiAgewogICAgcHJpbnRmKCIoMHglMDh4 KSBGb29SZWYgRFRPUiglZClcbiIsIHRoaXMsIGNvbnRlbnRzKTsKICB9CgogIGludCBjb3VudDsK ICBpbnQgY29udGVudHM7Cgpwcml2YXRlOgogICAKICBGb29SZWYgJm9wZXJhdG9yPShjb25zdCBG b29SZWYgJmluKTsKICBGb29SZWYoY29uc3QgRm9vUmVmICZpbik7Cn07CgogCmNsYXNzIEZvbwp7 CnB1YmxpYzoKICBGb28oaW50IGluY29uID0gMCkKICB7CiAgICByZWYgPSBuZXcgRm9vUmVmKGlu Y29uKTsKICAgIHByaW50ZigiKDB4JTA4eCkgRm9vIENUT1IoJWQpXG4iLCB0aGlzLCBpbmNvbik7 CiAgfQoKICBGb28oY29uc3QgRm9vICZpbikKICB7CiAgICByZWYgPSBpbi5yZWY7CiAgICBpZiAo aW4ucmVmKQogICAgICB7Cglpbi5yZWYtPmNvdW50Kys7CglwcmludGYoIigweCUwOHgpIEZvbyBD b3B5IENUT1IoJWQsIGNvdW50OiVkKVxuIiwgdGhpcywgaW4ucmVmLT5jb250ZW50cywgaW4ucmVm LT5jb3VudCk7CiAgICAgIH0KICB9CgogIEZvbyAmb3BlcmF0b3I9KGNvbnN0IEZvbyAmaW4pCiAg ewogICAgaWYgKHJlZikgewogICAgICBkZWxldGUgcmVmOwogICAgfQoKICAgIHJlZiA9IGluLnJl ZjsKICAgIHJlZi0+Y291bnQrKzsKICAgIHByaW50ZigiKDB4JTA4eCkgRm9vIE9QPSglZCwgY291 bnQ6JWQpXG4iLCB0aGlzLCByZWYtPmNvbnRlbnRzLCByZWYtPmNvdW50KTsNCiAgICANCiAgICBy ZXR1cm4gKnRoaXM7CiAgfQoKICB+Rm9vKCkKICB7CiAgICBwcmludGYoIigweCUwOHgpIEZvbyBE VE9SKCVkLCBjb3VudDolZClcbiIsIHRoaXMsIHJlZi0+Y29udGVudHMsIHJlZi0+Y291bnQtMSk7 CiAgICByZWYtPmNvdW50LS07CgogICAgaWYgKHJlZi0+Y291bnQgPD0gMCkgewogICAgICBkZWxl dGUgcmVmOwogICAgfQogIH0KCiAgRm9vUmVmICpyZWY7Cn07CgpjbGFzcyBCYXIKewpwdWJsaWM6 CiAgQmFyKGludCBpbmNvbnQgPSA5OSkgOiBteUZvbyhpbmNvbnQpCiAgewogICAgcHJpbnRmKCIo MHglMDh4KSBCYXIgQ1RPUiglZClcbiIsIHRoaXMsIG15Rm9vLnJlZi0+Y29udGVudHMpOwogIH0K CiAgQmFyKGNvbnN0IEJhciAmaW4pIDogbXlGb28oaW4ubXlGb28pCiAgewogICAgcHJpbnRmKCIo MHglMDh4KSBCYXIgQ29weSBDVE9SKCVkKVxuIiwgdGhpcywgaW4ubXlGb28ucmVmLT5jb250ZW50 cyk7CiAgfQoKICB+QmFyKCkKICB7CiAgICBwcmludGYoIigweCUwOHgpIEJhciBEVE9SKCVkKVxu IiwgdGhpcywgbXlGb28ucmVmLT5jb250ZW50cyk7CiAgfQoKICB2b2lkIENvcHlGb28oRm9vIHRo aW5nKSB7IG15Rm9vID0gdGhpbmc7IH0KCnB1YmxpYzoKICAgCiAgIAogIEZvbyBteUZvbzsKfTsK CmNsYXNzIFRlc3QKewpwdWJsaWM6CiAgdm9pZCBydW4oKQogIHsKICAgIHByaW50ZigiXG5CdWls ZCBhbiBlbXB0eSBCYXJcbiIpOwogICAgQmFyIGEoMCk7CgogICAgcHJpbnRmKCJcbk5ldyBhIEJh ciB3aXRoIHN0dWZmIGluIGl0XG4iKTsKICAgIGxpc3RbNV0gPSBuZXcgQmFyKDEyMzQpOwoKICAg ICAKICAgICAKCiAgICBwcmludGYoIlxuUFJPQkxFTSBIRVJFLCB1bmJhbGFuY2VkIEZvbyBEVE9S ISFcbiIpOwogICAgYS5Db3B5Rm9vKEdldEJhcig1KS5teUZvbyk7CgogICAgcHJpbnRmKCJcbkRl c3Ryb3kgQmFyIHdpdGggc3R1ZmZcbiIpOwogICAgZGVsZXRlIGxpc3RbNV07CgogICAgcHJpbnRm KCJcbkVuZCBzdGFjay4uLlxuIik7CiAgfQoKICAgCiAgQmFyIEdldEJhcihpbnQgd2hpY2gpIHsg cmV0dXJuICpsaXN0W3doaWNoXTsgfQoKcHJpdmF0ZToKICBCYXIgKmxpc3RbMTBdOwp9OwoKaW50 IG1haW4oKQp7CiAgVGVzdCB0OwogIHQucnVuKCk7Cn0K