From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3336 invoked by alias); 3 Nov 2002 17:26:02 -0000 Mailing-List: contact gcc-prs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-prs-owner@gcc.gnu.org Received: (qmail 3308 invoked by uid 71); 3 Nov 2002 17:26:01 -0000 Resent-Date: 3 Nov 2002 17:26:01 -0000 Resent-Message-ID: <20021103172601.3305.qmail@sources.redhat.com> Resent-From: gcc-gnats@gcc.gnu.org (GNATS Filer) Resent-Cc: gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org Resent-Reply-To: gcc-gnats@gcc.gnu.org, bennyb@ntplx.net Received: (qmail 2428 invoked by uid 61); 3 Nov 2002 17:18:40 -0000 Message-Id: <20021103171840.2427.qmail@sources.redhat.com> Date: Sun, 03 Nov 2002 09:26:00 -0000 From: bennyb@ntplx.net Reply-To: bennyb@ntplx.net To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8438: Internal compiler error building Trolltech Qt library X-SW-Source: 2002-11/txt/msg00128.txt.bz2 List-Id: >Number: 8438 >Category: c++ >Synopsis: Internal compiler error building Trolltech Qt library >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: rejects-legal >Submitter-Id: net >Arrival-Date: Sun Nov 03 09:26:01 PST 2002 >Closed-Date: >Last-Modified: >Originator: Ben Bridgwater >Release: gcc version 2.95.3 19991030 (prerelease) >Organization: >Environment: Linux Mandrake 7.1 gcc 2.95.3 as came with Mandrake 7.1 >Description: Compiling latest Trolltech Qt library 3.0.6, get internal compiler error: /usr/local/qt/include/qvaluevector.h: In method `QValueVectorPrivate::QValueVectorPrivate(const QValueVectorPrivate &)': /usr/local/qt/include/qvaluevector.h:476: instantiated from `QValueVector::detachInternal()' /usr/local/qt/include/qvaluevector.h:459: instantiated from here /usr/local/qt/include/qvaluevector.h:125: Internal compiler error. /usr/local/qt/include/qvaluevector.h:125: Please submit a full bug report. /usr/local/qt/include/qvaluevector.h:125: See for instructions. >How-To-Repeat: Using attached chartform_files.ii file generated usign -save-temps : g++ -c -pipe -Wall -W -O2 -D_REENTRANT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -o .obj/release-shared-mt/chartform_files.o chartform_files.ii >Fix: Use earlier 3.0.4 (vs 3.0.6) version of Qt library, which compiles cleanly with this version of compiler. >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="chartform_files.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="chartform_files.ii" IyAxICJjaGFydGZvcm1fZmlsZXMuY3BwIgojIDEgImNhbnZhc3ZpZXcuaCIgMQoKCgojIDEgImVs ZW1lbnQuaCIgMQoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xY29sb3IuaCIgMQogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQv aW5jbHVkZS9xd2luZG93ZGVmcy5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xb2JqZWN0ZGVmcy5oIiAxCiAK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3FnbG9iYWwuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgogCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDExOCAi L3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FnbG9iYWwuaCIKCgojIDE2MyAiL3Vzci9sb2NhbC9xdC9p bmNsdWRlL3FnbG9iYWwuaCIKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIAojIDI2MCAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FnbG9iYWwuaCIKCgoKCgoKCgoKCiAK CgoKCgoKCgoKCgoKCgoKCgoKCiMgNDI2ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdsb2JhbC5o IgoKCgoKCgoKIAoKCgoKCgoKCgoKCiMgNDYyICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdsb2Jh bC5oIgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCiAKIAogCgoKCgoKCgoKCgp0eXBl ZGVmIHVuc2lnbmVkIGNoYXIgICB1Y2hhcjsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgdXNob3J0 Owp0eXBlZGVmIHVuc2lnbmVkCXVpbnQ7CnR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIHVsb25nOwp0 eXBlZGVmIGNoYXIJCSAgICpwY2hhcjsKdHlwZWRlZiB1Y2hhcgkJICAgKnB1Y2hhcjsKdHlwZWRl ZiBjb25zdCBjaGFyICAgICAqcGNjaGFyOwoKCiAKIAogCgoKY29uc3QgYm9vbCBGQUxTRSA9IDA7 CmNvbnN0IGJvb2wgVFJVRSA9ICEwOwoKCgoKCgoKCiAKIAogCgoKCgoKCgoKCgogCiAKIAoKCgoK CmlubGluZSBpbnQgcVJvdW5kKCBkb3VibGUgZCApCnsKICAgIHJldHVybiBpbnQoIGQgPj0gMC4w ID8gZCArIDAuNSA6IGQgLSAwLjUgKTsKfQoKCiAKIAogCgoKIAp0eXBlZGVmIHNpZ25lZCBjaGFy CSAgICBJTlQ4OwkJICAKdHlwZWRlZiB1bnNpZ25lZCBjaGFyCSAgIFVJTlQ4OwkJIAp0eXBlZGVm IHNob3J0CQkgICAgSU5UMTY7CSAgCnR5cGVkZWYgdW5zaWduZWQgc2hvcnQJICAgVUlOVDE2Owkg CnR5cGVkZWYgaW50CQlJTlQzMjsJICAgCnR5cGVkZWYgdW5zaWduZWQgaW50CSAgIFVJTlQzMjsJ IAoKCnR5cGVkZWYgc2lnbmVkIGNoYXIJICAgIFFfSU5UODsJICAKdHlwZWRlZiB1bnNpZ25lZCBj aGFyCSAgIFFfVUlOVDg7CSAKdHlwZWRlZiBzaG9ydAkJICAgIFFfSU5UMTY7CSAgCnR5cGVkZWYg dW5zaWduZWQgc2hvcnQJICAgUV9VSU5UMTY7CSAKdHlwZWRlZiBpbnQJCVFfSU5UMzI7CSAgIAp0 eXBlZGVmIHVuc2lnbmVkIGludAkgICBRX1VJTlQzMjsJIAoKCgoKCiAKdHlwZWRlZiBsb25nCQkg ICAgUV9MT05HOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcJICAgUV9VTE9ORzsKCgoKIAoKCgoKCiAK IAogCgpjbGFzcyBRRGF0YVN0cmVhbTsKCgogCiAKIAoKCgoKCiAKIAogCiAKIAogCiAKIAoKIyA2 MjggIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZ2xvYmFsLmgiCgojIDEgIi91c3IvbG9jYWwvcXQv aW5jbHVkZS9xY29uZmlnLmgiIDEKIAoKIAoKCgoKIyA2MjkgIi91c3IvbG9jYWwvcXQvaW5jbHVk ZS9xZ2xvYmFsLmgiIDIKCgoKCgoKCgoKIAojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbW9k dWxlcy5oIiAxCiAKCgoKCgoKCgoKCgoKCgogCiMgNjM5ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUv cWdsb2JhbC5oIiAyCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyA2NzcgIi91c3IvbG9jYWwv cXQvaW5jbHVkZS9xZ2xvYmFsLmgiCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1 ZGUvcWZlYXR1cmVzLmgiIDEKIAogCiAKIAogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgog CiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAog CgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoK IAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAK IAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAKCiAKIAoKIAogCgogCiAK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAK CgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoKCiAKCgoK CiAKCgoKCiMgNjg4ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdsb2JhbC5oIiAyCgoKCgogCiAK IAoKIyA3MjAgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZ2xvYmFsLmgiCgoKCgoKCgoKCgogCiAK IAoKICBjb25zdCBjaGFyICpxVmVyc2lvbigpOwogIGJvb2wgcVN5c0luZm8oIGludCAqd29yZFNp emUsIGJvb2wgKmJpZ0VuZGlhbiApOwoKCgoKCiAKIAogCiAKIAoKCgoKCiMgNzcyICIvdXNyL2xv Y2FsL3F0L2luY2x1ZGUvcWdsb2JhbC5oIgoKCgoKCgoKCgoKCgogCiAKIAoKCgogCiAKIAoKCgoK CgoKCiMgODExICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdsb2JhbC5oIgoKCgogIHZvaWQgcURl YnVnKCBjb25zdCBjaGFyICosIC4uLiApICAgIAoKICAgIF9fYXR0cmlidXRlX18gKChmb3JtYXQg KHByaW50ZiwgMSwgMikpKQoKOwoKICB2b2lkIHFXYXJuaW5nKCBjb25zdCBjaGFyICosIC4uLiAp ICAKCiAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKCjsKCiAgdm9p ZCBxRmF0YWwoIGNvbnN0IGNoYXIgKiwgLi4uICkgICAgCgogICAgX19hdHRyaWJ1dGVfXyAoKGZv cm1hdCAocHJpbnRmLCAxLCAyKSkpCgo7CgogIHZvaWQgcVN5c3RlbVdhcm5pbmcoIGNvbnN0IGNo YXIgKiwgaW50IGNvZGUgPSAtMSApOwoKCiAKCiAgdm9pZCBkZWJ1ZyggY29uc3QgY2hhciAqLCAu Li4gKSAgICAgCgogICAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpCgo7 CgogIHZvaWQgd2FybmluZyggY29uc3QgY2hhciAqLCAuLi4gKSAgIAoKICAgIF9fYXR0cmlidXRl X18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKQoKOwoKICB2b2lkIGZhdGFsKCBjb25zdCBjaGFy ICosIC4uLiApICAgICAKCiAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIp KSkKCjsKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKICBib29sIHF0X2NoZWNrX3BvaW50ZXIo IGJvb2wgYywgY29uc3QgY2hhciAqLCBpbnQgKTsKCgoKCgoKCgogCgoKCgoKCmVudW0gUXRNc2dU eXBlIHsgUXREZWJ1Z01zZywgUXRXYXJuaW5nTXNnLCBRdEZhdGFsTXNnIH07Cgp0eXBlZGVmIHZv aWQgKCpRdE1zZ0hhbmRsZXIpKFF0TXNnVHlwZSwgY29uc3QgY2hhciAqKTsKICBRdE1zZ0hhbmRs ZXIgcUluc3RhbGxNc2dIYW5kbGVyKCBRdE1zZ0hhbmRsZXIgKTsKCgogCnR5cGVkZWYgUXRNc2dI YW5kbGVyIG1zZ19oYW5kbGVyOwoKCiAgdm9pZCBxU3VwcHJlc3NPYnNvbGV0ZVdhcm5pbmdzKCBi b29sID0gVFJVRSApOwoKICB2b2lkIHFPYnNvbGV0ZSggY29uc3QgY2hhciAqb2JqLCBjb25zdCBj aGFyICpvbGRmdW5jLAoJCSAgIGNvbnN0IGNoYXIgKm5ld2Z1bmMgKTsKICB2b2lkIHFPYnNvbGV0 ZSggY29uc3QgY2hhciAqb2JqLCBjb25zdCBjaGFyICpvbGRmdW5jICk7CiAgdm9pZCBxT2Jzb2xl dGUoIGNvbnN0IGNoYXIgKm1lc3NhZ2UgKTsKCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVk ZS9xb2JqZWN0ZGVmcy5oIiAyCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKc3RydWN0 IFFVT2JqZWN0OwoKIyA4NiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FvYmplY3RkZWZzLmgiCgoK CgoKCgoKCgoKCiAKCiMgMTE0ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW9iamVjdGRlZnMuaCIK CiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgUU9iamVjdDsKY2xh c3MgUU1ldGFPYmplY3Q7CmNsYXNzIFFTaWduYWw7CmNsYXNzIFFDb25uZWN0aW9uOwpjbGFzcyBR RXZlbnQ7CnN0cnVjdCBRTWV0YURhdGE7CmNsYXNzIFFDb25uZWN0aW9uTGlzdDsKY2xhc3MgUUNv bm5lY3Rpb25MaXN0SXQ7CmNsYXNzIFFTaWduYWxWZWM7CmNsYXNzIFFPYmplY3RMaXN0OwpjbGFz cyBRT2JqZWN0TGlzdEl0OwpjbGFzcyBRTWVtYmVyRGljdDsKCgoKIyA0MyAiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3F3aW5kb3dkZWZzLmgiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fz dHJpbmcuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAx ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWNzdHJpbmcuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW1lbWFy cmF5LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdhcnJheS5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzaGFyZWQuaCIg MQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKc3RydWN0ICAg UVNoYXJlZAp7CiAgICBRU2hhcmVkKCkJCXsgY291bnQgPSAxOyB9CiAgICB2b2lkIHJlZigpCQl7 IGNvdW50Kys7IH0KICAgIGJvb2wgZGVyZWYoKQl7IHJldHVybiAhLS1jb3VudDsgfQogICAgdWlu dCBjb3VudDsKfTsKCgoKIyA0MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FnYXJyYXkuaCIgMgoK CgoKY2xhc3MgICBRR0FycmF5CQkJCQkgCnsKZnJpZW5kIGNsYXNzIFFCdWZmZXI7CnB1YmxpYzoK ICAgICAKICAgIHN0cnVjdCBhcnJheV9kYXRhIDogcHVibGljIFFTaGFyZWQgewkgCglhcnJheV9k YXRhKCkJeyBkYXRhPTA7IGxlbj0wOyB9CgljaGFyICpkYXRhOwkJCQkgCgl1aW50ICBsZW47CiAg ICB9OwogICAgUUdBcnJheSgpOwpwcm90ZWN0ZWQ6CiAgICBRR0FycmF5KCBpbnQsIGludCApOwkJ CSAKICAgIFFHQXJyYXkoIGludCBzaXplICk7CQkJIAogICAgUUdBcnJheSggY29uc3QgUUdBcnJh eSAmYSApOwkJIAogICAgdmlydHVhbCB+UUdBcnJheSgpOwoKICAgIFFHQXJyYXkgICAgJm9wZXJh dG9yPSggY29uc3QgUUdBcnJheSAmYSApIHsgcmV0dXJuIGFzc2lnbiggYSApOyB9CgogICAgdmly dHVhbCB2b2lkIGRldGFjaCgpCXsgZHVwbGljYXRlKCp0aGlzKTsgfQoKICAgIGNoYXIgICAgICAg KmRhdGEoKQkgY29uc3QJeyByZXR1cm4gc2hkLT5kYXRhOyB9CiAgICB1aW50CW5yZWZzKCkJIGNv bnN0CXsgcmV0dXJuIHNoZC0+Y291bnQ7IH0KICAgIHVpbnQJc2l6ZSgpCSBjb25zdAl7IHJldHVy biBzaGQtPmxlbjsgfQogICAgYm9vbAlpc0VxdWFsKCBjb25zdCBRR0FycmF5ICZhICkgY29uc3Q7 CgogICAgYm9vbAlyZXNpemUoIHVpbnQgbmV3c2l6ZSApOwoKICAgIGJvb2wJZmlsbCggY29uc3Qg Y2hhciAqZCwgaW50IGxlbiwgdWludCBzeiApOwoKICAgIFFHQXJyYXkgICAgJmFzc2lnbiggY29u c3QgUUdBcnJheSAmYSApOwogICAgUUdBcnJheSAgICAmYXNzaWduKCBjb25zdCBjaGFyICpkLCB1 aW50IGxlbiApOwogICAgUUdBcnJheSAgICAmZHVwbGljYXRlKCBjb25zdCBRR0FycmF5ICZhICk7 CiAgICBRR0FycmF5ICAgICZkdXBsaWNhdGUoIGNvbnN0IGNoYXIgKmQsIHVpbnQgbGVuICk7CiAg ICB2b2lkCXN0b3JlKCBjb25zdCBjaGFyICpkLCB1aW50IGxlbiApOwoKICAgIGFycmF5X2RhdGEg KnNoYXJlZEJsb2NrKCkJY29uc3QJCXsgcmV0dXJuIHNoZDsgfQogICAgdm9pZAlzZXRTaGFyZWRC bG9jayggYXJyYXlfZGF0YSAqcCApIHsgc2hkPShhcnJheV9kYXRhKilwOyB9CgogICAgUUdBcnJh eSAgICAmc2V0UmF3RGF0YSggY29uc3QgY2hhciAqZCwgdWludCBsZW4gKTsKICAgIHZvaWQJcmVz ZXRSYXdEYXRhKCBjb25zdCBjaGFyICpkLCB1aW50IGxlbiApOwoKICAgIGludAkJZmluZCggY29u c3QgY2hhciAqZCwgdWludCBpbmRleCwgdWludCBzeiApIGNvbnN0OwogICAgaW50CQljb250YWlu cyggY29uc3QgY2hhciAqZCwgdWludCBzeiApIGNvbnN0OwogICAgCiAgICB2b2lkCXNvcnQoIHVp bnQgc3ogKTsKICAgIGludAkJYnNlYXJjaCggY29uc3QgY2hhciAqZCwgdWludCBzeiApIGNvbnN0 OwoKICAgIGNoYXIgICAgICAgKmF0KCB1aW50IGluZGV4ICkgY29uc3Q7CgogICAgYm9vbAlzZXRF eHBhbmQoIHVpbnQgaW5kZXgsIGNvbnN0IGNoYXIgKmQsIHVpbnQgc3ogKTsKCnByb3RlY3RlZDoK ICAgIHZpcnR1YWwgYXJyYXlfZGF0YSAqbmV3RGF0YSgpOwogICAgdmlydHVhbCB2b2lkIGRlbGV0 ZURhdGEoIGFycmF5X2RhdGEgKnAgKTsKCnByaXZhdGU6CiAgICBzdGF0aWMgdm9pZCBtc2dfaW5k ZXgoIHVpbnQgKTsKICAgIGFycmF5X2RhdGEgKnNoZDsKfTsKCgppbmxpbmUgY2hhciAqUUdBcnJh eTo6YXQoIHVpbnQgaW5kZXggKSBjb25zdAp7CgogICAgaWYgKCBpbmRleCA+PSBzaXplKCkgKSB7 Cgltc2dfaW5kZXgoIGluZGV4ICk7CglpbmRleCA9IDA7CiAgICB9CgogICAgcmV0dXJuICZzaGQt PmRhdGFbaW5kZXhdOwp9CgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbWVtYXJyYXku aCIgMgoKCgoKdGVtcGxhdGU8Y2xhc3MgdHlwZT4gCmNsYXNzIFFNZW1BcnJheSAKOiBwdWJsaWMg UUdBcnJheQp7CnB1YmxpYzoKICAgIHR5cGVkZWYgdHlwZSogSXRlcmF0b3I7CiAgICB0eXBlZGVm IGNvbnN0IHR5cGUqIENvbnN0SXRlcmF0b3I7CiAgICB0eXBlZGVmIHR5cGUgVmFsdWVUeXBlOwoK cHJvdGVjdGVkOgogICAgUU1lbUFycmF5KCBpbnQsIGludCApIDogUUdBcnJheSggMCwgMCApIHt9 CgpwdWJsaWM6CiAgICBRTWVtQXJyYXkoKSB7fQogICAgUU1lbUFycmF5KCBpbnQgc2l6ZSApIDog UUdBcnJheShzaXplKnNpemVvZih0eXBlKSkge30KICAgIFFNZW1BcnJheSggY29uc3QgUU1lbUFy cmF5PHR5cGU+ICZhICkgOiBRR0FycmF5KGEpIHt9CiAgIH5RTWVtQXJyYXkoKSB7fQogICAgUU1l bUFycmF5PHR5cGU+ICZvcGVyYXRvcj0oY29uc3QgUU1lbUFycmF5PHR5cGU+ICZhKQoJCQkJeyBy ZXR1cm4gKFFNZW1BcnJheTx0eXBlPiYpUUdBcnJheTo6YXNzaWduKGEpOyB9CiAgICB0eXBlICpk YXRhKCkgICAgY29uc3QJeyByZXR1cm4gKHR5cGUgKilRR0FycmF5OjpkYXRhKCk7IH0KICAgIHVp bnQgIG5yZWZzKCkgICBjb25zdAl7IHJldHVybiBRR0FycmF5OjpucmVmcygpOyB9CiAgICB1aW50 ICBzaXplKCkgICAgY29uc3QJeyByZXR1cm4gUUdBcnJheTo6c2l6ZSgpL3NpemVvZih0eXBlKTsg fQogICAgdWludCAgY291bnQoKSAgIGNvbnN0CXsgcmV0dXJuIHNpemUoKTsgfQogICAgYm9vbCAg aXNFbXB0eSgpIGNvbnN0CXsgcmV0dXJuIFFHQXJyYXk6OnNpemUoKSA9PSAwOyB9CiAgICBib29s ICBpc051bGwoKSAgY29uc3QJeyByZXR1cm4gUUdBcnJheTo6ZGF0YSgpID09IDA7IH0KICAgIGJv b2wgIHJlc2l6ZSggdWludCBzaXplICkJeyByZXR1cm4gUUdBcnJheTo6cmVzaXplKHNpemUqc2l6 ZW9mKHR5cGUpKTsgfQogICAgYm9vbCAgdHJ1bmNhdGUoIHVpbnQgcG9zICkJeyByZXR1cm4gUUdB cnJheTo6cmVzaXplKHBvcypzaXplb2YodHlwZSkpOyB9CiAgICBib29sICBmaWxsKCBjb25zdCB0 eXBlICZkLCBpbnQgc2l6ZSA9IC0xICkKCXsgcmV0dXJuIFFHQXJyYXk6OmZpbGwoKGNoYXIqKSZk LHNpemUsc2l6ZW9mKHR5cGUpICk7IH0KICAgIHZvaWQgIGRldGFjaCgpCQl7IFFHQXJyYXk6OmRl dGFjaCgpOyB9CiAgICBRTWVtQXJyYXk8dHlwZT4gICBjb3B5KCkgY29uc3QKCXsgUU1lbUFycmF5 PHR5cGU+IHRtcDsgcmV0dXJuIHRtcC5kdXBsaWNhdGUoKnRoaXMpOyB9CiAgICBRTWVtQXJyYXk8 dHlwZT4mIGFzc2lnbiggY29uc3QgUU1lbUFycmF5PHR5cGU+JiBhICkKCXsgcmV0dXJuIChRTWVt QXJyYXk8dHlwZT4mKVFHQXJyYXk6OmFzc2lnbihhKTsgfQogICAgUU1lbUFycmF5PHR5cGU+JiBh c3NpZ24oIGNvbnN0IHR5cGUgKmEsIHVpbnQgbiApCgl7IHJldHVybiAoUU1lbUFycmF5PHR5cGU+ JilRR0FycmF5Ojphc3NpZ24oKGNoYXIqKWEsbipzaXplb2YodHlwZSkpOyB9CiAgICBRTWVtQXJy YXk8dHlwZT4mIGR1cGxpY2F0ZSggY29uc3QgUU1lbUFycmF5PHR5cGU+JiBhICkKCXsgcmV0dXJu IChRTWVtQXJyYXk8dHlwZT4mKVFHQXJyYXk6OmR1cGxpY2F0ZShhKTsgfQogICAgUU1lbUFycmF5 PHR5cGU+JiBkdXBsaWNhdGUoIGNvbnN0IHR5cGUgKmEsIHVpbnQgbiApCgl7IHJldHVybiAoUU1l bUFycmF5PHR5cGU+JilRR0FycmF5OjpkdXBsaWNhdGUoKGNoYXIqKWEsbipzaXplb2YodHlwZSkp OyB9CiAgICBRTWVtQXJyYXk8dHlwZT4mIHNldFJhd0RhdGEoIGNvbnN0IHR5cGUgKmEsIHVpbnQg biApCgl7IHJldHVybiAoUU1lbUFycmF5PHR5cGU+JilRR0FycmF5OjpzZXRSYXdEYXRhKChjaGFy KilhLAoJCQkJCQkgICAgIG4qc2l6ZW9mKHR5cGUpKTsgfQogICAgdm9pZCByZXNldFJhd0RhdGEo IGNvbnN0IHR5cGUgKmEsIHVpbnQgbiApCgl7IFFHQXJyYXk6OnJlc2V0UmF3RGF0YSgoY2hhciop YSxuKnNpemVvZih0eXBlKSk7IH0KICAgIGludAkgZmluZCggY29uc3QgdHlwZSAmZCwgdWludCBp PTAgKSBjb25zdAoJeyByZXR1cm4gUUdBcnJheTo6ZmluZCgoY2hhciopJmQsaSxzaXplb2YodHlw ZSkpOyB9CiAgICBpbnQJIGNvbnRhaW5zKCBjb25zdCB0eXBlICZkICkgY29uc3QKCXsgcmV0dXJu IFFHQXJyYXk6OmNvbnRhaW5zKChjaGFyKikmZCxzaXplb2YodHlwZSkpOyB9CiAgICB2b2lkIHNv cnQoKSB7IFFHQXJyYXk6OnNvcnQoc2l6ZW9mKHR5cGUpKTsgfQogICAgaW50ICBic2VhcmNoKCBj b25zdCB0eXBlICZkICkgY29uc3QKCXsgcmV0dXJuIFFHQXJyYXk6OmJzZWFyY2goKGNvbnN0IGNo YXIqKSZkLHNpemVvZih0eXBlKSk7IH0KICAgIHR5cGUmIG9wZXJhdG9yW10oIGludCBpICkgY29u c3QKCXsgcmV0dXJuICh0eXBlICYpKCoodHlwZSAqKVFHQXJyYXk6OmF0KGkqc2l6ZW9mKHR5cGUp KSk7IH0KICAgIHR5cGUmIGF0KCB1aW50IGkgKSBjb25zdAoJeyByZXR1cm4gKHR5cGUgJikoKih0 eXBlICopUUdBcnJheTo6YXQoaSpzaXplb2YodHlwZSkpKTsgfQoJIG9wZXJhdG9yIGNvbnN0IHR5 cGUqKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IHR5cGUgKilRR0FycmF5OjpkYXRhKCk7IH0KICAg IGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUU1lbUFycmF5PHR5cGU+ICZhICkgY29uc3QgeyByZXR1 cm4gaXNFcXVhbChhKTsgfQogICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRTWVtQXJyYXk8dHlw ZT4gJmEgKSBjb25zdCB7IHJldHVybiAhaXNFcXVhbChhKTsgfQogICAgSXRlcmF0b3IgYmVnaW4o KSB7IHJldHVybiBkYXRhKCk7IH0KICAgIEl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGRhdGEoKSAr IHNpemUoKTsgfQogICAgQ29uc3RJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGRhdGEo KTsgfQogICAgQ29uc3RJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBkYXRhKCkgKyBzaXpl KCk7IH0KfTsKCgoKCgoKCgoKCgoKCiMgNDMgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xY3N0cmlu Zy5oIiAyCgoKCiMgMSAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCgoKIAoKCgoKCgoK IAojIDEzOCAiL3Vzci9pbmNsdWRlL2ZlYXR1cmVzLmgiIDMKCgogCgoKCgoKCgoKCiAKCgoKCgog CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMTk2ICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMu aCIgMwoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgogCgoKCgoKCgoKIAoK CgoKIAoKIyAxICIvdXNyL2luY2x1ZGUvc3lzL2NkZWZzLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoK CgoKCgoKIAoKCgoKIAoKCgoKCiAKCgoKCgoKCgogCgoKCgojIDcxICIvdXNyL2luY2x1ZGUvc3lz L2NkZWZzLmgiIDMKCgogCgoKCgoKCgogCgoKCiMgMTAzICIvdXNyL2luY2x1ZGUvc3lzL2NkZWZz LmgiIDMKCgoKIAoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCiAKCgoKCgoKCgog CgoKCgoKCgoKCiAKCgoKCgoKCiMgMjUwICIvdXNyL2luY2x1ZGUvZmVhdHVyZXMuaCIgMiAzCgoK IAoKCgoKCgoKCiAKCgoKCgogCgogCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvZ251L3N0dWJz LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyNzggIi91 c3IvaW5jbHVkZS9mZWF0dXJlcy5oIiAyIDMKCgoKCiMgMjYgIi91c3IvaW5jbHVkZS9zdHJpbmcu aCIgMiAzCgoKZXh0ZXJuICJDIiB7IAoKIAoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoK CgoKCgoKCgoKCgogCgoKCgoKIAoKIAoKIyAxMzEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5k cmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdDsKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCiAKCiMgMjcxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgojIDI4MyAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK IAoKIAoKIyAzMTcgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMv aW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDMzICIvdXNy L2luY2x1ZGUvc3RyaW5nLmgiIDIgMwoKCgogCmV4dGVybiB2b2lkICogIG1lbWNweSAgKHZvaWQg KiAgX19yZXN0cmljdCBfX2Rlc3QsCgkJCSAgICBfX2NvbnN0IHZvaWQgKiAgX19yZXN0cmljdCBf X3NyYywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CiAKCmV4dGVybiB2b2lkICogIG1lbW1vdmUg ICh2b2lkICogIF9fZGVzdCwgX19jb25zdCB2b2lkICogIF9fc3JjLAoJCQkgICAgIHNpemVfdCBf X24pICB0aHJvdyAoKSAgOwoKIAoKCgpleHRlcm4gdm9pZCAqICBtZW1jY3B5ICAodm9pZCAqICBf X2Rlc3QsIF9fY29uc3Qgdm9pZCAqICBfX3NyYywKCQkJICAgICBpbnQgX19jLCBzaXplX3QgX19u KSAgdGhyb3cgKCkgIDsKCgoKIApleHRlcm4gdm9pZCAqICBtZW1zZXQgICh2b2lkICogIF9fcywg aW50IF9fYywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgbWVtY21wICAo X19jb25zdCB2b2lkICogIF9fczEsIF9fY29uc3Qgdm9pZCAqICBfX3MyLAoJCQlzaXplX3QgX19u KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgKiAgbWVtY2hyICAoX19jb25zdCB2b2lkICog IF9fcywgaW50IF9fYywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgoKCgoKCgoKIApleHRlcm4g Y2hhciAqc3RyY3B5ICAoY2hhciAqX19yZXN0cmljdCBfX2Rlc3QsCgkJCSAgX19jb25zdCBjaGFy ICpfX3Jlc3RyaWN0IF9fc3JjKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gY2hhciAqc3RybmNweSAg KGNoYXIgKl9fcmVzdHJpY3QgX19kZXN0LAoJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3Qg X19zcmMsIHNpemVfdCBfX24pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gY2hhciAqc3RyY2F0ICAo Y2hhciAqX19yZXN0cmljdCBfX2Rlc3QsCgkJCSAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9f c3JjKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gY2hhciAqc3RybmNhdCAgKGNoYXIgKl9fcmVzdHJp Y3QgX19kZXN0LAoJCQkgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zcmMsIHNpemVfdCBf X24pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHN0cmNtcCAgKF9fY29uc3QgY2hhciAqX19z MSwgX19jb25zdCBjaGFyICpfX3MyKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gaW50IHN0cm5jbXAg IChfX2NvbnN0IGNoYXIgKl9fczEsIF9fY29uc3QgY2hhciAqX19zMiwgc2l6ZV90IF9fbikgIHRo cm93ICgpICA7CgogCmV4dGVybiBpbnQgc3RyY29sbCAgKF9fY29uc3QgY2hhciAqX19zMSwgX19j b25zdCBjaGFyICpfX3MyKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gc2l6ZV90IHN0cnhmcm0gIChj aGFyICpfX3Jlc3RyaWN0IF9fZGVzdCwKCQkJICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBf X3NyYywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgojIDEwNyAiL3Vzci9pbmNsdWRlL3N0cmlu Zy5oIiAzCgoKCiAKZXh0ZXJuIGNoYXIgKl9fc3RyZHVwICAoX19jb25zdCBjaGFyICpfX3MpICB0 aHJvdyAoKSAgOwpleHRlcm4gY2hhciAqc3RyZHVwICAoX19jb25zdCBjaGFyICpfX3MpICB0aHJv dyAoKSAgOwoKCiAKCgoKCgoKIyAxNDMgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMwoKCiAKZXh0 ZXJuIGNoYXIgKnN0cmNociAgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSAgdGhyb3cgKCkg IDsKIApleHRlcm4gY2hhciAqc3RycmNociAgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19jKSAg dGhyb3cgKCkgIDsKCgoKCgoKCiAKCmV4dGVybiBzaXplX3Qgc3RyY3NwbiAgKF9fY29uc3QgY2hh ciAqX19zLCBfX2NvbnN0IGNoYXIgKl9fcmVqZWN0KSAgdGhyb3cgKCkgIDsKIAoKZXh0ZXJuIHNp emVfdCBzdHJzcG4gIChfX2NvbnN0IGNoYXIgKl9fcywgX19jb25zdCBjaGFyICpfX2FjY2VwdCkg IHRocm93ICgpICA7CiAKZXh0ZXJuIGNoYXIgKnN0cnBicmsgIChfX2NvbnN0IGNoYXIgKl9fcywg X19jb25zdCBjaGFyICpfX2FjY2VwdCkgIHRocm93ICgpICA7CiAKZXh0ZXJuIGNoYXIgKnN0cnN0 ciAgKF9fY29uc3QgY2hhciAqX19oYXlzdGFjaywgX19jb25zdCBjaGFyICpfX25lZWRsZSkgIHRo cm93ICgpICA7CgoKCgoKCgoKCiAKZXh0ZXJuIGNoYXIgKnN0cnRvayAgKGNoYXIgKl9fcmVzdHJp Y3QgX19zLAoJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKSAgdGhyb3cgKCkg IDsKCiAKCmV4dGVybiBjaGFyICpfX3N0cnRva19yICAoY2hhciAqX19yZXN0cmljdCBfX3MsCgkJ CSAgICAgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltLAoJCQkgICAgICBjaGFyICoq X19yZXN0cmljdCBfX3NhdmVfcHRyKSAgdGhyb3cgKCkgIDsKCmV4dGVybiBjaGFyICpzdHJ0b2tf ciAgKGNoYXIgKl9fcmVzdHJpY3QgX19zLAoJCQkgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fZGVsaW0sCgkJCSAgICBjaGFyICoqX19yZXN0cmljdCBfX3NhdmVfcHRyKSAgdGhyb3cgKCkg IDsKCgojIDIwMyAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCgoKCiAKZXh0ZXJuIHNpemVfdCBz dHJsZW4gIChfX2NvbnN0IGNoYXIgKl9fcykgIHRocm93ICgpICA7CgoKCgoKCgoKIApleHRlcm4g Y2hhciAqc3RyZXJyb3IgIChpbnQgX19lcnJudW0pICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIGNo YXIgKl9fc3RyZXJyb3JfciAgKGludCBfX2Vycm51bSwgY2hhciAqX19idWYsIHNpemVfdCBfX2J1 ZmxlbikgIHRocm93ICgpICA7CmV4dGVybiBjaGFyICpzdHJlcnJvcl9yICAoaW50IF9fZXJybnVt LCBjaGFyICpfX2J1Ziwgc2l6ZV90IF9fYnVmbGVuKSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4g dm9pZCBfX2J6ZXJvICAodm9pZCAqICBfX3MsIHNpemVfdCBfX24pICB0aHJvdyAoKSAgOwoKCiAK ZXh0ZXJuIHZvaWQgYmNvcHkgIChfX2NvbnN0IHZvaWQgKiAgX19zcmMsIHZvaWQgKiAgX19kZXN0 LCBzaXplX3QgX19uKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgYnplcm8gICh2b2lkICog IF9fcywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgYmNtcCAgKF9fY29u c3Qgdm9pZCAqICBfX3MxLCBfX2NvbnN0IHZvaWQgKiAgX19zMiwgc2l6ZV90IF9fbikgIHRocm93 ICgpICA7CgogCmV4dGVybiBjaGFyICppbmRleCAgKF9fY29uc3QgY2hhciAqX19zLCBpbnQgX19j KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGNoYXIgKnJpbmRleCAgKF9fY29uc3QgY2hhciAqX19z LCBpbnQgX19jKSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBpbnQgX19mZnMgIChpbnQgX19pKSAg dGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKZXh0ZXJuIGludCBmZnMgIChpbnQg X19pKSAgdGhyb3cgKCkgICBfX2F0dHJpYnV0ZV9fICgoY29uc3QpKTsKCiAKCgoKCgoKCgoKIApl eHRlcm4gaW50IF9fc3RyY2FzZWNtcCAgKF9fY29uc3QgY2hhciAqX19zMSwgX19jb25zdCBjaGFy ICpfX3MyKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBzdHJjYXNlY21wICAoX19jb25zdCBjaGFy ICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHN0 cm5jYXNlY21wICAoX19jb25zdCBjaGFyICpfX3MxLCBfX2NvbnN0IGNoYXIgKl9fczIsCgkJCSAg ICAgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgoKIyAyNzcgIi91c3IvaW5jbHVkZS9zdHJpbmcu aCIgMwoKCgogCgpleHRlcm4gY2hhciAqc3Ryc2VwICAoY2hhciAqKl9fcmVzdHJpY3QgX19zdHJp bmdwLAoJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2RlbGltKSAgdGhyb3cgKCkgIDsK CgojIDMxOSAiL3Vzci9pbmNsdWRlL3N0cmluZy5oIiAzCgoKCgojIDM0NyAiL3Vzci9pbmNsdWRl L3N0cmluZy5oIiAzCgoKCn0gCgoKIyA0NiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fjc3RyaW5n LmgiIDIKCgoKIAoKCgogIHZvaWQgKnFtZW1tb3ZlKCB2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNy YywgdWludCBsZW4gKTsKCiAgY2hhciAqcXN0cmR1cCggY29uc3QgY2hhciAqICk7CgogIGlubGlu ZSB1aW50IHFzdHJsZW4oIGNvbnN0IGNoYXIgKnN0ciApCnsgcmV0dXJuIHN0ciA/ICh1aW50KXN0 cmxlbihzdHIpIDogMDsgfQoKICBpbmxpbmUgY2hhciAqcXN0cmNweSggY2hhciAqZHN0LCBjb25z dCBjaGFyICpzcmMgKQp7IHJldHVybiBzcmMgPyBzdHJjcHkoZHN0LCBzcmMpIDogMDsgfQoKICBj aGFyICpxc3RybmNweSggY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHVpbnQgbGVuICk7Cgog IGlubGluZSBpbnQgcXN0cmNtcCggY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiAp CnsKICAgIHJldHVybiAoIHN0cjEgJiYgc3RyMiApID8gc3RyY21wKCBzdHIxLCBzdHIyICkKCQkJ ICAgIDogKCBzdHIxID8gMSA6ICggc3RyMiA/IC0xIDogMCApICk7Cn0KCiAgaW5saW5lIGludCBx c3RybmNtcCggY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwgdWludCBsZW4gKQp7 CiAgICByZXR1cm4gKCBzdHIxICYmIHN0cjIgKSA/IHN0cm5jbXAoIHN0cjEsIHN0cjIsIGxlbiAp CgkJCSAgICA6ICggc3RyMSA/IDEgOiAoIHN0cjIgPyAtMSA6IDAgKSApOwp9CgogIGludCBxc3Ry aWNtcCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogKTsKCiAgaW50IHFzdHJuaWNtcCggY29u c3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVpbnQgbGVuICk7CgoKICBpbmxpbmUgdWludCBjc3Ry bGVuKCBjb25zdCBjaGFyICpzdHIgKQp7IHJldHVybiAodWludClzdHJsZW4oc3RyKTsgfQoKICBp bmxpbmUgY2hhciAqY3N0cmNweSggY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMgKQp7IHJldHVy biBzdHJjcHkoZHN0LHNyYyk7IH0KCiAgaW5saW5lIGludCBjc3RyY21wKCBjb25zdCBjaGFyICpz dHIxLCBjb25zdCBjaGFyICpzdHIyICkKeyByZXR1cm4gc3RyY21wKHN0cjEsc3RyMik7IH0KCiAg aW5saW5lIGludCBjc3RybmNtcCggY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwg dWludCBsZW4gKQp7IHJldHVybiBzdHJuY21wKHN0cjEsc3RyMixsZW4pOyB9CgoKCiAKCiAgUV9V SU5UMTYgcUNoZWNrc3VtKCBjb25zdCBjaGFyICpzLCB1aW50IGxlbiApOwoKIAoKCgoKCgoKIyAx MTkgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xY3N0cmluZy5oIgoKdHlwZWRlZiBRTWVtQXJyYXk8 Y2hhcj4gUUJ5dGVBcnJheTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRh U3RyZWFtICYsIGNvbnN0IFFCeXRlQXJyYXkgJiApOwogIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBRRGF0YVN0cmVhbSAmLCBRQnl0ZUFycmF5ICYgKTsKCgoKCiAKCgoKY2xhc3MgUVJlZ0V4cDsK CmNsYXNzICAgUUNTdHJpbmcgOiBwdWJsaWMgUUJ5dGVBcnJheQkgCnsKcHVibGljOgogICAgUUNT dHJpbmcoKSB7fQkJCQkgCiAgICBRQ1N0cmluZyggaW50IHNpemUgKTsJCQkgCiAgICBRQ1N0cmlu ZyggY29uc3QgUUNTdHJpbmcgJnMgKSA6IFFCeXRlQXJyYXkoIHMgKSB7fQogICAgUUNTdHJpbmco IGNvbnN0IGNoYXIgKnN0ciApOwkJIAogICAgUUNTdHJpbmcoIGNvbnN0IGNoYXIgKnN0ciwgdWlu dCBtYXhsZW4gKTsJIAogICAgflFDU3RyaW5nKCk7CgogICAgUUNTdHJpbmcgICAgJm9wZXJhdG9y PSggY29uc3QgUUNTdHJpbmcgJnMgKTsgCiAgICBRQ1N0cmluZyAgICAmb3BlcmF0b3I9KCBjb25z dCBjaGFyICpzdHIgKTsJIAoKICAgIGJvb2wJaXNOdWxsKCkJY29uc3Q7CiAgICBib29sCWlzRW1w dHkoKQljb25zdDsKICAgIHVpbnQJbGVuZ3RoKCkJY29uc3Q7CiAgICBib29sCXJlc2l6ZSggdWlu dCBuZXdsZW4gKTsKICAgIGJvb2wJdHJ1bmNhdGUoIHVpbnQgcG9zICk7CiAgICBib29sCWZpbGwo IGNoYXIgYywgaW50IGxlbiA9IC0xICk7CgogICAgUUNTdHJpbmcJY29weSgpCWNvbnN0OwoKICAg IFFDU3RyaW5nICAgICZzcHJpbnRmKCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLiApOwoKICAgIGlu dAkJZmluZCggY2hhciBjLCBpbnQgaW5kZXg9MCwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAgICBp bnQJCWZpbmQoIGNvbnN0IGNoYXIgKnN0ciwgaW50IGluZGV4PTAsIGJvb2wgY3M9VFJVRSApIGNv bnN0OwoKICAgIGludAkJZmluZCggY29uc3QgUVJlZ0V4cCAmLCBpbnQgaW5kZXg9MCApIGNvbnN0 OwoKICAgIGludAkJZmluZFJldiggY2hhciBjLCBpbnQgaW5kZXg9LTEsIGJvb2wgY3M9VFJVRSkg Y29uc3Q7CiAgICBpbnQJCWZpbmRSZXYoIGNvbnN0IGNoYXIgKnN0ciwgaW50IGluZGV4PS0xLCBi b29sIGNzPVRSVUUpIGNvbnN0OwoKICAgIGludAkJZmluZFJldiggY29uc3QgUVJlZ0V4cCAmLCBp bnQgaW5kZXg9LTEgKSBjb25zdDsKCiAgICBpbnQJCWNvbnRhaW5zKCBjaGFyIGMsIGJvb2wgY3M9 VFJVRSApIGNvbnN0OwogICAgaW50CQljb250YWlucyggY29uc3QgY2hhciAqc3RyLCBib29sIGNz PVRSVUUgKSBjb25zdDsKCiAgICBpbnQJCWNvbnRhaW5zKCBjb25zdCBRUmVnRXhwICYgKSBjb25z dDsKCiAgICBRQ1N0cmluZwlsZWZ0KCB1aW50IGxlbiApICBjb25zdDsKICAgIFFDU3RyaW5nCXJp Z2h0KCB1aW50IGxlbiApIGNvbnN0OwogICAgUUNTdHJpbmcJbWlkKCB1aW50IGluZGV4LCB1aW50 IGxlbj0weGZmZmZmZmZmKSBjb25zdDsKCiAgICBRQ1N0cmluZwlsZWZ0SnVzdGlmeSggdWludCB3 aWR0aCwgY2hhciBmaWxsPScgJywgYm9vbCB0cnVuYz1GQUxTRSljb25zdDsKICAgIFFDU3RyaW5n CXJpZ2h0SnVzdGlmeSggdWludCB3aWR0aCwgY2hhciBmaWxsPScgJyxib29sIHRydW5jPUZBTFNF KWNvbnN0OwoKICAgIFFDU3RyaW5nCWxvd2VyKCkgY29uc3Q7CiAgICBRQ1N0cmluZwl1cHBlcigp IGNvbnN0OwoKICAgIFFDU3RyaW5nCXN0cmlwV2hpdGVTcGFjZSgpCWNvbnN0OwogICAgUUNTdHJp bmcJc2ltcGxpZnlXaGl0ZVNwYWNlKCkJY29uc3Q7CgogICAgUUNTdHJpbmcgICAgJmluc2VydCgg dWludCBpbmRleCwgY29uc3QgY2hhciAqICk7CiAgICBRQ1N0cmluZyAgICAmaW5zZXJ0KCB1aW50 IGluZGV4LCBjaGFyICk7CiAgICBRQ1N0cmluZyAgICAmYXBwZW5kKCBjb25zdCBjaGFyICogKTsK ICAgIFFDU3RyaW5nICAgICZwcmVwZW5kKCBjb25zdCBjaGFyICogKTsKICAgIFFDU3RyaW5nICAg ICZyZW1vdmUoIHVpbnQgaW5kZXgsIHVpbnQgbGVuICk7CiAgICBRQ1N0cmluZyAgICAmcmVwbGFj ZSggdWludCBpbmRleCwgdWludCBsZW4sIGNvbnN0IGNoYXIgKiApOwoKICAgIFFDU3RyaW5nICAg ICZyZXBsYWNlKCBjb25zdCBRUmVnRXhwICYsIGNvbnN0IGNoYXIgKiApOwoKICAgIHNob3J0CXRv U2hvcnQoIGJvb2wgKm9rPTAgKQljb25zdDsKICAgIHVzaG9ydAl0b1VTaG9ydCggYm9vbCAqb2s9 MCApCWNvbnN0OwogICAgaW50CQl0b0ludCggYm9vbCAqb2s9MCApCWNvbnN0OwogICAgdWludAl0 b1VJbnQoIGJvb2wgKm9rPTAgKQljb25zdDsKICAgIGxvbmcJdG9Mb25nKCBib29sICpvaz0wICkJ Y29uc3Q7CiAgICB1bG9uZwl0b1VMb25nKCBib29sICpvaz0wICkJY29uc3Q7CiAgICBmbG9hdAl0 b0Zsb2F0KCBib29sICpvaz0wICkJY29uc3Q7CiAgICBkb3VibGUJdG9Eb3VibGUoIGJvb2wgKm9r PTAgKQljb25zdDsKCiAgICBRQ1N0cmluZyAgICAmc2V0U3RyKCBjb25zdCBjaGFyICpzICk7CiAg ICBRQ1N0cmluZyAgICAmc2V0TnVtKCBzaG9ydCApOwogICAgUUNTdHJpbmcgICAgJnNldE51bSgg dXNob3J0ICk7CiAgICBRQ1N0cmluZyAgICAmc2V0TnVtKCBpbnQgKTsKICAgIFFDU3RyaW5nICAg ICZzZXROdW0oIHVpbnQgKTsKICAgIFFDU3RyaW5nICAgICZzZXROdW0oIGxvbmcgKTsKICAgIFFD U3RyaW5nICAgICZzZXROdW0oIHVsb25nICk7CiAgICBRQ1N0cmluZyAgICAmc2V0TnVtKCBmbG9h dCwgY2hhciBmPSdnJywgaW50IHByZWM9NiApOwogICAgUUNTdHJpbmcgICAgJnNldE51bSggZG91 YmxlLCBjaGFyIGY9J2cnLCBpbnQgcHJlYz02ICk7CgogICAgYm9vbAlzZXRFeHBhbmQoIHVpbnQg aW5kZXgsIGNoYXIgYyApOwoKCQlvcGVyYXRvciBjb25zdCBjaGFyICooKSBjb25zdDsKICAgIFFD U3RyaW5nICAgICZvcGVyYXRvcis9KCBjb25zdCBjaGFyICpzdHIgKTsKICAgIFFDU3RyaW5nICAg ICZvcGVyYXRvcis9KCBjaGFyIGMgKTsKfTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9y PDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFDU3RyaW5nICYgKTsKICBRRGF0YVN0cmVhbSAmb3Bl cmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUUNTdHJpbmcgJiApOwoKCiAKCgoKaW5saW5lIFFDU3Ry aW5nICZRQ1N0cmluZzo6b3BlcmF0b3I9KCBjb25zdCBRQ1N0cmluZyAmcyApCnsgcmV0dXJuIChR Q1N0cmluZyYpYXNzaWduKCBzICk7IH0KCmlubGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6Om9wZXJh dG9yPSggY29uc3QgY2hhciAqc3RyICkKeyByZXR1cm4gKFFDU3RyaW5nJilkdXBsaWNhdGUoIHN0 ciwgcXN0cmxlbihzdHIpKzEgKTsgfQoKaW5saW5lIGJvb2wgUUNTdHJpbmc6OmlzTnVsbCgpIGNv bnN0CnsgcmV0dXJuIGRhdGEoKSA9PSAwOyB9CgppbmxpbmUgYm9vbCBRQ1N0cmluZzo6aXNFbXB0 eSgpIGNvbnN0CnsgcmV0dXJuIGRhdGEoKSA9PSAwIHx8ICpkYXRhKCkgPT0gJ1wwJzsgfQoKaW5s aW5lIHVpbnQgUUNTdHJpbmc6Omxlbmd0aCgpIGNvbnN0CnsgcmV0dXJuIHFzdHJsZW4oIGRhdGEo KSApOyB9CgppbmxpbmUgYm9vbCBRQ1N0cmluZzo6dHJ1bmNhdGUoIHVpbnQgcG9zICkKeyByZXR1 cm4gcmVzaXplKHBvcysxKTsgfQoKaW5saW5lIFFDU3RyaW5nIFFDU3RyaW5nOjpjb3B5KCkgY29u c3QKeyByZXR1cm4gUUNTdHJpbmcoIGRhdGEoKSApOyB9CgppbmxpbmUgUUNTdHJpbmcgJlFDU3Ry aW5nOjpwcmVwZW5kKCBjb25zdCBjaGFyICpzICkKeyByZXR1cm4gaW5zZXJ0KDAscyk7IH0KCmlu bGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OmFwcGVuZCggY29uc3QgY2hhciAqcyApCnsgcmV0dXJu IG9wZXJhdG9yKz0ocyk7IH0KCmlubGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OnNldE51bSggc2hv cnQgbiApCnsgcmV0dXJuIHNldE51bSgobG9uZyluKTsgfQoKaW5saW5lIFFDU3RyaW5nICZRQ1N0 cmluZzo6c2V0TnVtKCB1c2hvcnQgbiApCnsgcmV0dXJuIHNldE51bSgodWxvbmcpbik7IH0KCmlu bGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OnNldE51bSggaW50IG4gKQp7IHJldHVybiBzZXROdW0o KGxvbmcpbik7IH0KCmlubGluZSBRQ1N0cmluZyAmUUNTdHJpbmc6OnNldE51bSggdWludCBuICkK eyByZXR1cm4gc2V0TnVtKCh1bG9uZyluKTsgfQoKaW5saW5lIFFDU3RyaW5nICZRQ1N0cmluZzo6 c2V0TnVtKCBmbG9hdCBuLCBjaGFyIGYsIGludCBwcmVjICkKeyByZXR1cm4gc2V0TnVtKChkb3Vi bGUpbixmLHByZWMpOyB9CgppbmxpbmUgUUNTdHJpbmc6Om9wZXJhdG9yIGNvbnN0IGNoYXIgKigp IGNvbnN0CnsgcmV0dXJuIChjb25zdCBjaGFyICopZGF0YSgpOyB9CgoKIAoKCgogIGlubGluZSBi b29sIG9wZXJhdG9yPT0oIGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkK eyByZXR1cm4gcXN0cmNtcChzMS5kYXRhKCksczIuZGF0YSgpKSA9PSAwOyB9CgogIGlubGluZSBi b29sIG9wZXJhdG9yPT0oIGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKQp7IHJl dHVybiBxc3RyY21wKHMxLmRhdGEoKSxzMikgPT0gMDsgfQoKICBpbmxpbmUgYm9vbCBvcGVyYXRv cj09KCBjb25zdCBjaGFyICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNt cChzMSxzMi5kYXRhKCkpID09IDA7IH0KCiAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPSggY29uc3Qg UUNTdHJpbmcgJnMxLCBjb25zdCBRQ1N0cmluZyAmczIgKQp7IHJldHVybiBxc3RyY21wKHMxLmRh dGEoKSxzMi5kYXRhKCkpICE9IDA7IH0KCiAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPSggY29uc3Qg UUNTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEuZGF0YSgp LHMyKSAhPSAwOyB9CgogIGlubGluZSBib29sIG9wZXJhdG9yIT0oIGNvbnN0IGNoYXIgKnMxLCBj b25zdCBRQ1N0cmluZyAmczIgKQp7IHJldHVybiBxc3RyY21wKHMxLHMyLmRhdGEoKSkgIT0gMDsg fQoKICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoIGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgUUNT dHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNtcChzMS5kYXRhKCksczIuZGF0YSgpKSA8IDA7IH0K CiAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IGNoYXIg KnMyICkKeyByZXR1cm4gcXN0cmNtcChzMS5kYXRhKCksczIpIDwgMDsgfQoKICBpbmxpbmUgYm9v bCBvcGVyYXRvcjwoIGNvbnN0IGNoYXIgKnMxLCBjb25zdCBRQ1N0cmluZyAmczIgKQp7IHJldHVy biBxc3RyY21wKHMxLHMyLmRhdGEoKSkgPCAwOyB9CgogIGlubGluZSBib29sIG9wZXJhdG9yPD0o IGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNt cChzMS5kYXRhKCksczIuZGF0YSgpKSA8PSAwOyB9CgogIGlubGluZSBib29sIG9wZXJhdG9yPD0o IGNvbnN0IFFDU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKQp7IHJldHVybiBxc3RyY21wKHMx LmRhdGEoKSxzMikgPD0gMDsgfQoKICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KCBjb25zdCBjaGFy ICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKeyByZXR1cm4gcXN0cmNtcChzMSxzMi5kYXRhKCkp IDw9IDA7IH0KCiAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KCBjb25zdCBRQ1N0cmluZyAmczEsIGNv bnN0IFFDU3RyaW5nICZzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEuZGF0YSgpLHMyLmRhdGEoKSkg PiAwOyB9CgogIGlubGluZSBib29sIG9wZXJhdG9yPiggY29uc3QgUUNTdHJpbmcgJnMxLCBjb25z dCBjaGFyICpzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEuZGF0YSgpLHMyKSA+IDA7IH0KCiAgaW5s aW5lIGJvb2wgb3BlcmF0b3I+KCBjb25zdCBjaGFyICpzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkK eyByZXR1cm4gcXN0cmNtcChzMSxzMi5kYXRhKCkpID4gMDsgfQoKICBpbmxpbmUgYm9vbCBvcGVy YXRvcj49KCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IFFDU3RyaW5nICZzMiApCnsgcmV0dXJu IHFzdHJjbXAoczEuZGF0YSgpLHMyLmRhdGEoKSkgPj0gMDsgfQoKICBpbmxpbmUgYm9vbCBvcGVy YXRvcj49KCBjb25zdCBRQ1N0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICkKeyByZXR1cm4gcXN0 cmNtcChzMS5kYXRhKCksczIpID49IDA7IH0KCiAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PSggY29u c3QgY2hhciAqczEsIGNvbnN0IFFDU3RyaW5nICZzMiApCnsgcmV0dXJuIHFzdHJjbXAoczEsczIu ZGF0YSgpKSA+PSAwOyB9CgogIGlubGluZSBjb25zdCBRQ1N0cmluZyBvcGVyYXRvcisoIGNvbnN0 IFFDU3RyaW5nICZzMSwgY29uc3QgUUNTdHJpbmcgJnMyICkKewogICAgUUNTdHJpbmcgdG1wKCBz MS5kYXRhKCkgKTsKICAgIHRtcCArPSBzMjsKICAgIHJldHVybiB0bXA7Cn0KCiAgaW5saW5lIGNv bnN0IFFDU3RyaW5nIG9wZXJhdG9yKyggY29uc3QgUUNTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpz MiApCnsKICAgIFFDU3RyaW5nIHRtcCggczEuZGF0YSgpICk7CiAgICB0bXAgKz0gczI7CiAgICBy ZXR1cm4gdG1wOwp9CgogIGlubGluZSBjb25zdCBRQ1N0cmluZyBvcGVyYXRvcisoIGNvbnN0IGNo YXIgKnMxLCBjb25zdCBRQ1N0cmluZyAmczIgKQp7CiAgICBRQ1N0cmluZyB0bXAoIHMxICk7CiAg ICB0bXAgKz0gczI7CiAgICByZXR1cm4gdG1wOwp9CgogIGlubGluZSBjb25zdCBRQ1N0cmluZyBv cGVyYXRvcisoIGNvbnN0IFFDU3RyaW5nICZzMSwgY2hhciBjMiApCnsKICAgIFFDU3RyaW5nIHRt cCggczEuZGF0YSgpICk7CiAgICB0bXAgKz0gYzI7CiAgICByZXR1cm4gdG1wOwp9CgogIGlubGlu ZSBjb25zdCBRQ1N0cmluZyBvcGVyYXRvcisoIGNoYXIgYzEsIGNvbnN0IFFDU3RyaW5nICZzMiAp CnsKICAgIFFDU3RyaW5nIHRtcDsKICAgIHRtcCArPSBjMTsKICAgIHRtcCArPSBzMjsKICAgIHJl dHVybiB0bXA7Cn0KCgojIDQzICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXN0cmluZy5oIiAyCgoK CgogCgoKCmNsYXNzIFFSZWdFeHA7CmNsYXNzIFFTdHJpbmc7CmNsYXNzIFFDaGFyUmVmOwoKY2xh c3MgICBRQ2hhciB7CnB1YmxpYzoKICAgIFFDaGFyKCk7CiAgICBRQ2hhciggY2hhciBjICk7CiAg ICBRQ2hhciggdWNoYXIgYyApOwogICAgUUNoYXIoIHVjaGFyIGMsIHVjaGFyIHIgKTsKICAgIFFD aGFyKCBjb25zdCBRQ2hhciYgYyApOwogICAgUUNoYXIoIHVzaG9ydCByYyApOwogICAgUUNoYXIo IHNob3J0IHJjICk7CiAgICBRQ2hhciggdWludCByYyApOwogICAgUUNoYXIoIGludCByYyApOwoK ICAgIHN0YXRpYyBjb25zdCAgUUNoYXIgbnVsbDsgICAgICAgICAgICAgCiAgICBzdGF0aWMgY29u c3QgIFFDaGFyIHJlcGxhY2VtZW50OyAgICAgIAogICAgc3RhdGljIGNvbnN0ICBRQ2hhciBieXRl T3JkZXJNYXJrOyAgICAgIAogICAgc3RhdGljIGNvbnN0ICBRQ2hhciBieXRlT3JkZXJTd2FwcGVk OyAgICAgIAogICAgc3RhdGljIGNvbnN0ICBRQ2hhciBuYnNwOyAgICAgICAgICAgICAKCiAgICAg CgogICAgZW51bSBDYXRlZ29yeQogICAgewogICAgICAgIE5vQ2F0ZWdvcnksCgogICAgICAgIE1h cmtfTm9uU3BhY2luZywgICAgICAgICAgIAogICAgICAgIE1hcmtfU3BhY2luZ0NvbWJpbmluZywg ICAgIAogICAgICAgIE1hcmtfRW5jbG9zaW5nLCAgICAgICAgICAgIAoKICAgICAgICBOdW1iZXJf RGVjaW1hbERpZ2l0LCAgICAgICAKICAgICAgICBOdW1iZXJfTGV0dGVyLCAgICAgICAgICAgICAK ICAgICAgICBOdW1iZXJfT3RoZXIsICAgICAgICAgICAgICAKCiAgICAgICAgU2VwYXJhdG9yX1Nw YWNlLCAgICAgICAgICAgCiAgICAgICAgU2VwYXJhdG9yX0xpbmUsICAgICAgICAgICAgCiAgICAg ICAgU2VwYXJhdG9yX1BhcmFncmFwaCwgICAgICAgCgogICAgICAgIE90aGVyX0NvbnRyb2wsICAg ICAgICAgICAgIAogICAgICAgIE90aGVyX0Zvcm1hdCwgICAgICAgICAgICAgIAogICAgICAgIE90 aGVyX1N1cnJvZ2F0ZSwgICAgICAgICAgIAogICAgICAgIE90aGVyX1ByaXZhdGVVc2UsICAgICAg ICAgIAogICAgICAgIE90aGVyX05vdEFzc2lnbmVkLCAgICAgICAgIAoKICAgICAgICBMZXR0ZXJf VXBwZXJjYXNlLCAgICAgICAgICAKICAgICAgICBMZXR0ZXJfTG93ZXJjYXNlLCAgICAgICAgICAK ICAgICAgICBMZXR0ZXJfVGl0bGVjYXNlLCAgICAgICAgICAKICAgICAgICBMZXR0ZXJfTW9kaWZp ZXIsICAgICAgICAgICAKICAgICAgICBMZXR0ZXJfT3RoZXIsICAgICAgICAgICAgICAKCiAgICAg ICAgUHVuY3R1YXRpb25fQ29ubmVjdG9yLCAgICAgCiAgICAgICAgUHVuY3R1YXRpb25fRGFzaCwg ICAgICAgICAgCiAgICAgICAgUHVuY3R1YXRpb25fRGFzayA9IFB1bmN0dWF0aW9uX0Rhc2gsICAK ICAgICAgICBQdW5jdHVhdGlvbl9PcGVuLCAgICAgICAgICAKICAgICAgICBQdW5jdHVhdGlvbl9D bG9zZSwgICAgICAgICAKICAgICAgICBQdW5jdHVhdGlvbl9Jbml0aWFsUXVvdGUsICAKICAgICAg ICBQdW5jdHVhdGlvbl9GaW5hbFF1b3RlLCAgICAKICAgICAgICBQdW5jdHVhdGlvbl9PdGhlciwg ICAgICAgICAKCiAgICAgICAgU3ltYm9sX01hdGgsICAgICAgICAgICAgICAgCiAgICAgICAgU3lt Ym9sX0N1cnJlbmN5LCAgICAgICAgICAgCiAgICAgICAgU3ltYm9sX01vZGlmaWVyLCAgICAgICAg ICAgCiAgICAgICAgU3ltYm9sX090aGVyICAgICAgICAgICAgICAgCiAgICB9OwoKICAgIGVudW0g RGlyZWN0aW9uCiAgICB7CiAgICAgICAgRGlyTCwgRGlyUiwgRGlyRU4sIERpckVTLCBEaXJFVCwg RGlyQU4sIERpckNTLCBEaXJCLCBEaXJTLCBEaXJXUywgRGlyT04sCiAgICAgICAgRGlyTFJFLCBE aXJMUk8sIERpckFMLCBEaXJSTEUsIERpclJMTywgRGlyUERGLCBEaXJOU00sIERpckJOCiAgICB9 OwoKICAgIGVudW0gRGVjb21wb3NpdGlvbgogICAgewogICAgICAgIFNpbmdsZSwgQ2Fub25pY2Fs LCBGb250LCBOb0JyZWFrLCBJbml0aWFsLCBNZWRpYWwsCiAgICAgICAgRmluYWwsIElzb2xhdGVk LCBDaXJjbGUsIFN1cGVyLCBTdWIsIFZlcnRpY2FsLAogICAgICAgIFdpZGUsIE5hcnJvdywgU21h bGwsIFNxdWFyZSwgQ29tcGF0LCBGcmFjdGlvbgogICAgfTsKCiAgICBlbnVtIEpvaW5pbmcKICAg IHsKICAgICAgICBPdGhlckpvaW5pbmcsIER1YWwsIFJpZ2h0LCBDZW50ZXIKICAgIH07CgogICAg ZW51bSBDb21iaW5pbmdDbGFzcwogICAgewogICAgICAgIENvbWJpbmluZ19CZWxvd0xlZnRBdHRh Y2hlZCAgICAgICA9IDIwMCwKICAgICAgICBDb21iaW5pbmdfQmVsb3dBdHRhY2hlZCAgICAgICAg ICAgPSAyMDIsCiAgICAgICAgQ29tYmluaW5nX0JlbG93UmlnaHRBdHRhY2hlZCAgICAgID0gMjA0 LAogICAgICAgIENvbWJpbmluZ19MZWZ0QXR0YWNoZWQgICAgICAgICAgICA9IDIwOCwKICAgICAg ICBDb21iaW5pbmdfUmlnaHRBdHRhY2hlZCAgICAgICAgICAgPSAyMTAsCiAgICAgICAgQ29tYmlu aW5nX0Fib3ZlTGVmdEF0dGFjaGVkICAgICAgID0gMjEyLAogICAgICAgIENvbWJpbmluZ19BYm92 ZUF0dGFjaGVkICAgICAgICAgICA9IDIxNCwKICAgICAgICBDb21iaW5pbmdfQWJvdmVSaWdodEF0 dGFjaGVkICAgICAgPSAyMTYsCgogICAgICAgIENvbWJpbmluZ19CZWxvd0xlZnQgICAgICAgICAg ICAgICA9IDIxOCwKICAgICAgICBDb21iaW5pbmdfQmVsb3cgICAgICAgICAgICAgICAgICAgPSAy MjAsCiAgICAgICAgQ29tYmluaW5nX0JlbG93UmlnaHQgICAgICAgICAgICAgID0gMjIyLAogICAg ICAgIENvbWJpbmluZ19MZWZ0ICAgICAgICAgICAgICAgICAgICA9IDIyNCwKICAgICAgICBDb21i aW5pbmdfUmlnaHQgICAgICAgICAgICAgICAgICAgPSAyMjYsCiAgICAgICAgQ29tYmluaW5nX0Fi b3ZlTGVmdCAgICAgICAgICAgICAgID0gMjI4LAogICAgICAgIENvbWJpbmluZ19BYm92ZSAgICAg ICAgICAgICAgICAgICA9IDIzMCwKICAgICAgICBDb21iaW5pbmdfQWJvdmVSaWdodCAgICAgICAg ICAgICAgPSAyMzIsCgogICAgICAgIENvbWJpbmluZ19Eb3VibGVCZWxvdyAgICAgICAgICAgICA9 IDIzMywKICAgICAgICBDb21iaW5pbmdfRG91YmxlQWJvdmUgICAgICAgICAgICAgPSAyMzQsCiAg ICAgICAgQ29tYmluaW5nX0lvdGFTdWJzY3JpcHQgICAgICAgICAgID0gMjQwCiAgICB9OwoKICAg ICAKCiAgICBpbnQgZGlnaXRWYWx1ZSgpIGNvbnN0OwogICAgUUNoYXIgbG93ZXIoKSBjb25zdDsK ICAgIFFDaGFyIHVwcGVyKCkgY29uc3Q7CgogICAgQ2F0ZWdvcnkgY2F0ZWdvcnkoKSBjb25zdDsK ICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBjb25zdDsKICAgIEpvaW5pbmcgam9pbmluZygpIGNv bnN0OwogICAgYm9vbCBtaXJyb3JlZCgpIGNvbnN0OwogICAgUUNoYXIgbWlycm9yZWRDaGFyKCkg Y29uc3Q7CiAgICBjb25zdCBRU3RyaW5nICZkZWNvbXBvc2l0aW9uKCkgY29uc3Q7CiAgICBEZWNv bXBvc2l0aW9uIGRlY29tcG9zaXRpb25UYWcoKSBjb25zdDsKICAgIHVuc2lnbmVkIGNoYXIgY29t YmluaW5nQ2xhc3MoKSBjb25zdDsKCiAgICBjaGFyIGxhdGluMSgpIGNvbnN0IHsgcmV0dXJuIHVj cyA+IDB4ZmYgPyAwIDogKGNoYXIpIHVjczsgfQogICAgdXNob3J0IHVuaWNvZGUoKSBjb25zdCB7 IHJldHVybiB1Y3M7IH0KICAgIHVzaG9ydCAmdW5pY29kZSgpIHsgcmV0dXJuIHVjczsgfQoKICAg ICAKICAgIG9wZXJhdG9yIGNoYXIoKSBjb25zdCB7IHJldHVybiBsYXRpbjEoKTsgfQoKCiAgICBi b29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIHVuaWNvZGUoKT09MDsgfQogICAgYm9vbCBpc1By aW50KCkgY29uc3Q7CiAgICBib29sIGlzUHVuY3QoKSBjb25zdDsKICAgIGJvb2wgaXNTcGFjZSgp IGNvbnN0OwogICAgYm9vbCBpc01hcmsoKSBjb25zdDsKICAgIGJvb2wgaXNMZXR0ZXIoKSBjb25z dDsKICAgIGJvb2wgaXNOdW1iZXIoKSBjb25zdDsKICAgIGJvb2wgaXNMZXR0ZXJPck51bWJlcigp IGNvbnN0OwogICAgYm9vbCBpc0RpZ2l0KCkgY29uc3Q7CiAgICBib29sIGlzU3ltYm9sKCkgY29u c3Q7CgogICAgdWNoYXIgY2VsbCgpIGNvbnN0IHsgcmV0dXJuICgodWNoYXIpIHVjcyAmIDB4ZmYp OyB9CiAgICB1Y2hhciByb3coKSBjb25zdCB7IHJldHVybiAoKHVjaGFyKSAodWNzPj44KSYweGZm KTsgfQogICAgdm9pZCBzZXRDZWxsKCB1Y2hhciBjZWxsICkgeyB1Y3MgPSAodWNzICYgMHhmZjAw KSArIGNlbGw7IH0KICAgIHZvaWQgc2V0Um93KCB1Y2hhciByb3cgKSB7IHVjcyA9ICgoKHVzaG9y dCkgcm93KTw8OCkgKyAodWNzJjB4ZmYpOyB9CgogICAgc3RhdGljIGJvb2wgbmV0d29ya09yZGVy ZWQoKSB7CglpbnQgd29yZFNpemU7Cglib29sIGJpZ0VuZGlhbiA9IEZBTFNFOwoJcVN5c0luZm8o ICZ3b3JkU2l6ZSwgJmJpZ0VuZGlhbiApOwoJcmV0dXJuIGJpZ0VuZGlhbjsKICAgIH0KCiAgICBm cmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I9PSggY2hhciBjaCwgUUNoYXIgYyApOwogICAgZnJp ZW5kIGlubGluZSBib29sIG9wZXJhdG9yPT0oIFFDaGFyIGMsIGNoYXIgY2ggKTsKICAgIGZyaWVu ZCBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KCBRQ2hhciBjMSwgUUNoYXIgYzIgKTsKICAgIGZyaWVu ZCBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KCBRQ2hhciBjMSwgUUNoYXIgYzIgKTsKICAgIGZyaWVu ZCBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KCBjaGFyIGNoLCBRQ2hhciBjICk7CiAgICBmcmllbmQg aW5saW5lIGJvb2wgb3BlcmF0b3IhPSggUUNoYXIgYywgY2hhciBjaCApOwogICAgZnJpZW5kIGlu bGluZSBib29sIG9wZXJhdG9yPD0oIFFDaGFyIGMsIGNoYXIgY2ggKTsKICAgIGZyaWVuZCBpbmxp bmUgYm9vbCBvcGVyYXRvcjw9KCBjaGFyIGNoLCBRQ2hhciBjICk7CiAgICBmcmllbmQgaW5saW5l IGJvb2wgb3BlcmF0b3I8PSggUUNoYXIgYzEsIFFDaGFyIGMyICk7Cgpwcml2YXRlOgogICAgdXNo b3J0IHVjczsKCgoKfSAgOwoKaW5saW5lIFFDaGFyOjpRQ2hhcigpCnsKICAgIHVjcyA9IDA7CgoK Cn0KaW5saW5lIFFDaGFyOjpRQ2hhciggY2hhciBjICkKewogICAgdWNzID0gKHVjaGFyKWM7CgoK Cn0KaW5saW5lIFFDaGFyOjpRQ2hhciggdWNoYXIgYyApCnsKICAgIHVjcyA9IGM7CgoKCn0KaW5s aW5lIFFDaGFyOjpRQ2hhciggdWNoYXIgYywgdWNoYXIgciApCnsKICAgIHVjcyA9IChyIDw8IDgp IHwgYzsKCgoKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCBjb25zdCBRQ2hhciYgYyApCnsKICAgIHVj cyA9IGMudWNzOwoKCgp9CgppbmxpbmUgUUNoYXI6OlFDaGFyKCB1c2hvcnQgcmMgKQp7CiAgICB1 Y3MgPSByYzsKCgoKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCBzaG9ydCByYyApCnsKICAgIHVjcyA9 ICh1c2hvcnQpIHJjOwoKCgp9CmlubGluZSBRQ2hhcjo6UUNoYXIoIHVpbnQgcmMgKQp7CiAgICB1 Y3MgPSAodXNob3J0ICkgKHJjICYgMHhmZmZmKTsKCgoKfQppbmxpbmUgUUNoYXI6OlFDaGFyKCBp bnQgcmMgKQp7CiAgICB1Y3MgPSAodXNob3J0KSAocmMgJiAweGZmZmYpOwoKCgp9CgoKaW5saW5l IGJvb2wgb3BlcmF0b3I9PSggY2hhciBjaCwgUUNoYXIgYyApCnsKICAgIHJldHVybiAoKHVjaGFy KSBjaCkgPT0gYy51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yPT0oIFFDaGFyIGMsIGNoYXIg Y2ggKQp7CiAgICByZXR1cm4gKCh1Y2hhcikgY2gpID09IGMudWNzOwp9CgppbmxpbmUgYm9vbCBv cGVyYXRvcj09KCBRQ2hhciBjMSwgUUNoYXIgYzIgKQp7CiAgICByZXR1cm4gYzEudWNzID09IGMy LnVjczsKfQoKaW5saW5lIGJvb2wgb3BlcmF0b3IhPSggUUNoYXIgYzEsIFFDaGFyIGMyICkKewog ICAgcmV0dXJuIGMxLnVjcyAhPSBjMi51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yIT0oIGNo YXIgY2gsIFFDaGFyIGMgKQp7CiAgICByZXR1cm4gKCh1Y2hhciljaCkgIT0gYy51Y3M7Cn0KCmlu bGluZSBib29sIG9wZXJhdG9yIT0oIFFDaGFyIGMsIGNoYXIgY2ggKQp7CiAgICByZXR1cm4gKCh1 Y2hhcikgY2gpICE9IGMudWNzOwp9CgppbmxpbmUgYm9vbCBvcGVyYXRvcjw9KCBRQ2hhciBjLCBj aGFyIGNoICkKewogICAgcmV0dXJuIGMudWNzIDw9ICgodWNoYXIpIGNoKTsKfQoKaW5saW5lIGJv b2wgb3BlcmF0b3I8PSggY2hhciBjaCwgUUNoYXIgYyApCnsKICAgIHJldHVybiAoKHVjaGFyKSBj aCkgPD0gYy51Y3M7Cn0KCmlubGluZSBib29sIG9wZXJhdG9yPD0oIFFDaGFyIGMxLCBRQ2hhciBj MiApCnsKICAgIHJldHVybiBjMS51Y3MgPD0gYzIudWNzOwp9CgppbmxpbmUgYm9vbCBvcGVyYXRv cj49KCBRQ2hhciBjLCBjaGFyIGNoICkgeyByZXR1cm4gY2ggPD0gYzsgfQppbmxpbmUgYm9vbCBv cGVyYXRvcj49KCBjaGFyIGNoLCBRQ2hhciBjICkgeyByZXR1cm4gYyA8PSBjaDsgfQppbmxpbmUg Ym9vbCBvcGVyYXRvcj49KCBRQ2hhciBjMSwgUUNoYXIgYzIgKSB7IHJldHVybiBjMiA8PSBjMTsg fQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIFFDaGFyIGMsIGNoYXIgY2ggKSB7IHJldHVybiAhKGNo PD1jKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIGNoYXIgY2gsIFFDaGFyIGMgKSB7IHJldHVy biAhKGM8PWNoKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcjwoIFFDaGFyIGMxLCBRQ2hhciBjMiAp IHsgcmV0dXJuICEoYzI8PWMxKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4oIFFDaGFyIGMsIGNo YXIgY2ggKSB7IHJldHVybiAhKGNoPj1jKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4oIGNoYXIg Y2gsIFFDaGFyIGMgKSB7IHJldHVybiAhKGM+PWNoKTsgfQppbmxpbmUgYm9vbCBvcGVyYXRvcj4o IFFDaGFyIGMxLCBRQ2hhciBjMiApIHsgcmV0dXJuICEoYzI+PWMxKTsgfQoKIApzdHJ1Y3QgICBR U3RyaW5nRGF0YSA6IHB1YmxpYyBRU2hhcmVkIHsKICAgIFFTdHJpbmdEYXRhKCkgOgogICAgICAg IHVuaWNvZGUoMCksIGFzY2lpKDApLCBsZW4oMCksIHNpbXBsZXRleHQoMSksIG1heGwoMCksIGRp cnR5KDApIHsgcmVmKCk7IH0KICAgIFFTdHJpbmdEYXRhKFFDaGFyICp1LCB1aW50IGwsIHVpbnQg bSkgOgogICAgICAgIHVuaWNvZGUodSksIGFzY2lpKDApLCBsZW4obCksIHNpbXBsZXRleHQoMSks IG1heGwobSksIGRpcnR5KDEpIHsgfQoKICAgIH5RU3RyaW5nRGF0YSgpIHsgaWYgKCB1bmljb2Rl ICkgZGVsZXRlW10gKChjaGFyKil1bmljb2RlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCBh c2NpaSApIGRlbGV0ZVtdIGFzY2lpOyB9CgogICAgdm9pZCBkZWxldGVTZWxmKCk7CiAgICBRQ2hh ciAqdW5pY29kZTsKICAgIGNoYXIgKmFzY2lpOwogICAgdm9pZCBzZXREaXJ0eSgpIHsKCWlmICgg YXNjaWkgKSB7CgkgICAgZGVsZXRlIFtdIGFzY2lpOwoJICAgIGFzY2lpID0gMDsKCX0KCWRpcnR5 ID0gMTsKICAgIH0KCgoKICAgIHVpbnQgbGVuIDogMzA7CgogICAgdWludCBzaW1wbGV0ZXh0IDog MTsKCgoKICAgIHVpbnQgbWF4bCA6IDMwOwoKICAgIHVpbnQgZGlydHkgOiAxOwp9OwoKCmNsYXNz ICAgUVN0cmluZwp7CnB1YmxpYzoKICAgIFFTdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAogICAgUVN0cmluZyggUUNoYXIgKTsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCiAgICBRU3RyaW5nKCBjb25zdCBRU3RyaW5nICYgKTsgICAgICAgICAgICAgICAgICAK ICAgIFFTdHJpbmcoIGNvbnN0IFFCeXRlQXJyYXkmICk7ICAgICAgICAgICAgICAgIAogICAgUVN0 cmluZyggY29uc3QgUUNoYXIqIHVuaWNvZGUsIHVpbnQgbGVuZ3RoICk7ICAKCiAgICBRU3RyaW5n KCBjb25zdCBjaGFyICpzdHIgKTsgICAgICAgICAgICAgICAgICAKCiAgICB+UVN0cmluZygpOwoK ICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yPSggY29uc3QgUVN0cmluZyAmICk7ICAgIAoKICAgIFFT dHJpbmcgICAgJm9wZXJhdG9yPSggY29uc3QgY2hhciAqICk7ICAgICAgIAoKICAgIFFTdHJpbmcg ICAgJm9wZXJhdG9yPSggY29uc3QgUUNTdHJpbmcmICk7ICAgIAogICAgUVN0cmluZyAgICAmb3Bl cmF0b3I9KCBRQ2hhciBjICk7CiAgICBRU3RyaW5nICAgICZvcGVyYXRvcj0oIGNoYXIgYyApOwoK ICAgIHN0YXRpYyBjb25zdCAgUVN0cmluZyBudWxsOwoKICAgIGJvb2wgICAgICAgIGlzTnVsbCgp ICAgICAgICBjb25zdDsKICAgIGJvb2wgICAgICAgIGlzRW1wdHkoKSAgICAgICBjb25zdDsKICAg IHVpbnQgICAgICAgIGxlbmd0aCgpICAgICAgICBjb25zdDsKICAgIHZvaWQgICAgICAgIHRydW5j YXRlKCB1aW50IHBvcyApOwoKICAgIFFTdHJpbmcgJiAgIGZpbGwoIFFDaGFyIGMsIGludCBsZW4g PSAtMSApOwoKICAgIFFTdHJpbmcgICAgIGNvcHkoKSAgY29uc3Q7CgogICAgUVN0cmluZyBhcmco IGxvbmcgYSwgaW50IGZpZWxkd2lkdGg9MCwgaW50IGJhc2U9MTAgKSBjb25zdDsKICAgIFFTdHJp bmcgYXJnKCB1bG9uZyBhLCBpbnQgZmllbGR3aWR0aD0wLCBpbnQgYmFzZT0xMCApIGNvbnN0Owog ICAgUVN0cmluZyBhcmcoIGludCBhLCBpbnQgZmllbGR3aWR0aD0wLCBpbnQgYmFzZT0xMCApIGNv bnN0OwogICAgUVN0cmluZyBhcmcoIHVpbnQgYSwgaW50IGZpZWxkd2lkdGg9MCwgaW50IGJhc2U9 MTAgKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKCBzaG9ydCBhLCBpbnQgZmllbGR3aWR0aD0wLCBp bnQgYmFzZT0xMCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIHVzaG9ydCBhLCBpbnQgZmllbGR3 aWR0aD0wLCBpbnQgYmFzZT0xMCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIGNoYXIgYSwgaW50 IGZpZWxkd2lkdGg9MCApIGNvbnN0OwogICAgUVN0cmluZyBhcmcoIFFDaGFyIGEsIGludCBmaWVs ZHdpZHRoPTAgKSBjb25zdDsKICAgIFFTdHJpbmcgYXJnKCBjb25zdCBRU3RyaW5nJiBhLCBpbnQg ZmllbGR3aWR0aD0wICkgY29uc3Q7CiAgICBRU3RyaW5nIGFyZyggZG91YmxlIGEsIGludCBmaWVs ZHdpZHRoPTAsIGNoYXIgZm10PSdnJywgaW50IHByZWM9LTEgKSBjb25zdDsKCgogICAgUVN0cmlu ZyAgICAmc3ByaW50ZiggY29uc3QgY2hhciogZm9ybWF0LCAuLi4gKQoKICAgICAgICBfX2F0dHJp YnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSkKCiAgICAgICAgOwoKCiAgICBpbnQgICAg ICAgICBmaW5kKCBRQ2hhciBjLCBpbnQgaW5kZXg9MCwgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAg ICBpbnQgICAgICAgICBmaW5kKCBjaGFyIGMsIGludCBpbmRleD0wLCBib29sIGNzPVRSVUUgKSBj b25zdDsKICAgIGludCAgICAgICAgIGZpbmQoIGNvbnN0IFFTdHJpbmcgJnN0ciwgaW50IGluZGV4 PTAsIGJvb2wgY3M9VFJVRSApIGNvbnN0OwoKICAgIGludCAgICAgICAgIGZpbmQoIGNvbnN0IFFS ZWdFeHAgJiwgaW50IGluZGV4PTAgKSBjb25zdDsKCgogICAgaW50ICAgICAgICAgZmluZCggY29u c3QgY2hhciogc3RyLCBpbnQgaW5kZXg9MCApIGNvbnN0OwoKICAgIGludCAgICAgICAgIGZpbmRS ZXYoIFFDaGFyIGMsIGludCBpbmRleD0tMSwgYm9vbCBjcz1UUlVFKSBjb25zdDsKICAgIGludCAg ICAgICAgIGZpbmRSZXYoIGNoYXIgYywgaW50IGluZGV4PS0xLCBib29sIGNzPVRSVUUpIGNvbnN0 OwogICAgaW50ICAgICAgICAgZmluZFJldiggY29uc3QgUVN0cmluZyAmc3RyLCBpbnQgaW5kZXg9 LTEsIGJvb2wgY3M9VFJVRSkgY29uc3Q7CgogICAgaW50ICAgICAgICAgZmluZFJldiggY29uc3Qg UVJlZ0V4cCAmLCBpbnQgaW5kZXg9LTEgKSBjb25zdDsKCgogICAgaW50ICAgICAgICAgZmluZFJl diggY29uc3QgY2hhciogc3RyLCBpbnQgaW5kZXg9LTEgKSBjb25zdDsKCiAgICBpbnQgICAgICAg ICBjb250YWlucyggUUNoYXIgYywgYm9vbCBjcz1UUlVFICkgY29uc3Q7CiAgICBpbnQgICAgICAg ICBjb250YWlucyggY2hhciBjLCBib29sIGNzPVRSVUUgKSBjb25zdAogICAgICAgICAgICAgICAg ICAgIHsgcmV0dXJuIGNvbnRhaW5zKFFDaGFyKGMpLCBjcyk7IH0KCiAgICBpbnQgICAgICAgICBj b250YWlucyggY29uc3QgY2hhciogc3RyLCBib29sIGNzPVRSVUUgKSBjb25zdDsKCiAgICBpbnQg ICAgICAgICBjb250YWlucyggY29uc3QgUVN0cmluZyAmc3RyLCBib29sIGNzPVRSVUUgKSBjb25z dDsKCiAgICBpbnQgICAgICAgICBjb250YWlucyggY29uc3QgUVJlZ0V4cCAmICkgY29uc3Q7CgoK ICAgIGVudW0gU2VjdGlvbkZsYWdzIHsKCVNlY3Rpb25EZWZhdWx0ICAgICAgICAgICAgID0gMHgw MCwKCVNlY3Rpb25Ta2lwRW1wdHkgICAgICAgICAgID0gMHgwMSwKCVNlY3Rpb25JbmNsdWRlTGVh ZGluZ1NlcCAgID0gMHgwMiwKCVNlY3Rpb25JbmNsdWRlVHJhaWxpbmdTZXAgID0gMHgwNCwKCVNl Y3Rpb25DYXNlSW5zZW5zaXRpdmVTZXBzID0gMHgwOAogICAgfTsKICAgIFFTdHJpbmcgICAgIHNl Y3Rpb24oIFFDaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQgZW5kID0gMHhmZmZmZmZmZiwgaW50IGZs YWdzID0gU2VjdGlvbkRlZmF1bHQgKSBjb25zdDsKICAgIFFTdHJpbmcgICAgIHNlY3Rpb24oIGNo YXIgc2VwLCBpbnQgc3RhcnQsIGludCBlbmQgPSAweGZmZmZmZmZmLCBpbnQgZmxhZ3MgPSBTZWN0 aW9uRGVmYXVsdCApIGNvbnN0OwoKICAgIFFTdHJpbmcgICAgICBzZWN0aW9uKCBjb25zdCBjaGFy ICppbl9zZXAsIGludCBzdGFydCwgaW50IGVuZCA9IDB4ZmZmZmZmZmYsIGludCBmbGFncyA9IFNl Y3Rpb25EZWZhdWx0ICkgY29uc3Q7CgogICAgUVN0cmluZyAgICAgc2VjdGlvbiggY29uc3QgUVN0 cmluZyAmaW5fc2VwLCBpbnQgc3RhcnQsIGludCBlbmQgPSAweGZmZmZmZmZmLCBpbnQgZmxhZ3Mg PSBTZWN0aW9uRGVmYXVsdCApIGNvbnN0OwoKICAgIFFTdHJpbmcgICAgIHNlY3Rpb24oIGNvbnN0 IFFSZWdFeHAgJnJlZywgaW50IHN0YXJ0LCBpbnQgZW5kID0gMHhmZmZmZmZmZiwgaW50IGZsYWdz ID0gU2VjdGlvbkRlZmF1bHQgKSBjb25zdDsKCgogICAgUVN0cmluZyAgICAgbGVmdCggdWludCBs ZW4gKSAgY29uc3Q7CiAgICBRU3RyaW5nICAgICByaWdodCggdWludCBsZW4gKSBjb25zdDsKICAg IFFTdHJpbmcgICAgIG1pZCggdWludCBpbmRleCwgdWludCBsZW49MHhmZmZmZmZmZikgY29uc3Q7 CgogICAgUVN0cmluZyAgICAgbGVmdEp1c3RpZnkoIHVpbnQgd2lkdGgsIFFDaGFyIGZpbGw9JyAn LCBib29sIHRydW5jPUZBTFNFKWNvbnN0OwogICAgUVN0cmluZyAgICAgcmlnaHRKdXN0aWZ5KCB1 aW50IHdpZHRoLCBRQ2hhciBmaWxsPScgJyxib29sIHRydW5jPUZBTFNFKWNvbnN0OwoKICAgIFFT dHJpbmcgICAgIGxvd2VyKCkgY29uc3Q7CiAgICBRU3RyaW5nICAgICB1cHBlcigpIGNvbnN0OwoK ICAgIFFTdHJpbmcgICAgIHN0cmlwV2hpdGVTcGFjZSgpICAgICAgIGNvbnN0OwogICAgUVN0cmlu ZyAgICAgc2ltcGxpZnlXaGl0ZVNwYWNlKCkgICAgY29uc3Q7CgogICAgUVN0cmluZyAgICAmaW5z ZXJ0KCB1aW50IGluZGV4LCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgICAgJmluc2Vy dCggdWludCBpbmRleCwgY29uc3QgUUNoYXIqLCB1aW50IGxlbiApOwogICAgUVN0cmluZyAgICAm aW5zZXJ0KCB1aW50IGluZGV4LCBRQ2hhciApOwogICAgUVN0cmluZyAgICAmaW5zZXJ0KCB1aW50 IGluZGV4LCBjaGFyIGMgKSB7IHJldHVybiBpbnNlcnQoaW5kZXgsUUNoYXIoYykpOyB9CiAgICBR U3RyaW5nICAgICZhcHBlbmQoIGNoYXIgKTsKICAgIFFTdHJpbmcgICAgJmFwcGVuZCggUUNoYXIg KTsKICAgIFFTdHJpbmcgICAgJmFwcGVuZCggY29uc3QgUVN0cmluZyAmICk7CiAgICBRU3RyaW5n ICAgICZwcmVwZW5kKCBjaGFyICk7CiAgICBRU3RyaW5nICAgICZwcmVwZW5kKCBRQ2hhciApOwog ICAgUVN0cmluZyAgICAmcHJlcGVuZCggY29uc3QgUVN0cmluZyAmICk7CiAgICBRU3RyaW5nICAg ICZyZW1vdmUoIHVpbnQgaW5kZXgsIHVpbnQgbGVuICk7CiAgICBRU3RyaW5nICAgICZyZXBsYWNl KCB1aW50IGluZGV4LCB1aW50IGxlbiwgY29uc3QgUVN0cmluZyAmICk7CiAgICBRU3RyaW5nICAg ICZyZXBsYWNlKCB1aW50IGluZGV4LCB1aW50IGxlbiwgY29uc3QgUUNoYXIqLCB1aW50IGNsZW4g KTsKCiAgICBRU3RyaW5nICAgICZyZXBsYWNlKCBjb25zdCBRUmVnRXhwICYsIGNvbnN0IFFTdHJp bmcgJiApOwoKICAgIHNob3J0ICAgICAgIHRvU2hvcnQoIGJvb2wgKm9rPTAsIGludCBiYXNlPTEw ICkgICAgICBjb25zdDsKICAgIHVzaG9ydCAgICAgIHRvVVNob3J0KCBib29sICpvaz0wLCBpbnQg YmFzZT0xMCApICAgICBjb25zdDsKICAgIGludCAgICAgICAgIHRvSW50KCBib29sICpvaz0wLCBp bnQgYmFzZT0xMCApICAgICAgICBjb25zdDsKICAgIHVpbnQgICAgICAgIHRvVUludCggYm9vbCAq b2s9MCwgaW50IGJhc2U9MTAgKSAgICAgICBjb25zdDsKICAgIGxvbmcgICAgICAgIHRvTG9uZygg Ym9vbCAqb2s9MCwgaW50IGJhc2U9MTAgKSAgICAgICBjb25zdDsKICAgIHVsb25nICAgICAgIHRv VUxvbmcoIGJvb2wgKm9rPTAsIGludCBiYXNlPTEwICkgICAgICBjb25zdDsKICAgIGZsb2F0ICAg ICAgIHRvRmxvYXQoIGJvb2wgKm9rPTAgKSAgIGNvbnN0OwogICAgZG91YmxlICAgICAgdG9Eb3Vi bGUoIGJvb2wgKm9rPTAgKSAgY29uc3Q7CgogICAgUVN0cmluZyAgICAmc2V0TnVtKCBzaG9ydCwg aW50IGJhc2U9MTAgKTsKICAgIFFTdHJpbmcgICAgJnNldE51bSggdXNob3J0LCBpbnQgYmFzZT0x MCApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCBpbnQsIGludCBiYXNlPTEwICk7CiAgICBRU3Ry aW5nICAgICZzZXROdW0oIHVpbnQsIGludCBiYXNlPTEwICk7CiAgICBRU3RyaW5nICAgICZzZXRO dW0oIGxvbmcsIGludCBiYXNlPTEwICk7CiAgICBRU3RyaW5nICAgICZzZXROdW0oIHVsb25nLCBp bnQgYmFzZT0xMCApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCBmbG9hdCwgY2hhciBmPSdnJywg aW50IHByZWM9NiApOwogICAgUVN0cmluZyAgICAmc2V0TnVtKCBkb3VibGUsIGNoYXIgZj0nZycs IGludCBwcmVjPTYgKTsKCiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIGxvbmcsIGludCBiYXNl PTEwICk7CiAgICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIHVsb25nLCBpbnQgYmFzZT0xMCk7CiAg ICBzdGF0aWMgUVN0cmluZyBudW1iZXIoIGludCwgaW50IGJhc2U9MTAgKTsKICAgIHN0YXRpYyBR U3RyaW5nIG51bWJlciggdWludCwgaW50IGJhc2U9MTApOwogICAgc3RhdGljIFFTdHJpbmcgbnVt YmVyKCBkb3VibGUsIGNoYXIgZj0nZycsIGludCBwcmVjPTYgKTsKCiAgICB2b2lkICAgICAgICBz ZXRFeHBhbmQoIHVpbnQgaW5kZXgsIFFDaGFyIGMgKTsKCiAgICBRU3RyaW5nICAgICZvcGVyYXRv cis9KCBjb25zdCBRU3RyaW5nICZzdHIgKTsKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yKz0oIFFD aGFyIGMgKTsKICAgIFFTdHJpbmcgICAgJm9wZXJhdG9yKz0oIGNoYXIgYyApOwoKICAgIFFDaGFy IGF0KCB1aW50IGkgKSBjb25zdAogICAgICAgIHsgcmV0dXJuIGkgPCBkLT5sZW4gPyBkLT51bmlj b2RlW2ldIDogUUNoYXI6Om51bGw7IH0KICAgIFFDaGFyIG9wZXJhdG9yW10oIGludCBpICkgY29u c3QgeyByZXR1cm4gYXQoKHVpbnQpaSk7IH0KICAgIFFDaGFyUmVmIGF0KCB1aW50IGkgKTsKICAg IFFDaGFyUmVmIG9wZXJhdG9yW10oIGludCBpICk7CgogICAgUUNoYXIgY29uc3RyZWYodWludCBp KSBjb25zdAogICAgICAgIHsgcmV0dXJuIGF0KGkpOyB9CiAgICBRQ2hhciYgcmVmKHVpbnQgaSkK ICAgICAgICB7ICAKICAgICAgICAgICAgaWYgKCBkLT5jb3VudCAhPSAxIHx8IGkgPj0gZC0+bGVu ICkKICAgICAgICAgICAgICAgIHN1YmF0KCBpICk7CiAgICAgICAgICAgIGQtPnNldERpcnR5KCk7 CiAgICAgICAgICAgIHJldHVybiBkLT51bmljb2RlW2ldOwogICAgICAgIH0KCiAgICBjb25zdCBR Q2hhciogdW5pY29kZSgpIGNvbnN0IHsgcmV0dXJuIGQtPnVuaWNvZGU7IH0KICAgIGNvbnN0IGNo YXIqIGFzY2lpKCkgY29uc3QgeyByZXR1cm4gbGF0aW4xKCk7IH0KICAgIGNvbnN0IGNoYXIqIGxh dGluMSgpIGNvbnN0OwogICAgc3RhdGljIFFTdHJpbmcgZnJvbUxhdGluMShjb25zdCBjaGFyKiwg aW50IGxlbj0tMSk7CgogICAgUUNTdHJpbmcgdXRmOCgpIGNvbnN0OwogICAgc3RhdGljIFFTdHJp bmcgZnJvbVV0ZjgoY29uc3QgY2hhciosIGludCBsZW49LTEpOwoKICAgIFFDU3RyaW5nIGxvY2Fs OEJpdCgpIGNvbnN0OwogICAgc3RhdGljIFFTdHJpbmcgZnJvbUxvY2FsOEJpdChjb25zdCBjaGFy KiwgaW50IGxlbj0tMSk7CiAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0OwoKICAgIG9wZXJhdG9y IGNvbnN0IGNoYXIgKigpIGNvbnN0IHsgcmV0dXJuIGxhdGluMSgpOyB9CgoKICAgIFFTdHJpbmcg JnNldFVuaWNvZGUoIGNvbnN0IFFDaGFyKiB1bmljb2RlLCB1aW50IGxlbiApOwogICAgUVN0cmlu ZyAmc2V0VW5pY29kZUNvZGVzKCBjb25zdCB1c2hvcnQqIHVuaWNvZGVfYXNfdXNob3J0cywgdWlu dCBsZW4gKTsKICAgIFFTdHJpbmcgJnNldExhdGluMSggY29uc3QgY2hhciosIGludCBsZW49LTEg KTsKCiAgICBpbnQgY29tcGFyZSggY29uc3QgUVN0cmluZyYgcyApIGNvbnN0OwogICAgc3RhdGlj IGludCBjb21wYXJlKCBjb25zdCBRU3RyaW5nJiBzMSwgY29uc3QgUVN0cmluZyYgczIgKQogICAg eyByZXR1cm4gczEuY29tcGFyZSggczIgKTsgfQoKICAgIGludCBsb2NhbGVBd2FyZUNvbXBhcmUo IGNvbnN0IFFTdHJpbmcmIHMgKSBjb25zdDsKICAgIHN0YXRpYyBpbnQgbG9jYWxlQXdhcmVDb21w YXJlKCBjb25zdCBRU3RyaW5nJiBzMSwgY29uc3QgUVN0cmluZyYgczIgKQogICAgeyByZXR1cm4g czEubG9jYWxlQXdhcmVDb21wYXJlKCBzMiApOyB9CgoKICAgIGZyaWVuZCAgIFFEYXRhU3RyZWFt ICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRU3RyaW5nICYgKTsKCgogICAgdm9pZCBjb21w b3NlKCk7CgoKICAgIGNvbnN0IGNoYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBsYXRpbjEoKTsg fQoKCiAgICBib29sIHN0YXJ0c1dpdGgoIGNvbnN0IFFTdHJpbmcmICkgY29uc3Q7CiAgICBib29s IGVuZHNXaXRoKCBjb25zdCBRU3RyaW5nJiApIGNvbnN0OwoKICAgIHZvaWQgc2V0TGVuZ3RoKCB1 aW50IG5ld0xlbmd0aCApOwoKICAgIGJvb2wgc2ltcGxlVGV4dCgpIGNvbnN0IHsgaWYgKCBkLT5k aXJ0eSApIGNoZWNrU2ltcGxlVGV4dCgpOyByZXR1cm4gKGJvb2wpZC0+c2ltcGxldGV4dDsgfQog ICAgYm9vbCBpc1JpZ2h0VG9MZWZ0KCkgY29uc3Q7Cgpwcml2YXRlOgogICAgIAoKCgoKCgoKCiAg ICBRU3RyaW5nJiByZXBsYWNlKCBjb25zdCBRU3RyaW5nICYsIGNvbnN0IFFTdHJpbmcgJiApIHsg cmV0dXJuICp0aGlzOyB9CgogICAgUVN0cmluZyggaW50IHNpemUsIGJvb2wgICApOwkgCgogICAg dm9pZCBkZXJlZigpOwogICAgdm9pZCByZWFsX2RldGFjaCgpOwogICAgdm9pZCBzdWJhdCggdWlu dCApOwogICAgYm9vbCBmaW5kQXJnKGludCYgcG9zLCBpbnQmIGxlbikgY29uc3Q7CgogICAgdm9p ZCBjaGVja1NpbXBsZVRleHQoKSBjb25zdDsKCiAgICBzdGF0aWMgUUNoYXIqIGFzY2lpVG9Vbmlj b2RlKCBjb25zdCBjaGFyKiwgdWludCAqIGxlbiwgdWludCBtYXhsZW49KHVpbnQpLTEgKTsKICAg IHN0YXRpYyBRQ2hhciogYXNjaWlUb1VuaWNvZGUoIGNvbnN0IFFCeXRlQXJyYXkmLCB1aW50ICog bGVuICk7CiAgICBzdGF0aWMgY2hhciogdW5pY29kZVRvQXNjaWkoIGNvbnN0IFFDaGFyKiwgdWlu dCBsZW4gKTsKCiAgICBRU3RyaW5nRGF0YSAqZDsKICAgIHN0YXRpYyBRU3RyaW5nRGF0YSogc2hh cmVkX251bGw7CiAgICBzdGF0aWMgUVN0cmluZ0RhdGEqIG1ha2VTaGFyZWROdWxsKCk7CgogICAg ZnJpZW5kIGNsYXNzIFFDb25zdFN0cmluZzsKICAgIGZyaWVuZCBjbGFzcyBRVGV4dFN0cmVhbTsK ICAgIFFTdHJpbmcoIFFTdHJpbmdEYXRhKiBkZCwgYm9vbCAgICkgOiBkKGRkKSB7IH0KfTsKCmNs YXNzICAgUUNoYXJSZWYgewogICAgZnJpZW5kIGNsYXNzIFFTdHJpbmc7CiAgICBRU3RyaW5nJiBz OwogICAgdWludCBwOwogICAgUUNoYXJSZWYoUVN0cmluZyogc3RyLCB1aW50IHBvcykgOiBzKCpz dHIpLCBwKHBvcykgeyB9CgpwdWJsaWM6CiAgICAgCgogICAgIAoKICAgIHVzaG9ydCB1bmljb2Rl KCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS51bmljb2RlKCk7IH0KICAgIGNoYXIgbGF0 aW4xKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5sYXRpbjEoKTsgfQoKICAgICAKICAg IFFDaGFyUmVmIG9wZXJhdG9yPShjaGFyIGMgKSB7IHMucmVmKHApPWM7IHJldHVybiAqdGhpczsg fQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KHVjaGFyIGMgKSB7IHMucmVmKHApPWM7IHJldHVybiAq dGhpczsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KFFDaGFyIGMgKSB7IHMucmVmKHApPWM7IHJl dHVybiAqdGhpczsgfQogICAgUUNoYXJSZWYgb3BlcmF0b3I9KGNvbnN0IFFDaGFyUmVmJiBjICkg eyBzLnJlZihwKT1jLnVuaWNvZGUoKTsgcmV0dXJuICp0aGlzOyB9CiAgICBRQ2hhclJlZiBvcGVy YXRvcj0odXNob3J0IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0dXJuICp0aGlzOyB9CiAgICBRQ2hh clJlZiBvcGVyYXRvcj0oc2hvcnQgcmMgKSB7IHMucmVmKHApPXJjOyByZXR1cm4gKnRoaXM7IH0K ICAgIFFDaGFyUmVmIG9wZXJhdG9yPSh1aW50IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0dXJuICp0 aGlzOyB9CiAgICBRQ2hhclJlZiBvcGVyYXRvcj0oaW50IHJjICkgeyBzLnJlZihwKT1yYzsgcmV0 dXJuICp0aGlzOyB9CgogICAgb3BlcmF0b3IgUUNoYXIgKCkgY29uc3QgeyByZXR1cm4gcy5jb25z dHJlZihwKTsgfQoKICAgICAKICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gdW5pY29k ZSgpPT0wOyB9CiAgICBib29sIGlzUHJpbnQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHAp LmlzUHJpbnQoKTsgfQogICAgYm9vbCBpc1B1bmN0KCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJl ZihwKS5pc1B1bmN0KCk7IH0KICAgIGJvb2wgaXNTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIHMuY29u c3RyZWYocCkuaXNTcGFjZSgpOyB9CiAgICBib29sIGlzTWFyaygpIGNvbnN0IHsgcmV0dXJuIHMu Y29uc3RyZWYocCkuaXNNYXJrKCk7IH0KICAgIGJvb2wgaXNMZXR0ZXIoKSBjb25zdCB7IHJldHVy biBzLmNvbnN0cmVmKHApLmlzTGV0dGVyKCk7IH0KICAgIGJvb2wgaXNOdW1iZXIoKSBjb25zdCB7 IHJldHVybiBzLmNvbnN0cmVmKHApLmlzTnVtYmVyKCk7IH0KICAgIGJvb2wgaXNMZXR0ZXJPck51 bWJlcigpIHsgcmV0dXJuIHMuY29uc3RyZWYocCkuaXNMZXR0ZXJPck51bWJlcigpOyB9CiAgICBi b29sIGlzRGlnaXQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmlzRGlnaXQoKTsgfQoK ICAgIGludCBkaWdpdFZhbHVlKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5kaWdpdFZh bHVlKCk7IH0KICAgIFFDaGFyIGxvd2VyKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5s b3dlcigpOyB9CiAgICBRQ2hhciB1cHBlcigpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCku dXBwZXIoKTsgfQoKICAgIFFDaGFyOjpDYXRlZ29yeSBjYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJu IHMuY29uc3RyZWYocCkuY2F0ZWdvcnkoKTsgfQogICAgUUNoYXI6OkRpcmVjdGlvbiBkaXJlY3Rp b24oKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmRpcmVjdGlvbigpOyB9CiAgICBRQ2hh cjo6Sm9pbmluZyBqb2luaW5nKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5qb2luaW5n KCk7IH0KICAgIGJvb2wgbWlycm9yZWQoKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLm1p cnJvcmVkKCk7IH0KICAgIFFDaGFyIG1pcnJvcmVkQ2hhcigpIGNvbnN0IHsgcmV0dXJuIHMuY29u c3RyZWYocCkubWlycm9yZWRDaGFyKCk7IH0KICAgIGNvbnN0IFFTdHJpbmcgJmRlY29tcG9zaXRp b24oKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLmRlY29tcG9zaXRpb24oKTsgfQogICAg UUNoYXI6OkRlY29tcG9zaXRpb24gZGVjb21wb3NpdGlvblRhZygpIGNvbnN0IHsgcmV0dXJuIHMu Y29uc3RyZWYocCkuZGVjb21wb3NpdGlvblRhZygpOyB9CiAgICB1bnNpZ25lZCBjaGFyIGNvbWJp bmluZ0NsYXNzKCkgY29uc3QgeyByZXR1cm4gcy5jb25zdHJlZihwKS5jb21iaW5pbmdDbGFzcygp OyB9CgogICAgIAogICAgdWNoYXIgY2VsbCgpIGNvbnN0IHsgcmV0dXJuIHMuY29uc3RyZWYocCku Y2VsbCgpOyB9CiAgICB1Y2hhciByb3coKSBjb25zdCB7IHJldHVybiBzLmNvbnN0cmVmKHApLnJv dygpOyB9Cgp9OwoKaW5saW5lIFFDaGFyUmVmIFFTdHJpbmc6OmF0KCB1aW50IGkgKSB7IHJldHVy biBRQ2hhclJlZih0aGlzLGkpOyB9CmlubGluZSBRQ2hhclJlZiBRU3RyaW5nOjpvcGVyYXRvcltd KCBpbnQgaSApIHsgcmV0dXJuIGF0KCh1aW50KWkpOyB9CgoKY2xhc3MgICBRQ29uc3RTdHJpbmcg OiBwcml2YXRlIFFTdHJpbmcgewpwdWJsaWM6CiAgICBRQ29uc3RTdHJpbmcoIGNvbnN0IFFDaGFy KiB1bmljb2RlLCB1aW50IGxlbmd0aCApOwogICAgflFDb25zdFN0cmluZygpOwogICAgY29uc3Qg UVN0cmluZyYgc3RyaW5nKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KfTsKCgogCgoKCiAgUURh dGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFTdHJpbmcgJiApOwog IFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRU3RyaW5nICYgKTsKCgog CgoKCiAKIAogCiAKIAppbmxpbmUgUVN0cmluZzo6UVN0cmluZygpIDoKICAgIGQoc2hhcmVkX251 bGwgPyBzaGFyZWRfbnVsbCA6IG1ha2VTaGFyZWROdWxsKCkpCnsKICAgIGQtPnJlZigpOwp9CiAK aW5saW5lIFFTdHJpbmc6On5RU3RyaW5nKCkKewogICAgaWYgKCBkLT5kZXJlZigpICkgewogICAg ICAgIGlmICggZCA9PSBzaGFyZWRfbnVsbCApCiAgICAgICAgICAgIHNoYXJlZF9udWxsID0gMDsK ICAgICAgICBkLT5kZWxldGVTZWxmKCk7CiAgICB9Cn0KCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6 OnNlY3Rpb24oIFFDaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgZmxhZ3MgKSBjb25z dAp7IHJldHVybiBzZWN0aW9uKFFTdHJpbmcoc2VwKSwgc3RhcnQsIGVuZCwgZmxhZ3MpOyB9Cgpp bmxpbmUgUVN0cmluZyBRU3RyaW5nOjpzZWN0aW9uKCBjaGFyIHNlcCwgaW50IHN0YXJ0LCBpbnQg ZW5kLCBpbnQgZmxhZ3MgKSBjb25zdAp7IHJldHVybiBzZWN0aW9uKFFDaGFyKHNlcCksIHN0YXJ0 LCBlbmQsIGZsYWdzKTsgfQoKCmlubGluZSBRU3RyaW5nIFFTdHJpbmc6OnNlY3Rpb24oIGNvbnN0 IGNoYXIgKmluX3NlcCwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgZmxhZ3MgKSBjb25zdAp7IHJl dHVybiBzZWN0aW9uKFFTdHJpbmcoaW5fc2VwKSwgc3RhcnQsIGVuZCwgZmxhZ3MpOyB9CgoKaW5s aW5lIFFTdHJpbmcgJlFTdHJpbmc6Om9wZXJhdG9yPSggUUNoYXIgYyApCnsgcmV0dXJuICp0aGlz ID0gUVN0cmluZyhjKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6Om9wZXJhdG9yPSggY2hh ciBjICkKeyByZXR1cm4gKnRoaXMgPSBRU3RyaW5nKFFDaGFyKGMpKTsgfQoKaW5saW5lIGJvb2wg UVN0cmluZzo6aXNOdWxsKCkgY29uc3QKeyByZXR1cm4gdW5pY29kZSgpID09IDA7IH0KCmlubGlu ZSBib29sIFFTdHJpbmc6Om9wZXJhdG9yISgpIGNvbnN0CnsgcmV0dXJuIGlzTnVsbCgpOyB9Cgpp bmxpbmUgdWludCBRU3RyaW5nOjpsZW5ndGgoKSBjb25zdAp7IHJldHVybiBkLT5sZW47IH0KCmlu bGluZSBib29sIFFTdHJpbmc6OmlzRW1wdHkoKSBjb25zdAp7IHJldHVybiBsZW5ndGgoKSA9PSAw OyB9CgppbmxpbmUgUVN0cmluZyBRU3RyaW5nOjpjb3B5KCkgY29uc3QKeyByZXR1cm4gUVN0cmlu ZyggKnRoaXMgKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnByZXBlbmQoIGNvbnN0IFFT dHJpbmcgJiBzICkKeyByZXR1cm4gaW5zZXJ0KDAscyk7IH0KCmlubGluZSBRU3RyaW5nICZRU3Ry aW5nOjpwcmVwZW5kKCBRQ2hhciBjICkKeyByZXR1cm4gaW5zZXJ0KDAsYyk7IH0KCmlubGluZSBR U3RyaW5nICZRU3RyaW5nOjpwcmVwZW5kKCBjaGFyIGMgKQp7IHJldHVybiBpbnNlcnQoMCxjKTsg fQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OmFwcGVuZCggY29uc3QgUVN0cmluZyAmIHMgKQp7 IHJldHVybiBvcGVyYXRvcis9KHMpOyB9CgppbmxpbmUgUVN0cmluZyAmUVN0cmluZzo6YXBwZW5k KCBRQ2hhciBjICkKeyByZXR1cm4gb3BlcmF0b3IrPShjKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFT dHJpbmc6OmFwcGVuZCggY2hhciBjICkKeyByZXR1cm4gb3BlcmF0b3IrPShjKTsgfQoKaW5saW5l IFFTdHJpbmcgJlFTdHJpbmc6OnNldE51bSggc2hvcnQgbiwgaW50IGJhc2UgKQp7IHJldHVybiBz ZXROdW0oKGxvbmcpbiwgYmFzZSk7IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpzZXROdW0o IHVzaG9ydCBuLCBpbnQgYmFzZSApCnsgcmV0dXJuIHNldE51bSgodWxvbmcpbiwgYmFzZSk7IH0K CmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpzZXROdW0oIGludCBuLCBpbnQgYmFzZSApCnsgcmV0 dXJuIHNldE51bSgobG9uZyluLCBiYXNlKTsgfQoKaW5saW5lIFFTdHJpbmcgJlFTdHJpbmc6OnNl dE51bSggdWludCBuLCBpbnQgYmFzZSApCnsgcmV0dXJuIHNldE51bSgodWxvbmcpbiwgYmFzZSk7 IH0KCmlubGluZSBRU3RyaW5nICZRU3RyaW5nOjpzZXROdW0oIGZsb2F0IG4sIGNoYXIgZiwgaW50 IHByZWMgKQp7IHJldHVybiBzZXROdW0oKGRvdWJsZSluLGYscHJlYyk7IH0KCmlubGluZSBRU3Ry aW5nIFFTdHJpbmc6OmFyZyhpbnQgYSwgaW50IGZpZWxkd2lkdGgsIGludCBiYXNlKSBjb25zdAp7 IHJldHVybiBhcmcoKGxvbmcpYSwgZmllbGR3aWR0aCwgYmFzZSk7IH0KCmlubGluZSBRU3RyaW5n IFFTdHJpbmc6OmFyZyh1aW50IGEsIGludCBmaWVsZHdpZHRoLCBpbnQgYmFzZSkgY29uc3QKeyBy ZXR1cm4gYXJnKCh1bG9uZylhLCBmaWVsZHdpZHRoLCBiYXNlKTsgfQoKaW5saW5lIFFTdHJpbmcg UVN0cmluZzo6YXJnKHNob3J0IGEsIGludCBmaWVsZHdpZHRoLCBpbnQgYmFzZSkgY29uc3QKeyBy ZXR1cm4gYXJnKChsb25nKWEsIGZpZWxkd2lkdGgsIGJhc2UpOyB9CgppbmxpbmUgUVN0cmluZyBR U3RyaW5nOjphcmcodXNob3J0IGEsIGludCBmaWVsZHdpZHRoLCBpbnQgYmFzZSkgY29uc3QKeyBy ZXR1cm4gYXJnKCh1bG9uZylhLCBmaWVsZHdpZHRoLCBiYXNlKTsgfQoKaW5saW5lIGludCBRU3Ry aW5nOjpmaW5kKCBjaGFyIGMsIGludCBpbmRleCwgYm9vbCBjcyApIGNvbnN0CnsgcmV0dXJuIGZp bmQoUUNoYXIoYyksIGluZGV4LCBjcyk7IH0KCmlubGluZSBpbnQgUVN0cmluZzo6ZmluZFJldigg Y2hhciBjLCBpbnQgaW5kZXgsIGJvb2wgY3MpIGNvbnN0CnsgcmV0dXJuIGZpbmRSZXYoIFFDaGFy KGMpLCBpbmRleCwgY3MgKTsgfQoKCgppbmxpbmUgaW50IFFTdHJpbmc6OmZpbmQoIGNvbnN0IGNo YXIqIHN0ciwgaW50IGluZGV4ICkgY29uc3QKeyByZXR1cm4gZmluZChRU3RyaW5nOjpmcm9tTGF0 aW4xKHN0ciksIGluZGV4KTsgfQoKaW5saW5lIGludCBRU3RyaW5nOjpmaW5kUmV2KCBjb25zdCBj aGFyKiBzdHIsIGludCBpbmRleCApIGNvbnN0CnsgcmV0dXJuIGZpbmRSZXYoUVN0cmluZzo6ZnJv bUxhdGluMShzdHIpLCBpbmRleCk7IH0KCgoKIAoKCgogIGJvb2wgb3BlcmF0b3IhPSggY29uc3Qg UVN0cmluZyAmczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcjwoIGNvbnN0 IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwogIGJvb2wgb3BlcmF0b3I8PSggY29u c3QgUVN0cmluZyAmczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcj09KCBj b25zdCBRU3RyaW5nICZzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKICBib29sIG9wZXJhdG9yPigg Y29uc3QgUVN0cmluZyAmczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcj49 KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKCiAgYm9vbCBvcGVyYXRv ciE9KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKICBib29sIG9wZXJhdG9y PCggY29uc3QgUVN0cmluZyAmczEsIGNvbnN0IGNoYXIgKnMyICk7CiAgYm9vbCBvcGVyYXRvcjw9 KCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKICBib29sIG9wZXJhdG9yPT0o IGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApOwogIGJvb2wgb3BlcmF0b3I+KCBj b25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hhciAqczIgKTsKICBib29sIG9wZXJhdG9yPj0oIGNv bnN0IFFTdHJpbmcgJnMxLCBjb25zdCBjaGFyICpzMiApOwogIGJvb2wgb3BlcmF0b3IhPSggY29u c3QgY2hhciAqczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcjwoIGNvbnN0 IGNoYXIgKnMxLCBjb25zdCBRU3RyaW5nICZzMiApOwogIGJvb2wgb3BlcmF0b3I8PSggY29uc3Qg Y2hhciAqczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CiAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBj aGFyICpzMSwgY29uc3QgUVN0cmluZyAmczIgKTsKIAogIGJvb2wgb3BlcmF0b3I+PSggY29uc3Qg Y2hhciAqczEsIGNvbnN0IFFTdHJpbmcgJnMyICk7CgoKICBpbmxpbmUgY29uc3QgUVN0cmluZyBv cGVyYXRvcisoIGNvbnN0IFFTdHJpbmcgJnMxLCBjb25zdCBRU3RyaW5nICZzMiApCnsKICAgIFFT dHJpbmcgdG1wKCBzMSApOwogICAgdG1wICs9IHMyOwogICAgcmV0dXJuIHRtcDsKfQoKCiAgaW5s aW5lIGNvbnN0IFFTdHJpbmcgb3BlcmF0b3IrKCBjb25zdCBRU3RyaW5nICZzMSwgY29uc3QgY2hh ciAqczIgKQp7CiAgICBRU3RyaW5nIHRtcCggczEgKTsKICAgIHRtcCArPSBRU3RyaW5nOjpmcm9t TGF0aW4xKHMyKTsKICAgIHJldHVybiB0bXA7Cn0KCiAgaW5saW5lIGNvbnN0IFFTdHJpbmcgb3Bl cmF0b3IrKCBjb25zdCBjaGFyICpzMSwgY29uc3QgUVN0cmluZyAmczIgKQp7CiAgICBRU3RyaW5n IHRtcCA9IFFTdHJpbmc6OmZyb21MYXRpbjEoIHMxICk7CiAgICB0bXAgKz0gczI7CiAgICByZXR1 cm4gdG1wOwp9CgoKICBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoIGNvbnN0IFFTdHJp bmcgJnMxLCBRQ2hhciBjMiApCnsKICAgIFFTdHJpbmcgdG1wKCBzMSApOwogICAgdG1wICs9IGMy OwogICAgcmV0dXJuIHRtcDsKfQoKICBpbmxpbmUgY29uc3QgUVN0cmluZyBvcGVyYXRvcisoIGNv bnN0IFFTdHJpbmcgJnMxLCBjaGFyIGMyICkKewogICAgUVN0cmluZyB0bXAoIHMxICk7CiAgICB0 bXAgKz0gYzI7CiAgICByZXR1cm4gdG1wOwp9CgogIGlubGluZSBjb25zdCBRU3RyaW5nIG9wZXJh dG9yKyggUUNoYXIgYzEsIGNvbnN0IFFTdHJpbmcgJnMyICkKewogICAgUVN0cmluZyB0bXA7CiAg ICB0bXAgKz0gYzE7CiAgICB0bXAgKz0gczI7CiAgICByZXR1cm4gdG1wOwp9CgogIGlubGluZSBj b25zdCBRU3RyaW5nIG9wZXJhdG9yKyggY2hhciBjMSwgY29uc3QgUVN0cmluZyAmczIgKQp7CiAg ICBRU3RyaW5nIHRtcDsKICAgIHRtcCArPSBjMTsKICAgIHRtcCArPSBzMjsKICAgIHJldHVybiB0 bXA7Cn0KCgoKCgoKCgoKCiMgNDQgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2luZG93ZGVmcy5o IiAyCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbmFtZXNwYWNlLmgiIDEKIAoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFDb2xvcjsKY2xhc3Mg UUN1cnNvcjsKCgpjbGFzcyAgIFF0IHsKcHVibGljOgogICAgc3RhdGljIGNvbnN0ICBRQ29sb3Ig JiBjb2xvcjA7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGNvbG9yMTsKICAgIHN0YXRpYyBj b25zdCAgUUNvbG9yICYgYmxhY2s7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIHdoaXRlOwog ICAgc3RhdGljIGNvbnN0ICBRQ29sb3IgJiBkYXJrR3JheTsKICAgIHN0YXRpYyBjb25zdCAgUUNv bG9yICYgZ3JheTsKICAgIHN0YXRpYyBjb25zdCAgUUNvbG9yICYgbGlnaHRHcmF5OwogICAgc3Rh dGljIGNvbnN0ICBRQ29sb3IgJiByZWQ7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGdyZWVu OwogICAgc3RhdGljIGNvbnN0ICBRQ29sb3IgJiBibHVlOwogICAgc3RhdGljIGNvbnN0ICBRQ29s b3IgJiBjeWFuOwogICAgc3RhdGljIGNvbnN0ICBRQ29sb3IgJiBtYWdlbnRhOwogICAgc3RhdGlj IGNvbnN0ICBRQ29sb3IgJiB5ZWxsb3c7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGRhcmtS ZWQ7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGRhcmtHcmVlbjsKICAgIHN0YXRpYyBjb25z dCAgUUNvbG9yICYgZGFya0JsdWU7CiAgICBzdGF0aWMgY29uc3QgIFFDb2xvciAmIGRhcmtDeWFu OwogICAgc3RhdGljIGNvbnN0ICBRQ29sb3IgJiBkYXJrTWFnZW50YTsKICAgIHN0YXRpYyBjb25z dCAgUUNvbG9yICYgZGFya1llbGxvdzsKCiAgICAgCiAgICBlbnVtIEJ1dHRvblN0YXRlIHsJCQkJ IAoJTm9CdXR0b24JPSAweDAwMDAsCglMZWZ0QnV0dG9uCT0gMHgwMDAxLAoJUmlnaHRCdXR0b24J PSAweDAwMDIsCglNaWRCdXR0b24JPSAweDAwMDQsCglNb3VzZUJ1dHRvbk1hc2sgPSAweDAwMDcs CglTaGlmdEJ1dHRvbgk9IDB4MDEwMCwKCUNvbnRyb2xCdXR0b24gICA9IDB4MDIwMCwKCUFsdEJ1 dHRvbgk9IDB4MDQwMCwKCU1ldGFCdXR0b24JPSAweDA4MDAsCglLZXlCdXR0b25NYXNrCT0gMHgw ZjAwLAoJS2V5cGFkCQk9IDB4NDAwMAogICAgfTsKCiAgICAgCiAgICAgCiAgICBlbnVtIE9yaWVu dGF0aW9uIHsKICAgICAgICBIb3Jpem9udGFsID0gMCwKCVZlcnRpY2FsCiAgICB9OwoKICAgICAK ICAgICAKICAgICAKCiAgICAgCiAgICBlbnVtIEFsaWdubWVudEZsYWdzIHsKCUFsaWduQXV0bwkJ PSAweDAwMDAsIAkgCglBbGlnbkxlZnQJCT0gMHgwMDAxLAoJQWxpZ25SaWdodAkJPSAweDAwMDIs CglBbGlnbkhDZW50ZXIJCT0gMHgwMDA0LAoJQWxpZ25KdXN0aWZ5CQk9IDB4MDAwOCwKCUFsaWdu SG9yaXpvbnRhbF9NYXNrCT0gQWxpZ25MZWZ0IHwgQWxpZ25SaWdodCB8IEFsaWduSENlbnRlciB8 IEFsaWduSnVzdGlmeSwKCUFsaWduVG9wCQk9IDB4MDAxMCwKCUFsaWduQm90dG9tCQk9IDB4MDAy MCwKCUFsaWduVkNlbnRlcgkJPSAweDAwNDAsCglBbGlnblZlcnRpY2FsX01hc2sgCT0gQWxpZ25U b3AgfCBBbGlnbkJvdHRvbSB8IEFsaWduVkNlbnRlciwKCUFsaWduQ2VudGVyCQk9IEFsaWduVkNl bnRlciB8IEFsaWduSENlbnRlcgogICAgfTsKCiAgICAgCiAgICBlbnVtIFRleHRGbGFncyB7CglT aW5nbGVMaW5lCT0gMHgwMDgwLAkJIAoJRG9udENsaXAJPSAweDAxMDAsCglFeHBhbmRUYWJzCT0g MHgwMjAwLAoJU2hvd1ByZWZpeAk9IDB4MDQwMCwKCVdvcmRCcmVhawk9IDB4MDgwMCwKCUJyZWFr QW55d2hlcmUgPSAweDEwMDAsCglEb250UHJpbnQJPSAweDIwMDAsCQkgCglOb0FjY2VsID0gMHg0 MDAwCiAgICB9OwoKICAgICAKICAgIHR5cGVkZWYgdWludCBXU3RhdGU7CgogICAgIAogICAgZW51 bSBXaWRnZXRTdGF0ZSB7CglXU3RhdGVfQ3JlYXRlZAkJPSAweDAwMDAwMDAxLAoJV1N0YXRlX0Rp c2FibGVkCQk9IDB4MDAwMDAwMDIsCglXU3RhdGVfVmlzaWJsZQkJPSAweDAwMDAwMDA0LAoJV1N0 YXRlX0ZvcmNlSGlkZQk9IDB4MDAwMDAwMDgsCglXU3RhdGVfT3duQ3Vyc29yCT0gMHgwMDAwMDAx MCwKCVdTdGF0ZV9Nb3VzZVRyYWNraW5nCT0gMHgwMDAwMDAyMCwKCVdTdGF0ZV9Db21wcmVzc0tl eXMJPSAweDAwMDAwMDQwLAoJV1N0YXRlX0Jsb2NrVXBkYXRlcwk9IDB4MDAwMDAwODAsCglXU3Rh dGVfSW5QYWludEV2ZW50CT0gMHgwMDAwMDEwMCwKCVdTdGF0ZV9SZXBhcmVudGVkCT0gMHgwMDAw MDIwMCwKCVdTdGF0ZV9Db25maWdQZW5kaW5nCT0gMHgwMDAwMDQwMCwKCVdTdGF0ZV9SZXNpemVk CQk9IDB4MDAwMDA4MDAsCglXU3RhdGVfQXV0b01hc2sJCT0gMHgwMDAwMTAwMCwKCVdTdGF0ZV9Q b2xpc2hlZAkJPSAweDAwMDAyMDAwLAoJV1N0YXRlX0RORAkJPSAweDAwMDA0MDAwLAoJV1N0YXRl X1Jlc2VydmVkMAk9IDB4MDAwMDgwMDAsCglXU3RhdGVfUmVzZXJ2ZWQxCT0gMHgwMDAxMDAwMCwK CVdTdGF0ZV9SZXNlcnZlZDIJPSAweDAwMDIwMDAwLAoJV1N0YXRlX1Jlc2VydmVkMwk9IDB4MDAw NDAwMDAsCglXU3RhdGVfTWF4aW1pemVkCT0gMHgwMDA4MDAwMCwKCVdTdGF0ZV9NaW5pbWl6ZWQJ PSAweDAwMTAwMDAwLAoJV1N0YXRlX0ZvcmNlRGlzYWJsZWQJPSAweDAwMjAwMDAwLAoJV1N0YXRl X0V4cG9zZWQJCT0gMHgwMDQwMDAwMCwKCVdTdGF0ZV9IYXNNb3VzZQkJPSAweDAwODAwMDAwCiAg ICB9OwoKICAgICAKICAgIHR5cGVkZWYgdWludCBXRmxhZ3M7CgogICAgIAogICAgZW51bSBXaWRn ZXRGbGFncyB7CglXVHlwZV9Ub3BMZXZlbAkJPSAweDAwMDAwMDAxLAkgCglXVHlwZV9EaWFsb2cJ CT0gMHgwMDAwMDAwMiwKCVdUeXBlX1BvcHVwCQk9IDB4MDAwMDAwMDQsCglXVHlwZV9EZXNrdG9w CQk9IDB4MDAwMDAwMDgsCglXVHlwZV9NYXNrCQk9IDB4MDAwMDAwMGYsCgoJV1N0eWxlX0N1c3Rv bWl6ZQk9IDB4MDAwMDAwMTAsCSAKCVdTdHlsZV9Ob3JtYWxCb3JkZXIJPSAweDAwMDAwMDIwLAoJ V1N0eWxlX0RpYWxvZ0JvcmRlcgk9IDB4MDAwMDAwNDAsICAKCVdTdHlsZV9Ob0JvcmRlcgkJPSAw eDAwMDAyMDAwLAoJV1N0eWxlX1RpdGxlCQk9IDB4MDAwMDAwODAsCglXU3R5bGVfU3lzTWVudQkJ PSAweDAwMDAwMTAwLAoJV1N0eWxlX01pbmltaXplCQk9IDB4MDAwMDAyMDAsCglXU3R5bGVfTWF4 aW1pemUJCT0gMHgwMDAwMDQwMCwKCVdTdHlsZV9NaW5NYXgJCT0gV1N0eWxlX01pbmltaXplIHwg V1N0eWxlX01heGltaXplLAoJV1N0eWxlX1Rvb2wJCT0gMHgwMDAwMDgwMCwKCVdTdHlsZV9TdGF5 c09uVG9wCT0gMHgwMDAwMTAwMCwKCVdTdHlsZV9Db250ZXh0SGVscAk9IDB4MDAwMDQwMDAsCglX U3R5bGVfUmVzZXJ2ZWQJCT0gMHgwMDAwODAwMCwKCVdTdHlsZV9NYXNrCQk9IDB4MDAwMGZmZjAs CgoJV0Rlc3RydWN0aXZlQ2xvc2UJPSAweDAwMDEwMDAwLAkgCglXUGFpbnREZXNrdG9wCQk9IDB4 MDAwMjAwMDAsCglXUGFpbnRVbmNsaXBwZWQJCT0gMHgwMDA0MDAwMCwKCVdQYWludENsZXZlcgkJ PSAweDAwMDgwMDAwLAoJV1Jlc2l6ZU5vRXJhc2UJCT0gMHgwMDEwMDAwMCwKCVdNb3VzZU5vTWFz awkJPSAweDAwMjAwMDAwLAoJV1N0YXRpY0NvbnRlbnRzCQk9IDB4MDA0MDAwMDAsCglXUmVwYWlu dE5vRXJhc2UJCT0gMHgwMDgwMDAwMCwKCglXWDExQnlwYXNzV00JCT0gMHgwMTAwMDAwMCwKCVdX aW5Pd25EQwkJPSAweDAwMDAwMDAwLAoKCgoKCVdHcm91cExlYWRlciAJCT0gMHgwMjAwMDAwMCwK CVdTaG93TW9kYWwgCSAgICAgICAJPSAweDA0MDAwMDAwLAoJV05vTW91c2VQcm9wYWdhdGlvbgk9 IDB4MDgwMDAwMDAsCglXU3ViV2luZG93ICAgICAgICAgICAgICA9IDB4MTAwMDAwMDAKCgksCglX Tm9ydGhXZXN0R3Jhdml0eQk9IFdTdGF0aWNDb250ZW50cywKCVdUeXBlX01vZGFsCQk9IFdUeXBl X0RpYWxvZyB8IFdTaG93TW9kYWwsCglXU3R5bGVfRGlhbG9nIAkJPSBXVHlwZV9EaWFsb2csCglX U3R5bGVfTm9Cb3JkZXJFeAk9IFdTdHlsZV9Ob0JvcmRlcgoKICAgIH07CgogICAgIAogICAgIAog ICAgIAoKICAgIGVudW0gSW1hZ2VDb252ZXJzaW9uRmxhZ3MgewoJQ29sb3JNb2RlX01hc2sJCT0g MHgwMDAwMDAwMywKCUF1dG9Db2xvcgkJPSAweDAwMDAwMDAwLAoJQ29sb3JPbmx5CQk9IDB4MDAw MDAwMDMsCglNb25vT25seQkJPSAweDAwMDAwMDAyLAoJIAoKCUFscGhhRGl0aGVyX01hc2sJPSAw eDAwMDAwMDBjLAoJVGhyZXNob2xkQWxwaGFEaXRoZXIJPSAweDAwMDAwMDAwLAoJT3JkZXJlZEFs cGhhRGl0aGVyCT0gMHgwMDAwMDAwNCwKCURpZmZ1c2VBbHBoYURpdGhlcgk9IDB4MDAwMDAwMDgs CglOb0FscGhhCQkJPSAweDAwMDAwMDBjLCAgCgoJRGl0aGVyX01hc2sJCT0gMHgwMDAwMDAzMCwK CURpZmZ1c2VEaXRoZXIJCT0gMHgwMDAwMDAwMCwKCU9yZGVyZWREaXRoZXIJCT0gMHgwMDAwMDAx MCwKCVRocmVzaG9sZERpdGhlcgkJPSAweDAwMDAwMDIwLAoJIAoKCURpdGhlck1vZGVfTWFzawkJ PSAweDAwMDAwMGMwLAoJQXV0b0RpdGhlcgkJPSAweDAwMDAwMDAwLAoJUHJlZmVyRGl0aGVyCQk9 IDB4MDAwMDAwNDAsCglBdm9pZERpdGhlcgkJPSAweDAwMDAwMDgwCiAgICB9OwoKICAgICAKICAg IGVudW0gQkdNb2RlCXsJCQkJIAoJVHJhbnNwYXJlbnRNb2RlLAoJT3BhcXVlTW9kZQogICAgfTsK CgogICAgIAogICAgZW51bSBQYWludFVuaXQgewkJCQkgCglQaXhlbFVuaXQsCglMb01ldHJpY1Vu aXQsICAKCUhpTWV0cmljVW5pdCwgIAoJTG9FbmdsaXNoVW5pdCwgIAoJSGlFbmdsaXNoVW5pdCwg IAoJVHdpcHNVbml0ICAKICAgIH07CgoKICAgICAKCgoKCgoKICAgIGVudW0gR1VJU3R5bGUgewoJ TWFjU3R5bGUsICAKCVdpbmRvd3NTdHlsZSwKCVdpbjNTdHlsZSwgIAoJUE1TdHlsZSwgIAoJTW90 aWZTdHlsZQogICAgfTsKCgogICAgIAogICAgZW51bSBNb2RpZmllciB7CQkgCglTSElGVCAgICAg ICAgID0gMHgwMDIwMDAwMCwKCUNUUkwgICAgICAgICAgPSAweDAwNDAwMDAwLAoJQUxUICAgICAg ICAgICA9IDB4MDA4MDAwMDAsCglNT0RJRklFUl9NQVNLID0gMHgwMGUwMDAwMCwKCVVOSUNPREVf QUNDRUwgPSAweDEwMDAwMDAwLAoKCUFTQ0lJX0FDQ0VMID0gVU5JQ09ERV9BQ0NFTCAgCiAgICB9 OwoKICAgICAKICAgIGVudW0gS2V5IHsKCUtleV9Fc2NhcGUgPSAweDEwMDAsCQkgCglLZXlfVGFi ID0gMHgxMDAxLAoJS2V5X0JhY2t0YWIgPSAweDEwMDIsIEtleV9CYWNrVGFiID0gS2V5X0JhY2t0 YWIsCglLZXlfQmFja3NwYWNlID0gMHgxMDAzLCBLZXlfQmFja1NwYWNlID0gS2V5X0JhY2tzcGFj ZSwKCUtleV9SZXR1cm4gPSAweDEwMDQsCglLZXlfRW50ZXIgPSAweDEwMDUsCglLZXlfSW5zZXJ0 ID0gMHgxMDA2LAoJS2V5X0RlbGV0ZSA9IDB4MTAwNywKCUtleV9QYXVzZSA9IDB4MTAwOCwKCUtl eV9QcmludCA9IDB4MTAwOSwKCUtleV9TeXNSZXEgPSAweDEwMGEsCglLZXlfSG9tZSA9IDB4MTAx MCwJCSAKCUtleV9FbmQgPSAweDEwMTEsCglLZXlfTGVmdCA9IDB4MTAxMiwKCUtleV9VcCA9IDB4 MTAxMywKCUtleV9SaWdodCA9IDB4MTAxNCwKCUtleV9Eb3duID0gMHgxMDE1LAoJS2V5X1ByaW9y ID0gMHgxMDE2LCBLZXlfUGFnZVVwID0gS2V5X1ByaW9yLAoJS2V5X05leHQgPSAweDEwMTcsIEtl eV9QYWdlRG93biA9IEtleV9OZXh0LAoJS2V5X1NoaWZ0ID0gMHgxMDIwLAkJIAoJS2V5X0NvbnRy b2wgPSAweDEwMjEsCglLZXlfTWV0YSA9IDB4MTAyMiwKCUtleV9BbHQgPSAweDEwMjMsCglLZXlf Q2Fwc0xvY2sgPSAweDEwMjQsCglLZXlfTnVtTG9jayA9IDB4MTAyNSwKCUtleV9TY3JvbGxMb2Nr ID0gMHgxMDI2LAoJS2V5X0YxID0gMHgxMDMwLAkJIAoJS2V5X0YyID0gMHgxMDMxLAoJS2V5X0Yz ID0gMHgxMDMyLAoJS2V5X0Y0ID0gMHgxMDMzLAoJS2V5X0Y1ID0gMHgxMDM0LAoJS2V5X0Y2ID0g MHgxMDM1LAoJS2V5X0Y3ID0gMHgxMDM2LAoJS2V5X0Y4ID0gMHgxMDM3LAoJS2V5X0Y5ID0gMHgx MDM4LAoJS2V5X0YxMCA9IDB4MTAzOSwKCUtleV9GMTEgPSAweDEwM2EsCglLZXlfRjEyID0gMHgx MDNiLAoJS2V5X0YxMyA9IDB4MTAzYywKCUtleV9GMTQgPSAweDEwM2QsCglLZXlfRjE1ID0gMHgx MDNlLAoJS2V5X0YxNiA9IDB4MTAzZiwKCUtleV9GMTcgPSAweDEwNDAsCglLZXlfRjE4ID0gMHgx MDQxLAoJS2V5X0YxOSA9IDB4MTA0MiwKCUtleV9GMjAgPSAweDEwNDMsCglLZXlfRjIxID0gMHgx MDQ0LAoJS2V5X0YyMiA9IDB4MTA0NSwKCUtleV9GMjMgPSAweDEwNDYsCglLZXlfRjI0ID0gMHgx MDQ3LAoJS2V5X0YyNSA9IDB4MTA0OCwJCSAKCUtleV9GMjYgPSAweDEwNDksCglLZXlfRjI3ID0g MHgxMDRhLAoJS2V5X0YyOCA9IDB4MTA0YiwKCUtleV9GMjkgPSAweDEwNGMsCglLZXlfRjMwID0g MHgxMDRkLAoJS2V5X0YzMSA9IDB4MTA0ZSwKCUtleV9GMzIgPSAweDEwNGYsCglLZXlfRjMzID0g MHgxMDUwLAoJS2V5X0YzNCA9IDB4MTA1MSwKCUtleV9GMzUgPSAweDEwNTIsCglLZXlfU3VwZXJf TCA9IDB4MTA1MywgCQkgCglLZXlfU3VwZXJfUiA9IDB4MTA1NCwKCUtleV9NZW51ID0gMHgxMDU1 LAoJS2V5X0h5cGVyX0wgPSAweDEwNTYsCglLZXlfSHlwZXJfUiA9IDB4MTA1NywKCUtleV9IZWxw ID0gMHgxMDU4LAoJS2V5X0RpcmVjdGlvbl9MID0gMHgxMDU5LAoJS2V5X0RpcmVjdGlvbl9SID0g MHgxMDYwLAoJS2V5X1NwYWNlID0gMHgyMCwJCSAKCUtleV9BbnkgPSBLZXlfU3BhY2UsCglLZXlf RXhjbGFtID0gMHgyMSwKCUtleV9RdW90ZURibCA9IDB4MjIsCglLZXlfTnVtYmVyU2lnbiA9IDB4 MjMsCglLZXlfRG9sbGFyID0gMHgyNCwKCUtleV9QZXJjZW50ID0gMHgyNSwKCUtleV9BbXBlcnNh bmQgPSAweDI2LAoJS2V5X0Fwb3N0cm9waGUgPSAweDI3LAoJS2V5X1BhcmVuTGVmdCA9IDB4Mjgs CglLZXlfUGFyZW5SaWdodCA9IDB4MjksCglLZXlfQXN0ZXJpc2sgPSAweDJhLAoJS2V5X1BsdXMg PSAweDJiLAoJS2V5X0NvbW1hID0gMHgyYywKCUtleV9NaW51cyA9IDB4MmQsCglLZXlfUGVyaW9k ID0gMHgyZSwKCUtleV9TbGFzaCA9IDB4MmYsCglLZXlfMCA9IDB4MzAsCglLZXlfMSA9IDB4MzEs CglLZXlfMiA9IDB4MzIsCglLZXlfMyA9IDB4MzMsCglLZXlfNCA9IDB4MzQsCglLZXlfNSA9IDB4 MzUsCglLZXlfNiA9IDB4MzYsCglLZXlfNyA9IDB4MzcsCglLZXlfOCA9IDB4MzgsCglLZXlfOSA9 IDB4MzksCglLZXlfQ29sb24gPSAweDNhLAoJS2V5X1NlbWljb2xvbiA9IDB4M2IsCglLZXlfTGVz cyA9IDB4M2MsCglLZXlfRXF1YWwgPSAweDNkLAoJS2V5X0dyZWF0ZXIgPSAweDNlLAoJS2V5X1F1 ZXN0aW9uID0gMHgzZiwKCUtleV9BdCA9IDB4NDAsCglLZXlfQSA9IDB4NDEsCglLZXlfQiA9IDB4 NDIsCglLZXlfQyA9IDB4NDMsCglLZXlfRCA9IDB4NDQsCglLZXlfRSA9IDB4NDUsCglLZXlfRiA9 IDB4NDYsCglLZXlfRyA9IDB4NDcsCglLZXlfSCA9IDB4NDgsCglLZXlfSSA9IDB4NDksCglLZXlf SiA9IDB4NGEsCglLZXlfSyA9IDB4NGIsCglLZXlfTCA9IDB4NGMsCglLZXlfTSA9IDB4NGQsCglL ZXlfTiA9IDB4NGUsCglLZXlfTyA9IDB4NGYsCglLZXlfUCA9IDB4NTAsCglLZXlfUSA9IDB4NTEs CglLZXlfUiA9IDB4NTIsCglLZXlfUyA9IDB4NTMsCglLZXlfVCA9IDB4NTQsCglLZXlfVSA9IDB4 NTUsCglLZXlfViA9IDB4NTYsCglLZXlfVyA9IDB4NTcsCglLZXlfWCA9IDB4NTgsCglLZXlfWSA9 IDB4NTksCglLZXlfWiA9IDB4NWEsCglLZXlfQnJhY2tldExlZnQgPSAweDViLAoJS2V5X0JhY2tz bGFzaCA9IDB4NWMsCglLZXlfQnJhY2tldFJpZ2h0ID0gMHg1ZCwKCUtleV9Bc2NpaUNpcmN1bSA9 IDB4NWUsCglLZXlfVW5kZXJzY29yZSA9IDB4NWYsCglLZXlfUXVvdGVMZWZ0ID0gMHg2MCwKCUtl eV9CcmFjZUxlZnQgPSAweDdiLAoJS2V5X0JhciA9IDB4N2MsCglLZXlfQnJhY2VSaWdodCA9IDB4 N2QsCglLZXlfQXNjaWlUaWxkZSA9IDB4N2UsCgoJIAoKCUtleV9ub2JyZWFrc3BhY2UgPSAweDBh MCwKCUtleV9leGNsYW1kb3duID0gMHgwYTEsCglLZXlfY2VudCA9IDB4MGEyLAoJS2V5X3N0ZXJs aW5nID0gMHgwYTMsCglLZXlfY3VycmVuY3kgPSAweDBhNCwKCUtleV95ZW4gPSAweDBhNSwKCUtl eV9icm9rZW5iYXIgPSAweDBhNiwKCUtleV9zZWN0aW9uID0gMHgwYTcsCglLZXlfZGlhZXJlc2lz ID0gMHgwYTgsCglLZXlfY29weXJpZ2h0ID0gMHgwYTksCglLZXlfb3JkZmVtaW5pbmUgPSAweDBh YSwKCUtleV9ndWlsbGVtb3RsZWZ0ID0gMHgwYWIsCSAKCUtleV9ub3RzaWduID0gMHgwYWMsCglL ZXlfaHlwaGVuID0gMHgwYWQsCglLZXlfcmVnaXN0ZXJlZCA9IDB4MGFlLAoJS2V5X21hY3JvbiA9 IDB4MGFmLAoJS2V5X2RlZ3JlZSA9IDB4MGIwLAoJS2V5X3BsdXNtaW51cyA9IDB4MGIxLAoJS2V5 X3R3b3N1cGVyaW9yID0gMHgwYjIsCglLZXlfdGhyZWVzdXBlcmlvciA9IDB4MGIzLAoJS2V5X2Fj dXRlID0gMHgwYjQsCglLZXlfbXUgPSAweDBiNSwKCUtleV9wYXJhZ3JhcGggPSAweDBiNiwKCUtl eV9wZXJpb2RjZW50ZXJlZCA9IDB4MGI3LAoJS2V5X2NlZGlsbGEgPSAweDBiOCwKCUtleV9vbmVz dXBlcmlvciA9IDB4MGI5LAoJS2V5X21hc2N1bGluZSA9IDB4MGJhLAoJS2V5X2d1aWxsZW1vdHJp Z2h0ID0gMHgwYmIsCSAKCUtleV9vbmVxdWFydGVyID0gMHgwYmMsCglLZXlfb25laGFsZiA9IDB4 MGJkLAoJS2V5X3RocmVlcXVhcnRlcnMgPSAweDBiZSwKCUtleV9xdWVzdGlvbmRvd24gPSAweDBi ZiwKCUtleV9BZ3JhdmUgPSAweDBjMCwKCUtleV9BYWN1dGUgPSAweDBjMSwKCUtleV9BY2lyY3Vt ZmxleCA9IDB4MGMyLAoJS2V5X0F0aWxkZSA9IDB4MGMzLAoJS2V5X0FkaWFlcmVzaXMgPSAweDBj NCwKCUtleV9BcmluZyA9IDB4MGM1LAoJS2V5X0FFID0gMHgwYzYsCglLZXlfQ2NlZGlsbGEgPSAw eDBjNywKCUtleV9FZ3JhdmUgPSAweDBjOCwKCUtleV9FYWN1dGUgPSAweDBjOSwKCUtleV9FY2ly Y3VtZmxleCA9IDB4MGNhLAoJS2V5X0VkaWFlcmVzaXMgPSAweDBjYiwKCUtleV9JZ3JhdmUgPSAw eDBjYywKCUtleV9JYWN1dGUgPSAweDBjZCwKCUtleV9JY2lyY3VtZmxleCA9IDB4MGNlLAoJS2V5 X0lkaWFlcmVzaXMgPSAweDBjZiwKCUtleV9FVEggPSAweDBkMCwKCUtleV9OdGlsZGUgPSAweDBk MSwKCUtleV9PZ3JhdmUgPSAweDBkMiwKCUtleV9PYWN1dGUgPSAweDBkMywKCUtleV9PY2lyY3Vt ZmxleCA9IDB4MGQ0LAoJS2V5X090aWxkZSA9IDB4MGQ1LAoJS2V5X09kaWFlcmVzaXMgPSAweDBk NiwKCUtleV9tdWx0aXBseSA9IDB4MGQ3LAoJS2V5X09vYmxpcXVlID0gMHgwZDgsCglLZXlfVWdy YXZlID0gMHgwZDksCglLZXlfVWFjdXRlID0gMHgwZGEsCglLZXlfVWNpcmN1bWZsZXggPSAweDBk YiwKCUtleV9VZGlhZXJlc2lzID0gMHgwZGMsCglLZXlfWWFjdXRlID0gMHgwZGQsCglLZXlfVEhP Uk4gPSAweDBkZSwKCUtleV9zc2hhcnAgPSAweDBkZiwKCUtleV9hZ3JhdmUgPSAweDBlMCwKCUtl eV9hYWN1dGUgPSAweDBlMSwKCUtleV9hY2lyY3VtZmxleCA9IDB4MGUyLAoJS2V5X2F0aWxkZSA9 IDB4MGUzLAoJS2V5X2FkaWFlcmVzaXMgPSAweDBlNCwKCUtleV9hcmluZyA9IDB4MGU1LAoJS2V5 X2FlID0gMHgwZTYsCglLZXlfY2NlZGlsbGEgPSAweDBlNywKCUtleV9lZ3JhdmUgPSAweDBlOCwK CUtleV9lYWN1dGUgPSAweDBlOSwKCUtleV9lY2lyY3VtZmxleCA9IDB4MGVhLAoJS2V5X2VkaWFl cmVzaXMgPSAweDBlYiwKCUtleV9pZ3JhdmUgPSAweDBlYywKCUtleV9pYWN1dGUgPSAweDBlZCwK CUtleV9pY2lyY3VtZmxleCA9IDB4MGVlLAoJS2V5X2lkaWFlcmVzaXMgPSAweDBlZiwKCUtleV9l dGggPSAweDBmMCwKCUtleV9udGlsZGUgPSAweDBmMSwKCUtleV9vZ3JhdmUgPSAweDBmMiwKCUtl eV9vYWN1dGUgPSAweDBmMywKCUtleV9vY2lyY3VtZmxleCA9IDB4MGY0LAoJS2V5X290aWxkZSA9 IDB4MGY1LAoJS2V5X29kaWFlcmVzaXMgPSAweDBmNiwKCUtleV9kaXZpc2lvbiA9IDB4MGY3LAoJ S2V5X29zbGFzaCA9IDB4MGY4LAoJS2V5X3VncmF2ZSA9IDB4MGY5LAoJS2V5X3VhY3V0ZSA9IDB4 MGZhLAoJS2V5X3VjaXJjdW1mbGV4ID0gMHgwZmIsCglLZXlfdWRpYWVyZXNpcyA9IDB4MGZjLAoJ S2V5X3lhY3V0ZSA9IDB4MGZkLAoJS2V5X3Rob3JuID0gMHgwZmUsCglLZXlfeWRpYWVyZXNpcyA9 IDB4MGZmLAoKCUtleV91bmtub3duID0gMHhmZmZmCiAgICB9OwoKICAgICAKICAgIGVudW0gQXJy b3dUeXBlIHsKCVVwQXJyb3csCglEb3duQXJyb3csCglMZWZ0QXJyb3csCglSaWdodEFycm93CiAg ICB9OwoKICAgICAKICAgIGVudW0gUmFzdGVyT3AgeyAgCglDb3B5Uk9QLAoJT3JST1AsCglYb3JS T1AsCglOb3RBbmRST1AsIEVyYXNlUk9QPU5vdEFuZFJPUCwKCU5vdENvcHlST1AsCglOb3RPclJP UCwKCU5vdFhvclJPUCwKCUFuZFJPUCwJTm90RXJhc2VST1A9QW5kUk9QLAoJTm90Uk9QLAoJQ2xl YXJST1AsCglTZXRST1AsCglOb3BST1AsCglBbmROb3RST1AsCglPck5vdFJPUCwKCU5hbmRST1As CglOb3JST1AsCUxhc3RST1A9Tm9yUk9QCiAgICB9OwoKICAgICAKICAgIGVudW0gUGVuU3R5bGUg eyAgCglOb1BlbiwKCVNvbGlkTGluZSwKCURhc2hMaW5lLAoJRG90TGluZSwKCURhc2hEb3RMaW5l LAoJRGFzaERvdERvdExpbmUsCglNUGVuU3R5bGUgPSAweDBmCiAgICB9OwoKICAgICAKICAgIGVu dW0gUGVuQ2FwU3R5bGUgeyAgCglGbGF0Q2FwID0gMHgwMCwKCVNxdWFyZUNhcCA9IDB4MTAsCglS b3VuZENhcCA9IDB4MjAsCglNUGVuQ2FwU3R5bGUgPSAweDMwCiAgICB9OwoKICAgICAKICAgIGVu dW0gUGVuSm9pblN0eWxlIHsgIAoJTWl0ZXJKb2luID0gMHgwMCwKCUJldmVsSm9pbiA9IDB4NDAs CglSb3VuZEpvaW4gPSAweDgwLAoJTVBlbkpvaW5TdHlsZSA9IDB4YzAKICAgIH07CgogICAgIAog ICAgZW51bSBCcnVzaFN0eWxlIHsgIAoJTm9CcnVzaCwKCVNvbGlkUGF0dGVybiwKCURlbnNlMVBh dHRlcm4sCglEZW5zZTJQYXR0ZXJuLAoJRGVuc2UzUGF0dGVybiwKCURlbnNlNFBhdHRlcm4sCglE ZW5zZTVQYXR0ZXJuLAoJRGVuc2U2UGF0dGVybiwKCURlbnNlN1BhdHRlcm4sCglIb3JQYXR0ZXJu LAoJVmVyUGF0dGVybiwKCUNyb3NzUGF0dGVybiwKCUJEaWFnUGF0dGVybiwKCUZEaWFnUGF0dGVy biwKCURpYWdDcm9zc1BhdHRlcm4sCglDdXN0b21QYXR0ZXJuPTI0CiAgICB9OwoKICAgICAKICAg IGVudW0gV2luZG93c1ZlcnNpb24gewoJV1ZfMzJzIAkJPSAweDAwMDEsCglXVl85NSAJCT0gMHgw MDAyLAoJV1ZfOTgJCT0gMHgwMDAzLAoJV1ZfTWUJCT0gMHgwMDA0LAoJV1ZfRE9TX2Jhc2VkCT0g MHgwMDBmLAoKCVdWX05UIAkJPSAweDAwMTAsCglXVl8yMDAwIAk9IDB4MDAyMCwKCVdWX1hQCQk9 IDB4MDAzMCwKCVdWX05UX2Jhc2VkCT0gMHgwMGYwCiAgICB9OwoKICAgICAKICAgIGVudW0gVUlF ZmZlY3QgewoJVUlfR2VuZXJhbCwKCVVJX0FuaW1hdGVNZW51LAoJVUlfRmFkZU1lbnUsCglVSV9B bmltYXRlQ29tYm8sCglVSV9BbmltYXRlVG9vbHRpcCwKCVVJX0ZhZGVUb29sdGlwCiAgICB9OwoK ICAgICAKICAgIGVudW0gQ3Vyc29yU2hhcGUgewoJQXJyb3dDdXJzb3IsCglVcEFycm93Q3Vyc29y LAoJQ3Jvc3NDdXJzb3IsCglXYWl0Q3Vyc29yLAoJSWJlYW1DdXJzb3IsCglTaXplVmVyQ3Vyc29y LAoJU2l6ZUhvckN1cnNvciwKCVNpemVCRGlhZ0N1cnNvciwKCVNpemVGRGlhZ0N1cnNvciwKCVNp emVBbGxDdXJzb3IsCglCbGFua0N1cnNvciwKCVNwbGl0VkN1cnNvciwKCVNwbGl0SEN1cnNvciwK CVBvaW50aW5nSGFuZEN1cnNvciwKCUZvcmJpZGRlbkN1cnNvciwKCVdoYXRzVGhpc0N1cnNvciwK CUxhc3RDdXJzb3IJPSBXaGF0c1RoaXNDdXJzb3IsCglCaXRtYXBDdXJzb3IJPSAyNAogICAgfTsK CiAgICAgCgogICAgc3RhdGljIGNvbnN0ICBRQ3Vyc29yICYgYXJyb3dDdXJzb3I7CSAKICAgIHN0 YXRpYyBjb25zdCAgUUN1cnNvciAmIHVwQXJyb3dDdXJzb3I7CSAKICAgIHN0YXRpYyBjb25zdCAg UUN1cnNvciAmIGNyb3NzQ3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3QgIFFDdXJzb3IgJiB3YWl0 Q3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3QgIFFDdXJzb3IgJiBpYmVhbUN1cnNvcjsJIAogICAg c3RhdGljIGNvbnN0ICBRQ3Vyc29yICYgc2l6ZVZlckN1cnNvcjsJIAogICAgc3RhdGljIGNvbnN0 ICBRQ3Vyc29yICYgc2l6ZUhvckN1cnNvcjsJIAogICAgc3RhdGljIGNvbnN0ICBRQ3Vyc29yICYg c2l6ZUJEaWFnQ3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3QgIFFDdXJzb3IgJiBzaXplRkRpYWdD dXJzb3I7CSAKICAgIHN0YXRpYyBjb25zdCAgUUN1cnNvciAmIHNpemVBbGxDdXJzb3I7CSAKICAg IHN0YXRpYyBjb25zdCAgUUN1cnNvciAmIGJsYW5rQ3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3Qg IFFDdXJzb3IgJiBzcGxpdFZDdXJzb3I7CSAKCQkJCQkJIAogICAgc3RhdGljIGNvbnN0ICBRQ3Vy c29yICYgc3BsaXRIQ3Vyc29yOwkgCgkJCQkJCSAKICAgIHN0YXRpYyBjb25zdCAgUUN1cnNvciAm IHBvaW50aW5nSGFuZEN1cnNvcjsJIAogICAgc3RhdGljIGNvbnN0ICBRQ3Vyc29yICYgZm9yYmlk ZGVuQ3Vyc29yOwkgCiAgICBzdGF0aWMgY29uc3QgIFFDdXJzb3IgJiB3aGF0c1RoaXNDdXJzb3I7 ICAgCgoKICAgIGVudW0gVGV4dEZvcm1hdCB7CglQbGFpblRleHQsCglSaWNoVGV4dCwKCUF1dG9U ZXh0CiAgICB9OwoKICAgICAKICAgIGVudW0gRG9jayB7CglEb2NrVW5tYW5hZ2VkLAoJRG9ja1Rv cm5PZmYsCglEb2NrVG9wLAoJRG9ja0JvdHRvbSwKCURvY2tSaWdodCwKCURvY2tMZWZ0LAoJRG9j a01pbmltaXplZAoKICAgICAgICAsCglVbm1hbmFnZWQgPSBEb2NrVW5tYW5hZ2VkLAoJVG9ybk9m ZiA9IERvY2tUb3JuT2ZmLAoJVG9wID0gRG9ja1RvcCwKCUJvdHRvbSA9IERvY2tCb3R0b20sCglS aWdodCA9IERvY2tSaWdodCwKCUxlZnQgPSBEb2NrTGVmdCwKCU1pbmltaXplZCA9IERvY2tNaW5p bWl6ZWQKCiAgICB9OwogICAgIAogICAgdHlwZWRlZiBEb2NrIFRvb2xCYXJEb2NrOwoKICAgICAK ICAgIGVudW0gRGF0ZUZvcm1hdCB7CglUZXh0RGF0ZSwgICAgICAgCglJU09EYXRlLCAgICAgICAg CglMb2NhbERhdGUgICAgICAgCiAgICB9OwoKICAgICAKICAgIGVudW0gQmFja2dyb3VuZE1vZGUg ewoJRml4ZWRDb2xvciwKCUZpeGVkUGl4bWFwLAoJTm9CYWNrZ3JvdW5kLAoJUGFsZXR0ZUZvcmVn cm91bmQsCglQYWxldHRlQnV0dG9uLAoJUGFsZXR0ZUxpZ2h0LAoJUGFsZXR0ZU1pZGxpZ2h0LAoJ UGFsZXR0ZURhcmssCglQYWxldHRlTWlkLAoJUGFsZXR0ZVRleHQsCglQYWxldHRlQnJpZ2h0VGV4 dCwKCVBhbGV0dGVCYXNlLAoJUGFsZXR0ZUJhY2tncm91bmQsCglQYWxldHRlU2hhZG93LAoJUGFs ZXR0ZUhpZ2hsaWdodCwKCVBhbGV0dGVIaWdobGlnaHRlZFRleHQsCglQYWxldHRlQnV0dG9uVGV4 dCwKCVBhbGV0dGVMaW5rLAoJUGFsZXR0ZUxpbmtWaXNpdGVkLAoJWDExUGFyZW50UmVsYXRpdmUK ICAgIH07CgogICAgdHlwZWRlZiB1aW50IENvbXBhcmlzb25GbGFnczsKCiAgICAgCiAgICBlbnVt IFN0cmluZ0NvbXBhcmlzb25Nb2RlIHsKICAgICAgICBDYXNlU2Vuc2l0aXZlICAgPSAweDAwMDAx LCAgCiAgICAgICAgQmVnaW5zV2l0aCAgICAgID0gMHgwMDAwMiwgIAogICAgICAgIEVuZHNXaXRo ICAgICAgICA9IDB4MDAwMDQsICAKICAgICAgICBDb250YWlucyAgICAgICAgPSAweDAwMDA4LCAg CiAgICAgICAgRXhhY3RNYXRjaCAgICAgID0gMHgwMDAxMCAgIAogICAgfTsKCiAgICAgCiAgICAg CgoKCgoKICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBIQU5ETEU7CgoKCn07CgoKY2xhc3MgICBR SW50ZXJuYWwgewpwdWJsaWM6CiAgICBlbnVtIFBhaW50RGV2aWNlRmxhZ3MgewoJVW5kZWZpbmVk RGV2aWNlID0gMHgwMCwKCVdpZGdldCA9IDB4MDEsCglQaXhtYXAgPSAweDAyLAoJUHJpbnRlciA9 IDB4MDMsCglQaWN0dXJlID0gMHgwNCwKCVN5c3RlbSA9IDB4MDUsCglEZXZpY2VUeXBlTWFzayA9 IDB4MGYsCglFeHRlcm5hbERldmljZSA9IDB4MTAsCgkgCglDb21wYXRpYmlsaXR5TW9kZSA9IDB4 MjAKICAgIH07Cn07CgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F3aW5kb3dkZWZzLmgi IDIKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2lu Y2x1ZGUvbGltaXRzLmgiIDEgMwogCgoKIAoKCgoKCiAKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3lzbGltaXRzLmgiIDEgMwogCgoKCgoK IyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUv bGltaXRzLmgiIDEgMwogCgoKIAoKIyAxMTQgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFr ZS1saW51eC8yLjk1LjMvaW5jbHVkZS9saW1pdHMuaCIgMwoKCgojIDEgIi91c3IvaW5jbHVkZS9s aW1pdHMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCiAKIyAxICIvdXNyL2lu Y2x1ZGUvYml0cy9wb3NpeDFfbGltLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoK CgogCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCgogCgoKIAoKCiAKCgogCgoKIAoK CgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgogCgoKIAoKCiAKCgoKIAoKCiAK CgogCgoKIAoKCiAKCgoKIAojIDEgIi91c3IvaW5jbHVkZS9iaXRzL2xvY2FsX2xpbS5oIiAxIDMK IAoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKIAojIDEgIi91c3IvaW5jbHVkZS9saW51eC9saW1p dHMuaCIgMSAzCgoKCgoKCgoKCgoKCgoKCgoKCgojIDI3ICIvdXNyL2luY2x1ZGUvYml0cy9sb2Nh bF9saW0uaCIgMiAzCgoKIAoKCgoKCiAKCiAKCgogCgogCgoKIAoKIAoKCiAKCgoKIAoKIyAxMjYg Ii91c3IvaW5jbHVkZS9iaXRzL3Bvc2l4MV9saW0uaCIgMiAzCgoKCgoKCgoKIAoKCgoKCgoKIyAz MCAiL3Vzci9pbmNsdWRlL2xpbWl0cy5oIiAyIDMKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2JpdHMv cG9zaXgyX2xpbS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCiAKCgogCgoKIAoK CiAKCgogCgoKCgogCgoKCgogCgoKCiAKCgogCgoKCiAKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCiAKCgoKIyAzNCAiL3Vzci9pbmNsdWRlL2xpbWl0cy5oIiAyIDMKCgoKCgoK CgogCgoKCgoKIAoKIyAxMjEgIi91c3IvaW5jbHVkZS9saW1pdHMuaCIgMwoKCgoKICAKCgoKCgoK CgojIDExNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNs dWRlL2xpbWl0cy5oIiAyIDMKCgoKCiMgNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtl LWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N5c2xpbWl0cy5oIiAyIDMKCgojIDExICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvbGltaXRzLmgiIDIgMwoK CgoKCiAKCgoKIAoKCgogCgoKCgogCgoKCgoKIAoKCgogCgoKCgoKCgoKCgoKCiAKCiAKCgoKCiAK CgoKIAoKCgoKCgoKCiAKCgoKIAoKCgoKCgoKCgoKCgoKIAoKCgojIDEwNyAiL3Vzci9saWIvZ2Nj LWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL2xpbWl0cy5oIiAzCgoKCgog CgoKCgoKCgoKCiMgNDggIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2luZG93ZGVmcy5oIiAyCgoK IAoKY2xhc3MgUVBhaW50RGV2aWNlOwpjbGFzcyBRUGFpbnREZXZpY2VNZXRyaWNzOwpjbGFzcyBR V2lkZ2V0OwpjbGFzcyBRV2lkZ2V0TWFwcGVyOwpjbGFzcyBRRGlhbG9nOwpjbGFzcyBRQ29sb3I7 CmNsYXNzIFFDb2xvckdyb3VwOwpjbGFzcyBRUGFsZXR0ZTsKY2xhc3MgUUN1cnNvcjsKY2xhc3Mg UVBvaW50OwpjbGFzcyBRU2l6ZTsKY2xhc3MgUVJlY3Q7CmNsYXNzIFFQb2ludEFycmF5OwpjbGFz cyBRUGFpbnRlcjsKY2xhc3MgUVJlZ2lvbjsKY2xhc3MgUUZvbnQ7CmNsYXNzIFFGb250TWV0cmlj czsKY2xhc3MgUUZvbnRJbmZvOwpjbGFzcyBRUGVuOwpjbGFzcyBRQnJ1c2g7CmNsYXNzIFFXTWF0 cml4OwpjbGFzcyBRUGl4bWFwOwpjbGFzcyBRQml0bWFwOwpjbGFzcyBRTW92aWU7CmNsYXNzIFFJ bWFnZTsKY2xhc3MgUUltYWdlSU87CmNsYXNzIFFQaWN0dXJlOwpjbGFzcyBRUHJpbnRlcjsKY2xh c3MgUUFjY2VsOwpjbGFzcyBRVGltZXI7CmNsYXNzIFFUaW1lOwpjbGFzcyBRQ2xpcGJvYXJkOwoK CiAKCmNsYXNzIFFXaWRnZXRMaXN0OwpjbGFzcyBRV2lkZ2V0TGlzdEl0OwoKCiAKCiMgMTMwICIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcXdpbmRvd2RlZnMuaCIKCgoKCgoKCgoKdHlwZWRlZiBzdHJ1 Y3QgX1hEaXNwbGF5IERpc3BsYXk7CnR5cGVkZWYgdW5pb24gIF9YRXZlbnQgWEV2ZW50Owp0eXBl ZGVmIHN0cnVjdCBfWEdDICpHQzsKdHlwZWRlZiBzdHJ1Y3QgX1hSZWdpb24gKlJlZ2lvbjsKdHlw ZWRlZiB1bnNpZ25lZCBsb25nICBXSWQ7CgogIERpc3BsYXkgKnF0X3hkaXNwbGF5KCk7CiAgaW50 CSBxdF94c2NyZWVuKCk7CiAgV0lkCSBxdF94cm9vdHdpbigpOwogIEdDCSBxdF94Z2V0X3JlYWRv bmx5X2djKCBpbnQgc2NybiwgYm9vbCBtb25vY2hyb21lICk7CiAgR0MJIHF0X3hnZXRfdGVtcF9n YyggaW50IHNjcm4sIGJvb2wgbW9ub2Nocm9tZSApOwoKCgoKCgoKCgoKCmNsYXNzIFFBcHBsaWNh dGlvbjsKCgoKCgogCgp0eXBlZGVmIFFfSU5UMzIgUUNPT1JEOwkJCQkgCmNvbnN0IFFDT09SRCBR Q09PUkRfTUFYID0gIDIxNDc0ODM2NDc7CmNvbnN0IFFDT09SRCBRQ09PUkRfTUlOID0gLVFDT09S RF9NQVggLSAxOwoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgUVJnYjsJCQkgCgogIGNvbnN0IGNoYXIg KnFBcHBOYW1lKCk7CQkgCgogCgp0eXBlZGVmIHZvaWQgKCpRdENsZWFuVXBGdW5jdGlvbikoKTsK ICB2b2lkIHFBZGRQb3N0Um91dGluZSggUXRDbGVhblVwRnVuY3Rpb24gKTsKICB2b2lkIHFSZW1v dmVQb3N0Um91dGluZSggUXRDbGVhblVwRnVuY3Rpb24gKTsKCgogCnR5cGVkZWYgUXRDbGVhblVw RnVuY3Rpb24gUV9DbGVhblVwRnVuY3Rpb247CgoKIAogIHZvaWQgKnF0X2ZpbmRfb2JqX2NoaWxk KCBRT2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqICk7CgoKCgoKIyA0MiAiL3Vz ci9sb2NhbC9xdC9pbmNsdWRlL3Fjb2xvci5oIiAyCgoKCmNvbnN0IFFSZ2IgIFJHQl9NQVNLICAg ID0gMHgwMGZmZmZmZjsJCSAKCiAgaW5saW5lIGludCBxUmVkKCBRUmdiIHJnYiApCQkgCnsgcmV0 dXJuIChpbnQpKChyZ2IgPj4gMTYpICYgMHhmZik7IH0KCiAgaW5saW5lIGludCBxR3JlZW4oIFFS Z2IgcmdiICkJCSAKeyByZXR1cm4gKGludCkoKHJnYiA+PiA4KSAmIDB4ZmYpOyB9CgogIGlubGlu ZSBpbnQgcUJsdWUoIFFSZ2IgcmdiICkJCSAKeyByZXR1cm4gKGludCkocmdiICYgMHhmZik7IH0K CiAgaW5saW5lIGludCBxQWxwaGEoIFFSZ2IgcmdiICkJCSAKeyByZXR1cm4gKGludCkoKHJnYiA+ PiAyNCkgJiAweGZmKTsgfQoKICBpbmxpbmUgUVJnYiBxUmdiKCBpbnQgciwgaW50IGcsIGludCBi ICkgCnsgcmV0dXJuICgweGZmIDw8IDI0KSB8ICgociAmIDB4ZmYpIDw8IDE2KSB8ICgoZyAmIDB4 ZmYpIDw8IDgpIHwgKGIgJiAweGZmKTsgfQoKICBpbmxpbmUgUVJnYiBxUmdiYSggaW50IHIsIGlu dCBnLCBpbnQgYiwgaW50IGEgKSAKeyByZXR1cm4gKChhICYgMHhmZikgPDwgMjQpIHwgKChyICYg MHhmZikgPDwgMTYpIHwgKChnICYgMHhmZikgPDwgOCkgfCAoYiAmIDB4ZmYpOyB9CgogIGlubGlu ZSBpbnQgcUdyYXkoIGludCByLCBpbnQgZywgaW50IGIgKSAKeyByZXR1cm4gKHIqMTErZyoxNiti KjUpLzMyOyB9CgogIGlubGluZSBpbnQgcUdyYXkoIFFSZ2IgcmdiICkJCSAKeyByZXR1cm4gcUdy YXkoIHFSZWQocmdiKSwgcUdyZWVuKHJnYiksIHFCbHVlKHJnYikgKTsgfQoKCmNsYXNzICAgUUNv bG9yCnsKcHVibGljOgogICAgZW51bSBTcGVjIHsgUmdiLCBIc3YgfTsKCiAgICBRQ29sb3IoKTsK ICAgIFFDb2xvciggaW50IHIsIGludCBnLCBpbnQgYiApOwogICAgUUNvbG9yKCBpbnQgeCwgaW50 IHksIGludCB6LCBTcGVjICk7CiAgICBRQ29sb3IoIFFSZ2IgcmdiLCB1aW50IHBpeGVsPTB4ZmZm ZmZmZmYpOwogICAgUUNvbG9yKCBjb25zdCBRU3RyaW5nJiBuYW1lICk7CiAgICBRQ29sb3IoIGNv bnN0IGNoYXIgKm5hbWUgKTsKICAgIFFDb2xvciggY29uc3QgUUNvbG9yICYgKTsKICAgIFFDb2xv ciAmb3BlcmF0b3I9KCBjb25zdCBRQ29sb3IgJiApOwoKICAgIGJvb2wgICBpc1ZhbGlkKCkgY29u c3Q7CiAgICBib29sICAgaXNEaXJ0eSgpIGNvbnN0OwoKICAgIFFTdHJpbmcgbmFtZSgpIGNvbnN0 OwoKICAgIHZvaWQgICBzZXROYW1lZENvbG9yKCBjb25zdCBRU3RyaW5nJiBuYW1lICk7CgogICAg dm9pZCAgIHJnYiggaW50ICpyLCBpbnQgKmcsIGludCAqYiApIGNvbnN0OwogICAgUVJnYiAgIHJn YigpICAgIGNvbnN0OwogICAgdm9pZCAgIHNldFJnYiggaW50IHIsIGludCBnLCBpbnQgYiApOwog ICAgdm9pZCAgIHNldFJnYiggUVJnYiByZ2IgKTsKCiAgICBpbnQJICAgcmVkKCkgICAgY29uc3Q7 CiAgICBpbnQJICAgZ3JlZW4oKSAgY29uc3Q7CiAgICBpbnQJICAgYmx1ZSgpICAgY29uc3Q7Cgog ICAgdm9pZCAgIGhzdiggaW50ICpoLCBpbnQgKnMsIGludCAqdiApIGNvbnN0OwogICAgdm9pZCAg IGdldEhzdiggaW50ICZoLCBpbnQgJnMsIGludCAmdiApIGNvbnN0IHsgaHN2KCAmaCwgJnMsICZ2 ICk7IH0KICAgIHZvaWQgICBzZXRIc3YoIGludCBoLCBpbnQgcywgaW50IHYgKTsKCiAgICBRQ29s b3IgbGlnaHQoIGludCBmID0gMTUwICkgY29uc3Q7CiAgICBRQ29sb3IgZGFyayggaW50IGYgPSAy MDAgKQljb25zdDsKCiAgICBib29sICAgb3BlcmF0b3I9PSggY29uc3QgUUNvbG9yICZjICkgY29u c3Q7CiAgICBib29sICAgb3BlcmF0b3IhPSggY29uc3QgUUNvbG9yICZjICkgY29uc3Q7CgogICAg dWludCAgIGFsbG9jKCk7CiAgICB1aW50ICAgcGl4ZWwoKSAgY29uc3Q7CgogICAgc3RhdGljIGlu dCAgbWF4Q29sb3JzKCk7CiAgICBzdGF0aWMgaW50ICBudW1CaXRQbGFuZXMoKTsKCiAgICBzdGF0 aWMgaW50ICBlbnRlckFsbG9jQ29udGV4dCgpOwogICAgc3RhdGljIHZvaWQgbGVhdmVBbGxvY0Nv bnRleHQoKTsKICAgIHN0YXRpYyBpbnQgIGN1cnJlbnRBbGxvY0NvbnRleHQoKTsKICAgIHN0YXRp YyB2b2lkIGRlc3Ryb3lBbGxvY0NvbnRleHQoIGludCApOwoKCgoKCgoKCgogICAgc3RhdGljIHZv aWQgaW5pdGlhbGl6ZSgpOwogICAgc3RhdGljIHZvaWQgY2xlYW51cCgpOwoKICAgIGVudW0geyBE aXJ0ID0gMHg0NDQ5NTI1NCwgSW52YWxpZCA9IDB4NDkwMDAwMDAgfTsKCnByaXZhdGU6CiAgICB2 b2lkIHNldFN5c3RlbU5hbWVkQ29sb3IoIGNvbnN0IFFTdHJpbmcmIG5hbWUgKTsKICAgIHZvaWQg c2V0UGl4ZWwoIHVpbnQgcGl4ZWwgKTsKICAgIHN0YXRpYyB2b2lkIGluaXRHbG9iYWxDb2xvcnMo KTsKICAgIHN0YXRpYyB1aW50IGFyZ2JUb1BpeDMyKFFSZ2IpOwogICAgc3RhdGljIFFDb2xvciog Z2xvYmFsQ29sb3JzKCk7CiAgICBzdGF0aWMgYm9vbCBjb2xvcl9pbml0OwogICAgc3RhdGljIGJv b2wgZ2xvYmFsc19pbml0OwoKCgogICAgc3RhdGljIGVudW0gQ29sb3JNb2RlbCB7IGQ4LCBkMzIg fSBjb2xvcm1vZGVsOwogICAgdW5pb24gewoJUVJnYiBhcmdiOwoJc3RydWN0IHsKCSAgICBRUmdi IGFyZ2I7CgkgICAgdWNoYXIgcGl4OwoJICAgIHVjaGFyIGludmFsaWQ7CgkgICAgdWNoYXIgZGly dHk7CgkgICAgdWNoYXIgZGlyZWN0OwoJfSBkODsKCXN0cnVjdCBEMzIgewoJICAgIFFSZ2IgYXJn YjsKCSAgICB1aW50IHBpeDsKCSAgICBib29sIGludmFsaWQoKSBjb25zdCB7IHJldHVybiBhcmdi ID09IFFDb2xvcjo6SW52YWxpZCAmJiBwaXggPT0gUUNvbG9yOjpEaXJ0OyB9CgkgICAgYm9vbCBw cm9iYWJseURpcnR5KCkgY29uc3QgeyByZXR1cm4gcGl4ID09IFFDb2xvcjo6RGlydDsgfQoJfSBk MzI7CiAgICB9IGQ7Cn07CgoKaW5saW5lIFFDb2xvcjo6UUNvbG9yKCkKeyBkLmQzMi5hcmdiID0g SW52YWxpZDsgZC5kMzIucGl4ID0gRGlydDsgfQoKaW5saW5lIFFDb2xvcjo6UUNvbG9yKCBpbnQg ciwgaW50IGcsIGludCBiICkKeyBzZXRSZ2IoIHIsIGcsIGIgKTsgfQoKaW5saW5lIFFSZ2IgUUNv bG9yOjpyZ2IoKSBjb25zdAp7IHJldHVybiBkLmFyZ2I7IH0KCmlubGluZSBpbnQgUUNvbG9yOjpy ZWQoKSBjb25zdAp7IHJldHVybiBxUmVkKGQuYXJnYik7IH0KCmlubGluZSBpbnQgUUNvbG9yOjpn cmVlbigpIGNvbnN0CnsgcmV0dXJuIHFHcmVlbihkLmFyZ2IpOyB9CgppbmxpbmUgaW50IFFDb2xv cjo6Ymx1ZSgpIGNvbnN0CnsgcmV0dXJuIHFCbHVlKGQuYXJnYik7IH0KCmlubGluZSBib29sIFFD b2xvcjo6aXNWYWxpZCgpIGNvbnN0CnsKICAgIGlmICggY29sb3Jtb2RlbCA9PSBkOCApCglyZXR1 cm4gIWQuZDguaW52YWxpZDsKICAgIGVsc2UKCXJldHVybiAhZC5kMzIuaW52YWxpZCgpOwp9Cgpp bmxpbmUgYm9vbCBRQ29sb3I6Om9wZXJhdG9yPT0oIGNvbnN0IFFDb2xvciAmYyApIGNvbnN0CnsK ICAgIHJldHVybiBkLmFyZ2IgPT0gYy5kLmFyZ2IgJiYgaXNWYWxpZCgpID09IGMuaXNWYWxpZCgp Owp9CgppbmxpbmUgYm9vbCBRQ29sb3I6Om9wZXJhdG9yIT0oIGNvbnN0IFFDb2xvciAmYyApIGNv bnN0CnsKICAgIHJldHVybiAhb3BlcmF0b3I9PShjKTsKfQoKCiAKCgoKCiAgUURhdGFTdHJlYW0g Jm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFDb2xvciAmICk7CiAgUURhdGFTdHJl YW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFDb2xvciAmICk7CgoKCiMgNCAiZWxlbWVu dC5oIiAyCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F2YWx1ZXZlY3Rvci5oIiAxCiAK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQv aW5jbHVkZS9xdGwuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXRleHRzdHJlYW0uaCIgMQogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVk ZS9xaW9kZXZpY2UuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCgoKCiAKCgoKCgoKCgoKIAoKCgoKCiAKCgoKCgoKCgoK CgoKY2xhc3MgICBRSU9EZXZpY2UJCQkgCnsKcHVibGljOgoKCgogICAgdHlwZWRlZiBRX1VMT05H IE9mZnNldDsKCgogICAgUUlPRGV2aWNlKCk7CiAgICB2aXJ0dWFsIH5RSU9EZXZpY2UoKTsKCiAg ICBpbnQJCSBmbGFncygpICBjb25zdCB7IHJldHVybiBpb01vZGU7IH0KICAgIGludAkJIG1vZGUo KQkgIGNvbnN0IHsgcmV0dXJuIGlvTW9kZSAmIDB4MDBmZiA7IH0KICAgIGludAkJIHN0YXRlKCkg IGNvbnN0IHsgcmV0dXJuIGlvTW9kZSAmIDB4ZjAwMCA7IH0KCiAgICBib29sCSBpc0RpcmVjdEFj Y2VzcygpICAgICBjb25zdCB7IHJldHVybiAoKGlvTW9kZSAmIDB4MDEwMCApICAgICA9PSAweDAx MDAgKTsgfQogICAgYm9vbAkgaXNTZXF1ZW50aWFsQWNjZXNzKCkgY29uc3QgeyByZXR1cm4gKChp b01vZGUgJiAweDAyMDAgKSA9PSAweDAyMDAgKTsgfQogICAgYm9vbAkgaXNDb21iaW5lZEFjY2Vz cygpICAgY29uc3QgeyByZXR1cm4gKChpb01vZGUgJiAweDAzMDAgKSAgID09IDB4MDMwMCApOyB9 CiAgICBib29sCSBpc0J1ZmZlcmVkKCkJICAgICAgY29uc3QgeyByZXR1cm4gKChpb01vZGUgJiAw eDAwNDAgKSAgICAgICAgIT0gMHgwMDQwICk7IH0KICAgIGJvb2wJIGlzUmF3KCkJICAgICAgY29u c3QgeyByZXR1cm4gKChpb01vZGUgJiAweDAwNDAgKSAgICAgICAgPT0gMHgwMDQwICk7IH0KICAg IGJvb2wJIGlzU3luY2hyb25vdXMoKSAgICAgIGNvbnN0IHsgcmV0dXJuICgoaW9Nb2RlICYgMHgw MDgwICkgICAgICAhPSAweDAwODAgKTsgfQogICAgYm9vbAkgaXNBc3luY2hyb25vdXMoKSAgICAg Y29uc3QgeyByZXR1cm4gKChpb01vZGUgJiAweDAwODAgKSAgICAgID09IDB4MDA4MCApOyB9CiAg ICBib29sCSBpc1RyYW5zbGF0ZWQoKQkgICAgICBjb25zdCB7IHJldHVybiAoKGlvTW9kZSAmIDB4 MDAxMCApICA9PSAweDAwMTAgKTsgfQogICAgYm9vbAkgaXNSZWFkYWJsZSgpCSAgICAgIGNvbnN0 IHsgcmV0dXJuICgoaW9Nb2RlICYgMHgwMDAxICkgICA9PSAweDAwMDEgKTsgfQogICAgYm9vbAkg aXNXcml0YWJsZSgpCSAgICAgIGNvbnN0IHsgcmV0dXJuICgoaW9Nb2RlICYgMHgwMDAyICkgID09 IDB4MDAwMiApOyB9CiAgICBib29sCSBpc1JlYWRXcml0ZSgpCSAgICAgIGNvbnN0IHsgcmV0dXJu ICgoaW9Nb2RlICYgMHgwMDAzICkgID09IDB4MDAwMyApOyB9CiAgICBib29sCSBpc0luYWN0aXZl KCkJICAgICAgY29uc3QgeyByZXR1cm4gc3RhdGUoKSA9PSAwOyB9CiAgICBib29sCSBpc09wZW4o KQkgICAgICBjb25zdCB7IHJldHVybiBzdGF0ZSgpID09IDB4MTAwMCA7IH0KCiAgICBpbnQJCSBz dGF0dXMoKSBjb25zdCB7IHJldHVybiBpb1N0OyB9CiAgICB2b2lkCSByZXNldFN0YXR1cygpCXsg aW9TdCA9IDAgOyB9CgogICAgdmlydHVhbCBib29sIG9wZW4oIGludCBtb2RlICkgPSAwOwogICAg dmlydHVhbCB2b2lkIGNsb3NlKCkgPSAwOwogICAgdmlydHVhbCB2b2lkIGZsdXNoKCkgPSAwOwoK ICAgIHZpcnR1YWwgT2Zmc2V0IHNpemUoKSAgY29uc3QgPSAwOwogICAgdmlydHVhbCBPZmZzZXQg YXQoKSAgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgYXQoIE9mZnNldCApOwogICAgdmlydHVhbCBi b29sIGF0RW5kKCkgIGNvbnN0OwogICAgYm9vbAkgcmVzZXQoKSB7IHJldHVybiBhdCgwKTsgfQoK ICAgIHZpcnR1YWwgUV9MT05HIHJlYWRCbG9jayggY2hhciAqZGF0YSwgUV9VTE9ORyBtYXhsZW4g KSA9IDA7CiAgICB2aXJ0dWFsIFFfTE9ORyB3cml0ZUJsb2NrKCBjb25zdCBjaGFyICpkYXRhLCBR X1VMT05HIGxlbiApID0gMDsKICAgIHZpcnR1YWwgUV9MT05HIHJlYWRMaW5lKCBjaGFyICpkYXRh LCBRX1VMT05HIG1heGxlbiApOwogICAgUV9MT05HIHdyaXRlQmxvY2soIGNvbnN0IFFCeXRlQXJy YXkmIGRhdGEgKTsKICAgIHZpcnR1YWwgUUJ5dGVBcnJheSByZWFkQWxsKCk7CgogICAgdmlydHVh bCBpbnQJIGdldGNoKCkgPSAwOwogICAgdmlydHVhbCBpbnQJIHB1dGNoKCBpbnQgKSA9IDA7CiAg ICB2aXJ0dWFsIGludAkgdW5nZXRjaCggaW50ICkgPSAwOwoKcHJvdGVjdGVkOgogICAgdm9pZAkg c2V0RmxhZ3MoIGludCBmICkgeyBpb01vZGUgPSBmOyB9CiAgICB2b2lkCSBzZXRUeXBlKCBpbnQg KTsKICAgIHZvaWQJIHNldE1vZGUoIGludCApOwogICAgdm9pZAkgc2V0U3RhdGUoIGludCApOwog ICAgdm9pZAkgc2V0U3RhdHVzKCBpbnQgKTsKICAgIE9mZnNldAkgaW9JbmRleDsKCnByaXZhdGU6 CiAgICBpbnQJCSBpb01vZGU7CiAgICBpbnQJCSBpb1N0OwoKcHJpdmF0ZToJIAoKICAgIFFJT0Rl dmljZSggY29uc3QgUUlPRGV2aWNlICYgKTsKICAgIFFJT0RldmljZSAmb3BlcmF0b3I9KCBjb25z dCBRSU9EZXZpY2UgJiApOwoKfTsKCgoKIyA0MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F0ZXh0 c3RyZWFtLmgiIDIKCgojIDEgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAxIDMKIAoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgoKCgoKZXh0ZXJuICJDIiB7IAoKCgojIDEgIi91c3IvbGliL2djYy1saWIv aTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAK CgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAK CgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAKCiMgMTMxICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgogCgoKIyAx ODggIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9z dGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCiMgMjcxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgojIDI4MyAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK IAoKIAoKIyAzMTcgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMv aW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDMzICIvdXNy L2luY2x1ZGUvc3RkaW8uaCIgMiAzCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkYXJnLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CnR5cGVkZWYgdm9pZCAqX19nbnVjX3ZhX2xpc3Q7CgoKCiAKCiMgMTIyICIvdXNyL2xpYi9nY2Mt bGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkYXJnLmgiIDMKCgoKCgoK CgoKCgoKCgoKCgoKCgojIDIwOSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy9pbmNsdWRlL3N0ZGFyZy5oIiAzCgoKCgojIDM4ICIvdXNyL2luY2x1ZGUvc3RkaW8u aCIgMiAzCgoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy90eXBlcy5oIiAxIDMKIAoKCgoKCgoKCgoK CgoKCgoKCiAKCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK CiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51 eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2Mt bGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgog CgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUu My9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5k cmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNy L2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgi IDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyOSAiL3Vzci9pbmNsdWRlL2JpdHMvdHlw ZXMuaCIgMiAzCgoKIAp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX191X2NoYXI7CnR5cGVkZWYgdW5z aWduZWQgc2hvcnQgX191X3Nob3J0Owp0eXBlZGVmIHVuc2lnbmVkIGludCBfX3VfaW50Owp0eXBl ZGVmIHVuc2lnbmVkIGxvbmcgX191X2xvbmc7CgpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgdW5zaWdu ZWQgbG9uZyBsb25nIGludCBfX3VfcXVhZF90OwpfX2V4dGVuc2lvbl9fIHR5cGVkZWYgbG9uZyBs b25nIGludCBfX3F1YWRfdDsKIyA0OCAiL3Vzci9pbmNsdWRlL2JpdHMvdHlwZXMuaCIgMwoKdHlw ZWRlZiBzaWduZWQgY2hhciBfX2ludDhfdDsKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9fdWludDhf dDsKdHlwZWRlZiBzaWduZWQgc2hvcnQgaW50IF9faW50MTZfdDsKdHlwZWRlZiB1bnNpZ25lZCBz aG9ydCBpbnQgX191aW50MTZfdDsKdHlwZWRlZiBzaWduZWQgaW50IF9faW50MzJfdDsKdHlwZWRl ZiB1bnNpZ25lZCBpbnQgX191aW50MzJfdDsKCl9fZXh0ZW5zaW9uX18gdHlwZWRlZiBzaWduZWQg bG9uZyBsb25nIGludCBfX2ludDY0X3Q7Cl9fZXh0ZW5zaW9uX18gdHlwZWRlZiB1bnNpZ25lZCBs b25nIGxvbmcgaW50IF9fdWludDY0X3Q7Cgp0eXBlZGVmIF9fcXVhZF90ICpfX3FhZGRyX3Q7Cgp0 eXBlZGVmIF9fdV9xdWFkX3QgX19kZXZfdDsJCSAKdHlwZWRlZiBfX3VfaW50IF9fdWlkX3Q7CQkg CnR5cGVkZWYgX191X2ludCBfX2dpZF90OwkJIAp0eXBlZGVmIF9fdV9sb25nIF9faW5vX3Q7CQkg CnR5cGVkZWYgX191X2ludCBfX21vZGVfdDsJCSAKdHlwZWRlZiBfX3VfaW50IF9fbmxpbmtfdDsg CQkgCnR5cGVkZWYgbG9uZyBpbnQgX19vZmZfdDsJCSAKdHlwZWRlZiBfX3F1YWRfdCBfX2xvZmZf dDsJCSAKdHlwZWRlZiBpbnQgX19waWRfdDsJCQkgCnR5cGVkZWYgaW50IF9fc3NpemVfdDsJCQkg CnR5cGVkZWYgbG9uZyBpbnQgX19ybGltX3Q7CQkgCnR5cGVkZWYgX19xdWFkX3QgX19ybGltNjRf dDsJCSAKdHlwZWRlZiBfX3VfaW50IF9faWRfdDsJCQkgCgp0eXBlZGVmIHN0cnVjdAogIHsKICAg IGludCBfX3ZhbFsyXTsKICB9IF9fZnNpZF90OwkJCQkgCgogCnR5cGVkZWYgaW50IF9fZGFkZHJf dDsJCQkgCnR5cGVkZWYgY2hhciAqX19jYWRkcl90Owp0eXBlZGVmIGxvbmcgaW50IF9fdGltZV90 Owp0eXBlZGVmIGxvbmcgaW50IF9fc3dibGtfdDsJCSAKDAp0eXBlZGVmIGxvbmcgaW50IF9fY2xv Y2tfdDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBfX2ZkX21hc2s7CgogCgoKIAoKCgoK IAp0eXBlZGVmIHN0cnVjdAogIHsKICAgICAKCgoKCgogICAgX19mZF9tYXNrIF9fZmRzX2JpdHNb MTAyNCAgLyAoOCAqIHNpemVvZiAoX19mZF9tYXNrKSkgXTsKCgogIH0gX19mZF9zZXQ7CgoKdHlw ZWRlZiBpbnQgX19rZXlfdDsKCiAKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgX19pcGNfcGlk X3Q7CgoKIAoKIAp0eXBlZGVmIGxvbmcgaW50IF9fYmxrY250X3Q7CnR5cGVkZWYgX19xdWFkX3Qg X19ibGtjbnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9sb25nIF9fZnNibGtjbnRfdDsKdHlwZWRlZiBf X3VfcXVhZF90IF9fZnNibGtjbnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9sb25nIF9fZnNmaWxjbnRf dDsKdHlwZWRlZiBfX3VfcXVhZF90IF9fZnNmaWxjbnQ2NF90OwoKIAp0eXBlZGVmIF9fdV9sb25n IF9faW5vNjRfdDsKCiAKdHlwZWRlZiBfX2xvZmZfdCBfX29mZjY0X3Q7CgogCnR5cGVkZWYgbG9u ZyBpbnQgX190X3NjYWxhcl90Owp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IF9fdF91c2NhbGFy X3Q7CgogCnR5cGVkZWYgaW50IF9faW50cHRyX3Q7CgoKIAoKCgoKCiMgNDAgIi91c3IvaW5jbHVk ZS9zdGRpby5oIiAyIDMKCgoKCgoKCiAKdHlwZWRlZiBzdHJ1Y3QgX0lPX0ZJTEUgRklMRTsKCgoK CgoKCgojIDEgIi91c3IvaW5jbHVkZS9saWJpby5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKIyAxICIvdXNyL2luY2x1ZGUvX0dfY29uZmlnLmgiIDEgMwogCgoKCgoKIAoKCgoK CgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVk ZS9zdGRkZWYuaCIgMSAzCgoKCgoKCiAKCgojIDE5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKIAoKCiAKCgoKCgogCgoK IyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCiAKCiAKCiMg MTMxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUv c3RkZGVmLmgiIDMKCgogCgogCgoKIyAxODggIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFr ZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgdW5zaWduZWQgaW50ICB3aW50X3Q7CgoKCgogCgogCgoj IDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMTQgIi91c3IvaW5jbHVk ZS9fR19jb25maWcuaCIgMiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgaW50IF9HX2lu dDE2X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX0hJX18pKSk7CnR5cGVkZWYgaW50IF9H X2ludDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX1NJX18pKSk7CnR5cGVkZWYgdW5z aWduZWQgaW50IF9HX3VpbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoX19ISV9fKSkp Owp0eXBlZGVmIHVuc2lnbmVkIGludCBfR191aW50MzJfdCBfX2F0dHJpYnV0ZV9fICgoX19tb2Rl X18gKF9fU0lfXykpKTsKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKIAoKCgoKCgoKCgoK CgoKCiMgMzAgIi91c3IvaW5jbHVkZS9saWJpby5oIiAyIDMKCgoKCgoKCgoKCgoKCgoKCiAKCiMg MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0 ZGFyZy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKIAoKIyAxMjIgIi91c3IvbGliL2djYy1s aWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIgMwoKCgoKCgoK CgoKCgoKCgoKCgoKCiMgMjA5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgv Mi45NS4zL2luY2x1ZGUvc3RkYXJnLmgiIDMKCgoKCiMgNDggIi91c3IvaW5jbHVkZS9saWJpby5o IiAyIDMKCgoKCgoKCiMgNjcgIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKIAoKCgoKCgoKCgoK CgoKCgoKCiMgOTggIi91c3IvaW5jbHVkZS9saWJpby5oIiAzCgoKCgoKCgoKCgoKIAoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgpzdHJ1Y3QgX0lPX2p1bXBfdDsg IHN0cnVjdCBfSU9fRklMRTsKCiAKCgoKCgoKCnR5cGVkZWYgdm9pZCBfSU9fbG9ja190OwoKCgog CgpzdHJ1Y3QgX0lPX21hcmtlciB7CiAgc3RydWN0IF9JT19tYXJrZXIgKl9uZXh0OwogIHN0cnVj dCBfSU9fRklMRSAqX3NidWY7CiAgIAoKICAgCiAgaW50IF9wb3M7CiMgMTg2ICIvdXNyL2luY2x1 ZGUvbGliaW8uaCIgMwoKfTsKCnN0cnVjdCBfSU9fRklMRSB7CiAgaW50IF9mbGFnczsJCSAKCgog ICAKICAgCiAgY2hhciogX0lPX3JlYWRfcHRyOwkgCiAgY2hhciogX0lPX3JlYWRfZW5kOwkgCiAg Y2hhciogX0lPX3JlYWRfYmFzZTsJIAogIGNoYXIqIF9JT193cml0ZV9iYXNlOwkgCiAgY2hhciog X0lPX3dyaXRlX3B0cjsJIAogIGNoYXIqIF9JT193cml0ZV9lbmQ7CSAKICBjaGFyKiBfSU9fYnVm X2Jhc2U7CSAKICBjaGFyKiBfSU9fYnVmX2VuZDsJIAogICAKICBjaGFyICpfSU9fc2F2ZV9iYXNl OyAgCiAgY2hhciAqX0lPX2JhY2t1cF9iYXNlOyAgIAogIGNoYXIgKl9JT19zYXZlX2VuZDsgIAoK ICBzdHJ1Y3QgX0lPX21hcmtlciAqX21hcmtlcnM7CgogIHN0cnVjdCBfSU9fRklMRSAqX2NoYWlu OwoKICBpbnQgX2ZpbGVubzsKICBpbnQgX2Jsa3NpemU7CiAgX19vZmZfdCAgIF9vbGRfb2Zmc2V0 OyAgCgoKICAgCiAgdW5zaWduZWQgc2hvcnQgX2N1cl9jb2x1bW47CiAgc2lnbmVkIGNoYXIgX3Z0 YWJsZV9vZmZzZXQ7CiAgY2hhciBfc2hvcnRidWZbMV07CgogICAKCiAgX0lPX2xvY2tfdCAqX2xv Y2s7CgoKCgoKCgoKICBfX29mZjY0X3QgICBfb2Zmc2V0OwogICAKICBpbnQgX3VudXNlZDJbMTZd OwoKfTsKCgoKCgpzdHJ1Y3QgX0lPX0ZJTEVfcGx1czsKZXh0ZXJuIHN0cnVjdCBfSU9fRklMRV9w bHVzIF9JT18yXzFfc3RkaW5fOwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9z dGRvdXRfOwpleHRlcm4gc3RydWN0IF9JT19GSUxFX3BsdXMgX0lPXzJfMV9zdGRlcnJfOwoKCgoK CgoKCgoKCiAKCiAKCnR5cGVkZWYgX19zc2l6ZV90IF9faW9fcmVhZF9mbiAgKHZvaWQgKiAgX19j b29raWUsIGNoYXIgKl9fYnVmLAoJCQkJICAgICAgIHNpemVfdCBfX25ieXRlcykgIDsKCiAKCgoK Cgp0eXBlZGVmIF9fc3NpemVfdCBfX2lvX3dyaXRlX2ZuICAodm9pZCAqICBfX2Nvb2tpZSwgX19j b25zdCBjaGFyICpfX2J1ZiwKCQkJCSAgICAgIHNpemVfdCBfX24pICA7CgogCgoKCgoKdHlwZWRl ZiBpbnQgX19pb19zZWVrX2ZuICAodm9pZCAqICBfX2Nvb2tpZSwgX19vZmZfdCAgIF9fcG9zLCBp bnQgX193KSAgOwoKIAp0eXBlZGVmIGludCBfX2lvX2Nsb3NlX2ZuICAodm9pZCAqICBfX2Nvb2tp ZSkgIDsKCgojIDMxMSAiL3Vzci9pbmNsdWRlL2xpYmlvLmgiIDMKCgoKCmV4dGVybiAiQyIgewoK CmV4dGVybiBpbnQgX191bmRlcmZsb3cgIChfSU9fRklMRSAqKSAgdGhyb3cgKCkgIDsKZXh0ZXJu IGludCBfX3VmbG93ICAoX0lPX0ZJTEUgKikgIHRocm93ICgpICA7CmV4dGVybiBpbnQgX19vdmVy ZmxvdyAgKF9JT19GSUxFICosIGludCkgIHRocm93ICgpICA7CgoKCgoKCgoKCgoKCgoKCgpleHRl cm4gaW50IF9JT19nZXRjICAoX0lPX0ZJTEUgKl9fZnApICB0aHJvdyAoKSAgOwpleHRlcm4gaW50 IF9JT19wdXRjICAoaW50IF9fYywgX0lPX0ZJTEUgKl9fZnApICB0aHJvdyAoKSAgOwpleHRlcm4g aW50IF9JT19mZW9mICAoX0lPX0ZJTEUgKl9fZnApICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IF9J T19mZXJyb3IgIChfSU9fRklMRSAqX19mcCkgIHRocm93ICgpICA7CgpleHRlcm4gaW50IF9JT19w ZWVrY19sb2NrZWQgIChfSU9fRklMRSAqX19mcCkgIHRocm93ICgpICA7CgogCgoKCmV4dGVybiB2 b2lkIF9JT19mbG9ja2ZpbGUgIChfSU9fRklMRSAqKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIHZvaWQg X0lPX2Z1bmxvY2tmaWxlICAoX0lPX0ZJTEUgKikgIHRocm93ICgpICA7CmV4dGVybiBpbnQgX0lP X2Z0cnlsb2NrZmlsZSAgKF9JT19GSUxFICopICB0aHJvdyAoKSAgOwoKCgoKCgoKCgoKCgpleHRl cm4gaW50IF9JT192ZnNjYW5mICAoX0lPX0ZJTEUgKiBfX3Jlc3RyaWN0LCBjb25zdCBjaGFyICog X19yZXN0cmljdCwKCQkJICAgICBfX2dudWNfdmFfbGlzdCAsIGludCAqX19yZXN0cmljdCkgIHRo cm93ICgpICA7CmV4dGVybiBpbnQgX0lPX3ZmcHJpbnRmICAoX0lPX0ZJTEUgKl9fcmVzdHJpY3Qs IGNvbnN0IGNoYXIgKl9fcmVzdHJpY3QsCgkJCSAgICAgIF9fZ251Y192YV9saXN0ICkgIHRocm93 ICgpICA7CmV4dGVybiBfX3NzaXplX3QgICBfSU9fcGFkbiAgKF9JT19GSUxFICosIGludCwgX19z c2l6ZV90ICApICB0aHJvdyAoKSAgOwpleHRlcm4gc2l6ZV90ICAgX0lPX3NnZXRuICAoX0lPX0ZJ TEUgKiwgdm9pZCAqLCBzaXplX3QgICkgIHRocm93ICgpICA7CgpleHRlcm4gX19vZmY2NF90ICAg X0lPX3NlZWtvZmYgIChfSU9fRklMRSAqLCBfX29mZjY0X3QgICwgaW50LCBpbnQpICB0aHJvdyAo KSAgOwpleHRlcm4gX19vZmY2NF90ICAgX0lPX3NlZWtwb3MgIChfSU9fRklMRSAqLCBfX29mZjY0 X3QgICwgaW50KSAgdGhyb3cgKCkgIDsKCmV4dGVybiB2b2lkIF9JT19mcmVlX2JhY2t1cF9hcmVh ICAoX0lPX0ZJTEUgKikgIHRocm93ICgpICA7CgoKfQoKCgojIDU3ICIvdXNyL2luY2x1ZGUvc3Rk aW8uaCIgMiAzCgoKIAoKdHlwZWRlZiBfX29mZl90ICBmcG9zX3Q7CgoKCgoKCgogCgoKCgoKIAoK CgoKCiAKCgoKCgoKIAoKCgoKCgoKIAoKCgoKIAoKCgoKCgoKCiMgMSAiL3Vzci9pbmNsdWRlL2Jp dHMvc3RkaW9fbGltLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiMgMTEwICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMiAzCgoKCiAKZXh0ZXJuIEZJTEUgKnN0ZGlu OwkJIApleHRlcm4gRklMRSAqc3Rkb3V0OwkJIApleHRlcm4gRklMRSAqc3RkZXJyOwkJIAogCgoK CgoKIApleHRlcm4gaW50IHJlbW92ZSAgKF9fY29uc3QgY2hhciAqX19maWxlbmFtZSkgIHRocm93 ICgpICA7CiAKZXh0ZXJuIGludCByZW5hbWUgIChfX2NvbnN0IGNoYXIgKl9fb2xkLCBfX2NvbnN0 IGNoYXIgKl9fbmV3KSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4gRklMRSAqdG1wZmlsZSAgKHZv aWQpICB0aHJvdyAoKSAgOwoKCgoKCgoKCgoKIApleHRlcm4gY2hhciAqdG1wbmFtICAoY2hhciAq X19zKSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4gY2hhciAqdG1wbmFtX3IgIChjaGFyICpfX3Mp ICB0aHJvdyAoKSAgOwoKCgoKIAoKCgoKCgpleHRlcm4gY2hhciAqdGVtcG5hbSAgKF9fY29uc3Qg Y2hhciAqX19kaXIsIF9fY29uc3QgY2hhciAqX19wZngpICB0aHJvdyAoKSAgOwoKCgogCmV4dGVy biBpbnQgZmNsb3NlICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwogCmV4dGVybiBpbnQg ZmZsdXNoICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIGludCBmZmx1 c2hfdW5sb2NrZWQgIChGSUxFICpfX3N0cmVhbSkgIHRocm93ICgpICA7CgoKCgoKCgoKCiAKZXh0 ZXJuIEZJTEUgKmZvcGVuICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZmlsZW5hbWUsCgkJ CSBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19tb2RlcykgIHRocm93ICgpICA7CiAKZXh0ZXJu IEZJTEUgKmZyZW9wZW4gIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19maWxlbmFtZSwKCQkJ ICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbW9kZXMsCgkJCSAgIEZJTEUgKl9fcmVzdHJp Y3QgX19zdHJlYW0pICB0aHJvdyAoKSAgOwojIDIwMSAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMK CgoKCgoKCgoKCiAKZXh0ZXJuIEZJTEUgKmZkb3BlbiAgKGludCBfX2ZkLCBfX2NvbnN0IGNoYXIg Kl9fbW9kZXMpICB0aHJvdyAoKSAgOwoKCiMgMjI3ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMwoK CgogCgpleHRlcm4gdm9pZCBzZXRidWYgIChGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtLCBjaGFy ICpfX3Jlc3RyaWN0IF9fYnVmKSAgdGhyb3cgKCkgIDsKIAoKCmV4dGVybiBpbnQgc2V0dmJ1ZiAg KEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sIGNoYXIgKl9fcmVzdHJpY3QgX19idWYsCgkJCSBp bnQgX19tb2Rlcywgc2l6ZV90IF9fbikgIHRocm93ICgpICA7CgoKIAoKZXh0ZXJuIHZvaWQgc2V0 YnVmZmVyICAoRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSwgY2hhciAqX19yZXN0cmljdCBfX2J1 ZiwKCQkJICAgIHNpemVfdCBfX3NpemUpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gdm9pZCBzZXRs aW5lYnVmICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCgogCmV4dGVybiBpbnQgZnBy aW50ZiAgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJCSBfX2NvbnN0IGNoYXIgKl9fcmVz dHJpY3QgX19mb3JtYXQsIC4uLikgIHRocm93ICgpICA7CiAKZXh0ZXJuIGludCBwcmludGYgIChf X2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgIHRocm93ICgpICA7CiAKZXh0 ZXJuIGludCBzcHJpbnRmICAoY2hhciAqX19yZXN0cmljdCBfX3MsCgkJCSBfX2NvbnN0IGNoYXIg Kl9fcmVzdHJpY3QgX19mb3JtYXQsIC4uLikgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgdmZw cmludGYgIChGSUxFICpfX3Jlc3RyaWN0IF9fcywKCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJp Y3QgX19mb3JtYXQsCgkJCSAgX19nbnVjX3ZhX2xpc3QgIF9fYXJnKSAgdGhyb3cgKCkgIDsKIApl eHRlcm4gaW50IHZwcmludGYgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCgkJ CSBfX2dudWNfdmFfbGlzdCAgX19hcmcpICB0aHJvdyAoKSAgOwogCmV4dGVybiBpbnQgdnNwcmlu dGYgIChjaGFyICpfX3Jlc3RyaWN0IF9fcywKCQkJICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3Qg X19mb3JtYXQsCgkJCSAgX19nbnVjX3ZhX2xpc3QgIF9fYXJnKSAgdGhyb3cgKCkgIDsKCgogCmV4 dGVybiBpbnQgc25wcmludGYgIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVu LAoJCQkgIF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2Zvcm1hdCwgLi4uKSAgdGhyb3cgKCkg IAogICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAzLCA0KSkpOwoK ZXh0ZXJuIGludCBfX3ZzbnByaW50ZiAgKGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3QgX19t YXhsZW4sCgkJCSAgICAgX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LAoJCQkgICAg IF9fZ251Y192YV9saXN0ICBfX2FyZykgIHRocm93ICgpICAKICAgICBfX2F0dHJpYnV0ZV9fICgo X19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkpKTsKZXh0ZXJuIGludCB2c25wcmludGYgIChj aGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbWF4bGVuLAoJCQkgICBfX2NvbnN0IGNoYXIg Kl9fcmVzdHJpY3QgX19mb3JtYXQsCgkJCSAgIF9fZ251Y192YV9saXN0ICBfX2FyZykgIHRocm93 ICgpICAKICAgICBfX2F0dHJpYnV0ZV9fICgoX19mb3JtYXRfXyAoX19wcmludGZfXywgMywgMCkp KTsKCgojIDMwNiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKIApleHRlcm4gaW50IGZzY2Fu ZiAgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJCV9fY29uc3QgY2hhciAqX19yZXN0cmlj dCBfX2Zvcm1hdCwgLi4uKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gaW50IHNjYW5mICAoX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pICB0aHJvdyAoKSAgOwogCmV4dGVybiBp bnQgc3NjYW5mICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKCQkJX19jb25zdCBjaGFy ICpfX3Jlc3RyaWN0IF9fZm9ybWF0LCAuLi4pICB0aHJvdyAoKSAgOwoKIyAzMzQgIi91c3IvaW5j bHVkZS9zdGRpby5oIiAzCgoKCiAKZXh0ZXJuIGludCBmZ2V0YyAgKEZJTEUgKl9fc3RyZWFtKSAg dGhyb3cgKCkgIDsKZXh0ZXJuIGludCBnZXRjICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAg OwoKIApleHRlcm4gaW50IGdldGNoYXIgICh2b2lkKSAgdGhyb3cgKCkgIDsKCiAKCgoKCiAKZXh0 ZXJuIGludCBnZXRjX3VubG9ja2VkICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwpleHRl cm4gaW50IGdldGNoYXJfdW5sb2NrZWQgICh2b2lkKSAgdGhyb3cgKCkgIDsKCgoKIApleHRlcm4g aW50IGZnZXRjX3VubG9ja2VkICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCgogCmV4 dGVybiBpbnQgZnB1dGMgIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgIHRocm93ICgpICA7CmV4 dGVybiBpbnQgcHV0YyAgKGludCBfX2MsIEZJTEUgKl9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKCiAK ZXh0ZXJuIGludCBwdXRjaGFyICAoaW50IF9fYykgIHRocm93ICgpICA7CgogCgoKCgogCmV4dGVy biBpbnQgZnB1dGNfdW5sb2NrZWQgIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgIHRocm93ICgp ICA7CgoKCiAKZXh0ZXJuIGludCBwdXRjX3VubG9ja2VkICAoaW50IF9fYywgRklMRSAqX19zdHJl YW0pICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHB1dGNoYXJfdW5sb2NrZWQgIChpbnQgX19jKSAg dGhyb3cgKCkgIDsKCgoKCiAKZXh0ZXJuIGludCBnZXR3ICAoRklMRSAqX19zdHJlYW0pICB0aHJv dyAoKSAgOwoKIApleHRlcm4gaW50IHB1dHcgIChpbnQgX193LCBGSUxFICpfX3N0cmVhbSkgIHRo cm93ICgpICA7CgoKCiAKZXh0ZXJuIGNoYXIgKmZnZXRzICAoY2hhciAqX19yZXN0cmljdCBfX3Ms IGludCBfX24sCgkJCSBGSUxFICpfX3Jlc3RyaWN0IF9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKCgoK CgoKCiAKCmV4dGVybiBjaGFyICpnZXRzICAoY2hhciAqX19zKSAgdGhyb3cgKCkgIDsKCgojIDQy NCAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKIApleHRlcm4gaW50IGZwdXRzICAoX19jb25z dCBjaGFyICpfX3Jlc3RyaWN0IF9fcywKCQkgICAgICAgRklMRSAqX19yZXN0cmljdCBfX3N0cmVh bSkgIHRocm93ICgpICA7CgoKCgoKCgogCmV4dGVybiBpbnQgcHV0cyAgKF9fY29uc3QgY2hhciAq X19zKSAgdGhyb3cgKCkgIDsKCgogCmV4dGVybiBpbnQgdW5nZXRjICAoaW50IF9fYywgRklMRSAq X19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIHNpemVfdCBmcmVhZCAgKHZvaWQgKl9f cmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCgkJCSAgc2l6ZV90IF9fbiwgRklMRSAqX19y ZXN0cmljdCBfX3N0cmVhbSkgIHRocm93ICgpICA7CiAKZXh0ZXJuIHNpemVfdCBmd3JpdGUgIChf X2NvbnN0IHZvaWQgKl9fcmVzdHJpY3QgX19wdHIsIHNpemVfdCBfX3NpemUsCgkJCSAgIHNpemVf dCBfX24sIEZJTEUgKl9fcmVzdHJpY3QgX19zKSAgdGhyb3cgKCkgIDsKCgogCmV4dGVybiBzaXpl X3QgZnJlYWRfdW5sb2NrZWQgICh2b2lkICpfX3Jlc3RyaWN0IF9fcHRyLCBzaXplX3QgX19zaXpl LAoJCQkJICAgc2l6ZV90IF9fbiwgRklMRSAqX19yZXN0cmljdCBfX3N0cmVhbSkgIHRocm93ICgp ICA7CmV4dGVybiBzaXplX3QgZndyaXRlX3VubG9ja2VkICAoX19jb25zdCB2b2lkICpfX3Jlc3Ry aWN0IF9fcHRyLAoJCQkJICAgIHNpemVfdCBfX3NpemUsIHNpemVfdCBfX24sCgkJCQkgICAgRklM RSAqX19yZXN0cmljdCBfX3N0cmVhbSkgIHRocm93ICgpICA7CgoKCiAKZXh0ZXJuIGludCBmc2Vl ayAgKEZJTEUgKl9fc3RyZWFtLCBsb25nIGludCBfX29mZiwgaW50IF9fd2hlbmNlKSAgdGhyb3cg KCkgIDsKIApleHRlcm4gbG9uZyBpbnQgZnRlbGwgIChGSUxFICpfX3N0cmVhbSkgIHRocm93ICgp ICA7CiAKZXh0ZXJuIHZvaWQgcmV3aW5kICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoK IAoKCgoKIAoKCnR5cGVkZWYgX19vZmZfdCBvZmZfdDsKCgoKCgoKCgoKCgoKCgoKCgoKCgogCmV4 dGVybiBpbnQgZmdldHBvcyAgKEZJTEUgKl9fcmVzdHJpY3QgX19zdHJlYW0sCgkJCSBmcG9zX3Qg Kl9fcmVzdHJpY3QgX19wb3MpICB0aHJvdyAoKSAgOwogCmV4dGVybiBpbnQgZnNldHBvcyAgKEZJ TEUgKl9fc3RyZWFtLCBfX2NvbnN0IGZwb3NfdCAqX19wb3MpICB0aHJvdyAoKSAgOwojIDUyMyAi L3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgojIDUzMyAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMK CgogCmV4dGVybiB2b2lkIGNsZWFyZXJyICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwog CmV4dGVybiBpbnQgZmVvZiAgKEZJTEUgKl9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKIApleHRlcm4g aW50IGZlcnJvciAgKEZJTEUgKl9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKCgogCmV4dGVybiB2b2lk IGNsZWFyZXJyX3VubG9ja2VkICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwpleHRlcm4g aW50IGZlb2ZfdW5sb2NrZWQgIChGSUxFICpfX3N0cmVhbSkgIHRocm93ICgpICA7CmV4dGVybiBp bnQgZmVycm9yX3VubG9ja2VkICAoRklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCgogCmV4 dGVybiB2b2lkIHBlcnJvciAgKF9fY29uc3QgY2hhciAqX19zKSAgdGhyb3cgKCkgIDsKCiAKCgpl eHRlcm4gaW50IHN5c19uZXJyOwpleHRlcm4gX19jb25zdCBjaGFyICpfX2NvbnN0IHN5c19lcnJs aXN0W107CgoKCgoKCgoKIApleHRlcm4gaW50IGZpbGVubyAgKEZJTEUgKl9fc3RyZWFtKSAgdGhy b3cgKCkgIDsKCgoKIApleHRlcm4gaW50IGZpbGVub191bmxvY2tlZCAgKEZJTEUgKl9fc3RyZWFt KSAgdGhyb3cgKCkgIDsKCgoKCgogCmV4dGVybiBGSUxFICpwb3BlbiAgKF9fY29uc3QgY2hhciAq X19jb21tYW5kLCBfX2NvbnN0IGNoYXIgKl9fbW9kZXMpICB0aHJvdyAoKSAgOwoKIApleHRlcm4g aW50IHBjbG9zZSAgKEZJTEUgKl9fc3RyZWFtKSAgdGhyb3cgKCkgIDsKCgoKCiAKZXh0ZXJuIGNo YXIgKmN0ZXJtaWQgIChjaGFyICpfX3MpICB0aHJvdyAoKSAgOwoKCgoKCgoKCgojIDYwNyAiL3Vz ci9pbmNsdWRlL3N0ZGlvLmgiIDMKCgoKCiAKCiAKZXh0ZXJuIHZvaWQgZmxvY2tmaWxlICAoRklM RSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIGludCBmdHJ5bG9ja2ZpbGUgIChG SUxFICpfX3N0cmVhbSkgIHRocm93ICgpICA7CgogCmV4dGVybiB2b2lkIGZ1bmxvY2tmaWxlICAo RklMRSAqX19zdHJlYW0pICB0aHJvdyAoKSAgOwoKCgoKCgoKCgoKIAoKCiMgMSAiL3Vzci9pbmNs dWRlL2JpdHMvc3RkaW8uaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCmlu bGluZSAgaW50CnZwcmludGYgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX2ZtdCwgX19nbnVj X3ZhX2xpc3QgIF9fYXJnKSB0aHJvdyAoKSAKewogIHJldHVybiB2ZnByaW50ZiAoc3Rkb3V0ICwg X19mbXQsIF9fYXJnKTsKfQoKIAppbmxpbmUgIGludApnZXRjaGFyICh2b2lkKSB0aHJvdyAoKSAK ewogIHJldHVybiBfSU9fZ2V0YyAoc3RkaW4gKTsKfQoKCgogCmlubGluZSAgaW50CmdldGNfdW5s b2NrZWQgKEZJTEUgKl9fZnApIHRocm93ICgpIAp7CiAgcmV0dXJuICgoIF9fZnAgKS0+X0lPX3Jl YWRfcHRyID49ICggX19mcCApLT5fSU9fcmVhZF9lbmQgPyBfX3VmbG93ICggX19mcCApIDogKih1 bnNpZ25lZCBjaGFyICopICggX19mcCApLT5fSU9fcmVhZF9wdHIrKykgOwp9CgogCmlubGluZSAg aW50CmdldGNoYXJfdW5sb2NrZWQgKHZvaWQpIHRocm93ICgpIAp7CiAgcmV0dXJuICgoIHN0ZGlu ICApLT5fSU9fcmVhZF9wdHIgPj0gKCBzdGRpbiAgKS0+X0lPX3JlYWRfZW5kID8gX191ZmxvdyAo IHN0ZGluICApIDogKih1bnNpZ25lZCBjaGFyICopICggc3RkaW4gICktPl9JT19yZWFkX3B0cisr KSA7Cn0KCgoKIAppbmxpbmUgIGludApwdXRjaGFyIChpbnQgX19jKSB0aHJvdyAoKSAKewogIHJl dHVybiBfSU9fcHV0YyAoX19jLCBzdGRvdXQgKTsKfQoKCgogCmlubGluZSAgaW50CmZwdXRjX3Vu bG9ja2VkIChpbnQgX19jLCBGSUxFICpfX3N0cmVhbSkgdGhyb3cgKCkgCnsKICByZXR1cm4gKCgo ICBfX3N0cmVhbSApLT5fSU9fd3JpdGVfcHRyID49ICggIF9fc3RyZWFtICktPl9JT193cml0ZV9l bmQpID8gX19vdmVyZmxvdyAoICBfX3N0cmVhbSAsICh1bnNpZ25lZCBjaGFyKSAoIF9fYyApKSA6 ICh1bnNpZ25lZCBjaGFyKSAoKiggIF9fc3RyZWFtICktPl9JT193cml0ZV9wdHIrKyA9ICggX19j ICkpKSA7Cn0KCgoKCiAKaW5saW5lICBpbnQKcHV0Y191bmxvY2tlZCAoaW50IF9fYywgRklMRSAq X19zdHJlYW0pIHRocm93ICgpIAp7CiAgcmV0dXJuICgoKCAgX19zdHJlYW0gKS0+X0lPX3dyaXRl X3B0ciA+PSAoICBfX3N0cmVhbSApLT5fSU9fd3JpdGVfZW5kKSA/IF9fb3ZlcmZsb3cgKCAgX19z dHJlYW0gLCAodW5zaWduZWQgY2hhcikgKCBfX2MgKSkgOiAodW5zaWduZWQgY2hhcikgKCooICBf X3N0cmVhbSApLT5fSU9fd3JpdGVfcHRyKysgPSAoIF9fYyApKSkgOwp9CgogCmlubGluZSAgaW50 CnB1dGNoYXJfdW5sb2NrZWQgKGludCBfX2MpIHRocm93ICgpIAp7CiAgcmV0dXJuICgoKCAgc3Rk b3V0ICApLT5fSU9fd3JpdGVfcHRyID49ICggIHN0ZG91dCAgKS0+X0lPX3dyaXRlX2VuZCkgPyBf X292ZXJmbG93ICggIHN0ZG91dCAgLCAodW5zaWduZWQgY2hhcikgKCBfX2MgKSkgOiAodW5zaWdu ZWQgY2hhcikgKCooICBzdGRvdXQgICktPl9JT193cml0ZV9wdHIrKyA9ICggX19jICkpKSA7Cn0K CgoKCgoKCgoKCgoKCgogCmlubGluZSAgaW50CmZlb2ZfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFt KSB0aHJvdyAoKSAKewogIHJldHVybiAoKCggX19zdHJlYW0gKS0+X2ZsYWdzICYgMHgxMCApICE9 IDApIDsKfQoKIAppbmxpbmUgIGludApmZXJyb3JfdW5sb2NrZWQgKEZJTEUgKl9fc3RyZWFtKSB0 aHJvdyAoKSAKewogIHJldHVybiAoKCggX19zdHJlYW0gKS0+X2ZsYWdzICYgMHgyMCApICE9IDAp IDsKfQoKCgoKCgogCgojIDE0OSAiL3Vzci9pbmNsdWRlL2JpdHMvc3RkaW8uaCIgMwoKCiMgMTY1 ICIvdXNyL2luY2x1ZGUvYml0cy9zdGRpby5oIiAzCgoKIAoKIyA2MzUgIi91c3IvaW5jbHVkZS9z dGRpby5oIiAyIDMKCgoKfSAKCgoKCiMgNDQgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdGV4dHN0 cmVhbS5oIiAyCgoKCgpjbGFzcyBRVGV4dENvZGVjOwpjbGFzcyBRVGV4dERlY29kZXI7CgpjbGFz cyBRVGV4dFN0cmVhbVByaXZhdGU7CgpjbGFzcyAgIFFUZXh0U3RyZWFtCQkJCSAKewpwdWJsaWM6 CiAgICBlbnVtIEVuY29kaW5nIHsgTG9jYWxlLCBMYXRpbjEsIFVuaWNvZGUsIFVuaWNvZGVOZXR3 b3JrT3JkZXIsCgkJICAgIFVuaWNvZGVSZXZlcnNlLCBSYXdVbmljb2RlLCBVbmljb2RlVVRGOCB9 OwoKICAgIHZvaWQJc2V0RW5jb2RpbmcoIEVuY29kaW5nICk7CgogICAgdm9pZAlzZXRDb2RlYygg UVRleHRDb2RlYyogKTsKCgogICAgIAoKICAgIFFUZXh0U3RyZWFtKCk7CiAgICBRVGV4dFN0cmVh bSggUUlPRGV2aWNlICogKTsKICAgIFFUZXh0U3RyZWFtKCBRU3RyaW5nKiwgaW50IG1vZGUgKTsK ICAgIFFUZXh0U3RyZWFtKCBRU3RyaW5nJiwgaW50IG1vZGUgKTsJCSAKICAgIFFUZXh0U3RyZWFt KCBRQnl0ZUFycmF5LCBpbnQgbW9kZSApOwogICAgUVRleHRTdHJlYW0oIEZJTEUgKiwgaW50IG1v ZGUgKTsKICAgIHZpcnR1YWwgflFUZXh0U3RyZWFtKCk7CgogICAgUUlPRGV2aWNlCSpkZXZpY2Uo KSBjb25zdDsKICAgIHZvaWQJIHNldERldmljZSggUUlPRGV2aWNlICogKTsKICAgIHZvaWQJIHVu c2V0RGV2aWNlKCk7CgogICAgYm9vbAkgYXRFbmQoKSBjb25zdDsKICAgIGJvb2wJIGVvZigpIGNv bnN0OwoKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcj4+KCBRQ2hhciAmICk7CiAgICBRVGV4dFN0 cmVhbSAmb3BlcmF0b3I+PiggY2hhciAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+Pigg c2lnbmVkIHNob3J0ICYgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcj4+KCB1bnNpZ25lZCBz aG9ydCAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+Piggc2lnbmVkIGludCAmICk7CiAg ICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggdW5zaWduZWQgaW50ICYgKTsKICAgIFFUZXh0U3Ry ZWFtICZvcGVyYXRvcj4+KCBzaWduZWQgbG9uZyAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0 b3I+PiggdW5zaWduZWQgbG9uZyAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggZmxv YXQgJiApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPj4oIGRvdWJsZSAmICk7CiAgICBRVGV4 dFN0cmVhbSAmb3BlcmF0b3I+PiggY2hhciAqICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+ PiggUVN0cmluZyAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggUUNTdHJpbmcgJiAp OwoKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBRQ2hhciApOwogICAgUVRleHRTdHJlYW0g Jm9wZXJhdG9yPDwoIGNoYXIgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBzaWduZWQg c2hvcnQgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCB1bnNpZ25lZCBzaG9ydCApOwog ICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIHNpZ25lZCBpbnQgKTsKICAgIFFUZXh0U3RyZWFt ICZvcGVyYXRvcjw8KCB1bnNpZ25lZCBpbnQgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8 KCBzaWduZWQgbG9uZyApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIHVuc2lnbmVkIGxv bmcgKTsKICAgIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBmbG9hdCApOwogICAgUVRleHRTdHJl YW0gJm9wZXJhdG9yPDwoIGRvdWJsZSApOwogICAgUVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIGNv bnN0IGNoYXIqICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggY29uc3QgUVN0cmluZyAm ICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggY29uc3QgUUNTdHJpbmcgJiApOwogICAg UVRleHRTdHJlYW0gJm9wZXJhdG9yPDwoIHZvaWQgKiApOwkJIAoKICAgIFFUZXh0U3RyZWFtICZy ZWFkUmF3Qnl0ZXMoIGNoYXIgKiwgdWludCBsZW4gKTsKICAgIFFUZXh0U3RyZWFtICZ3cml0ZVJh d0J5dGVzKCBjb25zdCBjaGFyKiAsIHVpbnQgbGVuICk7CgogICAgUVN0cmluZwlyZWFkTGluZSgp OwogICAgUVN0cmluZwlyZWFkKCk7CiAgICB2b2lkCXNraXBXaGl0ZVNwYWNlKCk7CgogICAgZW51 bSB7Cglza2lwd3MJICA9IDB4MDAwMSwJCQkgCglsZWZ0CSAgPSAweDAwMDIsCQkJIAoJcmlnaHQJ ICA9IDB4MDAwNCwJCQkgCglpbnRlcm5hbCAgPSAweDAwMDgsCQkJIAoJYmluCSAgPSAweDAwMTAs CQkJIAoJb2N0CSAgPSAweDAwMjAsCQkJIAoJZGVjCSAgPSAweDAwNDAsCQkJIAoJaGV4CSAgPSAw eDAwODAsCQkJIAoJc2hvd2Jhc2UgID0gMHgwMTAwLAkJCSAKCXNob3dwb2ludCA9IDB4MDIwMCwJ CQkgCgl1cHBlcmNhc2UgPSAweDA0MDAsCQkJIAoJc2hvd3BvcwkgID0gMHgwODAwLAkJCSAKCXNj aWVudGlmaWM9IDB4MTAwMCwJCQkgCglmaXhlZAkgID0gMHgyMDAwCQkJIAogICAgfTsKCiAgICBz dGF0aWMgY29uc3QgaW50IGJhc2VmaWVsZDsJCQkgCiAgICBzdGF0aWMgY29uc3QgaW50IGFkanVz dGZpZWxkOwkJIAogICAgc3RhdGljIGNvbnN0IGludCBmbG9hdGZpZWxkOwkJIAoKICAgIGludAkg IGZsYWdzKCkgY29uc3Q7CiAgICBpbnQJICBmbGFncyggaW50IGYgKTsKICAgIGludAkgIHNldGYo IGludCBiaXRzICk7CiAgICBpbnQJICBzZXRmKCBpbnQgYml0cywgaW50IG1hc2sgKTsKICAgIGlu dAkgIHVuc2V0ZiggaW50IGJpdHMgKTsKCiAgICB2b2lkICByZXNldCgpOwoKICAgIGludAkgIHdp ZHRoKCkJY29uc3Q7CiAgICBpbnQJICB3aWR0aCggaW50ICk7CiAgICBpbnQJICBmaWxsKCkJY29u c3Q7CiAgICBpbnQJICBmaWxsKCBpbnQgKTsKICAgIGludAkgIHByZWNpc2lvbigpCWNvbnN0Owog ICAgaW50CSAgcHJlY2lzaW9uKCBpbnQgKTsKCnByaXZhdGU6CiAgICBsb25nCWlucHV0X2ludCgp OwogICAgdm9pZAlpbml0KCk7CiAgICBRVGV4dFN0cmVhbSAmb3V0cHV0X2ludCggaW50LCB1bG9u ZywgYm9vbCApOwogICAgUUlPRGV2aWNlCSpkZXY7CgogICAgaW50CQlmZmxhZ3M7CiAgICBpbnQJ CWZ3aWR0aDsKICAgIGludAkJZmlsbGNoYXI7CiAgICBpbnQJCWZwcmVjOwogICAgYm9vbAlkb1Vu aWNvZGVIZWFkZXI7CiAgICBib29sCW93bmRldjsKICAgIFFUZXh0Q29kZWMgCSptYXBwZXI7CiAg ICBRVGV4dFN0cmVhbVByaXZhdGUgKiBkOwogICAgUUNoYXIJdW51c2VkMTsgIAogICAgYm9vbAls YXRpbjE7CiAgICBib29sIAlpbnRlcm5hbE9yZGVyOwogICAgYm9vbAluZXR3b3JrT3JkZXI7CiAg ICB2b2lkCSp1bnVzZWQyOyAgCgogICAgUUNoYXIJZWF0X3dzKCk7CiAgICB1aW50IAl0c19nZXRs aW5lKCBRQ2hhciogKTsKICAgIHZvaWQJdHNfdW5nZXRjKCBRQ2hhciApOwogICAgUUNoYXIJdHNf Z2V0YygpOwogICAgdWludAl0c19nZXRidWYoIFFDaGFyKiwgdWludCApOwogICAgdm9pZAl0c19w dXRjKGludCk7CiAgICB2b2lkCXRzX3B1dGMoUUNoYXIpOwogICAgYm9vbAl0c19pc3NwYWNlKFFD aGFyKTsKICAgIGJvb2wJdHNfaXNkaWdpdChRQ2hhcik7CiAgICB1bG9uZwlpbnB1dF9iaW4oKTsK ICAgIHVsb25nCWlucHV0X29jdCgpOwogICAgdWxvbmcJaW5wdXRfZGVjKCk7CiAgICB1bG9uZwlp bnB1dF9oZXgoKTsKICAgIGRvdWJsZQlpbnB1dF9kb3VibGUoKTsKICAgIFFUZXh0U3RyZWFtICZ3 cml0ZUJsb2NrKCBjb25zdCBjaGFyKiBwLCB1aW50IGxlbiApOwogICAgUVRleHRTdHJlYW0gJndy aXRlQmxvY2soIGNvbnN0IFFDaGFyKiBwLCB1aW50IGxlbiApOwoKcHJpdmF0ZToJIAoKICAgIFFU ZXh0U3RyZWFtKCBjb25zdCBRVGV4dFN0cmVhbSAmICk7CiAgICBRVGV4dFN0cmVhbSAmb3BlcmF0 b3I9KCBjb25zdCBRVGV4dFN0cmVhbSAmICk7Cgp9OwoKdHlwZWRlZiBRVGV4dFN0cmVhbSBRVFM7 CgpjbGFzcyAgIFFUZXh0SVN0cmVhbSA6IHB1YmxpYyBRVGV4dFN0cmVhbSB7CnB1YmxpYzoKICAg IFFUZXh0SVN0cmVhbSggY29uc3QgUVN0cmluZyogcyApIDoKCVFUZXh0U3RyZWFtKChRU3RyaW5n KilzLDB4MDAwMSApIHsgfQogICAgUVRleHRJU3RyZWFtKCBRQnl0ZUFycmF5IGJhICkgOgoJUVRl eHRTdHJlYW0oYmEsMHgwMDAxICkgeyB9CiAgICBRVGV4dElTdHJlYW0oIEZJTEUgKmYgKSA6CglR VGV4dFN0cmVhbShmLDB4MDAwMSApIHsgfQp9OwoKY2xhc3MgICBRVGV4dE9TdHJlYW0gOiBwdWJs aWMgUVRleHRTdHJlYW0gewpwdWJsaWM6CiAgICBRVGV4dE9TdHJlYW0oIFFTdHJpbmcqIHMgKSA6 CglRVGV4dFN0cmVhbShzLDB4MDAwMiApIHsgfQogICAgUVRleHRPU3RyZWFtKCBRQnl0ZUFycmF5 IGJhICkgOgoJUVRleHRTdHJlYW0oYmEsMHgwMDAyICkgeyB9CiAgICBRVGV4dE9TdHJlYW0oIEZJ TEUgKmYgKSA6CglRVGV4dFN0cmVhbShmLDB4MDAwMiApIHsgfQp9OwoKIAoKCgppbmxpbmUgUUlP RGV2aWNlICpRVGV4dFN0cmVhbTo6ZGV2aWNlKCkgY29uc3QKeyByZXR1cm4gZGV2OyB9Cgppbmxp bmUgYm9vbCBRVGV4dFN0cmVhbTo6YXRFbmQoKSBjb25zdAp7IHJldHVybiBkZXYgPyBkZXYtPmF0 RW5kKCkgOiBGQUxTRTsgfQoKaW5saW5lIGJvb2wgUVRleHRTdHJlYW06OmVvZigpIGNvbnN0Cnsg cmV0dXJuIGF0RW5kKCk7IH0KCmlubGluZSBpbnQgUVRleHRTdHJlYW06OmZsYWdzKCkgY29uc3QK eyByZXR1cm4gZmZsYWdzOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpmbGFncyggaW50IGYg KQp7IGludCBvbGRmID0gZmZsYWdzOyAgZmZsYWdzID0gZjsgIHJldHVybiBvbGRmOyB9Cgppbmxp bmUgaW50IFFUZXh0U3RyZWFtOjpzZXRmKCBpbnQgYml0cyApCnsgaW50IG9sZGYgPSBmZmxhZ3M7 ICBmZmxhZ3MgfD0gYml0czsgIHJldHVybiBvbGRmOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFt OjpzZXRmKCBpbnQgYml0cywgaW50IG1hc2sgKQp7IGludCBvbGRmID0gZmZsYWdzOyAgZmZsYWdz ID0gKGZmbGFncyAmIH5tYXNrKSB8IChiaXRzICYgbWFzayk7IHJldHVybiBvbGRmOyB9Cgppbmxp bmUgaW50IFFUZXh0U3RyZWFtOjp1bnNldGYoIGludCBiaXRzICkKeyBpbnQgb2xkZiA9IGZmbGFn czsgIGZmbGFncyAmPSB+Yml0czsJcmV0dXJuIG9sZGY7IH0KCmlubGluZSBpbnQgUVRleHRTdHJl YW06OndpZHRoKCkgY29uc3QKeyByZXR1cm4gZndpZHRoOyB9CgppbmxpbmUgaW50IFFUZXh0U3Ry ZWFtOjp3aWR0aCggaW50IHcgKQp7IGludCBvbGR3ID0gZndpZHRoOyAgZndpZHRoID0gdzsgIHJl dHVybiBvbGR3OwkgfQoKaW5saW5lIGludCBRVGV4dFN0cmVhbTo6ZmlsbCgpIGNvbnN0CnsgcmV0 dXJuIGZpbGxjaGFyOyB9CgppbmxpbmUgaW50IFFUZXh0U3RyZWFtOjpmaWxsKCBpbnQgZiApCnsg aW50IG9sZGMgPSBmaWxsY2hhcjsJZmlsbGNoYXIgPSBmOyAgcmV0dXJuIG9sZGM7ICB9Cgppbmxp bmUgaW50IFFUZXh0U3RyZWFtOjpwcmVjaXNpb24oKSBjb25zdAp7IHJldHVybiBmcHJlYzsgfQoK aW5saW5lIGludCBRVGV4dFN0cmVhbTo6cHJlY2lzaW9uKCBpbnQgcCApCnsgaW50IG9sZHAgPSBm cHJlYzsgIGZwcmVjID0gcDsJIHJldHVybiBvbGRwOyAgfQoKIAoKCmlubGluZSBRQ2hhciBRVGV4 dFN0cmVhbTo6dHNfZ2V0YygpCnsgUUNoYXIgcjsgcmV0dXJuICggdHNfZ2V0YnVmKCAmciwxICkg PT0gMSA/IHIgOiBRQ2hhcigodXNob3J0KTB4ZmZmZikgKTsgfQoKIAoKCgp0eXBlZGVmIFFUZXh0 U3RyZWFtICYgKCpRVFNGVU5DKShRVGV4dFN0cmVhbSAmKTsgCnR5cGVkZWYgaW50IChRVGV4dFN0 cmVhbTo6KlFUU01GSSkoaW50KTsJIAoKY2xhc3MgICBRVFNNYW5pcCB7CQkJIApwdWJsaWM6CiAg ICBRVFNNYW5pcCggUVRTTUZJIG0sIGludCBhICkgeyBtZj1tOyBhcmc9YTsgfQogICAgdm9pZCBl eGVjKCBRVGV4dFN0cmVhbSAmcyApIHsgKHMuKm1mKShhcmcpOyB9CnByaXZhdGU6CiAgICBRVFNN RkkgbWY7CQkJCQkgCiAgICBpbnQJICAgYXJnOwkJCQkJIAp9OwoKICBpbmxpbmUgUVRleHRTdHJl YW0gJm9wZXJhdG9yPj4oIFFUZXh0U3RyZWFtICZzLCBRVFNGVU5DIGYgKQp7IHJldHVybiAoKmYp KCBzICk7IH0KCiAgaW5saW5lIFFUZXh0U3RyZWFtICZvcGVyYXRvcjw8KCBRVGV4dFN0cmVhbSAm cywgUVRTRlVOQyBmICkKeyByZXR1cm4gKCpmKSggcyApOyB9CgogIGlubGluZSBRVGV4dFN0cmVh bSAmb3BlcmF0b3I8PCggUVRleHRTdHJlYW0gJnMsIFFUU01hbmlwIG0gKQp7IG0uZXhlYyhzKTsg cmV0dXJuIHM7IH0KCiAgUVRleHRTdHJlYW0gJmJpbiggUVRleHRTdHJlYW0gJnMgKTsJIAogIFFU ZXh0U3RyZWFtICZvY3QoIFFUZXh0U3RyZWFtICZzICk7CSAKICBRVGV4dFN0cmVhbSAmZGVjKCBR VGV4dFN0cmVhbSAmcyApOwkgCiAgUVRleHRTdHJlYW0gJmhleCggUVRleHRTdHJlYW0gJnMgKTsJ IAogIFFUZXh0U3RyZWFtICZlbmRsKCBRVGV4dFN0cmVhbSAmcyApOwkgCiAgUVRleHRTdHJlYW0g JmZsdXNoKCBRVGV4dFN0cmVhbSAmcyApOwkgCiAgUVRleHRTdHJlYW0gJndzKCBRVGV4dFN0cmVh bSAmcyApOwkgCiAgUVRleHRTdHJlYW0gJnJlc2V0KCBRVGV4dFN0cmVhbSAmcyApOwkgCgogIGlu bGluZSBRVFNNYW5pcCBxU2V0VyggaW50IHcgKQp7CiAgICBRVFNNRkkgZnVuYyA9ICZRVGV4dFN0 cmVhbTo6d2lkdGg7CiAgICByZXR1cm4gUVRTTWFuaXAoZnVuYyx3KTsKfQoKICBpbmxpbmUgUVRT TWFuaXAgcVNldEZpbGwoIGludCBmICkKewogICAgUVRTTUZJIGZ1bmMgPSAmUVRleHRTdHJlYW06 OmZpbGw7CiAgICByZXR1cm4gUVRTTWFuaXAoZnVuYyxmKTsKfQoKICBpbmxpbmUgUVRTTWFuaXAg cVNldFByZWNpc2lvbiggaW50IHAgKQp7CiAgICBRVFNNRkkgZnVuYyA9ICZRVGV4dFN0cmVhbTo6 cHJlY2lzaW9uOwogICAgcmV0dXJuIFFUU01hbmlwKGZ1bmMscCk7Cn0KCgoKIyA0MyAiL3Vzci9s b2NhbC9xdC9pbmNsdWRlL3F0bC5oIiAyCgoKCgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIFFU ZXh0T1N0cmVhbUl0ZXJhdG9yCnsKcHJvdGVjdGVkOgogICAgUVRleHRPU3RyZWFtJiBzdHJlYW07 CiAgICBRU3RyaW5nIHNlcGFyYXRvcjsKCnB1YmxpYzoKICAgIFFUZXh0T1N0cmVhbUl0ZXJhdG9y KCBRVGV4dE9TdHJlYW0mIHMpIDogc3RyZWFtKCBzICkge30KICAgIFFUZXh0T1N0cmVhbUl0ZXJh dG9yKCBRVGV4dE9TdHJlYW0mIHMsIGNvbnN0IFFTdHJpbmcmIHNlcCApCgk6IHN0cmVhbSggcyAp LCBzZXBhcmF0b3IoIHNlcCApICB7fQogICAgUVRleHRPU3RyZWFtSXRlcmF0b3I8VD4mIG9wZXJh dG9yPSAoIGNvbnN0IFQmIHggKSB7CglzdHJlYW0gPDwgeDsKCWlmICggIXNlcGFyYXRvci5pc0Vt cHR5KCkgKQoJICAgIHN0cmVhbSA8PCBzZXBhcmF0b3I7CglyZXR1cm4gKnRoaXM7CiAgICB9CiAg ICBRVGV4dE9TdHJlYW1JdGVyYXRvcjxUPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRoaXM7IH0K ICAgIFFUZXh0T1N0cmVhbUl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7 IH0KICAgIFFUZXh0T1N0cmVhbUl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4g KnRoaXM7IH0KfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwgY2xhc3MgT3V0cHV0 SXRlcmF0b3I+CmlubGluZSBPdXRwdXRJdGVyYXRvciBxQ29weSggSW5wdXRJdGVyYXRvciBfYmVn aW4sIElucHV0SXRlcmF0b3IgX2VuZCwKCQkJICAgICBPdXRwdXRJdGVyYXRvciBfZGVzdCApCnsK ICAgIHdoaWxlKCBfYmVnaW4gIT0gX2VuZCApCgkqX2Rlc3QrKyA9ICpfYmVnaW4rKzsKICAgIHJl dHVybiBfZGVzdDsKfQoKdGVtcGxhdGUgPGNsYXNzIEJpSXRlcmF0b3IsIGNsYXNzIEJpT3V0cHV0 SXRlcmF0b3I+CmlubGluZSBCaU91dHB1dEl0ZXJhdG9yIHFDb3B5QmFja3dhcmQoIEJpSXRlcmF0 b3IgX2JlZ2luLCBCaUl0ZXJhdG9yIF9lbmQsCgkJCQkgICAgICAgQmlPdXRwdXRJdGVyYXRvciBf ZGVzdCApCnsKICAgIHdoaWxlICggX2JlZ2luICE9IF9lbmQgKQoJKi0tX2Rlc3QgPSAqLS1fZW5k OwogICAgcmV0dXJuIF9kZXN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcjEsIGNs YXNzIElucHV0SXRlcmF0b3IyPgppbmxpbmUgYm9vbCBxRXF1YWwoIElucHV0SXRlcmF0b3IxIGZp cnN0MSwgSW5wdXRJdGVyYXRvcjEgbGFzdDEsIElucHV0SXRlcmF0b3IyIGZpcnN0MiApCnsKICAg IGZvciAoIDsgZmlyc3QxICE9IGxhc3QxOyArK2ZpcnN0MSwgKytmaXJzdDIgKQoJaWYgKCAqZmly c3QxICE9ICpmaXJzdDIgKQoJICAgIHJldHVybiBGQUxTRTsKICAgIHJldHVybiBUUlVFOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBUPgppbmxpbmUgdm9pZCBxRmls bCggRm9yd2FyZEl0ZXJhdG9yIGZpcnN0LCBGb3J3YXJkSXRlcmF0b3IgbGFzdCwgY29uc3QgVCYg dmFsICkKewogICAgZm9yICggOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0ICkKCSpmaXJzdCA9IHZh bDsKfQoKIyAxMTcgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdGwuaCIKCgoKdGVtcGxhdGUgPGNs YXNzIElucHV0SXRlcmF0b3IsIGNsYXNzIFQ+CmlubGluZSBJbnB1dEl0ZXJhdG9yIHFGaW5kKCBJ bnB1dEl0ZXJhdG9yIGZpcnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsCgkJCSAgICBjb25zdCBUJiB2 YWwgKQp7CiAgICB3aGlsZSAoIGZpcnN0ICE9IGxhc3QgJiYgKmZpcnN0ICE9IHZhbCApCgkrK2Zp cnN0OwogICAgcmV0dXJuIGZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvciwg Y2xhc3MgVCwgY2xhc3MgU2l6ZT4KaW5saW5lIHZvaWQgcUNvdW50KCBJbnB1dEl0ZXJhdG9yIGZp cnN0LCBJbnB1dEl0ZXJhdG9yIGxhc3QsIGNvbnN0IFQmIHZhbHVlLAoJCSAgICBTaXplJiBuICkK ewogICAgZm9yICggOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0ICkKCWlmICggKmZpcnN0ID09IHZh bHVlICkKCSAgICArK247Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxpbmUgdm9pZCBxU3dhcCgg VCYgX3ZhbHVlMSwgVCYgX3ZhbHVlMiApCnsKICAgIFQgdG1wID0gX3ZhbHVlMTsKICAgIF92YWx1 ZTEgPSBfdmFsdWUyOwogICAgX3ZhbHVlMiA9IHRtcDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBJbnB1 dEl0ZXJhdG9yPgogIHZvaWQgcUJ1YmJsZVNvcnQoIElucHV0SXRlcmF0b3IgYiwgSW5wdXRJdGVy YXRvciBlICkKewogICAgIAogICAgSW5wdXRJdGVyYXRvciBsYXN0ID0gZTsKICAgIC0tbGFzdDsK ICAgICAKICAgIGlmICggbGFzdCA9PSBiICkKCXJldHVybjsKCiAgICAgCiAgICB3aGlsZSggYiAh PSBsYXN0ICkgewoJYm9vbCBzd2FwcGVkID0gRkFMU0U7CglJbnB1dEl0ZXJhdG9yIHN3YXBfcG9z ID0gYjsKCUlucHV0SXRlcmF0b3IgeCA9IGU7CglJbnB1dEl0ZXJhdG9yIHkgPSB4OwoJeS0tOwoJ ZG8gewoJICAgIC0teDsKCSAgICAtLXk7CgkgICAgaWYgKCAqeCA8ICp5ICkgewoJCXN3YXBwZWQg PSBUUlVFOwoJCXFTd2FwKCAqeCwgKnkgKTsKCQlzd2FwX3BvcyA9IHk7CgkgICAgfQoJfSB3aGls ZSggeSAhPSBiICk7CglpZiAoICFzd2FwcGVkICkKCSAgICByZXR1cm47CgliID0gc3dhcF9wb3M7 CgliKys7CiAgICB9Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgppbmxpbmUgdm9pZCBx QnViYmxlU29ydCggQ29udGFpbmVyICZjICkKewogIHFCdWJibGVTb3J0KCBjLmJlZ2luKCksIGMu ZW5kKCkgKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBWYWx1ZT4KICB2b2lkIHFIZWFwU29ydFB1c2hE b3duKCBWYWx1ZSogaGVhcCwgaW50IGZpcnN0LCBpbnQgbGFzdCApCnsKICAgIGludCByID0gZmly c3Q7CiAgICB3aGlsZSggciA8PSBsYXN0LzIgKSB7CgkgCglpZiAoIGxhc3QgPT0gMipyICkgewoJ ICAgICAKCSAgICBpZiAoIGhlYXBbcl0gPiBoZWFwWyAyKnIgXSApCgkJcVN3YXAoIGhlYXBbcl0s IGhlYXBbIDIqciBdICk7CgkgICAgIAoJICAgIHIgPSBsYXN0OwoJfSBlbHNlIHsgIAoJICAgIGlm ICggaGVhcFtyXSA+IGhlYXBbIDIqciBdICYmIGhlYXBbIDIqciBdIDw9IGhlYXBbIDIqcisxIF0g KSB7CgkJIAoJCXFTd2FwKCBoZWFwW3JdLCBoZWFwWyAyKnIgXSApOwoJCXIgKj0gMjsKCSAgICB9 IGVsc2UgaWYgKCBoZWFwW3JdID4gaGVhcFsgMipyKzEgXSAmJgoJCQloZWFwWyAyKnIrMSBdIDwg aGVhcFsgMipyIF0gKSB7CgkJIAoJCXFTd2FwKCBoZWFwW3JdLCBoZWFwWyAyKnIrMSBdICk7CgkJ ciA9IDIqcisxOwoJICAgIH0gZWxzZSB7CgkJIAoJCXIgPSBsYXN0OwoJICAgIH0KCX0KICAgIH0K fQoKCnRlbXBsYXRlIDxjbGFzcyBJbnB1dEl0ZXJhdG9yLCBjbGFzcyBWYWx1ZT4KICB2b2lkIHFI ZWFwU29ydEhlbHBlciggSW5wdXRJdGVyYXRvciBiLCBJbnB1dEl0ZXJhdG9yIGUsIFZhbHVlLCB1 aW50IG4gKQp7CiAgICAgCiAgICBJbnB1dEl0ZXJhdG9yIGluc2VydCA9IGI7CiAgICBWYWx1ZSog cmVhbGhlYXAgPSBuZXcgVmFsdWVbIG4gXTsKICAgICAKICAgIFZhbHVlKiBoZWFwID0gcmVhbGhl YXAgLSAxOwogICAgaW50IHNpemUgPSAwOwogICAgZm9yKCA7IGluc2VydCAhPSBlOyArK2luc2Vy dCApIHsKCWhlYXBbKytzaXplXSA9ICppbnNlcnQ7CglpbnQgaSA9IHNpemU7Cgl3aGlsZSggaSA+ IDEgJiYgaGVhcFtpXSA8IGhlYXBbIGkgLyAyIF0gKSB7CgkgICAgcVN3YXAoIGhlYXBbaV0sIGhl YXBbIGkgLyAyIF0gKTsKCSAgICBpIC89IDI7Cgl9CiAgICB9CgogICAgIAogICAgZm9yKCB1aW50 IGkgPSBuOyBpID4gMDsgaS0tICkgewoJKmIrKyA9IGhlYXBbMV07CglpZiAoIGkgPiAxICkgewoJ ICAgIGhlYXBbMV0gPSBoZWFwW2ldOwoJICAgIHFIZWFwU29ydFB1c2hEb3duKCBoZWFwLCAxLCAo aW50KWkgLSAxICk7Cgl9CiAgICB9CgogICAgZGVsZXRlW10gcmVhbGhlYXA7Cn0KCgp0ZW1wbGF0 ZSA8Y2xhc3MgSW5wdXRJdGVyYXRvcj4KICB2b2lkIHFIZWFwU29ydCggSW5wdXRJdGVyYXRvciBi LCBJbnB1dEl0ZXJhdG9yIGUgKQp7CiAgICAgCiAgICBpZiAoIGIgPT0gZSApCglyZXR1cm47Cgog ICAgIAogICAgSW5wdXRJdGVyYXRvciBpdCA9IGI7CiAgICB1aW50IG4gPSAwOwogICAgd2hpbGUg KCBpdCAhPSBlICkgewoJKytuOwoJKytpdDsKICAgIH0KCiAgICAgCiAgICAgCiAgICBxSGVhcFNv cnRIZWxwZXIoIGIsIGUsICpiLCBuICk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgQ29udGFpbmVyPgog IHZvaWQgcUhlYXBTb3J0KCBDb250YWluZXIgJmMgKQp7CiAgICBpZiAoIGMuYmVnaW4oKSA9PSBj LmVuZCgpICkKCXJldHVybjsKCiAgICAgCiAgICAgCiAgICBxSGVhcFNvcnRIZWxwZXIoIGMuYmVn aW4oKSwgYy5lbmQoKSwgKihjLmJlZ2luKCkpLCAodWludCljLmNvdW50KCkgKTsKfQoKCiMgNDAg Ii91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWV2ZWN0b3IuaCIgMgoKCiMgMSAiL3Vzci9sb2Nh bC9xdC9pbmNsdWRlL3FkYXRhc3RyZWFtLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyAgIFFEYXRhU3RyZWFtCQkJCSAKewpwdWJsaWM6CiAg ICBRRGF0YVN0cmVhbSgpOwogICAgUURhdGFTdHJlYW0oIFFJT0RldmljZSAqICk7CiAgICBRRGF0 YVN0cmVhbSggUUJ5dGVBcnJheSwgaW50IG1vZGUgKTsKICAgIHZpcnR1YWwgflFEYXRhU3RyZWFt KCk7CgogICAgUUlPRGV2aWNlCSpkZXZpY2UoKSBjb25zdDsKICAgIHZvaWQJIHNldERldmljZSgg UUlPRGV2aWNlICogKTsKICAgIHZvaWQJIHVuc2V0RGV2aWNlKCk7CgogICAgYm9vbAkgYXRFbmQo KSBjb25zdDsKICAgIGJvb2wJIGVvZigpIGNvbnN0OwoKICAgIGVudW0gQnl0ZU9yZGVyIHsgQmln RW5kaWFuLCBMaXR0bGVFbmRpYW4gfTsKICAgIGludAkJIGJ5dGVPcmRlcigpCWNvbnN0OwogICAg dm9pZAkgc2V0Qnl0ZU9yZGVyKCBpbnQgKTsKCiAgICBib29sCSBpc1ByaW50YWJsZURhdGEoKSBj b25zdDsKICAgIHZvaWQJIHNldFByaW50YWJsZURhdGEoIGJvb2wgKTsKCiAgICBpbnQJCSB2ZXJz aW9uKCkgY29uc3Q7CiAgICB2b2lkCSBzZXRWZXJzaW9uKCBpbnQgKTsKCiAgICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I+PiggUV9JTlQ4ICZpICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+Pigg UV9VSU5UOCAmaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFfSU5UMTYgJmkgKTsK ICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRX1VJTlQxNiAmaSApOwogICAgUURhdGFTdHJl YW0gJm9wZXJhdG9yPj4oIFFfSU5UMzIgJmkgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBRX1VJTlQzMiAmaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFfTE9ORyAmaSAp OwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFfVUxPTkcgJmkgKTsKCiAgICBRRGF0YVN0 cmVhbSAmb3BlcmF0b3I+PiggZmxvYXQgJmYgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBkb3VibGUgJmYgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBjaGFyIComc3RyICk7 CgogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFfSU5UOCBpICk7CiAgICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I8PCggUV9VSU5UOCBpICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCgg UV9JTlQxNiBpICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUV9VSU5UMTYgaSApOwog ICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFfSU5UMzIgaSApOwogICAgUURhdGFTdHJlYW0g Jm9wZXJhdG9yPDwoIFFfVUlOVDMyIGkgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBR X0xPTkcgaSApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFfVUxPTkcgaSApOwogICAg UURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIGZsb2F0IGYgKTsKICAgIFFEYXRhU3RyZWFtICZvcGVy YXRvcjw8KCBkb3VibGUgZiApOwogICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIGNvbnN0IGNo YXIgKnN0ciApOwoKICAgIFFEYXRhU3RyZWFtICZyZWFkQnl0ZXMoIGNoYXIgKiYsIHVpbnQgJmxl biApOwogICAgUURhdGFTdHJlYW0gJnJlYWRSYXdCeXRlcyggY2hhciAqLCB1aW50IGxlbiApOwoK ICAgIFFEYXRhU3RyZWFtICZ3cml0ZUJ5dGVzKCBjb25zdCBjaGFyICosIHVpbnQgbGVuICk7CiAg ICBRRGF0YVN0cmVhbSAmd3JpdGVSYXdCeXRlcyggY29uc3QgY2hhciAqLCB1aW50IGxlbiApOwoK cHJpdmF0ZToKICAgIFFJT0RldmljZQkqZGV2OwogICAgYm9vbAkgb3duZGV2OwogICAgaW50CQkg Ynl0ZW9yZGVyOwogICAgYm9vbAkgcHJpbnRhYmxlOwogICAgYm9vbAkgbm9zd2FwOwogICAgaW50 CQkgdmVyOwoKcHJpdmF0ZToJIAoKICAgIFFEYXRhU3RyZWFtKCBjb25zdCBRRGF0YVN0cmVhbSAm ICk7CiAgICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I9KCBjb25zdCBRRGF0YVN0cmVhbSAmICk7Cgp9 OwoKCiAKCgoKaW5saW5lIFFJT0RldmljZSAqUURhdGFTdHJlYW06OmRldmljZSgpIGNvbnN0Cnsg cmV0dXJuIGRldjsgfQoKaW5saW5lIGJvb2wgUURhdGFTdHJlYW06OmF0RW5kKCkgY29uc3QKeyBy ZXR1cm4gZGV2ID8gZGV2LT5hdEVuZCgpIDogVFJVRTsgfQoKaW5saW5lIGJvb2wgUURhdGFTdHJl YW06OmVvZigpIGNvbnN0CnsgcmV0dXJuIGF0RW5kKCk7IH0KCmlubGluZSBpbnQgUURhdGFTdHJl YW06OmJ5dGVPcmRlcigpIGNvbnN0CnsgcmV0dXJuIGJ5dGVvcmRlcjsgfQoKaW5saW5lIGJvb2wg UURhdGFTdHJlYW06OmlzUHJpbnRhYmxlRGF0YSgpIGNvbnN0CnsgcmV0dXJuIHByaW50YWJsZTsg fQoKaW5saW5lIHZvaWQgUURhdGFTdHJlYW06OnNldFByaW50YWJsZURhdGEoIGJvb2wgcCApCnsg cHJpbnRhYmxlID0gcDsgfQoKaW5saW5lIGludCBRRGF0YVN0cmVhbTo6dmVyc2lvbigpIGNvbnN0 CnsgcmV0dXJuIHZlcjsgfQoKaW5saW5lIHZvaWQgUURhdGFTdHJlYW06OnNldFZlcnNpb24oIGlu dCB2ICkKeyB2ZXIgPSB2OyB9CgppbmxpbmUgUURhdGFTdHJlYW0gJlFEYXRhU3RyZWFtOjpvcGVy YXRvcj4+KCBRX1VJTlQ4ICZpICkKeyByZXR1cm4gKnRoaXMgPj4gKFFfSU5UOCYpaTsgfQoKaW5s aW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3BlcmF0b3I+PiggUV9VSU5UMTYgJmkgKQp7 IHJldHVybiAqdGhpcyA+PiAoUV9JTlQxNiYpaTsgfQoKaW5saW5lIFFEYXRhU3RyZWFtICZRRGF0 YVN0cmVhbTo6b3BlcmF0b3I+PiggUV9VSU5UMzIgJmkgKQp7IHJldHVybiAqdGhpcyA+PiAoUV9J TlQzMiYpaTsgfQoKaW5saW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3BlcmF0b3I+Pigg UV9VTE9ORyAmaSApCnsgcmV0dXJuICp0aGlzID4+IChRX0xPTkcmKWk7IH0KCmlubGluZSBRRGF0 YVN0cmVhbSAmUURhdGFTdHJlYW06Om9wZXJhdG9yPDwoIFFfVUlOVDggaSApCnsgcmV0dXJuICp0 aGlzIDw8IChRX0lOVDgpaTsgfQoKaW5saW5lIFFEYXRhU3RyZWFtICZRRGF0YVN0cmVhbTo6b3Bl cmF0b3I8PCggUV9VSU5UMTYgaSApCnsgcmV0dXJuICp0aGlzIDw8IChRX0lOVDE2KWk7IH0KCmlu bGluZSBRRGF0YVN0cmVhbSAmUURhdGFTdHJlYW06Om9wZXJhdG9yPDwoIFFfVUlOVDMyIGkgKQp7 IHJldHVybiAqdGhpcyA8PCAoUV9JTlQzMilpOyB9CgppbmxpbmUgUURhdGFTdHJlYW0gJlFEYXRh U3RyZWFtOjpvcGVyYXRvcjw8KCBRX1VMT05HIGkgKQp7IHJldHVybiAqdGhpcyA8PCAoUV9MT05H KWk7IH0KCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWV2ZWN0b3IuaCIgMgoK CgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4u Ly4uLy4uL2luY2x1ZGUvZysrLTMvdmVjdG9yIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDEgMwogCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJh a2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2NvbmZpZy5oIiAx IDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAogCiAKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKCgogCiAKIAogCiAKIAogCiAKIAogCiAKCgogCgogCiAKIAogCiAKIAogCgoKCgoK CgoKIyAxNDggIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfY29uZmlnLmgiIDMKCgoKCgoKCgoKCgoKCgoKCgoK CgoKICAgICAgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDIzNCAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0bF9jb25maWcuaCIgMwoKCiMgMjQ4ICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2Nv bmZpZy5oIiAzCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAogCiAKIAoKCgoK CgoKCgoKCgoKCgoKCgogCiAKIyAzMTYgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfY29uZmlnLmgiIDMKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCiAKIAojIDM2ICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5k cmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfcmVsb3BzLmgi IDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCnRlbXBsYXRlIDxjbGFz cyBfVHA+CmlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYg X195KSB7CiAgcmV0dXJuICEoX194ID09IF9feSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+Cmlu bGluZSBib29sIG9wZXJhdG9yPihjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIHsKICBy ZXR1cm4gX195IDwgX194Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgYm9vbCBvcGVy YXRvcjw9KGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgewogIHJldHVybiAhKF9feSA8 IF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSBib29sIG9wZXJhdG9yPj0oY29u c3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSB7CiAgcmV0dXJuICEoX194IDwgX195KTsKfQoK IAoKCgogCiAKIAojIDM5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45 NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKCgojIDEg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4v aW5jbHVkZS9nKystMy9zdGxfcGFpci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IAoKCgoKCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+CnN0cnVjdCBwYWlyIHsK ICB0eXBlZGVmIF9UMSBmaXJzdF90eXBlOwogIHR5cGVkZWYgX1QyIHNlY29uZF90eXBlOwoKICBf VDEgZmlyc3Q7CiAgX1QyIHNlY29uZDsKICBwYWlyKCkgOiBmaXJzdChfVDEoKSksIHNlY29uZChf VDIoKSkge30KICBwYWlyKGNvbnN0IF9UMSYgX19hLCBjb25zdCBfVDImIF9fYikgOiBmaXJzdChf X2EpLCBzZWNvbmQoX19iKSB7fQoKCiAgdGVtcGxhdGUgPGNsYXNzIF9VMSwgY2xhc3MgX1UyPgog IHBhaXIoY29uc3QgcGFpcjxfVTEsIF9VMj4mIF9fcCkgOiBmaXJzdChfX3AuZmlyc3QpLCBzZWNv bmQoX19wLnNlY29uZCkge30KCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBfVDI+Cmlu bGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgcGFpcjxfVDEsIF9UMj4mIF9feCwgY29uc3QgcGFp cjxfVDEsIF9UMj4mIF9feSkKeyAKICByZXR1cm4gX194LmZpcnN0ID09IF9feS5maXJzdCAmJiBf X3guc2Vjb25kID09IF9feS5zZWNvbmQ7IAp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1QxLCBjbGFzcyBf VDI+CmlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBwYWlyPF9UMSwgX1QyPiYgX194LCBjb25z dCBwYWlyPF9UMSwgX1QyPiYgX195KQp7IAogIHJldHVybiBfX3guZmlyc3QgPCBfX3kuZmlyc3Qg fHwgCiAgICAgICAgICghKF9feS5maXJzdCA8IF9feC5maXJzdCkgJiYgX194LnNlY29uZCA8IF9f eS5zZWNvbmQpOyAKfQoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgcGFp cjxfVDEsIF9UMj4gbWFrZV9wYWlyKGNvbnN0IF9UMSYgX194LCBjb25zdCBfVDImIF9feSkKewog IHJldHVybiBwYWlyPF9UMSwgX1QyPihfX3gsIF9feSk7Cn0KCiAKCgoKIAogCiAKIyA0MiAiL3Vz ci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNs dWRlL2crKy0zL3N0bF9hbGdvYmFzZS5oIiAyIDMKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvdHlwZV90 cmFpdHMuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKc3RydWN0IF9fdHJ1ZV90eXBlIHsKfTsKCnN0cnVjdCBfX2ZhbHNlX3R5cGUg ewp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9fdHlwZV90cmFpdHMgeyAKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICAgdGhpc19kdW1teV9tZW1iZXJfbXVzdF9iZV9maXJzdDsKICAg ICAgICAgICAgICAgICAgICAKCgoKCgogICAgCgoKCgoKCgoKIAoKICAgdHlwZWRlZiBfX2ZhbHNl X3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX2Zh bHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX2Zh bHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBf X2ZhbHNlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX2ZhbHNl X3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07CgoKCiAKIAogCgoKCnRlbXBsYXRlPD4gIHN0cnVjdCBf X3R5cGVfdHJhaXRzPGJvb2w+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9 OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxjaGFyPiB7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJh aXRzPHNpZ25lZCBjaGFyPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxf ZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsK CnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRzPHVuc2lnbmVkIGNoYXI+IHsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0 eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5 cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKCgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190 eXBlX3RyYWl0czx3Y2hhcl90PiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3Ry aXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsK fTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8c2hvcnQ+IHsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90 cmFpdHM8dW5zaWduZWQgc2hvcnQ+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190 cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3Ry aXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNf dHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBl Owp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8aW50PiB7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVm IF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3Ry dWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJh aXRzPHVuc2lnbmVkIGludD4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9EX3R5cGU7Cn07 Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxsb25nPiB7CiAgIHR5cGVkZWYgX190 cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBf X3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYg X190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVf dHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRz PHVuc2lnbmVkIGxvbmc+IHsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9k ZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFs X2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxf YXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlh bF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoK Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX190eXBlX3RyYWl0czxsb25nIGxvbmc+IHsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAgIHR5cGVk ZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsKICAgdHlw ZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBlZGVmIF9f dHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90 cmFpdHM8dW5zaWduZWQgbG9uZyBsb25nPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFz X3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBo YXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhh c190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAg aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0Rf dHlwZTsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9fdHlwZV90cmFpdHM8ZmxvYXQ+IHsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZWZhdWx0X2NvbnN0cnVjdG9yOwog ICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2NvcHlfY29uc3RydWN0b3I7CiAg IHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcjsK ICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9kZXN0cnVjdG9yOwogICB0eXBl ZGVmIF9fdHJ1ZV90eXBlICAgIGlzX1BPRF90eXBlOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9f dHlwZV90cmFpdHM8ZG91YmxlPiB7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZp YWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJp dmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2 aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3Ry aXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsK fTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfX3R5cGVfdHJhaXRzPGxvbmcgZG91YmxlPiB7CiAgIHR5 cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVmYXVsdF9jb25zdHJ1Y3RvcjsKICAg dHlwZWRlZiBfX3RydWVfdHlwZSAgICBoYXNfdHJpdmlhbF9jb3B5X2NvbnN0cnVjdG9yOwogICB0 eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhhc190cml2aWFsX2Fzc2lnbm1lbnRfb3BlcmF0b3I7CiAg IHR5cGVkZWYgX190cnVlX3R5cGUgICAgaGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjsKICAgdHlwZWRl ZiBfX3RydWVfdHlwZSAgICBpc19QT0RfdHlwZTsKfTsKCgoKdGVtcGxhdGUgPGNsYXNzIF9UcD4K c3RydWN0IF9fdHlwZV90cmFpdHM8X1RwKj4gewogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAgIGhh c190cml2aWFsX2RlZmF1bHRfY29uc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAg aGFzX3RyaXZpYWxfY29weV9jb25zdHJ1Y3RvcjsKICAgdHlwZWRlZiBfX3RydWVfdHlwZSAgICBo YXNfdHJpdmlhbF9hc3NpZ25tZW50X29wZXJhdG9yOwogICB0eXBlZGVmIF9fdHJ1ZV90eXBlICAg IGhhc190cml2aWFsX2Rlc3RydWN0b3I7CiAgIHR5cGVkZWYgX190cnVlX3R5cGUgICAgaXNfUE9E X3R5cGU7Cn07CgojIDI5NSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3R5cGVfdHJhaXRzLmgiIDMKCgoKIAogCgp0 ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgX0lzX2ludGVnZXIgewogIHR5cGVkZWYgX19mYWxz ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2VyPGJv b2w+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAg c3RydWN0IF9Jc19pbnRlZ2VyPGNoYXI+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3Jh bDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxzaWduZWQgY2hhcj4gewogIHR5 cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19p bnRlZ2VyPHVuc2lnbmVkIGNoYXI+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsK fTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRlZ2VyPHdjaGFyX3Q+IHsKICB0eXBlZGVm IF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCgoKdGVtcGxhdGU8PiAgc3RydWN0IF9Jc19pbnRl Z2VyPHNob3J0PiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0 ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8dW5zaWduZWQgc2hvcnQ+IHsKICB0eXBlZGVmIF9fdHJ1 ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxpbnQ+ IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRlZ3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVj dCBfSXNfaW50ZWdlcjx1bnNpZ25lZCBpbnQ+IHsKICB0eXBlZGVmIF9fdHJ1ZV90eXBlIF9JbnRl Z3JhbDsKfTsKCnRlbXBsYXRlPD4gIHN0cnVjdCBfSXNfaW50ZWdlcjxsb25nPiB7CiAgdHlwZWRl ZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVn ZXI8dW5zaWduZWQgbG9uZz4gewogIHR5cGVkZWYgX190cnVlX3R5cGUgX0ludGVncmFsOwp9OwoK Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8bG9uZyBsb25nPiB7CiAgdHlwZWRlZiBf X3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07Cgp0ZW1wbGF0ZTw+ICBzdHJ1Y3QgX0lzX2ludGVnZXI8 dW5zaWduZWQgbG9uZyBsb25nPiB7CiAgdHlwZWRlZiBfX3RydWVfdHlwZSBfSW50ZWdyYWw7Cn07 CgoKCgoKIAogCiAKIyA0NSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGdvYmFzZS5oIiAyIDMKCgoKCiMg MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL2xp bWl0cy5oIiAxIDMKIAoKCiAKCiMgMTE0ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2Ut bGludXgvMi45NS4zL2luY2x1ZGUvbGltaXRzLmgiIDMKCgoKCgoKCiMgNDkgIi91c3IvbGliL2dj Yy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKyst My9zdGxfYWxnb2Jhc2UuaCIgMiAzCgojIDEgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMSAzCiAK CgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgogCgoKCgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoK IyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGliL2djYy1saWIvaTU4 Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2 LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4 ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3Rk ZGVmLmgiIDMKCgoKCgogCgoKCgogCgoKIyAyNjkgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5k cmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKIyAyODMgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4z L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzMyAiL3Vz ci9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMKCgpleHRlcm4gIkMiIHsgCgoKCgogCnR5cGVkZWYgc3Ry dWN0CiAgewogICAgaW50IHF1b3Q7CQkJIAogICAgaW50IHJlbTsJCQkgCiAgfSBkaXZfdDsKCiAK CnR5cGVkZWYgc3RydWN0CiAgewogICAgbG9uZyBpbnQgcXVvdDsJCSAKICAgIGxvbmcgaW50IHJl bTsJCSAKICB9IGxkaXZfdDsKCgoKIyA2NSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoKCiAK CgoKIAoKCgoKCiAKCmV4dGVybiBzaXplX3QgX19jdHlwZV9nZXRfbWJfY3VyX21heCAgKHZvaWQp ICB0aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIGRvdWJsZSBhdG9mICAoX19jb25zdCBjaGFyICpfX25w dHIpICB0aHJvdyAoKSAgOwogCmV4dGVybiBpbnQgYXRvaSAgKF9fY29uc3QgY2hhciAqX19ucHRy KSAgdGhyb3cgKCkgIDsKIApleHRlcm4gbG9uZyBpbnQgYXRvbCAgKF9fY29uc3QgY2hhciAqX19u cHRyKSAgdGhyb3cgKCkgIDsKCgogCl9fZXh0ZW5zaW9uX18gZXh0ZXJuIGxvbmcgbG9uZyBpbnQg YXRvbGwgIChfX2NvbnN0IGNoYXIgKl9fbnB0cikgIHRocm93ICgpICA7CgoKIApleHRlcm4gZG91 YmxlIHN0cnRvZCAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCSAgIGNoYXIg KipfX3Jlc3RyaWN0IF9fZW5kcHRyKSAgdGhyb3cgKCkgIDsKCgoKCgoKCgoKCiAKZXh0ZXJuIGxv bmcgaW50IHN0cnRvbCAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCSAgICAg Y2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpICB0aHJvdyAoKSAgOwogCmV4 dGVybiB1bnNpZ25lZCBsb25nIGludCBzdHJ0b3VsICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0 IF9fbnB0ciwKCQkJCSAgICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCQkJCSAgICAg ICBpbnQgX19iYXNlKSAgdGhyb3cgKCkgIDsKCgogCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIGxvbmcg bG9uZyBpbnQgc3RydG9xICAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCSAg Y2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jhc2UpICB0aHJvdyAoKSAgOwogCl9f ZXh0ZW5zaW9uX18KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgc3RydG91cSAgKF9fY29u c3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkJICAgIGNoYXIgKipfX3Jlc3RyaWN0IF9f ZW5kcHRyLAoJCQkJCSAgICBpbnQgX19iYXNlKSAgdGhyb3cgKCkgIDsKCgoKIAoKIApfX2V4dGVu c2lvbl9fCmV4dGVybiBsb25nIGxvbmcgaW50IHN0cnRvbGwgIChfX2NvbnN0IGNoYXIgKl9fcmVz dHJpY3QgX19ucHRyLAoJCQkJICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsIGludCBfX2Jh c2UpICB0aHJvdyAoKSAgOwogCl9fZXh0ZW5zaW9uX18KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9u ZyBpbnQgc3RydG91bGwgIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19ucHRyLAoJCQkJCSAg ICAgY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkJICAgICBpbnQgX19iYXNlKSAgdGhy b3cgKCkgIDsKCgoKIyAxOTAgIi91c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwoKCgogCgoKZXh0ZXJu IGRvdWJsZSBfX3N0cnRvZF9pbnRlcm5hbCAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25w dHIsCgkJCQkgICAgICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCQkJCSAgICAgIGludCBf X2dyb3VwKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGZsb2F0IF9fc3RydG9mX2ludGVybmFsICAoX19j b25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCSAgICAgY2hhciAqKl9fcmVzdHJpY3Qg X19lbmRwdHIsIGludCBfX2dyb3VwKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGxvbmcgZG91YmxlICBf X3N0cnRvbGRfaW50ZXJuYWwgIChfX2NvbnN0IGNoYXIgKgoJCQkJCQlfX3Jlc3RyaWN0IF9fbnB0 ciwKCQkJCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkJCQkJCWludCBfX2dyb3VwKSAg dGhyb3cgKCkgIDsKCmV4dGVybiBsb25nIGludCBfX3N0cnRvbF9pbnRlcm5hbCAgKF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkJY2hhciAqKl9fcmVzdHJpY3QgX19lbmRwdHIs CgkJCQkJaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApICB0aHJvdyAoKSAgOwoKCgpleHRlcm4gdW5z aWduZWQgbG9uZyBpbnQgX19zdHJ0b3VsX2ludGVybmFsICAoX19jb25zdCBjaGFyICoKCQkJCQkJ ICBfX3Jlc3RyaWN0IF9fbnB0ciwKCQkJCQkJICBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwK CQkJCQkJICBpbnQgX19iYXNlLCBpbnQgX19ncm91cCkgIHRocm93ICgpICA7CgoKCgpfX2V4dGVu c2lvbl9fCmV4dGVybiBsb25nIGxvbmcgaW50IF9fc3RydG9sbF9pbnRlcm5hbCAgKF9fY29uc3Qg Y2hhciAqX19yZXN0cmljdCBfX25wdHIsCgkJCQkJICAgICAgY2hhciAqKl9fcmVzdHJpY3QgX19l bmRwdHIsCgkJCQkJICAgICAgaW50IF9fYmFzZSwgaW50IF9fZ3JvdXApICB0aHJvdyAoKSAgOwoK CgpfX2V4dGVuc2lvbl9fCmV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgaW50IF9fc3RydG91bGxf aW50ZXJuYWwgIChfX2NvbnN0IGNoYXIgKgoJCQkJCQkJX19yZXN0cmljdCBfX25wdHIsCgkJCQkJ CQljaGFyICoqCgkJCQkJCQlfX3Jlc3RyaWN0IF9fZW5kcHRyLAoJCQkJCQkJaW50IF9fYmFzZSwK CQkJCQkJCWludCBfX2dyb3VwKSAgdGhyb3cgKCkgIDsKCgoKCgoKIAoKZXh0ZXJuIF9faW5saW5l IGRvdWJsZQpzdHJ0b2QgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsIGNoYXIgKipf X3Jlc3RyaWN0IF9fZW5kcHRyKSB0aHJvdyAoKSAKewogIHJldHVybiBfX3N0cnRvZF9pbnRlcm5h bCAoX19ucHRyLCBfX2VuZHB0ciwgMCk7Cn0KZXh0ZXJuIF9faW5saW5lIGxvbmcgaW50CnN0cnRv bCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hhciAqKl9fcmVzdHJpY3QgX19l bmRwdHIsCglpbnQgX19iYXNlKSB0aHJvdyAoKSAKewogIHJldHVybiBfX3N0cnRvbF9pbnRlcm5h bCAoX19ucHRyLCBfX2VuZHB0ciwgX19iYXNlLCAwKTsKfQpleHRlcm4gX19pbmxpbmUgdW5zaWdu ZWQgbG9uZyBpbnQKc3RydG91bCAoX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fbnB0ciwgY2hh ciAqKl9fcmVzdHJpY3QgX19lbmRwdHIsCgkgaW50IF9fYmFzZSkgdGhyb3cgKCkgCnsKICByZXR1 cm4gX19zdHJ0b3VsX2ludGVybmFsIChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2UsIDApOwp9Cgoj IDI3MSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoKCl9fZXh0ZW5zaW9uX18gZXh0ZXJuIF9f aW5saW5lIGxvbmcgbG9uZyBpbnQKc3RydG9xIChfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19u cHRyLCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCWludCBfX2Jhc2UpIHRocm93ICgpIAp7 CiAgcmV0dXJuIF9fc3RydG9sbF9pbnRlcm5hbCAoX19ucHRyLCBfX2VuZHB0ciwgX19iYXNlLCAw KTsKfQpfX2V4dGVuc2lvbl9fIGV4dGVybiBfX2lubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgaW50 CnN0cnRvdXEgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25wdHIsIGNoYXIgKipfX3Jlc3Ry aWN0IF9fZW5kcHRyLAoJIGludCBfX2Jhc2UpIHRocm93ICgpIAp7CiAgcmV0dXJuIF9fc3RydG91 bGxfaW50ZXJuYWwgKF9fbnB0ciwgX19lbmRwdHIsIF9fYmFzZSwgMCk7Cn0KCgoKX19leHRlbnNp b25fXyBleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIGludApzdHJ0b2xsIChfX2NvbnN0IGNoYXIg Kl9fcmVzdHJpY3QgX19ucHRyLCBjaGFyICoqX19yZXN0cmljdCBfX2VuZHB0ciwKCSBpbnQgX19i YXNlKSB0aHJvdyAoKSAKewogIHJldHVybiBfX3N0cnRvbGxfaW50ZXJuYWwgKF9fbnB0ciwgX19l bmRwdHIsIF9fYmFzZSwgMCk7Cn0KX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgdW5zaWdu ZWQgbG9uZyBsb25nIGludApzdHJ0b3VsbCAoX19jb25zdCBjaGFyICogX19yZXN0cmljdCBfX25w dHIsIGNoYXIgKipfX3Jlc3RyaWN0IF9fZW5kcHRyLAoJICBpbnQgX19iYXNlKSB0aHJvdyAoKSAK ewogIHJldHVybiBfX3N0cnRvdWxsX2ludGVybmFsIChfX25wdHIsIF9fZW5kcHRyLCBfX2Jhc2Us IDApOwp9CgoKZXh0ZXJuIF9faW5saW5lIGRvdWJsZQphdG9mIChfX2NvbnN0IGNoYXIgKl9fbnB0 cikgdGhyb3cgKCkgCnsKICByZXR1cm4gc3RydG9kIChfX25wdHIsIChjaGFyICoqKSBfX251bGwg KTsKfQpleHRlcm4gX19pbmxpbmUgaW50CmF0b2kgKF9fY29uc3QgY2hhciAqX19ucHRyKSB0aHJv dyAoKSAKewogIHJldHVybiAoaW50KSBzdHJ0b2wgKF9fbnB0ciwgKGNoYXIgKiopIF9fbnVsbCAs IDEwKTsKfQpleHRlcm4gX19pbmxpbmUgbG9uZyBpbnQKYXRvbCAoX19jb25zdCBjaGFyICpfX25w dHIpIHRocm93ICgpIAp7CiAgcmV0dXJuIHN0cnRvbCAoX19ucHRyLCAoY2hhciAqKikgX19udWxs ICwgMTApOwp9CgoKX19leHRlbnNpb25fXyBleHRlcm4gX19pbmxpbmUgbG9uZyBsb25nIGludAph dG9sbCAoX19jb25zdCBjaGFyICpfX25wdHIpIHRocm93ICgpIAp7CiAgcmV0dXJuIHN0cnRvbGwg KF9fbnB0ciwgKGNoYXIgKiopIF9fbnVsbCAsIDEwKTsKfQoKCgoKCiAKCgpleHRlcm4gY2hhciAq bDY0YSAgKGxvbmcgaW50IF9fbikgIHRocm93ICgpICA7CgogCmV4dGVybiBsb25nIGludCBhNjRs ICAoX19jb25zdCBjaGFyICpfX3MpICB0aHJvdyAoKSAgOwoKCiMgMSAiL3Vzci9pbmNsdWRlL3N5 cy90eXBlcy5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgpleHRlcm4gIkMiIHsg CgoKCgp0eXBlZGVmIF9fdV9jaGFyIHVfY2hhcjsKdHlwZWRlZiBfX3Vfc2hvcnQgdV9zaG9ydDsK dHlwZWRlZiBfX3VfaW50IHVfaW50Owp0eXBlZGVmIF9fdV9sb25nIHVfbG9uZzsKdHlwZWRlZiBf X3F1YWRfdCBxdWFkX3Q7CnR5cGVkZWYgX191X3F1YWRfdCB1X3F1YWRfdDsKdHlwZWRlZiBfX2Zz aWRfdCBmc2lkX3Q7CgoKdHlwZWRlZiBfX2xvZmZfdCBsb2ZmX3Q7CgoKCnR5cGVkZWYgX19pbm9f dCBpbm9fdDsKCgoKCgoKCgoKCgp0eXBlZGVmIF9fZGV2X3QgZGV2X3Q7CgoKCgp0eXBlZGVmIF9f Z2lkX3QgZ2lkX3Q7CgoKCgp0eXBlZGVmIF9fbW9kZV90IG1vZGVfdDsKCgoKCnR5cGVkZWYgX19u bGlua190IG5saW5rX3Q7CgoKCgp0eXBlZGVmIF9fdWlkX3QgdWlkX3Q7CgoKCgoKCgoKCgoKCgoK CgoKdHlwZWRlZiBfX3BpZF90IHBpZF90OwoKCgoKdHlwZWRlZiBfX2lkX3QgaWRfdDsKCgoKdHlw ZWRlZiBfX3NzaXplX3Qgc3NpemVfdDsKCgoKCnR5cGVkZWYgX19kYWRkcl90IGRhZGRyX3Q7CnR5 cGVkZWYgX19jYWRkcl90IGNhZGRyX3Q7CgoKCnR5cGVkZWYgX19rZXlfdCBrZXlfdDsKCgoKCgoK CiMgMSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoK CgoKCgoKCgoKIyA1MSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgojIDYyICIvdXNyL2luY2x1 ZGUvdGltZS5oIiAzCgoKCgoKCgoKIAp0eXBlZGVmIF9fdGltZV90IHRpbWVfdDsKCgoKCgojIDg5 ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCgojIDI3OSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIg MwoKCgojIDEyMyAiL3Vzci9pbmNsdWRlL3N5cy90eXBlcy5oIiAyIDMKCgoKIyAxICIvdXNyL2xp Yi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDEg MwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoKCiMgNjEgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgojIDEzMSAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoK IAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4z L2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgojIDI3MSAiL3Vzci9saWIvZ2NjLWxp Yi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIyAyODMg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRk ZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IyAxMjYgIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCIgMiAzCgoKCiAKdHlwZWRlZiB1bnNpZ25l ZCBsb25nIGludCB1bG9uZzsKdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpbnQgdXNob3J0Owp0eXBl ZGVmIHVuc2lnbmVkIGludCB1aW50OwoKCiAKCiMgMTYwICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVz LmgiIDMKCgogCgoKCgoKCgp0eXBlZGVmIGludCBpbnQ4X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9k ZV9fICggIF9fUUlfXyApKSkgOwp0eXBlZGVmIGludCBpbnQxNl90IF9fYXR0cmlidXRlX18gKChf X21vZGVfXyAoICBfX0hJX18gKSkpIDsKdHlwZWRlZiBpbnQgaW50MzJfdCBfX2F0dHJpYnV0ZV9f ICgoX19tb2RlX18gKCAgX19TSV9fICkpKSA7CnR5cGVkZWYgaW50IGludDY0X3QgX19hdHRyaWJ1 dGVfXyAoKF9fbW9kZV9fICggIF9fRElfXyApKSkgOwoKCnR5cGVkZWYgdW5zaWduZWQgaW50IHVf aW50OF90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoICBfX1FJX18gKSkpIDsKdHlwZWRlZiB1 bnNpZ25lZCBpbnQgdV9pbnQxNl90IF9fYXR0cmlidXRlX18gKChfX21vZGVfXyAoICBfX0hJX18g KSkpIDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQzMl90IF9fYXR0cmlidXRlX18gKChfX21v ZGVfXyAoICBfX1NJX18gKSkpIDsKdHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQ2NF90IF9fYXR0 cmlidXRlX18gKChfX21vZGVfXyAoICBfX0RJX18gKSkpIDsKCnR5cGVkZWYgaW50IHJlZ2lzdGVy X3QgX19hdHRyaWJ1dGVfXyAoKF9fbW9kZV9fIChfX3dvcmRfXykpKTsKCgogCgoKCgoKCiAKIyAx ICIvdXNyL2luY2x1ZGUvZW5kaWFuLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoK CgoKCgoKCiAKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9lbmRpYW4uaCIgMSAzCiAKCgoKCgoKIyAz NSAiL3Vzci9pbmNsdWRlL2VuZGlhbi5oIiAyIDMKCgogCgoKCgoKCgoKCgoKCgojIDE5MiAiL3Vz ci9pbmNsdWRlL3N5cy90eXBlcy5oIiAyIDMKCgogCiMgMSAiL3Vzci9pbmNsdWRlL3N5cy9zZWxl Y3QuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgogCgoKIAojIDEgIi91c3IvaW5j bHVkZS9iaXRzL3NlbGVjdC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzNiAi L3Vzci9pbmNsdWRlL2JpdHMvc2VsZWN0LmgiIDMKCgoKCgoKCgoKCgoKIyA1NiAiL3Vzci9pbmNs dWRlL2JpdHMvc2VsZWN0LmgiIDMKCiMgNzIgIi91c3IvaW5jbHVkZS9iaXRzL3NlbGVjdC5oIiAz CgojIDMxICIvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oIiAyIDMKCgogCiMgMSAiL3Vzci9pbmNs dWRlL2JpdHMvc2lnc2V0LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnR5cGVkZWYgaW50 IF9fc2lnX2F0b21pY190OwoKIAoKCnR5cGVkZWYgc3RydWN0CiAgewogICAgdW5zaWduZWQgbG9u ZyBpbnQgX192YWxbKDEwMjQgLyAoOCAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKSkgXTsK ICB9IF9fc2lnc2V0X3Q7CgoKCgogCgoKCgoKIyAxMjUgIi91c3IvaW5jbHVkZS9iaXRzL3NpZ3Nl dC5oIiAzCgojIDM0ICIvdXNyL2luY2x1ZGUvc3lzL3NlbGVjdC5oIiAyIDMKCgogCgojIDEgIi91 c3IvaW5jbHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoK CiMgNTEgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoKIyA2MiAiL3Vzci9pbmNsdWRlL3RpbWUu aCIgMwoKCgojIDczICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCgoKCgoKIAoKc3RydWN0IHRp bWVzcGVjCiAgewogICAgbG9uZyBpbnQgdHZfc2VjOwkJIAogICAgbG9uZyBpbnQgdHZfbnNlYzsJ CSAKICB9OwoKCgoKCiMgMjc5ICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCiMgMzggIi91c3Iv aW5jbHVkZS9zeXMvc2VsZWN0LmgiIDIgMwoKCmV4dGVybiAiQyIgeyAKCiAKCgoKc3RydWN0IHRp bWV2YWw7Cgp0eXBlZGVmIF9fZmRfbWFzayBmZF9tYXNrOwoKIAp0eXBlZGVmIF9fZmRfc2V0IGZk X3NldDsKCiAKCgoKIAoKCgoKIAoKCgoKCgogCgoKCgpleHRlcm4gaW50IF9fc2VsZWN0ICAoaW50 IF9fbmZkcywgX19mZF9zZXQgKl9fcmVhZGZkcywKCQkJICBfX2ZkX3NldCAqX193cml0ZWZkcywg X19mZF9zZXQgKl9fZXhjZXB0ZmRzLAoJCQkgIHN0cnVjdCB0aW1ldmFsICpfX3RpbWVvdXQpICB0 aHJvdyAoKSAgOwpleHRlcm4gaW50IHNlbGVjdCAgKGludCBfX25mZHMsIF9fZmRfc2V0ICpfX3Jl YWRmZHMsCgkJCV9fZmRfc2V0ICpfX3dyaXRlZmRzLCBfX2ZkX3NldCAqX19leGNlcHRmZHMsCgkJ CXN0cnVjdCB0aW1ldmFsICpfX3RpbWVvdXQpICB0aHJvdyAoKSAgOwoKIyA5MSAiL3Vzci9pbmNs dWRlL3N5cy9zZWxlY3QuaCIgMwoKCn0gCgoKIyAxOTUgIi91c3IvaW5jbHVkZS9zeXMvdHlwZXMu aCIgMiAzCgoKIAojIDEgIi91c3IvaW5jbHVkZS9zeXMvc3lzbWFjcm9zLmgiIDEgMwogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgojIDQ3ICIvdXNyL2luY2x1ZGUvc3lzL3N5c21hY3Jv cy5oIiAzCgoKCiMgMTk4ICIvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmgiIDIgMwoKCgoKIAoKdHlw ZWRlZiBfX2Jsa2NudF90IGJsa2NudF90OwkgIAp0eXBlZGVmIF9fZnNibGtjbnRfdCBmc2Jsa2Nu dF90OyAgCnR5cGVkZWYgX19mc2ZpbGNudF90IGZzZmlsY250X3Q7ICAKCgoKCgoKCgoKCgoKfSAK CgojIDMzOSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAyIDMKCgogCgoKCiAKZXh0ZXJuIGludDMy X3QgcmFuZG9tICAodm9pZCkgIHRocm93ICgpICA7CgogCmV4dGVybiB2b2lkIHNyYW5kb20gICh1 bnNpZ25lZCBpbnQgX19zZWVkKSAgdGhyb3cgKCkgIDsKCiAKCgoKZXh0ZXJuIHZvaWQgKiAgaW5p dHN0YXRlICAodW5zaWduZWQgaW50IF9fc2VlZCwgdm9pZCAqICBfX3N0YXRlYnVmLAoJCQkgICAg ICAgc2l6ZV90IF9fc3RhdGVsZW4pICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIHZvaWQgKiAgc2V0 c3RhdGUgICh2b2lkICogIF9fc3RhdGVidWYpICB0aHJvdyAoKSAgOwoKCgogCgoKCnN0cnVjdCBy YW5kb21fZGF0YQogIHsKICAgIGludDMyX3QgKmZwdHI7CQkgCiAgICBpbnQzMl90ICpycHRyOwkJ IAogICAgaW50MzJfdCAqc3RhdGU7CQkgCiAgICBpbnQgcmFuZF90eXBlOwkJIAogICAgaW50IHJh bmRfZGVnOwkJIAogICAgaW50IHJhbmRfc2VwOwkJIAogICAgaW50MzJfdCAqZW5kX3B0cjsJCSAK ICB9OwoKZXh0ZXJuIGludCByYW5kb21fciAgKHN0cnVjdCByYW5kb21fZGF0YSAqX19yZXN0cmlj dCBfX2J1ZiwKCQkJICBpbnQzMl90ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSAgdGhyb3cgKCkgIDsK CmV4dGVybiBpbnQgc3JhbmRvbV9yICAodW5zaWduZWQgaW50IF9fc2VlZCwgc3RydWN0IHJhbmRv bV9kYXRhICpfX2J1ZikgIHRocm93ICgpICA7CgpleHRlcm4gaW50IGluaXRzdGF0ZV9yICAodW5z aWduZWQgaW50IF9fc2VlZCwKCQkJICAgICB2b2lkICogIF9fcmVzdHJpY3QgX19zdGF0ZWJ1ZiwK CQkJICAgICBzaXplX3QgX19zdGF0ZWxlbiwKCQkJICAgICBzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9f cmVzdHJpY3QgX19idWYpICB0aHJvdyAoKSAgOwoKZXh0ZXJuIGludCBzZXRzdGF0ZV9yICAodm9p ZCAqICBfX3Jlc3RyaWN0IF9fc3RhdGVidWYsCgkJCSAgICBzdHJ1Y3QgcmFuZG9tX2RhdGEgKl9f cmVzdHJpY3QgX19idWYpICB0aHJvdyAoKSAgOwoKCgoKIApleHRlcm4gaW50IHJhbmQgICh2b2lk KSAgdGhyb3cgKCkgIDsKIApleHRlcm4gdm9pZCBzcmFuZCAgKHVuc2lnbmVkIGludCBfX3NlZWQp ICB0aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIGludCByYW5kX3IgICh1bnNpZ25lZCBpbnQgKl9fc2Vl ZCkgIHRocm93ICgpICA7CgoKCgogCgogCmV4dGVybiBkb3VibGUgZHJhbmQ0OCAgKHZvaWQpICB0 aHJvdyAoKSAgOwpleHRlcm4gZG91YmxlIGVyYW5kNDggICh1bnNpZ25lZCBzaG9ydCBpbnQgX194 c3ViaVszXSkgIHRocm93ICgpICA7CgogCmV4dGVybiBsb25nIGludCBscmFuZDQ4ICAodm9pZCkg IHRocm93ICgpICA7CmV4dGVybiBsb25nIGludCBucmFuZDQ4ICAodW5zaWduZWQgc2hvcnQgaW50 IF9feHN1YmlbM10pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gbG9uZyBpbnQgbXJhbmQ0OCAgKHZv aWQpICB0aHJvdyAoKSAgOwpleHRlcm4gbG9uZyBpbnQganJhbmQ0OCAgKHVuc2lnbmVkIHNob3J0 IGludCBfX3hzdWJpWzNdKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgc3JhbmQ0OCAgKGxv bmcgaW50IF9fc2VlZHZhbCkgIHRocm93ICgpICA7CmV4dGVybiB1bnNpZ25lZCBzaG9ydCBpbnQg KnNlZWQ0OCAgKHVuc2lnbmVkIHNob3J0IGludCBfX3NlZWQxNnZbM10pICB0aHJvdyAoKSAgOwpl eHRlcm4gdm9pZCBsY29uZzQ4ICAodW5zaWduZWQgc2hvcnQgaW50IF9fcGFyYW1bN10pICB0aHJv dyAoKSAgOwoKIApzdHJ1Y3QgZHJhbmQ0OF9kYXRhCiAgewogICAgdW5zaWduZWQgc2hvcnQgaW50 IHhbM107CSAKICAgIHVuc2lnbmVkIHNob3J0IGludCBhWzNdOwkgCiAgICB1bnNpZ25lZCBzaG9y dCBpbnQgYzsJIAogICAgdW5zaWduZWQgc2hvcnQgaW50IG9sZF94WzNdOyAgCiAgICBpbnQgaW5p dDsJCQkgCiAgfTsKCgogCmV4dGVybiBpbnQgZHJhbmQ0OF9yICAoc3RydWN0IGRyYW5kNDhfZGF0 YSAqX19yZXN0cmljdCBfX2J1ZmZlciwKCQkJICAgZG91YmxlICpfX3Jlc3RyaWN0IF9fcmVzdWx0 KSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBlcmFuZDQ4X3IgICh1bnNpZ25lZCBzaG9ydCBpbnQg X194c3ViaVszXSwKCQkJICAgc3RydWN0IGRyYW5kNDhfZGF0YSAqX19yZXN0cmljdCBfX2J1ZmZl ciwKCQkJICAgZG91YmxlICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSAgdGhyb3cgKCkgIDsKCiAKZXh0 ZXJuIGludCBscmFuZDQ4X3IgIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVm ZmVyLAoJCQkgICBsb25nIGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkgIHRocm93ICgpICA7CmV4 dGVybiBpbnQgbnJhbmQ0OF9yICAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10sCgkJCSAg IHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCgkJCSAgIGxvbmcgaW50 ICpfX3Jlc3RyaWN0IF9fcmVzdWx0KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBtcmFuZDQ4 X3IgIChzdHJ1Y3QgZHJhbmQ0OF9kYXRhICpfX3Jlc3RyaWN0IF9fYnVmZmVyLAoJCQkgICBsb25n IGludCAqX19yZXN0cmljdCBfX3Jlc3VsdCkgIHRocm93ICgpICA7CmV4dGVybiBpbnQganJhbmQ0 OF9yICAodW5zaWduZWQgc2hvcnQgaW50IF9feHN1YmlbM10sCgkJCSAgIHN0cnVjdCBkcmFuZDQ4 X2RhdGEgKl9fcmVzdHJpY3QgX19idWZmZXIsCgkJCSAgIGxvbmcgaW50ICpfX3Jlc3RyaWN0IF9f cmVzdWx0KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBzcmFuZDQ4X3IgIChsb25nIGludCBf X3NlZWR2YWwsIHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSAgdGhyb3cgKCkgIDsKCmV4 dGVybiBpbnQgc2VlZDQ4X3IgICh1bnNpZ25lZCBzaG9ydCBpbnQgX19zZWVkMTZ2WzNdLAoJCQkg IHN0cnVjdCBkcmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSAgdGhyb3cgKCkgIDsKCmV4dGVybiBpbnQg bGNvbmc0OF9yICAodW5zaWduZWQgc2hvcnQgaW50IF9fcGFyYW1bN10sCgkJCSAgIHN0cnVjdCBk cmFuZDQ4X2RhdGEgKl9fYnVmZmVyKSAgdGhyb3cgKCkgIDsKCgoKCgoKCiAKZXh0ZXJuIHZvaWQg KiAgbWFsbG9jICAoc2l6ZV90IF9fc2l6ZSkgIHRocm93ICgpICA7CiAKZXh0ZXJuIHZvaWQgKiAg Y2FsbG9jICAoc2l6ZV90IF9fbm1lbWIsIHNpemVfdCBfX3NpemUpICB0aHJvdyAoKSAgOwoKCgog CgpleHRlcm4gdm9pZCAqICByZWFsbG9jICAodm9pZCAqICBfX3B0ciwgc2l6ZV90IF9fc2l6ZSkg IHRocm93ICgpICA7CiAKZXh0ZXJuIHZvaWQgZnJlZSAgKHZvaWQgKiAgX19wdHIpICB0aHJvdyAo KSAgOwoKCiAKZXh0ZXJuIHZvaWQgY2ZyZWUgICh2b2lkICogIF9fcHRyKSAgdGhyb3cgKCkgIDsK CgoKIyAxICIvdXNyL2luY2x1ZGUvYWxsb2NhLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1 ZGUvc3RkZGVmLmgiIDEgMwoKCgoKCgogCgoKIyAxOSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCiAKCgogCgoKCgoKIAoK CiMgNjEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVk ZS9zdGRkZWYuaCIgMwoKCiAKCgoKCgogCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgogCgogCgoj IDEzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRl L3N0ZGRlZi5oIiAzCgoKIAoKIAoKCiMgMTg4ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJh a2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCgogCgoKCgogCgojIDI3MSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRl Zi5oIiAzCgoKIyAyODMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1 LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCiAKCiAKCiMgMzE3ICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgoKCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKIyAyNSAiL3Vzci9pbmNsdWRlL2FsbG9jYS5oIiAyIDMKCgpleHRlcm4g IkMiIHsgCgogCgoKIApleHRlcm4gdm9pZCAqICBhbGxvY2EgIChzaXplX3QgX19zaXplKSAgdGhy b3cgKCkgIDsKCgoKCgp9IAoKCiMgNDkyICIvdXNyL2luY2x1ZGUvc3RkbGliLmgiIDIgMwoKCgoK IApleHRlcm4gdm9pZCAqICB2YWxsb2MgIChzaXplX3QgX19zaXplKSAgdGhyb3cgKCkgIDsKCgoK IApleHRlcm4gdm9pZCBhYm9ydCAgKHZvaWQpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChf X25vcmV0dXJuX18pKTsKCgogCmV4dGVybiBpbnQgYXRleGl0ICAodm9pZCAoKl9fZnVuYykgKHZv aWQpKSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4gaW50IF9fb25fZXhpdCAgKHZvaWQgKCpfX2Z1 bmMpIChpbnQgX19zdGF0dXMsIHZvaWQgKiAgX19hcmcpLAoJCQkgICB2b2lkICogIF9fYXJnKSAg dGhyb3cgKCkgIDsKZXh0ZXJuIGludCBvbl9leGl0ICAodm9pZCAoKl9fZnVuYykgKGludCBfX3N0 YXR1cywgdm9pZCAqICBfX2FyZyksCgkJCSB2b2lkICogIF9fYXJnKSAgdGhyb3cgKCkgIDsKCgog CgoKZXh0ZXJuIHZvaWQgZXhpdCAgKGludCBfX3N0YXR1cykgIHRocm93ICgpICAgX19hdHRyaWJ1 dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKCgoKCgoKCiAKZXh0ZXJuIGNoYXIgKmdldGVudiAgKF9f Y29uc3QgY2hhciAqX19uYW1lKSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBjaGFyICpfX3NlY3Vy ZV9nZXRlbnYgIChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgIHRocm93ICgpICA7CgoKIAogCgpleHRl cm4gaW50IHB1dGVudiAgKGNoYXIgKl9fc3RyaW5nKSAgdGhyb3cgKCkgIDsKCgoKIAoKZXh0ZXJu IGludCBzZXRlbnYgIChfX2NvbnN0IGNoYXIgKl9fbmFtZSwgX19jb25zdCBjaGFyICpfX3ZhbHVl LAoJCQlpbnQgX19yZXBsYWNlKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgdW5zZXRlbnYg IChfX2NvbnN0IGNoYXIgKl9fbmFtZSkgIHRocm93ICgpICA7CgoKCiAKCgpleHRlcm4gaW50IGNs ZWFyZW52ICAodm9pZCkgIHRocm93ICgpICA7CgoKCgogCgoKCmV4dGVybiBjaGFyICpta3RlbXAg IChjaGFyICpfX3RlbXBsYXRlKSAgdGhyb3cgKCkgIDsKCiAKCgoKCmV4dGVybiBpbnQgbWtzdGVt cCAgKGNoYXIgKl9fdGVtcGxhdGUpICB0aHJvdyAoKSAgOwoKCgogCmV4dGVybiBpbnQgc3lzdGVt ICAoX19jb25zdCBjaGFyICpfX2NvbW1hbmQpICB0aHJvdyAoKSAgOwoKCgoKCgoKCgoKIAoKCgoK CmV4dGVybiBjaGFyICpyZWFscGF0aCAgKF9fY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUs CgkJCSAgICBjaGFyICpfX3Jlc3RyaWN0IF9fcmVzb2x2ZWQpICB0aHJvdyAoKSAgOwoKCgogCgoK dHlwZWRlZiBpbnQgKCpfX2NvbXBhcl9mbl90KSAgKF9fY29uc3Qgdm9pZCAqICwgX19jb25zdCB2 b2lkICogKSAgOwoKCgoKCgogCgpleHRlcm4gdm9pZCAqICBic2VhcmNoICAoX19jb25zdCB2b2lk ICogIF9fa2V5LCBfX2NvbnN0IHZvaWQgKiAgX19iYXNlLAoJCQkgICAgICAgc2l6ZV90IF9fbm1l bWIsIHNpemVfdCBfX3NpemUsCgkJCSAgICAgICBfX2NvbXBhcl9mbl90IF9fY29tcGFyKSAgOwoK IAoKZXh0ZXJuIHZvaWQgcXNvcnQgICh2b2lkICogIF9fYmFzZSwgc2l6ZV90IF9fbm1lbWIsIHNp emVfdCBfX3NpemUsCgkJCSAgX19jb21wYXJfZm5fdCBfX2NvbXBhcikgIDsKCgogCmV4dGVybiBp bnQgYWJzICAoaW50IF9feCkgIHRocm93ICgpICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykp OwpleHRlcm4gbG9uZyBpbnQgbGFicyAgKGxvbmcgaW50IF9feCkgIHRocm93ICgpICAgX19hdHRy aWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKCgoKCgogCgogCmV4dGVybiBkaXZfdCBkaXYgIChpbnQg X19udW1lciwgaW50IF9fZGVub20pICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChfX2NvbnN0 X18pKTsKZXh0ZXJuIGxkaXZfdCBsZGl2ICAobG9uZyBpbnQgX19udW1lciwgbG9uZyBpbnQgX19k ZW5vbSkgIHRocm93ICgpICAKICAgICBfX2F0dHJpYnV0ZV9fICgoX19jb25zdF9fKSk7CgoKCgoK CgoKIAoKCiAKCgpleHRlcm4gY2hhciAqZWN2dCAgKGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGln aXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJCQlpbnQgKl9fcmVzdHJpY3QgX19zaWduKSAg dGhyb3cgKCkgIDsKCiAKCgpleHRlcm4gY2hhciAqZmN2dCAgKGRvdWJsZSBfX3ZhbHVlLCBpbnQg X19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJCQlpbnQgKl9fcmVzdHJpY3QgX19z aWduKSAgdGhyb3cgKCkgIDsKCiAKCgpleHRlcm4gY2hhciAqZ2N2dCAgKGRvdWJsZSBfX3ZhbHVl LCBpbnQgX19uZGlnaXQsIGNoYXIgKl9fYnVmKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGNoYXIg KnFlY3Z0ICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBfX25kaWdpdCwKCQkJIGludCAqX19y ZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduKSAgdGhyb3cgKCkgIDsKZXh0 ZXJuIGNoYXIgKnFmY3Z0ICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBfX25kaWdpdCwKCQkJ IGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduKSAgdGhyb3cg KCkgIDsKZXh0ZXJuIGNoYXIgKnFnY3Z0ICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBfX25k aWdpdCwgY2hhciAqX19idWYpICB0aHJvdyAoKSAgOwoKCgogCgpleHRlcm4gaW50IGVjdnRfciAg KGRvdWJsZSBfX3ZhbHVlLCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJ CQlpbnQgKl9fcmVzdHJpY3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAoJCQlzaXpl X3QgX19sZW4pICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IGZjdnRfciAgKGRvdWJsZSBfX3ZhbHVl LCBpbnQgX19uZGlnaXQsIGludCAqX19yZXN0cmljdCBfX2RlY3B0LAoJCQlpbnQgKl9fcmVzdHJp Y3QgX19zaWduLCBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmLAoJCQlzaXplX3QgX19sZW4pICB0aHJv dyAoKSAgOwoKZXh0ZXJuIGludCBxZWN2dF9yICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBf X25kaWdpdCwKCQkJIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19z aWduLAoJCQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSAgdGhyb3cgKCkg IDsKZXh0ZXJuIGludCBxZmN2dF9yICAobG9uZyBkb3VibGUgIF9fdmFsdWUsIGludCBfX25kaWdp dCwKCQkJIGludCAqX19yZXN0cmljdCBfX2RlY3B0LCBpbnQgKl9fcmVzdHJpY3QgX19zaWduLAoJ CQkgY2hhciAqX19yZXN0cmljdCBfX2J1Ziwgc2l6ZV90IF9fbGVuKSAgdGhyb3cgKCkgIDsKCgoK CiAKCmV4dGVybiBpbnQgbWJsZW4gIChfX2NvbnN0IGNoYXIgKl9fcywgc2l6ZV90IF9fbikgIHRo cm93ICgpICA7CiAKCmV4dGVybiBpbnQgbWJ0b3djICAod2NoYXJfdCAqX19yZXN0cmljdCBfX3B3 YywKCQkJX19jb25zdCBjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9fbikgIHRocm93ICgp ICA7CiAKCmV4dGVybiBpbnQgd2N0b21iICAoY2hhciAqX19zLCB3Y2hhcl90IF9fd2NoYXIpICB0 aHJvdyAoKSAgOwoKCiAKZXh0ZXJuIHNpemVfdCBtYnN0b3djcyAgKHdjaGFyX3QgKl9fcmVzdHJp Y3QgIF9fcHdjcywKCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19zLCBzaXplX3Qg X19uKSAgdGhyb3cgKCkgIDsKIApleHRlcm4gc2l6ZV90IHdjc3RvbWJzICAoY2hhciAqX19yZXN0 cmljdCBfX3MsCgkJCSAgICAgX19jb25zdCB3Y2hhcl90ICpfX3Jlc3RyaWN0IF9fcHdjcywgc2l6 ZV90IF9fbikgIHRocm93ICgpICA7CgoKCiAKCgoKZXh0ZXJuIGludCBycG1hdGNoICAoX19jb25z dCBjaGFyICpfX3Jlc3BvbnNlKSAgdGhyb3cgKCkgIDsKCgoKIyA3MzIgIi91c3IvaW5jbHVkZS9z dGRsaWIuaCIgMwoKCgojIDc1NiAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzCgoKIyA3NjYgIi91 c3IvaW5jbHVkZS9zdGRsaWIuaCIgMwoKCgoKCn0gCgoKIyA1MCAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9h bGdvYmFzZS5oIiAyIDMKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCgoKCgoKIAoKIAoKCgoKIAoK CiAKCgoKCgogCgoKIyA2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKIAoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKIAoK CgoKCiAKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKdHlwZWRlZiBpbnQgcHRyZGlmZl90OwoKCgoK CgoKCgogCgoKCgogCgogCgoKIyAxODggIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKCgoKCiAKCgoKCiAKCgojIDI2OSAiL3Vz ci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5o IiAzCgoKCgoKCgoKCgoKCgoKCgogCgogCgojIDMxNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoK CgogCgoKCgoKCgojIDUxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45 NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKIyAxICIv dXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvbmV3Lmgi IDEgMwogCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1 LjMvaW5jbHVkZS9uZXciIDEgMwogCiAKCgoKCiNwcmFnbWEgaW50ZXJmYWNlICJuZXciCiMgMSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRl Zi5oIiAxIDMKIyAzNDIgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1 LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKIyA4ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJh a2UtbGludXgvMi45NS4zL2luY2x1ZGUvbmV3IiAyIDMKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL2V4Y2VwdGlvbiIgMSAzCiAKIAoKCgoK I3ByYWdtYSBpbnRlcmZhY2UgImV4Y2VwdGlvbiIKCmV4dGVybiAiQysrIiB7CgpuYW1lc3BhY2Ug c3RkIHsKCmNsYXNzIGV4Y2VwdGlvbiB7CnB1YmxpYzoKICBleGNlcHRpb24gKCkgeyB9CiAgdmly dHVhbCB+ZXhjZXB0aW9uICgpIHsgfQogIHZpcnR1YWwgY29uc3QgY2hhciogd2hhdCAoKSBjb25z dDsKfTsKCmNsYXNzIGJhZF9leGNlcHRpb24gOiBwdWJsaWMgZXhjZXB0aW9uIHsKcHVibGljOgog IGJhZF9leGNlcHRpb24gKCkgeyB9CiAgdmlydHVhbCB+YmFkX2V4Y2VwdGlvbiAoKSB7IH0KfTsK CnR5cGVkZWYgdm9pZCAoKnRlcm1pbmF0ZV9oYW5kbGVyKSAoKTsKdHlwZWRlZiB2b2lkICgqdW5l eHBlY3RlZF9oYW5kbGVyKSAoKTsKCnRlcm1pbmF0ZV9oYW5kbGVyIHNldF90ZXJtaW5hdGUgKHRl cm1pbmF0ZV9oYW5kbGVyKTsKdm9pZCB0ZXJtaW5hdGUgKCkgX19hdHRyaWJ1dGVfXyAoKF9fbm9y ZXR1cm5fXykpOwp1bmV4cGVjdGVkX2hhbmRsZXIgc2V0X3VuZXhwZWN0ZWQgKHVuZXhwZWN0ZWRf aGFuZGxlcik7CnZvaWQgdW5leHBlY3RlZCAoKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9f KSk7CmJvb2wgdW5jYXVnaHRfZXhjZXB0aW9uICgpOwoKfSAgCgp9ICAKCgojIDkgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9uZXciIDIgMwoKCmV4 dGVybiAiQysrIiB7CgpuYW1lc3BhY2Ugc3RkIHsKCiAgY2xhc3MgYmFkX2FsbG9jIDogcHVibGlj IGV4Y2VwdGlvbiB7CiAgcHVibGljOgogICAgdmlydHVhbCBjb25zdCBjaGFyKiB3aGF0KCkgY29u c3QgdGhyb3coKSB7IHJldHVybiAiYmFkX2FsbG9jIjsgfQogIH07CgogIHN0cnVjdCBub3Rocm93 X3Qge307CiAgZXh0ZXJuIGNvbnN0IG5vdGhyb3dfdCBub3Rocm93OwogIHR5cGVkZWYgdm9pZCAo Km5ld19oYW5kbGVyKSgpOwogIG5ld19oYW5kbGVyIHNldF9uZXdfaGFuZGxlciAobmV3X2hhbmRs ZXIpOwoKfSAgCgogCnZvaWQgKm9wZXJhdG9yIG5ldyAoc2l6ZV90KSB0aHJvdyAoc3RkOjpiYWRf YWxsb2MpOwp2b2lkICpvcGVyYXRvciBuZXdbXSAoc2l6ZV90KSB0aHJvdyAoc3RkOjpiYWRfYWxs b2MpOwp2b2lkIG9wZXJhdG9yIGRlbGV0ZSAodm9pZCAqKSB0aHJvdygpOwp2b2lkIG9wZXJhdG9y IGRlbGV0ZVtdICh2b2lkICopIHRocm93KCk7CnZvaWQgKm9wZXJhdG9yIG5ldyAoc2l6ZV90LCBj b25zdCBzdGQ6Om5vdGhyb3dfdCYpIHRocm93KCk7CnZvaWQgKm9wZXJhdG9yIG5ld1tdIChzaXpl X3QsIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKdm9pZCBvcGVyYXRvciBkZWxldGUg KHZvaWQgKiwgY29uc3Qgc3RkOjpub3Rocm93X3QmKSB0aHJvdygpOwp2b2lkIG9wZXJhdG9yIGRl bGV0ZVtdICh2b2lkICosIGNvbnN0IHN0ZDo6bm90aHJvd190JikgdGhyb3coKTsKCiAKaW5saW5l IHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QsIHZvaWQgKnBsYWNlKSB0aHJvdygpIHsgcmV0dXJu IHBsYWNlOyB9CmlubGluZSB2b2lkICpvcGVyYXRvciBuZXdbXShzaXplX3QsIHZvaWQgKnBsYWNl KSB0aHJvdygpIHsgcmV0dXJuIHBsYWNlOyB9Cn0gIAoKCiMgNiAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL25ldy5oIiAyIDMKCgp1c2luZyBzdGQ6 Om5ld19oYW5kbGVyOwp1c2luZyBzdGQ6OnNldF9uZXdfaGFuZGxlcjsKCgojIDUyICIvdXNyL2xp Yi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUv ZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIgMwoKIyAxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvaW9zdHJlYW0uaCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaW50ZXJmYWNlCgoKCiMgMSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0cmVhbWJ1Zi5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiNwcmFnbWEgaW50ZXJmYWNlCgoKICAgCgoKCmV4dGVybiAiQyIgewoKfQogCgojIDEgIi91c3Iv bGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRhcmcuaCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCiAKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCnZvaWQgdmFf ZW5kIChfX2dudWNfdmFfbGlzdCk7CQkgCgoKIAoKCgogCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgogCiAKCgoKCgoKCgoKCgoKCiMgMTc1ICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkYXJnLmgiIDMKCgogCgoKCgogCgog CgogCgp0eXBlZGVmIF9fZ251Y192YV9saXN0IHZhX2xpc3Q7CgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCiMgNDAgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4v Li4vLi4vLi4vaW5jbHVkZS9nKystMy9zdHJlYW1idWYuaCIgMiAzCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgpleHRlcm4gIkMrKyIgewpjbGFzcyBpc3RyZWFtOyAgCmNsYXNzIG9zdHJlYW07IGNs YXNzIHN0cmVhbWJ1ZjsKCiAKCgoKCnR5cGVkZWYgX19vZmY2NF90ICAgc3RyZWFtb2ZmOwp0eXBl ZGVmIF9fb2ZmNjRfdCAgIHN0cmVhbXBvczsKCgoKCnR5cGVkZWYgX19zc2l6ZV90ICAgc3RyZWFt c2l6ZTsKCnR5cGVkZWYgdW5zaWduZWQgbG9uZyBfX2ZtdGZsYWdzOwp0eXBlZGVmIHVuc2lnbmVk IGNoYXIgX19pb3N0YXRlOwoKc3RydWN0IF9pb3NfZmllbGRzCnsgIAogICAgc3RyZWFtYnVmICpf c3RyYnVmOwogICAgb3N0cmVhbSogX3RpZTsKICAgIGludCBfd2lkdGg7CiAgICBfX2ZtdGZsYWdz IF9mbGFnczsKICAgIHdjaGFyX3QgICBfZmlsbDsKICAgIF9faW9zdGF0ZSBfc3RhdGU7CiAgICBf X2lvc3RhdGUgX2V4Y2VwdGlvbnM7CiAgICBpbnQgX3ByZWNpc2lvbjsKCiAgICB2b2lkICpfYXJy YXlzOyAgCn07CgoKCgoKCgoKCgoKCgoKCiMgMTI0ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RyZWFtYnVmLmgi IDMKCgpjbGFzcyBpb3MgOiBwdWJsaWMgX2lvc19maWVsZHMgewogIGlvcyYgb3BlcmF0b3I9KGlv cyYpOyAgIAogIGlvcyAoY29uc3QgaW9zJik7ICAKICBwdWJsaWM6CiAgICB0eXBlZGVmIF9fZm10 ZmxhZ3MgZm10ZmxhZ3M7CiAgICB0eXBlZGVmIGludCBpb3N0YXRlOwogICAgdHlwZWRlZiBpbnQg b3Blbm1vZGU7CiAgICB0eXBlZGVmIF9fc3NpemVfdCAgIHN0cmVhbXNpemU7CiAgICBlbnVtIGlv X3N0YXRlIHsKCWdvb2RiaXQgPSAwICwKCWVvZmJpdCA9IDEgLAoJZmFpbGJpdCA9IDIgLAoJYmFk Yml0ID0gNCAgfTsKICAgIGVudW0gb3Blbl9tb2RlIHsKCWluID0gMSAsCglvdXQgPSAyICwKCWF0 ZSA9IDQgLAoJYXBwID0gOCAsCgl0cnVuYyA9IDE2ICwKCW5vY3JlYXRlID0gMzIgLAoJbm9yZXBs YWNlID0gNjQgLAoJYmluID0gMTI4ICwgIAoJYmluYXJ5ID0gMTI4ICB9OwogICAgZW51bSBzZWVr X2RpciB7IGJlZywgY3VyLCBlbmR9OwogICAgdHlwZWRlZiBlbnVtIHNlZWtfZGlyIHNlZWtkaXI7 CiAgICAgCiAgICBlbnVtIHsgc2tpcHdzPSAwMSAsCgkgICBsZWZ0PSAwMiAsIHJpZ2h0PSAwNCAs IGludGVybmFsPSAwMTAgLAoJICAgZGVjPSAwMjAgLCBvY3Q9IDA0MCAsIGhleD0gMDEwMCAsCgkg ICBzaG93YmFzZT0gMDIwMCAsIHNob3dwb2ludD0gMDQwMCAsCgkgICB1cHBlcmNhc2U9IDAxMDAw ICwgc2hvd3Bvcz0gMDIwMDAgLAoJICAgc2NpZW50aWZpYz0gMDQwMDAgLCBmaXhlZD0gMDEwMDAw ICwKCSAgIHVuaXRidWY9IDAyMDAwMCAsIHN0ZGlvPSAwNDAwMDAgCgoKCgkgICB9OwogICAgZW51 bSB7ICAKCWJhc2VmaWVsZD1kZWMrb2N0K2hleCwKCWZsb2F0ZmllbGQgPSBzY2llbnRpZmljK2Zp eGVkLAoJYWRqdXN0ZmllbGQgPSBsZWZ0K3JpZ2h0K2ludGVybmFsCiAgICB9OwoKIyAxNzcgIi91 c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5j bHVkZS9nKystMy9zdHJlYW1idWYuaCIgMwoKCiAgICBvc3RyZWFtKiB0aWUoKSBjb25zdCB7IHJl dHVybiBfdGllOyB9CiAgICBvc3RyZWFtKiB0aWUob3N0cmVhbSogdmFsKSB7IG9zdHJlYW0qIHNh dmU9X3RpZTsgX3RpZT12YWw7IHJldHVybiBzYXZlOyB9CgogICAgIAogICAgd2NoYXJfdCAgIGZp bGwoKSBjb25zdCB7IHJldHVybiBfZmlsbDsgfQogICAgd2NoYXJfdCAgIGZpbGwod2NoYXJfdCAg IG5ld2YpCgl7d2NoYXJfdCAgIG9sZGYgPSBfZmlsbDsgX2ZpbGwgPSBuZXdmOyByZXR1cm4gb2xk Zjt9CiAgICBmbXRmbGFncyBmbGFncygpIGNvbnN0IHsgcmV0dXJuIF9mbGFnczsgfQogICAgZm10 ZmxhZ3MgZmxhZ3MoZm10ZmxhZ3MgbmV3X3ZhbCkgewoJZm10ZmxhZ3Mgb2xkX3ZhbCA9IF9mbGFn czsgX2ZsYWdzID0gbmV3X3ZhbDsgcmV0dXJuIG9sZF92YWw7IH0KICAgIGludCBwcmVjaXNpb24o KSBjb25zdCB7IHJldHVybiBfcHJlY2lzaW9uOyB9CiAgICBpbnQgcHJlY2lzaW9uKGludCBuZXdw KSB7Cgl1bnNpZ25lZCBzaG9ydCBvbGRwID0gX3ByZWNpc2lvbjsgX3ByZWNpc2lvbiA9ICh1bnNp Z25lZCBzaG9ydCluZXdwOwoJcmV0dXJuIG9sZHA7IH0KICAgIGZtdGZsYWdzIHNldGYoZm10Zmxh Z3MgdmFsKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzIHw9IHZhbDsgcmV0 dXJuIG9sZGJpdHM7IH0KICAgIGZtdGZsYWdzIHNldGYoZm10ZmxhZ3MgdmFsLCBmbXRmbGFncyBt YXNrKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzID0gKF9mbGFncyAmIH5t YXNrKSB8ICh2YWwgJiBtYXNrKTsgcmV0dXJuIG9sZGJpdHM7IH0KICAgIGZtdGZsYWdzIHVuc2V0 ZihmbXRmbGFncyBtYXNrKSB7CglmbXRmbGFncyBvbGRiaXRzID0gX2ZsYWdzOwoJX2ZsYWdzICY9 IH5tYXNrOyByZXR1cm4gb2xkYml0czsgfQogICAgaW50IHdpZHRoKCkgY29uc3QgeyByZXR1cm4g X3dpZHRoOyB9CiAgICBpbnQgd2lkdGgoaW50IHZhbCkgeyBpbnQgc2F2ZSA9IF93aWR0aDsgX3dp ZHRoID0gdmFsOyByZXR1cm4gc2F2ZTsgfQoKCgoKICAgIHZvaWQgX3Rocm93X2ZhaWx1cmUoKSBj b25zdCB7IH0KCiAgICB2b2lkIGNsZWFyKGlvc3RhdGUgc3RhdGUgPSAwKSB7Cglfc3RhdGUgPSBf c3RyYnVmID8gc3RhdGUgOiBzdGF0ZXxiYWRiaXQ7CglpZiAoX3N0YXRlICYgX2V4Y2VwdGlvbnMp IF90aHJvd19mYWlsdXJlKCk7IH0KICAgIHZvaWQgc2V0KGlvc3RhdGUgZmxhZykgeyBfc3RhdGUg fD0gZmxhZzsKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQog ICAgdm9pZCBzZXRzdGF0ZShpb3N0YXRlIGZsYWcpIHsgX3N0YXRlIHw9IGZsYWc7ICAKCWlmIChf c3RhdGUgJiBfZXhjZXB0aW9ucykgX3Rocm93X2ZhaWx1cmUoKTsgfQogICAgaW50IGdvb2QoKSBj b25zdCB7IHJldHVybiBfc3RhdGUgPT0gMDsgfQogICAgaW50IGVvZigpIGNvbnN0IHsgcmV0dXJu IF9zdGF0ZSAmIGlvczo6ZW9mYml0OyB9CiAgICBpbnQgZmFpbCgpIGNvbnN0IHsgcmV0dXJuIF9z dGF0ZSAmIChpb3M6OmJhZGJpdHxpb3M6OmZhaWxiaXQpOyB9CiAgICBpbnQgYmFkKCkgY29uc3Qg eyByZXR1cm4gX3N0YXRlICYgaW9zOjpiYWRiaXQ7IH0KICAgIGlvc3RhdGUgcmRzdGF0ZSgpIGNv bnN0IHsgcmV0dXJuIF9zdGF0ZTsgfQogICAgb3BlcmF0b3Igdm9pZCooKSBjb25zdCB7IHJldHVy biBmYWlsKCkgPyAodm9pZCopMCA6ICh2b2lkKikoLTEpOyB9CiAgICBpbnQgb3BlcmF0b3IhKCkg Y29uc3QgeyByZXR1cm4gZmFpbCgpOyB9CiAgICBpb3N0YXRlIGV4Y2VwdGlvbnMoKSBjb25zdCB7 IHJldHVybiBfZXhjZXB0aW9uczsgfQogICAgdm9pZCBleGNlcHRpb25zKGlvc3RhdGUgZW5hYmxl KSB7CglfZXhjZXB0aW9ucyA9IGVuYWJsZTsKCWlmIChfc3RhdGUgJiBfZXhjZXB0aW9ucykgX3Ro cm93X2ZhaWx1cmUoKTsgfQoKICAgIHN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdCB7IHJldHVybiBf c3RyYnVmOyB9CiAgICBzdHJlYW1idWYqIHJkYnVmKHN0cmVhbWJ1ZiAqX3MpIHsKICAgICAgc3Ry ZWFtYnVmICpfb2xkID0gX3N0cmJ1ZjsgX3N0cmJ1ZiA9IF9zOyBjbGVhciAoKTsgcmV0dXJuIF9v bGQ7IH0KCiAgICBzdGF0aWMgaW50IHN5bmNfd2l0aF9zdGRpbyhpbnQgb24pOwogICAgc3RhdGlj IHZvaWQgc3luY193aXRoX3N0ZGlvKCkgeyBzeW5jX3dpdGhfc3RkaW8oMSk7IH0KICAgIHN0YXRp YyBmbXRmbGFncyBiaXRhbGxvYygpOwogICAgc3RhdGljIGludCB4YWxsb2MoKTsKICAgIHZvaWQq JiBwd29yZChpbnQpOwogICAgdm9pZCogcHdvcmQoaW50KSBjb25zdDsKICAgIGxvbmcmIGl3b3Jk KGludCk7CiAgICBsb25nIGl3b3JkKGludCkgY29uc3Q7CgoKCgoKCgoKCiAgICAgCiAgICBjbGFz cyBJbml0IHsKICAgIHB1YmxpYzoKICAgICAgSW5pdCAoKSB7IH0KICAgIH07CgogIHByb3RlY3Rl ZDoKICAgIGlubGluZSBpb3Moc3RyZWFtYnVmKiBzYiA9IDAsIG9zdHJlYW0qIHRpZV90byA9IDAp OwogICAgaW5saW5lIHZpcnR1YWwgfmlvcygpOwogICAgaW5saW5lIHZvaWQgaW5pdChzdHJlYW1i dWYqIHNiLCBvc3RyZWFtKiB0aWUgPSAwKTsKfTsKCgoKCnR5cGVkZWYgaW9zOjpzZWVrX2RpciBf c2Vla19kaXI7CgoKIAogCiAKIAogCgogCiAKY2xhc3Mgc3RyZWFtbWFya2VyIDogcHJpdmF0ZSBf SU9fbWFya2VyIHsKICAgIGZyaWVuZCBjbGFzcyBzdHJlYW1idWY7CiAgICB2b2lkIHNldF9vZmZz ZXQoaW50IG9mZnNldCkgeyBfcG9zID0gb2Zmc2V0OyB9CiAgcHVibGljOgogICAgc3RyZWFtbWFy a2VyKHN0cmVhbWJ1ZiAqc2IpOwogICAgfnN0cmVhbW1hcmtlcigpOwogICAgaW50IHNhdmluZygp IHsgcmV0dXJuICAxOyB9CiAgICBpbnQgZGVsdGEoc3RyZWFtbWFya2VyJik7CiAgICBpbnQgZGVs dGEoKTsKfTsKCnN0cnVjdCBzdHJlYW1idWYgOiBwdWJsaWMgX0lPX0ZJTEUgeyAgCiAgICBmcmll bmQgY2xhc3MgaW9zOwogICAgZnJpZW5kIGNsYXNzIGlzdHJlYW07CiAgICBmcmllbmQgY2xhc3Mg b3N0cmVhbTsKICAgIGZyaWVuZCBjbGFzcyBzdHJlYW1tYXJrZXI7CiAgICBjb25zdCB2b2lkICom X3Z0YWJsZSgpIHsgcmV0dXJuICooY29uc3Qgdm9pZCoqKSgoX0lPX0ZJTEUqKXRoaXMgKyAxKTsg fQogIHByb3RlY3RlZDoKICAgIHN0YXRpYyBzdHJlYW1idWYqIF9saXN0X2FsbDsgIAogICAgX0lP X0ZJTEUqJiB4Y2hhaW4oKSB7IHJldHVybiBfY2hhaW47IH0KICAgIHZvaWQgX3VuX2xpbmsoKTsK ICAgIHZvaWQgX2xpbmtfaW4oKTsKICAgIGNoYXIqIGdwdHIoKSBjb25zdAogICAgICB7IHJldHVy biBfZmxhZ3MgICYgMHgxMDAgID8gX0lPX3NhdmVfYmFzZSA6IF9JT19yZWFkX3B0cjsgfQogICAg Y2hhciogcHB0cigpIGNvbnN0IHsgcmV0dXJuIF9JT193cml0ZV9wdHI7IH0KICAgIGNoYXIqIGVn cHRyKCkgY29uc3QKICAgICAgeyByZXR1cm4gX2ZsYWdzICAmIDB4MTAwICA/IF9JT19zYXZlX2Vu ZCA6IF9JT19yZWFkX2VuZDsgfQogICAgY2hhciogZXBwdHIoKSBjb25zdCB7IHJldHVybiBfSU9f d3JpdGVfZW5kOyB9CiAgICBjaGFyKiBwYmFzZSgpIGNvbnN0IHsgcmV0dXJuIF9JT193cml0ZV9i YXNlOyB9CiAgICBjaGFyKiBlYmFjaygpIGNvbnN0CiAgICAgIHsgcmV0dXJuIF9mbGFncyAgJiAw eDEwMCAgPyBfSU9fc2F2ZV9iYXNlIDogX0lPX3JlYWRfYmFzZTt9CiAgICBjaGFyKiBiYXNlKCkg Y29uc3QgeyByZXR1cm4gX0lPX2J1Zl9iYXNlOyB9CiAgICBjaGFyKiBlYnVmKCkgY29uc3QgeyBy ZXR1cm4gX0lPX2J1Zl9lbmQ7IH0KICAgIGludCBibGVuKCkgY29uc3QgeyByZXR1cm4gX0lPX2J1 Zl9lbmQgLSBfSU9fYnVmX2Jhc2U7IH0KICAgIHZvaWQgeHB1dF9jaGFyKGNoYXIgYykgeyAqX0lP X3dyaXRlX3B0cisrID0gYzsgfQogICAgaW50IHhmbGFncygpIHsgcmV0dXJuIF9mbGFncyA7IH0K ICAgIGludCB4ZmxhZ3MoaW50IGYpIHtpbnQgZmwgPSBfZmxhZ3MgOyBfZmxhZ3MgID0gZjsgcmV0 dXJuIGZsO30KICAgIHZvaWQgeHNldGZsYWdzKGludCBmKSB7IF9mbGFncyAgfD0gZjsgfQogICAg dm9pZCB4c2V0ZmxhZ3MoaW50IGYsIGludCBtYXNrKQogICAgICB7IF9mbGFncyAgPSAoX2ZsYWdz ICAmIH5tYXNrKSB8IChmICYgbWFzayk7IH0KICAgIHZvaWQgZ2J1bXAoaW50IG4pCiAgICAgIHsg X2ZsYWdzICAmIDB4MTAwICA/IChfSU9fc2F2ZV9iYXNlKz1uKTooX0lPX3JlYWRfcHRyKz1uKTt9 CiAgICB2b2lkIHBidW1wKGludCBuKSB7IF9JT193cml0ZV9wdHIgKz0gbjsgfQogICAgdm9pZCBz ZXRiKGNoYXIqIGIsIGNoYXIqIGViLCBpbnQgYT0wKTsKICAgIHZvaWQgc2V0cChjaGFyKiBwLCBj aGFyKiBlcCkKICAgICAgeyBfSU9fd3JpdGVfYmFzZT1fSU9fd3JpdGVfcHRyPXA7IF9JT193cml0 ZV9lbmQ9ZXA7IH0KICAgIHZvaWQgc2V0ZyhjaGFyKiBlYiwgY2hhciogZywgY2hhciAqZWcpIHsK ICAgICAgaWYgKF9mbGFncyAgJiAweDEwMCApIF9JT19mcmVlX2JhY2t1cF9hcmVhKHRoaXMpOyAK ICAgICAgX0lPX3JlYWRfYmFzZSA9IGViOyBfSU9fcmVhZF9wdHIgPSBnOyBfSU9fcmVhZF9lbmQg PSBlZzsgfQogICAgY2hhciAqc2hvcnRidWYoKSB7IHJldHVybiBfc2hvcnRidWY7IH0KCiAgICBp bnQgaW5fYmFja3VwKCkgeyByZXR1cm4gX2ZsYWdzICYgMHgxMDAgOyB9CiAgICAgCiAgICBjaGFy ICpHYmFzZSgpIHsgcmV0dXJuIGluX2JhY2t1cCgpID8gX0lPX3NhdmVfYmFzZSA6IF9JT19yZWFk X2Jhc2U7IH0KICAgICAKICAgIGNoYXIgKmVHcHRyKCkgeyByZXR1cm4gaW5fYmFja3VwKCkgPyBf SU9fc2F2ZV9lbmQgOiBfSU9fcmVhZF9lbmQ7IH0KICAgICAKICAgIGNoYXIgKkJiYXNlKCkgeyBy ZXR1cm4gaW5fYmFja3VwKCkgPyBfSU9fcmVhZF9iYXNlIDogX0lPX3NhdmVfYmFzZTsgfQogICAg Y2hhciAqQnB0cigpIHsgcmV0dXJuIF9JT19iYWNrdXBfYmFzZTsgfQogICAgIAogICAgY2hhciAq ZUJwdHIoKSB7IHJldHVybiBpbl9iYWNrdXAoKSA/IF9JT19yZWFkX2VuZCA6IF9JT19zYXZlX2Vu ZDsgfQogICAgY2hhciAqTmJhc2UoKSB7IHJldHVybiBfSU9fc2F2ZV9iYXNlOyB9CiAgICBjaGFy ICplTnB0cigpIHsgcmV0dXJuIF9JT19zYXZlX2VuZDsgfQogICAgaW50IGhhdmVfYmFja3VwKCkg eyByZXR1cm4gX0lPX3NhdmVfYmFzZSAhPSBfX251bGwgOyB9CiAgICBpbnQgaGF2ZV9tYXJrZXJz KCkgeyByZXR1cm4gX21hcmtlcnMgIT0gX19udWxsIDsgfQogICAgdm9pZCBmcmVlX2JhY2t1cF9h cmVhKCk7CiAgICB2b2lkIHVuc2F2ZV9tYXJrZXJzKCk7ICAKICAgIGludCBwdXRfbW9kZSgpIHsg cmV0dXJuIF9mbGFncyAmIDB4ODAwIDsgfQogICAgaW50IHN3aXRjaF90b19nZXRfbW9kZSgpOwog ICAgCiAgICBzdHJlYW1idWYoaW50IGZsYWdzPTApOwogIHB1YmxpYzoKICAgIHN0YXRpYyBpbnQg Zmx1c2hfYWxsKCk7CiAgICBzdGF0aWMgdm9pZCBmbHVzaF9hbGxfbGluZWJ1ZmZlcmVkKCk7ICAK ICAgIHZpcnR1YWwgfnN0cmVhbWJ1ZigpOwogICAgdmlydHVhbCBpbnQgb3ZlcmZsb3coaW50IGMg PSAoLTEpICk7ICAKICAgIHZpcnR1YWwgaW50IHVuZGVyZmxvdygpOyAgCiAgICB2aXJ0dWFsIGlu dCB1ZmxvdygpOyAgCiAgICB2aXJ0dWFsIGludCBwYmFja2ZhaWwoaW50IGMpOwogCiAgICB2aXJ0 dWFsIHN0cmVhbXNpemUgeHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2 aXJ0dWFsIHN0cmVhbXNpemUgeHNnZXRuKGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICB2aXJ0 dWFsIHN0cmVhbXBvcyBzZWVrb2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGlyLCBpbnQgbW9kZT1pb3M6 OmlufGlvczo6b3V0KTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtwb3Moc3RyZWFtcG9zIHBv cywgaW50IG1vZGUgPSBpb3M6OmlufGlvczo6b3V0KTsKCiAgICBzdHJlYW1wb3MgcHVic2Vla29m ZihzdHJlYW1vZmYgbywgX3NlZWtfZGlyIGQsIGludCBtb2RlPWlvczo6aW58aW9zOjpvdXQpCiAg ICAgIHsgcmV0dXJuIF9JT19zZWVrb2ZmICh0aGlzLCBvLCBkLCBtb2RlKTsgfQogICAgc3RyZWFt cG9zIHB1YnNlZWtwb3Moc3RyZWFtcG9zIHBvcywgaW50IG1vZGUgPSBpb3M6OmlufGlvczo6b3V0 KQogICAgICB7IHJldHVybiBfSU9fc2Vla3BvcyAodGhpcywgcG9zLCBtb2RlKTsgfQogICAgc3Ry ZWFtcG9zIHNzZWVrb2ZmKHN0cmVhbW9mZiwgX3NlZWtfZGlyLCBpbnQgbW9kZT1pb3M6OmlufGlv czo6b3V0KTsKICAgIHN0cmVhbXBvcyBzc2Vla3BvcyhzdHJlYW1wb3MgcG9zLCBpbnQgbW9kZSA9 IGlvczo6aW58aW9zOjpvdXQpOwogICAgdmlydHVhbCBzdHJlYW1idWYqIHNldGJ1ZihjaGFyKiBw LCBpbnQgbGVuKTsKICAgIHZpcnR1YWwgaW50IHN5bmMoKTsKICAgIHZpcnR1YWwgaW50IGRvYWxs b2NhdGUoKTsKCiAgICBpbnQgc2Vla21hcmsoc3RyZWFtbWFya2VyJiBtYXJrLCBpbnQgZGVsdGEg PSAwKTsKICAgIGludCBzcHV0YmFja2MoY2hhciBjKTsKICAgIGludCBzdW5nZXRjKCk7CiAgICBp bnQgdW5idWZmZXJlZCgpIHsgcmV0dXJuIF9mbGFncyAmIDIgID8gMSA6IDA7IH0KICAgIGludCBs aW5lYnVmZmVyZWQoKSB7IHJldHVybiBfZmxhZ3MgJiAweDIwMCAgPyAxIDogMDsgfQogICAgdm9p ZCB1bmJ1ZmZlcmVkKGludCBpKQoJeyBpZiAoaSkgX2ZsYWdzIHw9IDIgOyBlbHNlIF9mbGFncyAm PSB+MiA7IH0KICAgIHZvaWQgbGluZWJ1ZmZlcmVkKGludCBpKQoJeyBpZiAoaSkgX2ZsYWdzIHw9 IDB4MjAwIDsgZWxzZSBfZmxhZ3MgJj0gfjB4MjAwIDsgfQogICAgaW50IGFsbG9jYXRlKCkgeyAg CglpZiAoYmFzZSgpIHx8IHVuYnVmZmVyZWQoKSkgcmV0dXJuIDA7CgllbHNlIHJldHVybiBkb2Fs bG9jYXRlKCk7IH0KICAgICAKICAgIHZvaWQgYWxsb2NidWYoKSB7IGlmIChiYXNlKCkgPT0gX19u dWxsICkgZG9hbGxvY2J1ZigpOyB9CiAgICB2b2lkIGRvYWxsb2NidWYoKTsKICAgIGludCBpbl9h dmFpbCgpIHsgcmV0dXJuIF9JT19yZWFkX2VuZCAtIF9JT19yZWFkX3B0cjsgfQogICAgaW50IG91 dF93YWl0aW5nKCkgeyByZXR1cm4gX0lPX3dyaXRlX3B0ciAtIF9JT193cml0ZV9iYXNlOyB9CiAg ICBzdHJlYW1zaXplIHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbikgeyByZXR1cm4g eHNwdXRuKHMsIG4pOyB9CiAgICBzdHJlYW1zaXplIHBhZG4oY2hhciBwYWQsIHN0cmVhbXNpemUg bikgeyByZXR1cm4gX0lPX3BhZG4odGhpcywgcGFkLCBuKTsgfQogICAgc3RyZWFtc2l6ZSBzZ2V0 bihjaGFyKiBzLCBzdHJlYW1zaXplIG4pIHsgcmV0dXJuIF9JT19zZ2V0bih0aGlzLCBzLCBuKTsg fQogICAgaW50IGlnbm9yZShpbnQpOwogICAgaW50IGdldF9jb2x1bW4oKTsKICAgIGludCBzZXRf Y29sdW1uKGludCk7CiAgICBsb25nIHNnZXRsaW5lKGNoYXIqIGJ1Ziwgc2l6ZV90ICAgbiwgY2hh ciBkZWxpbSwgaW50IHB1dGJhY2tfZGVsaW0pOwogICAgaW50IHNwdXRjKGludCBjKSB7IHJldHVy biBfSU9fcHV0YyhjLCB0aGlzKTsgfQogICAgaW50IHNidW1wYygpIHsgcmV0dXJuIF9JT19nZXRj KHRoaXMpOyB9CiAgICBpbnQgc2dldGMoKSB7IHJldHVybiAoKCAgdGhpcyAgKS0+X0lPX3JlYWRf cHRyID49ICggIHRoaXMgICktPl9JT19yZWFkX2VuZCAmJiBfX3VuZGVyZmxvdyAoICB0aGlzICAp ID09ICgtMSkgID8gKC0xKSAgOiAqKHVuc2lnbmVkIGNoYXIgKikgKCAgdGhpcyAgKS0+X0lPX3Jl YWRfcHRyKSAgOyB9CiAgICBpbnQgc25leHRjKCkgewoJaWYgKF9JT19yZWFkX3B0ciA+PSBfSU9f cmVhZF9lbmQgJiYgX191bmRlcmZsb3codGhpcykgPT0gKC0xKSApCgkgIHJldHVybiAoLTEpIDsK CWVsc2UgcmV0dXJuIF9JT19yZWFkX3B0cisrLCBzZ2V0YygpOyB9CiAgICB2b2lkIHN0b3NzYygp IHsgaWYgKF9JT19yZWFkX3B0ciA8IF9JT19yZWFkX2VuZCkgX0lPX3JlYWRfcHRyKys7IH0KICAg IGludCB2c2NhbihjaGFyIGNvbnN0ICpmbXQwLCBfX2dudWNfdmFfbGlzdCAgYXAsIGlvcyogc3Ry ZWFtID0gX19udWxsICk7CiAgICBpbnQgc2NhbihjaGFyIGNvbnN0ICpmbXQwIC4uLik7CiAgICBp bnQgdmZvcm0oY2hhciBjb25zdCAqZm10MCwgX19nbnVjX3ZhX2xpc3QgIGFwKTsKICAgIGludCBm b3JtKGNoYXIgY29uc3QgKmZtdDAgLi4uKTsKCgoKCiAgICB2aXJ0dWFsIHN0cmVhbXNpemUgc3lz X3JlYWQoY2hhciogYnVmLCBzdHJlYW1zaXplIHNpemUpOwogICAgdmlydHVhbCBzdHJlYW1zaXpl IHN5c193cml0ZShjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZSk7CiAgICB2aXJ0dWFsIHN0cmVhbXBv cyBzeXNfc2VlayhzdHJlYW1vZmYsIF9zZWVrX2Rpcik7CiAgICB2aXJ0dWFsIGludCBzeXNfY2xv c2UoKTsKICAgIHZpcnR1YWwgaW50IHN5c19zdGF0KHZvaWQqKTsgIAoKICAgIHZpcnR1YWwgaW50 IHNob3dtYW55YygpOwogICAgdmlydHVhbCB2b2lkIGltYnVlKHZvaWQgKik7Cgp9OwoKIAogCgpj bGFzcyBmaWxlYnVmIDogcHVibGljIHN0cmVhbWJ1ZiB7CiAgcHJvdGVjdGVkOgogICAgdm9pZCBp bml0KCk7CiAgcHVibGljOgogICAgc3RhdGljIGNvbnN0IGludCBvcGVucHJvdDsgIAogICAgZmls ZWJ1ZigpOwogICAgZmlsZWJ1ZihpbnQgZmQpOwogICAgZmlsZWJ1ZihpbnQgZmQsIGNoYXIqIHAs IGludCBsZW4pOwoKCgogICAgfmZpbGVidWYoKTsKICAgIGZpbGVidWYqIGF0dGFjaChpbnQgZmQp OwogICAgZmlsZWJ1Ziogb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9k ZSk7CiAgICBmaWxlYnVmKiBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpb3M6Om9wZW5tb2Rl IG1vZGUsIGludCBwcm90ID0gMDY2NCk7CiAgICB2aXJ0dWFsIGludCB1bmRlcmZsb3coKTsKICAg IHZpcnR1YWwgaW50IG92ZXJmbG93KGludCBjID0gKC0xKSApOwogICAgaW50IGlzX29wZW4oKSBj b25zdCB7IHJldHVybiBfZmlsZW5vID49IDA7IH0KICAgIGludCBmZCgpIGNvbnN0IHsgcmV0dXJu IGlzX29wZW4oKSA/IF9maWxlbm8gOiAoLTEpIDsgfQogICAgZmlsZWJ1ZiogY2xvc2UoKTsKICAg IHZpcnR1YWwgaW50IGRvYWxsb2NhdGUoKTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHNlZWtvZmYo c3RyZWFtb2ZmLCBfc2Vla19kaXIsIGludCBtb2RlPWlvczo6aW58aW9zOjpvdXQpOwogICAgdmly dHVhbCBzdHJlYW1idWYqIHNldGJ1ZihjaGFyKiBwLCBpbnQgbGVuKTsKICAgIHN0cmVhbXNpemUg eHNwdXRuKGNvbnN0IGNoYXIqIHMsIHN0cmVhbXNpemUgbik7CiAgICBzdHJlYW1zaXplIHhzZ2V0 bihjaGFyKiBzLCBzdHJlYW1zaXplIG4pOwogICAgdmlydHVhbCBpbnQgc3luYygpOwogIHByb3Rl Y3RlZDogIAogCiAgICBpbnQgaXNfcmVhZGluZygpIHsgcmV0dXJuIGViYWNrKCkgIT0gZWdwdHIo KTsgfQogICAgY2hhciogY3VyX3B0cigpIHsgcmV0dXJuIGlzX3JlYWRpbmcoKSA/ICBncHRyKCkg OiBwcHRyKCk7IH0KICAgICAKICAgIGNoYXIqIGZpbGVfcHRyKCkgeyByZXR1cm4gZUdwdHIoKTsg fQogICAgIAogICAgdmlydHVhbCBzdHJlYW1zaXplIHN5c19yZWFkKGNoYXIqIGJ1Ziwgc3RyZWFt c2l6ZSBzaXplKTsKICAgIHZpcnR1YWwgc3RyZWFtcG9zIHN5c19zZWVrKHN0cmVhbW9mZiwgX3Nl ZWtfZGlyKTsKICAgIHZpcnR1YWwgc3RyZWFtc2l6ZSBzeXNfd3JpdGUoY29uc3QgY2hhciosIHN0 cmVhbXNpemUpOwogICAgdmlydHVhbCBpbnQgc3lzX3N0YXQodm9pZCopOyAgCiAgICB2aXJ0dWFs IGludCBzeXNfY2xvc2UoKTsKCgoKCn07CgppbmxpbmUgdm9pZCBpb3M6OmluaXQoc3RyZWFtYnVm KiBzYiwgb3N0cmVhbSogdGllX3RvKSB7CgkJX3N0YXRlID0gc2IgPyBpb3M6Omdvb2RiaXQgOiBp b3M6OmJhZGJpdDsgX2V4Y2VwdGlvbnM9MDsKCQlfc3RyYnVmPXNiOyBfdGllID0gdGllX3RvOyBf d2lkdGg9MDsgX2ZpbGw9JyAnOwoKCQlfZmxhZ3M9aW9zOjpza2lwd3N8aW9zOjpkZWM7CgoKCgkJ X3ByZWNpc2lvbj02OyBfYXJyYXlzID0gMDsgfQoKaW5saW5lIGlvczo6aW9zKHN0cmVhbWJ1Ziog c2IsIG9zdHJlYW0qIHRpZV90bykgeyBpbml0KHNiLCB0aWVfdG8pOyB9CgppbmxpbmUgaW9zOjp+ aW9zKCkgewoKCgogICAgIAogICAgIAogICAgb3BlcmF0b3IgZGVsZXRlW10gKF9hcnJheXMpOwp9 Cn0gIAoKIyAzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8u Li8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2lvc3RyZWFtLmgiIDIgMwoKCmV4dGVybiAiQysrIiB7 CmNsYXNzIGlzdHJlYW07IGNsYXNzIG9zdHJlYW07CnR5cGVkZWYgaW9zJiAoKl9fbWFuaXApKGlv cyYpOwp0eXBlZGVmIGlzdHJlYW0mICgqX19pbWFuaXApKGlzdHJlYW0mKTsKdHlwZWRlZiBvc3Ry ZWFtJiAoKl9fb21hbmlwKShvc3RyZWFtJik7CgpleHRlcm4gaXN0cmVhbSYgd3MoaXN0cmVhbSYg aW5zKTsKZXh0ZXJuIG9zdHJlYW0mIGZsdXNoKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVh bSYgZW5kbChvc3RyZWFtJiBvdXRzKTsKZXh0ZXJuIG9zdHJlYW0mIGVuZHMob3N0cmVhbSYgb3V0 cyk7CgpjbGFzcyBvc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAgICAKICAgIHZvaWQg ZG9fb3NmeCgpOwogIHB1YmxpYzoKICAgIG9zdHJlYW0oKSB7IH0KICAgIG9zdHJlYW0oc3RyZWFt YnVmKiBzYiwgb3N0cmVhbSogdGllZD0gX19udWxsICk7CiAgICBpbnQgb3BmeCgpIHsKCWlmICgh Z29vZCgpKSByZXR1cm4gMDsKCWVsc2UgeyBpZiAoX3RpZSkgX3RpZS0+Zmx1c2goKTsgIDsgcmV0 dXJuIDE7fSB9CiAgICB2b2lkIG9zZngoKSB7ICA7CgkJICBpZiAoZmxhZ3MoKSAmIChpb3M6OnVu aXRidWZ8aW9zOjpzdGRpbykpCgkJICAgICAgZG9fb3NmeCgpOyB9CiAgICBvc3RyZWFtJiBmbHVz aCgpOwogICAgb3N0cmVhbSYgcHV0KGNoYXIgYykgeyBfc3RyYnVmLT5zcHV0YyhjKTsgcmV0dXJu ICp0aGlzOyB9CgoKCgoKICAgIG9zdHJlYW0mIHdyaXRlKGNvbnN0IGNoYXIgKnMsIHN0cmVhbXNp emUgbik7CiAgICBvc3RyZWFtJiB3cml0ZShjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBzdHJlYW1z aXplIG4pCiAgICAgIHsgcmV0dXJuIHdyaXRlKChjb25zdCBjaGFyKilzLCBuKTt9CiAgICBvc3Ry ZWFtJiB3cml0ZShjb25zdCBzaWduZWQgY2hhciAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJl dHVybiB3cml0ZSgoY29uc3QgY2hhciopcywgbik7fQogICAgb3N0cmVhbSYgd3JpdGUoY29uc3Qg dm9pZCAqcywgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiB3cml0ZSgoY29uc3QgY2hhciop cywgbik7fQogICAgb3N0cmVhbSYgc2Vla3Aoc3RyZWFtcG9zKTsKICAgIG9zdHJlYW0mIHNlZWtw KHN0cmVhbW9mZiwgX3NlZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxscCgpOwogICAgb3N0cmVh bSYgZm9ybShjb25zdCBjaGFyICpmb3JtYXQgLi4uKTsKICAgIG9zdHJlYW0mIHZmb3JtKGNvbnN0 IGNoYXIgKmZvcm1hdCwgX19nbnVjX3ZhX2xpc3QgIGFyZ3MpOwoKICAgIG9zdHJlYW0mIG9wZXJh dG9yPDwoY2hhciBjKTsKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgY2hhciBjKSB7 IHJldHVybiAoKnRoaXMpIDw8IChjaGFyKWM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc2ln bmVkIGNoYXIgYykgeyByZXR1cm4gKCp0aGlzKSA8PCAoY2hhciljOyB9CiAgICBvc3RyZWFtJiBv cGVyYXRvcjw8KGNvbnN0IGNoYXIgKnMpOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCB1 bnNpZ25lZCBjaGFyICpzKQoJeyByZXR1cm4gKCp0aGlzKSA8PCAoY29uc3QgY2hhciopczsgfQog ICAgb3N0cmVhbSYgb3BlcmF0b3I8PChjb25zdCBzaWduZWQgY2hhciAqcykKCXsgcmV0dXJuICgq dGhpcykgPDwgKGNvbnN0IGNoYXIqKXM7IH0KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoY29uc3Qg dm9pZCAqcCk7CiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGludCBuKTsKICAgIG9zdHJlYW0mIG9w ZXJhdG9yPDwodW5zaWduZWQgaW50IG4pOwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIG4p OwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIG4pOwoKICAgIF9fZXh0ZW5z aW9uX18gb3N0cmVhbSYgb3BlcmF0b3I8PChsb25nIGxvbmcgbik7CiAgICBfX2V4dGVuc2lvbl9f IG9zdHJlYW0mIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyBsb25nIG4pOwoKICAgIG9zdHJlYW0m IG9wZXJhdG9yPDwoc2hvcnQgbikge3JldHVybiBvcGVyYXRvcjw8KChpbnQpbik7fQogICAgb3N0 cmVhbSYgb3BlcmF0b3I8PCh1bnNpZ25lZCBzaG9ydCBuKSB7cmV0dXJuIG9wZXJhdG9yPDwoKHVu c2lnbmVkIGludCluKTt9CgogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChib29sIGIpIHsgcmV0dXJu IG9wZXJhdG9yPDwoKGludCliKTsgfQoKICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoZG91YmxlIG4p OwogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChmbG9hdCBuKSB7IHJldHVybiBvcGVyYXRvcjw8KChk b3VibGUpbik7IH0KCiAgICBvc3RyZWFtJiBvcGVyYXRvcjw8KGxvbmcgZG91YmxlIG4pOwoKCgog ICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX29tYW5pcCBmdW5jKSB7IHJldHVybiAoKmZ1bmMpKCp0 aGlzKTsgfQogICAgb3N0cmVhbSYgb3BlcmF0b3I8PChfX21hbmlwIGZ1bmMpIHsoKmZ1bmMpKCp0 aGlzKTsgcmV0dXJuICp0aGlzO30KICAgIG9zdHJlYW0mIG9wZXJhdG9yPDwoc3RyZWFtYnVmKik7 CgoKCn07CgpjbGFzcyBpc3RyZWFtIDogdmlydHVhbCBwdWJsaWMgaW9zCnsKICAgICAKcHJvdGVj dGVkOgogICAgc2l6ZV90ICAgX2djb3VudDsKCiAgICBpbnQgX3NraXBfd3MoKTsKICBwdWJsaWM6 CiAgICBpc3RyZWFtKCk6IF9nY291bnQgKDApIHsgfQogICAgaXN0cmVhbShzdHJlYW1idWYqIHNi LCBvc3RyZWFtKnRpZWQ9IF9fbnVsbCApOwogICAgaXN0cmVhbSYgZ2V0KGNoYXIqIHB0ciwgaW50 IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAgaXN0cmVhbSYgZ2V0KHVuc2lnbmVkIGNoYXIq IHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpCgl7IHJldHVybiBnZXQoKGNoYXIqKXB0 ciwgbGVuLCBkZWxpbSk7IH0KICAgIGlzdHJlYW0mIGdldChjaGFyJiBjKTsKICAgIGlzdHJlYW0m IGdldCh1bnNpZ25lZCBjaGFyJiBjKSB7IHJldHVybiBnZXQoKGNoYXImKWMpOyB9CiAgICBpc3Ry ZWFtJiBnZXRsaW5lKGNoYXIqIHB0ciwgaW50IGxlbiwgY2hhciBkZWxpbSA9ICdcbicpOwogICAg aXN0cmVhbSYgZ2V0bGluZSh1bnNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0g PSAnXG4nKQoJeyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAg aXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyJiBjKSAgeyByZXR1cm4gZ2V0KChjaGFyJiljKTsgfQog ICAgaXN0cmVhbSYgZ2V0KHNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAn XG4nKQoJeyByZXR1cm4gZ2V0KChjaGFyKilwdHIsIGxlbiwgZGVsaW0pOyB9CiAgICBpc3RyZWFt JiBnZXRsaW5lKHNpZ25lZCBjaGFyKiBwdHIsIGludCBsZW4sIGNoYXIgZGVsaW0gPSAnXG4nKQoJ eyByZXR1cm4gZ2V0bGluZSgoY2hhciopcHRyLCBsZW4sIGRlbGltKTsgfQogICAgaXN0cmVhbSYg cmVhZChjaGFyICpwdHIsIHN0cmVhbXNpemUgbik7CiAgICBpc3RyZWFtJiByZWFkKHVuc2lnbmVk IGNoYXIgKnB0ciwgc3RyZWFtc2l6ZSBuKQogICAgICB7IHJldHVybiByZWFkKChjaGFyKilwdHIs IG4pOyB9CiAgICBpc3RyZWFtJiByZWFkKHNpZ25lZCBjaGFyICpwdHIsIHN0cmVhbXNpemUgbikK ICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBuKTsgfQogICAgaXN0cmVhbSYgcmVhZCh2 b2lkICpwdHIsIHN0cmVhbXNpemUgbikKICAgICAgeyByZXR1cm4gcmVhZCgoY2hhciopcHRyLCBu KTsgfQogICAgaXN0cmVhbSYgZ2V0KHN0cmVhbWJ1ZiYgc2IsIGNoYXIgZGVsaW0gPSAnXG4nKTsK ICAgIGlzdHJlYW0mIGdldHMoY2hhciAqKnMsIGNoYXIgZGVsaW0gPSAnXG4nKTsKICAgIGludCBp cGZ4KGludCBuZWVkID0gMCkgewoJaWYgKCFnb29kKCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJl dHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYgKF90aWUgJiYgKG5lZWQgPT0gMCB8fCByZGJ1 ZigpLT5pbl9hdmFpbCgpIDwgbmVlZCkpIF90aWUtPmZsdXNoKCk7CgkgIGlmICghbmVlZCAmJiAo ZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSkgcmV0dXJuIF9za2lwX3dzKCk7CgkgIGVsc2UgcmV0dXJu IDE7Cgl9CiAgICB9CiAgICBpbnQgaXBmeDAoKSB7ICAKCWlmICghZ29vZCgpKSB7IHNldChpb3M6 OmZhaWxiaXQpOyByZXR1cm4gMDsgfQoJZWxzZSB7CgkgICA7CgkgIGlmIChfdGllKSBfdGllLT5m bHVzaCgpOwoJICBpZiAoZmxhZ3MoKSAmIGlvczo6c2tpcHdzKSByZXR1cm4gX3NraXBfd3MoKTsK CSAgZWxzZSByZXR1cm4gMTsKCX0KICAgIH0KICAgIGludCBpcGZ4MSgpIHsgIAoJaWYgKCFnb29k KCkpIHsgc2V0KGlvczo6ZmFpbGJpdCk7IHJldHVybiAwOyB9CgllbHNlIHsKCSAgIDsKCSAgaWYg KF90aWUgJiYgcmRidWYoKS0+aW5fYXZhaWwoKSA9PSAwKSBfdGllLT5mbHVzaCgpOwoJICByZXR1 cm4gMTsKCX0KICAgIH0KICAgIHZvaWQgaXNmeCgpIHsgIDsgfQogICAgaW50IGdldCgpIHsgaWYg KCFpcGZ4MSgpKSByZXR1cm4gKC0xKSA7CgkJZWxzZSB7IGludCBjaCA9IF9zdHJidWYtPnNidW1w YygpOwoJCSAgICAgICBpZiAoY2ggPT0gKC0xKSApIHNldChpb3M6OmVvZmJpdCk7CgkJICAgICAg IGlzZngoKTsKCQkgICAgICAgcmV0dXJuIGNoOwoJCSAgICAgfSB9CiAgICBpbnQgcGVlaygpOwog ICAgc2l6ZV90ICAgZ2NvdW50KCkgeyByZXR1cm4gX2djb3VudDsgfQogICAgaXN0cmVhbSYgaWdu b3JlKGludCBuPTEsIGludCBkZWxpbSA9ICgtMSkgKTsKICAgIGludCBzeW5jICgpOwogICAgaXN0 cmVhbSYgc2Vla2coc3RyZWFtcG9zKTsKICAgIGlzdHJlYW0mIHNlZWtnKHN0cmVhbW9mZiwgX3Nl ZWtfZGlyKTsKICAgIHN0cmVhbXBvcyB0ZWxsZygpOwogICAgaXN0cmVhbSYgcHV0YmFjayhjaGFy IGNoKSB7CglpZiAoZ29vZCgpICYmIF9zdHJidWYtPnNwdXRiYWNrYyhjaCkgPT0gKC0xKSApIGNs ZWFyKGlvczo6YmFkYml0KTsKCXJldHVybiAqdGhpczt9CiAgICBpc3RyZWFtJiB1bmdldCgpIHsK CWlmIChnb29kKCkgJiYgX3N0cmJ1Zi0+c3VuZ2V0YygpID09ICgtMSkgKSBjbGVhcihpb3M6OmJh ZGJpdCk7CglyZXR1cm4gKnRoaXM7fQogICAgaXN0cmVhbSYgc2Nhbihjb25zdCBjaGFyICpmb3Jt YXQgLi4uKTsKICAgIGlzdHJlYW0mIHZzY2FuKGNvbnN0IGNoYXIgKmZvcm1hdCwgX19nbnVjX3Zh X2xpc3QgIGFyZ3MpOwoKCgoKCgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihjaGFyKik7CiAgICBp c3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGNoYXIqIHApIHsgcmV0dXJuIG9wZXJhdG9yPj4o KGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHNpZ25lZCBjaGFyKnApIHsgcmV0 dXJuIG9wZXJhdG9yPj4oKGNoYXIqKXApOyB9CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KGNoYXIm IGMpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBjaGFyJiBjKSB7cmV0dXJuIG9w ZXJhdG9yPj4oKGNoYXImKWMpO30KICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4oc2lnbmVkIGNoYXIm IGMpIHtyZXR1cm4gb3BlcmF0b3I+PigoY2hhciYpYyk7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+ PihpbnQmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyYpOwoKICAgIF9fZXh0ZW5zaW9u X18gaXN0cmVhbSYgb3BlcmF0b3I+Pihsb25nIGxvbmcmKTsKICAgIF9fZXh0ZW5zaW9uX18gaXN0 cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nIGxvbmcmKTsKCiAgICBpc3RyZWFtJiBvcGVy YXRvcj4+KHNob3J0Jik7CiAgICBpc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIGludCYpOwog ICAgaXN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCBsb25nJik7CiAgICBpc3RyZWFtJiBvcGVy YXRvcj4+KHVuc2lnbmVkIHNob3J0Jik7CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+Pihib29sJik7 CgogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihmbG9hdCYpOwogICAgaXN0cmVhbSYgb3BlcmF0b3I+ Pihkb3VibGUmKTsKICAgIGlzdHJlYW0mIG9wZXJhdG9yPj4obG9uZyBkb3VibGUmKTsKICAgIGlz dHJlYW0mIG9wZXJhdG9yPj4oIF9fbWFuaXAgZnVuYykgeygqZnVuYykoKnRoaXMpOyByZXR1cm4g KnRoaXM7fQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihfX2ltYW5pcCBmdW5jKSB7IHJldHVybiAo KmZ1bmMpKCp0aGlzKTsgfQogICAgaXN0cmVhbSYgb3BlcmF0b3I+PihzdHJlYW1idWYqKTsKfTsK CmNsYXNzIGlvc3RyZWFtIDogcHVibGljIGlzdHJlYW0sIHB1YmxpYyBvc3RyZWFtCnsKICBwdWJs aWM6CiAgICBpb3N0cmVhbSgpIHsgfQogICAgaW9zdHJlYW0oc3RyZWFtYnVmKiBzYiwgb3N0cmVh bSp0aWVkPSBfX251bGwgKTsKfTsKCmNsYXNzIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24gOiBwdWJs aWMgaXN0cmVhbSB7CnB1YmxpYzoKICBfSU9faXN0cmVhbV93aXRoYXNzaWduJiBvcGVyYXRvcj0o aXN0cmVhbSYpOwogIF9JT19pc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShfSU9faXN0cmVh bV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRpY19jYXN0PGlz dHJlYW0mPiAocmhzKSk7IH0KfTsKCmNsYXNzIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24gOiBwdWJs aWMgb3N0cmVhbSB7CnB1YmxpYzoKICBfSU9fb3N0cmVhbV93aXRoYXNzaWduJiBvcGVyYXRvcj0o b3N0cmVhbSYpOwogIF9JT19vc3RyZWFtX3dpdGhhc3NpZ24mIG9wZXJhdG9yPShfSU9fb3N0cmVh bV93aXRoYXNzaWduJiByaHMpCiAgICB7IHJldHVybiBvcGVyYXRvcj0gKHN0YXRpY19jYXN0PG9z dHJlYW0mPiAocmhzKSk7IH0KfTsKCmV4dGVybiBfSU9faXN0cmVhbV93aXRoYXNzaWduIGNpbjsK IApleHRlcm4gX0lPX29zdHJlYW1fd2l0aGFzc2lnbiBjb3V0LCBjZXJyOwoKZXh0ZXJuIF9JT19v c3RyZWFtX3dpdGhhc3NpZ24gY2xvZwoKCgo7CgpleHRlcm4gaXN0cmVhbSYgbG9jayhpc3RyZWFt JiBpbnMpOwpleHRlcm4gaXN0cmVhbSYgdW5sb2NrKGlzdHJlYW0mIGlucyk7CmV4dGVybiBvc3Ry ZWFtJiBsb2NrKG9zdHJlYW0mIG91dHMpOwpleHRlcm4gb3N0cmVhbSYgdW5sb2NrKG9zdHJlYW0m IG91dHMpOwoKc3RydWN0IElvc3RyZWFtX2luaXQgeyB9IDsgICAKCmlubGluZSBpb3MmIGRlYyhp b3MmIGkpCnsgaS5zZXRmKGlvczo6ZGVjLCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJl dHVybiBpOyB9CmlubGluZSBpb3MmIGhleChpb3MmIGkpCnsgaS5zZXRmKGlvczo6aGV4LCBpb3M6 OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVybiBpOyB9CmlubGluZSBpb3MmIG9jdChpb3Mm IGkpCnsgaS5zZXRmKGlvczo6b2N0LCBpb3M6OmRlY3xpb3M6OmhleHxpb3M6Om9jdCk7IHJldHVy biBpOyB9Cn0gIAoKCiMgNTMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8y Ljk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxnb2Jhc2UuaCIgMiAzCgoKCiMg MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8u Li9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKIAoKCgoKCgogCgpzdHJ1Y3QgaW5wdXRfaXRlcmF0b3JfdGFnIHt9OwpzdHJ1Y3Qgb3V0 cHV0X2l0ZXJhdG9yX3RhZyB7fTsKc3RydWN0IGZvcndhcmRfaXRlcmF0b3JfdGFnIDogcHVibGlj IGlucHV0X2l0ZXJhdG9yX3RhZyB7fTsKc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFn IDogcHVibGljIGZvcndhcmRfaXRlcmF0b3JfdGFnIHt9OwpzdHJ1Y3QgcmFuZG9tX2FjY2Vzc19p dGVyYXRvcl90YWcgOiBwdWJsaWMgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcge307CgogCiAK IAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfRGlzdGFuY2U+IHN0cnVjdCBpbnB1dF9p dGVyYXRvciB7CiAgdHlwZWRlZiBpbnB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7 CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIF9EaXN0 YW5jZSAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqICAgICAgICAgICAg ICAgcG9pbnRlcjsKICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICByZWZlcmVuY2U7Cn07Cgpz dHJ1Y3Qgb3V0cHV0X2l0ZXJhdG9yIHsKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRl cmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7 CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVm IHZvaWQgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAg ICAgcmVmZXJlbmNlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0Rpc3RhbmNlPiBz dHJ1Y3QgZm9yd2FyZF9pdGVyYXRvciB7CiAgdHlwZWRlZiBmb3J3YXJkX2l0ZXJhdG9yX3RhZyBp dGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgIHZhbHVlX3R5 cGU7CiAgdHlwZWRlZiBfRGlzdGFuY2UgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlw ZWRlZiBfVHAqICAgICAgICAgICAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICAg ICAgICAgICAgcmVmZXJlbmNlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0 YW5jZT4gc3RydWN0IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3IgewogIHR5cGVkZWYgYmlkaXJlY3Rp b25hbF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAg ICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX0Rpc3RhbmNlICAgICAgICAg ICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAg ICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgIHJlZmVy ZW5jZTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4gc3RydWN0IHJh bmRvbV9hY2Nlc3NfaXRlcmF0b3IgewogIHR5cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90 YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAg ICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX0Rpc3RhbmNlICAgICAgICAgICAgICAgICAgZGlmZmVy ZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsK ICB0eXBlZGVmIF9UcCYgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKfTsKCiMgOTgg Ii91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4v aW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3IuaCIgMwoKCgoKdGVtcGxhdGUgPGNsYXNzIF9JdGVy YXRvcj4Kc3RydWN0IGl0ZXJhdG9yX3RyYWl0cyB7CiAgdHlwZWRlZiB0eXBlbmFtZSBfSXRlcmF0 b3I6Oml0ZXJhdG9yX2NhdGVnb3J5IGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdHlwZW5h bWUgX0l0ZXJhdG9yOjp2YWx1ZV90eXBlICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgdHlw ZW5hbWUgX0l0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGUgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlw ZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnBvaW50ZXIgICAgICAgICAgIHBvaW50ZXI7CiAgdHlw ZWRlZiB0eXBlbmFtZSBfSXRlcmF0b3I6OnJlZmVyZW5jZSAgICAgICAgIHJlZmVyZW5jZTsKfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBpdGVyYXRvcl90cmFpdHM8X1RwKj4gewogIHR5 cGVkZWYgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlw ZWRlZiBfVHAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIHB0 cmRpZmZfdCAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAq ICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIF9UcCYgICAgICAgICAg ICAgICAgICAgICAgICByZWZlcmVuY2U7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3Qg aXRlcmF0b3JfdHJhaXRzPGNvbnN0IF9UcCo+IHsKICB0eXBlZGVmIHJhbmRvbV9hY2Nlc3NfaXRl cmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAg ICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAg ICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgY29uc3QgX1RwKiAgICAgICAgICAgICAgICAg IHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAgICAgICAgICAgcmVmZXJlbmNl Owp9OwoKIAogCiAKIAoKIAoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUg aXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkKX19pdGVyYXRvcl9jYXRl Z29yeShjb25zdCBfSXRlciYpCnsKICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxf SXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRlZ29yeTsKICByZXR1cm4gX0NhdGVnb3J5KCk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KaW5saW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0 czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSoKX19kaXN0YW5jZV90eXBlKGNvbnN0IF9JdGVyJikK ewogIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXI+Ojpk aWZmZXJlbmNlX3R5cGUqPigwKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JdGVyPgppbmxpbmUgdHlw ZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFsdWVfdHlwZSoKX192YWx1ZV90eXBlKGNv bnN0IF9JdGVyJikKewogIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBpdGVyYXRvcl90cmFp dHM8X0l0ZXI+Ojp2YWx1ZV90eXBlKj4oMCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KaW5s aW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfSXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5Cml0 ZXJhdG9yX2NhdGVnb3J5KGNvbnN0IF9JdGVyJiBfX2kpIHsgcmV0dXJuIF9faXRlcmF0b3JfY2F0 ZWdvcnkoX19pKTsgfQoKCnRlbXBsYXRlIDxjbGFzcyBfSXRlcj4KaW5saW5lIHR5cGVuYW1lIGl0 ZXJhdG9yX3RyYWl0czxfSXRlcj46OmRpZmZlcmVuY2VfdHlwZSoKZGlzdGFuY2VfdHlwZShjb25z dCBfSXRlciYgX19pKSB7IHJldHVybiBfX2Rpc3RhbmNlX3R5cGUoX19pKTsgfQoKdGVtcGxhdGUg PGNsYXNzIF9JdGVyPgppbmxpbmUgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyPjo6dmFs dWVfdHlwZSoKdmFsdWVfdHlwZShjb25zdCBfSXRlciYgX19pKSB7IHJldHVybiBfX3ZhbHVlX3R5 cGUoX19pKTsgfQoKCgoKCiMgMjU5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZv aWQgX19kaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlJiBfX24sIGlucHV0X2l0ZXJhdG9y X3RhZykKewogIHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgeyArK19fZmlyc3Q7ICsrX19uOyB9 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5j ZT4KaW5saW5lIHZvaWQgX19kaXN0YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwg CiAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwgCiAg ICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlJiBfX24sIHJhbmRvbV9hY2Nlc3NfaXRlcmF0 b3JfdGFnKQp7CiAgX19uICs9IF9fbGFzdCAtIF9fZmlyc3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBf SW5wdXRJdGVyYXRvciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9pZCBkaXN0YW5jZShfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3Ig X19sYXN0LCBfRGlzdGFuY2UmIF9fbikKewogIF9fZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBf X24sIGl0ZXJhdG9yX2NhdGVnb3J5KF9fZmlyc3QpKTsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lu cHV0SXRlcmF0b3I+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcmF0 b3I+OjpkaWZmZXJlbmNlX3R5cGUKX19kaXN0YW5jZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBf SW5wdXRJdGVyYXRvciBfX2xhc3QsIGlucHV0X2l0ZXJhdG9yX3RhZykKewogIHR5cGVuYW1lIGl0 ZXJhdG9yX3RyYWl0czxfSW5wdXRJdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24gPSAwOwog IHdoaWxlIChfX2ZpcnN0ICE9IF9fbGFzdCkgewogICAgKytfX2ZpcnN0OyArK19fbjsKICB9CiAg cmV0dXJuIF9fbjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9SYW5kb21BY2Nlc3NJdGVyYXRvcj4KaW5s aW5lIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfUmFuZG9tQWNjZXNzSXRlcmF0b3I+OjpkaWZm ZXJlbmNlX3R5cGUKX19kaXN0YW5jZShfUmFuZG9tQWNjZXNzSXRlcmF0b3IgX19maXJzdCwgX1Jh bmRvbUFjY2Vzc0l0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJh dG9yX3RhZykgewogIHJldHVybiBfX2xhc3QgLSBfX2ZpcnN0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0lucHV0SXRlcmF0b3I+CmlubGluZSB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRl cmF0b3I+OjpkaWZmZXJlbmNlX3R5cGUKZGlzdGFuY2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwg X0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CiAgdHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFp dHM8X0lucHV0SXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSAKICAgIF9DYXRlZ29yeTsKICBy ZXR1cm4gX19kaXN0YW5jZShfX2ZpcnN0LCBfX2xhc3QsIF9DYXRlZ29yeSgpKTsKfQoKCgp0ZW1w bGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgdm9pZCBfX2Fk dmFuY2UoX0lucHV0SXRlciYgX19pLCBfRGlzdGFuY2UgX19uLCBpbnB1dF9pdGVyYXRvcl90YWcp IHsKICB3aGlsZSAoX19uLS0pICsrX19pOwp9CgoKCgoKdGVtcGxhdGUgPGNsYXNzIF9CaWRpcmVj dGlvbmFsSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIHZvaWQgX19hZHZhbmNlKF9C aWRpcmVjdGlvbmFsSXRlcmF0b3ImIF9faSwgX0Rpc3RhbmNlIF9fbiwgCiAgICAgICAgICAgICAg ICAgICAgICBiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZykgewogIGlmIChfX24gPj0gMCkKICAg IHdoaWxlIChfX24tLSkgKytfX2k7CiAgZWxzZQogICAgd2hpbGUgKF9fbisrKSAtLV9faTsKfQoK CgoKCnRlbXBsYXRlIDxjbGFzcyBfUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIF9EaXN0YW5j ZT4KaW5saW5lIHZvaWQgX19hZHZhbmNlKF9SYW5kb21BY2Nlc3NJdGVyYXRvciYgX19pLCBfRGlz dGFuY2UgX19uLCAKICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3Jf dGFnKSB7CiAgX19pICs9IF9fbjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yLCBj bGFzcyBfRGlzdGFuY2U+CmlubGluZSB2b2lkIGFkdmFuY2UoX0lucHV0SXRlcmF0b3ImIF9faSwg X0Rpc3RhbmNlIF9fbikgewogIF9fYWR2YW5jZShfX2ksIF9fbiwgaXRlcmF0b3JfY2F0ZWdvcnko X19pKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgpjbGFzcyBiYWNrX2luc2VydF9p dGVyYXRvciB7CnByb3RlY3RlZDoKICBfQ29udGFpbmVyKiBjb250YWluZXI7CnB1YmxpYzoKICB0 eXBlZGVmIF9Db250YWluZXIgICAgICAgICAgY29udGFpbmVyX3R5cGU7CiAgdHlwZWRlZiBvdXRw dXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgdm9pZCAgICAgICAg ICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJl bmNlX3R5cGU7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRl ZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsKCiAgZXhwbGljaXQgYmFja19pbnNlcnRf aXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRhaW5lcigmX194KSB7fQogIGJhY2tfaW5z ZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JgogIG9wZXJhdG9yPShjb25zdCB0eXBlbmFtZSBfQ29u dGFpbmVyOjp2YWx1ZV90eXBlJiBfX3ZhbHVlKSB7IAogICAgY29udGFpbmVyLT5wdXNoX2JhY2so X192YWx1ZSk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPF9D b250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQogIGJhY2tfaW5zZXJ0X2l0 ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvcisrKCkgeyByZXR1cm4gKnRoaXM7IH0KICBiYWNr X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQpIHsgcmV0dXJuICp0 aGlzOyB9Cn07CgojIDM3OCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5oIiAzCgoKdGVtcGxh dGUgPGNsYXNzIF9Db250YWluZXI+CmlubGluZSBiYWNrX2luc2VydF9pdGVyYXRvcjxfQ29udGFp bmVyPiBiYWNrX2luc2VydGVyKF9Db250YWluZXImIF9feCkgewogIHJldHVybiBiYWNrX2luc2Vy dF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5l cj4KY2xhc3MgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yIHsKcHJvdGVjdGVkOgogIF9Db250YWluZXIq IGNvbnRhaW5lcjsKcHVibGljOgogIHR5cGVkZWYgX0NvbnRhaW5lciAgICAgICAgICBjb250YWlu ZXJfdHlwZTsKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7 CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2b2lk ICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAg ICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwoK ICBleHBsaWNpdCBmcm9udF9pbnNlcnRfaXRlcmF0b3IoX0NvbnRhaW5lciYgX194KSA6IGNvbnRh aW5lcigmX194KSB7fQogIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYKICBvcGVy YXRvcj0oY29uc3QgdHlwZW5hbWUgX0NvbnRhaW5lcjo6dmFsdWVfdHlwZSYgX192YWx1ZSkgeyAK ICAgIGNvbnRhaW5lci0+cHVzaF9mcm9udChfX3ZhbHVlKTsKICAgIHJldHVybiAqdGhpczsKICB9 CiAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+JiBvcGVyYXRvciooKSB7IHJldHVy biAqdGhpczsgfQogIGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3Ir KygpIHsgcmV0dXJuICp0aGlzOyB9CiAgZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+ JiBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KfTsKCiMgNDE3ICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0NvbnRhaW5lcj4KaW5saW5l IGZyb250X2luc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiBmcm9udF9pbnNlcnRlcihfQ29udGFp bmVyJiBfX3gpIHsKICByZXR1cm4gZnJvbnRfaW5zZXJ0X2l0ZXJhdG9yPF9Db250YWluZXI+KF9f eCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfQ29udGFpbmVyPgpjbGFzcyBpbnNlcnRfaXRlcmF0b3Ig ewpwcm90ZWN0ZWQ6CiAgX0NvbnRhaW5lciogY29udGFpbmVyOwogIHR5cGVuYW1lIF9Db250YWlu ZXI6Oml0ZXJhdG9yIGl0ZXI7CnB1YmxpYzoKICB0eXBlZGVmIF9Db250YWluZXIgICAgICAgICAg Y29udGFpbmVyX3R5cGU7CiAgdHlwZWRlZiBvdXRwdXRfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2Nh dGVnb3J5OwogIHR5cGVkZWYgdm9pZCAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwogIHR5cGVk ZWYgdm9pZCAgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiB2b2lkICAg ICAgICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiB2b2lkICAgICAgICAgICAgICAgIHJlZmVy ZW5jZTsKCiAgaW5zZXJ0X2l0ZXJhdG9yKF9Db250YWluZXImIF9feCwgdHlwZW5hbWUgX0NvbnRh aW5lcjo6aXRlcmF0b3IgX19pKSAKICAgIDogY29udGFpbmVyKCZfX3gpLCBpdGVyKF9faSkge30K ICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mCiAgb3BlcmF0b3I9KGNvbnN0IHR5cGVuYW1l IF9Db250YWluZXI6OnZhbHVlX3R5cGUmIF9fdmFsdWUpIHsgCiAgICBpdGVyID0gY29udGFpbmVy LT5pbnNlcnQoaXRlciwgX192YWx1ZSk7CiAgICArK2l0ZXI7CiAgICByZXR1cm4gKnRoaXM7CiAg fQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnRo aXM7IH0KICBpbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4mIG9wZXJhdG9yKysoKSB7IHJldHVy biAqdGhpczsgfQogIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPiYgb3BlcmF0b3IrKyhpbnQp IHsgcmV0dXJuICp0aGlzOyB9Cn07CgojIDQ1OSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRy YWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRvci5o IiAzCgoKdGVtcGxhdGUgPGNsYXNzIF9Db250YWluZXIsIGNsYXNzIF9JdGVyYXRvcj4KaW5saW5l IAppbnNlcnRfaXRlcmF0b3I8X0NvbnRhaW5lcj4gaW5zZXJ0ZXIoX0NvbnRhaW5lciYgX194LCBf SXRlcmF0b3IgX19pKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfQ29udGFpbmVyOjppdGVyYXRvciBf X2l0ZXI7CiAgcmV0dXJuIGluc2VydF9pdGVyYXRvcjxfQ29udGFpbmVyPihfX3gsIF9faXRlcihf X2kpKTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yLCBjbGFzcyBf VHAsIGNsYXNzIF9SZWZlcmVuY2UgPSBfVHAmLCAKICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZSA9 IHB0cmRpZmZfdD4gCgoKCgpjbGFzcyByZXZlcnNlX2JpZGlyZWN0aW9uYWxfaXRlcmF0b3Igewog IHR5cGVkZWYgcmV2ZXJzZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaWRpcmVjdGlvbmFsSXRl cmF0b3IsIF9UcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1Jl ZmVyZW5jZSwgX0Rpc3RhbmNlPiAgX1NlbGY7CnByb3RlY3RlZDoKICBfQmlkaXJlY3Rpb25hbEl0 ZXJhdG9yIGN1cnJlbnQ7CnB1YmxpYzoKICB0eXBlZGVmIGJpZGlyZWN0aW9uYWxfaXRlcmF0b3Jf dGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgICAg ICAgdmFsdWVfdHlwZTsKICB0eXBlZGVmIF9EaXN0YW5jZSAgICAgICAgICAgICAgICAgIGRpZmZl cmVuY2VfdHlwZTsKICB0eXBlZGVmIF9UcCogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7 CiAgdHlwZWRlZiBfUmVmZXJlbmNlICAgICAgICAgICAgICAgICByZWZlcmVuY2U7CgogIHJldmVy c2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcigpIHt9CiAgZXhwbGljaXQgcmV2ZXJzZV9iaWRpcmVj dGlvbmFsX2l0ZXJhdG9yKF9CaWRpcmVjdGlvbmFsSXRlcmF0b3IgX194KQogICAgOiBjdXJyZW50 KF9feCkge30KICBfQmlkaXJlY3Rpb25hbEl0ZXJhdG9yIGJhc2UoKSBjb25zdCB7IHJldHVybiBj dXJyZW50OyB9CiAgX1JlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CiAgICBfQmlkaXJlY3Rp b25hbEl0ZXJhdG9yIF9fdG1wID0gY3VycmVudDsKICAgIHJldHVybiAqLS1fX3RtcDsKICB9Cgog IHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYob3BlcmF0b3IqKCkpOyB9Cgog IF9TZWxmJiBvcGVyYXRvcisrKCkgewogICAgLS1jdXJyZW50OwogICAgcmV0dXJuICp0aGlzOwog IH0KICBfU2VsZiBvcGVyYXRvcisrKGludCkgewogICAgX1NlbGYgX190bXAgPSAqdGhpczsKICAg IC0tY3VycmVudDsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7 CiAgICArK2N1cnJlbnQ7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIF9TZWxmIG9wZXJhdG9yLS0o aW50KSB7CiAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwogICAgKytjdXJyZW50OwogICAgcmV0dXJu IF9fdG1wOwogIH0KfTsKCiMgNTUwICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgp0 ZW1wbGF0ZSA8Y2xhc3MgX0JpSXRlciwgY2xhc3MgX1RwLCBjbGFzcyBfUmVmLAogICAgICAgICAg Y2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KAogICAgY29uc3QgcmV2ZXJz ZV9iaWRpcmVjdGlvbmFsX2l0ZXJhdG9yPF9CaUl0ZXIsIF9UcCwgX1JlZiwgX0Rpc3RhbmNlPiYg X194LCAKICAgIGNvbnN0IHJldmVyc2VfYmlkaXJlY3Rpb25hbF9pdGVyYXRvcjxfQmlJdGVyLCBf VHAsIF9SZWYsIF9EaXN0YW5jZT4mIF9feSkKewogIHJldHVybiBfX3guYmFzZSgpID09IF9feS5i YXNlKCk7Cn0KCgoKIAogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgpjbGFzcyBy ZXZlcnNlX2l0ZXJhdG9yIAp7CnByb3RlY3RlZDoKICBfSXRlcmF0b3IgY3VycmVudDsKcHVibGlj OgogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46Oml0ZXJhdG9y X2NhdGVnb3J5CiAgICAgICAgICBpdGVyYXRvcl9jYXRlZ29yeTsKICB0eXBlZGVmIHR5cGVuYW1l IGl0ZXJhdG9yX3RyYWl0czxfSXRlcmF0b3I+Ojp2YWx1ZV90eXBlCiAgICAgICAgICB2YWx1ZV90 eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OmRpZmZl cmVuY2VfdHlwZQogICAgICAgICAgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgdHlwZW5hbWUg aXRlcmF0b3JfdHJhaXRzPF9JdGVyYXRvcj46OnBvaW50ZXIKICAgICAgICAgIHBvaW50ZXI7CiAg dHlwZWRlZiB0eXBlbmFtZSBpdGVyYXRvcl90cmFpdHM8X0l0ZXJhdG9yPjo6cmVmZXJlbmNlCiAg ICAgICAgICByZWZlcmVuY2U7CgogIHR5cGVkZWYgX0l0ZXJhdG9yIGl0ZXJhdG9yX3R5cGU7CiAg dHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gX1NlbGY7CgpwdWJsaWM6CiAgcmV2 ZXJzZV9pdGVyYXRvcigpIHt9CiAgZXhwbGljaXQgcmV2ZXJzZV9pdGVyYXRvcihpdGVyYXRvcl90 eXBlIF9feCkgOiBjdXJyZW50KF9feCkge30KCiAgcmV2ZXJzZV9pdGVyYXRvcihjb25zdCBfU2Vs ZiYgX194KSA6IGN1cnJlbnQoX194LmN1cnJlbnQpIHt9CgogIHRlbXBsYXRlIDxjbGFzcyBfSXRl cj4KICByZXZlcnNlX2l0ZXJhdG9yKGNvbnN0IHJldmVyc2VfaXRlcmF0b3I8X0l0ZXI+JiBfX3gp CiAgICA6IGN1cnJlbnQoX194LmJhc2UoKSkge30KCiAgICAKICBpdGVyYXRvcl90eXBlIGJhc2Uo KSBjb25zdCB7IHJldHVybiBjdXJyZW50OyB9CiAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0 IHsKICAgIF9JdGVyYXRvciBfX3RtcCA9IGN1cnJlbnQ7CiAgICByZXR1cm4gKi0tX190bXA7CiAg fQoKICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsg fQoKCiAgX1NlbGYmIG9wZXJhdG9yKysoKSB7CiAgICAtLWN1cnJlbnQ7CiAgICByZXR1cm4gKnRo aXM7CiAgfQogIF9TZWxmIG9wZXJhdG9yKysoaW50KSB7CiAgICBfU2VsZiBfX3RtcCA9ICp0aGlz OwogICAgLS1jdXJyZW50OwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBfU2VsZiYgb3BlcmF0b3It LSgpIHsKICAgICsrY3VycmVudDsKICAgIHJldHVybiAqdGhpczsKICB9CiAgX1NlbGYgb3BlcmF0 b3ItLShpbnQpIHsKICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CiAgICArK2N1cnJlbnQ7CiAgICBy ZXR1cm4gX190bXA7CiAgfQoKICBfU2VsZiBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIF9fbikg Y29uc3QgewogICAgcmV0dXJuIF9TZWxmKGN1cnJlbnQgLSBfX24pOwogIH0KICBfU2VsZiYgb3Bl cmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19uKSB7CiAgICBjdXJyZW50IC09IF9fbjsKICAgIHJl dHVybiAqdGhpczsKICB9CiAgX1NlbGYgb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX24pIGNv bnN0IHsKICAgIHJldHVybiBfU2VsZihjdXJyZW50ICsgX19uKTsKICB9CiAgX1NlbGYmIG9wZXJh dG9yLT0oZGlmZmVyZW5jZV90eXBlIF9fbikgewogICAgY3VycmVudCArPSBfX247CiAgICByZXR1 cm4gKnRoaXM7CiAgfQogIHJlZmVyZW5jZSBvcGVyYXRvcltdKGRpZmZlcmVuY2VfdHlwZSBfX24p IGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBfX24pOyB9ICAKfTsgCiAKdGVtcGxhdGUgPGNsYXNz IF9JdGVyYXRvcj4KaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCByZXZlcnNlX2l0ZXJhdG9y PF9JdGVyYXRvcj4mIF9feCwgCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJzZV9p dGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1cm4gX194LmJhc2UoKSA9PSBfX3kuYmFz ZSgpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0l0ZXJhdG9yPgppbmxpbmUgYm9vbCBvcGVyYXRvcjwo Y29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsIAogICAgICAgICAgICAgICAg ICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1cm4g X195LmJhc2UoKSA8IF9feC5iYXNlKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cmlu bGluZSB0eXBlbmFtZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlw ZQpvcGVyYXRvci0oY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3gsIAogICAg ICAgICAgY29uc3QgcmV2ZXJzZV9pdGVyYXRvcjxfSXRlcmF0b3I+JiBfX3kpIHsKICByZXR1cm4g X195LmJhc2UoKSAtIF9feC5iYXNlKCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSXRlcmF0b3I+Cmlu bGluZSByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4gCm9wZXJhdG9yKyh0eXBlbmFtZSByZXZl cnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj46OmRpZmZlcmVuY2VfdHlwZSBfX24sCiAgICAgICAgICBj b25zdCByZXZlcnNlX2l0ZXJhdG9yPF9JdGVyYXRvcj4mIF9feCkgewogIHJldHVybiByZXZlcnNl X2l0ZXJhdG9yPF9JdGVyYXRvcj4oX194LmJhc2UoKSAtIF9fbik7Cn0KCiMgODA1ICIvdXNyL2xp Yi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUv ZysrLTMvc3RsX2l0ZXJhdG9yLmgiIDMKCgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNz IF9EaXN0ID0gcHRyZGlmZl90PiAKY2xhc3MgaXN0cmVhbV9pdGVyYXRvciB7CiAgZnJpZW5kIGJv b2wgb3BlcmF0b3I9PSA8PiAgKGNvbnN0IGlzdHJlYW1faXRlcmF0b3ImLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3Im KTsKcHJvdGVjdGVkOgogIGlzdHJlYW0qIF9NX3N0cmVhbTsKICBfVHAgX01fdmFsdWU7CiAgYm9v bCBfTV9lbmRfbWFya2VyOwogIHZvaWQgX01fcmVhZCgpIHsKICAgIF9NX2VuZF9tYXJrZXIgPSAo Kl9NX3N0cmVhbSkgPyB0cnVlIDogZmFsc2U7CiAgICBpZiAoX01fZW5kX21hcmtlcikgKl9NX3N0 cmVhbSA+PiBfTV92YWx1ZTsKICAgIF9NX2VuZF9tYXJrZXIgPSAoKl9NX3N0cmVhbSkgPyB0cnVl IDogZmFsc2U7CiAgfQpwdWJsaWM6CiAgdHlwZWRlZiBpbnB1dF9pdGVyYXRvcl90YWcgIGl0ZXJh dG9yX2NhdGVnb3J5OwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlOwog IHR5cGVkZWYgX0Rpc3QgICAgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBj b25zdCBfVHAqICAgICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCBfVHAmICAgICAgICAg IHJlZmVyZW5jZTsKCiAgaXN0cmVhbV9pdGVyYXRvcigpIDogX01fc3RyZWFtKCZjaW4pLCBfTV9l bmRfbWFya2VyKGZhbHNlKSB7fQogIGlzdHJlYW1faXRlcmF0b3IoaXN0cmVhbSYgX19zKSA6IF9N X3N0cmVhbSgmX19zKSB7IF9NX3JlYWQoKTsgfQogIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25z dCB7IHJldHVybiBfTV92YWx1ZTsgfQoKICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJl dHVybiAmKG9wZXJhdG9yKigpKTsgfQoKICBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0Rpc3Q+JiBv cGVyYXRvcisrKCkgeyAKICAgIF9NX3JlYWQoKTsgCiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGlz dHJlYW1faXRlcmF0b3I8X1RwLCBfRGlzdD4gb3BlcmF0b3IrKyhpbnQpICB7CiAgICBpc3RyZWFt X2l0ZXJhdG9yPF9UcCwgX0Rpc3Q+IF9fdG1wID0gKnRoaXM7CiAgICBfTV9yZWFkKCk7CiAgICBy ZXR1cm4gX190bXA7CiAgfQp9OwoKIyA4NjQgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFr ZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfaXRlcmF0b3IuaCIg MwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9EaXN0YW5jZT4KaW5saW5lIGJvb2wgb3Bl cmF0b3I9PShjb25zdCBpc3RyZWFtX2l0ZXJhdG9yPF9UcCwgX0Rpc3RhbmNlPiYgX194LAogICAg ICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzdHJlYW1faXRlcmF0b3I8X1RwLCBfRGlzdGFuY2U+ JiBfX3kpIHsKICByZXR1cm4gKF9feC5fTV9zdHJlYW0gPT0gX195Ll9NX3N0cmVhbSAmJgogICAg ICAgICAgX194Ll9NX2VuZF9tYXJrZXIgPT0gX195Ll9NX2VuZF9tYXJrZXIpIHx8CiAgICAgICAg IF9feC5fTV9lbmRfbWFya2VyID09IGZhbHNlICYmIF9feS5fTV9lbmRfbWFya2VyID09IGZhbHNl Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpjbGFzcyBvc3RyZWFtX2l0ZXJhdG9yIHsKcHJvdGVj dGVkOgogIG9zdHJlYW0qIF9NX3N0cmVhbTsKICBjb25zdCBjaGFyKiBfTV9zdHJpbmc7CnB1Ymxp YzoKICB0eXBlZGVmIG91dHB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CiAgdHlw ZWRlZiB2b2lkICAgICAgICAgICAgICAgIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2b2lkICAgICAg ICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAg cG9pbnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwoKICBvc3Ry ZWFtX2l0ZXJhdG9yKG9zdHJlYW0mIF9fcykgOiBfTV9zdHJlYW0oJl9fcyksIF9NX3N0cmluZygw KSB7fQogIG9zdHJlYW1faXRlcmF0b3Iob3N0cmVhbSYgX19zLCBjb25zdCBjaGFyKiBfX2MpIAog ICAgOiBfTV9zdHJlYW0oJl9fcyksIF9NX3N0cmluZyhfX2MpICB7fQogIG9zdHJlYW1faXRlcmF0 b3I8X1RwPiYgb3BlcmF0b3I9KGNvbnN0IF9UcCYgX192YWx1ZSkgeyAKICAgICpfTV9zdHJlYW0g PDwgX192YWx1ZTsKICAgIGlmIChfTV9zdHJpbmcpICpfTV9zdHJlYW0gPDwgX01fc3RyaW5nOwog ICAgcmV0dXJuICp0aGlzOwogIH0KICBvc3RyZWFtX2l0ZXJhdG9yPF9UcD4mIG9wZXJhdG9yKigp IHsgcmV0dXJuICp0aGlzOyB9CiAgb3N0cmVhbV9pdGVyYXRvcjxfVHA+JiBvcGVyYXRvcisrKCkg eyByZXR1cm4gKnRoaXM7IH0gCiAgb3N0cmVhbV9pdGVyYXRvcjxfVHA+JiBvcGVyYXRvcisrKGlu dCkgeyByZXR1cm4gKnRoaXM7IH0gCn07CgojIDkwNyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9pdGVyYXRv ci5oIiAzCgoKIAoKCgogCiAKIAojIDU2ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2Ut bGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2FsZ29iYXNlLmgiIDIg MwoKCgogCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyMSwgY2xhc3MgX0ZvcndhcmRJ dGVyMiwgY2xhc3MgX1RwPgppbmxpbmUgdm9pZCBfX2l0ZXJfc3dhcChfRm9yd2FyZEl0ZXIxIF9f YSwgX0ZvcndhcmRJdGVyMiBfX2IsIF9UcCopIHsKICBfVHAgX190bXAgPSAqX19hOwogICpfX2Eg PSAqX19iOwogICpfX2IgPSBfX3RtcDsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcjEs IGNsYXNzIF9Gb3J3YXJkSXRlcjI+CmlubGluZSB2b2lkIGl0ZXJfc3dhcChfRm9yd2FyZEl0ZXIx IF9fYSwgX0ZvcndhcmRJdGVyMiBfX2IpIHsKICBfX2l0ZXJfc3dhcChfX2EsIF9fYiwgX192YWx1 ZV90eXBlKCBfX2EgKSApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgdm9pZCBzd2Fw KF9UcCYgX19hLCBfVHAmIF9fYikgewogIF9UcCBfX3RtcCA9IF9fYTsKICBfX2EgPSBfX2I7CiAg X19iID0gX190bXA7Cn0KCiAKIAoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgY29u c3QgX1RwJiBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19iKSB7CiAgcmV0dXJuIF9f YiA8IF9fYSA/IF9fYiA6IF9fYTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcD4KaW5saW5lIGNvbnN0 IF9UcCYgbWF4KGNvbnN0IF9UcCYgX19hLCBjb25zdCBfVHAmIF9fYikgewogIHJldHVybiAgX19h IDwgX19iID8gX19iIDogX19hOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9Db21w YXJlPgppbmxpbmUgY29uc3QgX1RwJiBtaW4oY29uc3QgX1RwJiBfX2EsIGNvbnN0IF9UcCYgX19i LCBfQ29tcGFyZSBfX2NvbXApIHsKICByZXR1cm4gX19jb21wKF9fYiwgX19hKSA/IF9fYiA6IF9f YTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmU+CmlubGluZSBjb25zdCBf VHAmIG1heChjb25zdCBfVHAmIF9fYSwgY29uc3QgX1RwJiBfX2IsIF9Db21wYXJlIF9fY29tcCkg ewogIHJldHVybiBfX2NvbXAoX19hLCBfX2IpID8gX19iIDogX19hOwp9CgogCiAKCiAKIAogCiAK IAogCiAKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfT3V0cHV0SXRlciwgY2xh c3MgX0Rpc3RhbmNlPgppbmxpbmUgX091dHB1dEl0ZXIgX19jb3B5KF9JbnB1dEl0ZXIgX19maXJz dCwgX0lucHV0SXRlciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX091dHB1dEl0 ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFn LCBfRGlzdGFuY2UqKQp7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX3Jlc3VsdCwg KytfX2ZpcnN0KQogICAgKl9fcmVzdWx0ID0gKl9fZmlyc3Q7CiAgcmV0dXJuIF9fcmVzdWx0Owp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9PdXRwdXRJdGVyLCBj bGFzcyBfRGlzdGFuY2U+CmlubGluZSBfT3V0cHV0SXRlcgpfX2NvcHkoX1JhbmRvbUFjY2Vzc0l0 ZXIgX19maXJzdCwgX1JhbmRvbUFjY2Vzc0l0ZXIgX19sYXN0LAogICAgICAgX091dHB1dEl0ZXIg X19yZXN1bHQsIHJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBfRGlzdGFuY2UqKQp7CiAgZm9y IChfRGlzdGFuY2UgX19uID0gX19sYXN0IC0gX19maXJzdDsgX19uID4gMDsgLS1fX24pIHsKICAg ICpfX3Jlc3VsdCA9ICpfX2ZpcnN0OwogICAgKytfX2ZpcnN0OwogICAgKytfX3Jlc3VsdDsKICB9 CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgppbmxpbmUgX1RwKgpf X2NvcHlfdHJpdmlhbChjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAq IF9fcmVzdWx0KSB7CiAgbWVtbW92ZShfX3Jlc3VsdCwgX19maXJzdCwgc2l6ZW9mKF9UcCkgKiAo X19sYXN0IC0gX19maXJzdCkpOwogIHJldHVybiBfX3Jlc3VsdCArIChfX2xhc3QgLSBfX2ZpcnN0 KTsKfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX091dHB1dEl0ZXIsIGNs YXNzIF9Cb29sVHlwZT4Kc3RydWN0IF9fY29weV9kaXNwYXRjaCB7CiAgc3RhdGljIF9PdXRwdXRJ dGVyIGNvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCkgewogICAgdHlwZWRlZiB0eXBl bmFtZSBpdGVyYXRvcl90cmFpdHM8X0lucHV0SXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IF9DYXRl Z29yeTsKICAgIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXI+Ojpk aWZmZXJlbmNlX3R5cGUgX0Rpc3RhbmNlOwogICAgcmV0dXJuIF9fY29weShfX2ZpcnN0LCBfX2xh c3QsIF9fcmVzdWx0LCBfQ2F0ZWdvcnkoKSwgKF9EaXN0YW5jZSopIDApOwogIH0KfTsKCnRlbXBs YXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBfX2NvcHlfZGlzcGF0Y2g8X1RwKiwgX1RwKiwgX190cnVl X3R5cGU+CnsKICBzdGF0aWMgX1RwKiBjb3B5KGNvbnN0IF9UcCogX19maXJzdCwgY29uc3QgX1Rw KiBfX2xhc3QsIF9UcCogX19yZXN1bHQpIHsKICAgIHJldHVybiBfX2NvcHlfdHJpdmlhbChfX2Zp cnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1 Y3QgX19jb3B5X2Rpc3BhdGNoPGNvbnN0IF9UcCosIF9UcCosIF9fdHJ1ZV90eXBlPgp7CiAgc3Rh dGljIF9UcCogY29weShjb25zdCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAq IF9fcmVzdWx0KSB7CiAgICByZXR1cm4gX19jb3B5X3RyaXZpYWwoX19maXJzdCwgX19sYXN0LCBf X3Jlc3VsdCk7CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9PdXRw dXRJdGVyPgppbmxpbmUgX091dHB1dEl0ZXIgY29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1 dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3Vs dCkgewogIHR5cGVkZWYgdHlwZW5hbWUgaXRlcmF0b3JfdHJhaXRzPF9JbnB1dEl0ZXI+Ojp2YWx1 ZV90eXBlIF9UcDsKICB0eXBlZGVmIHR5cGVuYW1lIF9fdHlwZV90cmFpdHM8X1RwPjo6aGFzX3Ry aXZpYWxfYXNzaWdubWVudF9vcGVyYXRvcgogICAgICAgICAgX1RyaXZpYWw7CiAgcmV0dXJuIF9f Y29weV9kaXNwYXRjaDxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlciwgX1RyaXZpYWw+CiAgICA6OmNv cHkoX19maXJzdCwgX19sYXN0LCBfX3Jlc3VsdCk7Cn0KCiMgMjEzICIvdXNyL2xpYi9nY2MtbGli L2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3Rs X2FsZ29iYXNlLmgiIDMKCgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIx LCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLCAKICAgICAgICAgIGNsYXNzIF9EaXN0YW5jZT4K aW5saW5lIF9CaWRpcmVjdGlvbmFsSXRlcjIgX19jb3B5X2JhY2t3YXJkKF9CaWRpcmVjdGlvbmFs SXRlcjEgX19maXJzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfQmlkaXJlY3Rpb25hbEl0ZXIxIF9fbGFzdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBfQmlkaXJlY3Rpb25hbEl0ZXIyIF9fcmVzdWx0LAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90 YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRGlzdGFuY2Uq KQp7CiAgd2hpbGUgKF9fZmlyc3QgIT0gX19sYXN0KQogICAgKi0tX19yZXN1bHQgPSAqLS1fX2xh c3Q7CiAgcmV0dXJuIF9fcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0 ZXIsIGNsYXNzIF9CaWRpcmVjdGlvbmFsSXRlciwgY2xhc3MgX0Rpc3RhbmNlPgppbmxpbmUgX0Jp ZGlyZWN0aW9uYWxJdGVyIF9fY29weV9iYWNrd2FyZChfUmFuZG9tQWNjZXNzSXRlciBfX2ZpcnN0 LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1JhbmRvbUFjY2Vz c0l0ZXIgX19sYXN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X0JpZGlyZWN0aW9uYWxJdGVyIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Rpc3RhbmNlKikKewogIGZvciAoX0Rpc3RhbmNl IF9fbiA9IF9fbGFzdCAtIF9fZmlyc3Q7IF9fbiA+IDA7IC0tX19uKQogICAgKi0tX19yZXN1bHQg PSAqLS1fX2xhc3Q7CiAgcmV0dXJuIF9fcmVzdWx0Owp9CgoKCiAKIAogCiAKCnRlbXBsYXRlIDxj bGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIxLCBjbGFzcyBfQmlkaXJlY3Rpb25hbEl0ZXIyLAogICAg ICAgICAgY2xhc3MgX0Jvb2xUeXBlPgpzdHJ1Y3QgX19jb3B5X2JhY2t3YXJkX2Rpc3BhdGNoCnsK ICB0eXBlZGVmIHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxfQmlkaXJlY3Rpb25hbEl0ZXIxPjo6 aXRlcmF0b3JfY2F0ZWdvcnkgCiAgICAgICAgICBfQ2F0OwogIHR5cGVkZWYgdHlwZW5hbWUgaXRl cmF0b3JfdHJhaXRzPF9CaWRpcmVjdGlvbmFsSXRlcjE+OjpkaWZmZXJlbmNlX3R5cGUKICAgICAg ICAgIF9EaXN0YW5jZTsKCiAgc3RhdGljIF9CaWRpcmVjdGlvbmFsSXRlcjIgY29weShfQmlkaXJl Y3Rpb25hbEl0ZXIxIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X0JpZGlyZWN0aW9uYWxJdGVyMSBfX2xhc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgX0JpZGlyZWN0aW9uYWxJdGVyMiBfX3Jlc3VsdCkgewogICAgcmV0dXJuIF9fY29weV9i YWNrd2FyZChfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0LCBfQ2F0KCksIChfRGlzdGFuY2UqKSAw KTsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgX19jb3B5X2JhY2t3YXJkX2Rp c3BhdGNoPF9UcCosIF9UcCosIF9fdHJ1ZV90eXBlPgp7CiAgc3RhdGljIF9UcCogY29weShjb25z dCBfVHAqIF9fZmlyc3QsIGNvbnN0IF9UcCogX19sYXN0LCBfVHAqIF9fcmVzdWx0KSB7CiAgICBj b25zdCBwdHJkaWZmX3QgX051bSA9IF9fbGFzdCAtIF9fZmlyc3Q7CiAgICBtZW1tb3ZlKF9fcmVz dWx0IC0gX051bSwgX19maXJzdCwgc2l6ZW9mKF9UcCkgKiBfTnVtKTsKICAgIHJldHVybiBfX3Jl c3VsdCAtIF9OdW07CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IF9fY29weV9i YWNrd2FyZF9kaXNwYXRjaDxjb25zdCBfVHAqLCBfVHAqLCBfX3RydWVfdHlwZT4KewogIHN0YXRp YyBfVHAqIGNvcHkoY29uc3QgX1RwKiBfX2ZpcnN0LCBjb25zdCBfVHAqIF9fbGFzdCwgX1RwKiBf X3Jlc3VsdCkgewogICAgcmV0dXJuICBfX2NvcHlfYmFja3dhcmRfZGlzcGF0Y2g8X1RwKiwgX1Rw KiwgX190cnVlX3R5cGU+CiAgICAgIDo6Y29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsK ICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0JJMSwgY2xhc3MgX0JJMj4KaW5saW5lIF9CSTIgY29w eV9iYWNrd2FyZChfQkkxIF9fZmlyc3QsIF9CSTEgX19sYXN0LCBfQkkyIF9fcmVzdWx0KSB7CiAg dHlwZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPHR5cGVuYW1lIGl0ZXJhdG9yX3RyYWl0czxf QkkyPjo6dmFsdWVfdHlwZT4KICAgICAgICAgICAgICAgICAgICAgICAgOjpoYXNfdHJpdmlhbF9h c3NpZ25tZW50X29wZXJhdG9yCiAgICAgICAgICBfVHJpdmlhbDsKICByZXR1cm4gX19jb3B5X2Jh Y2t3YXJkX2Rpc3BhdGNoPF9CSTEsIF9CSTIsIF9Ucml2aWFsPgogICAgICAgICAgICAgIDo6Y29w eShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKfQoKIyAzMDMgIi91c3IvbGliL2djYy1saWIv aTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxf YWxnb2Jhc2UuaCIgMwoKCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9T aXplLCBjbGFzcyBfT3V0cHV0SXRlcj4KcGFpcjxfSW5wdXRJdGVyLCBfT3V0cHV0SXRlcj4gX19j b3B5X24oX0lucHV0SXRlciBfX2ZpcnN0LCBfU2l6ZSBfX2NvdW50LAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfT3V0cHV0SXRlciBfX3Jlc3VsdCwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKSB7CiAgZm9yICgg OyBfX2NvdW50ID4gMDsgLS1fX2NvdW50KSB7CiAgICAqX19yZXN1bHQgPSAqX19maXJzdDsKICAg ICsrX19maXJzdDsKICAgICsrX19yZXN1bHQ7CiAgfQogIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIs IF9PdXRwdXRJdGVyPihfX2ZpcnN0LCBfX3Jlc3VsdCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfUkFJ dGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX091dHB1dEl0ZXI+CmlubGluZSBwYWlyPF9SQUl0ZXIs IF9PdXRwdXRJdGVyPgpfX2NvcHlfbihfUkFJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCiAg ICAgICAgIF9PdXRwdXRJdGVyIF9fcmVzdWx0LAogICAgICAgICByYW5kb21fYWNjZXNzX2l0ZXJh dG9yX3RhZykgewogIF9SQUl0ZXIgX19sYXN0ID0gX19maXJzdCArIF9fY291bnQ7CiAgcmV0dXJu IHBhaXI8X1JBSXRlciwgX091dHB1dEl0ZXI+KF9fbGFzdCwgY29weShfX2ZpcnN0LCBfX2xhc3Qs IF9fcmVzdWx0KSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfU2l6ZSwg Y2xhc3MgX091dHB1dEl0ZXI+CmlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9PdXRwdXRJdGVyPgpf X2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsIF9PdXRwdXRJdGVyIF9f cmVzdWx0KSB7CiAgcmV0dXJuIF9fY29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LAog ICAgICAgICAgICAgICAgICBfX2l0ZXJhdG9yX2NhdGVnb3J5KCBfX2ZpcnN0ICkgKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfT3V0cHV0SXRlcj4K aW5saW5lIHBhaXI8X0lucHV0SXRlciwgX091dHB1dEl0ZXI+CmNvcHlfbihfSW5wdXRJdGVyIF9f Zmlyc3QsIF9TaXplIF9fY291bnQsIF9PdXRwdXRJdGVyIF9fcmVzdWx0KSB7CiAgcmV0dXJuIF9f Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0KTsKfQoKIAogCgoKdGVtcGxhdGUgPGNs YXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1RwPgp2b2lkIGZpbGwoX0ZvcndhcmRJdGVyIF9fZmly c3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIGNvbnN0IF9UcCYgX192YWx1ZSkgewogIGZvciAoIDsg X19maXJzdCAhPSBfX2xhc3Q7ICsrX19maXJzdCkKICAgICpfX2ZpcnN0ID0gX192YWx1ZTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9PdXRwdXRJdGVyLCBjbGFzcyBfU2l6ZSwgY2xhc3MgX1RwPgpfT3V0 cHV0SXRlciBmaWxsX24oX091dHB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19uLCBjb25zdCBfVHAm IF9fdmFsdWUpIHsKICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uLCArK19fZmlyc3QpCiAgICAqX19m aXJzdCA9IF9fdmFsdWU7CiAgcmV0dXJuIF9fZmlyc3Q7Cn0KCiAKIAoKdGVtcGxhdGUgPGNsYXNz IF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KcGFpcjxfSW5wdXRJdGVyMSwgX0lucHV0 SXRlcjI+IG1pc21hdGNoKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9fZmlyc3QyKSB7CiAgd2hpbGUg KF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgKl9fZmlyc3QxID09ICpfX2ZpcnN0MikgewogICAgKytf X2ZpcnN0MTsKICAgICsrX19maXJzdDI7CiAgfQogIHJldHVybiBwYWlyPF9JbnB1dEl0ZXIxLCBf SW5wdXRJdGVyMj4oX19maXJzdDEsIF9fZmlyc3QyKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1 dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMiwgY2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4KcGFpcjxf SW5wdXRJdGVyMSwgX0lucHV0SXRlcjI+IG1pc21hdGNoKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjEgX19sYXN0 MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9JbnB1dEl0ZXIyIF9f Zmlyc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0JpbmFyeVBy ZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CiAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYg X19iaW5hcnlfcHJlZCgqX19maXJzdDEsICpfX2ZpcnN0MikpIHsKICAgICsrX19maXJzdDE7CiAg ICArK19fZmlyc3QyOwogIH0KICByZXR1cm4gcGFpcjxfSW5wdXRJdGVyMSwgX0lucHV0SXRlcjI+ KF9fZmlyc3QxLCBfX2ZpcnN0Mik7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xh c3MgX0lucHV0SXRlcjI+CmlubGluZSBib29sIGVxdWFsKF9JbnB1dEl0ZXIxIF9fZmlyc3QxLCBf SW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0 MikgewogIGZvciAoIDsgX19maXJzdDEgIT0gX19sYXN0MTsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0 MikKICAgIGlmICgqX19maXJzdDEgIT0gKl9fZmlyc3QyKQogICAgICByZXR1cm4gZmFsc2U7CiAg cmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyMSwgY2xhc3MgX0lucHV0 SXRlcjIsIGNsYXNzIF9CaW5hcnlQcmVkaWNhdGU+CmlubGluZSBib29sIGVxdWFsKF9JbnB1dEl0 ZXIxIF9fZmlyc3QxLCBfSW5wdXRJdGVyMSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICBfSW5w dXRJdGVyMiBfX2ZpcnN0MiwgX0JpbmFyeVByZWRpY2F0ZSBfX2JpbmFyeV9wcmVkKSB7CiAgZm9y ICggOyBfX2ZpcnN0MSAhPSBfX2xhc3QxOyArK19fZmlyc3QxLCArK19fZmlyc3QyKQogICAgaWYg KCFfX2JpbmFyeV9wcmVkKCpfX2ZpcnN0MSwgKl9fZmlyc3QyKSkKICAgICAgcmV0dXJuIGZhbHNl OwogIHJldHVybiB0cnVlOwp9CgogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBj bGFzcyBfSW5wdXRJdGVyMj4KYm9vbCBsZXhpY29ncmFwaGljYWxfY29tcGFyZShfSW5wdXRJdGVy MSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19sYXN0MikgewogIGZvciAo IDsgX19maXJzdDEgIT0gX19sYXN0MSAmJiBfX2ZpcnN0MiAhPSBfX2xhc3QyCiAgICAgICAgOyAr K19fZmlyc3QxLCArK19fZmlyc3QyKSB7CiAgICBpZiAoKl9fZmlyc3QxIDwgKl9fZmlyc3QyKQog ICAgICByZXR1cm4gdHJ1ZTsKICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCiAgICAgIHJl dHVybiBmYWxzZTsKICB9CiAgcmV0dXJuIF9fZmlyc3QxID09IF9fbGFzdDEgJiYgX19maXJzdDIg IT0gX19sYXN0MjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJ dGVyMiwgY2xhc3MgX0NvbXBhcmU+CmJvb2wgbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX0lucHV0 SXRlcjEgX19maXJzdDEsIF9JbnB1dEl0ZXIxIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX0lucHV0SXRlcjIgX19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0NvbXBhcmUgX19jb21wKSB7CiAgZm9yICggOyBfX2Zp cnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIKICAgICAgICA7ICsrX19maXJz dDEsICsrX19maXJzdDIpIHsKICAgIGlmIChfX2NvbXAoKl9fZmlyc3QxLCAqX19maXJzdDIpKQog ICAgICByZXR1cm4gdHJ1ZTsKICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKQog ICAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiBfX2ZpcnN0MSA9PSBfX2xhc3QxICYmIF9f Zmlyc3QyICE9IF9fbGFzdDI7Cn0KCmlubGluZSBib29sIApsZXhpY29ncmFwaGljYWxfY29tcGFy ZShjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAgICAgICAg Y29uc3QgdW5zaWduZWQgY2hhciogX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgY29u c3QgdW5zaWduZWQgY2hhciogX19maXJzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDIpCnsKICBjb25zdCBzaXplX3QgX19sZW4xID0gX19sYXN0 MSAtIF9fZmlyc3QxOwogIGNvbnN0IHNpemVfdCBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7 CiAgY29uc3QgaW50IF9fcmVzdWx0ID0gbWVtY21wKF9fZmlyc3QxLCBfX2ZpcnN0MiwgbWluKF9f bGVuMSwgX19sZW4yKSk7CiAgcmV0dXJuIF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdCA8IDAgOiBf X2xlbjEgPCBfX2xlbjI7Cn0KCmlubGluZSBib29sIGxleGljb2dyYXBoaWNhbF9jb21wYXJlKGNv bnN0IGNoYXIqIF9fZmlyc3QxLCBjb25zdCBjaGFyKiBfX2xhc3QxLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBfX2ZpcnN0MiwgY29uc3QgY2hhciogX19s YXN0MikKewoKICByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoKGNvbnN0IHNpZ25lZCBj aGFyKikgX19maXJzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBz aWduZWQgY2hhciopIF9fbGFzdDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChj b25zdCBzaWduZWQgY2hhciopIF9fZmlyc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2xhc3QyKTsKCgoKCgoKfQoKdGVtcGxhdGUgPGNs YXNzIF9JbnB1dEl0ZXIxLCBjbGFzcyBfSW5wdXRJdGVyMj4KaW50IF9fbGV4aWNvZ3JhcGhpY2Fs X2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0Miwg X0lucHV0SXRlcjIgX19sYXN0MikKewogIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9f Zmlyc3QyICE9IF9fbGFzdDIpIHsKICAgIGlmICgqX19maXJzdDEgPCAqX19maXJzdDIpCiAgICAg IHJldHVybiAtMTsKICAgIGlmICgqX19maXJzdDIgPCAqX19maXJzdDEpCiAgICAgIHJldHVybiAx OwogICAgKytfX2ZpcnN0MTsKICAgICsrX19maXJzdDI7CiAgfQogIGlmIChfX2ZpcnN0MiA9PSBf X2xhc3QyKSB7CiAgICByZXR1cm4gIShfX2ZpcnN0MSA9PSBfX2xhc3QxKTsKICB9CiAgZWxzZSB7 CiAgICByZXR1cm4gLTE7CiAgfQp9CgppbmxpbmUgaW50Cl9fbGV4aWNvZ3JhcGhpY2FsX2NvbXBh cmVfM3dheShjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDEsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBfX2ZpcnN0MiwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fbGFzdDIpCnsKICBj b25zdCBwdHJkaWZmX3QgX19sZW4xID0gX19sYXN0MSAtIF9fZmlyc3QxOwogIGNvbnN0IHB0cmRp ZmZfdCBfX2xlbjIgPSBfX2xhc3QyIC0gX19maXJzdDI7CiAgY29uc3QgaW50IF9fcmVzdWx0ID0g bWVtY21wKF9fZmlyc3QxLCBfX2ZpcnN0MiwgbWluKF9fbGVuMSwgX19sZW4yKSk7CiAgcmV0dXJu IF9fcmVzdWx0ICE9IDAgPyBfX3Jlc3VsdCAKICAgICAgICAgICAgICAgICAgICAgICA6IChfX2xl bjEgPT0gX19sZW4yID8gMCA6IChfX2xlbjEgPCBfX2xlbjIgPyAtMSA6IDEpKTsKfQoKaW5saW5l IGludCAKX19sZXhpY29ncmFwaGljYWxfY29tcGFyZV8zd2F5KGNvbnN0IGNoYXIqIF9fZmlyc3Qx LCBjb25zdCBjaGFyKiBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u c3QgY2hhciogX19maXJzdDIsIGNvbnN0IGNoYXIqIF9fbGFzdDIpCnsKCiAgcmV0dXJuIF9fbGV4 aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2ZpcnN0MSwKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAoY29uc3Qgc2lnbmVkIGNoYXIqKSBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChjb25zdCBzaWduZWQgY2hhciopIF9fZmlyc3QyLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIChjb25zdCBzaWduZWQgY2hhciopIF9fbGFzdDIpOwoKCgoKCgp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyPgppbnQgbGV4 aWNvZ3JhcGhpY2FsX2NvbXBhcmVfM3dheShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRl cjEgX19sYXN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcjIg X19maXJzdDIsIF9JbnB1dEl0ZXIyIF9fbGFzdDIpCnsKICByZXR1cm4gX19sZXhpY29ncmFwaGlj YWxfY29tcGFyZV8zd2F5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0MiwgX19sYXN0Mik7Cn0K CiAKCgoKIAogCiAKIyAzMCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIu OTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3ZlY3RvciIgMiAzCgojIDEgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9zdGxfYWxsb2MuaCIgMSAzCiAKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoK IAogCiAKIAogCiAKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRy YWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKIyAzNDIgIi91c3IvbGliL2dj Yy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoKIyA1 MyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8u Li9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAyIDMKCgoKIyAxICIvdXNyL2luY2x1ZGUvYXNz ZXJ0LmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgojIDMyICIvdXNyL2luY2x1ZGUvYXNz ZXJ0LmgiIDMKCgoKCgogCgoKCgojIDU2ICIvdXNyL2luY2x1ZGUvYXNzZXJ0LmgiIDMKCgpleHRl cm4gIkMiIHsgCgogCmV4dGVybiB2b2lkIF9fYXNzZXJ0X2ZhaWwgIChfX2NvbnN0IGNoYXIgKl9f YXNzZXJ0aW9uLAoJCQkJX19jb25zdCBjaGFyICpfX2ZpbGUsCgkJCQl1bnNpZ25lZCBpbnQgX19s aW5lLAoJCQkJX19jb25zdCBjaGFyICpfX2Z1bmN0aW9uKSAgdGhyb3cgKCkgIAogICAgIF9fYXR0 cmlidXRlX18gKChfX25vcmV0dXJuX18pKTsKCiAKZXh0ZXJuIHZvaWQgX19hc3NlcnRfcGVycm9y X2ZhaWwgIChpbnQgX19lcnJudW0sCgkJCQkgICAgICAgX19jb25zdCBjaGFyICpfX2ZpbGUsCgkJ CQkgICAgICAgdW5zaWduZWQgaW50IF9fbGluZSwKCQkJCSAgICAgICBfX2NvbnN0IGNoYXIgKl9f ZnVuY3Rpb24pICB0aHJvdyAoKSAgCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykp OwoKfSAKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyA1NiAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2cr Ky0zL3N0bF9hbGxvYy5oIiAyIDMKCgoKCgoKCgoKCgoKICAgICAKICAgICAKICAgICAKIyAxICIv dXNyL2luY2x1ZGUvcHRocmVhZC5oIiAxIDMKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoK CgojIDEgIi91c3IvaW5jbHVkZS9zY2hlZC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CiAKCgoKIyAxICIvdXNyL2luY2x1ZGUvdGltZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCiAK CgoKCgoKCgoKCgoKCgojIDUxICIvdXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKCiMgNjIgIi91c3Iv aW5jbHVkZS90aW1lLmgiIDMKCgoKIyA3MyAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoKIyA4 OSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoKIyAyNzkgIi91c3IvaW5jbHVkZS90aW1lLmgi IDMKCgoKIyAyOSAiL3Vzci9pbmNsdWRlL3NjaGVkLmgiIDIgMwoKCiAKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9zY2hlZC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgog CgoKCgoKCgoKCgoKIApzdHJ1Y3Qgc2NoZWRfcGFyYW0KICB7CiAgICBpbnQgc2NoZWRfcHJpb3Jp dHk7CiAgfTsKCmV4dGVybiAiQyIgeyAKCiAKCmV4dGVybiBpbnQgY2xvbmUgIChpbnQgKCpfX2Zu KSAodm9pZCAqX19hcmcpLCB2b2lkICpfX2NoaWxkX3N0YWNrLAoJCSAgICAgICBpbnQgX19mbGFn cywgdm9pZCAqX19hcmcpICB0aHJvdyAoKSAgOwoKCn0gCgoKCgoKCiAKc3RydWN0IF9fc2NoZWRf cGFyYW0KICB7CiAgICBpbnQgc2NoZWRfcHJpb3JpdHk7CiAgfTsKCgojIDMyICIvdXNyL2luY2x1 ZGUvc2NoZWQuaCIgMiAzCgoKZXh0ZXJuICJDIiB7IAoKIApleHRlcm4gaW50IF9fc2NoZWRfc2V0 cGFyYW0gIChfX3BpZF90IF9fcGlkLAoJCQkJICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAq X19wYXJhbSkgIHRocm93ICgpICA7CmV4dGVybiBpbnQgc2NoZWRfc2V0cGFyYW0gIChfX3BpZF90 IF9fcGlkLAoJCQkJX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pICB0aHJvdyAo KSAgOwoKIApleHRlcm4gaW50IF9fc2NoZWRfZ2V0cGFyYW0gIChfX3BpZF90IF9fcGlkLCBzdHJ1 Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHNjaGVkX2dl dHBhcmFtICAoX19waWRfdCBfX3BpZCwgc3RydWN0IHNjaGVkX3BhcmFtICpfX3BhcmFtKSAgdGhy b3cgKCkgIDsKCiAKZXh0ZXJuIGludCBfX3NjaGVkX3NldHNjaGVkdWxlciAgKF9fcGlkX3QgX19w aWQsIGludCBfX3BvbGljeSwKCQkJCSAgICAgIF9fY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpf X3BhcmFtKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBzY2hlZF9zZXRzY2hlZHVsZXIgIChfX3Bp ZF90IF9fcGlkLCBpbnQgX19wb2xpY3ksCgkJCQkgICAgX19jb25zdCBzdHJ1Y3Qgc2NoZWRfcGFy YW0gKl9fcGFyYW0pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IF9fc2NoZWRfZ2V0c2NoZWR1 bGVyICAoX19waWRfdCBfX3BpZCkgIHRocm93ICgpICA7CmV4dGVybiBpbnQgc2NoZWRfZ2V0c2No ZWR1bGVyICAoX19waWRfdCBfX3BpZCkgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgX19zY2hl ZF95aWVsZCAgKHZvaWQpICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHNjaGVkX3lpZWxkICAodm9p ZCkgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgX19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4ICAo aW50IF9fYWxnb3JpdGhtKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBzY2hlZF9nZXRfcHJpb3Jp dHlfbWF4ICAoaW50IF9fYWxnb3JpdGhtKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBfX3Nj aGVkX2dldF9wcmlvcml0eV9taW4gIChpbnQgX19hbGdvcml0aG0pICB0aHJvdyAoKSAgOwpleHRl cm4gaW50IHNjaGVkX2dldF9wcmlvcml0eV9taW4gIChpbnQgX19hbGdvcml0aG0pICB0aHJvdyAo KSAgOwoKIApleHRlcm4gaW50IF9fc2NoZWRfcnJfZ2V0X2ludGVydmFsICAoX19waWRfdCBfX3Bp ZCwgc3RydWN0IHRpbWVzcGVjICpfX3QpICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHNjaGVkX3Jy X2dldF9pbnRlcnZhbCAgKF9fcGlkX3QgX19waWQsIHN0cnVjdCB0aW1lc3BlYyAqX190KSAgdGhy b3cgKCkgIDsKCn0gCgoKIyAyMCAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMiAzCgojIDEgIi91 c3IvaW5jbHVkZS90aW1lLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKCgoKZXh0 ZXJuICJDIiB7IAoKCgoKIAoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxp bnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMKCgoKCgoKIAoKCiMgMTkgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMwoK CgogCgoKIAoKCgoKCiAKCgojIDYxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgoKIAoKCgoKCgoKCgoKCgoKCgoK CgogCgoKCgoKIAoKIAoKCiMgMTI2ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGlu dXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCgogCgoKCgogCgogCgoKIyAxODggIi91c3Iv bGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvaW5jbHVkZS9zdGRkZWYuaCIg MwoKCgoKCiAKCgoKCiAKCgojIDI2OSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxp bnV4LzIuOTUuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzCgoKCgoKCgoKCgoKCgoKCgogCgogCgojIDMx NyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy9pbmNsdWRlL3N0 ZGRlZi5oIiAzCgoKCgogCgoKCgoKCgoKCgoKCgogCgoKCgoKCgojIDM4ICIvdXNyL2luY2x1ZGUv dGltZS5oIiAyIDMKCgogCgojIDEgIi91c3IvaW5jbHVkZS9iaXRzL3RpbWUuaCIgMSAzCiAKCgoK CgoKCgoKCgoKCgoKCgoKIAoKCgoKCgoKIAoKCiAKCgoKCgogCgoKCgoKCgojIDU5ICIvdXNyL2lu Y2x1ZGUvYml0cy90aW1lLmgiIDMKIAojIDQyICIvdXNyL2luY2x1ZGUvdGltZS5oIiAyIDMKCgog CgoKCgoKCgoKCgoKCgoKIAp0eXBlZGVmIF9fY2xvY2tfdCBjbG9ja190OwoKCgoKIyA3MyAiL3Vz ci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoKIyA4OSAiL3Vzci9pbmNsdWRlL3RpbWUuaCIgMwoKCgoK CiAKc3RydWN0IHRtCnsKICBpbnQgdG1fc2VjOwkJCSAKICBpbnQgdG1fbWluOwkJCSAKICBpbnQg dG1faG91cjsJCQkgCiAgaW50IHRtX21kYXk7CQkJIAogIGludCB0bV9tb247CQkJIAogIGludCB0 bV95ZWFyOwkJCSAKICBpbnQgdG1fd2RheTsJCQkgCiAgaW50IHRtX3lkYXk7CQkJIAogIGludCB0 bV9pc2RzdDsJCQkgCgoKICBsb25nIGludCB0bV9nbXRvZmY7CQkgCiAgX19jb25zdCBjaGFyICp0 bV96b25lOwkgCgoKCgp9OwoKCiAKCmV4dGVybiBjbG9ja190IGNsb2NrICAodm9pZCkgIHRocm93 ICgpICA7CgogCmV4dGVybiB0aW1lX3QgdGltZSAgKHRpbWVfdCAqX190aW1lcikgIHRocm93ICgp ICA7CgogCmV4dGVybiBkb3VibGUgZGlmZnRpbWUgICh0aW1lX3QgX190aW1lMSwgdGltZV90IF9f dGltZTApICB0aHJvdyAoKSAgCiAgICAgX19hdHRyaWJ1dGVfXyAoKF9fY29uc3RfXykpOwoKIApl eHRlcm4gdGltZV90IG1rdGltZSAgKHN0cnVjdCB0bSAqX190cCkgIHRocm93ICgpICA7CgoKIAoK CmV4dGVybiBzaXplX3Qgc3RyZnRpbWUgIChjaGFyICpfX3Jlc3RyaWN0IF9fcywgc2l6ZV90IF9f bWF4c2l6ZSwKCQkJICAgICBfX2NvbnN0IGNoYXIgKl9fcmVzdHJpY3QgX19mb3JtYXQsCgkJCSAg ICAgX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgIHRocm93ICgpICA7CgoKCgoK CgoKCiAKCmV4dGVybiBzdHJ1Y3QgdG0gKmdtdGltZSAgKF9fY29uc3QgdGltZV90ICpfX3RpbWVy KSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBzdHJ1Y3QgdG0gKmxvY2FsdGltZSAgKF9fY29uc3Qg dGltZV90ICpfX3RpbWVyKSAgdGhyb3cgKCkgIDsKCgogCgpleHRlcm4gc3RydWN0IHRtICpfX2dt dGltZV9yICAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwKCQkJCSAgIHN0cnVj dCB0bSAqX19yZXN0cmljdCBfX3RwKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIHN0cnVjdCB0bSAqZ210 aW1lX3IgIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVyLAoJCQkJIHN0cnVjdCB0 bSAqX19yZXN0cmljdCBfX3RwKSAgdGhyb3cgKCkgIDsKCiAKCmV4dGVybiBzdHJ1Y3QgdG0gKmxv Y2FsdGltZV9yICAoX19jb25zdCB0aW1lX3QgKl9fcmVzdHJpY3QgX190aW1lciwKCQkJCSAgICBz dHJ1Y3QgdG0gKl9fcmVzdHJpY3QgX190cCkgIHRocm93ICgpICA7CgoKIAoKZXh0ZXJuIGNoYXIg KmFzY3RpbWUgIChfX2NvbnN0IHN0cnVjdCB0bSAqX190cCkgIHRocm93ICgpICA7CgogCmV4dGVy biBjaGFyICpjdGltZSAgKF9fY29uc3QgdGltZV90ICpfX3RpbWVyKSAgdGhyb3cgKCkgIDsKCgog CgogCgpleHRlcm4gY2hhciAqYXNjdGltZV9yICAoX19jb25zdCBzdHJ1Y3QgdG0gKl9fcmVzdHJp Y3QgX190cCwKCQkJICAgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSAgdGhyb3cgKCkgIDsKCiAK ZXh0ZXJuIGNoYXIgKmN0aW1lX3IgIChfX2NvbnN0IHRpbWVfdCAqX19yZXN0cmljdCBfX3RpbWVy LAoJCQkgICBjaGFyICpfX3Jlc3RyaWN0IF9fYnVmKSAgdGhyb3cgKCkgIDsKCgoKIApleHRlcm4g Y2hhciAqX190em5hbWVbMl07CSAKZXh0ZXJuIGludCBfX2RheWxpZ2h0OwkJIApleHRlcm4gbG9u ZyBpbnQgX190aW1lem9uZTsJIAoKCgogCmV4dGVybiBjaGFyICp0em5hbWVbMl07CgogCgpleHRl cm4gdm9pZCB0enNldCAgKHZvaWQpICB0aHJvdyAoKSAgOwoKCgpleHRlcm4gaW50IGRheWxpZ2h0 OwpleHRlcm4gbG9uZyBpbnQgdGltZXpvbmU7CgoKCiAKCmV4dGVybiBpbnQgc3RpbWUgIChfX2Nv bnN0IHRpbWVfdCAqX193aGVuKSAgdGhyb3cgKCkgIDsKCgoKIAoKCgoKCgogCgoKIApleHRlcm4g dGltZV90IHRpbWVnbSAgKHN0cnVjdCB0bSAqX190cCkgIHRocm93ICgpICA7CgogCmV4dGVybiB0 aW1lX3QgdGltZWxvY2FsICAoc3RydWN0IHRtICpfX3RwKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJu IGludCBkeXNpemUgIChpbnQgX195ZWFyKSAgdGhyb3cgKCkgIDsKCgoKCiAKZXh0ZXJuIGludCBu YW5vc2xlZXAgIChfX2NvbnN0IHN0cnVjdCB0aW1lc3BlYyAqX19yZXF1ZXN0ZWRfdGltZSwKCQkJ ICAgc3RydWN0IHRpbWVzcGVjICpfX3JlbWFpbmluZykgIHRocm93ICgpICA7CgoKCiMgMjY0ICIv dXNyL2luY2x1ZGUvdGltZS5oIiAzCgoKIyAyNzQgIi91c3IvaW5jbHVkZS90aW1lLmgiIDMKCgoK fSAKCgoKCiMgMjEgIi91c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDIgMwoKCgojIDEgIi91c3IvaW5j bHVkZS9zaWduYWwuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoKZXh0ZXJu ICJDIiB7IAoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9zaWdzZXQuaCIgMSAzCiAKCgoKCgoKCgoK CgoKCgoKCgoKIyAzMyAiL3Vzci9pbmNsdWRlL2JpdHMvc2lnc2V0LmgiIDMKCgoKIAoKCgoKCiMg MTI1ICIvdXNyL2luY2x1ZGUvYml0cy9zaWdzZXQuaCIgMwoKIyAzMyAiL3Vzci9pbmNsdWRlL3Np Z25hbC5oIiAyIDMKCgogCgoKCgoKCgoKCgoKCgp0eXBlZGVmIF9fc2lnc2V0X3Qgc2lnc2V0X3Q7 CgoKCiMgMzYwICIvdXNyL2luY2x1ZGUvc2lnbmFsLmgiIDMKCgp9IAoKCiMgMjQgIi91c3IvaW5j bHVkZS9wdGhyZWFkLmgiIDIgMwoKIyAxICIvdXNyL2luY2x1ZGUvYml0cy9wdGhyZWFkdHlwZXMu aCIgMSAzCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgoKIyAxICIvdXNyL2luY2x1 ZGUvYml0cy9zY2hlZC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKIyA2MiAiL3Vzci9pbmNs dWRlL2JpdHMvc2NoZWQuaCIgMwoKCiMgNzMgIi91c3IvaW5jbHVkZS9iaXRzL3NjaGVkLmgiIDMK CiMgMjMgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5oIiAyIDMKCgogCnN0cnVjdCBf cHRocmVhZF9mYXN0bG9jawp7CiAgbG9uZyBpbnQgX19zdGF0dXM7ICAgICAgICAgICAgIAogIGlu dCBfX3NwaW5sb2NrOyAgICAgICAgICAgICAgICAKfTsKCgogCnR5cGVkZWYgc3RydWN0IF9wdGhy ZWFkX2Rlc2NyX3N0cnVjdCAqX3B0aHJlYWRfZGVzY3I7CgoKCgogCnR5cGVkZWYgc3RydWN0CnsK ICBpbnQgX19kZXRhY2hzdGF0ZTsKICBpbnQgX19zY2hlZHBvbGljeTsKICBzdHJ1Y3QgX19zY2hl ZF9wYXJhbSBfX3NjaGVkcGFyYW07CiAgaW50IF9faW5oZXJpdHNjaGVkOwogIGludCBfX3Njb3Bl OwogIHNpemVfdCBfX2d1YXJkc2l6ZTsKICBpbnQgX19zdGFja2FkZHJfc2V0OwogIHZvaWQgKl9f c3RhY2thZGRyOwogIHNpemVfdCBfX3N0YWNrc2l6ZTsKfSBwdGhyZWFkX2F0dHJfdDsKCgogCnR5 cGVkZWYgc3RydWN0CnsKICBzdHJ1Y3QgX3B0aHJlYWRfZmFzdGxvY2sgX19jX2xvY2s7ICAKICBf cHRocmVhZF9kZXNjciBfX2Nfd2FpdGluZzsgICAgICAgICAKfSBwdGhyZWFkX2NvbmRfdDsKCgog CnR5cGVkZWYgc3RydWN0CnsKICBpbnQgX19kdW1teTsKfSBwdGhyZWFkX2NvbmRhdHRyX3Q7Cgog CnR5cGVkZWYgdW5zaWduZWQgaW50IHB0aHJlYWRfa2V5X3Q7CgoKIAogCgp0eXBlZGVmIHN0cnVj dAp7CiAgaW50IF9fbV9yZXNlcnZlZDsgICAgICAgICAgICAgICAgCiAgaW50IF9fbV9jb3VudDsg ICAgICAgICAgICAgICAgICAgCiAgX3B0aHJlYWRfZGVzY3IgX19tX293bmVyOyAgICAgICAgCiAg aW50IF9fbV9raW5kOyAgICAgICAgICAgICAgICAgICAgCiAgc3RydWN0IF9wdGhyZWFkX2Zhc3Rs b2NrIF9fbV9sb2NrOyAgCn0gcHRocmVhZF9tdXRleF90OwoKCiAKdHlwZWRlZiBzdHJ1Y3QKewog IGludCBfX211dGV4a2luZDsKfSBwdGhyZWFkX211dGV4YXR0cl90OwoKCiAKdHlwZWRlZiBpbnQg cHRocmVhZF9vbmNlX3Q7CgoKIyAxMTYgIi91c3IvaW5jbHVkZS9iaXRzL3B0aHJlYWR0eXBlcy5o IiAzCgoKCiAKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBwdGhyZWFkX3Q7CgoKIyAyNSAiL3Vz ci9pbmNsdWRlL3B0aHJlYWQuaCIgMiAzCgoKCmV4dGVybiAiQyIgeyAKCiAKCgoKCgoKCgoKCgoK CgoKCiAKCmVudW0KewogIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFLAoKICBQVEhSRUFEX0NSRUFU RV9ERVRBQ0hFRAoKfTsKCmVudW0KewogIFBUSFJFQURfSU5IRVJJVF9TQ0hFRCwKCiAgUFRIUkVB RF9FWFBMSUNJVF9TQ0hFRAoKfTsKCmVudW0KewogIFBUSFJFQURfU0NPUEVfU1lTVEVNLAoKICBQ VEhSRUFEX1NDT1BFX1BST0NFU1MKCn07CgplbnVtCnsKICBQVEhSRUFEX01VVEVYX0ZBU1RfTlAs CiAgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkVfTlAsCiAgUFRIUkVBRF9NVVRFWF9FUlJPUkNIRUNL X05QCgoKCgoKCgp9OwoKZW51bQp7CiAgUFRIUkVBRF9QUk9DRVNTX1BSSVZBVEUsCgogIFBUSFJF QURfUFJPQ0VTU19TSEFSRUQKCn07CgojIDEwMyAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwoK CgoKIAoKc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyCnsKICB2b2lkICgqX19yb3V0aW5l KSAgKHZvaWQgKikgIDsJICAgCiAgdm9pZCAqX19hcmc7CQkJCSAgIAogIGludCBfX2NhbmNlbHR5 cGU7CQkJICAgCiAgc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpfX3ByZXY7ICAKfTsK CiAKCmVudW0KewogIFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSwKCiAgUFRIUkVBRF9DQU5DRUxfRElT QUJMRQoKfTsKZW51bQp7CiAgUFRIUkVBRF9DQU5DRUxfREVGRVJSRUQsCgogIFBUSFJFQURfQ0FO Q0VMX0FTWU5DSFJPTk9VUwoKfTsKCgoKIAoKIAoKCmV4dGVybiBpbnQgcHRocmVhZF9jcmVhdGUg IChwdGhyZWFkX3QgKl9fdGhyZWFkLAoJCQkJX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRy LAoJCQkJdm9pZCAqKCpfX3N0YXJ0X3JvdXRpbmUpICh2b2lkICopLAoJCQkJdm9pZCAqX19hcmcp ICB0aHJvdyAoKSAgOwoKIApleHRlcm4gcHRocmVhZF90IHB0aHJlYWRfc2VsZiAgKHZvaWQpICB0 aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfZXF1YWwgIChwdGhyZWFkX3QgX190aHJl YWQxLCBwdGhyZWFkX3QgX190aHJlYWQyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIHZvaWQgcHRo cmVhZF9leGl0ICAodm9pZCAqX19yZXR2YWwpICB0aHJvdyAoKSAgIF9fYXR0cmlidXRlX18gKChf X25vcmV0dXJuX18pKTsKCiAKCgpleHRlcm4gaW50IHB0aHJlYWRfam9pbiAgKHB0aHJlYWRfdCBf X3RoLCB2b2lkICoqX190aHJlYWRfcmV0dXJuKSAgdGhyb3cgKCkgIDsKCiAKCgoKZXh0ZXJuIGlu dCBwdGhyZWFkX2RldGFjaCAgKHB0aHJlYWRfdCBfX3RoKSAgdGhyb3cgKCkgIDsKCgogCgogCgoK ZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfaW5pdCAgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIpICB0 aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9kZXN0cm95ICAocHRocmVhZF9h dHRyX3QgKl9fYXR0cikgIHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9hdHRyX3Nl dGRldGFjaHN0YXRlICAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKCQkJCQkgICAgIGludCBfX2Rl dGFjaHN0YXRlKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0ZGV0 YWNoc3RhdGUgIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCgkJCQkJICAgICBpbnQg Kl9fZGV0YWNoc3RhdGUpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9z ZXRzY2hlZHBhcmFtICAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKCQkJCSAgICAgICAgX19jb25z dCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50 IHB0aHJlYWRfYXR0cl9nZXRzY2hlZHBhcmFtICAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19h dHRyLAoJCQkJCSAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKl9fcGFyYW0pICB0aHJvdyAoKSAgOwoK IApleHRlcm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBvbGljeSAgKHB0aHJlYWRfYXR0cl90 ICpfX2F0dHIsCgkJCQkJICAgICBpbnQgX19wb2xpY3kpICB0aHJvdyAoKSAgOwoKIApleHRlcm4g aW50IHB0aHJlYWRfYXR0cl9nZXRzY2hlZHBvbGljeSAgKF9fY29uc3QgcHRocmVhZF9hdHRyX3Qg Kl9fYXR0ciwKCQkJCQkgICAgIGludCAqX19wb2xpY3kpICB0aHJvdyAoKSAgOwoKIApleHRlcm4g aW50IHB0aHJlYWRfYXR0cl9zZXRpbmhlcml0c2NoZWQgIChwdGhyZWFkX2F0dHJfdCAqX19hdHRy LAoJCQkJCSAgICAgIGludCBfX2luaGVyaXQpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0 aHJlYWRfYXR0cl9nZXRpbmhlcml0c2NoZWQgIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0 dHIsCgkJCQkJICAgICAgaW50ICpfX2luaGVyaXQpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50 IHB0aHJlYWRfYXR0cl9zZXRzY29wZSAgKHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsIGludCBfX3Nj b3BlKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2F0dHJfZ2V0c2NvcGUgIChf X2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCgkJCQkgICAgICAgaW50ICpfX3Njb3BlKSAg dGhyb3cgKCkgIDsKCiMgMjI0ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAzCgoKIAoKCgpleHRl cm4gaW50IHB0aHJlYWRfYXR0cl9zZXRzdGFja2FkZHIgIChwdGhyZWFkX2F0dHJfdCAqX19hdHRy LAoJCQkJCSAgIHZvaWQgKl9fc3RhY2thZGRyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBw dGhyZWFkX2F0dHJfZ2V0c3RhY2thZGRyICAoX19jb25zdCBwdGhyZWFkX2F0dHJfdCAqX19hdHRy LAoJCQkJCSAgIHZvaWQgKipfX3N0YWNrYWRkcikgIHRocm93ICgpICA7CgogCgoKZXh0ZXJuIGlu dCBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplICAocHRocmVhZF9hdHRyX3QgKl9fYXR0ciwKCQkJ CQkgICBzaXplX3QgX19zdGFja3NpemUpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IHB0aHJl YWRfYXR0cl9nZXRzdGFja3NpemUgIChfX2NvbnN0IHB0aHJlYWRfYXR0cl90ICpfX2F0dHIsCgkJ CQkJICAgc2l6ZV90ICpfX3N0YWNrc2l6ZSkgIHRocm93ICgpICA7CgogCgogCgpleHRlcm4gaW50 IHB0aHJlYWRfc2V0c2NoZWRwYXJhbSAgKHB0aHJlYWRfdCBfX3RhcmdldF90aHJlYWQsIGludCBf X3BvbGljeSwKCQkJCSAgICAgICBfX2NvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkg IHRocm93ICgpICA7CgogCmV4dGVybiBpbnQgcHRocmVhZF9nZXRzY2hlZHBhcmFtICAocHRocmVh ZF90IF9fdGFyZ2V0X3RocmVhZCwKCQkJCSAgICAgICBpbnQgKl9fcG9saWN5LAoJCQkJICAgICAg IHN0cnVjdCBzY2hlZF9wYXJhbSAqX19wYXJhbSkgIHRocm93ICgpICA7CgoKCgoKCgoKCiAKCiAK CmV4dGVybiBpbnQgX19wdGhyZWFkX211dGV4X2luaXQgIChwdGhyZWFkX211dGV4X3QgKl9fbXV0 ZXgsCgkJCQkgICBfX2NvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fbXV0ZXhfYXR0cikgIHRo cm93ICgpICA7CmV4dGVybiBpbnQgcHRocmVhZF9tdXRleF9pbml0ICAocHRocmVhZF9tdXRleF90 ICpfX211dGV4LAoJCQkJICAgX19jb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICpfX211dGV4X2F0 dHIpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF9kZXN0cm95ICAo cHRocmVhZF9tdXRleF90ICpfX211dGV4KSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBwdGhyZWFk X211dGV4X2Rlc3Ryb3kgIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpICB0aHJvdyAoKSAgOwoK IApleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2NrICAocHRocmVhZF9tdXRleF90ICpf X211dGV4KSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X3RyeWxvY2sgIChw dGhyZWFkX211dGV4X3QgKl9fbXV0ZXgpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IF9fcHRo cmVhZF9tdXRleF9sb2NrICAocHRocmVhZF9tdXRleF90ICpfX211dGV4KSAgdGhyb3cgKCkgIDsK ZXh0ZXJuIGludCBwdGhyZWFkX211dGV4X2xvY2sgIChwdGhyZWFkX211dGV4X3QgKl9fbXV0ZXgp ICB0aHJvdyAoKSAgOwoKIApleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleF91bmxvY2sgIChwdGhy ZWFkX211dGV4X3QgKl9fbXV0ZXgpICB0aHJvdyAoKSAgOwpleHRlcm4gaW50IHB0aHJlYWRfbXV0 ZXhfdW5sb2NrICAocHRocmVhZF9tdXRleF90ICpfX211dGV4KSAgdGhyb3cgKCkgIDsKCgogCgog CgpleHRlcm4gaW50IF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCAgKHB0aHJlYWRfbXV0ZXhhdHRy X3QgKl9fYXR0cikgIHRocm93ICgpICA7CmV4dGVybiBpbnQgcHRocmVhZF9tdXRleGF0dHJfaW5p dCAgKHB0aHJlYWRfbXV0ZXhhdHRyX3QgKl9fYXR0cikgIHRocm93ICgpICA7CgogCmV4dGVybiBp bnQgX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICAocHRocmVhZF9tdXRleGF0dHJfdCAqX19h dHRyKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95ICAo cHRocmVhZF9tdXRleGF0dHJfdCAqX19hdHRyKSAgdGhyb3cgKCkgIDsKCiMgMzE2ICIvdXNyL2lu Y2x1ZGUvcHRocmVhZC5oIiAzCgoKCiAKCiAKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX2luaXQg IChwdGhyZWFkX2NvbmRfdCAqX19jb25kLAoJCQkJICAgX19jb25zdCBwdGhyZWFkX2NvbmRhdHRy X3QgKl9fY29uZF9hdHRyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRf ZGVzdHJveSAgKHB0aHJlYWRfY29uZF90ICpfX2NvbmQpICB0aHJvdyAoKSAgOwoKIApleHRlcm4g aW50IHB0aHJlYWRfY29uZF9zaWduYWwgIChwdGhyZWFkX2NvbmRfdCAqX19jb25kKSAgdGhyb3cg KCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0ICAocHRocmVhZF9jb25k X3QgKl9fY29uZCkgIHRocm93ICgpICA7CgogCgpleHRlcm4gaW50IHB0aHJlYWRfY29uZF93YWl0 ICAocHRocmVhZF9jb25kX3QgKl9fY29uZCwKCQkJCSAgIHB0aHJlYWRfbXV0ZXhfdCAqX19tdXRl eCkgIHRocm93ICgpICA7CgogCgoKCmV4dGVybiBpbnQgcHRocmVhZF9jb25kX3RpbWVkd2FpdCAg KHB0aHJlYWRfY29uZF90ICpfX2NvbmQsCgkJCQkJcHRocmVhZF9tdXRleF90ICpfX211dGV4LAoJ CQkJCV9fY29uc3Qgc3RydWN0IHRpbWVzcGVjICpfX2Fic3RpbWUpICB0aHJvdyAoKSAgOwoKIAoK IApleHRlcm4gaW50IHB0aHJlYWRfY29uZGF0dHJfaW5pdCAgKHB0aHJlYWRfY29uZGF0dHJfdCAq X19hdHRyKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2NvbmRhdHRyX2Rlc3Ry b3kgIChwdGhyZWFkX2NvbmRhdHRyX3QgKl9fYXR0cikgIHRocm93ICgpICA7CgoKIyA0MDkgIi91 c3IvaW5jbHVkZS9wdGhyZWFkLmgiIDMKCgoKIAoKIAoKCgoKCmV4dGVybiBpbnQgX19wdGhyZWFk X2tleV9jcmVhdGUgIChwdGhyZWFkX2tleV90ICpfX2tleSwKCQkJCSAgICAgIHZvaWQgKCpfX2Rl c3RyX2Z1bmN0aW9uKSAodm9pZCAqKSkgIHRocm93ICgpICA7CmV4dGVybiBpbnQgcHRocmVhZF9r ZXlfY3JlYXRlICAocHRocmVhZF9rZXlfdCAqX19rZXksCgkJCQkgICAgdm9pZCAoKl9fZGVzdHJf ZnVuY3Rpb24pICh2b2lkICopKSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGludCBwdGhyZWFkX2tl eV9kZWxldGUgIChwdGhyZWFkX2tleV90IF9fa2V5KSAgdGhyb3cgKCkgIDsKCiAKZXh0ZXJuIGlu dCBfX3B0aHJlYWRfc2V0c3BlY2lmaWMgIChwdGhyZWFkX2tleV90IF9fa2V5LAoJCQkJICAgICAg IF9fY29uc3Qgdm9pZCAqX19wb2ludGVyKSAgdGhyb3cgKCkgIDsKZXh0ZXJuIGludCBwdGhyZWFk X3NldHNwZWNpZmljICAocHRocmVhZF9rZXlfdCBfX2tleSwKCQkJCSAgICAgX19jb25zdCB2b2lk ICpfX3BvaW50ZXIpICB0aHJvdyAoKSAgOwoKIApleHRlcm4gdm9pZCAqX19wdGhyZWFkX2dldHNw ZWNpZmljICAocHRocmVhZF9rZXlfdCBfX2tleSkgIHRocm93ICgpICA7CmV4dGVybiB2b2lkICpw dGhyZWFkX2dldHNwZWNpZmljICAocHRocmVhZF9rZXlfdCBfX2tleSkgIHRocm93ICgpICA7CgoK IAoKIAoKCgpleHRlcm4gaW50IF9fcHRocmVhZF9vbmNlICAocHRocmVhZF9vbmNlX3QgKl9fb25j ZV9jb250cm9sLAoJCQkJdm9pZCAoKl9faW5pdF9yb3V0aW5lKSAodm9pZCkpICB0aHJvdyAoKSAg OwpleHRlcm4gaW50IHB0aHJlYWRfb25jZSAgKHB0aHJlYWRfb25jZV90ICpfX29uY2VfY29udHJv bCwKCQkJICAgICAgdm9pZCAoKl9faW5pdF9yb3V0aW5lKSAodm9pZCkpICB0aHJvdyAoKSAgOwoK CiAKCiAKCmV4dGVybiBpbnQgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSAgKGludCBfX3N0YXRlLCBp bnQgKl9fb2xkc3RhdGUpICB0aHJvdyAoKSAgOwoKIAoKZXh0ZXJuIGludCBwdGhyZWFkX3NldGNh bmNlbHR5cGUgIChpbnQgX190eXBlLCBpbnQgKl9fb2xkdHlwZSkgIHRocm93ICgpICA7CgogCmV4 dGVybiBpbnQgcHRocmVhZF9jYW5jZWwgIChwdGhyZWFkX3QgX190aHJlYWQpICB0aHJvdyAoKSAg OwoKIAoKCmV4dGVybiB2b2lkIHB0aHJlYWRfdGVzdGNhbmNlbCAgKHZvaWQpICB0aHJvdyAoKSAg OwoKCiAKCgoKCgoKCgoKCmV4dGVybiB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaCAgKHN0cnVj dCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqX19idWZmZXIsCgkJCQkJdm9pZCAoKl9fcm91dGlu ZSkgKHZvaWQgKiksCgkJCQkJdm9pZCAqX19hcmcpICB0aHJvdyAoKSAgOwoKIAoKCgoKCmV4dGVy biB2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wICAoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVm ZmVyICpfX2J1ZmZlciwKCQkJCSAgICAgICBpbnQgX19leGVjdXRlKSAgdGhyb3cgKCkgIDsKCiAK CgojIDUxNSAiL3Vzci9pbmNsdWRlL3B0aHJlYWQuaCIgMwoKCiAKIyAxICIvdXNyL2luY2x1ZGUv Yml0cy9zaWd0aHJlYWQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCiAKCmV4 dGVybiBpbnQgcHRocmVhZF9zaWdtYXNrICAoaW50IF9faG93LCBfX2NvbnN0IF9fc2lnc2V0X3Qg Kl9fbmV3bWFzaywKCQkJCSBfX3NpZ3NldF90ICpfX29sZG1hc2spICB0aHJvdyAoKSAgOwoKIApl eHRlcm4gaW50IHB0aHJlYWRfa2lsbCAgKHB0aHJlYWRfdCBfX3RocmVhZCwgaW50IF9fc2lnbm8p ICB0aHJvdyAoKSAgOwoKCiMgNTE4ICIvdXNyL2luY2x1ZGUvcHRocmVhZC5oIiAyIDMKCgoKIAoK IAoKCgoKCgoKCgoKZXh0ZXJuIGludCBfX3B0aHJlYWRfYXRmb3JrICAodm9pZCAoKl9fcHJlcGFy ZSkgKHZvaWQpLAoJCQkJICB2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKCQkJCSAgdm9pZCAoKl9f Y2hpbGQpICh2b2lkKSkgIHRocm93ICgpICA7CmV4dGVybiBpbnQgcHRocmVhZF9hdGZvcmsgICh2 b2lkICgqX19wcmVwYXJlKSAodm9pZCksCgkJCQl2b2lkICgqX19wYXJlbnQpICh2b2lkKSwKCQkJ CXZvaWQgKCpfX2NoaWxkKSAodm9pZCkpICB0aHJvdyAoKSAgOwoKIAoKCmV4dGVybiB2b2lkIHB0 aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wICAodm9pZCkgIHRocm93ICgpICA7CgoKIApleHRl cm4gdm9pZCBfX3B0aHJlYWRfaW5pdGlhbGl6ZSAgKHZvaWQpICB0aHJvdyAoKSAgOwoKfSAKCgoj IDcxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4u Ly4uL2luY2x1ZGUvZysrLTMvc3RsX2FsbG9jLmgiIDIgMwoKCgoKCgoKCiMgODcgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9zdGxfYWxsb2MuaCIgMwoKIyA5NyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtl LWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoj IDExNSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8u Li8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoKCgoKCgoKCiAKCgoKCgogCiAKCgoK CgoKCgoKdGVtcGxhdGUgPGludCBfX2luc3Q+CmNsYXNzIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRl IHsKCnByaXZhdGU6CgogIHN0YXRpYyB2b2lkKiBfU19vb21fbWFsbG9jKHNpemVfdCk7CiAgc3Rh dGljIHZvaWQqIF9TX29vbV9yZWFsbG9jKHZvaWQqLCBzaXplX3QpOwoKCiAgc3RhdGljIHZvaWQg KCogX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRsZXIpKCk7CgoKcHVibGljOgoKICBzdGF0aWMgdm9p ZCogYWxsb2NhdGUoc2l6ZV90IF9fbikKICB7CiAgICB2b2lkKiBfX3Jlc3VsdCA9IG1hbGxvYyhf X24pOwogICAgaWYgKDAgPT0gX19yZXN1bHQpIF9fcmVzdWx0ID0gX1Nfb29tX21hbGxvYyhfX24p OwogICAgcmV0dXJuIF9fcmVzdWx0OwogIH0KCiAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZSh2b2lk KiBfX3AsIHNpemVfdCAgKQogIHsKICAgIGZyZWUoX19wKTsKICB9CgogIHN0YXRpYyB2b2lkKiBy ZWFsbG9jYXRlKHZvaWQqIF9fcCwgc2l6ZV90ICAsIHNpemVfdCBfX25ld19zeikKICB7CiAgICB2 b2lkKiBfX3Jlc3VsdCA9IHJlYWxsb2MoX19wLCBfX25ld19zeik7CiAgICBpZiAoMCA9PSBfX3Jl c3VsdCkgX19yZXN1bHQgPSBfU19vb21fcmVhbGxvYyhfX3AsIF9fbmV3X3N6KTsKICAgIHJldHVy biBfX3Jlc3VsdDsKICB9CgogIHN0YXRpYyB2b2lkICgqIF9fc2V0X21hbGxvY19oYW5kbGVyKHZv aWQgKCpfX2YpKCkpKSgpCiAgewogICAgdm9pZCAoKiBfX29sZCkoKSA9IF9fbWFsbG9jX2FsbG9j X29vbV9oYW5kbGVyOwogICAgX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRsZXIgPSBfX2Y7CiAgICBy ZXR1cm4oX19vbGQpOwogIH0KCn07CgogCgoKdGVtcGxhdGUgPGludCBfX2luc3Q+CnZvaWQgKCog X19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8X19pbnN0Pjo6X19tYWxsb2NfYWxsb2Nfb29tX2hhbmRs ZXIpKCkgPSAwOwoKCnRlbXBsYXRlIDxpbnQgX19pbnN0Pgp2b2lkKgpfX21hbGxvY19hbGxvY190 ZW1wbGF0ZTxfX2luc3Q+OjpfU19vb21fbWFsbG9jKHNpemVfdCBfX24pCnsKICAgIHZvaWQgKCog X19teV9tYWxsb2NfaGFuZGxlcikoKTsKICAgIHZvaWQqIF9fcmVzdWx0OwoKICAgIGZvciAoOzsp IHsKICAgICAgICBfX215X21hbGxvY19oYW5kbGVyID0gX19tYWxsb2NfYWxsb2Nfb29tX2hhbmRs ZXI7CiAgICAgICAgaWYgKDAgPT0gX19teV9tYWxsb2NfaGFuZGxlcikgeyBjZXJyIDw8ICJvdXQg b2YgbWVtb3J5IiA8PCBlbmRsOyBleGl0KDEpIDsgfQogICAgICAgICgqX19teV9tYWxsb2NfaGFu ZGxlcikoKTsKICAgICAgICBfX3Jlc3VsdCA9IG1hbGxvYyhfX24pOwogICAgICAgIGlmIChfX3Jl c3VsdCkgcmV0dXJuKF9fcmVzdWx0KTsKICAgIH0KfQoKdGVtcGxhdGUgPGludCBfX2luc3Q+CnZv aWQqIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD46Ol9TX29vbV9yZWFsbG9jKHZvaWQq IF9fcCwgc2l6ZV90IF9fbikKewogICAgdm9pZCAoKiBfX215X21hbGxvY19oYW5kbGVyKSgpOwog ICAgdm9pZCogX19yZXN1bHQ7CgogICAgZm9yICg7OykgewogICAgICAgIF9fbXlfbWFsbG9jX2hh bmRsZXIgPSBfX21hbGxvY19hbGxvY19vb21faGFuZGxlcjsKICAgICAgICBpZiAoMCA9PSBfX215 X21hbGxvY19oYW5kbGVyKSB7IGNlcnIgPDwgIm91dCBvZiBtZW1vcnkiIDw8IGVuZGw7IGV4aXQo MSkgOyB9CiAgICAgICAgKCpfX215X21hbGxvY19oYW5kbGVyKSgpOwogICAgICAgIF9fcmVzdWx0 ID0gcmVhbGxvYyhfX3AsIF9fbik7CiAgICAgICAgaWYgKF9fcmVzdWx0KSByZXR1cm4oX19yZXN1 bHQpOwogICAgfQp9Cgp0eXBlZGVmIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPDA+IG1hbGxvY19h bGxvYzsKCnRlbXBsYXRlPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpjbGFzcyBzaW1wbGVfYWxs b2MgewoKcHVibGljOgogICAgc3RhdGljIF9UcCogYWxsb2NhdGUoc2l6ZV90IF9fbikKICAgICAg eyByZXR1cm4gMCA9PSBfX24gPyAwIDogKF9UcCopIF9BbGxvYzo6YWxsb2NhdGUoX19uICogc2l6 ZW9mIChfVHApKTsgfQogICAgc3RhdGljIF9UcCogYWxsb2NhdGUodm9pZCkKICAgICAgeyByZXR1 cm4gKF9UcCopIF9BbGxvYzo6YWxsb2NhdGUoc2l6ZW9mIChfVHApKTsgfQogICAgc3RhdGljIHZv aWQgZGVhbGxvY2F0ZShfVHAqIF9fcCwgc2l6ZV90IF9fbikKICAgICAgeyBpZiAoMCAhPSBfX24p IF9BbGxvYzo6ZGVhbGxvY2F0ZShfX3AsIF9fbiAqIHNpemVvZiAoX1RwKSk7IH0KICAgIHN0YXRp YyB2b2lkIGRlYWxsb2NhdGUoX1RwKiBfX3ApCiAgICAgIHsgX0FsbG9jOjpkZWFsbG9jYXRlKF9f cCwgc2l6ZW9mIChfVHApKTsgfQp9OwoKIAogCiAKIAogCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+ CmNsYXNzIGRlYnVnX2FsbG9jIHsKCnByaXZhdGU6CgogIGVudW0ge19TX2V4dHJhID0gOH07ICAg CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIAoKcHVi bGljOgoKICBzdGF0aWMgdm9pZCogYWxsb2NhdGUoc2l6ZV90IF9fbikKICB7CiAgICBjaGFyKiBf X3Jlc3VsdCA9IChjaGFyKilfQWxsb2M6OmFsbG9jYXRlKF9fbiArIF9TX2V4dHJhKTsKICAgICoo c2l6ZV90KilfX3Jlc3VsdCA9IF9fbjsKICAgIHJldHVybiBfX3Jlc3VsdCArIF9TX2V4dHJhOwog IH0KCiAgc3RhdGljIHZvaWQgZGVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX24pCiAgewog ICAgY2hhciogX19yZWFsX3AgPSAoY2hhciopX19wIC0gX1NfZXh0cmE7CiAgICAoKHZvaWQpICgo ICooc2l6ZV90KilfX3JlYWxfcCA9PSBfX24gKSA/IDAgOgkoX19hc3NlcnRfZmFpbCAoIiooc2l6 ZV90KilfX3JlYWxfcCA9PSBfX24iICwJIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIsIDI2Mywg X19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgIF9BbGxvYzo6ZGVhbGxvY2F0ZShfX3Jl YWxfcCwgX19uICsgX1NfZXh0cmEpOwogIH0KCiAgc3RhdGljIHZvaWQqIHJlYWxsb2NhdGUodm9p ZCogX19wLCBzaXplX3QgX19vbGRfc3osIHNpemVfdCBfX25ld19zeikKICB7CiAgICBjaGFyKiBf X3JlYWxfcCA9IChjaGFyKilfX3AgLSBfU19leHRyYTsKICAgICgodm9pZCkgKCggKihzaXplX3Qq KV9fcmVhbF9wID09IF9fb2xkX3N6ICkgPyAwIDoJKF9fYXNzZXJ0X2ZhaWwgKCIqKHNpemVfdCop X19yZWFsX3AgPT0gX19vbGRfc3oiICwJIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfYWxsb2MuaCIsIDI3MCwg X19QUkVUVFlfRlVOQ1RJT05fXyApLCAwKSkpIDsKICAgIGNoYXIqIF9fcmVzdWx0ID0gKGNoYXIq KQogICAgICBfQWxsb2M6OnJlYWxsb2NhdGUoX19yZWFsX3AsIF9fb2xkX3N6ICsgX1NfZXh0cmEs IF9fbmV3X3N6ICsgX1NfZXh0cmEpOwogICAgKihzaXplX3QqKV9fcmVzdWx0ID0gX19uZXdfc3o7 CiAgICByZXR1cm4gX19yZXN1bHQgKyBfU19leHRyYTsKICB9Cgp9OwoKCgoKCgoKCgoKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCgogCiAKIAogCiAKIAogCiAKIAoKCgoKCgoKdGVtcGxhdGUg PGJvb2wgdGhyZWFkcywgaW50IGluc3Q+CmNsYXNzIF9fZGVmYXVsdF9hbGxvY190ZW1wbGF0ZSB7 Cgpwcml2YXRlOgogICAKICAgCgogICAgZW51bSB7X0FMSUdOID0gOH07CiAgICBlbnVtIHtfTUFY X0JZVEVTID0gMTI4fTsKICAgIGVudW0ge19ORlJFRUxJU1RTID0gX01BWF9CWVRFUy9fQUxJR059 OwoKICBzdGF0aWMgc2l6ZV90CiAgX1Nfcm91bmRfdXAoc2l6ZV90IF9fYnl0ZXMpCiAgICB7IHJl dHVybiAoKChfX2J5dGVzKSArIF9BTElHTi0xKSAmIH4oX0FMSUdOIC0gMSkpOyB9Cgpwcml2YXRl IDoKICB1bmlvbiBfT2JqIHsKICAgICAgICB1bmlvbiBfT2JqKiBfTV9mcmVlX2xpc3RfbGluazsK ICAgICAgICBjaGFyIF9NX2NsaWVudF9kYXRhWzFdOyAgICAgCiAgfTsKcHJpdmF0ZToKCgoKCiAg ICBzdGF0aWMgX09iaiogdm9sYXRpbGUgIF9TX2ZyZWVfbGlzdFtfTkZSRUVMSVNUU107CgogIHN0 YXRpYyAgc2l6ZV90IF9TX2ZyZWVsaXN0X2luZGV4KHNpemVfdCBfX2J5dGVzKSB7CiAgICAgICAg cmV0dXJuICgoKF9fYnl0ZXMpICsgX0FMSUdOLTEpL19BTElHTiAtIDEpOwogIH0KCiAgIAogIHN0 YXRpYyB2b2lkKiBfU19yZWZpbGwoc2l6ZV90IF9fbik7CiAgIAogICAKICBzdGF0aWMgY2hhciog X1NfY2h1bmtfYWxsb2Moc2l6ZV90IF9fc2l6ZSwgaW50JiBfX25vYmpzKTsKCiAgIAogIHN0YXRp YyBjaGFyKiBfU19zdGFydF9mcmVlOwogIHN0YXRpYyBjaGFyKiBfU19lbmRfZnJlZTsKICBzdGF0 aWMgc2l6ZV90IF9TX2hlYXBfc2l6ZTsKCgoKCgoKCgogICAgc3RhdGljIHB0aHJlYWRfbXV0ZXhf dCBfU19ub2RlX2FsbG9jYXRvcl9sb2NrOwoKCgoKCgojIDM4OSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9h bGxvYy5oIiAzCgoKICAgIGNsYXNzIF9Mb2NrIHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAg IF9Mb2NrKCkgeyBpZiAodGhyZWFkcykgcHRocmVhZF9tdXRleF9sb2NrKCZfU19ub2RlX2FsbG9j YXRvcl9sb2NrKSA7IH0KICAgICAgICAgICAgfl9Mb2NrKCkgeyBpZiAodGhyZWFkcykgcHRocmVh ZF9tdXRleF91bmxvY2soJl9TX25vZGVfYWxsb2NhdG9yX2xvY2spIDsgfQogICAgfTsKICAgIGZy aWVuZCBjbGFzcyBfTG9jazsKCnB1YmxpYzoKCiAgIAogIHN0YXRpYyB2b2lkKiBhbGxvY2F0ZShz aXplX3QgX19uKQogIHsKICAgIF9PYmoqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CiAgICBf T2JqKiAgIF9fcmVzdWx0OwoKICAgIGlmIChfX24gPiAoc2l6ZV90KSBfTUFYX0JZVEVTKSB7CiAg ICAgICAgcmV0dXJuKG1hbGxvY19hbGxvYzo6YWxsb2NhdGUoX19uKSk7CiAgICB9CiAgICBfX215 X2ZyZWVfbGlzdCA9IF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4KF9fbik7CiAgICAg CiAgICAgCiAgICAgCgogICAgICAgICAKICAgICAgICBfTG9jayBfX2xvY2tfaW5zdGFuY2U7Cgog ICAgX19yZXN1bHQgPSAqX19teV9mcmVlX2xpc3Q7CiAgICBpZiAoX19yZXN1bHQgPT0gMCkgewog ICAgICAgIHZvaWQqIF9fciA9IF9TX3JlZmlsbChfU19yb3VuZF91cChfX24pKTsKICAgICAgICBy ZXR1cm4gX19yOwogICAgfQogICAgKl9fbXlfZnJlZV9saXN0ID0gX19yZXN1bHQgLT4gX01fZnJl ZV9saXN0X2xpbms7CiAgICByZXR1cm4gKF9fcmVzdWx0KTsKICB9OwoKICAgCiAgc3RhdGljIHZv aWQgZGVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX24pCiAgewogICAgX09iaiogX19xID0g KF9PYmoqKV9fcDsKICAgIF9PYmoqIHZvbGF0aWxlICogX19teV9mcmVlX2xpc3Q7CgogICAgaWYg KF9fbiA+IChzaXplX3QpIF9NQVhfQllURVMpIHsKICAgICAgICBtYWxsb2NfYWxsb2M6OmRlYWxs b2NhdGUoX19wLCBfX24pOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIF9fbXlfZnJlZV9saXN0 ID0gX1NfZnJlZV9saXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19uKTsKICAgICAKCiAgICAgICAg IAogICAgICAgIF9Mb2NrIF9fbG9ja19pbnN0YW5jZTsKCiAgICBfX3EgLT4gX01fZnJlZV9saXN0 X2xpbmsgPSAqX19teV9mcmVlX2xpc3Q7CiAgICAqX19teV9mcmVlX2xpc3QgPSBfX3E7CiAgICAg CiAgfQoKICBzdGF0aWMgdm9pZCogcmVhbGxvY2F0ZSh2b2lkKiBfX3AsIHNpemVfdCBfX29sZF9z eiwgc2l6ZV90IF9fbmV3X3N6KTsKCn0gOwoKdHlwZWRlZiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxh dGU8IHRydWUgLCAwPiBhbGxvYzsKdHlwZWRlZiBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8ZmFs c2UsIDA+IHNpbmdsZV9jbGllbnRfYWxsb2M7CgoKCiAKIAogCiAKdGVtcGxhdGUgPGJvb2wgX190 aHJlYWRzLCBpbnQgX19pbnN0PgpjaGFyKgpfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJl YWRzLCBfX2luc3Q+OjpfU19jaHVua19hbGxvYyhzaXplX3QgX19zaXplLAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIF9fbm9i anMpCnsKICAgIGNoYXIqIF9fcmVzdWx0OwogICAgc2l6ZV90IF9fdG90YWxfYnl0ZXMgPSBfX3Np emUgKiBfX25vYmpzOwogICAgc2l6ZV90IF9fYnl0ZXNfbGVmdCA9IF9TX2VuZF9mcmVlIC0gX1Nf c3RhcnRfZnJlZTsKCiAgICBpZiAoX19ieXRlc19sZWZ0ID49IF9fdG90YWxfYnl0ZXMpIHsKICAg ICAgICBfX3Jlc3VsdCA9IF9TX3N0YXJ0X2ZyZWU7CiAgICAgICAgX1Nfc3RhcnRfZnJlZSArPSBf X3RvdGFsX2J5dGVzOwogICAgICAgIHJldHVybihfX3Jlc3VsdCk7CiAgICB9IGVsc2UgaWYgKF9f Ynl0ZXNfbGVmdCA+PSBfX3NpemUpIHsKICAgICAgICBfX25vYmpzID0gKGludCkoX19ieXRlc19s ZWZ0L19fc2l6ZSk7CiAgICAgICAgX190b3RhbF9ieXRlcyA9IF9fc2l6ZSAqIF9fbm9ianM7CiAg ICAgICAgX19yZXN1bHQgPSBfU19zdGFydF9mcmVlOwogICAgICAgIF9TX3N0YXJ0X2ZyZWUgKz0g X190b3RhbF9ieXRlczsKICAgICAgICByZXR1cm4oX19yZXN1bHQpOwogICAgfSBlbHNlIHsKICAg ICAgICBzaXplX3QgX19ieXRlc190b19nZXQgPQoJICAyICogX190b3RhbF9ieXRlcyArIF9TX3Jv dW5kX3VwKF9TX2hlYXBfc2l6ZSA+PiA0KTsKICAgICAgICAgCiAgICAgICAgaWYgKF9fYnl0ZXNf bGVmdCA+IDApIHsKICAgICAgICAgICAgX09iaiogdm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdCA9 CiAgICAgICAgICAgICAgICAgICAgICAgIF9TX2ZyZWVfbGlzdCArIF9TX2ZyZWVsaXN0X2luZGV4 KF9fYnl0ZXNfbGVmdCk7CgogICAgICAgICAgICAoKF9PYmoqKV9TX3N0YXJ0X2ZyZWUpIC0+IF9N X2ZyZWVfbGlzdF9saW5rID0gKl9fbXlfZnJlZV9saXN0OwogICAgICAgICAgICAqX19teV9mcmVl X2xpc3QgPSAoX09iaiopX1Nfc3RhcnRfZnJlZTsKICAgICAgICB9CiAgICAgICAgX1Nfc3RhcnRf ZnJlZSA9IChjaGFyKiltYWxsb2MoX19ieXRlc190b19nZXQpOwogICAgICAgIGlmICgwID09IF9T X3N0YXJ0X2ZyZWUpIHsKICAgICAgICAgICAgc2l6ZV90IF9faTsKICAgICAgICAgICAgX09iaiog dm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdDsKCSAgICBfT2JqKiBfX3A7CiAgICAgICAgICAgICAK ICAgICAgICAgICAgIAogICAgICAgICAgICAgCiAgICAgICAgICAgIGZvciAoX19pID0gX19zaXpl OyBfX2kgPD0gX01BWF9CWVRFUzsgX19pICs9IF9BTElHTikgewogICAgICAgICAgICAgICAgX19t eV9mcmVlX2xpc3QgPSBfU19mcmVlX2xpc3QgKyBfU19mcmVlbGlzdF9pbmRleChfX2kpOwogICAg ICAgICAgICAgICAgX19wID0gKl9fbXlfZnJlZV9saXN0OwogICAgICAgICAgICAgICAgaWYgKDAg IT0gX19wKSB7CiAgICAgICAgICAgICAgICAgICAgKl9fbXlfZnJlZV9saXN0ID0gX19wIC0+IF9N X2ZyZWVfbGlzdF9saW5rOwogICAgICAgICAgICAgICAgICAgIF9TX3N0YXJ0X2ZyZWUgPSAoY2hh ciopX19wOwogICAgICAgICAgICAgICAgICAgIF9TX2VuZF9mcmVlID0gX1Nfc3RhcnRfZnJlZSAr IF9faTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4oX1NfY2h1bmtfYWxsb2MoX19zaXplLCBf X25vYmpzKSk7CiAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAKICAg ICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoJICAgIF9TX2VuZF9mcmVlID0gMDsJIAogICAg ICAgICAgICBfU19zdGFydF9mcmVlID0gKGNoYXIqKW1hbGxvY19hbGxvYzo6YWxsb2NhdGUoX19i eXRlc190b19nZXQpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICAKICAgICAgICAgICAgIAog ICAgICAgIH0KICAgICAgICBfU19oZWFwX3NpemUgKz0gX19ieXRlc190b19nZXQ7CiAgICAgICAg X1NfZW5kX2ZyZWUgPSBfU19zdGFydF9mcmVlICsgX19ieXRlc190b19nZXQ7CiAgICAgICAgcmV0 dXJuKF9TX2NodW5rX2FsbG9jKF9fc2l6ZSwgX19ub2JqcykpOwogICAgfQp9CgoKIAogCiAKdGVt cGxhdGUgPGJvb2wgX190aHJlYWRzLCBpbnQgX19pbnN0Pgp2b2lkKgpfX2RlZmF1bHRfYWxsb2Nf dGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+OjpfU19yZWZpbGwoc2l6ZV90IF9fbikKewogICAg aW50IF9fbm9ianMgPSAyMDsKICAgIGNoYXIqIF9fY2h1bmsgPSBfU19jaHVua19hbGxvYyhfX24s IF9fbm9ianMpOwogICAgX09iaiogdm9sYXRpbGUgKiBfX215X2ZyZWVfbGlzdDsKICAgIF9PYmoq IF9fcmVzdWx0OwogICAgX09iaiogX19jdXJyZW50X29iajsKICAgIF9PYmoqIF9fbmV4dF9vYmo7 CiAgICBpbnQgX19pOwoKICAgIGlmICgxID09IF9fbm9ianMpIHJldHVybihfX2NodW5rKTsKICAg IF9fbXlfZnJlZV9saXN0ID0gX1NfZnJlZV9saXN0ICsgX1NfZnJlZWxpc3RfaW5kZXgoX19uKTsK CiAgICAgCiAgICAgIF9fcmVzdWx0ID0gKF9PYmoqKV9fY2h1bms7CiAgICAgICpfX215X2ZyZWVf bGlzdCA9IF9fbmV4dF9vYmogPSAoX09iaiopKF9fY2h1bmsgKyBfX24pOwogICAgICBmb3IgKF9f aSA9IDE7IDsgX19pKyspIHsKICAgICAgICBfX2N1cnJlbnRfb2JqID0gX19uZXh0X29iajsKICAg ICAgICBfX25leHRfb2JqID0gKF9PYmoqKSgoY2hhciopX19uZXh0X29iaiArIF9fbik7CiAgICAg ICAgaWYgKF9fbm9ianMgLSAxID09IF9faSkgewogICAgICAgICAgICBfX2N1cnJlbnRfb2JqIC0+ IF9NX2ZyZWVfbGlzdF9saW5rID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNl IHsKICAgICAgICAgICAgX19jdXJyZW50X29iaiAtPiBfTV9mcmVlX2xpc3RfbGluayA9IF9fbmV4 dF9vYmo7CiAgICAgICAgfQogICAgICB9CiAgICByZXR1cm4oX19yZXN1bHQpOwp9Cgp0ZW1wbGF0 ZSA8Ym9vbCB0aHJlYWRzLCBpbnQgaW5zdD4Kdm9pZCoKX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRl PHRocmVhZHMsIGluc3Q+OjpyZWFsbG9jYXRlKHZvaWQqIF9fcCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX29sZF9zeiwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBfX25l d19zeikKewogICAgdm9pZCogX19yZXN1bHQ7CiAgICBzaXplX3QgX19jb3B5X3N6OwoKICAgIGlm IChfX29sZF9zeiA+IChzaXplX3QpIF9NQVhfQllURVMgJiYgX19uZXdfc3ogPiAoc2l6ZV90KSBf TUFYX0JZVEVTKSB7CiAgICAgICAgcmV0dXJuKHJlYWxsb2MoX19wLCBfX25ld19zeikpOwogICAg fQogICAgaWYgKF9TX3JvdW5kX3VwKF9fb2xkX3N6KSA9PSBfU19yb3VuZF91cChfX25ld19zeikp IHJldHVybihfX3ApOwogICAgX19yZXN1bHQgPSBhbGxvY2F0ZShfX25ld19zeik7CiAgICBfX2Nv cHlfc3ogPSBfX25ld19zeiA+IF9fb2xkX3N6PyBfX29sZF9zeiA6IF9fbmV3X3N6OwogICAgbWVt Y3B5KF9fcmVzdWx0LCBfX3AsIF9fY29weV9zeik7CiAgICBkZWFsbG9jYXRlKF9fcCwgX19vbGRf c3opOwogICAgcmV0dXJuKF9fcmVzdWx0KTsKfQoKCiAgICB0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVh ZHMsIGludCBfX2luc3Q+CiAgICBwdGhyZWFkX211dGV4X3QKICAgIF9fZGVmYXVsdF9hbGxvY190 ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9TX25vZGVfYWxsb2NhdG9yX2xvY2sKICAgICAg ICA9IHswLCAwLCAwLCBQVEhSRUFEX01VVEVYX0ZBU1RfTlAsIHswLCAwfX0gOwoKCgoKCgoKCgoj IDYwMiAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8u Li8uLi9pbmNsdWRlL2crKy0zL3N0bF9hbGxvYy5oIiAzCgoKIyA2ODkgIi91c3IvbGliL2djYy1s aWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9z dGxfYWxsb2MuaCIgMwoKCnRlbXBsYXRlIDxib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4KY2hh ciogX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywgX19pbnN0Pjo6X1Nfc3RhcnRf ZnJlZSA9IDA7Cgp0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2luc3Q+CmNoYXIqIF9f ZGVmYXVsdF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9TX2VuZF9mcmVlID0g MDsKCnRlbXBsYXRlIDxib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4Kc2l6ZV90IF9fZGVmYXVs dF9hbGxvY190ZW1wbGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9TX2hlYXBfc2l6ZSA9IDA7Cgp0 ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2luc3Q+Cl9fZGVmYXVsdF9hbGxvY190ZW1w bGF0ZTxfX3RocmVhZHMsIF9faW5zdD46Ol9PYmoqIHZvbGF0aWxlIApfX2RlZmF1bHRfYWxsb2Nf dGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+IDo6X1NfZnJlZV9saXN0WwogICAgX05GUkVFTElT VFMKXSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCB9 OwogCiAKIAoKCgoKCgoKCgoKIAogCiAKIAogCiAKIAoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpj bGFzcyBhbGxvY2F0b3IgewogIHR5cGVkZWYgYWxsb2MgX0FsbG9jOyAgICAgICAgICAgCnB1Ymxp YzoKICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOwogIHR5cGVkZWYgcHRyZGlmZl90ICBk aWZmZXJlbmNlX3R5cGU7CiAgdHlwZWRlZiBfVHAqICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBj b25zdCBfVHAqIGNvbnN0X3BvaW50ZXI7CiAgdHlwZWRlZiBfVHAmICAgICAgIHJlZmVyZW5jZTsK ICB0eXBlZGVmIGNvbnN0IF9UcCYgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgX1RwICAgICAg ICB2YWx1ZV90eXBlOwoKICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4gc3RydWN0IHJlYmluZCB7CiAg ICB0eXBlZGVmIGFsbG9jYXRvcjxfVHAxPiBvdGhlcjsKICB9OwoKICBhbGxvY2F0b3IoKSB0aHJv dygpICB7fQogIGFsbG9jYXRvcihjb25zdCBhbGxvY2F0b3ImKSB0aHJvdygpICB7fQogIHRlbXBs YXRlIDxjbGFzcyBfVHAxPiBhbGxvY2F0b3IoY29uc3QgYWxsb2NhdG9yPF9UcDE+JikgdGhyb3co KSAge30KICB+YWxsb2NhdG9yKCkgdGhyb3coKSAge30KCiAgcG9pbnRlciBhZGRyZXNzKHJlZmVy ZW5jZSBfX3gpIGNvbnN0IHsgcmV0dXJuICZfX3g7IH0KICBjb25zdF9wb2ludGVyIGFkZHJlc3Mo Y29uc3RfcmVmZXJlbmNlIF9feCkgY29uc3QgeyByZXR1cm4gJl9feDsgfQoKICAgCiAgIAogIF9U cCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29uc3Qgdm9pZCogPSAwKSB7CiAgICByZXR1cm4g X19uICE9IDAgPyBzdGF0aWNfY2FzdDxfVHAqPihfQWxsb2M6OmFsbG9jYXRlKF9fbiAqIHNpemVv ZihfVHApKSkKICAgICAgICAgICAgICAgICAgICA6IDA7CiAgfQoKICAgCiAgdm9pZCBkZWFsbG9j YXRlKHBvaW50ZXIgX19wLCBzaXplX3R5cGUgX19uKQogICAgeyBfQWxsb2M6OmRlYWxsb2NhdGUo X19wLCBfX24gKiBzaXplb2YoX1RwKSk7IH0KCiAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Qg dGhyb3coKSAKICAgIHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQoKICB2b2lk IGNvbnN0cnVjdChwb2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgeyBuZXcoX19wKSBfVHAo X192YWwpOyB9CiAgdm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9Cn07 Cgp0ZW1wbGF0ZTw+CmNsYXNzIGFsbG9jYXRvcjx2b2lkPiB7CiAgdHlwZWRlZiBzaXplX3QgICAg ICBzaXplX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgICBkaWZmZXJlbmNlX3R5cGU7CiAgdHlw ZWRlZiB2b2lkKiAgICAgICBwb2ludGVyOwogIHR5cGVkZWYgY29uc3Qgdm9pZCogY29uc3RfcG9p bnRlcjsKICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CgogIHRlbXBsYXRlIDxjbGFz cyBfVHAxPiBzdHJ1Y3QgcmViaW5kIHsKICAgIHR5cGVkZWYgYWxsb2NhdG9yPF9UcDE+IG90aGVy OwogIH07Cn07CgoKdGVtcGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgYm9vbCBv cGVyYXRvcj09KGNvbnN0IGFsbG9jYXRvcjxfVDE+JiwgY29uc3QgYWxsb2NhdG9yPF9UMj4mKQp7 CiAgcmV0dXJuIHRydWU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVDEsIGNsYXNzIF9UMj4KaW5saW5l IGJvb2wgb3BlcmF0b3IhPShjb25zdCBhbGxvY2F0b3I8X1QxPiYsIGNvbnN0IGFsbG9jYXRvcjxf VDI+JikKewogIHJldHVybiBmYWxzZTsKfQoKIAogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBf VHAsIGNsYXNzIF9BbGxvYz4Kc3RydWN0IF9fYWxsb2NhdG9yIHsKICBfQWxsb2MgX191bmRlcmx5 aW5nX2FsbG9jOwoKICB0eXBlZGVmIHNpemVfdCAgICBzaXplX3R5cGU7CiAgdHlwZWRlZiBwdHJk aWZmX3QgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYgX1RwKiAgICAgICBwb2ludGVyOwogIHR5 cGVkZWYgY29uc3QgX1RwKiBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgX1RwJiAgICAgICByZWZl cmVuY2U7CiAgdHlwZWRlZiBjb25zdCBfVHAmIGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIF9U cCAgICAgICAgdmFsdWVfdHlwZTsKCiAgdGVtcGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJp bmQgewogICAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAxLCBfQWxsb2M+IG90aGVyOwogIH07Cgog IF9fYWxsb2NhdG9yKCkgdGhyb3coKSAge30KICBfX2FsbG9jYXRvcihjb25zdCBfX2FsbG9jYXRv ciYgX19hKSB0aHJvdygpIAogICAgOiBfX3VuZGVybHlpbmdfYWxsb2MoX19hLl9fdW5kZXJseWlu Z19hbGxvYykge30KICB0ZW1wbGF0ZSA8Y2xhc3MgX1RwMT4KICBfX2FsbG9jYXRvcihjb25zdCBf X2FsbG9jYXRvcjxfVHAxLCBfQWxsb2M+JiBfX2EpIHRocm93KCkgCiAgICA6IF9fdW5kZXJseWlu Z19hbGxvYyhfX2EuX191bmRlcmx5aW5nX2FsbG9jKSB7fQogIH5fX2FsbG9jYXRvcigpIHRocm93 KCkgIHt9CgogIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgX194KSBjb25zdCB7IHJldHVybiAm X194OyB9CiAgY29uc3RfcG9pbnRlciBhZGRyZXNzKGNvbnN0X3JlZmVyZW5jZSBfX3gpIGNvbnN0 IHsgcmV0dXJuICZfX3g7IH0KCiAgIAogIF9UcCogYWxsb2NhdGUoc2l6ZV90eXBlIF9fbiwgY29u c3Qgdm9pZCogPSAwKSB7CiAgICByZXR1cm4gX19uICE9IDAKICAgICAgICA/IHN0YXRpY19jYXN0 PF9UcCo+KF9fdW5kZXJseWluZ19hbGxvYy5hbGxvY2F0ZShfX24gKiBzaXplb2YoX1RwKSkpCiAg ICAgICAgOiAwOwogIH0KCiAgIAogIHZvaWQgZGVhbGxvY2F0ZShwb2ludGVyIF9fcCwgc2l6ZV90 eXBlIF9fbikKICAgIHsgX191bmRlcmx5aW5nX2FsbG9jLmRlYWxsb2NhdGUoX19wLCBfX24gKiBz aXplb2YoX1RwKSk7IH0KCiAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgdGhyb3coKSAKICAg IHsgcmV0dXJuIHNpemVfdCgtMSkgLyBzaXplb2YoX1RwKTsgfQoKICB2b2lkIGNvbnN0cnVjdChw b2ludGVyIF9fcCwgY29uc3QgX1RwJiBfX3ZhbCkgeyBuZXcoX19wKSBfVHAoX192YWwpOyB9CiAg dm9pZCBkZXN0cm95KHBvaW50ZXIgX19wKSB7IF9fcC0+fl9UcCgpOyB9Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0FsbG9jPgpjbGFzcyBfX2FsbG9jYXRvcjx2b2lkLCBfQWxsb2M+IHsKICB0eXBlZGVm IHNpemVfdCAgICAgIHNpemVfdHlwZTsKICB0eXBlZGVmIHB0cmRpZmZfdCAgIGRpZmZlcmVuY2Vf dHlwZTsKICB0eXBlZGVmIHZvaWQqICAgICAgIHBvaW50ZXI7CiAgdHlwZWRlZiBjb25zdCB2b2lk KiBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdm9pZCAgICAgICAgdmFsdWVfdHlwZTsKCiAgdGVt cGxhdGUgPGNsYXNzIF9UcDE+IHN0cnVjdCByZWJpbmQgewogICAgdHlwZWRlZiBfX2FsbG9jYXRv cjxfVHAxLCBfQWxsb2M+IG90aGVyOwogIH07Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFz cyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX19hbGxvY2F0b3I8X1RwLCBf QWxsb2M+JiBfX2ExLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fYWxsb2NhdG9yPF9U cCwgX0FsbG9jPiYgX19hMikKewogIHJldHVybiBfX2ExLl9fdW5kZXJseWluZ19hbGxvYyA9PSBf X2EyLl9fdW5kZXJseWluZ19hbGxvYzsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9B bGxvYz4KaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfX2FsbG9jYXRvcjxfVHAsIF9BbGxv Yz4mIF9fYTEsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19hbGxvY2F0b3I8X1RwLCBf QWxsb2M+JiBfX2EyKQp7CiAgcmV0dXJuIF9fYTEuX191bmRlcmx5aW5nX2FsbG9jICE9IF9fYTIu X191bmRlcmx5aW5nX2FsbG9jOwp9CgoKIAogCiAKCnRlbXBsYXRlIDxpbnQgaW5zdD4KaW5saW5l IGJvb2wgb3BlcmF0b3I9PShjb25zdCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxpbnN0PiYsCiAg ICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8aW5zdD4m KQp7CiAgcmV0dXJuIHRydWU7Cn0KCgp0ZW1wbGF0ZSA8aW50IF9faW5zdD4KaW5saW5lIGJvb2wg b3BlcmF0b3IhPShjb25zdCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+JiwKICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+JikK ewogIHJldHVybiBmYWxzZTsKfQoKCgp0ZW1wbGF0ZSA8Ym9vbCBfX3RocmVhZHMsIGludCBfX2lu c3Q+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRl PF9fdGhyZWFkcywgX19pbnN0PiYsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19kZWZh dWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyZWFkcywgX19pbnN0PiYpCnsKICByZXR1cm4gdHJ1ZTsK fQoKCnRlbXBsYXRlIDxib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4KaW5saW5lIGJvb2wgb3Bl cmF0b3IhPShjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+ JiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8 X190aHJlYWRzLCBfX2luc3Q+JikKewogIHJldHVybiBmYWxzZTsKfQoKCgp0ZW1wbGF0ZSA8Y2xh c3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxv Yz4mLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxvYz4mKSB7 CiAgcmV0dXJuIHRydWU7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBv cGVyYXRvciE9KGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxvYz4mLAogICAgICAgICAgICAgICAgICAg ICAgIGNvbnN0IGRlYnVnX2FsbG9jPF9BbGxvYz4mKSB7CiAgcmV0dXJuIGZhbHNlOwp9CgoKIAog CiAKIAogCiAKCiAKIAogCiAKIAogCgogCiAKIAogCiAKIAogCiAKIAogCiAKCiAKCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0b3I+CnN0cnVjdCBfQWxsb2NfdHJhaXRzCnsKICBz dGF0aWMgY29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSBmYWxzZTsKICB0eXBlZGVmIHR5cGVu YW1lIF9BbGxvY2F0b3I6OiAgIHJlYmluZDxfVHA+OjpvdGhlcgogICAgICAgICAgYWxsb2NhdG9y X3R5cGU7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2NhdG9yPgpjb25zdCBi b29sIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2NhdG9yPjo6X1NfaW5zdGFuY2VsZXNzOwoKIAoK dGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RwMT4Kc3RydWN0IF9BbGxvY190cmFpdHM8X1Rw LCBhbGxvY2F0b3I8X1RwMT4gPgp7CiAgc3RhdGljIGNvbnN0IGJvb2wgX1NfaW5zdGFuY2VsZXNz ID0gdHJ1ZTsKICB0eXBlZGVmIHNpbXBsZV9hbGxvYzxfVHAsIGFsbG9jPiBfQWxsb2NfdHlwZTsK ICB0eXBlZGVmIGFsbG9jYXRvcjxfVHA+IGFsbG9jYXRvcl90eXBlOwp9OwoKIAoKdGVtcGxhdGUg PGNsYXNzIF9UcCwgaW50IF9faW5zdD4Kc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBfX21hbGxv Y19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+ID4KewogIHN0YXRpYyBjb25zdCBib29sIF9TX2luc3Rh bmNlbGVzcyA9IHRydWU7CiAgdHlwZWRlZiBzaW1wbGVfYWxsb2M8X1RwLCBfX21hbGxvY19hbGxv Y190ZW1wbGF0ZTxfX2luc3Q+ID4gX0FsbG9jX3R5cGU7CiAgdHlwZWRlZiBfX2FsbG9jYXRvcjxf VHAsIF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4gPiBhbGxvY2F0b3JfdHlwZTsKfTsK Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBib29sIF9fdGhyZWFkcywgaW50IF9faW5zdD4Kc3RydWN0 IF9BbGxvY190cmFpdHM8X1RwLCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBf X2luc3Q+ID4KewogIHN0YXRpYyBjb25zdCBib29sIF9TX2luc3RhbmNlbGVzcyA9IHRydWU7CiAg dHlwZWRlZiBzaW1wbGVfYWxsb2M8X1RwLCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJl YWRzLCBfX2luc3Q+ID4KICAgICAgICAgIF9BbGxvY190eXBlOwogIHR5cGVkZWYgX19hbGxvY2F0 b3I8X1RwLCBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHJlYWRzLCBfX2luc3Q+ID4KICAg ICAgICAgIGFsbG9jYXRvcl90eXBlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9B bGxvYz4Kc3RydWN0IF9BbGxvY190cmFpdHM8X1RwLCBkZWJ1Z19hbGxvYzxfQWxsb2M+ID4Kewog IHN0YXRpYyBjb25zdCBib29sIF9TX2luc3RhbmNlbGVzcyA9IHRydWU7CiAgdHlwZWRlZiBzaW1w bGVfYWxsb2M8X1RwLCBkZWJ1Z19hbGxvYzxfQWxsb2M+ID4gX0FsbG9jX3R5cGU7CiAgdHlwZWRl ZiBfX2FsbG9jYXRvcjxfVHAsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPiBhbGxvY2F0b3JfdHlwZTsK fTsKCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX1RwMSwgaW50IF9faW5zdD4Kc3Ry dWN0IF9BbGxvY190cmFpdHM8X1RwLAogICAgICAgICAgICAgICAgICAgICBfX2FsbG9jYXRvcjxf VHAxLCBfX21hbGxvY19hbGxvY190ZW1wbGF0ZTxfX2luc3Q+ID4gPgp7CiAgc3RhdGljIGNvbnN0 IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVmIHNpbXBsZV9hbGxvYzxfVHAs IF9fbWFsbG9jX2FsbG9jX3RlbXBsYXRlPF9faW5zdD4gPiBfQWxsb2NfdHlwZTsKICB0eXBlZGVm IF9fYWxsb2NhdG9yPF9UcCwgX19tYWxsb2NfYWxsb2NfdGVtcGxhdGU8X19pbnN0PiA+IGFsbG9j YXRvcl90eXBlOwp9OwoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcDEsIGJvb2wgX190 aHIsIGludCBfX2luc3Q+CnN0cnVjdCBfQWxsb2NfdHJhaXRzPF9UcCwKICAgICAgICAgICAgICAg ICAgICAgIF9fYWxsb2NhdG9yPF9UcDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBfX2RlZmF1bHRfYWxsb2NfdGVtcGxhdGU8X190aHIsIF9faW5zdD4gPiA+CnsKICBzdGF0aWMg Y29uc3QgYm9vbCBfU19pbnN0YW5jZWxlc3MgPSB0cnVlOwogIHR5cGVkZWYgc2ltcGxlX2FsbG9j PF9UcCwgX19kZWZhdWx0X2FsbG9jX3RlbXBsYXRlPF9fdGhyLF9faW5zdD4gPgogICAgICAgICAg X0FsbG9jX3R5cGU7CiAgdHlwZWRlZiBfX2FsbG9jYXRvcjxfVHAsIF9fZGVmYXVsdF9hbGxvY190 ZW1wbGF0ZTxfX3RocixfX2luc3Q+ID4KICAgICAgICAgIGFsbG9jYXRvcl90eXBlOwp9OwoKCnRl bXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9UcDEsIGNsYXNzIF9BbGxvYz4Kc3RydWN0IF9BbGxv Y190cmFpdHM8X1RwLCBfX2FsbG9jYXRvcjxfVHAxLCBkZWJ1Z19hbGxvYzxfQWxsb2M+ID4gPgp7 CiAgc3RhdGljIGNvbnN0IGJvb2wgX1NfaW5zdGFuY2VsZXNzID0gdHJ1ZTsKICB0eXBlZGVmIHNp bXBsZV9hbGxvYzxfVHAsIGRlYnVnX2FsbG9jPF9BbGxvYz4gPiBfQWxsb2NfdHlwZTsKICB0eXBl ZGVmIF9fYWxsb2NhdG9yPF9UcCwgZGVidWdfYWxsb2M8X0FsbG9jPiA+IGFsbG9jYXRvcl90eXBl Owp9OwoKCgoKCgoKCiAKCgoKCgogCiAKIAojIDMxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFu ZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvdmVjdG9yIiAyIDMK CiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8u Li8uLi9pbmNsdWRlL2crKy0zL3N0bF9jb25zdHJ1Y3QuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCiAKCgoKCgoKCgogCgogCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmlubGluZSB2 b2lkIGRlc3Ryb3koX1RwKiBfX3BvaW50ZXIpIHsKICBfX3BvaW50ZXItPn5fVHAoKTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9UMSwgY2xhc3MgX1QyPgppbmxpbmUgdm9pZCBjb25zdHJ1Y3QoX1QxKiBf X3AsIGNvbnN0IF9UMiYgX192YWx1ZSkgewogIG5ldyAoX19wKSBfVDEoX192YWx1ZSk7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfVDE+CmlubGluZSB2b2lkIGNvbnN0cnVjdChfVDEqIF9fcCkgewogIG5l dyAoX19wKSBfVDEoKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlcmF0b3I+CmlubGlu ZSB2b2lkCl9fZGVzdHJveV9hdXgoX0ZvcndhcmRJdGVyYXRvciBfX2ZpcnN0LCBfRm9yd2FyZEl0 ZXJhdG9yIF9fbGFzdCwgX19mYWxzZV90eXBlKQp7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFz dDsgKytfX2ZpcnN0KQogICAgZGVzdHJveSgmKl9fZmlyc3QpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X0ZvcndhcmRJdGVyYXRvcj4KaW5saW5lIHZvaWQgX19kZXN0cm95X2F1eChfRm9yd2FyZEl0ZXJh dG9yLCBfRm9yd2FyZEl0ZXJhdG9yLCBfX3RydWVfdHlwZSkge30KCnRlbXBsYXRlIDxjbGFzcyBf Rm9yd2FyZEl0ZXJhdG9yLCBjbGFzcyBfVHA+CmlubGluZSB2b2lkCl9fZGVzdHJveShfRm9yd2Fy ZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBfVHAqKQp7CiAgdHlw ZWRlZiB0eXBlbmFtZSBfX3R5cGVfdHJhaXRzPF9UcD46Omhhc190cml2aWFsX2Rlc3RydWN0b3IK ICAgICAgICAgIF9Ucml2aWFsX2Rlc3RydWN0b3I7CiAgX19kZXN0cm95X2F1eChfX2ZpcnN0LCBf X2xhc3QsIF9Ucml2aWFsX2Rlc3RydWN0b3IoKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2Fy ZEl0ZXJhdG9yPgppbmxpbmUgdm9pZCBkZXN0cm95KF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwg X0ZvcndhcmRJdGVyYXRvciBfX2xhc3QpIHsKICBfX2Rlc3Ryb3koX19maXJzdCwgX19sYXN0LCBf X3ZhbHVlX3R5cGUoIF9fZmlyc3QgKSApOwp9CgppbmxpbmUgdm9pZCBkZXN0cm95KGNoYXIqLCBj aGFyKikge30KaW5saW5lIHZvaWQgZGVzdHJveSh3Y2hhcl90Kiwgd2NoYXJfdCopIHt9CgogCgoK CiAKIAogCiMgMzIgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMv Li4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy92ZWN0b3IiIDIgMwoKIyAxICIvdXNyL2xpYi9nY2Mt bGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv c3RsX3VuaW5pdGlhbGl6ZWQuaCIgMSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoK CgoKIAoKIAoKIAogCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0 ZXI+CmlubGluZSBfRm9yd2FyZEl0ZXIgCl9fdW5pbml0aWFsaXplZF9jb3B5X2F1eChfSW5wdXRJ dGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAg X0ZvcndhcmRJdGVyIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgX190cnVlX3R5 cGUpCnsKICByZXR1cm4gY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcmVzdWx0KTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KX0ZvcndhcmRJdGVyIApf X3VuaW5pdGlhbGl6ZWRfY29weV9hdXgoX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9f bGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCwKICAg ICAgICAgICAgICAgICAgICAgICAgIF9fZmFsc2VfdHlwZSkKewogIF9Gb3J3YXJkSXRlciBfX2N1 ciA9IF9fcmVzdWx0OwogIHRyeSAgewogICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytf X2ZpcnN0LCArK19fY3VyKQogICAgICBjb25zdHJ1Y3QoJipfX2N1ciwgKl9fZmlyc3QpOwogICAg cmV0dXJuIF9fY3VyOwogIH0KICBjYXRjaCguLi4pIHsgIGRlc3Ryb3koX19yZXN1bHQsIF9fY3Vy KSA7IHRocm93OyB9IDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9y d2FyZEl0ZXIsIGNsYXNzIF9UcD4KaW5saW5lIF9Gb3J3YXJkSXRlcgpfX3VuaW5pdGlhbGl6ZWRf Y29weShfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAg ICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsIF9UcCopCnsKICB0eXBlZGVmIHR5cGVuYW1l IF9fdHlwZV90cmFpdHM8X1RwPjo6aXNfUE9EX3R5cGUgX0lzX1BPRDsKICByZXR1cm4gX191bmlu aXRpYWxpemVkX2NvcHlfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQsIF9Jc19QT0QoKSk7 Cn0KCnRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyLCBjbGFzcyBfRm9yd2FyZEl0ZXI+CmlubGlu ZSBfRm9yd2FyZEl0ZXIKICB1bmluaXRpYWxpemVkX2NvcHkoX0lucHV0SXRlciBfX2ZpcnN0LCBf SW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fcmVz dWx0KQp7CiAgcmV0dXJuIF9fdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19y ZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdmFsdWVfdHlwZSggX19yZXN1 bHQgKSApOwp9CgppbmxpbmUgY2hhciogdW5pbml0aWFsaXplZF9jb3B5KGNvbnN0IGNoYXIqIF9f Zmlyc3QsIGNvbnN0IGNoYXIqIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjaGFyKiBfX3Jlc3VsdCkgewogIG1lbW1vdmUoX19yZXN1bHQsIF9fZmlyc3QsIF9fbGFzdCAt IF9fZmlyc3QpOwogIHJldHVybiBfX3Jlc3VsdCArIChfX2xhc3QgLSBfX2ZpcnN0KTsKfQoKaW5s aW5lIHdjaGFyX3QqIAp1bmluaXRpYWxpemVkX2NvcHkoY29uc3Qgd2NoYXJfdCogX19maXJzdCwg Y29uc3Qgd2NoYXJfdCogX19sYXN0LAogICAgICAgICAgICAgICAgICAgd2NoYXJfdCogX19yZXN1 bHQpCnsKICBtZW1tb3ZlKF9fcmVzdWx0LCBfX2ZpcnN0LCBzaXplb2Yod2NoYXJfdCkgKiAoX19s YXN0IC0gX19maXJzdCkpOwogIHJldHVybiBfX3Jlc3VsdCArIChfX2xhc3QgLSBfX2ZpcnN0KTsK fQoKIAoKdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9y d2FyZEl0ZXI+CnBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgpfX3VuaW5pdGlhbGl6ZWRf Y29weV9uKF9JbnB1dEl0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKICAgICAgICAgICAgICAg ICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgaW5w dXRfaXRlcmF0b3JfdGFnKQp7CiAgX0ZvcndhcmRJdGVyIF9fY3VyID0gX19yZXN1bHQ7CiAgdHJ5 ICB7CiAgICBmb3IgKCA7IF9fY291bnQgPiAwIDsgLS1fX2NvdW50LCArK19fZmlyc3QsICsrX19j dXIpIAogICAgICBjb25zdHJ1Y3QoJipfX2N1ciwgKl9fZmlyc3QpOwogICAgcmV0dXJuIHBhaXI8 X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPihfX2ZpcnN0LCBfX2N1cik7CiAgfQogIGNhdGNoKC4u LikgeyAgZGVzdHJveShfX3Jlc3VsdCwgX19jdXIpIDsgdGhyb3c7IH0gOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1JhbmRvbUFjY2Vzc0l0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0ZXI+ CmlubGluZSBwYWlyPF9SYW5kb21BY2Nlc3NJdGVyLCBfRm9yd2FyZEl0ZXI+Cl9fdW5pbml0aWFs aXplZF9jb3B5X24oX1JhbmRvbUFjY2Vzc0l0ZXIgX19maXJzdCwgX1NpemUgX19jb3VudCwKICAg ICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQsCiAgICAgICAgICAgICAg ICAgICAgICAgcmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcpIHsKICBfUmFuZG9tQWNjZXNzSXRl ciBfX2xhc3QgPSBfX2ZpcnN0ICsgX19jb3VudDsKICByZXR1cm4gcGFpcjxfUmFuZG9tQWNjZXNz SXRlciwgX0ZvcndhcmRJdGVyPigKICAgICAgICAgICAgICAgICBfX2xhc3QsCiAgICAgICAgICAg ICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpKTsKfQoK dGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfRm9yd2FyZEl0 ZXI+CmlubGluZSBwYWlyPF9JbnB1dEl0ZXIsIF9Gb3J3YXJkSXRlcj4KX191bmluaXRpYWxpemVk X2NvcHlfbihfSW5wdXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCiAgICAgICAgICAgICAg ICAgICAgIF9Gb3J3YXJkSXRlciBfX3Jlc3VsdCkgewogIHJldHVybiBfX3VuaW5pdGlhbGl6ZWRf Y29weV9uKF9fZmlyc3QsIF9fY291bnQsIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3QgKSApOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9Gb3J3YXJkSXRlcj4KaW5saW5l IHBhaXI8X0lucHV0SXRlciwgX0ZvcndhcmRJdGVyPgp1bmluaXRpYWxpemVkX2NvcHlfbihfSW5w dXRJdGVyIF9fZmlyc3QsIF9TaXplIF9fY291bnQsCiAgICAgICAgICAgICAgICAgICAgIF9Gb3J3 YXJkSXRlciBfX3Jlc3VsdCkgewogIHJldHVybiBfX3VuaW5pdGlhbGl6ZWRfY29weV9uKF9fZmly c3QsIF9fY291bnQsIF9fcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9f aXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3QgKSApOwp9CgogCiAKdGVtcGxhdGUgPGNsYXNzIF9G b3J3YXJkSXRlciwgY2xhc3MgX1RwPgppbmxpbmUgdm9pZApfX3VuaW5pdGlhbGl6ZWRfZmlsbF9h dXgoX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9Gb3J3YXJkSXRlciBfX2xhc3QsIAogICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gsIF9fdHJ1ZV90eXBlKQp7CiAgZmlsbChfX2Zp cnN0LCBfX2xhc3QsIF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNz IF9UcD4Kdm9pZApfX3VuaW5pdGlhbGl6ZWRfZmlsbF9hdXgoX0ZvcndhcmRJdGVyIF9fZmlyc3Qs IF9Gb3J3YXJkSXRlciBfX2xhc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1Rw JiBfX3gsIF9fZmFsc2VfdHlwZSkKewogIF9Gb3J3YXJkSXRlciBfX2N1ciA9IF9fZmlyc3Q7CiAg dHJ5ICB7CiAgICBmb3IgKCA7IF9fY3VyICE9IF9fbGFzdDsgKytfX2N1cikKICAgICAgY29uc3Ry dWN0KCYqX19jdXIsIF9feCk7CiAgfQogIGNhdGNoKC4uLikgeyAgZGVzdHJveShfX2ZpcnN0LCBf X2N1cikgOyB0aHJvdzsgfSA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNz IF9UcCwgY2xhc3MgX1RwMT4KaW5saW5lIHZvaWQgX191bmluaXRpYWxpemVkX2ZpbGwoX0Zvcndh cmRJdGVyIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2Fy ZEl0ZXIgX19sYXN0LCBjb25zdCBfVHAmIF9feCwgX1RwMSopCnsKICB0eXBlZGVmIHR5cGVuYW1l IF9fdHlwZV90cmFpdHM8X1RwMT46OmlzX1BPRF90eXBlIF9Jc19QT0Q7CiAgX191bmluaXRpYWxp emVkX2ZpbGxfYXV4KF9fZmlyc3QsIF9fbGFzdCwgX194LCBfSXNfUE9EKCkpOwogICAgICAgICAg ICAgICAgICAgCn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXIsIGNsYXNzIF9UcD4KaW5s aW5lIHZvaWQgdW5pbml0aWFsaXplZF9maWxsKF9Gb3J3YXJkSXRlciBfX2ZpcnN0LAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX0ZvcndhcmRJdGVyIF9fbGFzdCwgCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCkKewogIF9fdW5pbml0aWFsaXplZF9m aWxsKF9fZmlyc3QsIF9fbGFzdCwgX194LCBfX3ZhbHVlX3R5cGUoIF9fZmlyc3QgKSApOwp9Cgog CiAKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4K aW5saW5lIF9Gb3J3YXJkSXRlcgpfX3VuaW5pdGlhbGl6ZWRfZmlsbF9uX2F1eChfRm9yd2FyZEl0 ZXIgX19maXJzdCwgX1NpemUgX19uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBf VHAmIF9feCwgX190cnVlX3R5cGUpCnsKICByZXR1cm4gZmlsbF9uKF9fZmlyc3QsIF9fbiwgX194 KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9U cD4KX0ZvcndhcmRJdGVyCl9fdW5pbml0aWFsaXplZF9maWxsX25fYXV4KF9Gb3J3YXJkSXRlciBf X2ZpcnN0LCBfU2l6ZSBfX24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYg X194LCBfX2ZhbHNlX3R5cGUpCnsKICBfRm9yd2FyZEl0ZXIgX19jdXIgPSBfX2ZpcnN0OwogIHRy eSAgewogICAgZm9yICggOyBfX24gPiAwOyAtLV9fbiwgKytfX2N1cikKICAgICAgY29uc3RydWN0 KCYqX19jdXIsIF9feCk7CiAgICByZXR1cm4gX19jdXI7CiAgfQogIGNhdGNoKC4uLikgeyAgZGVz dHJveShfX2ZpcnN0LCBfX2N1cikgOyB0aHJvdzsgfSA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfRm9y d2FyZEl0ZXIsIGNsYXNzIF9TaXplLCBjbGFzcyBfVHAsIGNsYXNzIF9UcDE+CmlubGluZSBfRm9y d2FyZEl0ZXIgCl9fdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9T aXplIF9fbiwgY29uc3QgX1RwJiBfX3gsIF9UcDEqKQp7CiAgdHlwZWRlZiB0eXBlbmFtZSBfX3R5 cGVfdHJhaXRzPF9UcDE+Ojppc19QT0RfdHlwZSBfSXNfUE9EOwogIHJldHVybiBfX3VuaW5pdGlh bGl6ZWRfZmlsbF9uX2F1eChfX2ZpcnN0LCBfX24sIF9feCwgX0lzX1BPRCgpKTsKfQoKdGVtcGxh dGUgPGNsYXNzIF9Gb3J3YXJkSXRlciwgY2xhc3MgX1NpemUsIGNsYXNzIF9UcD4KaW5saW5lIF9G b3J3YXJkSXRlciAKdW5pbml0aWFsaXplZF9maWxsX24oX0ZvcndhcmRJdGVyIF9fZmlyc3QsIF9T aXplIF9fbiwgY29uc3QgX1RwJiBfX3gpCnsKICByZXR1cm4gX191bmluaXRpYWxpemVkX2ZpbGxf bihfX2ZpcnN0LCBfX24sIF9feCwgX192YWx1ZV90eXBlKCBfX2ZpcnN0ICkgKTsKfQoKIAogCgog CiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcjEsIGNsYXNzIF9JbnB1dEl0ZXIyLCBj bGFzcyBfRm9yd2FyZEl0ZXI+CmlubGluZSBfRm9yd2FyZEl0ZXIKX191bmluaXRpYWxpemVkX2Nv cHlfY29weShfSW5wdXRJdGVyMSBfX2ZpcnN0MSwgX0lucHV0SXRlcjEgX19sYXN0MSwKICAgICAg ICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyMiBfX2ZpcnN0MiwgX0lucHV0SXRlcjIgX19s YXN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICBfRm9yd2FyZEl0ZXIgX19yZXN1bHQpCnsK ICBfRm9yd2FyZEl0ZXIgX19taWQgPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdDEsIF9fbGFz dDEsIF9fcmVzdWx0KTsKICB0cnkgIHsKICAgIHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19m aXJzdDIsIF9fbGFzdDIsIF9fbWlkKTsKICB9CiAgY2F0Y2goLi4uKSB7ICBkZXN0cm95KF9fcmVz dWx0LCBfX21pZCkgOyB0aHJvdzsgfSA7Cn0KCiAKIAogCnRlbXBsYXRlIDxjbGFzcyBfRm9yd2Fy ZEl0ZXIsIGNsYXNzIF9UcCwgY2xhc3MgX0lucHV0SXRlcj4KaW5saW5lIF9Gb3J3YXJkSXRlciAK X191bmluaXRpYWxpemVkX2ZpbGxfY29weShfRm9yd2FyZEl0ZXIgX19yZXN1bHQsIF9Gb3J3YXJk SXRlciBfX21pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfVHAmIF9feCwKICAg ICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyIF9fZmlyc3QsIF9JbnB1dEl0ZXIgX19s YXN0KQp7CiAgdW5pbml0aWFsaXplZF9maWxsKF9fcmVzdWx0LCBfX21pZCwgX194KTsKICB0cnkg IHsKICAgIHJldHVybiB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19sYXN0LCBfX21pZCk7 CiAgfQogIGNhdGNoKC4uLikgeyAgZGVzdHJveShfX3Jlc3VsdCwgX19taWQpIDsgdGhyb3c7IH0g Owp9CgogCiAKIAp0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlciwgY2xhc3MgX0ZvcndhcmRJdGVy LCBjbGFzcyBfVHA+CmlubGluZSB2b2lkCl9fdW5pbml0aWFsaXplZF9jb3B5X2ZpbGwoX0lucHV0 SXRlciBfX2ZpcnN0MSwgX0lucHV0SXRlciBfX2xhc3QxLAogICAgICAgICAgICAgICAgICAgICAg ICAgIF9Gb3J3YXJkSXRlciBfX2ZpcnN0MiwgX0ZvcndhcmRJdGVyIF9fbGFzdDIsCiAgICAgICAg ICAgICAgICAgICAgICAgICAgY29uc3QgX1RwJiBfX3gpCnsKICBfRm9yd2FyZEl0ZXIgX19taWQy ID0gdW5pbml0aWFsaXplZF9jb3B5KF9fZmlyc3QxLCBfX2xhc3QxLCBfX2ZpcnN0Mik7CiAgdHJ5 ICB7CiAgICB1bmluaXRpYWxpemVkX2ZpbGwoX19taWQyLCBfX2xhc3QyLCBfX3gpOwogIH0KICBj YXRjaCguLi4pIHsgIGRlc3Ryb3koX19maXJzdDIsIF9fbWlkMikgOyB0aHJvdzsgfSA7Cn0KCiAK CgoKIAogCiAKIyAzMyAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUu My8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3ZlY3RvciIgMiAzCgojIDEgIi91c3IvbGliL2dj Yy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKyst My9zdGxfdmVjdG9yLmgiIDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAg CgoKCgoKCiAKIAogCiAKIAoKCgogCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvY2F0 b3IsIGJvb2wgX0lzU3RhdGljPgpjbGFzcyBfVmVjdG9yX2FsbG9jX2Jhc2UgewpwdWJsaWM6CiAg dHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCwgX0FsbG9jYXRvcj46OmFsbG9jYXRv cl90eXBlCiAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxs b2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fZGF0YV9hbGxvY2F0b3I7IH0KCiAgX1ZlY3Rvcl9h bGxvY19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCiAgICA6IF9NX2RhdGFfYWxsb2Nh dG9yKF9fYSksIF9NX3N0YXJ0KDApLCBfTV9maW5pc2goMCksIF9NX2VuZF9vZl9zdG9yYWdlKDAp IAogIHt9CiAgCnByb3RlY3RlZDoKICBhbGxvY2F0b3JfdHlwZSBfTV9kYXRhX2FsbG9jYXRvcjsK ICBfVHAqIF9NX3N0YXJ0OwogIF9UcCogX01fZmluaXNoOwogIF9UcCogX01fZW5kX29mX3N0b3Jh Z2U7CgogIF9UcCogX01fYWxsb2NhdGUoc2l6ZV90IF9fbikKICAgIHsgcmV0dXJuIF9NX2RhdGFf YWxsb2NhdG9yLmFsbG9jYXRlKF9fbik7IH0KICB2b2lkIF9NX2RlYWxsb2NhdGUoX1RwKiBfX3As IHNpemVfdCBfX24pCiAgICB7IGlmIChfX3ApIF9NX2RhdGFfYWxsb2NhdG9yLmRlYWxsb2NhdGUo X19wLCBfX24pOyB9Cn07CgogCiAKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRv cj4KY2xhc3MgX1ZlY3Rvcl9hbGxvY19iYXNlPF9UcCwgX0FsbG9jYXRvciwgdHJ1ZT4gewpwdWJs aWM6CiAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9UcCwgX0FsbG9jYXRvcj46OmFs bG9jYXRvcl90eXBlCiAgICAgICAgICBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBn ZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gYWxsb2NhdG9yX3R5cGUoKTsgfQoKICBfVmVj dG9yX2FsbG9jX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmKQogICAgOiBfTV9zdGFydCgwKSwg X01fZmluaXNoKDApLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKSAKICB7fQogIApwcm90ZWN0ZWQ6CiAg X1RwKiBfTV9zdGFydDsKICBfVHAqIF9NX2ZpbmlzaDsKICBfVHAqIF9NX2VuZF9vZl9zdG9yYWdl OwoKICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2NhdG9yPjo6X0Fs bG9jX3R5cGUgX0FsbG9jX3R5cGU7CiAgX1RwKiBfTV9hbGxvY2F0ZShzaXplX3QgX19uKQogICAg eyByZXR1cm4gX0FsbG9jX3R5cGU6OmFsbG9jYXRlKF9fbik7IH0KICB2b2lkIF9NX2RlYWxsb2Nh dGUoX1RwKiBfX3AsIHNpemVfdCBfX24pCiAgICB7IF9BbGxvY190eXBlOjpkZWFsbG9jYXRlKF9f cCwgX19uKTt9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnN0cnVjdCBf VmVjdG9yX2Jhc2UKICA6IHB1YmxpYyBfVmVjdG9yX2FsbG9jX2Jhc2U8X1RwLCBfQWxsb2MsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+Ojpf U19pbnN0YW5jZWxlc3M+CnsKICB0eXBlZGVmIF9WZWN0b3JfYWxsb2NfYmFzZTxfVHAsIF9BbGxv YywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxv Yz46Ol9TX2luc3RhbmNlbGVzcz4KICAgICAgICAgIF9CYXNlOwogIHR5cGVkZWYgdHlwZW5hbWUg X0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwoKICBfVmVjdG9yX2Jhc2UoY29u c3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkgOiBfQmFzZShfX2EpIHt9CiAgX1ZlY3Rvcl9iYXNlKHNp emVfdCBfX24sIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogX0Jhc2UoX19hKSB7CiAgICBf TV9zdGFydCA9IF9NX2FsbG9jYXRlKF9fbik7CiAgICBfTV9maW5pc2ggPSBfTV9zdGFydDsKICAg IF9NX2VuZF9vZl9zdG9yYWdlID0gX01fc3RhcnQgKyBfX247CiAgfQoKICB+X1ZlY3Rvcl9iYXNl KCkgeyBfTV9kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0 KTsgfQp9OyAgICAKCiMgMTUwICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgv Mi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX3ZlY3Rvci5oIiAzCgoKdGVtcGxh dGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBfVHAgPiAgPgpjbGFzcyB2 ZWN0b3IgOiBwcm90ZWN0ZWQgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPiAKewpwcml2YXRlOgog IHR5cGVkZWYgX1ZlY3Rvcl9iYXNlPF9UcCwgX0FsbG9jPiBfQmFzZTsKcHVibGljOgogIHR5cGVk ZWYgX1RwIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogIHR5cGVk ZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKICB0eXBlZGVmIHZhbHVlX3R5cGUq IGl0ZXJhdG9yOwogIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7CiAg dHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CiAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBl JiBjb25zdF9yZWZlcmVuY2U7CiAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwogIHR5cGVkZWYg cHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKCiAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxs b2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRv cigpIGNvbnN0IHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KCgogIHR5cGVkZWYg cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsK ICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CgoK CgoKCgpwcm90ZWN0ZWQ6CgogIHVzaW5nIF9CYXNlOjpfTV9hbGxvY2F0ZTsKICB1c2luZyBfQmFz ZTo6X01fZGVhbGxvY2F0ZTsKICB1c2luZyBfQmFzZTo6X01fc3RhcnQ7CiAgdXNpbmcgX0Jhc2U6 Ol9NX2ZpbmlzaDsKICB1c2luZyBfQmFzZTo6X01fZW5kX29mX3N0b3JhZ2U7CgoKcHJvdGVjdGVk OgogIHZvaWQgX01faW5zZXJ0X2F1eChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCBfVHAmIF9f eCk7CiAgdm9pZCBfTV9pbnNlcnRfYXV4KGl0ZXJhdG9yIF9fcG9zaXRpb24pOwoKcHVibGljOgog IGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01fc3RhcnQ7IH0KICBjb25zdF9pdGVyYXRvciBi ZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3N0YXJ0OyB9CiAgaXRlcmF0b3IgZW5kKCkgeyByZXR1 cm4gX01fZmluaXNoOyB9CiAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01f ZmluaXNoOyB9CgogIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkKICAgIHsgcmV0dXJuIHJldmVy c2VfaXRlcmF0b3IoZW5kKCkpOyB9CiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBj b25zdAogICAgeyByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KICByZXZl cnNlX2l0ZXJhdG9yIHJlbmQoKQogICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigp KTsgfQogIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0CiAgICB7IHJldHVybiBj b25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CgogIHNpemVfdHlwZSBzaXplKCkgY29u c3QKICAgIHsgcmV0dXJuIHNpemVfdHlwZShlbmQoKSAtIGJlZ2luKCkpOyB9CiAgc2l6ZV90eXBl IG1heF9zaXplKCkgY29uc3QKICAgIHsgcmV0dXJuIHNpemVfdHlwZSgtMSkgLyBzaXplb2YoX1Rw KTsgfQogIHNpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0CiAgICB7IHJldHVybiBzaXplX3R5cGUo X01fZW5kX29mX3N0b3JhZ2UgLSBiZWdpbigpKTsgfQogIGJvb2wgZW1wdHkoKSBjb25zdAogICAg eyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQoKICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXpl X3R5cGUgX19uKSB7IHJldHVybiAqKGJlZ2luKCkgKyBfX24pOyB9CiAgY29uc3RfcmVmZXJlbmNl IG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3QgeyByZXR1cm4gKihiZWdpbigpICsgX19u KTsgfQoKICBleHBsaWNpdCB2ZWN0b3IoY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9j YXRvcl90eXBlKCkpCiAgICA6IF9CYXNlKF9fYSkge30KCiAgdmVjdG9yKHNpemVfdHlwZSBfX24s IGNvbnN0IF9UcCYgX192YWx1ZSwKICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9 IGFsbG9jYXRvcl90eXBlKCkpIAogICAgOiBfQmFzZShfX24sIF9fYSkKICAgIHsgX01fZmluaXNo ID0gdW5pbml0aWFsaXplZF9maWxsX24oX01fc3RhcnQsIF9fbiwgX192YWx1ZSk7IH0KCiAgZXhw bGljaXQgdmVjdG9yKHNpemVfdHlwZSBfX24pCiAgICA6IF9CYXNlKF9fbiwgYWxsb2NhdG9yX3R5 cGUoKSkKICAgIHsgX01fZmluaXNoID0gdW5pbml0aWFsaXplZF9maWxsX24oX01fc3RhcnQsIF9f biwgX1RwKCkpOyB9CgogIHZlY3Rvcihjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gpIAog ICAgOiBfQmFzZShfX3guc2l6ZSgpLCBfX3guZ2V0X2FsbG9jYXRvcigpKQogICAgeyBfTV9maW5p c2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX194LmJlZ2luKCksIF9feC5lbmQoKSwgX01fc3RhcnQp OyB9CgoKICAgCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZlY3RvcihfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgIGNvbnN0 IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKSA6IF9CYXNlKF9fYSkgewog ICAgdHlwZWRlZiB0eXBlbmFtZSBfSXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9JbnRlZ3Jh bCBfSW50ZWdyYWw7CiAgICBfTV9pbml0aWFsaXplX2F1eChfX2ZpcnN0LCBfX2xhc3QsIF9JbnRl Z3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KICB2b2lkIF9NX2luaXRp YWxpemVfYXV4KF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWx1ZSwgX190cnVlX3R5cGUpIHsK ICAgIF9NX3N0YXJ0ID0gX01fYWxsb2NhdGUoX19uKTsKICAgIF9NX2VuZF9vZl9zdG9yYWdlID0g X01fc3RhcnQgKyBfX247IAogICAgX01fZmluaXNoID0gdW5pbml0aWFsaXplZF9maWxsX24oX01f c3RhcnQsIF9fbiwgX192YWx1ZSk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0 b3I+CiAgdm9pZCBfTV9pbml0aWFsaXplX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5w dXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZhbHNlX3R5cGUp IHsKICAgIF9NX3JhbmdlX2luaXRpYWxpemUoX19maXJzdCwgX19sYXN0LCBfX2l0ZXJhdG9yX2Nh dGVnb3J5KCBfX2ZpcnN0ICkgKTsKICB9CgoKCgoKCgoKICB+dmVjdG9yKCkgeyBkZXN0cm95KF9N X3N0YXJ0LCBfTV9maW5pc2gpOyB9CgogIHZlY3RvcjxfVHAsIF9BbGxvYz4mIG9wZXJhdG9yPShj b25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gpOwogIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUg X19uKSB7CiAgICBpZiAoY2FwYWNpdHkoKSA8IF9fbikgewogICAgICBjb25zdCBzaXplX3R5cGUg X19vbGRfc2l6ZSA9IHNpemUoKTsKICAgICAgaXRlcmF0b3IgX190bXAgPSBfTV9hbGxvY2F0ZV9h bmRfY29weShfX24sIF9NX3N0YXJ0LCBfTV9maW5pc2gpOwogICAgICBkZXN0cm95KF9NX3N0YXJ0 LCBfTV9maW5pc2gpOwogICAgICBfTV9kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3Rv cmFnZSAtIF9NX3N0YXJ0KTsKICAgICAgX01fc3RhcnQgPSBfX3RtcDsKICAgICAgX01fZmluaXNo ID0gX190bXAgKyBfX29sZF9zaXplOwogICAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9NX3N0YXJ0 ICsgX19uOwogICAgfQogIH0KCiAgIAogICAKICAgCiAgIAoKICB2b2lkIGFzc2lnbihzaXplX3R5 cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKTsKCgogIAogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJ dGVyYXRvcj4KICB2b2lkIGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVy YXRvciBfX2xhc3QpIHsKICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRl cmF0b3I+OjpfSW50ZWdyYWwgX0ludGVncmFsOwogICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmly c3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2Vy PgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWws IF9fdHJ1ZV90eXBlKQogICAgeyBhc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7 IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CiAgdm9pZCBfTV9hc3NpZ25fZGlzcGF0 Y2goX0lucHV0SXRlciBfX2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwgX19mYWxzZV90eXBlKQog ICAgeyBfTV9hc3NpZ25fYXV4KF9fZmlyc3QsIF9fbGFzdCwgX19pdGVyYXRvcl9jYXRlZ29yeSgg X19maXJzdCApICk7IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQg X01fYXNzaWduX2F1eChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xh c3QsCiAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZyk7CgogIHRlbXBsYXRl IDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0 ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAg ICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZyk7IAoKCgogIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0 dXJuICpiZWdpbigpOyB9CiAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4g KmJlZ2luKCk7IH0KICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooZW5kKCkgLSAxKTsgfQog IGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyByZXR1cm4gKihlbmQoKSAtIDEpOyB9Cgog IHZvaWQgcHVzaF9iYWNrKGNvbnN0IF9UcCYgX194KSB7CiAgICBpZiAoX01fZmluaXNoICE9IF9N X2VuZF9vZl9zdG9yYWdlKSB7CiAgICAgIGNvbnN0cnVjdChfTV9maW5pc2gsIF9feCk7CiAgICAg ICsrX01fZmluaXNoOwogICAgfQogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpLCBf X3gpOwogIH0KICB2b2lkIHB1c2hfYmFjaygpIHsKICAgIGlmIChfTV9maW5pc2ggIT0gX01fZW5k X29mX3N0b3JhZ2UpIHsKICAgICAgY29uc3RydWN0KF9NX2ZpbmlzaCk7CiAgICAgICsrX01fZmlu aXNoOwogICAgfQogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpKTsKICB9CiAgdm9p ZCBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCkgewogICAgIDo6c3dhcChfTV9zdGFydCwg X194Ll9NX3N0YXJ0KTsKICAgICA6OnN3YXAoX01fZmluaXNoLCBfX3guX01fZmluaXNoKTsKICAg ICA6OnN3YXAoX01fZW5kX29mX3N0b3JhZ2UsIF9feC5fTV9lbmRfb2Zfc3RvcmFnZSk7CiAgfQoK ICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpIHsK ICAgIHNpemVfdHlwZSBfX24gPSBfX3Bvc2l0aW9uIC0gYmVnaW4oKTsKICAgIGlmIChfTV9maW5p c2ggIT0gX01fZW5kX29mX3N0b3JhZ2UgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkgewogICAgICBj b25zdHJ1Y3QoX01fZmluaXNoLCBfX3gpOwogICAgICArK19NX2ZpbmlzaDsKICAgIH0KICAgIGVs c2UKICAgICAgX01faW5zZXJ0X2F1eChfX3Bvc2l0aW9uLCBfX3gpOwogICAgcmV0dXJuIGJlZ2lu KCkgKyBfX247CiAgfQogIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBfX3Bvc2l0aW9uKSB7CiAg ICBzaXplX3R5cGUgX19uID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CiAgICBpZiAoX01fZmluaXNo ICE9IF9NX2VuZF9vZl9zdG9yYWdlICYmIF9fcG9zaXRpb24gPT0gZW5kKCkpIHsKICAgICAgY29u c3RydWN0KF9NX2ZpbmlzaCk7CiAgICAgICsrX01fZmluaXNoOwogICAgfQogICAgZWxzZQogICAg ICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24pOwogICAgcmV0dXJuIGJlZ2luKCkgKyBfX247CiAg fQoKICAgCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0KGl0 ZXJhdG9yIF9fcG9zLCBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xh c3QpIHsKICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+Ojpf SW50ZWdyYWwgX0ludGVncmFsOwogICAgX01faW5zZXJ0X2Rpc3BhdGNoKF9fcG9zLCBfX2ZpcnN0 LCBfX2xhc3QsIF9JbnRlZ3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4K ICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBf SW50ZWdlciBfX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBfX3RydWVfdHlwZSkgewog ICAgaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBlKSBfX24sIChfVHApIF9fdmFsKTsKICB9CgogIHRl bXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChp dGVyYXRvciBfX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBf X2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg X19mYWxzZV90eXBlKSB7CiAgICBfTV9yYW5nZV9pbnNlcnQoX19wb3MsIF9fZmlyc3QsIF9fbGFz dCwgX19pdGVyYXRvcl9jYXRlZ29yeSggX19maXJzdCApICk7CiAgfQoKCgoKCiAgdm9pZCBpbnNl cnQgKGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9feCk7CgogIHZv aWQgcG9wX2JhY2soKSB7CiAgICAtLV9NX2ZpbmlzaDsKICAgIGRlc3Ryb3koX01fZmluaXNoKTsK ICB9CiAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19wb3NpdGlvbikgewogICAgaWYgKF9fcG9z aXRpb24gKyAxICE9IGVuZCgpKQogICAgICBjb3B5KF9fcG9zaXRpb24gKyAxLCBfTV9maW5pc2gs IF9fcG9zaXRpb24pOwogICAgLS1fTV9maW5pc2g7CiAgICBkZXN0cm95KF9NX2ZpbmlzaCk7CiAg ICByZXR1cm4gX19wb3NpdGlvbjsKICB9CiAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgX19maXJz dCwgaXRlcmF0b3IgX19sYXN0KSB7CiAgICBpdGVyYXRvciBfX2kgPSBjb3B5KF9fbGFzdCwgX01f ZmluaXNoLCBfX2ZpcnN0KTsKICAgIGRlc3Ryb3koX19pLCBfTV9maW5pc2gpOwogICAgX01fZmlu aXNoID0gX01fZmluaXNoIC0gKF9fbGFzdCAtIF9fZmlyc3QpOwogICAgcmV0dXJuIF9fZmlyc3Q7 CiAgfQoKICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gp IHsKICAgIGlmIChfX25ld19zaXplIDwgc2l6ZSgpKSAKICAgICAgZXJhc2UoYmVnaW4oKSArIF9f bmV3X3NpemUsIGVuZCgpKTsKICAgIGVsc2UKICAgICAgaW5zZXJ0KGVuZCgpLCBfX25ld19zaXpl IC0gc2l6ZSgpLCBfX3gpOwogIH0KICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgX19uZXdfc2l6ZSkg eyByZXNpemUoX19uZXdfc2l6ZSwgX1RwKCkpOyB9CiAgdm9pZCBjbGVhcigpIHsgZXJhc2UoYmVn aW4oKSwgZW5kKCkpOyB9Cgpwcm90ZWN0ZWQ6CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJ dGVyYXRvcj4KICBpdGVyYXRvciBfTV9hbGxvY2F0ZV9hbmRfY29weShzaXplX3R5cGUgX19uLCBf Rm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0KQp7CiAgICBpdGVyYXRvciBf X3Jlc3VsdCA9IF9NX2FsbG9jYXRlKF9fbik7CiAgICB0cnkgIHsKICAgICAgdW5pbml0aWFsaXpl ZF9jb3B5KF9fZmlyc3QsIF9fbGFzdCwgX19yZXN1bHQpOwogICAgICByZXR1cm4gX19yZXN1bHQ7 CiAgICB9CiAgICBjYXRjaCguLi4pIHsgIF9NX2RlYWxsb2NhdGUoX19yZXN1bHQsIF9fbikgOyB0 aHJvdzsgfSA7CiAgfQojIDQ0MCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF92ZWN0b3IuaCIgMwoKCgoKICB0 ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBfTV9yYW5nZV9pbml0aWFsaXpl KF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lu cHV0SXRlcmF0b3IgX19sYXN0LCBpbnB1dF9pdGVyYXRvcl90YWcpCiAgewogICAgZm9yICggOyBf X2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOwog IH0KCiAgIAogIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fcmFu Z2VfaW5pdGlhbGl6ZShfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsCiAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LCBmb3J3YXJkX2l0ZXJhdG9yX3RhZykK ICB7CiAgICBzaXplX3R5cGUgX19uID0gMDsKICAgIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwg X19uKTsKICAgIF9NX3N0YXJ0ID0gX01fYWxsb2NhdGUoX19uKTsKICAgIF9NX2VuZF9vZl9zdG9y YWdlID0gX01fc3RhcnQgKyBfX247CiAgICBfTV9maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHko X19maXJzdCwgX19sYXN0LCBfTV9zdGFydCk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0 SXRlcmF0b3I+CiAgdm9pZCBfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3MsCiAgICAgICAg ICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19s YXN0LAogICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZyk7CgogIHRlbXBs YXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgogIHZvaWQgX01fcmFuZ2VfaW5zZXJ0KGl0ZXJh dG9yIF9fcG9zLAogICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJz dCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgZm9yd2Fy ZF9pdGVyYXRvcl90YWcpOwoKCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+ CmlubGluZSBib29sIApvcGVyYXRvcj09KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwg Y29uc3QgdmVjdG9yPF9UcCwgX0FsbG9jPiYgX195KQp7CiAgcmV0dXJuIF9feC5zaXplKCkgPT0g X195LnNpemUoKSAmJgogICAgICAgICBlcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgpLCBfX3ku YmVnaW4oKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KaW5saW5lIGJv b2wgCm9wZXJhdG9yPChjb25zdCB2ZWN0b3I8X1RwLCBfQWxsb2M+JiBfX3gsIGNvbnN0IHZlY3Rv cjxfVHAsIF9BbGxvYz4mIF9feSkKewogIHJldHVybiBsZXhpY29ncmFwaGljYWxfY29tcGFyZShf X3guYmVnaW4oKSwgX194LmVuZCgpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X195LmJlZ2luKCksIF9feS5lbmQoKSk7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3Mg X0FsbG9jPgppbmxpbmUgdm9pZCBzd2FwKHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCwgdmVjdG9y PF9UcCwgX0FsbG9jPiYgX195KQp7CiAgX194LnN3YXAoX195KTsKfQoKCgp0ZW1wbGF0ZSA8Y2xh c3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZlY3RvcjxfVHAsX0FsbG9jPiYgCnZlY3RvcjxfVHAsX0Fs bG9jPjo6b3BlcmF0b3I9KGNvbnN0IHZlY3RvcjxfVHAsIF9BbGxvYz4mIF9feCkKewogIGlmICgm X194ICE9IHRoaXMpIHsKICAgIGNvbnN0IHNpemVfdHlwZSBfX3hsZW4gPSBfX3guc2l6ZSgpOwog ICAgaWYgKF9feGxlbiA+IGNhcGFjaXR5KCkpIHsKICAgICAgaXRlcmF0b3IgX190bXAgPSBfTV9h bGxvY2F0ZV9hbmRfY29weShfX3hsZW4sIF9feC5iZWdpbigpLCBfX3guZW5kKCkpOwogICAgICBk ZXN0cm95KF9NX3N0YXJ0LCBfTV9maW5pc2gpOwogICAgICBfTV9kZWFsbG9jYXRlKF9NX3N0YXJ0 LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0KTsKICAgICAgX01fc3RhcnQgPSBfX3RtcDsK ICAgICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfTV9zdGFydCArIF9feGxlbjsKICAgIH0KICAgIGVs c2UgaWYgKHNpemUoKSA+PSBfX3hsZW4pIHsKICAgICAgaXRlcmF0b3IgX19pID0gY29weShfX3gu YmVnaW4oKSwgX194LmVuZCgpLCBiZWdpbigpKTsKICAgICAgZGVzdHJveShfX2ksIF9NX2Zpbmlz aCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgY29weShfX3guYmVnaW4oKSwgX194LmJlZ2luKCkg KyBzaXplKCksIF9NX3N0YXJ0KTsKICAgICAgdW5pbml0aWFsaXplZF9jb3B5KF9feC5iZWdpbigp ICsgc2l6ZSgpLCBfX3guZW5kKCksIF9NX2ZpbmlzaCk7CiAgICB9CiAgICBfTV9maW5pc2ggPSBf TV9zdGFydCArIF9feGxlbjsKICB9CiAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3Mg X1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6YXNzaWduKHNpemVf dCBfX24sIGNvbnN0IHZhbHVlX3R5cGUmIF9fdmFsKSB7CiAgaWYgKF9fbiA+IGNhcGFjaXR5KCkp IHsKICAgIHZlY3RvcjxfVHAsIF9BbGxvYz4gX190bXAoX19uLCBfX3ZhbCwgZ2V0X2FsbG9jYXRv cigpKTsKICAgIF9fdG1wLnN3YXAoKnRoaXMpOwogIH0KICBlbHNlIGlmIChfX24gPiBzaXplKCkp IHsKICAgIGZpbGwoYmVnaW4oKSwgZW5kKCksIF9fdmFsKTsKICAgIF9NX2ZpbmlzaCA9IHVuaW5p dGlhbGl6ZWRfZmlsbF9uKF9NX2ZpbmlzaCwgX19uIC0gc2l6ZSgpLCBfX3ZhbCk7CiAgfQogIGVs c2UKICAgIGVyYXNlKGZpbGxfbihiZWdpbigpLCBfX24sIF9fdmFsKSwgZW5kKCkpOwp9CgoKCnRl bXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4gdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0 ZXI+CnZvaWQgdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fYXNzaWduX2F1eChfSW5wdXRJdGVyIF9f Zmlyc3QsIF9JbnB1dEl0ZXIgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaW5wdXRfaXRlcmF0b3JfdGFnKSB7CiAgaXRlcmF0b3IgX19jdXIgPSBiZWdpbigp OwogIGZvciAoIDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIs ICsrX19maXJzdCkKICAgICpfX2N1ciA9ICpfX2ZpcnN0OwogIGlmIChfX2ZpcnN0ID09IF9fbGFz dCkKICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7CiAgZWxzZQogICAgaW5zZXJ0KGVuZCgpLCBfX2Zp cnN0LCBfX2xhc3QpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+IHRlbXBs YXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXI+CnZvaWQKdmVjdG9yPF9UcCwgX0FsbG9jPjo6X01fYXNz aWduX2F1eChfRm9yd2FyZEl0ZXIgX19maXJzdCwgX0ZvcndhcmRJdGVyIF9fbGFzdCwKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykgewogIHNp emVfdHlwZSBfX2xlbiA9IDA7CiAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBfX2xlbik7Cgog IGlmIChfX2xlbiA+IGNhcGFjaXR5KCkpIHsKICAgIGl0ZXJhdG9yIF9fdG1wID0gX01fYWxsb2Nh dGVfYW5kX2NvcHkoX19sZW4sIF9fZmlyc3QsIF9fbGFzdCk7CiAgICBkZXN0cm95KF9NX3N0YXJ0 LCBfTV9maW5pc2gpOwogICAgX01fZGVhbGxvY2F0ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3Jh Z2UgLSBfTV9zdGFydCk7CiAgICBfTV9zdGFydCA9IF9fdG1wOwogICAgX01fZW5kX29mX3N0b3Jh Z2UgPSBfTV9maW5pc2ggPSBfTV9zdGFydCArIF9fbGVuOwogIH0KICBlbHNlIGlmIChzaXplKCkg Pj0gX19sZW4pIHsKICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IGNvcHkoX19maXJzdCwgX19s YXN0LCBfTV9zdGFydCk7CiAgICBkZXN0cm95KF9fbmV3X2ZpbmlzaCwgX01fZmluaXNoKTsKICAg IF9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKICB9CiAgZWxzZSB7CiAgICBfRm9yd2FyZEl0ZXIg X19taWQgPSBfX2ZpcnN0OwogICAgYWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKICAgIGNvcHkoX19m aXJzdCwgX19taWQsIF9NX3N0YXJ0KTsKICAgIF9NX2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29w eShfX21pZCwgX19sYXN0LCBfTV9maW5pc2gpOwogIH0KfQoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQWxsb2M+CnZvaWQgCnZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX2luc2VydF9hdXgo aXRlcmF0b3IgX19wb3NpdGlvbiwgY29uc3QgX1RwJiBfX3gpCnsKICBpZiAoX01fZmluaXNoICE9 IF9NX2VuZF9vZl9zdG9yYWdlKSB7CiAgICBjb25zdHJ1Y3QoX01fZmluaXNoLCAqKF9NX2Zpbmlz aCAtIDEpKTsKICAgICsrX01fZmluaXNoOwogICAgX1RwIF9feF9jb3B5ID0gX194OwogICAgY29w eV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBfTV9maW5pc2ggLSAyLCBfTV9maW5pc2ggLSAxKTsKICAg ICpfX3Bvc2l0aW9uID0gX194X2NvcHk7CiAgfQogIGVsc2UgewogICAgY29uc3Qgc2l6ZV90eXBl IF9fb2xkX3NpemUgPSBzaXplKCk7CiAgICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9z aXplICE9IDAgPyAyICogX19vbGRfc2l6ZSA6IDE7CiAgICBpdGVyYXRvciBfX25ld19zdGFydCA9 IF9NX2FsbG9jYXRlKF9fbGVuKTsKICAgIGl0ZXJhdG9yIF9fbmV3X2ZpbmlzaCA9IF9fbmV3X3N0 YXJ0OwogICAgdHJ5ICB7CiAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShf TV9zdGFydCwgX19wb3NpdGlvbiwgX19uZXdfc3RhcnQpOwogICAgICBjb25zdHJ1Y3QoX19uZXdf ZmluaXNoLCBfX3gpOwogICAgICArK19fbmV3X2ZpbmlzaDsKICAgICAgX19uZXdfZmluaXNoID0g dW5pbml0aWFsaXplZF9jb3B5KF9fcG9zaXRpb24sIF9NX2ZpbmlzaCwgX19uZXdfZmluaXNoKTsK ICAgIH0KICAgIGNhdGNoKC4uLikgeyAgKGRlc3Ryb3koX19uZXdfc3RhcnQsX19uZXdfZmluaXNo KSwgCiAgICAgICAgICAgICAgICAgIF9NX2RlYWxsb2NhdGUoX19uZXdfc3RhcnQsX19sZW4pKSA7 IHRocm93OyB9IDsKICAgIGRlc3Ryb3koYmVnaW4oKSwgZW5kKCkpOwogICAgX01fZGVhbGxvY2F0 ZShfTV9zdGFydCwgX01fZW5kX29mX3N0b3JhZ2UgLSBfTV9zdGFydCk7CiAgICBfTV9zdGFydCA9 IF9fbmV3X3N0YXJ0OwogICAgX01fZmluaXNoID0gX19uZXdfZmluaXNoOwogICAgX01fZW5kX29m X3N0b3JhZ2UgPSBfX25ld19zdGFydCArIF9fbGVuOwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9U cCwgY2xhc3MgX0FsbG9jPgp2b2lkIAp2ZWN0b3I8X1RwLCBfQWxsb2M+OjpfTV9pbnNlcnRfYXV4 KGl0ZXJhdG9yIF9fcG9zaXRpb24pCnsKICBpZiAoX01fZmluaXNoICE9IF9NX2VuZF9vZl9zdG9y YWdlKSB7CiAgICBjb25zdHJ1Y3QoX01fZmluaXNoLCAqKF9NX2ZpbmlzaCAtIDEpKTsKICAgICsr X01fZmluaXNoOwogICAgY29weV9iYWNrd2FyZChfX3Bvc2l0aW9uLCBfTV9maW5pc2ggLSAyLCBf TV9maW5pc2ggLSAxKTsKICAgICpfX3Bvc2l0aW9uID0gX1RwKCk7CiAgfQogIGVsc2UgewogICAg Y29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CiAgICBjb25zdCBzaXplX3R5cGUg X19sZW4gPSBfX29sZF9zaXplICE9IDAgPyAyICogX19vbGRfc2l6ZSA6IDE7CiAgICBpdGVyYXRv ciBfX25ld19zdGFydCA9IF9NX2FsbG9jYXRlKF9fbGVuKTsKICAgIGl0ZXJhdG9yIF9fbmV3X2Zp bmlzaCA9IF9fbmV3X3N0YXJ0OwogICAgdHJ5ICB7CiAgICAgIF9fbmV3X2ZpbmlzaCA9IHVuaW5p dGlhbGl6ZWRfY29weShfTV9zdGFydCwgX19wb3NpdGlvbiwgX19uZXdfc3RhcnQpOwogICAgICBj b25zdHJ1Y3QoX19uZXdfZmluaXNoKTsKICAgICAgKytfX25ld19maW5pc2g7CiAgICAgIF9fbmV3 X2ZpbmlzaCA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3Bvc2l0aW9uLCBfTV9maW5pc2gsIF9fbmV3 X2ZpbmlzaCk7CiAgICB9CiAgICBjYXRjaCguLi4pIHsgIChkZXN0cm95KF9fbmV3X3N0YXJ0LF9f bmV3X2ZpbmlzaCksIAogICAgICAgICAgICAgICAgICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0 LF9fbGVuKSkgOyB0aHJvdzsgfSA7CiAgICBkZXN0cm95KGJlZ2luKCksIGVuZCgpKTsKICAgIF9N X2RlYWxsb2NhdGUoX01fc3RhcnQsIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3RhcnQpOwogICAg X01fc3RhcnQgPSBfX25ld19zdGFydDsKICAgIF9NX2ZpbmlzaCA9IF9fbmV3X2ZpbmlzaDsKICAg IF9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsKICB9Cn0KCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kdm9pZCB2ZWN0b3I8X1RwLCBfQWxsb2M+OjppbnNl cnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBlIF9fbiwgCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IF9UcCYgX194KQp7CiAgaWYgKF9fbiAhPSAwKSB7CiAgICBp ZiAoc2l6ZV90eXBlKF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fZmluaXNoKSA+PSBfX24pIHsKICAg ICAgX1RwIF9feF9jb3B5ID0gX194OwogICAgICBjb25zdCBzaXplX3R5cGUgX19lbGVtc19hZnRl ciA9IF9NX2ZpbmlzaCAtIF9fcG9zaXRpb247CiAgICAgIGl0ZXJhdG9yIF9fb2xkX2ZpbmlzaCA9 IF9NX2ZpbmlzaDsKICAgICAgaWYgKF9fZWxlbXNfYWZ0ZXIgPiBfX24pIHsKICAgICAgICB1bmlu aXRpYWxpemVkX2NvcHkoX01fZmluaXNoIC0gX19uLCBfTV9maW5pc2gsIF9NX2ZpbmlzaCk7CiAg ICAgICAgX01fZmluaXNoICs9IF9fbjsKICAgICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24s IF9fb2xkX2ZpbmlzaCAtIF9fbiwgX19vbGRfZmluaXNoKTsKICAgICAgICBmaWxsKF9fcG9zaXRp b24sIF9fcG9zaXRpb24gKyBfX24sIF9feF9jb3B5KTsKICAgICAgfQogICAgICBlbHNlIHsKICAg ICAgICB1bmluaXRpYWxpemVkX2ZpbGxfbihfTV9maW5pc2gsIF9fbiAtIF9fZWxlbXNfYWZ0ZXIs IF9feF9jb3B5KTsKICAgICAgICBfTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsKICAg ICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX19vbGRfZmluaXNoLCBfTV9maW5p c2gpOwogICAgICAgIF9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOwogICAgICAgIGZpbGwoX19w b3NpdGlvbiwgX19vbGRfZmluaXNoLCBfX3hfY29weSk7CiAgICAgIH0KICAgIH0KICAgIGVsc2Ug ewogICAgICBjb25zdCBzaXplX3R5cGUgX19vbGRfc2l6ZSA9IHNpemUoKTsgICAgICAgIAogICAg ICBjb25zdCBzaXplX3R5cGUgX19sZW4gPSBfX29sZF9zaXplICsgbWF4KF9fb2xkX3NpemUsIF9f bik7CiAgICAgIGl0ZXJhdG9yIF9fbmV3X3N0YXJ0ID0gX01fYWxsb2NhdGUoX19sZW4pOwogICAg ICBpdGVyYXRvciBfX25ld19maW5pc2ggPSBfX25ld19zdGFydDsKICAgICAgdHJ5ICB7CiAgICAg ICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9jb3B5KF9NX3N0YXJ0LCBfX3Bvc2l0aW9u LCBfX25ld19zdGFydCk7CiAgICAgICAgX19uZXdfZmluaXNoID0gdW5pbml0aWFsaXplZF9maWxs X24oX19uZXdfZmluaXNoLCBfX24sIF9feCk7CiAgICAgICAgX19uZXdfZmluaXNoCiAgICAgICAg ICA9IHVuaW5pdGlhbGl6ZWRfY29weShfX3Bvc2l0aW9uLCBfTV9maW5pc2gsIF9fbmV3X2Zpbmlz aCk7CiAgICAgIH0KICAgICAgY2F0Y2goLi4uKSB7ICAoZGVzdHJveShfX25ld19zdGFydCxfX25l d19maW5pc2gpLCAKICAgICAgICAgICAgICAgICAgICBfTV9kZWFsbG9jYXRlKF9fbmV3X3N0YXJ0 LF9fbGVuKSkgOyB0aHJvdzsgfSA7CiAgICAgIGRlc3Ryb3koX01fc3RhcnQsIF9NX2ZpbmlzaCk7 CiAgICAgIF9NX2RlYWxsb2NhdGUoX01fc3RhcnQsIF9NX2VuZF9vZl9zdG9yYWdlIC0gX01fc3Rh cnQpOwogICAgICBfTV9zdGFydCA9IF9fbmV3X3N0YXJ0OwogICAgICBfTV9maW5pc2ggPSBfX25l d19maW5pc2g7CiAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX19uZXdfc3RhcnQgKyBfX2xlbjsK ICAgIH0KICB9Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1wbGF0 ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CnZvaWQgCnZlY3RvcjxfVHAsIF9BbGxvYz46Ol9NX3Jh bmdlX2luc2VydChpdGVyYXRvciBfX3BvcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCAKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykKewogIGZvciAoIDsgX19maXJzdCAh PSBfX2xhc3Q7ICsrX19maXJzdCkgewogICAgX19wb3MgPSBpbnNlcnQoX19wb3MsICpfX2ZpcnN0 KTsKICAgICsrX19wb3M7CiAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+ IHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgp2b2lkIAp2ZWN0b3I8X1RwLCBfQWxs b2M+OjpfTV9yYW5nZV9pbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19maXJzdCwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0b3IgX19sYXN0LAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpCnsK ICBpZiAoX19maXJzdCAhPSBfX2xhc3QpIHsKICAgIHNpemVfdHlwZSBfX24gPSAwOwogICAgZGlz dGFuY2UoX19maXJzdCwgX19sYXN0LCBfX24pOwogICAgaWYgKHNpemVfdHlwZShfTV9lbmRfb2Zf c3RvcmFnZSAtIF9NX2ZpbmlzaCkgPj0gX19uKSB7CiAgICAgIGNvbnN0IHNpemVfdHlwZSBfX2Vs ZW1zX2FmdGVyID0gX01fZmluaXNoIC0gX19wb3NpdGlvbjsKICAgICAgaXRlcmF0b3IgX19vbGRf ZmluaXNoID0gX01fZmluaXNoOwogICAgICBpZiAoX19lbGVtc19hZnRlciA+IF9fbikgewogICAg ICAgIHVuaW5pdGlhbGl6ZWRfY29weShfTV9maW5pc2ggLSBfX24sIF9NX2ZpbmlzaCwgX01fZmlu aXNoKTsKICAgICAgICBfTV9maW5pc2ggKz0gX19uOwogICAgICAgIGNvcHlfYmFja3dhcmQoX19w b3NpdGlvbiwgX19vbGRfZmluaXNoIC0gX19uLCBfX29sZF9maW5pc2gpOwogICAgICAgIGNvcHko X19maXJzdCwgX19sYXN0LCBfX3Bvc2l0aW9uKTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAg ICBfRm9yd2FyZEl0ZXJhdG9yIF9fbWlkID0gX19maXJzdDsKICAgICAgICBhZHZhbmNlKF9fbWlk LCBfX2VsZW1zX2FmdGVyKTsKICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19taWQsIF9fbGFz dCwgX01fZmluaXNoKTsKICAgICAgICBfTV9maW5pc2ggKz0gX19uIC0gX19lbGVtc19hZnRlcjsK ICAgICAgICB1bmluaXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX19vbGRfZmluaXNoLCBfTV9m aW5pc2gpOwogICAgICAgIF9NX2ZpbmlzaCArPSBfX2VsZW1zX2FmdGVyOwogICAgICAgIGNvcHko X19maXJzdCwgX19taWQsIF9fcG9zaXRpb24pOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAg ICAgY29uc3Qgc2l6ZV90eXBlIF9fb2xkX3NpemUgPSBzaXplKCk7CiAgICAgIGNvbnN0IHNpemVf dHlwZSBfX2xlbiA9IF9fb2xkX3NpemUgKyBtYXgoX19vbGRfc2l6ZSwgX19uKTsKICAgICAgaXRl cmF0b3IgX19uZXdfc3RhcnQgPSBfTV9hbGxvY2F0ZShfX2xlbik7CiAgICAgIGl0ZXJhdG9yIF9f bmV3X2ZpbmlzaCA9IF9fbmV3X3N0YXJ0OwogICAgICB0cnkgIHsKICAgICAgICBfX25ld19maW5p c2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX01fc3RhcnQsIF9fcG9zaXRpb24sIF9fbmV3X3N0YXJ0 KTsKICAgICAgICBfX25ld19maW5pc2ggPSB1bmluaXRpYWxpemVkX2NvcHkoX19maXJzdCwgX19s YXN0LCBfX25ld19maW5pc2gpOwogICAgICAgIF9fbmV3X2ZpbmlzaAogICAgICAgICAgPSB1bmlu aXRpYWxpemVkX2NvcHkoX19wb3NpdGlvbiwgX01fZmluaXNoLCBfX25ld19maW5pc2gpOwogICAg ICB9CiAgICAgIGNhdGNoKC4uLikgeyAgKGRlc3Ryb3koX19uZXdfc3RhcnQsX19uZXdfZmluaXNo KSwgCiAgICAgICAgICAgICAgICAgICAgX01fZGVhbGxvY2F0ZShfX25ld19zdGFydCxfX2xlbikp IDsgdGhyb3c7IH0gOwogICAgICBkZXN0cm95KF9NX3N0YXJ0LCBfTV9maW5pc2gpOwogICAgICBf TV9kZWFsbG9jYXRlKF9NX3N0YXJ0LCBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0KTsKICAg ICAgX01fc3RhcnQgPSBfX25ld19zdGFydDsKICAgICAgX01fZmluaXNoID0gX19uZXdfZmluaXNo OwogICAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9fbmV3X3N0YXJ0ICsgX19sZW47CiAgICB9CiAg fQp9CgojIDgxMCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8u Li8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF92ZWN0b3IuaCIgMwoKCgoKCgoKICAKCgoKIAog CiAKIyAzNCAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8u Li8uLi8uLi9pbmNsdWRlL2crKy0zL3ZlY3RvciIgMiAzCgojIDEgIi91c3IvbGliL2djYy1saWIv aTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxf YnZlY3Rvci5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgogIAoKc3Rh dGljIGNvbnN0IGludCBfX1dPUkRfQklUID0gaW50KDggKnNpemVvZih1bnNpZ25lZCBpbnQpKTsK CgoKCgoKc3RydWN0IF9CaXRfcmVmZXJlbmNlIHsKICB1bnNpZ25lZCBpbnQqIF9NX3A7CiAgdW5z aWduZWQgaW50IF9NX21hc2s7CiAgX0JpdF9yZWZlcmVuY2UodW5zaWduZWQgaW50KiBfX3gsIHVu c2lnbmVkIGludCBfX3kpIAogICAgOiBfTV9wKF9feCksIF9NX21hc2soX195KSB7fQoKcHVibGlj OgogIF9CaXRfcmVmZXJlbmNlKCkgOiBfTV9wKDApLCBfTV9tYXNrKDApIHt9CiAgb3BlcmF0b3Ig Ym9vbCgpIGNvbnN0IHsgcmV0dXJuICEoISgqX01fcCAmIF9NX21hc2spKTsgfQogIF9CaXRfcmVm ZXJlbmNlJiBvcGVyYXRvcj0oYm9vbCBfX3gpCiAgewogICAgaWYgKF9feCkgICpfTV9wIHw9IF9N X21hc2s7CiAgICBlbHNlICAgICAgKl9NX3AgJj0gfl9NX21hc2s7CiAgICByZXR1cm4gKnRoaXM7 CiAgfQogIF9CaXRfcmVmZXJlbmNlJiBvcGVyYXRvcj0oY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9f eCkgCiAgICB7IHJldHVybiAqdGhpcyA9IGJvb2woX194KTsgfQogIGJvb2wgb3BlcmF0b3I9PShj b25zdCBfQml0X3JlZmVyZW5jZSYgX194KSBjb25zdAogICAgeyByZXR1cm4gYm9vbCgqdGhpcykg PT0gYm9vbChfX3gpOyB9CiAgYm9vbCBvcGVyYXRvcjwoY29uc3QgX0JpdF9yZWZlcmVuY2UmIF9f eCkgY29uc3QgewogICAgcmV0dXJuICFib29sKCp0aGlzKSAmJiBib29sKF9feCk7CiAgfQogIHZv aWQgZmxpcCgpIHsgKl9NX3AgXj0gX01fbWFzazsgfQp9OwoKaW5saW5lIHZvaWQgc3dhcChfQml0 X3JlZmVyZW5jZSBfX3gsIF9CaXRfcmVmZXJlbmNlIF9feSkKewogIGJvb2wgX190bXAgPSBfX3g7 CiAgX194ID0gX195OwogIF9feSA9IF9fdG1wOwp9CgpzdHJ1Y3QgX0JpdF9pdGVyYXRvciA6IHB1 YmxpYyByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPGJvb2wsIHB0cmRpZmZfdD4gewogIHR5cGVkZWYg X0JpdF9yZWZlcmVuY2UgIHJlZmVyZW5jZTsKICB0eXBlZGVmIF9CaXRfcmVmZXJlbmNlKiBwb2lu dGVyOwogIHR5cGVkZWYgX0JpdF9pdGVyYXRvciAgIGl0ZXJhdG9yOwoKICB1bnNpZ25lZCBpbnQq IF9NX3A7CiAgdW5zaWduZWQgaW50IF9NX29mZnNldDsKICB2b2lkIGJ1bXBfdXAoKSB7CiAgICBp ZiAoX01fb2Zmc2V0KysgPT0gX19XT1JEX0JJVCAtIDEpIHsKICAgICAgX01fb2Zmc2V0ID0gMDsK ICAgICAgKytfTV9wOwogICAgfQogIH0KICB2b2lkIGJ1bXBfZG93bigpIHsKICAgIGlmIChfTV9v ZmZzZXQtLSA9PSAwKSB7CiAgICAgIF9NX29mZnNldCA9IF9fV09SRF9CSVQgLSAxOwogICAgICAt LV9NX3A7CiAgICB9CiAgfQoKICBfQml0X2l0ZXJhdG9yKCkgOiBfTV9wKDApLCBfTV9vZmZzZXQo MCkge30KICBfQml0X2l0ZXJhdG9yKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195 KSAKICAgIDogX01fcChfX3gpLCBfTV9vZmZzZXQoX195KSB7fQogIHJlZmVyZW5jZSBvcGVyYXRv ciooKSBjb25zdCB7IHJldHVybiByZWZlcmVuY2UoX01fcCwgMVUgPDwgX01fb2Zmc2V0KTsgfQog IGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgewogICAgYnVtcF91cCgpOwogICAgcmV0dXJuICp0aGlz OwogIH0KICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgewogICAgaXRlcmF0b3IgX190bXAgPSAq dGhpczsKICAgIGJ1bXBfdXAoKTsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgaXRlcmF0b3ImIG9w ZXJhdG9yLS0oKSB7CiAgICBidW1wX2Rvd24oKTsKICAgIHJldHVybiAqdGhpczsKICB9CiAgaXRl cmF0b3Igb3BlcmF0b3ItLShpbnQpIHsKICAgIGl0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CiAgICBi dW1wX2Rvd24oKTsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgaXRlcmF0b3ImIG9wZXJhdG9yKz0o ZGlmZmVyZW5jZV90eXBlIF9faSkgewogICAgZGlmZmVyZW5jZV90eXBlIF9fbiA9IF9faSArIF9N X29mZnNldDsKICAgIF9NX3AgKz0gX19uIC8gX19XT1JEX0JJVDsKICAgIF9fbiA9IF9fbiAlIF9f V09SRF9CSVQ7CiAgICBpZiAoX19uIDwgMCkgewogICAgICBfTV9vZmZzZXQgPSAodW5zaWduZWQg aW50KSBfX24gKyBfX1dPUkRfQklUOwogICAgICAtLV9NX3A7CiAgICB9IGVsc2UKICAgICAgX01f b2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgX19uOwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpdGVy YXRvciYgb3BlcmF0b3ItPShkaWZmZXJlbmNlX3R5cGUgX19pKSB7CiAgICAqdGhpcyArPSAtX19p OwogICAgcmV0dXJuICp0aGlzOwogIH0KICBpdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90 eXBlIF9faSkgY29uc3QgewogICAgaXRlcmF0b3IgX190bXAgPSAqdGhpczsKICAgIHJldHVybiBf X3RtcCArPSBfX2k7CiAgfQogIGl0ZXJhdG9yIG9wZXJhdG9yLShkaWZmZXJlbmNlX3R5cGUgX19p KSBjb25zdCB7CiAgICBpdGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICAgcmV0dXJuIF9fdG1wIC09 IF9faTsKICB9CiAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShpdGVyYXRvciBfX3gpIGNvbnN0 IHsKICAgIHJldHVybiBfX1dPUkRfQklUICogKF9NX3AgLSBfX3guX01fcCkgKyBfTV9vZmZzZXQg LSBfX3guX01fb2Zmc2V0OwogIH0KICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5 cGUgX19pKSB7IHJldHVybiAqKCp0aGlzICsgX19pKTsgfQogIGJvb2wgb3BlcmF0b3I9PShjb25z dCBpdGVyYXRvciYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX01fcCA9PSBfX3guX01fcCAmJiBf TV9vZmZzZXQgPT0gX194Ll9NX29mZnNldDsKICB9CiAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0 ZXJhdG9yJiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBfTV9wICE9IF9feC5fTV9wIHx8IF9NX29m ZnNldCAhPSBfX3guX01fb2Zmc2V0OwogIH0KICBib29sIG9wZXJhdG9yPChpdGVyYXRvciBfX3gp IGNvbnN0IHsKICAgIHJldHVybiBfTV9wIDwgX194Ll9NX3AgfHwgKF9NX3AgPT0gX194Ll9NX3Ag JiYgX01fb2Zmc2V0IDwgX194Ll9NX29mZnNldCk7CiAgfQp9OwoKc3RydWN0IF9CaXRfY29uc3Rf aXRlcmF0b3IKICA6IHB1YmxpYyByYW5kb21fYWNjZXNzX2l0ZXJhdG9yPGJvb2wsIHB0cmRpZmZf dD4KewogIHR5cGVkZWYgYm9vbCAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOwogIHR5cGVkZWYg Ym9vbCAgICAgICAgICAgICAgICAgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgY29uc3QgYm9v bCogICAgICAgICAgcG9pbnRlcjsKICB0eXBlZGVmIF9CaXRfY29uc3RfaXRlcmF0b3IgIGNvbnN0 X2l0ZXJhdG9yOwoKICB1bnNpZ25lZCBpbnQqIF9NX3A7CiAgdW5zaWduZWQgaW50IF9NX29mZnNl dDsKICB2b2lkIGJ1bXBfdXAoKSB7CiAgICBpZiAoX01fb2Zmc2V0KysgPT0gX19XT1JEX0JJVCAt IDEpIHsKICAgICAgX01fb2Zmc2V0ID0gMDsKICAgICAgKytfTV9wOwogICAgfQogIH0KICB2b2lk IGJ1bXBfZG93bigpIHsKICAgIGlmIChfTV9vZmZzZXQtLSA9PSAwKSB7CiAgICAgIF9NX29mZnNl dCA9IF9fV09SRF9CSVQgLSAxOwogICAgICAtLV9NX3A7CiAgICB9CiAgfQoKICBfQml0X2NvbnN0 X2l0ZXJhdG9yKCkgOiBfTV9wKDApLCBfTV9vZmZzZXQoMCkge30KICBfQml0X2NvbnN0X2l0ZXJh dG9yKHVuc2lnbmVkIGludCogX194LCB1bnNpZ25lZCBpbnQgX195KSAKICAgIDogX01fcChfX3gp LCBfTV9vZmZzZXQoX195KSB7fQogIF9CaXRfY29uc3RfaXRlcmF0b3IoY29uc3QgX0JpdF9pdGVy YXRvciYgX194KSAKICAgIDogX01fcChfX3guX01fcCksIF9NX29mZnNldChfX3guX01fb2Zmc2V0 KSB7fQogIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CiAgICByZXR1cm4gX0Jp dF9yZWZlcmVuY2UoX01fcCwgMVUgPDwgX01fb2Zmc2V0KTsKICB9CiAgY29uc3RfaXRlcmF0b3Im IG9wZXJhdG9yKysoKSB7CiAgICBidW1wX3VwKCk7CiAgICByZXR1cm4gKnRoaXM7CiAgfQogIGNv bnN0X2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CiAgICBjb25zdF9pdGVyYXRvciBfX3RtcCA9 ICp0aGlzOwogICAgYnVtcF91cCgpOwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBjb25zdF9pdGVy YXRvciYgb3BlcmF0b3ItLSgpIHsKICAgIGJ1bXBfZG93bigpOwogICAgcmV0dXJuICp0aGlzOwog IH0KICBjb25zdF9pdGVyYXRvciBvcGVyYXRvci0tKGludCkgewogICAgY29uc3RfaXRlcmF0b3Ig X190bXAgPSAqdGhpczsKICAgIGJ1bXBfZG93bigpOwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBj b25zdF9pdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgX19pKSB7CiAgICBkaWZm ZXJlbmNlX3R5cGUgX19uID0gX19pICsgX01fb2Zmc2V0OwogICAgX01fcCArPSBfX24gLyBfX1dP UkRfQklUOwogICAgX19uID0gX19uICUgX19XT1JEX0JJVDsKICAgIGlmIChfX24gPCAwKSB7CiAg ICAgIF9NX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIF9fbiArIF9fV09SRF9CSVQ7CiAgICAgIC0t X01fcDsKICAgIH0gZWxzZQogICAgICBfTV9vZmZzZXQgPSAodW5zaWduZWQgaW50KSBfX247CiAg ICByZXR1cm4gKnRoaXM7CiAgfQogIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVu Y2VfdHlwZSBfX2kpIHsKICAgICp0aGlzICs9IC1fX2k7CiAgICByZXR1cm4gKnRoaXM7CiAgfQog IGNvbnN0X2l0ZXJhdG9yIG9wZXJhdG9yKyhkaWZmZXJlbmNlX3R5cGUgX19pKSBjb25zdCB7CiAg ICBjb25zdF9pdGVyYXRvciBfX3RtcCA9ICp0aGlzOwogICAgcmV0dXJuIF9fdG1wICs9IF9faTsK ICB9CiAgY29uc3RfaXRlcmF0b3Igb3BlcmF0b3ItKGRpZmZlcmVuY2VfdHlwZSBfX2kpIGNvbnN0 IHsKICAgIGNvbnN0X2l0ZXJhdG9yIF9fdG1wID0gKnRoaXM7CiAgICByZXR1cm4gX190bXAgLT0g X19pOwogIH0KICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0X2l0ZXJhdG9yIF9feCkg Y29uc3QgewogICAgcmV0dXJuIF9fV09SRF9CSVQgKiAoX01fcCAtIF9feC5fTV9wKSArIF9NX29m ZnNldCAtIF9feC5fTV9vZmZzZXQ7CiAgfQogIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKGRp ZmZlcmVuY2VfdHlwZSBfX2kpIHsgCiAgICByZXR1cm4gKigqdGhpcyArIF9faSk7IAogIH0KICBi b29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIF9feCkgY29uc3QgewogICAgcmV0 dXJuIF9NX3AgPT0gX194Ll9NX3AgJiYgX01fb2Zmc2V0ID09IF9feC5fTV9vZmZzZXQ7CiAgfQog IGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciYgX194KSBjb25zdCB7CiAgICBy ZXR1cm4gX01fcCAhPSBfX3guX01fcCB8fCBfTV9vZmZzZXQgIT0gX194Ll9NX29mZnNldDsKICB9 CiAgYm9vbCBvcGVyYXRvcjwoY29uc3RfaXRlcmF0b3IgX194KSBjb25zdCB7CiAgICByZXR1cm4g X01fcCA8IF9feC5fTV9wIHx8IChfTV9wID09IF9feC5fTV9wICYmIF9NX29mZnNldCA8IF9feC5f TV9vZmZzZXQpOwogIH0KfTsKCiAKIAoKCgogCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2NhdG9yLCBi b29sIF9faXNfc3RhdGljPgpjbGFzcyBfQnZlY3Rvcl9hbGxvY19iYXNlIHsKcHVibGljOgogIHR5 cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxib29sLCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9y X3R5cGUKICAgICAgICAgIGFsbG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBlIGdldF9hbGxv Y2F0b3IoKSBjb25zdCB7IHJldHVybiBfTV9kYXRhX2FsbG9jYXRvcjsgfQoKICBfQnZlY3Rvcl9h bGxvY19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpCiAgICA6IF9NX2RhdGFfYWxsb2Nh dG9yKF9fYSksIF9NX3N0YXJ0KCksIF9NX2ZpbmlzaCgpLCBfTV9lbmRfb2Zfc3RvcmFnZSgwKSB7 fQoKcHJvdGVjdGVkOgogIHVuc2lnbmVkIGludCogX01fYml0X2FsbG9jKHNpemVfdCBfX24pIAog ICAgeyByZXR1cm4gX01fZGF0YV9hbGxvY2F0b3IuYWxsb2NhdGUoKF9fbiArIF9fV09SRF9CSVQg LSAxKS9fX1dPUkRfQklUKTsgfQogIHZvaWQgX01fZGVhbGxvY2F0ZSgpIHsKICAgIGlmIChfTV9z dGFydC5fTV9wKQogICAgICBfTV9kYXRhX2FsbG9jYXRvci5kZWFsbG9jYXRlKF9NX3N0YXJ0Ll9N X3AsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2VuZF9vZl9zdG9yYWdl IC0gX01fc3RhcnQuX01fcCk7CiAgfSAgCgogIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dW5zaWdu ZWQgaW50LCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9yX3R5cGUgCiAgICAgICAgICBfTV9kYXRhX2Fs bG9jYXRvcjsKICBfQml0X2l0ZXJhdG9yIF9NX3N0YXJ0OwogIF9CaXRfaXRlcmF0b3IgX01fZmlu aXNoOwogIHVuc2lnbmVkIGludCogX01fZW5kX29mX3N0b3JhZ2U7Cn07CgogCnRlbXBsYXRlIDxj bGFzcyBfQWxsb2NhdG9yPgpjbGFzcyBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvY2F0b3IsIHRy dWU+IHsKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxib29sLCBfQWxs b2NhdG9yPjo6YWxsb2NhdG9yX3R5cGUKICAgICAgICAgIGFsbG9jYXRvcl90eXBlOwogIGFsbG9j YXRvcl90eXBlIGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0b3JfdHlwZSgp OyB9CgogIF9CdmVjdG9yX2FsbG9jX2Jhc2UoY29uc3QgYWxsb2NhdG9yX3R5cGUmKQogICAgOiBf TV9zdGFydCgpLCBfTV9maW5pc2goKSwgX01fZW5kX29mX3N0b3JhZ2UoMCkge30KCnByb3RlY3Rl ZDoKICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8dW5zaWduZWQgaW50LCBfQWxsb2Nh dG9yPjo6X0FsbG9jX3R5cGUKICAgICAgICAgIF9BbGxvY190eXBlOwogICAgICAgICAgCiAgdW5z aWduZWQgaW50KiBfTV9iaXRfYWxsb2Moc2l6ZV90IF9fbikgCiAgICB7IHJldHVybiBfQWxsb2Nf dHlwZTo6YWxsb2NhdGUoKF9fbiArIF9fV09SRF9CSVQgLSAxKS9fX1dPUkRfQklUKTsgfQogIHZv aWQgX01fZGVhbGxvY2F0ZSgpIHsKICAgIGlmIChfTV9zdGFydC5fTV9wKQogICAgICBfQWxsb2Nf dHlwZTo6ZGVhbGxvY2F0ZShfTV9zdGFydC5fTV9wLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBfTV9lbmRfb2Zfc3RvcmFnZSAtIF9NX3N0YXJ0Ll9NX3ApOwogIH0gIAoKICBfQml0X2l0 ZXJhdG9yIF9NX3N0YXJ0OwogIF9CaXRfaXRlcmF0b3IgX01fZmluaXNoOwogIHVuc2lnbmVkIGlu dCogX01fZW5kX29mX3N0b3JhZ2U7Cn07ICAKCnRlbXBsYXRlIDxjbGFzcyBfQWxsb2M+CmNsYXNz IF9CdmVjdG9yX2Jhc2UKICA6IHB1YmxpYyBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvYywKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8Ym9vbCwgX0FsbG9jPjo6 X1NfaW5zdGFuY2VsZXNzPgp7CiAgdHlwZWRlZiBfQnZlY3Rvcl9hbGxvY19iYXNlPF9BbGxvYywK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0FsbG9jX3RyYWl0czxib29sLCBfQWxsb2M+ OjpfU19pbnN0YW5jZWxlc3M+CiAgICAgICAgICBfQmFzZTsKcHVibGljOgogIHR5cGVkZWYgdHlw ZW5hbWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwoKICBfQnZlY3Rvcl9i YXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogX0Jhc2UoX19hKSB7fQogIH5fQnZlY3Rv cl9iYXNlKCkgeyBfQmFzZTo6X01fZGVhbGxvY2F0ZSgpOyB9Cn07CgojIDM0OCAiL3Vzci9saWIv Z2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2cr Ky0zL3N0bF9idmVjdG9yLmgiIDMKCgogCiAKIAogCgoKCgoKCgoKCgogICAgICAgIAoKICAgICAg ICAKdGVtcGxhdGU8Y2xhc3MgX0FsbG9jPiBjbGFzcyB2ZWN0b3I8Ym9vbCxfQWxsb2M+CiAgOiBw dWJsaWMgX0J2ZWN0b3JfYmFzZTxfQWxsb2M+CgoKCgp7CgogIHR5cGVkZWYgX0J2ZWN0b3JfYmFz ZTxfQWxsb2M+IF9CYXNlOwoKCgpwdWJsaWM6CiAgdHlwZWRlZiBib29sIHZhbHVlX3R5cGU7CiAg dHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwogIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2Vf dHlwZTsgCiAgdHlwZWRlZiBfQml0X3JlZmVyZW5jZSByZWZlcmVuY2U7CiAgdHlwZWRlZiBib29s IGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIF9CaXRfcmVmZXJlbmNlKiBwb2ludGVyOwogIHR5 cGVkZWYgY29uc3QgYm9vbCogY29uc3RfcG9pbnRlcjsKCiAgdHlwZWRlZiBfQml0X2l0ZXJhdG9y ICAgICAgICAgICAgICAgIGl0ZXJhdG9yOwogIHR5cGVkZWYgX0JpdF9jb25zdF9pdGVyYXRvciAg ICAgICAgICBjb25zdF9pdGVyYXRvcjsKCgogIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxjb25z dF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIHJldmVyc2VfaXRl cmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CgoKCgoKCgogIHR5cGVkZWYgdHlwZW5h bWUgX0Jhc2U6OmFsbG9jYXRvcl90eXBlIGFsbG9jYXRvcl90eXBlOwogIGFsbG9jYXRvcl90eXBl IGdldF9hbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBfQmFzZTo6Z2V0X2FsbG9jYXRvcigpOyB9 Cgpwcm90ZWN0ZWQ6CgoKCgoKCgoKcHJvdGVjdGVkOgogIHZvaWQgX01faW5pdGlhbGl6ZShzaXpl X3R5cGUgX19uKSB7CiAgICB1bnNpZ25lZCBpbnQqIF9fcSA9IF9NX2JpdF9hbGxvYyhfX24pOwog ICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyAoX19uICsgX19XT1JEX0JJVCAtIDEpL19fV09S RF9CSVQ7CiAgICBfTV9zdGFydCA9IGl0ZXJhdG9yKF9fcSwgMCk7CiAgICBfTV9maW5pc2ggPSBf TV9zdGFydCArIGRpZmZlcmVuY2VfdHlwZShfX24pOwogIH0KICB2b2lkIF9NX2luc2VydF9hdXgo aXRlcmF0b3IgX19wb3NpdGlvbiwgYm9vbCBfX3gpIHsKICAgIGlmIChfTV9maW5pc2guX01fcCAh PSBfTV9lbmRfb2Zfc3RvcmFnZSkgewogICAgICBjb3B5X2JhY2t3YXJkKF9fcG9zaXRpb24sIF9N X2ZpbmlzaCwgX01fZmluaXNoICsgMSk7CiAgICAgICpfX3Bvc2l0aW9uID0gX194OwogICAgICAr K19NX2ZpbmlzaDsKICAgIH0KICAgIGVsc2UgewogICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXpl KCkgPyAyICogc2l6ZSgpIDogX19XT1JEX0JJVDsKICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSBf TV9iaXRfYWxsb2MoX19sZW4pOwogICAgICBpdGVyYXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9f cG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOwogICAgICAqX19pKysgPSBfX3g7CiAgICAgIF9N X2ZpbmlzaCA9IGNvcHkoX19wb3NpdGlvbiwgZW5kKCksIF9faSk7CiAgICAgIF9NX2RlYWxsb2Nh dGUoKTsKICAgICAgX01fZW5kX29mX3N0b3JhZ2UgPSBfX3EgKyAoX19sZW4gKyBfX1dPUkRfQklU IC0gMSkvX19XT1JEX0JJVDsKICAgICAgX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwogICAg fQogIH0KCgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luaXRp YWxpemVfcmFuZ2UoX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9pdGVyYXRvcl90YWcpIHsKICAgIF9N X3N0YXJ0ID0gaXRlcmF0b3IoKTsKICAgIF9NX2ZpbmlzaCA9IGl0ZXJhdG9yKCk7CiAgICBfTV9l bmRfb2Zfc3RvcmFnZSA9IDA7CiAgICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19fZmly c3QpIAogICAgICBwdXNoX2JhY2soKl9fZmlyc3QpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9G b3J3YXJkSXRlcmF0b3I+CiAgdm9pZCBfTV9pbml0aWFsaXplX3JhbmdlKF9Gb3J3YXJkSXRlcmF0 b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIGZvcndhcmRfaXRlcmF0b3JfdGFnKSB7CiAgICBzaXplX3R5cGUgX19uID0gMDsKICAg IGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwgX19uKTsKICAgIF9NX2luaXRpYWxpemUoX19uKTsK ICAgIGNvcHkoX19maXJzdCwgX19sYXN0LCBfTV9zdGFydCk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xh c3MgX0lucHV0SXRlcmF0b3I+CiAgdm9pZCBfTV9pbnNlcnRfcmFuZ2UoaXRlcmF0b3IgX19wb3Ms CiAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRl cmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2l0ZXJhdG9yX3RhZykg ewogICAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KSB7CiAgICAgIF9fcG9z ID0gaW5zZXJ0KF9fcG9zLCAqX19maXJzdCk7CiAgICAgICsrX19wb3M7CiAgICB9CiAgfQoKICB0 ZW1wbGF0ZSA8Y2xhc3MgX0ZvcndhcmRJdGVyYXRvcj4KICB2b2lkIF9NX2luc2VydF9yYW5nZShp dGVyYXRvciBfX3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIF9Gb3J3YXJkSXRlcmF0 b3IgX19maXJzdCwgX0ZvcndhcmRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAg ICAgZm9yd2FyZF9pdGVyYXRvcl90YWcpIHsKICAgIGlmIChfX2ZpcnN0ICE9IF9fbGFzdCkgewog ICAgICBzaXplX3R5cGUgX19uID0gMDsKICAgICAgZGlzdGFuY2UoX19maXJzdCwgX19sYXN0LCBf X24pOwogICAgICBpZiAoY2FwYWNpdHkoKSAtIHNpemUoKSA+PSBfX24pIHsKICAgICAgICBjb3B5 X2JhY2t3YXJkKF9fcG9zaXRpb24sIGVuZCgpLCBfTV9maW5pc2ggKyBkaWZmZXJlbmNlX3R5cGUo X19uKSk7CiAgICAgICAgY29weShfX2ZpcnN0LCBfX2xhc3QsIF9fcG9zaXRpb24pOwogICAgICAg IF9NX2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKICAgICAgfQogICAgICBlbHNlIHsK ICAgICAgICBzaXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyBtYXgoc2l6ZSgpLCBfX24pOwogICAg ICAgIHVuc2lnbmVkIGludCogX19xID0gX01fYml0X2FsbG9jKF9fbGVuKTsKICAgICAgICBpdGVy YXRvciBfX2kgPSBjb3B5KGJlZ2luKCksIF9fcG9zaXRpb24sIGl0ZXJhdG9yKF9fcSwgMCkpOwog ICAgICAgIF9faSA9IGNvcHkoX19maXJzdCwgX19sYXN0LCBfX2kpOwogICAgICAgIF9NX2Zpbmlz aCA9IGNvcHkoX19wb3NpdGlvbiwgZW5kKCksIF9faSk7CiAgICAgICAgX01fZGVhbGxvY2F0ZSgp OwogICAgICAgIF9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgKF9fbGVuICsgX19XT1JEX0JJVCAt IDEpL19fV09SRF9CSVQ7CiAgICAgICAgX01fc3RhcnQgPSBpdGVyYXRvcihfX3EsIDApOwogICAg ICB9CiAgICB9CiAgfSAgICAgIAoKCgpwdWJsaWM6CiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVy biBfTV9zdGFydDsgfQogIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01f c3RhcnQ7IH0KICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV9maW5pc2g7IH0KICBjb25zdF9p dGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9maW5pc2g7IH0KCiAgcmV2ZXJzZV9pdGVy YXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQogIGNvbnN0 X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyAKICAgIHJldHVybiBjb25zdF9yZXZl cnNlX2l0ZXJhdG9yKGVuZCgpKTsgCiAgfQogIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0 dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9y IHJlbmQoKSBjb25zdCB7IAogICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4o KSk7IAogIH0KCiAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBzaXplX3R5cGUoZW5k KCkgLSBiZWdpbigpKTsgfQogIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNp emVfdHlwZSgtMSk7IH0KICBzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCB7CiAgICByZXR1cm4g c2l6ZV90eXBlKGNvbnN0X2l0ZXJhdG9yKF9NX2VuZF9vZl9zdG9yYWdlLCAwKSAtIGJlZ2luKCkp OwogIH0KICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQog IHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIHsKICAgIHJldHVybiAqKGJlZ2lu KCkgKyBkaWZmZXJlbmNlX3R5cGUoX19uKSk7CiAgfQogIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRv cltdKHNpemVfdHlwZSBfX24pIGNvbnN0IHsKICAgIHJldHVybiAqKGJlZ2luKCkgKyBkaWZmZXJl bmNlX3R5cGUoX19uKSk7CiAgfQoKICBleHBsaWNpdCB2ZWN0b3IgKGNvbnN0IGFsbG9jYXRvcl90 eXBlJiBfX2EgPSBhbGxvY2F0b3JfdHlwZSgpKQogICAgOiBfQmFzZShfX2EpIHt9CgogIHZlY3Rv ciAoc2l6ZV90eXBlIF9fbiwgYm9vbCBfX3ZhbHVlLAogICAgICAgICAgICBjb25zdCBhbGxvY2F0 b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX0Jhc2UoX19hKQogIHsKICAg IF9NX2luaXRpYWxpemUoX19uKTsKICAgIGZpbGwoX01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0 b3JhZ2UsIF9fdmFsdWUgPyB+MCA6IDApOwogIH0KCiAgZXhwbGljaXQgdmVjdG9yIChzaXplX3R5 cGUgX19uKQogICAgOiBfQmFzZShhbGxvY2F0b3JfdHlwZSgpKQogIHsKICAgIF9NX2luaXRpYWxp emUoX19uKTsKICAgIGZpbGwoX01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0b3JhZ2UsIDApOwog IH0KCiAgdmVjdG9yIChjb25zdCB2ZWN0b3IgJiBfX3gpIDogX0Jhc2UoX194LmdldF9hbGxvY2F0 b3IoKSkgewogICAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKICAgIGNvcHkoX194LmJlZ2lu KCksIF9feC5lbmQoKSwgX01fc3RhcnQpOwogIH0KCgogICAKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lu cHV0SXRlcmF0b3I+CiAgdmVjdG9yIChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVy YXRvciBfX2xhc3QsCiAgICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxv Y2F0b3JfdHlwZSgpKQogICAgOiBfQmFzZShfX2EpCiAgewogICAgdHlwZWRlZiB0eXBlbmFtZSBf SXNfaW50ZWdlcjxfSW5wdXRJdGVyYXRvcj46Ol9JbnRlZ3JhbCBfSW50ZWdyYWw7CiAgICBfTV9p bml0aWFsaXplX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwogIH0KICAg IAogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0 Y2goX0ludGVnZXIgX19uLCBfSW50ZWdlciBfX3gsIF9fdHJ1ZV90eXBlKSB7CiAgICBfTV9pbml0 aWFsaXplKF9fbik7CiAgICBmaWxsKF9NX3N0YXJ0Ll9NX3AsIF9NX2VuZF9vZl9zdG9yYWdlLCBf X3ggPyB+MCA6IDApOwogIH0KICAgIAogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4K ICB2b2lkIF9NX2luaXRpYWxpemVfZGlzcGF0Y2goX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lu cHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ZhbHNl X3R5cGUpIHsKICAgIF9NX2luaXRpYWxpemVfcmFuZ2UoX19maXJzdCwgX19sYXN0LCBfX2l0ZXJh dG9yX2NhdGVnb3J5KCBfX2ZpcnN0ICkgKTsKICB9CiMgNTg3ICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX2J2 ZWN0b3IuaCIgMwoKCiAgfnZlY3RvciAoKSB7IH0KCiAgdmVjdG9yICYgb3BlcmF0b3I9KGNvbnN0 IHZlY3RvciAmIF9feCkgewogICAgaWYgKCZfX3ggPT0gdGhpcykgcmV0dXJuICp0aGlzOwogICAg aWYgKF9feC5zaXplKCkgPiBjYXBhY2l0eSgpKSB7CiAgICAgIF9NX2RlYWxsb2NhdGUoKTsKICAg ICAgX01faW5pdGlhbGl6ZShfX3guc2l6ZSgpKTsKICAgIH0KICAgIGNvcHkoX194LmJlZ2luKCks IF9feC5lbmQoKSwgYmVnaW4oKSk7CiAgICBfTV9maW5pc2ggPSBiZWdpbigpICsgZGlmZmVyZW5j ZV90eXBlKF9feC5zaXplKCkpOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgIAogICAKICAgCiAg IAoKICB2b2lkIGFzc2lnbihzaXplX3QgX19uLCBib29sIF9feCkgewogICAgaWYgKF9fbiA+IHNp emUoKSkgewogICAgICBmaWxsKF9NX3N0YXJ0Ll9NX3AsIF9NX2VuZF9vZl9zdG9yYWdlLCBfX3gg PyB+MCA6IDApOwogICAgICBpbnNlcnQoZW5kKCksIF9fbiAtIHNpemUoKSwgX194KTsKICAgIH0K ICAgIGVsc2UgewogICAgICBlcmFzZShiZWdpbigpICsgX19uLCBlbmQoKSk7CiAgICAgIGZpbGwo X01fc3RhcnQuX01fcCwgX01fZW5kX29mX3N0b3JhZ2UsIF9feCA/IH4wIDogMCk7CiAgICB9CiAg fQoKCgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGFzc2lnbihfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsKICAgIHR5cGVkZWYg dHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfSW50ZWdyYWwgX0ludGVncmFs OwogICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0ludGVncmFsKCkpOwog IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNo KF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQogICAgeyBhc3NpZ24o KHNpemVfdCkgX19uLCAoYm9vbCkgX192YWwpOyB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJ dGVyPgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0ZXIgX19maXJzdCwgX0lucHV0 SXRlciBfX2xhc3QsIF9fZmFsc2VfdHlwZSkKICAgIHsgX01fYXNzaWduX2F1eChfX2ZpcnN0LCBf X2xhc3QsIF9faXRlcmF0b3JfY2F0ZWdvcnkoIF9fZmlyc3QgKSApOyB9CgogIHRlbXBsYXRlIDxj bGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2Fzc2lnbl9hdXgoX0lucHV0SXRlcmF0b3Ig X19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICBpbnB1 dF9pdGVyYXRvcl90YWcpIHsKICAgIGl0ZXJhdG9yIF9fY3VyID0gYmVnaW4oKTsKICAgIGZvciAo IDsgX19maXJzdCAhPSBfX2xhc3QgJiYgX19jdXIgIT0gZW5kKCk7ICsrX19jdXIsICsrX19maXJz dCkKICAgICAgKl9fY3VyID0gKl9fZmlyc3Q7CiAgICBpZiAoX19maXJzdCA9PSBfX2xhc3QpCiAg ICAgIGVyYXNlKF9fY3VyLCBlbmQoKSk7CiAgICBlbHNlCiAgICAgIGluc2VydChlbmQoKSwgX19m aXJzdCwgX19sYXN0KTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfRm9yd2FyZEl0ZXJhdG9yPgog IHZvaWQgX01fYXNzaWduX2F1eChfRm9yd2FyZEl0ZXJhdG9yIF9fZmlyc3QsIF9Gb3J3YXJkSXRl cmF0b3IgX19sYXN0LAogICAgICAgICAgICAgICAgICAgICBmb3J3YXJkX2l0ZXJhdG9yX3RhZykg ewogICAgc2l6ZV90eXBlIF9fbGVuID0gMDsKICAgIGRpc3RhbmNlKF9fZmlyc3QsIF9fbGFzdCwg X19sZW4pOwogICAgaWYgKF9fbGVuIDwgc2l6ZSgpKQogICAgICBlcmFzZShjb3B5KF9fZmlyc3Qs IF9fbGFzdCwgYmVnaW4oKSksIGVuZCgpKTsKICAgIGVsc2UgewogICAgICBfRm9yd2FyZEl0ZXJh dG9yIF9fbWlkID0gX19maXJzdDsKICAgICAgYWR2YW5jZShfX21pZCwgc2l6ZSgpKTsKICAgICAg Y29weShfX2ZpcnN0LCBfX21pZCwgYmVnaW4oKSk7CiAgICAgIGluc2VydChlbmQoKSwgX19taWQs IF9fbGFzdCk7CiAgICB9CiAgfSAgICAKCgoKICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIF9fbikg ewogICAgaWYgKGNhcGFjaXR5KCkgPCBfX24pIHsKICAgICAgdW5zaWduZWQgaW50KiBfX3EgPSBf TV9iaXRfYWxsb2MoX19uKTsKICAgICAgX01fZmluaXNoID0gY29weShiZWdpbigpLCBlbmQoKSwg aXRlcmF0b3IoX19xLCAwKSk7CiAgICAgIF9NX2RlYWxsb2NhdGUoKTsKICAgICAgX01fc3RhcnQg PSBpdGVyYXRvcihfX3EsIDApOwogICAgICBfTV9lbmRfb2Zfc3RvcmFnZSA9IF9fcSArIChfX24g KyBfX1dPUkRfQklUIC0gMSkvX19XT1JEX0JJVDsKICAgIH0KICB9CgogIHJlZmVyZW5jZSBmcm9u dCgpIHsgcmV0dXJuICpiZWdpbigpOyB9CiAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Qg eyByZXR1cm4gKmJlZ2luKCk7IH0KICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooZW5kKCkg LSAxKTsgfQogIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyByZXR1cm4gKihlbmQoKSAt IDEpOyB9CiAgdm9pZCBwdXNoX2JhY2soYm9vbCBfX3gpIHsKICAgIGlmIChfTV9maW5pc2guX01f cCAhPSBfTV9lbmRfb2Zfc3RvcmFnZSkKICAgICAgKl9NX2ZpbmlzaCsrID0gX194OwogICAgZWxz ZQogICAgICBfTV9pbnNlcnRfYXV4KGVuZCgpLCBfX3gpOwogIH0KICB2b2lkIHN3YXAodmVjdG9y ICYgX194KSB7CiAgICAgOjpzd2FwKF9NX3N0YXJ0LCBfX3guX01fc3RhcnQpOwogICAgIDo6c3dh cChfTV9maW5pc2gsIF9feC5fTV9maW5pc2gpOwogICAgIDo6c3dhcChfTV9lbmRfb2Zfc3RvcmFn ZSwgX194Ll9NX2VuZF9vZl9zdG9yYWdlKTsKICB9CiAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9y IF9fcG9zaXRpb24sIGJvb2wgX194ID0gYm9vbCgpKSB7CiAgICBkaWZmZXJlbmNlX3R5cGUgX19u ID0gX19wb3NpdGlvbiAtIGJlZ2luKCk7CiAgICBpZiAoX01fZmluaXNoLl9NX3AgIT0gX01fZW5k X29mX3N0b3JhZ2UgJiYgX19wb3NpdGlvbiA9PSBlbmQoKSkKICAgICAgKl9NX2ZpbmlzaCsrID0g X194OwogICAgZWxzZQogICAgICBfTV9pbnNlcnRfYXV4KF9fcG9zaXRpb24sIF9feCk7CiAgICBy ZXR1cm4gYmVnaW4oKSArIF9fbjsKICB9CgoKICAgCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0 ZXJhdG9yPgogIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sCiAgICAgICAgICAgICAg X0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CiAgICB0eXBl ZGVmIHR5cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X0ludGVncmFsIF9JbnRl Z3JhbDsKICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3Bvc2l0aW9uLCBfX2ZpcnN0LCBfX2xhc3Qs IF9JbnRlZ3JhbCgpKTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW50ZWdlcj4KICB2b2lkIF9N X2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3BvcywgX0ludGVnZXIgX19uLCBfSW50ZWdlciBf X3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX190cnVlX3R5cGUpIHsKICAgIGluc2VydChf X3BvcywgKHNpemVfdHlwZSkgX19uLCAoYm9vbCkgX194KTsKICB9CgogIHRlbXBsYXRlIDxjbGFz cyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIF9NX2luc2VydF9kaXNwYXRjaChpdGVyYXRvciBfX3Bv cywKICAgICAgICAgICAgICAgICAgICAgICAgICBfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5w dXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgX19mYWxzZV90eXBl KSB7CiAgICBfTV9pbnNlcnRfcmFuZ2UoX19wb3MsIF9fZmlyc3QsIF9fbGFzdCwgX19pdGVyYXRv cl9jYXRlZ29yeSggX19maXJzdCApICk7CiAgfQojIDc2MSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2 LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9idmVj dG9yLmgiIDMKCiAgCiAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6ZV90eXBl IF9fbiwgYm9vbCBfX3gpIHsKICAgIGlmIChfX24gPT0gMCkgcmV0dXJuOwogICAgaWYgKGNhcGFj aXR5KCkgLSBzaXplKCkgPj0gX19uKSB7CiAgICAgIGNvcHlfYmFja3dhcmQoX19wb3NpdGlvbiwg ZW5kKCksIF9NX2ZpbmlzaCArIGRpZmZlcmVuY2VfdHlwZShfX24pKTsKICAgICAgZmlsbChfX3Bv c2l0aW9uLCBfX3Bvc2l0aW9uICsgZGlmZmVyZW5jZV90eXBlKF9fbiksIF9feCk7CiAgICAgIF9N X2ZpbmlzaCArPSBkaWZmZXJlbmNlX3R5cGUoX19uKTsKICAgIH0KICAgIGVsc2UgewogICAgICBz aXplX3R5cGUgX19sZW4gPSBzaXplKCkgKyBtYXgoc2l6ZSgpLCBfX24pOwogICAgICB1bnNpZ25l ZCBpbnQqIF9fcSA9IF9NX2JpdF9hbGxvYyhfX2xlbik7CiAgICAgIGl0ZXJhdG9yIF9faSA9IGNv cHkoYmVnaW4oKSwgX19wb3NpdGlvbiwgaXRlcmF0b3IoX19xLCAwKSk7CiAgICAgIGZpbGxfbihf X2ksIF9fbiwgX194KTsKICAgICAgX01fZmluaXNoID0gY29weShfX3Bvc2l0aW9uLCBlbmQoKSwg X19pICsgZGlmZmVyZW5jZV90eXBlKF9fbikpOwogICAgICBfTV9kZWFsbG9jYXRlKCk7CiAgICAg IF9NX2VuZF9vZl9zdG9yYWdlID0gX19xICsgKF9fbGVuICsgX19XT1JEX0JJVCAtIDEpL19fV09S RF9CSVQ7CiAgICAgIF9NX3N0YXJ0ID0gaXRlcmF0b3IoX19xLCAwKTsKICAgIH0KICB9CgogIHZv aWQgcG9wX2JhY2soKSB7IC0tX01fZmluaXNoOyB9CiAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3Ig X19wb3NpdGlvbikgewogICAgaWYgKF9fcG9zaXRpb24gKyAxICE9IGVuZCgpKQogICAgICBjb3B5 KF9fcG9zaXRpb24gKyAxLCBlbmQoKSwgX19wb3NpdGlvbik7CiAgICAgIC0tX01fZmluaXNoOwog ICAgcmV0dXJuIF9fcG9zaXRpb247CiAgfQogIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIF9fZmly c3QsIGl0ZXJhdG9yIF9fbGFzdCkgewogICAgX01fZmluaXNoID0gY29weShfX2xhc3QsIGVuZCgp LCBfX2ZpcnN0KTsKICAgIHJldHVybiBfX2ZpcnN0OwogIH0KICB2b2lkIHJlc2l6ZShzaXplX3R5 cGUgX19uZXdfc2l6ZSwgYm9vbCBfX3ggPSBib29sKCkpIHsKICAgIGlmIChfX25ld19zaXplIDwg c2l6ZSgpKSAKICAgICAgZXJhc2UoYmVnaW4oKSArIGRpZmZlcmVuY2VfdHlwZShfX25ld19zaXpl KSwgZW5kKCkpOwogICAgZWxzZQogICAgICBpbnNlcnQoZW5kKCksIF9fbmV3X3NpemUgLSBzaXpl KCksIF9feCk7CiAgfQogIHZvaWQgY2xlYXIoKSB7IGVyYXNlKGJlZ2luKCksIGVuZCgpKTsgfQp9 OwoKCgp0eXBlZGVmIHZlY3Rvcjxib29sLCBhbGxvYz4gYml0X3ZlY3RvcjsKCiMgODIyICIvdXNy L2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1 ZGUvZysrLTMvc3RsX2J2ZWN0b3IuaCIgMwoKCgoKCgoKCgoKICAKCgoKIAogCiAKIyAzNSAiL3Vz ci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNs dWRlL2crKy0zL3ZlY3RvciIgMiAzCgoKCgogCiAKIAojIDQ2ICIvdXNyL2xvY2FsL3F0L2luY2x1 ZGUvcXZhbHVldmVjdG9yLmgiIDIKCgoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIFFWYWx1ZVZl Y3RvclByaXZhdGUgCiAgICA6IHB1YmxpYyBRU2hhcmVkCnsKcHVibGljOgoKICAgIHR5cGVkZWYg VCB2YWx1ZV90eXBlOwogICAgdHlwZWRlZiBUKiBwb2ludGVyOwoKICAgIFFWYWx1ZVZlY3RvclBy aXZhdGUoKQoJOiBzdGFydCggMCApLCBmaW5pc2goIDAgKSwgZW5kKCAwICkKICAgIHsKICAgIH0K CiAgICBRVmFsdWVWZWN0b3JQcml2YXRlKCBjb25zdCBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+JiB4 ICk7CiAgICBRVmFsdWVWZWN0b3JQcml2YXRlKCBzaXplX3Qgc2l6ZSApOwoKICAgIHZvaWQgZGVy ZWZBbmREZWxldGUoKSAgCiAgICB7CglpZiAoIGRlcmVmKCkgKQoJICAgIGRlbGV0ZSB0aGlzOwog ICAgfQoKCgoKCiAgICB+UVZhbHVlVmVjdG9yUHJpdmF0ZSgpCiAgICB7CglkZWxldGVbXSBzdGFy dDsKICAgIH0KCiAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0CiAgICB7CglyZXR1cm4gZmluaXNoIC0g c3RhcnQ7CiAgICB9CgogICAgYm9vbCBlbXB0eSgpIGNvbnN0CiAgICB7CglyZXR1cm4gc3RhcnQg PT0gZmluaXNoOwogICAgfQoKICAgIHNpemVfdCBjYXBhY2l0eSgpIGNvbnN0CiAgICB7CglyZXR1 cm4gZW5kIC0gc3RhcnQ7CiAgICB9CgogICAgdm9pZCBpbnNlcnQoIHBvaW50ZXIgcG9zLCBjb25z dCBUJiB4ICk7CiAgICB2b2lkIGluc2VydCggcG9pbnRlciBwb3MsIHNpemVfdCBuLCBjb25zdCBU JiB4ICk7CiAgICB2b2lkIHJlc2VydmUoIHNpemVfdCBuICk7CgogICAgdm9pZCBjbGVhcigpCiAg ICB7CglkZWxldGVbXSBzdGFydDsKCXN0YXJ0ID0gMDsKCWZpbmlzaCA9IDA7CgllbmQgPSAwOwog ICAgfQoKCiAgICBwb2ludGVyIHN0YXJ0OwogICAgcG9pbnRlciBmaW5pc2g7CiAgICBwb2ludGVy IGVuZDsKCnByaXZhdGU6CiAgICBwb2ludGVyIGdyb3dBbmRDb3B5KCBzaXplX3QgbiwgcG9pbnRl ciBzLCBwb2ludGVyIGYgKTsKCiAgICBRVmFsdWVWZWN0b3JQcml2YXRlJiBvcGVyYXRvcj0oIGNv bnN0IFFWYWx1ZVZlY3RvclByaXZhdGU8VD4mIHggKTsKCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4K ICBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+OjpRVmFsdWVWZWN0b3JQcml2YXRlKCBjb25zdCBRVmFs dWVWZWN0b3JQcml2YXRlPFQ+JiB4ICkKICAgIDogUVNoYXJlZCgpCnsKICAgIGlmICggeC5zaXpl KCkgPiAwICkgewoJc3RhcnQgPSBuZXcgVFsgeC5zaXplKCkgXTsKCWZpbmlzaCA9IHN0YXJ0ICsg eC5zaXplKCk7CgllbmQgPSBzdGFydCArIHguc2l6ZSgpOwoJcUNvcHkoIHguc3RhcnQsIHguZmlu aXNoLCBzdGFydCApOwogICAgfSBlbHNlIHsKCXN0YXJ0ID0gMDsKCWZpbmlzaCA9IDA7CgllbmQg PSAwOwogICAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+ OjpRVmFsdWVWZWN0b3JQcml2YXRlKCBzaXplX3Qgc2l6ZSApCnsKICAgIGlmICggc2l6ZSA+IDAg KSB7CglzdGFydCA9IG5ldyBUW3NpemVdOwoJZmluaXNoID0gc3RhcnQgKyBzaXplOwoJZW5kID0g c3RhcnQgKyBzaXplOwogICAgfSBlbHNlIHsKCXN0YXJ0ID0gMDsKCWZpbmlzaCA9IDA7CgllbmQg PSAwOwogICAgfQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICB2b2lkIFFWYWx1ZVZlY3RvclByaXZh dGU8VD46Omluc2VydCggcG9pbnRlciBwb3MsIGNvbnN0IFQmIHggKQp7CiAgICBjb25zdCBzaXpl X3QgbGFzdFNpemUgPSBzaXplKCk7CiAgICBjb25zdCBzaXplX3QgbiA9IGxhc3RTaXplICE9MCA/ IDIqbGFzdFNpemUgOiAxOwogICAgY29uc3Qgc2l6ZV90IG9mZnNldCA9IHBvcyAtIHN0YXJ0Owog ICAgcG9pbnRlciBuZXdTdGFydCA9IG5ldyBUW25dOwogICAgcG9pbnRlciBuZXdGaW5pc2ggPSBu ZXdTdGFydCArIG9mZnNldDsKICAgIHFDb3B5KCBzdGFydCwgcG9zLCBuZXdTdGFydCApOwogICAg Km5ld0ZpbmlzaCA9IHg7CiAgICBxQ29weSggcG9zLCBmaW5pc2gsICsrbmV3RmluaXNoICk7CiAg ICBkZWxldGVbXSBzdGFydDsKICAgIHN0YXJ0ID0gbmV3U3RhcnQ7CiAgICBmaW5pc2ggPSBuZXdT dGFydCArIGxhc3RTaXplICsgMTsKICAgIGVuZCA9IG5ld1N0YXJ0ICsgbjsKfQoKdGVtcGxhdGUg PGNsYXNzIFQ+CiAgdm9pZCBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+OjppbnNlcnQoIHBvaW50ZXIg cG9zLCBzaXplX3QgbiwgY29uc3QgVCYgeCApCnsKICAgIGlmICggc2l6ZV90KCBlbmQgLSBmaW5p c2ggKSA+PSBuICkgewoJIAoJY29uc3Qgc2l6ZV90IGVsZW1zX2FmdGVyID0gZmluaXNoIC0gcG9z OwoJcG9pbnRlciBvbGRfZmluaXNoID0gZmluaXNoOwoJaWYgKCBlbGVtc19hZnRlciA+IG4gKSB7 CgkgICAgcUNvcHkoIGZpbmlzaCAtIG4sIGZpbmlzaCwgZmluaXNoICk7CgkgICAgZmluaXNoICs9 IG47CgkgICAgcUNvcHlCYWNrd2FyZCggcG9zLCBvbGRfZmluaXNoIC0gbiwgb2xkX2ZpbmlzaCAp OwoJICAgIHFGaWxsKCBwb3MsIHBvcyArIG4sIHggKTsKCX0gZWxzZSB7CgkgICAgcG9pbnRlciBm aWxsZXIgPSBmaW5pc2g7CgkgICAgc2l6ZV90IGkgPSBuIC0gZWxlbXNfYWZ0ZXI7CgkgICAgZm9y ICggOyBpID4gMDsgLS1pLCArK2ZpbGxlciApCgkJKmZpbGxlciA9IHg7CgkgICAgZmluaXNoICs9 IG4gLSBlbGVtc19hZnRlcjsKCSAgICBxQ29weSggcG9zLCBvbGRfZmluaXNoLCBmaW5pc2ggKTsK CSAgICBmaW5pc2ggKz0gZWxlbXNfYWZ0ZXI7CgkgICAgcUZpbGwoIHBvcywgb2xkX2ZpbmlzaCwg eCApOwoJfQogICAgfSBlbHNlIHsKCSAKCWNvbnN0IHNpemVfdCBsYXN0U2l6ZSA9IHNpemUoKTsK CWNvbnN0IHNpemVfdCBsZW4gPSBsYXN0U2l6ZSArICgoICBuICApIDwgKCAgbGFzdFNpemUgKSA/ ICggIGxhc3RTaXplICkgOiAoICBuICApKSA7Cglwb2ludGVyIG5ld1N0YXJ0ID0gbmV3IFRbbGVu XTsKCXBvaW50ZXIgbmV3RmluaXNoID0gcUNvcHkoIHN0YXJ0LCBwb3MsIG5ld1N0YXJ0ICk7Cgkg CglzaXplX3QgaSA9IG47Cglmb3IgKCA7IGkgPiAwOyAtLWksICsrbmV3RmluaXNoICkKCSAgICAq bmV3RmluaXNoID0geDsKCW5ld0ZpbmlzaCA9IHFDb3B5KCBwb3MsIGZpbmlzaCwgbmV3RmluaXNo ICk7CglkZWxldGVbXSBzdGFydDsKCXN0YXJ0ID0gbmV3U3RhcnQ7CglmaW5pc2ggPSBuZXdGaW5p c2g7CgllbmQgPSBuZXdTdGFydCArIGxlbjsKICAgIH0KfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAg dm9pZCBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+OjpyZXNlcnZlKCBzaXplX3QgbiApCnsKICAgIGNv bnN0IHNpemVfdCBsYXN0U2l6ZSA9IHNpemUoKTsKICAgIHBvaW50ZXIgdG1wID0gZ3Jvd0FuZENv cHkoIG4sIHN0YXJ0LCBmaW5pc2ggKTsKICAgIHN0YXJ0ID0gdG1wOwogICAgZmluaXNoID0gdG1w ICsgbGFzdFNpemU7CiAgICBlbmQgPSBzdGFydCArIG47Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgog IHR5cGVuYW1lICBRVmFsdWVWZWN0b3JQcml2YXRlPFQ+Ojpwb2ludGVyIFFWYWx1ZVZlY3RvclBy aXZhdGU8VD46Omdyb3dBbmRDb3B5KCBzaXplX3QgbiwgcG9pbnRlciBzLCBwb2ludGVyIGYgKQp7 CiAgICBwb2ludGVyIG5ld1N0YXJ0ID0gbmV3IFRbbl07CiAgICBxQ29weSggcywgZiwgbmV3U3Rh cnQgKTsKICAgIGRlbGV0ZVtdIHN0YXJ0OwogICAgcmV0dXJuIG5ld1N0YXJ0Owp9CgoKdGVtcGxh dGUgPGNsYXNzIFQ+CmNsYXNzIFFWYWx1ZVZlY3Rvcgp7CnB1YmxpYzoKICAgIHR5cGVkZWYgVCB2 YWx1ZV90eXBlOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogICAgdHlwZWRlZiBj b25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiBp dGVyYXRvcjsKICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfaXRlcmF0b3I7CiAg ICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKICAgIHR5cGVkZWYgY29uc3QgdmFsdWVf dHlwZSYgY29uc3RfcmVmZXJlbmNlOwogICAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwoKICAg IHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CgoKCgogICAgUVZhbHVlVmVjdG9y KCkKICAgIHsKCXNoID0gbmV3IFFWYWx1ZVZlY3RvclByaXZhdGU8VD47CiAgICB9CgogICAgUVZh bHVlVmVjdG9yKCBjb25zdCBRVmFsdWVWZWN0b3I8VD4mIHYgKQogICAgewoJc2ggPSB2LnNoOwoJ c2gtPnJlZigpOwogICAgfQoKICAgIFFWYWx1ZVZlY3Rvciggc2l6ZV90eXBlIG4sIGNvbnN0IFQm IHZhbCA9IFQoKSApOwoKCiAgICBRVmFsdWVWZWN0b3IoIHN0ZDo6dmVjdG9yPFQ+JiB2ICkKICAg IHsKCXNoID0gbmV3IFFWYWx1ZVZlY3RvclByaXZhdGU8VD4oIHYuc2l6ZSgpICk7CglxQ29weSgg di5iZWdpbigpLCB2LmVuZCgpLCBiZWdpbigpICk7CiAgICB9CgoKICAgIH5RVmFsdWVWZWN0b3Io KQogICAgewoJc2gtPmRlcmVmQW5kRGVsZXRlKCk7CiAgICB9CgogICAgUVZhbHVlVmVjdG9yPFQ+ JiBvcGVyYXRvcj0gKCBjb25zdCBRVmFsdWVWZWN0b3I8VD4mIHYgKQogICAgewoJdi5zaC0+cmVm KCk7CglzaC0+ZGVyZWZBbmREZWxldGUoKTsKCXNoID0gdi5zaDsKCXJldHVybiAqdGhpczsKICAg IH0KCgogICAgUVZhbHVlVmVjdG9yPFQ+JiBvcGVyYXRvcj0gKCBjb25zdCBzdGQ6OnZlY3RvcjxU PiYgdiApCiAgICB7CgljbGVhcigpOwoJcmVzaXplKCB2LnNpemUoKSApOwoJcUNvcHkoIHYuYmVn aW4oKSwgdi5lbmQoKSwgYmVnaW4oKSApOwoJcmV0dXJuICp0aGlzOwogICAgfQoKCiAgICBzaXpl X3R5cGUgc2l6ZSgpIGNvbnN0CiAgICB7CglyZXR1cm4gc2gtPnNpemUoKTsKICAgIH0KCiAgICBi b29sIGVtcHR5KCkgY29uc3QKICAgIHsKCXJldHVybiBzaC0+ZW1wdHkoKTsKICAgIH0KCiAgICBz aXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdAogICAgewoJcmV0dXJuIHNpemVfdHlwZSggc2gtPmNh cGFjaXR5KCkgKTsKICAgIH0KCiAgICBpdGVyYXRvciBiZWdpbigpCiAgICB7CglkZXRhY2goKTsK CXJldHVybiBzaC0+c3RhcnQ7CiAgICB9CgogICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25z dAogICAgewoJcmV0dXJuIHNoLT5zdGFydDsKICAgIH0KCiAgICBpdGVyYXRvciBlbmQoKQogICAg ewoJZGV0YWNoKCk7CglyZXR1cm4gc2gtPmZpbmlzaDsKICAgIH0KCiAgICBjb25zdF9pdGVyYXRv ciBlbmQoKSBjb25zdAogICAgewoJcmV0dXJuIHNoLT5maW5pc2g7CiAgICB9CgogICAgcmVmZXJl bmNlIGF0KCBzaXplX3R5cGUgaSwgYm9vbCogb2sgPSAwICkKICAgIHsKCWRldGFjaCgpOwoJaWYg KCBvayApIHsKCSAgICBpZiAoIGkgPCBzaXplKCkgKQoJCSpvayA9IFRSVUU7CgkgICAgZWxzZQoJ CSpvayA9IEZBTFNFOwoJfQoJcmV0dXJuICooIGJlZ2luKCkgKyBpICk7CiAgICB9CgogICAgY29u c3RfcmVmZXJlbmNlIGF0KCBzaXplX3R5cGUgaSwgYm9vbCogb2sgPSAwICkgY29uc3QKICAgIHsK CWlmICggb2sgKSB7CgkgICAgaWYgKCBpIDwgc2l6ZSgpICkKCQkqb2sgPSBUUlVFOwoJICAgIGVs c2UKCQkqb2sgPSBGQUxTRTsKCX0KCXJldHVybiAqKCBiZWdpbigpICsgaSApOwogICAgfQoKICAg IHJlZmVyZW5jZSBvcGVyYXRvcltdKCBzaXplX3R5cGUgaSApCiAgICB7CglkZXRhY2goKTsKCXJl dHVybiAqKCBiZWdpbigpICsgaSApOwogICAgfQoKICAgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRv cltdKCBzaXplX3R5cGUgaSApIGNvbnN0CiAgICB7CglyZXR1cm4gKiggYmVnaW4oKSArIGkgKTsK ICAgIH0KCiAgICByZWZlcmVuY2UgZnJvbnQoKQogICAgewoJKCggICFlbXB0eSgpICApID8gKHZv aWQpMCA6IHFXYXJuaW5nKCJBU1NFUlQ6IFwiJXNcIiBpbiAlcyAoJWQpIiwiIWVtcHR5KCkiLCIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcXZhbHVldmVjdG9yLmgiLDM2MikpIDsKCWRldGFjaCgpOwoJ cmV0dXJuICpiZWdpbigpOwogICAgfQoKICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0 CiAgICB7CgkoKCAgIWVtcHR5KCkgICkgPyAodm9pZCkwIDogcVdhcm5pbmcoIkFTU0VSVDogXCIl c1wiIGluICVzICglZCkiLCIhZW1wdHkoKSIsIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWV2 ZWN0b3IuaCIsMzY5KSkgOwoJcmV0dXJuICpiZWdpbigpOwogICAgfQoKICAgIHJlZmVyZW5jZSBi YWNrKCkKICAgIHsKCSgoICAhZW1wdHkoKSAgKSA/ICh2b2lkKTAgOiBxV2FybmluZygiQVNTRVJU OiBcIiVzXCIgaW4gJXMgKCVkKSIsIiFlbXB0eSgpIiwiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F2 YWx1ZXZlY3Rvci5oIiwzNzUpKSA7CglkZXRhY2goKTsKCXJldHVybiAqKCBlbmQoKSAtIDEgKTsK ICAgIH0KCiAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0CiAgICB7CgkoKCAgIWVtcHR5 KCkgICkgPyAodm9pZCkwIDogcVdhcm5pbmcoIkFTU0VSVDogXCIlc1wiIGluICVzICglZCkiLCIh ZW1wdHkoKSIsIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWV2ZWN0b3IuaCIsMzgyKSkgOwoJ cmV0dXJuICooIGVuZCgpIC0gMSApOwogICAgfQoKICAgIHZvaWQgcHVzaF9iYWNrKCBjb25zdCBU JiB4ICkKICAgIHsKCWRldGFjaCgpOwoJaWYgKCBzaC0+ZmluaXNoID09IHNoLT5lbmQgKSB7Cgkg ICAgc2gtPnJlc2VydmUoIHNpemUoKSsxICk7Cgl9Cgkqc2gtPmZpbmlzaCA9IHg7CgkrK3NoLT5m aW5pc2g7CiAgICB9CgogICAgdm9pZCBwb3BfYmFjaygpCiAgICB7CglkZXRhY2goKTsKCWlmICgg ZW1wdHkoKSApCgkgICAgcmV0dXJuOwoJLS1zaC0+ZmluaXNoOwogICAgfQoKICAgIGl0ZXJhdG9y IGluc2VydCggaXRlcmF0b3IgcG9zLCBjb25zdCBUJiB4ICk7CiAgICBpdGVyYXRvciBpbnNlcnQo IGl0ZXJhdG9yIHBvcywgc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHggKTsKICAgIAogICAgdm9pZCBy ZXNlcnZlKCBzaXplX3R5cGUgbiApCiAgICB7CglpZiAoIGNhcGFjaXR5KCkgPCBuICkgewoJICAg IGRldGFjaCgpOwoJICAgIHNoLT5yZXNlcnZlKCBuICk7Cgl9CiAgICB9CgogICAgdm9pZCByZXNp emUoIHNpemVfdHlwZSBuLCBjb25zdCBUJiB2YWwgPSBUKCkgKQogICAgewoJaWYgKCBuIDwgc2l6 ZSgpICkKCSAgICBlcmFzZSggYmVnaW4oKSArIG4sIGVuZCgpICk7CgllbHNlCgkgICAgaW5zZXJ0 KCBlbmQoKSwgbiAtIHNpemUoKSwgdmFsICk7CiAgICB9CgogICAgdm9pZCBjbGVhcigpCiAgICB7 CglkZXRhY2goKTsKCXNoLT5jbGVhcigpOwogICAgfQoKICAgIGl0ZXJhdG9yIGVyYXNlKCBpdGVy YXRvciBwb3MgKQogICAgewoJZGV0YWNoKCk7CglpZiAoIHBvcyArIDEgIT0gZW5kKCkgKQoJICAg IHFDb3B5KCBwb3MgKyAxLCBzaC0+ZmluaXNoLCBwb3MgKTsKCS0tc2gtPmZpbmlzaDsKCXJldHVy biBwb3M7CiAgICB9CgogICAgaXRlcmF0b3IgZXJhc2UoIGl0ZXJhdG9yIGZpcnN0LCBpdGVyYXRv ciBsYXN0ICkKICAgIHsKCWRldGFjaCgpOwoJcUNvcHkoIGxhc3QsIHNoLT5maW5pc2gsIGZpcnN0 ICk7CglzaC0+ZmluaXNoID0gc2gtPmZpbmlzaCAtICggbGFzdCAtIGZpcnN0ICk7CglyZXR1cm4g Zmlyc3Q7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRVmFsdWVWZWN0b3I8VD4m IHggKQogICAgewoJcmV0dXJuIHFFcXVhbCggYmVnaW4oKSwgZW5kKCksIHguYmVnaW4oKSApOwog ICAgfQoKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVZhbHVlVmVjdG9yPFQ+JiB4ICkgY29u c3QKICAgIHsKCXJldHVybiBxRXF1YWwoIGJlZ2luKCksIGVuZCgpLCB4LmJlZ2luKCkgKTsKICAg IH0KCnByb3RlY3RlZDoKICAgIHZvaWQgZGV0YWNoKCkKICAgIHsKCWlmICggc2gtPmNvdW50ID4g MSApIHsgZGV0YWNoSW50ZXJuYWwoKTsgfQogICAgfQogICAgdm9pZCBkZXRhY2hJbnRlcm5hbCgp OwogICAgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPiogc2g7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4K ICBRVmFsdWVWZWN0b3I8VD46OlFWYWx1ZVZlY3Rvciggc2l6ZV90eXBlIG4sIGNvbnN0IFQmIHZh bCApCnsKICAgIHNoID0gbmV3IFFWYWx1ZVZlY3RvclByaXZhdGU8VD4oIG4gKTsKICAgIHFGaWxs KCBiZWdpbigpLCBlbmQoKSwgdmFsICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIHZvaWQgUVZh bHVlVmVjdG9yPFQ+OjpkZXRhY2hJbnRlcm5hbCgpCnsKICAgIHNoLT5kZXJlZigpOwogICAgc2gg PSBuZXcgUVZhbHVlVmVjdG9yUHJpdmF0ZTxUPiggKnNoICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBU PgogIHR5cGVuYW1lICBRVmFsdWVWZWN0b3I8VD46Oml0ZXJhdG9yIFFWYWx1ZVZlY3RvcjxUPjo6 aW5zZXJ0KCBpdGVyYXRvciBwb3MsIGNvbnN0IFQmIHggKQp7CiAgICBzaXplX3R5cGUgb2Zmc2V0 ID0gcG9zIC0gc2gtPnN0YXJ0OwogICAgZGV0YWNoKCk7CiAgICBpZiAoIHBvcyA9PSBlbmQoKSAp IHsKCWlmICggc2gtPmZpbmlzaCA9PSBzaC0+ZW5kICkKCSAgICBwdXNoX2JhY2soIHggKTsKCWVs c2UgewoJICAgICpzaC0+ZmluaXNoID0geDsKCSAgICArK3NoLT5maW5pc2g7Cgl9CiAgICB9IGVs c2UgewoJaWYgKCBzaC0+ZmluaXNoID09IHNoLT5lbmQgKSB7CgkgICAgc2gtPmluc2VydCggcG9z LCB4ICk7Cgl9IGVsc2UgewoJICAgICpzaC0+ZmluaXNoID0gKihzaC0+ZmluaXNoIC0gMSk7Cgkg ICAgKytzaC0+ZmluaXNoOwoJICAgIHFDb3B5QmFja3dhcmQoIHBvcywgc2gtPmZpbmlzaCAtIDIs IHNoLT5maW5pc2ggLSAxICk7CgkgICAgKnBvcyA9IHg7Cgl9CiAgICB9CiAgICByZXR1cm4gYmVn aW4oKSArIG9mZnNldDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgdHlwZW5hbWUgIFFWYWx1ZVZl Y3RvcjxUPjo6aXRlcmF0b3IgUVZhbHVlVmVjdG9yPFQ+OjppbnNlcnQoIGl0ZXJhdG9yIHBvcywg c2l6ZV90eXBlIG4sIGNvbnN0IFQmIHggKQp7CiAgICBpZiAoIG4gIT0gMCApIHsKCXNpemVfdHlw ZSBvZmZzZXQgPSBwb3MgLSBzaC0+c3RhcnQ7CglkZXRhY2goKTsKCXBvcyA9IGJlZ2luKCkgKyBv ZmZzZXQ7CglzaC0+aW5zZXJ0KCBwb3MsIG4sIHggKTsKICAgIH0KICAgIHJldHVybiBwb3M7Cn0K CgoKdGVtcGxhdGU8Y2xhc3MgVD4KICBRRGF0YVN0cmVhbSYgb3BlcmF0b3I+PiggUURhdGFTdHJl YW0mIHMsIFFWYWx1ZVZlY3RvcjxUPiYgdiApCnsKICAgIHYuY2xlYXIoKTsKICAgIFFfVUlOVDMy IGM7CiAgICBzID4+IGM7CiAgICB2LnJlc2l6ZSggYyApOwogICAgZm9yKCBRX1VJTlQzMiBpID0g MDsgaSA8IGM7ICsraSApCiAgICB7CglUIHQ7CglzID4+IHQ7Cgl2W2ldID0gdDsKICAgIH0KICAg IHJldHVybiBzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBUPgogIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8 KCBRRGF0YVN0cmVhbSYgcywgY29uc3QgUVZhbHVlVmVjdG9yPFQ+JiB2ICkKewogICAgcyA8PCAo UV9VSU5UMzIpdi5zaXplKCk7CiAgICAgCiAgICAgCiAgICBjb25zdCBUKiBpdCA9IHYuYmVnaW4o KTsKICAgIGZvciggOyBpdCAhPSB2LmVuZCgpOyArK2l0ICkKCXMgPDwgKml0OwogICAgcmV0dXJu IHM7Cn0KCgoKCgojIDcgImVsZW1lbnQuaCIgMgoKCmNsYXNzIEVsZW1lbnQ7Cgp0eXBlZGVmIFFW YWx1ZVZlY3RvcjxFbGVtZW50PiBFbGVtZW50VmVjdG9yOwoKIAoKCmNvbnN0IGRvdWJsZSBFUFNJ TE9OID0gMC4wMDAwMDAxOyAgCgoKY2xhc3MgRWxlbWVudAp7CnB1YmxpYzoKICAgIGVudW0geyBJ TlZBTElEID0gLTEgfTsKICAgIGVudW0geyBOT19QUk9QT1JUSU9OID0gLTEgfTsKICAgIGVudW0g eyBNQVhfUFJPUE9JTlRTID0gMyB9OyAgCgogICAgRWxlbWVudCggZG91YmxlIHZhbHVlID0gSU5W QUxJRCwgUUNvbG9yIHZhbHVlQ29sb3IgPSBRdDo6Z3JheSwKCSAgICAgaW50IHZhbHVlUGF0dGVy biA9IFF0OjpTb2xpZFBhdHRlcm4sCgkgICAgIGNvbnN0IFFTdHJpbmcmIGxhYmVsID0gUVN0cmlu Zzo6bnVsbCwKCSAgICAgUUNvbG9yIGxhYmVsQ29sb3IgPSBRdDo6YmxhY2sgKSB7Cglpbml0KCB2 YWx1ZSwgdmFsdWVDb2xvciwgdmFsdWVQYXR0ZXJuLCBsYWJlbCwgbGFiZWxDb2xvciApOwoJZm9y ICggaW50IGkgPSAwOyBpIDwgTUFYX1BST1BPSU5UUyAqIDI7ICsraSApCgkgICAgbV9wcm9wb2lu dHNbaV0gPSBOT19QUk9QT1JUSU9OOwogICAgfQogICAgfkVsZW1lbnQoKSB7fQoKICAgIGJvb2wg aXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWUgPiBFUFNJTE9OOyB9CgogICAgZG91Ymxl IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQogICAgUUNvbG9yIHZhbHVlQ29sb3Io KSBjb25zdCB7IHJldHVybiBtX3ZhbHVlQ29sb3I7IH0KICAgIGludCB2YWx1ZVBhdHRlcm4oKSBj b25zdCB7IHJldHVybiBtX3ZhbHVlUGF0dGVybjsgfQogICAgUVN0cmluZyBsYWJlbCgpIGNvbnN0 IHsgcmV0dXJuIG1fbGFiZWw7IH0KICAgIFFDb2xvciBsYWJlbENvbG9yKCkgY29uc3QgeyByZXR1 cm4gbV9sYWJlbENvbG9yOyB9CiAgICBkb3VibGUgcHJvWCggaW50IGluZGV4ICkgY29uc3Q7CiAg ICBkb3VibGUgcHJvWSggaW50IGluZGV4ICkgY29uc3Q7CgogICAgdm9pZCBzZXQoIGRvdWJsZSB2 YWx1ZSA9IElOVkFMSUQsIFFDb2xvciB2YWx1ZUNvbG9yID0gUXQ6OmdyYXksCgkgICAgICBpbnQg dmFsdWVQYXR0ZXJuID0gUXQ6OlNvbGlkUGF0dGVybiwKCSAgICAgIGNvbnN0IFFTdHJpbmcmIGxh YmVsID0gUVN0cmluZzo6bnVsbCwKCSAgICAgIFFDb2xvciBsYWJlbENvbG9yID0gUXQ6OmJsYWNr ICkgewoJaW5pdCggdmFsdWUsIHZhbHVlQ29sb3IsIHZhbHVlUGF0dGVybiwgbGFiZWwsIGxhYmVs Q29sb3IgKTsKICAgIH0KICAgIHZvaWQgc2V0VmFsdWUoIGRvdWJsZSB2YWx1ZSApIHsgbV92YWx1 ZSA9IHZhbHVlOyB9CiAgICB2b2lkIHNldFZhbHVlQ29sb3IoIFFDb2xvciB2YWx1ZUNvbG9yICkg eyBtX3ZhbHVlQ29sb3IgPSB2YWx1ZUNvbG9yOyB9CiAgICB2b2lkIHNldFZhbHVlUGF0dGVybigg aW50IHZhbHVlUGF0dGVybiApOwogICAgdm9pZCBzZXRMYWJlbCggY29uc3QgUVN0cmluZyYgbGFi ZWwgKSB7IG1fbGFiZWwgPSBsYWJlbDsgfQogICAgdm9pZCBzZXRMYWJlbENvbG9yKCBRQ29sb3Ig bGFiZWxDb2xvciApIHsgbV9sYWJlbENvbG9yID0gbGFiZWxDb2xvcjsgfQogICAgdm9pZCBzZXRQ cm9YKCBpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSApOwogICAgdm9pZCBzZXRQcm9ZKCBpbnQgaW5k ZXgsIGRvdWJsZSB2YWx1ZSApOwoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdCggZG91YmxlIHZhbHVl LCBRQ29sb3IgdmFsdWVDb2xvciwgaW50IHZhbHVlUGF0dGVybiwKCSAgICAgICBjb25zdCBRU3Ry aW5nJiBsYWJlbCwgUUNvbG9yIGxhYmVsQ29sb3IgKTsKCiAgICBkb3VibGUgbV92YWx1ZTsKICAg IFFDb2xvciBtX3ZhbHVlQ29sb3I7CiAgICBpbnQgbV92YWx1ZVBhdHRlcm47CiAgICBRU3RyaW5n IG1fbGFiZWw7CiAgICBRQ29sb3IgbV9sYWJlbENvbG9yOwogICAgZG91YmxlIG1fcHJvcG9pbnRz WzIgKiBNQVhfUFJPUE9JTlRTXTsKfTsKCgpRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggUVRleHRT dHJlYW0mLCBjb25zdCBFbGVtZW50JiApOwpRVGV4dFN0cmVhbSAmb3BlcmF0b3I+PiggUVRleHRT dHJlYW0mLCBFbGVtZW50JiApOwoKCiMgNCAiY2FudmFzdmlldy5oIiAyCgojIDEgImNhbnZhc3Rl eHQuaCIgMQoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xY2FudmFzLmgiIDEKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2lu Y2x1ZGUvcXNjcm9sbHZpZXcuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FmcmFtZS5oIiAxCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3F3aWRnZXQuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW9iamVjdC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fl dmVudC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEg Ii91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcmVnaW9uLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FyZWN0Lmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xv Y2FsL3F0L2luY2x1ZGUvcXNpemUuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcG9pbnQuaCIgMQogCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgICBRUG9pbnQKewpw dWJsaWM6CiAgICBRUG9pbnQoKTsKICAgIFFQb2ludCggaW50IHhwb3MsIGludCB5cG9zICk7Cgog ICAgYm9vbCAgIGlzTnVsbCgpCWNvbnN0OwoKICAgIGludAkgICB4KCkJCWNvbnN0OwogICAgaW50 CSAgIHkoKQkJY29uc3Q7CiAgICB2b2lkICAgc2V0WCggaW50IHggKTsKICAgIHZvaWQgICBzZXRZ KCBpbnQgeSApOwoKICAgIGludCBtYW5oYXR0YW5MZW5ndGgoKSBjb25zdDsKCiAgICBRQ09PUkQg JnJ4KCk7CiAgICBRQ09PUkQgJnJ5KCk7CgogICAgUVBvaW50ICZvcGVyYXRvcis9KCBjb25zdCBR UG9pbnQgJnAgKTsKICAgIFFQb2ludCAmb3BlcmF0b3ItPSggY29uc3QgUVBvaW50ICZwICk7CiAg ICBRUG9pbnQgJm9wZXJhdG9yKj0oIGludCBjICk7CiAgICBRUG9pbnQgJm9wZXJhdG9yKj0oIGRv dWJsZSBjICk7CiAgICBRUG9pbnQgJm9wZXJhdG9yLz0oIGludCBjICk7CiAgICBRUG9pbnQgJm9w ZXJhdG9yLz0oIGRvdWJsZSBjICk7CgogICAgZnJpZW5kIGlubGluZSBib29sCSBvcGVyYXRvcj09 KCBjb25zdCBRUG9pbnQgJiwgY29uc3QgUVBvaW50ICYgKTsKICAgIGZyaWVuZCBpbmxpbmUgYm9v bAkgb3BlcmF0b3IhPSggY29uc3QgUVBvaW50ICYsIGNvbnN0IFFQb2ludCAmICk7CiAgICBmcmll bmQgaW5saW5lIGNvbnN0IFFQb2ludCBvcGVyYXRvcisoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBR UG9pbnQgJiApOwogICAgZnJpZW5kIGlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3ItKCBjb25z dCBRUG9pbnQgJiwgY29uc3QgUVBvaW50ICYgKTsKICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgUVBv aW50IG9wZXJhdG9yKiggY29uc3QgUVBvaW50ICYsIGludCApOwogICAgZnJpZW5kIGlubGluZSBj b25zdCBRUG9pbnQgb3BlcmF0b3IqKCBpbnQsIGNvbnN0IFFQb2ludCAmICk7CiAgICBmcmllbmQg aW5saW5lIGNvbnN0IFFQb2ludCBvcGVyYXRvciooIGNvbnN0IFFQb2ludCAmLCBkb3VibGUgKTsK ICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgUVBvaW50IG9wZXJhdG9yKiggZG91YmxlLCBjb25zdCBR UG9pbnQgJiApOwogICAgZnJpZW5kIGlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3ItKCBjb25z dCBRUG9pbnQgJiApOwogICAgZnJpZW5kIGlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3IvKCBj b25zdCBRUG9pbnQgJiwgaW50ICk7CiAgICBmcmllbmQgaW5saW5lIGNvbnN0IFFQb2ludCBvcGVy YXRvci8oIGNvbnN0IFFQb2ludCAmLCBkb3VibGUgKTsKCnByaXZhdGU6CiAgICBzdGF0aWMgdm9p ZCB3YXJuaW5nRGl2QnlaZXJvKCk7CgoKCgoKICAgIFFDT09SRCB4cDsKICAgIFFDT09SRCB5cDsK Cn07CgoKIAoKCgogIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25z dCBRUG9pbnQgJiApOwogIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBR UG9pbnQgJiApOwoKCiAKCgoKaW5saW5lIFFQb2ludDo6UVBvaW50KCkKeyB4cD0wOyB5cD0wOyB9 CgppbmxpbmUgUVBvaW50OjpRUG9pbnQoIGludCB4cG9zLCBpbnQgeXBvcyApCnsgeHA9KFFDT09S RCl4cG9zOyB5cD0oUUNPT1JEKXlwb3M7IH0KCmlubGluZSBib29sIFFQb2ludDo6aXNOdWxsKCkg Y29uc3QKeyByZXR1cm4geHAgPT0gMCAmJiB5cCA9PSAwOyB9CgppbmxpbmUgaW50IFFQb2ludDo6 eCgpIGNvbnN0CnsgcmV0dXJuIHhwOyB9CgppbmxpbmUgaW50IFFQb2ludDo6eSgpIGNvbnN0Cnsg cmV0dXJuIHlwOyB9CgppbmxpbmUgdm9pZCBRUG9pbnQ6OnNldFgoIGludCB4ICkKeyB4cCA9IChR Q09PUkQpeDsgfQoKaW5saW5lIHZvaWQgUVBvaW50OjpzZXRZKCBpbnQgeSApCnsgeXAgPSAoUUNP T1JEKXk7IH0KCmlubGluZSBRQ09PUkQgJlFQb2ludDo6cngoKQp7IHJldHVybiB4cDsgfQoKaW5s aW5lIFFDT09SRCAmUVBvaW50OjpyeSgpCnsgcmV0dXJuIHlwOyB9CgppbmxpbmUgUVBvaW50ICZR UG9pbnQ6Om9wZXJhdG9yKz0oIGNvbnN0IFFQb2ludCAmcCApCnsgeHArPXAueHA7IHlwKz1wLnlw OyByZXR1cm4gKnRoaXM7IH0KCmlubGluZSBRUG9pbnQgJlFQb2ludDo6b3BlcmF0b3ItPSggY29u c3QgUVBvaW50ICZwICkKeyB4cC09cC54cDsgeXAtPXAueXA7IHJldHVybiAqdGhpczsgfQoKaW5s aW5lIFFQb2ludCAmUVBvaW50OjpvcGVyYXRvcio9KCBpbnQgYyApCnsgeHAqPShRQ09PUkQpYzsg eXAqPShRQ09PUkQpYzsgcmV0dXJuICp0aGlzOyB9CgppbmxpbmUgUVBvaW50ICZRUG9pbnQ6Om9w ZXJhdG9yKj0oIGRvdWJsZSBjICkKeyB4cD0oUUNPT1JEKSh4cCpjKTsgeXA9KFFDT09SRCkoeXAq Yyk7IHJldHVybiAqdGhpczsgfQoKaW5saW5lIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVBvaW50 ICZwMSwgY29uc3QgUVBvaW50ICZwMiApCnsgcmV0dXJuIHAxLnhwID09IHAyLnhwICYmIHAxLnlw ID09IHAyLnlwOyB9CgppbmxpbmUgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRUG9pbnQgJnAxLCBj b25zdCBRUG9pbnQgJnAyICkKeyByZXR1cm4gcDEueHAgIT0gcDIueHAgfHwgcDEueXAgIT0gcDIu eXA7IH0KCmlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3IrKCBjb25zdCBRUG9pbnQgJnAxLCBj b25zdCBRUG9pbnQgJnAyICkKeyByZXR1cm4gUVBvaW50KHAxLnhwK3AyLnhwLCBwMS55cCtwMi55 cCk7IH0KCmlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3ItKCBjb25zdCBRUG9pbnQgJnAxLCBj b25zdCBRUG9pbnQgJnAyICkKeyByZXR1cm4gUVBvaW50KHAxLnhwLXAyLnhwLCBwMS55cC1wMi55 cCk7IH0KCmlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3IqKCBjb25zdCBRUG9pbnQgJnAsIGlu dCBjICkKeyByZXR1cm4gUVBvaW50KHAueHAqYywgcC55cCpjKTsgfQoKaW5saW5lIGNvbnN0IFFQ b2ludCBvcGVyYXRvciooIGludCBjLCBjb25zdCBRUG9pbnQgJnAgKQp7IHJldHVybiBRUG9pbnQo cC54cCpjLCBwLnlwKmMpOyB9CgppbmxpbmUgY29uc3QgUVBvaW50IG9wZXJhdG9yKiggY29uc3Qg UVBvaW50ICZwLCBkb3VibGUgYyApCnsgcmV0dXJuIFFQb2ludCgoUUNPT1JEKShwLnhwKmMpLCAo UUNPT1JEKShwLnlwKmMpKTsgfQoKaW5saW5lIGNvbnN0IFFQb2ludCBvcGVyYXRvciooIGRvdWJs ZSBjLCBjb25zdCBRUG9pbnQgJnAgKQp7IHJldHVybiBRUG9pbnQoKFFDT09SRCkocC54cCpjKSwg KFFDT09SRCkocC55cCpjKSk7IH0KCmlubGluZSBjb25zdCBRUG9pbnQgb3BlcmF0b3ItKCBjb25z dCBRUG9pbnQgJnAgKQp7IHJldHVybiBRUG9pbnQoLXAueHAsIC1wLnlwKTsgfQoKaW5saW5lIFFQ b2ludCAmUVBvaW50OjpvcGVyYXRvci89KCBpbnQgYyApCnsKCiAgICBpZiAoIGMgPT0gMCApCgl3 YXJuaW5nRGl2QnlaZXJvKCk7CgogICAgeHAvPShRQ09PUkQpYzsKICAgIHlwLz0oUUNPT1JEKWM7 CiAgICByZXR1cm4gKnRoaXM7Cn0KCmlubGluZSBRUG9pbnQgJlFQb2ludDo6b3BlcmF0b3IvPSgg ZG91YmxlIGMgKQp7CgogICAgaWYgKCBjID09IDAuMCApCgl3YXJuaW5nRGl2QnlaZXJvKCk7Cgog ICAgeHA9KFFDT09SRCkoeHAvYyk7CiAgICB5cD0oUUNPT1JEKSh5cC9jKTsKICAgIHJldHVybiAq dGhpczsKfQoKaW5saW5lIGNvbnN0IFFQb2ludCBvcGVyYXRvci8oIGNvbnN0IFFQb2ludCAmcCwg aW50IGMgKQp7CgogICAgaWYgKCBjID09IDAgKQoJUVBvaW50Ojp3YXJuaW5nRGl2QnlaZXJvKCk7 CgogICAgcmV0dXJuIFFQb2ludChwLnhwL2MsIHAueXAvYyk7Cn0KCmlubGluZSBjb25zdCBRUG9p bnQgb3BlcmF0b3IvKCBjb25zdCBRUG9pbnQgJnAsIGRvdWJsZSBjICkKewoKICAgIGlmICggYyA9 PSAwLjAgKQoJUVBvaW50Ojp3YXJuaW5nRGl2QnlaZXJvKCk7CgogICAgcmV0dXJuIFFQb2ludCgo UUNPT1JEKShwLnhwL2MpLCAoUUNPT1JEKShwLnlwL2MpKTsKfQoKCgojIDQyICIvdXNyL2xvY2Fs L3F0L2luY2x1ZGUvcXNpemUuaCIgMgoKCgoKY2xhc3MgICBRU2l6ZQp7CnB1YmxpYzoKICAgIFFT aXplKCk7CiAgICBRU2l6ZSggaW50IHcsIGludCBoICk7CgogICAgYm9vbCAgIGlzTnVsbCgpCWNv bnN0OwogICAgYm9vbCAgIGlzRW1wdHkoKQljb25zdDsKICAgIGJvb2wgICBpc1ZhbGlkKCkJY29u c3Q7CgogICAgaW50CSAgIHdpZHRoKCkJY29uc3Q7CiAgICBpbnQJICAgaGVpZ2h0KCkJY29uc3Q7 CiAgICB2b2lkICAgc2V0V2lkdGgoIGludCB3ICk7CiAgICB2b2lkICAgc2V0SGVpZ2h0KCBpbnQg aCApOwogICAgdm9pZCAgIHRyYW5zcG9zZSgpOwoKICAgIFFTaXplIGV4cGFuZGVkVG8oIGNvbnN0 IFFTaXplICYgKSBjb25zdDsKICAgIFFTaXplIGJvdW5kZWRUbyggY29uc3QgUVNpemUgJiApIGNv bnN0OwoKICAgIFFDT09SRCAmcndpZHRoKCk7CiAgICBRQ09PUkQgJnJoZWlnaHQoKTsKCiAgICBR U2l6ZSAmb3BlcmF0b3IrPSggY29uc3QgUVNpemUgJiApOwogICAgUVNpemUgJm9wZXJhdG9yLT0o IGNvbnN0IFFTaXplICYgKTsKICAgIFFTaXplICZvcGVyYXRvcio9KCBpbnQgYyApOwogICAgUVNp emUgJm9wZXJhdG9yKj0oIGRvdWJsZSBjICk7CiAgICBRU2l6ZSAmb3BlcmF0b3IvPSggaW50IGMg KTsKICAgIFFTaXplICZvcGVyYXRvci89KCBkb3VibGUgYyApOwoKICAgIGZyaWVuZCBpbmxpbmUg Ym9vbAlvcGVyYXRvcj09KCBjb25zdCBRU2l6ZSAmLCBjb25zdCBRU2l6ZSAmICk7CiAgICBmcmll bmQgaW5saW5lIGJvb2wJb3BlcmF0b3IhPSggY29uc3QgUVNpemUgJiwgY29uc3QgUVNpemUgJiAp OwogICAgZnJpZW5kIGlubGluZSBjb25zdCBRU2l6ZSBvcGVyYXRvcisoIGNvbnN0IFFTaXplICYs IGNvbnN0IFFTaXplICYgKTsKICAgIGZyaWVuZCBpbmxpbmUgY29uc3QgUVNpemUgb3BlcmF0b3It KCBjb25zdCBRU2l6ZSAmLCBjb25zdCBRU2l6ZSAmICk7CiAgICBmcmllbmQgaW5saW5lIGNvbnN0 IFFTaXplIG9wZXJhdG9yKiggY29uc3QgUVNpemUgJiwgaW50ICk7CiAgICBmcmllbmQgaW5saW5l IGNvbnN0IFFTaXplIG9wZXJhdG9yKiggaW50LCBjb25zdCBRU2l6ZSAmICk7CiAgICBmcmllbmQg aW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yKiggY29uc3QgUVNpemUgJiwgZG91YmxlICk7CiAg ICBmcmllbmQgaW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yKiggZG91YmxlLCBjb25zdCBRU2l6 ZSAmICk7CiAgICBmcmllbmQgaW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yLyggY29uc3QgUVNp emUgJiwgaW50ICk7CiAgICBmcmllbmQgaW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yLyggY29u c3QgUVNpemUgJiwgZG91YmxlICk7Cgpwcml2YXRlOgogICAgc3RhdGljIHZvaWQgd2FybmluZ0Rp dkJ5WmVybygpOwoKICAgIFFDT09SRCB3ZDsKICAgIFFDT09SRCBodDsKfTsKCgogCgoKCiAgUURh dGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFTaXplICYgKTsKICBR RGF0YVN0cmVhbSAmb3BlcmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUVNpemUgJiApOwoKCiAKCgoK aW5saW5lIFFTaXplOjpRU2l6ZSgpCnsgd2QgPSBodCA9IC0xOyB9CgppbmxpbmUgUVNpemU6OlFT aXplKCBpbnQgdywgaW50IGggKQp7IHdkPShRQ09PUkQpdzsgaHQ9KFFDT09SRCloOyB9Cgppbmxp bmUgYm9vbCBRU2l6ZTo6aXNOdWxsKCkgY29uc3QKeyByZXR1cm4gd2Q9PTAgJiYgaHQ9PTA7IH0K CmlubGluZSBib29sIFFTaXplOjppc0VtcHR5KCkgY29uc3QKeyByZXR1cm4gd2Q8MSB8fCBodDwx OyB9CgppbmxpbmUgYm9vbCBRU2l6ZTo6aXNWYWxpZCgpIGNvbnN0CnsgcmV0dXJuIHdkPj0wICYm IGh0Pj0wOyB9CgppbmxpbmUgaW50IFFTaXplOjp3aWR0aCgpIGNvbnN0CnsgcmV0dXJuIHdkOyB9 CgppbmxpbmUgaW50IFFTaXplOjpoZWlnaHQoKSBjb25zdAp7IHJldHVybiBodDsgfQoKaW5saW5l IHZvaWQgUVNpemU6OnNldFdpZHRoKCBpbnQgdyApCnsgd2Q9KFFDT09SRCl3OyB9CgppbmxpbmUg dm9pZCBRU2l6ZTo6c2V0SGVpZ2h0KCBpbnQgaCApCnsgaHQ9KFFDT09SRCloOyB9CgppbmxpbmUg UUNPT1JEICZRU2l6ZTo6cndpZHRoKCkKeyByZXR1cm4gd2Q7IH0KCmlubGluZSBRQ09PUkQgJlFT aXplOjpyaGVpZ2h0KCkKeyByZXR1cm4gaHQ7IH0KCmlubGluZSBRU2l6ZSAmUVNpemU6Om9wZXJh dG9yKz0oIGNvbnN0IFFTaXplICZzICkKeyB3ZCs9cy53ZDsgaHQrPXMuaHQ7IHJldHVybiAqdGhp czsgfQoKaW5saW5lIFFTaXplICZRU2l6ZTo6b3BlcmF0b3ItPSggY29uc3QgUVNpemUgJnMgKQp7 IHdkLT1zLndkOyBodC09cy5odDsgcmV0dXJuICp0aGlzOyB9CgppbmxpbmUgUVNpemUgJlFTaXpl OjpvcGVyYXRvcio9KCBpbnQgYyApCnsgd2QqPShRQ09PUkQpYzsgaHQqPShRQ09PUkQpYzsgcmV0 dXJuICp0aGlzOyB9CgppbmxpbmUgUVNpemUgJlFTaXplOjpvcGVyYXRvcio9KCBkb3VibGUgYyAp Cnsgd2Q9KFFDT09SRCkod2QqYyk7IGh0PShRQ09PUkQpKGh0KmMpOyByZXR1cm4gKnRoaXM7IH0K CmlubGluZSBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFTaXplICZzMSwgY29uc3QgUVNpemUgJnMy ICkKeyByZXR1cm4gczEud2QgPT0gczIud2QgJiYgczEuaHQgPT0gczIuaHQ7IH0KCmlubGluZSBi b29sIG9wZXJhdG9yIT0oIGNvbnN0IFFTaXplICZzMSwgY29uc3QgUVNpemUgJnMyICkKeyByZXR1 cm4gczEud2QgIT0gczIud2QgfHwgczEuaHQgIT0gczIuaHQ7IH0KCmlubGluZSBjb25zdCBRU2l6 ZSBvcGVyYXRvcisoIGNvbnN0IFFTaXplICYgczEsIGNvbnN0IFFTaXplICYgczIgKQp7IHJldHVy biBRU2l6ZShzMS53ZCtzMi53ZCwgczEuaHQrczIuaHQpOyB9CgppbmxpbmUgY29uc3QgUVNpemUg b3BlcmF0b3ItKCBjb25zdCBRU2l6ZSAmczEsIGNvbnN0IFFTaXplICZzMiApCnsgcmV0dXJuIFFT aXplKHMxLndkLXMyLndkLCBzMS5odC1zMi5odCk7IH0KCmlubGluZSBjb25zdCBRU2l6ZSBvcGVy YXRvciooIGNvbnN0IFFTaXplICZzLCBpbnQgYyApCnsgcmV0dXJuIFFTaXplKHMud2QqYywgcy5o dCpjKTsgfQoKaW5saW5lIGNvbnN0IFFTaXplIG9wZXJhdG9yKiggaW50IGMsIGNvbnN0IFFTaXpl ICZzICkKeyAgcmV0dXJuIFFTaXplKHMud2QqYywgcy5odCpjKTsgfQoKaW5saW5lIGNvbnN0IFFT aXplIG9wZXJhdG9yKiggY29uc3QgUVNpemUgJnMsIGRvdWJsZSBjICkKeyByZXR1cm4gUVNpemUo KFFDT09SRCkocy53ZCpjKSwgKFFDT09SRCkocy5odCpjKSk7IH0KCmlubGluZSBjb25zdCBRU2l6 ZSBvcGVyYXRvciooIGRvdWJsZSBjLCBjb25zdCBRU2l6ZSAmcyApCnsgcmV0dXJuIFFTaXplKChR Q09PUkQpKHMud2QqYyksIChRQ09PUkQpKHMuaHQqYykpOyB9CgppbmxpbmUgUVNpemUgJlFTaXpl OjpvcGVyYXRvci89KCBpbnQgYyApCnsKCiAgICBpZiAoIGMgPT0gMCApCgl3YXJuaW5nRGl2Qnla ZXJvKCk7CgogICAgd2QvPShRQ09PUkQpYzsgaHQvPShRQ09PUkQpYzsKICAgIHJldHVybiAqdGhp czsKfQoKaW5saW5lIFFTaXplICZRU2l6ZTo6b3BlcmF0b3IvPSggZG91YmxlIGMgKQp7CgogICAg aWYgKCBjID09IDAuMCApCgl3YXJuaW5nRGl2QnlaZXJvKCk7CgogICAgd2Q9KFFDT09SRCkod2Qv Yyk7IGh0PShRQ09PUkQpKGh0L2MpOwogICAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgY29uc3Qg UVNpemUgb3BlcmF0b3IvKCBjb25zdCBRU2l6ZSAmcywgaW50IGMgKQp7CgogICAgaWYgKCBjID09 IDAgKQoJUVNpemU6Ondhcm5pbmdEaXZCeVplcm8oKTsKCiAgICByZXR1cm4gUVNpemUocy53ZC9j LCBzLmh0L2MpOwp9CgppbmxpbmUgY29uc3QgUVNpemUgb3BlcmF0b3IvKCBjb25zdCBRU2l6ZSAm cywgZG91YmxlIGMgKQp7CgogICAgaWYgKCBjID09IDAuMCApCglRU2l6ZTo6d2FybmluZ0RpdkJ5 WmVybygpOwoKICAgIHJldHVybiBRU2l6ZSgoUUNPT1JEKShzLndkL2MpLCAoUUNPT1JEKShzLmh0 L2MpKTsKfQoKaW5saW5lIFFTaXplIFFTaXplOjpleHBhbmRlZFRvKCBjb25zdCBRU2l6ZSAmIG90 aGVyU2l6ZSApIGNvbnN0CnsKICAgIHJldHVybiBRU2l6ZSggKCggb3RoZXJTaXplLndkICkgPCAo IHdkICkgPyAoIHdkICkgOiAoIG90aGVyU2l6ZS53ZCApKSAsICgoIG90aGVyU2l6ZS5odCApIDwg KCBodCApID8gKCBodCApIDogKCBvdGhlclNpemUuaHQgKSkgICk7Cn0KCmlubGluZSBRU2l6ZSBR U2l6ZTo6Ym91bmRlZFRvKCBjb25zdCBRU2l6ZSAmIG90aGVyU2l6ZSApIGNvbnN0CnsKICAgIHJl dHVybiBRU2l6ZSggKCggd2QgKSA8ICggb3RoZXJTaXplLndkICkgPyAoIHdkICkgOiAoIG90aGVy U2l6ZS53ZCApKSAsICgoIGh0ICkgPCAoIG90aGVyU2l6ZS5odCApID8gKCBodCApIDogKCBvdGhl clNpemUuaHQgKSkgICk7Cn0KCgoKIyA0MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FyZWN0Lmgi IDIKCgoKCgoKCgpjbGFzcyAgIFFSZWN0CQkJCQkgCnsKcHVibGljOgogICAgUVJlY3QoKQl7IHgx ID0geTEgPSAwOyB4MiA9IHkyID0gLTE7IH0KICAgIFFSZWN0KCBjb25zdCBRUG9pbnQgJnRvcGxl ZnQsIGNvbnN0IFFQb2ludCAmYm90dG9tcmlnaHQgKTsKICAgIFFSZWN0KCBjb25zdCBRUG9pbnQg JnRvcGxlZnQsIGNvbnN0IFFTaXplICZzaXplICk7CiAgICBRUmVjdCggaW50IGxlZnQsIGludCB0 b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCApOwoKICAgIGJvb2wgICBpc051bGwoKQljb25zdDsK ICAgIGJvb2wgICBpc0VtcHR5KCkJY29uc3Q7CiAgICBib29sICAgaXNWYWxpZCgpCWNvbnN0Owog ICAgUVJlY3QgIG5vcm1hbGl6ZSgpCWNvbnN0OwoKICAgIGludAkgICBsZWZ0KCkJY29uc3Q7CiAg ICBpbnQJICAgdG9wKCkJY29uc3Q7CiAgICBpbnQJICAgcmlnaHQoKQljb25zdDsKICAgIGludAkg ICBib3R0b20oKQljb25zdDsKCiAgICBRQ09PUkQgJnJMZWZ0KCk7CiAgICBRQ09PUkQgJnJUb3Ao KTsKICAgIFFDT09SRCAmclJpZ2h0KCk7CiAgICBRQ09PUkQgJnJCb3R0b20oKTsKCQogICAgaW50 CSAgIHgoKQkJY29uc3Q7CiAgICBpbnQJICAgeSgpCQljb25zdDsKICAgIHZvaWQgICBzZXRMZWZ0 KCBpbnQgcG9zICk7CiAgICB2b2lkICAgc2V0VG9wKCBpbnQgcG9zICk7CiAgICB2b2lkICAgc2V0 UmlnaHQoIGludCBwb3MgKTsKICAgIHZvaWQgICBzZXRCb3R0b20oIGludCBwb3MgKTsKICAgIHZv aWQgICBzZXRYKCBpbnQgeCApOwogICAgdm9pZCAgIHNldFkoIGludCB5ICk7CgogICAgUVBvaW50 IHRvcExlZnQoKQkgY29uc3Q7CiAgICBRUG9pbnQgYm90dG9tUmlnaHQoKSBjb25zdDsKICAgIFFQ b2ludCB0b3BSaWdodCgpCSBjb25zdDsKICAgIFFQb2ludCBib3R0b21MZWZ0KCkJIGNvbnN0Owog ICAgUVBvaW50IGNlbnRlcigpCSBjb25zdDsKCiAgICB2b2lkICAgcmVjdCggaW50ICp4LCBpbnQg KnksIGludCAqdywgaW50ICpoICkgY29uc3Q7CiAgICB2b2lkICAgY29vcmRzKCBpbnQgKngxLCBp bnQgKnkxLCBpbnQgKngyLCBpbnQgKnkyICkgY29uc3Q7CgogICAgdm9pZCAgIG1vdmVUb3BMZWZ0 KCBjb25zdCBRUG9pbnQgJnAgKTsKICAgIHZvaWQgICBtb3ZlQm90dG9tUmlnaHQoIGNvbnN0IFFQ b2ludCAmcCApOwogICAgdm9pZCAgIG1vdmVUb3BSaWdodCggY29uc3QgUVBvaW50ICZwICk7CiAg ICB2b2lkICAgbW92ZUJvdHRvbUxlZnQoIGNvbnN0IFFQb2ludCAmcCApOwogICAgdm9pZCAgIG1v dmVDZW50ZXIoIGNvbnN0IFFQb2ludCAmcCApOwogICAgdm9pZCAgIG1vdmVCeSggaW50IGR4LCBp bnQgZHkgKTsKCiAgICB2b2lkICAgc2V0UmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgg KTsKICAgIHZvaWQgICBzZXRDb29yZHMoIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MiAp OwogICAgdm9pZCAgIGFkZENvb3JkcyggaW50IHgxLCBpbnQgeTEsIGludCB4MiwgaW50IHkyICk7 CiAgICAKICAgIFFTaXplICBzaXplKCkJY29uc3Q7CiAgICBpbnQJICAgd2lkdGgoKQljb25zdDsK ICAgIGludAkgICBoZWlnaHQoKQljb25zdDsKICAgIHZvaWQgICBzZXRXaWR0aCggaW50IHcgKTsK ICAgIHZvaWQgICBzZXRIZWlnaHQoIGludCBoICk7CiAgICB2b2lkICAgc2V0U2l6ZSggY29uc3Qg UVNpemUgJnMgKTsKCiAgICBRUmVjdCAgb3BlcmF0b3J8KGNvbnN0IFFSZWN0ICZyKSBjb25zdDsK ICAgIFFSZWN0ICBvcGVyYXRvciYoY29uc3QgUVJlY3QgJnIpIGNvbnN0OwogICAgUVJlY3QmICBv cGVyYXRvcnw9KGNvbnN0IFFSZWN0ICZyKTsKICAgIFFSZWN0JiAgb3BlcmF0b3ImPShjb25zdCBR UmVjdCAmcik7CgogICAgYm9vbCAgIGNvbnRhaW5zKCBjb25zdCBRUG9pbnQgJnAsIGJvb2wgcHJv cGVyPUZBTFNFICkgY29uc3Q7CiAgICBib29sICAgY29udGFpbnMoIGludCB4LCBpbnQgeSwgYm9v bCBwcm9wZXI9RkFMU0UgKSBjb25zdDsKICAgIGJvb2wgICBjb250YWlucyggY29uc3QgUVJlY3Qg JnIsIGJvb2wgcHJvcGVyPUZBTFNFICkgY29uc3Q7CiAgICBRUmVjdCAgdW5pdGUoIGNvbnN0IFFS ZWN0ICZyICkgY29uc3Q7CiAgICBRUmVjdCAgaW50ZXJzZWN0KCBjb25zdCBRUmVjdCAmciApIGNv bnN0OwogICAgYm9vbCAgIGludGVyc2VjdHMoIGNvbnN0IFFSZWN0ICZyICkgY29uc3Q7CgogICAg ZnJpZW5kICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRUmVjdCAmLCBjb25zdCBRUmVjdCAmICk7 CiAgICBmcmllbmQgICBib29sIG9wZXJhdG9yIT0oIGNvbnN0IFFSZWN0ICYsIGNvbnN0IFFSZWN0 ICYgKTsKCnByaXZhdGU6CgoKCgoKCiAgICBRQ09PUkQgeDE7CiAgICBRQ09PUkQgeTE7CiAgICBR Q09PUkQgeDI7CiAgICBRQ09PUkQgeTI7Cgp9OwoKICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFS ZWN0ICYsIGNvbnN0IFFSZWN0ICYgKTsKICBib29sIG9wZXJhdG9yIT0oIGNvbnN0IFFSZWN0ICYs IGNvbnN0IFFSZWN0ICYgKTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRh U3RyZWFtICYsIGNvbnN0IFFSZWN0ICYgKTsKICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+PiggUURh dGFTdHJlYW0gJiwgUVJlY3QgJiApOwoKCiAKCgoKaW5saW5lIFFSZWN0OjpRUmVjdCggaW50IGxl ZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCApCnsKICAgIHgxID0gKFFDT09SRCls ZWZ0OwogICAgeTEgPSAoUUNPT1JEKXRvcDsKICAgIHgyID0gKFFDT09SRCkobGVmdCt3aWR0aC0x KTsKICAgIHkyID0gKFFDT09SRCkodG9wK2hlaWdodC0xKTsKfQoKaW5saW5lIGJvb2wgUVJlY3Q6 OmlzTnVsbCgpIGNvbnN0CnsgcmV0dXJuIHgyID09IHgxLTEgJiYgeTIgPT0geTEtMTsgfQoKaW5s aW5lIGJvb2wgUVJlY3Q6OmlzRW1wdHkoKSBjb25zdAp7IHJldHVybiB4MSA+IHgyIHx8IHkxID4g eTI7IH0KCmlubGluZSBib29sIFFSZWN0Ojppc1ZhbGlkKCkgY29uc3QKeyByZXR1cm4geDEgPD0g eDIgJiYgeTEgPD0geTI7IH0KCmlubGluZSBpbnQgUVJlY3Q6OmxlZnQoKSBjb25zdAp7IHJldHVy biB4MTsgfQoKaW5saW5lIGludCBRUmVjdDo6dG9wKCkgY29uc3QKeyByZXR1cm4geTE7IH0KCmlu bGluZSBpbnQgUVJlY3Q6OnJpZ2h0KCkgY29uc3QKeyByZXR1cm4geDI7IH0KCmlubGluZSBpbnQg UVJlY3Q6OmJvdHRvbSgpIGNvbnN0CnsgcmV0dXJuIHkyOyB9CgppbmxpbmUgUUNPT1JEICZRUmVj dDo6ckxlZnQoKQp7IHJldHVybiB4MTsgfQoKaW5saW5lIFFDT09SRCAmIFFSZWN0OjpyVG9wKCkK eyByZXR1cm4geTE7IH0KCmlubGluZSBRQ09PUkQgJiBRUmVjdDo6clJpZ2h0KCkKeyByZXR1cm4g eDI7IH0KCmlubGluZSBRQ09PUkQgJiBRUmVjdDo6ckJvdHRvbSgpCnsgcmV0dXJuIHkyOyB9Cgpp bmxpbmUgaW50IFFSZWN0Ojp4KCkgY29uc3QKeyByZXR1cm4geDE7IH0KCmlubGluZSBpbnQgUVJl Y3Q6OnkoKSBjb25zdAp7IHJldHVybiB5MTsgfQoKaW5saW5lIHZvaWQgUVJlY3Q6OnNldExlZnQo IGludCBwb3MgKQp7IHgxID0gKFFDT09SRClwb3M7IH0KCmlubGluZSB2b2lkIFFSZWN0OjpzZXRU b3AoIGludCBwb3MgKQp7IHkxID0gKFFDT09SRClwb3M7IH0KCmlubGluZSB2b2lkIFFSZWN0Ojpz ZXRSaWdodCggaW50IHBvcyApCnsgeDIgPSAoUUNPT1JEKXBvczsgfQoKaW5saW5lIHZvaWQgUVJl Y3Q6OnNldEJvdHRvbSggaW50IHBvcyApCnsgeTIgPSAoUUNPT1JEKXBvczsgfQoKaW5saW5lIHZv aWQgUVJlY3Q6OnNldFgoIGludCB4ICkKeyB4MSA9IChRQ09PUkQpeDsgfQoKaW5saW5lIHZvaWQg UVJlY3Q6OnNldFkoIGludCB5ICkKeyB5MSA9IChRQ09PUkQpeTsgfQoKaW5saW5lIFFQb2ludCBR UmVjdDo6dG9wTGVmdCgpIGNvbnN0CnsgcmV0dXJuIFFQb2ludCh4MSwgeTEpOyB9CgppbmxpbmUg UVBvaW50IFFSZWN0Ojpib3R0b21SaWdodCgpIGNvbnN0CnsgcmV0dXJuIFFQb2ludCh4MiwgeTIp OyB9CgppbmxpbmUgUVBvaW50IFFSZWN0Ojp0b3BSaWdodCgpIGNvbnN0CnsgcmV0dXJuIFFQb2lu dCh4MiwgeTEpOyB9CgppbmxpbmUgUVBvaW50IFFSZWN0Ojpib3R0b21MZWZ0KCkgY29uc3QKeyBy ZXR1cm4gUVBvaW50KHgxLCB5Mik7IH0KCmlubGluZSBRUG9pbnQgUVJlY3Q6OmNlbnRlcigpIGNv bnN0CnsgcmV0dXJuIFFQb2ludCgoeDEreDIpLzIsICh5MSt5MikvMik7IH0KCmlubGluZSBpbnQg UVJlY3Q6OndpZHRoKCkgY29uc3QKeyByZXR1cm4gIHgyIC0geDEgKyAxOyB9CgppbmxpbmUgaW50 IFFSZWN0OjpoZWlnaHQoKSBjb25zdAp7IHJldHVybiAgeTIgLSB5MSArIDE7IH0KCmlubGluZSBR U2l6ZSBRUmVjdDo6c2l6ZSgpIGNvbnN0CnsgcmV0dXJuIFFTaXplKHgyLXgxKzEsIHkyLXkxKzEp OyB9CgppbmxpbmUgYm9vbCBRUmVjdDo6Y29udGFpbnMoIGludCB4LCBpbnQgeSwgYm9vbCBwcm9w ZXIgKSBjb25zdAp7CiAgICBpZiAoIHByb3BlciApCiAgICAgICAgcmV0dXJuIHggPiB4MSAmJiB4 IDwgeDIgJiYKICAgICAgICAgICAgICAgeSA+IHkxICYmIHkgPCB5MjsKICAgIGVsc2UKICAgICAg ICByZXR1cm4geCA+PSB4MSAmJiB4IDw9IHgyICYmCiAgICAgICAgICAgICAgIHkgPj0geTEgJiYg eSA8PSB5MjsKfQoKCiMgNDMgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcmVnaW9uLmgiIDIKCgoK CmNsYXNzICAgUVJlZ2lvbgp7CnB1YmxpYzoKICAgIGVudW0gUmVnaW9uVHlwZSB7IFJlY3Rhbmds ZSwgRWxsaXBzZSB9OwoKICAgIFFSZWdpb24oKTsKICAgIFFSZWdpb24oIGludCB4LCBpbnQgeSwg aW50IHcsIGludCBoLCBSZWdpb25UeXBlID0gUmVjdGFuZ2xlICk7CiAgICBRUmVnaW9uKCBjb25z dCBRUmVjdCAmLCBSZWdpb25UeXBlID0gUmVjdGFuZ2xlICk7CiAgICBRUmVnaW9uKCBjb25zdCBR UG9pbnRBcnJheSAmLCBib29sIHdpbmRpbmc9RkFMU0UgKTsKICAgIFFSZWdpb24oIGNvbnN0IFFS ZWdpb24gJiApOwogICAgUVJlZ2lvbiggY29uc3QgUUJpdG1hcCAmICk7CiAgIH5RUmVnaW9uKCk7 CiAgICBRUmVnaW9uICZvcGVyYXRvcj0oIGNvbnN0IFFSZWdpb24gJiApOwoKICAgIGJvb2wgICAg aXNOdWxsKCkgICBjb25zdDsKICAgIGJvb2wgICAgaXNFbXB0eSgpICBjb25zdDsKCiAgICBib29s ICAgIGNvbnRhaW5zKCBjb25zdCBRUG9pbnQgJnAgKSBjb25zdDsKICAgIGJvb2wgICAgY29udGFp bnMoIGNvbnN0IFFSZWN0ICZyICkJY29uc3Q7CgogICAgdm9pZCAgICB0cmFuc2xhdGUoIGludCBk eCwgaW50IGR5ICk7CgogICAgUVJlZ2lvbiB1bml0ZSggY29uc3QgUVJlZ2lvbiAmICkJY29uc3Q7 CiAgICBRUmVnaW9uIGludGVyc2VjdCggY29uc3QgUVJlZ2lvbiAmKSBjb25zdDsKICAgIFFSZWdp b24gc3VidHJhY3QoIGNvbnN0IFFSZWdpb24gJiApIGNvbnN0OwogICAgUVJlZ2lvbiBlb3IoIGNv bnN0IFFSZWdpb24gJiApCWNvbnN0OwoKICAgIFFSZWN0ICAgYm91bmRpbmdSZWN0KCkgY29uc3Q7 CiAgICBRTWVtQXJyYXk8UVJlY3Q+IHJlY3RzKCkgY29uc3Q7CiAgICB2b2lkIHNldFJlY3RzKCBj b25zdCBRUmVjdCAqLCBpbnQgKTsKCiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yfCggY29uc3Qg UVJlZ2lvbiAmICkgY29uc3Q7CiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yKyggY29uc3QgUVJl Z2lvbiAmICkgY29uc3Q7CiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yJiggY29uc3QgUVJlZ2lv biAmICkgY29uc3Q7CiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yLSggY29uc3QgUVJlZ2lvbiAm ICkgY29uc3Q7CiAgICBjb25zdCBRUmVnaW9uIG9wZXJhdG9yXiggY29uc3QgUVJlZ2lvbiAmICkg Y29uc3Q7CiAgICBRUmVnaW9uJiBvcGVyYXRvcnw9KCBjb25zdCBRUmVnaW9uICYgKTsKICAgIFFS ZWdpb24mIG9wZXJhdG9yKz0oIGNvbnN0IFFSZWdpb24gJiApOwogICAgUVJlZ2lvbiYgb3BlcmF0 b3ImPSggY29uc3QgUVJlZ2lvbiAmICk7CiAgICBRUmVnaW9uJiBvcGVyYXRvci09KCBjb25zdCBR UmVnaW9uICYgKTsKICAgIFFSZWdpb24mIG9wZXJhdG9yXj0oIGNvbnN0IFFSZWdpb24gJiApOwoK ICAgIGJvb2wgICAgb3BlcmF0b3I9PSggY29uc3QgUVJlZ2lvbiAmICkgIGNvbnN0OwogICAgYm9v bCAgICBvcGVyYXRvciE9KCBjb25zdCBRUmVnaW9uICZyICkgY29uc3QKCQkJeyByZXR1cm4gIShv cGVyYXRvcj09KHIpKTsgfQoKCgoKICAgIFJlZ2lvbiAgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4g ZGF0YS0+cmduOyB9CgoKCgoKCgoKICAgIGZyaWVuZCAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8 KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRUmVnaW9uICYgKTsKICAgIGZyaWVuZCAgIFFEYXRhU3Ry ZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRUmVnaW9uICYgKTsKCnByaXZhdGU6CiAg ICBRUmVnaW9uKCBib29sICk7CiAgICBRUmVnaW9uIGNvcHkoKSBjb25zdDsKICAgIHZvaWQgICAg ZGV0YWNoKCk7CgoKCiAgICB2b2lkICAgIGV4ZWMoIGNvbnN0IFFCeXRlQXJyYXkgJiwgaW50IHZl ciA9IDAgKTsKICAgIHN0cnVjdCBRUmVnaW9uRGF0YSA6IHB1YmxpYyBRU2hhcmVkIHsKCgoKCVFS ZWN0IHJlY3Q7CglSZWdpb24gcmduOwoKCgoKCgoKCWJvb2wgICBpc19udWxsOwogICAgfSAqZGF0 YTsKCgoKCgoKCn07CgoKCgoKCgoKCgoKCgoKIAoKCgoKICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8 PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUVJlZ2lvbiAmICk7CiAgUURhdGFTdHJlYW0gJm9wZXJh dG9yPj4oIFFEYXRhU3RyZWFtICYsIFFSZWdpb24gJiApOwoKCgoKIyA0MyAiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3FldmVudC5oIiAyCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW1pbWUu aCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcW1hcC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FwYWlyLmgiIDEKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBU MSwgY2xhc3MgVDI+CnN0cnVjdCBRUGFpcgp7CiAgICB0eXBlZGVmIFQxIGZpcnN0X3R5cGU7CiAg ICB0eXBlZGVmIFQyIHNlY29uZF90eXBlOwoKICAgIFFQYWlyKCkKCTogZmlyc3QoIFQxKCkgKSwg c2Vjb25kKCBUMigpICkKICAgIHt9CiAgICBRUGFpciggY29uc3QgVDEmIHQxLCBjb25zdCBUMiYg dDIgKQoJOiBmaXJzdCggdDEgKSwgc2Vjb25kKCB0MiApCiAgICB7fQoKICAgIFQxIGZpcnN0Owog ICAgVDIgc2Vjb25kOwp9OwoKdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KICBib29sIG9w ZXJhdG9yPT0oIGNvbnN0IFFQYWlyPFQxLCBUMj4mIHgsIGNvbnN0IFFQYWlyPFQxLCBUMj4mIHkg KQp7CiAgICByZXR1cm4geC5maXJzdCA9PSB5LmZpcnN0ICYmIHguc2Vjb25kID09IHkuc2Vjb25k Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgogIGJvb2wgb3BlcmF0b3I8KCBjb25z dCBRUGFpcjxUMSwgVDI+JiB4LCBjb25zdCBRUGFpcjxUMSwgVDI+JiB5ICkKewogICAgIAogICAg IAogICAgIAogICAgcmV0dXJuIHguZmlyc3QgPCB5LmZpcnN0IHx8CSggISggeS5maXJzdCA8IHgu Zmlyc3QgKSAmJiB4LnNlY29uZCA8IHkuc2Vjb25kICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUMSwg Y2xhc3MgVDI+CiAgUVBhaXI8VDEsIFQyPiBxTWFrZVBhaXIoIGNvbnN0IFQxJiB4LCBjb25zdCBU MiYgeSApCnsKICAgIHJldHVybiBRUGFpcjxUMSwgVDI+KCB4LCB5ICk7Cn0KCgojIDQ1ICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcW1hcC5oIiAyCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUv cXZhbHVlbGlzdC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8u Li8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL2l0ZXJhdG9yIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8y Ljk1LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzCiMgMzQyICIvdXNyL2xpYi9nY2MtbGliL2k1ODYt bWFuZHJha2UtbGludXgvMi45NS4zL2luY2x1ZGUvc3RkZGVmLmgiIDMKCiMgMzIgIi91c3IvbGli L2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9n KystMy9pdGVyYXRvciIgMiAzCgoKCgoKCgoKCgogCiAKIAojIDQ4ICIvdXNyL2xvY2FsL3F0L2lu Y2x1ZGUvcXZhbHVlbGlzdC5oIiAyCgojIDEgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFr ZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9saXN0IiAxIDMKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1h bmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9saXN0Lmgi IDEgMwogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCgoKCgoKdGVtcGxhdGUg PGNsYXNzIF9UcD4Kc3RydWN0IF9MaXN0X25vZGUgewogIHR5cGVkZWYgdm9pZCogX1ZvaWRfcG9p bnRlcjsKICBfVm9pZF9wb2ludGVyIF9NX25leHQ7CiAgX1ZvaWRfcG9pbnRlciBfTV9wcmV2Owog IF9UcCBfTV9kYXRhOwp9OwoKdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfUmVmLCBjbGFzcyBf UHRyPgpzdHJ1Y3QgX0xpc3RfaXRlcmF0b3IgewogIHR5cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1Rw LF9UcCYsX1RwKj4gICAgICAgICAgICAgaXRlcmF0b3I7CiAgdHlwZWRlZiBfTGlzdF9pdGVyYXRv cjxfVHAsY29uc3QgX1RwJixjb25zdCBfVHAqPiBjb25zdF9pdGVyYXRvcjsKICB0eXBlZGVmIF9M aXN0X2l0ZXJhdG9yPF9UcCxfUmVmLF9QdHI+ICAgICAgICAgICAgIF9TZWxmOwoKICB0eXBlZGVm IGJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnIGl0ZXJhdG9yX2NhdGVnb3J5OwogIHR5cGVkZWYg X1RwIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfUHRyIHBvaW50ZXI7CiAgdHlwZWRlZiBfUmVmIHJl ZmVyZW5jZTsKICB0eXBlZGVmIF9MaXN0X25vZGU8X1RwPiBfTm9kZTsKICB0eXBlZGVmIHNpemVf dCBzaXplX3R5cGU7CiAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwoKICBfTm9k ZSogX01fbm9kZTsKCiAgX0xpc3RfaXRlcmF0b3IoX05vZGUqIF9feCkgOiBfTV9ub2RlKF9feCkg e30KICBfTGlzdF9pdGVyYXRvcigpIHt9CiAgX0xpc3RfaXRlcmF0b3IoY29uc3QgaXRlcmF0b3Im IF9feCkgOiBfTV9ub2RlKF9feC5fTV9ub2RlKSB7fQoKICBib29sIG9wZXJhdG9yPT0oY29uc3Qg X1NlbGYmIF9feCkgY29uc3QgeyByZXR1cm4gX01fbm9kZSA9PSBfX3guX01fbm9kZTsgfQogIGJv b2wgb3BlcmF0b3IhPShjb25zdCBfU2VsZiYgX194KSBjb25zdCB7IHJldHVybiBfTV9ub2RlICE9 IF9feC5fTV9ub2RlOyB9CiAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICgq X01fbm9kZSkuX01fZGF0YTsgfQoKCiAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1 cm4gJihvcGVyYXRvciooKSk7IH0KCgogIF9TZWxmJiBvcGVyYXRvcisrKCkgeyAKICAgIF9NX25v ZGUgPSAoX05vZGUqKShfTV9ub2RlLT5fTV9uZXh0KTsKICAgIHJldHVybiAqdGhpczsKICB9CiAg X1NlbGYgb3BlcmF0b3IrKyhpbnQpIHsgCiAgICBfU2VsZiBfX3RtcCA9ICp0aGlzOwogICAgKysq dGhpczsKICAgIHJldHVybiBfX3RtcDsKICB9CiAgX1NlbGYmIG9wZXJhdG9yLS0oKSB7IAogICAg X01fbm9kZSA9IChfTm9kZSopKF9NX25vZGUtPl9NX3ByZXYpOwogICAgcmV0dXJuICp0aGlzOwog IH0KICBfU2VsZiBvcGVyYXRvci0tKGludCkgeyAKICAgIF9TZWxmIF9fdG1wID0gKnRoaXM7CiAg ICAtLSp0aGlzOwogICAgcmV0dXJuIF9fdG1wOwogIH0KfTsKCiMgMTIwICIvdXNyL2xpYi9nY2Mt bGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMv c3RsX2xpc3QuaCIgMwoKCgogCiAKIAogCiAKIAoKCgogCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNs YXNzIF9BbGxvY2F0b3IsIGJvb2wgX0lzU3RhdGljPgpjbGFzcyBfTGlzdF9hbGxvY19iYXNlIHsK cHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfVHAsIF9BbGxvY2F0b3I+ OjphbGxvY2F0b3JfdHlwZQogICAgICAgICAgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5 cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIF9Ob2RlX2FsbG9jYXRvcjsgfQoKICBf TGlzdF9hbGxvY19iYXNlKGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EpIDogX05vZGVfYWxsb2Nh dG9yKF9fYSkge30KCnByb3RlY3RlZDoKICBfTGlzdF9ub2RlPF9UcD4qIF9NX2dldF9ub2RlKCkK ICAgeyByZXR1cm4gX05vZGVfYWxsb2NhdG9yLmFsbG9jYXRlKDEpOyB9CiAgdm9pZCBfTV9wdXRf bm9kZShfTGlzdF9ub2RlPF9UcD4qIF9fcCkKICAgIHsgX05vZGVfYWxsb2NhdG9yLmRlYWxsb2Nh dGUoX19wLCAxKTsgfQoKcHJvdGVjdGVkOgogIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X0xpc3Rf bm9kZTxfVHA+LCBfQWxsb2NhdG9yPjo6YWxsb2NhdG9yX3R5cGUKICAgICAgICAgICBfTm9kZV9h bGxvY2F0b3I7CiAgX0xpc3Rfbm9kZTxfVHA+KiBfTV9ub2RlOwp9OwoKIAoKdGVtcGxhdGUgPGNs YXNzIF9UcCwgY2xhc3MgX0FsbG9jYXRvcj4KY2xhc3MgX0xpc3RfYWxsb2NfYmFzZTxfVHAsIF9B bGxvY2F0b3IsIHRydWU+IHsKcHVibGljOgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0 czxfVHAsIF9BbGxvY2F0b3I+OjphbGxvY2F0b3JfdHlwZQogICAgICAgICAgYWxsb2NhdG9yX3R5 cGU7CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9j YXRvcl90eXBlKCk7IH0KCiAgX0xpc3RfYWxsb2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYp IHt9Cgpwcm90ZWN0ZWQ6CiAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9MaXN0X25v ZGU8X1RwPiwgX0FsbG9jYXRvcj46Ol9BbGxvY190eXBlCiAgICAgICAgICBfQWxsb2NfdHlwZTsK ICBfTGlzdF9ub2RlPF9UcD4qIF9NX2dldF9ub2RlKCkgeyByZXR1cm4gX0FsbG9jX3R5cGU6OmFs bG9jYXRlKDEpOyB9CiAgdm9pZCBfTV9wdXRfbm9kZShfTGlzdF9ub2RlPF9UcD4qIF9fcCkgeyBf QWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9Cgpwcm90ZWN0ZWQ6CiAgX0xpc3Rfbm9k ZTxfVHA+KiBfTV9ub2RlOwp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgpj bGFzcyBfTGlzdF9iYXNlIAogIDogcHVibGljIF9MaXN0X2FsbG9jX2Jhc2U8X1RwLCBfQWxsb2Ms CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQWxsb2NfdHJhaXRzPF9UcCwgX0FsbG9jPjo6 X1NfaW5zdGFuY2VsZXNzPgp7CnB1YmxpYzoKICB0eXBlZGVmIF9MaXN0X2FsbG9jX2Jhc2U8X1Rw LCBfQWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9BbGxvY190cmFpdHM8X1RwLCBf QWxsb2M+OjpfU19pbnN0YW5jZWxlc3M+CiAgICAgICAgICBfQmFzZTsgCiAgdHlwZWRlZiB0eXBl bmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CgogIF9MaXN0X2Jhc2Uo Y29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSkgOiBfQmFzZShfX2EpIHsKICAgIF9NX25vZGUgPSBf TV9nZXRfbm9kZSgpOwogICAgX01fbm9kZS0+X01fbmV4dCA9IF9NX25vZGU7CiAgICBfTV9ub2Rl LT5fTV9wcmV2ID0gX01fbm9kZTsKICB9CiAgfl9MaXN0X2Jhc2UoKSB7CiAgICBjbGVhcigpOwog ICAgX01fcHV0X25vZGUoX01fbm9kZSk7CiAgfQoKICB2b2lkIGNsZWFyKCk7Cn07CgojIDIyOSAi L3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9p bmNsdWRlL2crKy0zL3N0bF9saXN0LmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBf QWxsb2M+CnZvaWQgCl9MaXN0X2Jhc2U8X1RwLF9BbGxvYz46OmNsZWFyKCkgCnsKICBfTGlzdF9u b2RlPF9UcD4qIF9fY3VyID0gKF9MaXN0X25vZGU8X1RwPiopIF9NX25vZGUtPl9NX25leHQ7CiAg d2hpbGUgKF9fY3VyICE9IF9NX25vZGUpIHsKICAgIF9MaXN0X25vZGU8X1RwPiogX190bXAgPSBf X2N1cjsKICAgIF9fY3VyID0gKF9MaXN0X25vZGU8X1RwPiopIF9fY3VyLT5fTV9uZXh0OwogICAg ZGVzdHJveSgmX190bXAtPl9NX2RhdGEpOwogICAgX01fcHV0X25vZGUoX190bXApOwogIH0KICBf TV9ub2RlLT5fTV9uZXh0ID0gX01fbm9kZTsKICBfTV9ub2RlLT5fTV9wcmV2ID0gX01fbm9kZTsK fQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBfVHAgPiAg PgpjbGFzcyBsaXN0IDogcHJvdGVjdGVkIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+IHsKICB0eXBl ZGVmIF9MaXN0X2Jhc2U8X1RwLCBfQWxsb2M+IF9CYXNlOwpwcm90ZWN0ZWQ6CiAgdHlwZWRlZiB2 b2lkKiBfVm9pZF9wb2ludGVyOwoKcHVibGljOiAgICAgIAogIHR5cGVkZWYgX1RwIHZhbHVlX3R5 cGU7CiAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3QgdmFsdWVf dHlwZSogY29uc3RfcG9pbnRlcjsKICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKICB0 eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIF9MaXN0 X25vZGU8X1RwPiBfTm9kZTsKICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CiAgdHlwZWRlZiBw dHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwoKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxv Y2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9y KCkgY29uc3QgeyByZXR1cm4gX0Jhc2U6OmdldF9hbGxvY2F0b3IoKTsgfQoKcHVibGljOgogIHR5 cGVkZWYgX0xpc3RfaXRlcmF0b3I8X1RwLF9UcCYsX1RwKj4gICAgICAgICAgICAgaXRlcmF0b3I7 CiAgdHlwZWRlZiBfTGlzdF9pdGVyYXRvcjxfVHAsY29uc3QgX1RwJixjb25zdCBfVHAqPiBjb25z dF9pdGVyYXRvcjsKCgogIHR5cGVkZWYgcmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4g Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIHJldmVyc2VfaXRlcmF0b3I8aXRlcmF0 b3I+ICAgICAgIHJldmVyc2VfaXRlcmF0b3I7CgoKCgoKCgoKCnByb3RlY3RlZDoKCiAgdXNpbmcg X0Jhc2U6Ol9NX25vZGU7CiAgdXNpbmcgX0Jhc2U6Ol9NX3B1dF9ub2RlOwogIHVzaW5nIF9CYXNl OjpfTV9nZXRfbm9kZTsKCgpwcm90ZWN0ZWQ6CiAgX05vZGUqIF9NX2NyZWF0ZV9ub2RlKGNvbnN0 IF9UcCYgX194KQogIHsKICAgIF9Ob2RlKiBfX3AgPSBfTV9nZXRfbm9kZSgpOwogICAgdHJ5ICB7 CiAgICAgIGNvbnN0cnVjdCgmX19wLT5fTV9kYXRhLCBfX3gpOwogICAgfQogICAgY2F0Y2goLi4u KSB7ICBfTV9wdXRfbm9kZShfX3ApIDsgdGhyb3c7IH0gOwogICAgcmV0dXJuIF9fcDsKICB9Cgog IF9Ob2RlKiBfTV9jcmVhdGVfbm9kZSgpCiAgewogICAgX05vZGUqIF9fcCA9IF9NX2dldF9ub2Rl KCk7CiAgICB0cnkgIHsKICAgICAgY29uc3RydWN0KCZfX3AtPl9NX2RhdGEpOwogICAgfQogICAg Y2F0Y2goLi4uKSB7ICBfTV9wdXRfbm9kZShfX3ApIDsgdGhyb3c7IH0gOwogICAgcmV0dXJuIF9f cDsKICB9CgpwdWJsaWM6CiAgZXhwbGljaXQgbGlzdChjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19h ID0gYWxsb2NhdG9yX3R5cGUoKSkgOiBfQmFzZShfX2EpIHt9CgogIGl0ZXJhdG9yIGJlZ2luKCkg ICAgICAgICAgICAgeyByZXR1cm4gKF9Ob2RlKikoX01fbm9kZS0+X01fbmV4dCk7IH0KICBjb25z dF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIChfTm9kZSopKF9NX25vZGUtPl9NX25l eHQpOyB9CgogIGl0ZXJhdG9yIGVuZCgpICAgICAgICAgICAgIHsgcmV0dXJuIF9NX25vZGU7IH0K ICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9ub2RlOyB9CgogIHJldmVy c2VfaXRlcmF0b3IgcmJlZ2luKCkgCiAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgp KTsgfQogIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgCiAgICB7IHJldHVy biBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQoKICByZXZlcnNlX2l0ZXJhdG9yIHJl bmQoKQogICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQogIGNvbnN0X3Jl dmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0CiAgICB7IHJldHVybiBjb25zdF9yZXZlcnNlX2l0 ZXJhdG9yKGJlZ2luKCkpOyB9CgogIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfTV9ub2Rl LT5fTV9uZXh0ID09IF9NX25vZGU7IH0KICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKICAgIHNp emVfdHlwZSBfX3Jlc3VsdCA9IDA7CiAgICBkaXN0YW5jZShiZWdpbigpLCBlbmQoKSwgX19yZXN1 bHQpOwogICAgcmV0dXJuIF9fcmVzdWx0OwogIH0KICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25z dCB7IHJldHVybiBzaXplX3R5cGUoLTEpOyB9CgogIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJu ICpiZWdpbigpOyB9CiAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeyByZXR1cm4gKmJl Z2luKCk7IH0KICByZWZlcmVuY2UgYmFjaygpIHsgcmV0dXJuICooLS1lbmQoKSk7IH0KICBjb25z dF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0IHsgcmV0dXJuICooLS1lbmQoKSk7IH0KCiAgdm9pZCBz d2FwKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gpIHsgIDo6c3dhcChfTV9ub2RlLCBfX3guX01fbm9k ZSk7IH0KCiAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNvbnN0IF9UcCYg X194KSB7CiAgICBfTm9kZSogX190bXAgPSBfTV9jcmVhdGVfbm9kZShfX3gpOwogICAgX190bXAt Pl9NX25leHQgPSBfX3Bvc2l0aW9uLl9NX25vZGU7CiAgICBfX3RtcC0+X01fcHJldiA9IF9fcG9z aXRpb24uX01fbm9kZS0+X01fcHJldjsKICAgICgoX05vZGUqKSAoX19wb3NpdGlvbi5fTV9ub2Rl LT5fTV9wcmV2KSktPl9NX25leHQgPSBfX3RtcDsKICAgIF9fcG9zaXRpb24uX01fbm9kZS0+X01f cHJldiA9IF9fdG1wOwogICAgcmV0dXJuIF9fdG1wOwogIH0KICBpdGVyYXRvciBpbnNlcnQoaXRl cmF0b3IgX19wb3NpdGlvbikgeyByZXR1cm4gaW5zZXJ0KF9fcG9zaXRpb24sIF9UcCgpKTsgfQoK ICAgCgogIHRlbXBsYXRlPGNsYXNzIF9JbnRlZ2VyPgogIHZvaWQgX01faW5zZXJ0X2Rpc3BhdGNo KGl0ZXJhdG9yIF9fcG9zLCBfSW50ZWdlciBfX24sIF9JbnRlZ2VyIF9feCwKICAgICAgICAgICAg ICAgICAgICAgICAgICBfX3RydWVfdHlwZSkgewogICAgaW5zZXJ0KF9fcG9zLCAoc2l6ZV90eXBl KSBfX24sIChfVHApIF9feCk7CiAgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+ CiAgdm9pZCBfTV9pbnNlcnRfZGlzcGF0Y2goaXRlcmF0b3IgX19wb3MsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgX0lucHV0SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0 LAogICAgICAgICAgICAgICAgICAgICAgICAgIF9fZmFsc2VfdHlwZSk7CgogIHRlbXBsYXRlIDxj bGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGluc2VydChpdGVyYXRvciBfX3BvcywgX0lucHV0 SXRlcmF0b3IgX19maXJzdCwgX0lucHV0SXRlcmF0b3IgX19sYXN0KSB7CiAgICB0eXBlZGVmIHR5 cGVuYW1lIF9Jc19pbnRlZ2VyPF9JbnB1dEl0ZXJhdG9yPjo6X0ludGVncmFsIF9JbnRlZ3JhbDsK ICAgIF9NX2luc2VydF9kaXNwYXRjaChfX3BvcywgX19maXJzdCwgX19sYXN0LCBfSW50ZWdyYWwo KSk7CiAgfQoKCgoKCgogIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIF9fcG9zLCBzaXplX3R5cGUgX19u LCBjb25zdCBfVHAmIF9feCk7CiAKICB2b2lkIHB1c2hfZnJvbnQoY29uc3QgX1RwJiBfX3gpIHsg aW5zZXJ0KGJlZ2luKCksIF9feCk7IH0KICB2b2lkIHB1c2hfZnJvbnQoKSB7aW5zZXJ0KGJlZ2lu KCkpO30KICB2b2lkIHB1c2hfYmFjayhjb25zdCBfVHAmIF9feCkgeyBpbnNlcnQoZW5kKCksIF9f eCk7IH0KICB2b2lkIHB1c2hfYmFjaygpIHtpbnNlcnQoZW5kKCkpO30KCiAgaXRlcmF0b3IgZXJh c2UoaXRlcmF0b3IgX19wb3NpdGlvbikgewogICAgX05vZGUqIF9fbmV4dF9ub2RlID0gKF9Ob2Rl KikgKF9fcG9zaXRpb24uX01fbm9kZS0+X01fbmV4dCk7CiAgICBfTm9kZSogX19wcmV2X25vZGUg PSAoX05vZGUqKSAoX19wb3NpdGlvbi5fTV9ub2RlLT5fTV9wcmV2KTsKICAgIF9fcHJldl9ub2Rl LT5fTV9uZXh0ID0gX19uZXh0X25vZGU7CiAgICBfX25leHRfbm9kZS0+X01fcHJldiA9IF9fcHJl dl9ub2RlOwogICAgZGVzdHJveSgmX19wb3NpdGlvbi5fTV9ub2RlLT5fTV9kYXRhKTsKICAgIF9N X3B1dF9ub2RlKF9fcG9zaXRpb24uX01fbm9kZSk7CiAgICByZXR1cm4gaXRlcmF0b3IoX19uZXh0 X25vZGUpOwogIH0KICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBf X2xhc3QpOwogIHZvaWQgY2xlYXIoKSB7IF9CYXNlOjpjbGVhcigpOyB9CgogIHZvaWQgcmVzaXpl KHNpemVfdHlwZSBfX25ld19zaXplLCBjb25zdCBfVHAmIF9feCk7CiAgdm9pZCByZXNpemUoc2l6 ZV90eXBlIF9fbmV3X3NpemUpIHsgcmVzaXplKF9fbmV3X3NpemUsIF9UcCgpKTsgfQoKICB2b2lk IHBvcF9mcm9udCgpIHsgZXJhc2UoYmVnaW4oKSk7IH0KICB2b2lkIHBvcF9iYWNrKCkgeyAKICAg IGl0ZXJhdG9yIF9fdG1wID0gZW5kKCk7CiAgICBlcmFzZSgtLV9fdG1wKTsKICB9CiAgbGlzdChz aXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsdWUsCiAgICAgICBjb25zdCBhbGxvY2F0b3Jf dHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDogX0Jhc2UoX19hKQogICAgeyBpbnNl cnQoYmVnaW4oKSwgX19uLCBfX3ZhbHVlKTsgfQogIGV4cGxpY2l0IGxpc3Qoc2l6ZV90eXBlIF9f bikKICAgIDogX0Jhc2UoYWxsb2NhdG9yX3R5cGUoKSkKICAgIHsgaW5zZXJ0KGJlZ2luKCksIF9f biwgX1RwKCkpOyB9CgoKCiAgIAogICAKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+ CiAgbGlzdChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QsCiAg ICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAgIDog X0Jhc2UoX19hKQogICAgeyBpbnNlcnQoYmVnaW4oKSwgX19maXJzdCwgX19sYXN0KTsgfQoKIyA0 MzMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4v Li4vaW5jbHVkZS9nKystMy9zdGxfbGlzdC5oIiAzCgogIGxpc3QoY29uc3QgbGlzdDxfVHAsIF9B bGxvYz4mIF9feCkgOiBfQmFzZShfX3guZ2V0X2FsbG9jYXRvcigpKQogICAgeyBpbnNlcnQoYmVn aW4oKSwgX194LmJlZ2luKCksIF9feC5lbmQoKSk7IH0KCiAgfmxpc3QoKSB7IH0KCiAgbGlzdDxf VHAsIF9BbGxvYz4mIG9wZXJhdG9yPShjb25zdCBsaXN0PF9UcCwgX0FsbG9jPiYgX194KTsKCnB1 YmxpYzoKICAgCiAgIAogICAKICAgCgogIHZvaWQgYXNzaWduKHNpemVfdHlwZSBfX24sIGNvbnN0 IF9UcCYgX192YWwpOwoKCgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lk IGFzc2lnbihfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpIHsK ICAgIHR5cGVkZWYgdHlwZW5hbWUgX0lzX2ludGVnZXI8X0lucHV0SXRlcmF0b3I+OjpfSW50ZWdy YWwgX0ludGVncmFsOwogICAgX01fYXNzaWduX2Rpc3BhdGNoKF9fZmlyc3QsIF9fbGFzdCwgX0lu dGVncmFsKCkpOwogIH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnRlZ2VyPgogIHZvaWQgX01fYXNz aWduX2Rpc3BhdGNoKF9JbnRlZ2VyIF9fbiwgX0ludGVnZXIgX192YWwsIF9fdHJ1ZV90eXBlKQog ICAgeyBhc3NpZ24oKHNpemVfdHlwZSkgX19uLCAoX1RwKSBfX3ZhbCk7IH0KCiAgdGVtcGxhdGUg PGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgX01fYXNzaWduX2Rpc3BhdGNoKF9JbnB1dEl0 ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwKICAgICAgICAgICAgICAgICAg ICAgICAgICBfX2ZhbHNlX3R5cGUpOwoKCgpwcm90ZWN0ZWQ6CiAgdm9pZCB0cmFuc2ZlcihpdGVy YXRvciBfX3Bvc2l0aW9uLCBpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBfX2xhc3QpIHsKICAg IGlmIChfX3Bvc2l0aW9uICE9IF9fbGFzdCkgewogICAgICAgCiAgICAgICgoX05vZGUqKSAoX19s YXN0Ll9NX25vZGUtPl9NX3ByZXYpKS0+X01fbmV4dCAgICAgPSBfX3Bvc2l0aW9uLl9NX25vZGU7 CiAgICAgICgoX05vZGUqKSAoX19maXJzdC5fTV9ub2RlLT5fTV9wcmV2KSktPl9NX25leHQgICAg PSBfX2xhc3QuX01fbm9kZTsKICAgICAgKChfTm9kZSopIChfX3Bvc2l0aW9uLl9NX25vZGUtPl9N X3ByZXYpKS0+X01fbmV4dCA9IF9fZmlyc3QuX01fbm9kZTsgCgogICAgICAgCiAgICAgIF9Ob2Rl KiBfX3RtcCA9IChfTm9kZSopIChfX3Bvc2l0aW9uLl9NX25vZGUtPl9NX3ByZXYpOwogICAgICBf X3Bvc2l0aW9uLl9NX25vZGUtPl9NX3ByZXYgPSBfX2xhc3QuX01fbm9kZS0+X01fcHJldjsKICAg ICAgX19sYXN0Ll9NX25vZGUtPl9NX3ByZXYgICAgICA9IF9fZmlyc3QuX01fbm9kZS0+X01fcHJl djsgCiAgICAgIF9fZmlyc3QuX01fbm9kZS0+X01fcHJldiAgICA9IF9fdG1wOwogICAgfQogIH0K CnB1YmxpYzoKICB2b2lkIHNwbGljZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBsaXN0JiBfX3gpIHsK ICAgIGlmICghX194LmVtcHR5KCkpIAogICAgICB0cmFuc2ZlcihfX3Bvc2l0aW9uLCBfX3guYmVn aW4oKSwgX194LmVuZCgpKTsKICB9CiAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgX19wb3NpdGlvbiwg bGlzdCYsIGl0ZXJhdG9yIF9faSkgewogICAgaXRlcmF0b3IgX19qID0gX19pOwogICAgKytfX2o7 CiAgICBpZiAoX19wb3NpdGlvbiA9PSBfX2kgfHwgX19wb3NpdGlvbiA9PSBfX2opIHJldHVybjsK ICAgIHRyYW5zZmVyKF9fcG9zaXRpb24sIF9faSwgX19qKTsKICB9CiAgdm9pZCBzcGxpY2UoaXRl cmF0b3IgX19wb3NpdGlvbiwgbGlzdCYsIGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFz dCkgewogICAgaWYgKF9fZmlyc3QgIT0gX19sYXN0KSAKICAgICAgdHJhbnNmZXIoX19wb3NpdGlv biwgX19maXJzdCwgX19sYXN0KTsKICB9CiAgdm9pZCByZW1vdmUoY29uc3QgX1RwJiBfX3ZhbHVl KTsKICB2b2lkIHVuaXF1ZSgpOwogIHZvaWQgbWVyZ2UobGlzdCYgX194KTsKICB2b2lkIHJldmVy c2UoKTsKICB2b2lkIHNvcnQoKTsKCgogIHRlbXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPiB2b2lk IHJlbW92ZV9pZihfUHJlZGljYXRlKTsKICB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0 ZT4gdm9pZCB1bmlxdWUoX0JpbmFyeVByZWRpY2F0ZSk7CiAgdGVtcGxhdGUgPGNsYXNzIF9TdHJp Y3RXZWFrT3JkZXJpbmc+IHZvaWQgbWVyZ2UobGlzdCYsIF9TdHJpY3RXZWFrT3JkZXJpbmcpOwog IHRlbXBsYXRlIDxjbGFzcyBfU3RyaWN0V2Vha09yZGVyaW5nPiB2b2lkIHNvcnQoX1N0cmljdFdl YWtPcmRlcmluZyk7CgoKICBmcmllbmQgYm9vbCBvcGVyYXRvcj09IDw+ICAoCiAgICBjb25zdCBs aXN0JiBfX3gsIGNvbnN0IGxpc3QmIF9feSk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFz cyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgbGlzdDxfVHAsX0FsbG9jPiYg X194LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3Q8X1RwLF9BbGxvYz4mIF9feSkK ewogIHR5cGVkZWYgdHlwZW5hbWUgbGlzdDxfVHAsX0FsbG9jPjo6X05vZGUgX05vZGU7CiAgX05v ZGUqIF9fZTEgPSBfX3guX01fbm9kZTsKICBfTm9kZSogX19lMiA9IF9feS5fTV9ub2RlOwogIF9O b2RlKiBfX24xID0gKF9Ob2RlKikgX19lMS0+X01fbmV4dDsKICBfTm9kZSogX19uMiA9IChfTm9k ZSopIF9fZTItPl9NX25leHQ7CiAgZm9yICggOyBfX24xICE9IF9fZTEgJiYgX19uMiAhPSBfX2Uy IDsKICAgICAgICAgIF9fbjEgPSAoX05vZGUqKSBfX24xLT5fTV9uZXh0LCBfX24yID0gKF9Ob2Rl KikgX19uMi0+X01fbmV4dCkKICAgIGlmIChfX24xLT5fTV9kYXRhICE9IF9fbjItPl9NX2RhdGEp CiAgICAgIHJldHVybiBmYWxzZTsKICByZXR1cm4gX19uMSA9PSBfX2UxICYmIF9fbjIgPT0gX19l MjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgppbmxpbmUgYm9vbCBvcGVy YXRvcjwoY29uc3QgbGlzdDxfVHAsX0FsbG9jPiYgX194LAogICAgICAgICAgICAgICAgICAgICAg Y29uc3QgbGlzdDxfVHAsX0FsbG9jPiYgX195KQp7CiAgcmV0dXJuIGxleGljb2dyYXBoaWNhbF9j b21wYXJlKF9feC5iZWdpbigpLCBfX3guZW5kKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIF9feS5iZWdpbigpLCBfX3kuZW5kKCkpOwp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAs IGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgCnN3YXAobGlzdDxfVHAsIF9BbGxvYz4mIF9feCwg bGlzdDxfVHAsIF9BbGxvYz4mIF9feSkKewogIF9feC5zd2FwKF9feSk7Cn0KCgoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+IHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyPgp2 b2lkIApsaXN0PF9UcCwgX0FsbG9jPjo6X01faW5zZXJ0X2Rpc3BhdGNoKGl0ZXJhdG9yIF9fcG9z aXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0lucHV0SXRlciBf X2ZpcnN0LCBfSW5wdXRJdGVyIF9fbGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBfX2ZhbHNlX3R5cGUpCnsKICBmb3IgKCA7IF9fZmlyc3QgIT0gX19sYXN0OyArK19f Zmlyc3QpCiAgICBpbnNlcnQoX19wb3NpdGlvbiwgKl9fZmlyc3QpOwp9CgojIDU4MiAiL3Vzci9s aWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRl L2crKy0zL3N0bF9saXN0LmgiIDMKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+ CnZvaWQgCmxpc3Q8X1RwLCBfQWxsb2M+OjppbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlvbiwgc2l6 ZV90eXBlIF9fbiwgY29uc3QgX1RwJiBfX3gpCnsKICBmb3IgKCA7IF9fbiA+IDA7IC0tX19uKQog ICAgaW5zZXJ0KF9fcG9zaXRpb24sIF9feCk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNz IF9BbGxvYz4KbGlzdDxfVHAsX0FsbG9jPjo6aXRlcmF0b3IgbGlzdDxfVHAsIF9BbGxvYz46OmVy YXNlKGl0ZXJhdG9yIF9fZmlyc3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaXRlcmF0b3IgX19sYXN0KQp7CiAgd2hpbGUgKF9fZmlyc3QgIT0g X19sYXN0KQogICAgZXJhc2UoX19maXJzdCsrKTsKICByZXR1cm4gX19sYXN0Owp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQgbGlzdDxfVHAsIF9BbGxvYz46OnJlc2l6 ZShzaXplX3R5cGUgX19uZXdfc2l6ZSwgY29uc3QgX1RwJiBfX3gpCnsKICBpdGVyYXRvciBfX2kg PSBiZWdpbigpOwogIHNpemVfdHlwZSBfX2xlbiA9IDA7CiAgZm9yICggOyBfX2kgIT0gZW5kKCkg JiYgX19sZW4gPCBfX25ld19zaXplOyArK19faSwgKytfX2xlbikKICAgIDsKICBpZiAoX19sZW4g PT0gX19uZXdfc2l6ZSkKICAgIGVyYXNlKF9faSwgZW5kKCkpOwogIGVsc2UgICAgICAgICAgICAg ICAgICAgICAgICAgICAKICAgIGluc2VydChlbmQoKSwgX19uZXdfc2l6ZSAtIF9fbGVuLCBfX3gp Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+Cmxpc3Q8X1RwLCBfQWxsb2M+ JiBsaXN0PF9UcCwgX0FsbG9jPjo6b3BlcmF0b3I9KGNvbnN0IGxpc3Q8X1RwLCBfQWxsb2M+JiBf X3gpCnsKICBpZiAodGhpcyAhPSAmX194KSB7CiAgICBpdGVyYXRvciBfX2ZpcnN0MSA9IGJlZ2lu KCk7CiAgICBpdGVyYXRvciBfX2xhc3QxID0gZW5kKCk7CiAgICBjb25zdF9pdGVyYXRvciBfX2Zp cnN0MiA9IF9feC5iZWdpbigpOwogICAgY29uc3RfaXRlcmF0b3IgX19sYXN0MiA9IF9feC5lbmQo KTsKICAgIHdoaWxlIChfX2ZpcnN0MSAhPSBfX2xhc3QxICYmIF9fZmlyc3QyICE9IF9fbGFzdDIp IAogICAgICAqX19maXJzdDErKyA9ICpfX2ZpcnN0MisrOwogICAgaWYgKF9fZmlyc3QyID09IF9f bGFzdDIpCiAgICAgIGVyYXNlKF9fZmlyc3QxLCBfX2xhc3QxKTsKICAgIGVsc2UKICAgICAgaW5z ZXJ0KF9fbGFzdDEsIF9fZmlyc3QyLCBfX2xhc3QyKTsKICB9CiAgcmV0dXJuICp0aGlzOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQgbGlzdDxfVHAsIF9BbGxvYz46 OmFzc2lnbihzaXplX3R5cGUgX19uLCBjb25zdCBfVHAmIF9fdmFsKSB7CiAgaXRlcmF0b3IgX19p ID0gYmVnaW4oKTsKICBmb3IgKCA7IF9faSAhPSBlbmQoKSAmJiBfX24gPiAwOyArK19faSwgLS1f X24pCiAgICAqX19pID0gX192YWw7CiAgaWYgKF9fbiA+IDApCiAgICBpbnNlcnQoZW5kKCksIF9f biwgX192YWwpOwogIGVsc2UKICAgIGVyYXNlKF9faSwgZW5kKCkpOwp9CgoKCnRlbXBsYXRlIDxj bGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4gdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXI+CnZvaWQK bGlzdDxfVHAsIF9BbGxvYz46Ol9NX2Fzc2lnbl9kaXNwYXRjaChfSW5wdXRJdGVyIF9fZmlyc3Qy LCBfSW5wdXRJdGVyIF9fbGFzdDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX19mYWxzZV90eXBlKQp7CiAgaXRlcmF0b3IgX19maXJzdDEgPSBiZWdpbigpOwogIGl0ZXJh dG9yIF9fbGFzdDEgPSBlbmQoKTsKICBmb3IgKCA7IF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19m aXJzdDIgIT0gX19sYXN0MjsgKytfX2ZpcnN0MSwgKytfX2ZpcnN0MikKICAgICpfX2ZpcnN0MSA9 ICpfX2ZpcnN0MjsKICBpZiAoX19maXJzdDIgPT0gX19sYXN0MikKICAgIGVyYXNlKF9fZmlyc3Qx LCBfX2xhc3QxKTsKICBlbHNlCiAgICBpbnNlcnQoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIp Owp9CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kdm9pZCBsaXN0PF9UcCwg X0FsbG9jPjo6cmVtb3ZlKGNvbnN0IF9UcCYgX192YWx1ZSkKewogIGl0ZXJhdG9yIF9fZmlyc3Qg PSBiZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOwogIHdoaWxlIChfX2ZpcnN0ICE9 IF9fbGFzdCkgewogICAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDsKICAgICsrX19uZXh0Owog ICAgaWYgKCpfX2ZpcnN0ID09IF9fdmFsdWUpIGVyYXNlKF9fZmlyc3QpOwogICAgX19maXJzdCA9 IF9fbmV4dDsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4Kdm9pZCBs aXN0PF9UcCwgX0FsbG9jPjo6dW5pcXVlKCkKewogIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigp OwogIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOwogIGlmIChfX2ZpcnN0ID09IF9fbGFzdCkgcmV0 dXJuOwogIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CiAgd2hpbGUgKCsrX19uZXh0ICE9IF9f bGFzdCkgewogICAgaWYgKCpfX2ZpcnN0ID09ICpfX25leHQpCiAgICAgIGVyYXNlKF9fbmV4dCk7 CiAgICBlbHNlCiAgICAgIF9fZmlyc3QgPSBfX25leHQ7CiAgICBfX25leHQgPSBfX2ZpcnN0Owog IH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPgp2b2lkIGxpc3Q8X1RwLCBf QWxsb2M+OjptZXJnZShsaXN0PF9UcCwgX0FsbG9jPiYgX194KQp7CiAgaXRlcmF0b3IgX19maXJz dDEgPSBiZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKICBpdGVyYXRvciBfX2Zp cnN0MiA9IF9feC5iZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdDIgPSBfX3guZW5kKCk7CiAgd2hp bGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikKICAgIGlmICgq X19maXJzdDIgPCAqX19maXJzdDEpIHsKICAgICAgaXRlcmF0b3IgX19uZXh0ID0gX19maXJzdDI7 CiAgICAgIHRyYW5zZmVyKF9fZmlyc3QxLCBfX2ZpcnN0MiwgKytfX25leHQpOwogICAgICBfX2Zp cnN0MiA9IF9fbmV4dDsKICAgIH0KICAgIGVsc2UKICAgICAgKytfX2ZpcnN0MTsKICBpZiAoX19m aXJzdDIgIT0gX19sYXN0MikgdHJhbnNmZXIoX19sYXN0MSwgX19maXJzdDIsIF9fbGFzdDIpOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQgbGlzdDxfVHAsIF9BbGxv Yz46OnJldmVyc2UoKSAKewogICAKICBpZiAoX01fbm9kZS0+X01fbmV4dCAhPSBfTV9ub2RlICYm CiAgICAgICgoX05vZGUqKSAoX01fbm9kZS0+X01fbmV4dCkpLT5fTV9uZXh0ICE9IF9NX25vZGUp IHsKICAgIGl0ZXJhdG9yIF9fZmlyc3QgPSBiZWdpbigpOwogICAgKytfX2ZpcnN0OwogICAgd2hp bGUgKF9fZmlyc3QgIT0gZW5kKCkpIHsKICAgICAgaXRlcmF0b3IgX19vbGQgPSBfX2ZpcnN0Owog ICAgICArK19fZmlyc3Q7CiAgICAgIHRyYW5zZmVyKGJlZ2luKCksIF9fb2xkLCBfX2ZpcnN0KTsK ICAgIH0KICB9Cn0gICAgCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2M+CnZvaWQg bGlzdDxfVHAsIF9BbGxvYz46OnNvcnQoKQp7CiAgIAogIGlmIChfTV9ub2RlLT5fTV9uZXh0ICE9 IF9NX25vZGUgJiYKICAgICAgKChfTm9kZSopIChfTV9ub2RlLT5fTV9uZXh0KSktPl9NX25leHQg IT0gX01fbm9kZSkgewogICAgbGlzdDxfVHAsIF9BbGxvYz4gX19jYXJyeTsKICAgIGxpc3Q8X1Rw LCBfQWxsb2M+IF9fY291bnRlcls2NF07CiAgICBpbnQgX19maWxsID0gMDsKICAgIHdoaWxlICgh ZW1wdHkoKSkgewogICAgICBfX2NhcnJ5LnNwbGljZShfX2NhcnJ5LmJlZ2luKCksICp0aGlzLCBi ZWdpbigpKTsKICAgICAgaW50IF9faSA9IDA7CiAgICAgIHdoaWxlKF9faSA8IF9fZmlsbCAmJiAh X19jb3VudGVyW19faV0uZW1wdHkoKSkgewogICAgICAgIF9fY291bnRlcltfX2ldLm1lcmdlKF9f Y2FycnkpOwogICAgICAgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19pKytdKTsKICAgICAgfQog ICAgICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOyAgICAgICAgIAogICAgICBpZiAoX19p ID09IF9fZmlsbCkgKytfX2ZpbGw7CiAgICB9IAoKICAgIGZvciAoaW50IF9faSA9IDE7IF9faSA8 IF9fZmlsbDsgKytfX2kpCiAgICAgIF9fY291bnRlcltfX2ldLm1lcmdlKF9fY291bnRlcltfX2kt MV0pOwogICAgc3dhcChfX2NvdW50ZXJbX19maWxsLTFdKTsKICB9Cn0KCgoKdGVtcGxhdGUgPGNs YXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4Kdm9pZCBs aXN0PF9UcCwgX0FsbG9jPjo6cmVtb3ZlX2lmKF9QcmVkaWNhdGUgX19wcmVkKQp7CiAgaXRlcmF0 b3IgX19maXJzdCA9IGJlZ2luKCk7CiAgaXRlcmF0b3IgX19sYXN0ID0gZW5kKCk7CiAgd2hpbGUg KF9fZmlyc3QgIT0gX19sYXN0KSB7CiAgICBpdGVyYXRvciBfX25leHQgPSBfX2ZpcnN0OwogICAg KytfX25leHQ7CiAgICBpZiAoX19wcmVkKCpfX2ZpcnN0KSkgZXJhc2UoX19maXJzdCk7CiAgICBf X2ZpcnN0ID0gX19uZXh0OwogIH0KfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9j PiB0ZW1wbGF0ZSA8Y2xhc3MgX0JpbmFyeVByZWRpY2F0ZT4Kdm9pZCBsaXN0PF9UcCwgX0FsbG9j Pjo6dW5pcXVlKF9CaW5hcnlQcmVkaWNhdGUgX19iaW5hcnlfcHJlZCkKewogIGl0ZXJhdG9yIF9f Zmlyc3QgPSBiZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdCA9IGVuZCgpOwogIGlmIChfX2ZpcnN0 ID09IF9fbGFzdCkgcmV0dXJuOwogIGl0ZXJhdG9yIF9fbmV4dCA9IF9fZmlyc3Q7CiAgd2hpbGUg KCsrX19uZXh0ICE9IF9fbGFzdCkgewogICAgaWYgKF9fYmluYXJ5X3ByZWQoKl9fZmlyc3QsICpf X25leHQpKQogICAgICBlcmFzZShfX25leHQpOwogICAgZWxzZQogICAgICBfX2ZpcnN0ID0gX19u ZXh0OwogICAgX19uZXh0ID0gX19maXJzdDsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIGNs YXNzIF9BbGxvYz4gdGVtcGxhdGUgPGNsYXNzIF9TdHJpY3RXZWFrT3JkZXJpbmc+CnZvaWQgbGlz dDxfVHAsIF9BbGxvYz46Om1lcmdlKGxpc3Q8X1RwLCBfQWxsb2M+JiBfX3gsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9TdHJpY3RXZWFrT3JkZXJpbmcgX19jb21wKQp7CiAgaXRlcmF0 b3IgX19maXJzdDEgPSBiZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdDEgPSBlbmQoKTsKICBpdGVy YXRvciBfX2ZpcnN0MiA9IF9feC5iZWdpbigpOwogIGl0ZXJhdG9yIF9fbGFzdDIgPSBfX3guZW5k KCk7CiAgd2hpbGUgKF9fZmlyc3QxICE9IF9fbGFzdDEgJiYgX19maXJzdDIgIT0gX19sYXN0MikK ICAgIGlmIChfX2NvbXAoKl9fZmlyc3QyLCAqX19maXJzdDEpKSB7CiAgICAgIGl0ZXJhdG9yIF9f bmV4dCA9IF9fZmlyc3QyOwogICAgICB0cmFuc2ZlcihfX2ZpcnN0MSwgX19maXJzdDIsICsrX19u ZXh0KTsKICAgICAgX19maXJzdDIgPSBfX25leHQ7CiAgICB9CiAgICBlbHNlCiAgICAgICsrX19m aXJzdDE7CiAgaWYgKF9fZmlyc3QyICE9IF9fbGFzdDIpIHRyYW5zZmVyKF9fbGFzdDEsIF9fZmly c3QyLCBfX2xhc3QyKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jPiB0ZW1w bGF0ZSA8Y2xhc3MgX1N0cmljdFdlYWtPcmRlcmluZz4Kdm9pZCBsaXN0PF9UcCwgX0FsbG9jPjo6 c29ydChfU3RyaWN0V2Vha09yZGVyaW5nIF9fY29tcCkKewogICAKICBpZiAoX01fbm9kZS0+X01f bmV4dCAhPSBfTV9ub2RlICYmCiAgICAgICgoX05vZGUqKSAoX01fbm9kZS0+X01fbmV4dCkpLT5f TV9uZXh0ICE9IF9NX25vZGUpIHsKICAgIGxpc3Q8X1RwLCBfQWxsb2M+IF9fY2Fycnk7CiAgICBs aXN0PF9UcCwgX0FsbG9jPiBfX2NvdW50ZXJbNjRdOwogICAgaW50IF9fZmlsbCA9IDA7CiAgICB3 aGlsZSAoIWVtcHR5KCkpIHsKICAgICAgX19jYXJyeS5zcGxpY2UoX19jYXJyeS5iZWdpbigpLCAq dGhpcywgYmVnaW4oKSk7CiAgICAgIGludCBfX2kgPSAwOwogICAgICB3aGlsZShfX2kgPCBfX2Zp bGwgJiYgIV9fY291bnRlcltfX2ldLmVtcHR5KCkpIHsKICAgICAgICBfX2NvdW50ZXJbX19pXS5t ZXJnZShfX2NhcnJ5LCBfX2NvbXApOwogICAgICAgIF9fY2Fycnkuc3dhcChfX2NvdW50ZXJbX19p KytdKTsKICAgICAgfQogICAgICBfX2NhcnJ5LnN3YXAoX19jb3VudGVyW19faV0pOyAgICAgICAg IAogICAgICBpZiAoX19pID09IF9fZmlsbCkgKytfX2ZpbGw7CiAgICB9IAoKICAgIGZvciAoaW50 IF9faSA9IDE7IF9faSA8IF9fZmlsbDsgKytfX2kpIAogICAgICBfX2NvdW50ZXJbX19pXS5tZXJn ZShfX2NvdW50ZXJbX19pLTFdLCBfX2NvbXApOwogICAgc3dhcChfX2NvdW50ZXJbX19maWxsLTFd KTsKICB9Cn0KCgoKCgoKCgogIAoKCgogCiAKIAojIDM0ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYt bWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvbGlzdCIgMiAz CgoKCgogCiAKIAojIDQ5ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXZhbHVlbGlzdC5oIiAyCgoK CiAKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgUVZhbHVlTGlzdE5vZGUKewpwdWJsaWM6 CiAgICBRVmFsdWVMaXN0Tm9kZSggY29uc3QgVCYgdCApIDogZGF0YSggdCApIHsgfQogICAgUVZh bHVlTGlzdE5vZGUoKSB7IH0KCgoKCgogICAgUVZhbHVlTGlzdE5vZGU8VD4qIG5leHQ7CiAgICBR VmFsdWVMaXN0Tm9kZTxUPiogcHJldjsKICAgIFQgZGF0YTsKfTsKCnRlbXBsYXRlPGNsYXNzIFQ+ CmNsYXNzIFFWYWx1ZUxpc3RJdGVyYXRvcgp7CiBwdWJsaWM6CiAgICAgCgoKICAgIHR5cGVkZWYg UVZhbHVlTGlzdE5vZGU8VD4qIE5vZGVQdHI7CgogICAgdHlwZWRlZiBzdGQ6OmJpZGlyZWN0aW9u YWxfaXRlcmF0b3JfdGFnICBpdGVyYXRvcl9jYXRlZ29yeTsKCiAgICB0eXBlZGVmIFQgICAgICAg IHZhbHVlX3R5cGU7CiAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CgogICAgdHlwZWRlZiBw dHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKCgoKICAgIHR5cGVkZWYgVCogICBwb2ludGVyOwog ICAgdHlwZWRlZiBUJiByZWZlcmVuY2U7CgogICAgIAoKCiAgICBOb2RlUHRyIG5vZGU7CgogICAg IAoKCiAgICBRVmFsdWVMaXN0SXRlcmF0b3IoKSA6IG5vZGUoIDAgKSB7fQogICAgUVZhbHVlTGlz dEl0ZXJhdG9yKCBOb2RlUHRyIHAgKSA6IG5vZGUoIHAgKSB7fQogICAgUVZhbHVlTGlzdEl0ZXJh dG9yKCBjb25zdCBRVmFsdWVMaXN0SXRlcmF0b3I8VD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkg e30KCiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiYgaXQg KSBjb25zdCB7IHJldHVybiBub2RlID09IGl0Lm5vZGU7IH0KICAgIGJvb2wgb3BlcmF0b3IhPSgg Y29uc3QgUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+JiBpdCApIGNvbnN0IHsgcmV0dXJuIG5vZGUgIT0g aXQubm9kZTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gbm9kZS0+ ZGF0YTsgfQogICAgVCYgb3BlcmF0b3IqKCkgeyByZXR1cm4gbm9kZS0+ZGF0YTsgfQogICAgIAog ICAgIAoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygpIHsKCW5vZGUgPSBu b2RlLT5uZXh0OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxU PiBvcGVyYXRvcisrKGludCkgewoJUVZhbHVlTGlzdEl0ZXJhdG9yPFQ+IHRtcCA9ICp0aGlzOwoJ bm9kZSA9IG5vZGUtPm5leHQ7CglyZXR1cm4gdG1wOwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVy YXRvcjxUPiYgb3BlcmF0b3ItLSgpIHsKCW5vZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuICp0aGlz OwogICAgfQoKICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiBvcGVyYXRvci0tKGludCkgewoJUVZh bHVlTGlzdEl0ZXJhdG9yPFQ+IHRtcCA9ICp0aGlzOwoJbm9kZSA9IG5vZGUtPnByZXY7CglyZXR1 cm4gdG1wOwogICAgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgUVZhbHVlTGlzdENvbnN0 SXRlcmF0b3IKewogcHVibGljOgogICAgIAoKCiAgICB0eXBlZGVmIFFWYWx1ZUxpc3ROb2RlPFQ+ KiBOb2RlUHRyOwoKICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZyAg aXRlcmF0b3JfY2F0ZWdvcnk7CgogICAgdHlwZWRlZiBUICAgICAgICB2YWx1ZV90eXBlOwogICAg dHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwoKICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJl bmNlX3R5cGU7CgoKCiAgICB0eXBlZGVmIGNvbnN0IFQqICAgcG9pbnRlcjsKICAgIHR5cGVkZWYg Y29uc3QgVCYgcmVmZXJlbmNlOwoKICAgICAKCgogICAgTm9kZVB0ciBub2RlOwoKICAgICAKCgog ICAgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3IoKSA6IG5vZGUoIDAgKSB7fQogICAgUVZhbHVlTGlz dENvbnN0SXRlcmF0b3IoIE5vZGVQdHIgcCApIDogbm9kZSggcCApIHt9CiAgICBRVmFsdWVMaXN0 Q29uc3RJdGVyYXRvciggY29uc3QgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4mIGl0ICkgOiBu b2RlKCBpdC5ub2RlICkge30KICAgIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yKCBjb25zdCBRVmFs dWVMaXN0SXRlcmF0b3I8VD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkge30KCiAgICBib29sIG9w ZXJhdG9yPT0oIGNvbnN0IFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+JiBpdCApIGNvbnN0IHsg cmV0dXJuIG5vZGUgPT0gaXQubm9kZTsgfQogICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRVmFs dWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgaXQgKSBjb25zdCB7IHJldHVybiBub2RlICE9IGl0Lm5v ZGU7IH0KICAgIGNvbnN0IFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIG5vZGUtPmRhdGE7 IH0KICAgICAKICAgICAKCiAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3Ir KygpIHsKCW5vZGUgPSBub2RlLT5uZXh0OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1 ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+IG9wZXJhdG9yKysoaW50KSB7CglRVmFsdWVMaXN0Q29uc3RJ dGVyYXRvcjxUPiB0bXAgPSAqdGhpczsKCW5vZGUgPSBub2RlLT5uZXh0OwoJcmV0dXJuIHRtcDsK ICAgIH0KCiAgICBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiYgb3BlcmF0b3ItLSgpIHsKCW5v ZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3RDb25z dEl0ZXJhdG9yPFQ+IG9wZXJhdG9yLS0oaW50KSB7CglRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxU PiB0bXAgPSAqdGhpczsKCW5vZGUgPSBub2RlLT5wcmV2OwoJcmV0dXJuIHRtcDsKICAgIH0KfTsK CnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBRVmFsdWVMaXN0UHJpdmF0ZSAKICAgIDogcHVibGlj IFFTaGFyZWQKewpwdWJsaWM6CiAgICAgCgoKICAgIHR5cGVkZWYgUVZhbHVlTGlzdEl0ZXJhdG9y PFQ+IEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRVmFsdWVMaXN0Q29uc3RJdGVyYXRvcjxUPiBDb25z dEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRVmFsdWVMaXN0Tm9kZTxUPiBOb2RlOwogICAgdHlwZWRl ZiBRVmFsdWVMaXN0Tm9kZTxUPiogTm9kZVB0cjsKICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlw ZTsKCiAgICAgCgoKICAgIFFWYWx1ZUxpc3RQcml2YXRlKCk7CiAgICBRVmFsdWVMaXN0UHJpdmF0 ZSggY29uc3QgUVZhbHVlTGlzdFByaXZhdGU8VD4mIF9wICk7CgogICAgdm9pZCBkZXJlZkFuZERl bGV0ZSgpICAKICAgIHsKCWlmICggZGVyZWYoKSApCgkgICAgZGVsZXRlIHRoaXM7CiAgICB9CgoK CgoKICAgIH5RVmFsdWVMaXN0UHJpdmF0ZSgpOwoKICAgIEl0ZXJhdG9yIGluc2VydCggSXRlcmF0 b3IgaXQsIGNvbnN0IFQmIHggKTsKICAgIEl0ZXJhdG9yIHJlbW92ZSggSXRlcmF0b3IgaXQgKTsK ICAgIE5vZGVQdHIgZmluZCggTm9kZVB0ciBzdGFydCwgY29uc3QgVCYgeCApIGNvbnN0OwogICAg aW50IGZpbmRJbmRleCggTm9kZVB0ciBzdGFydCwgY29uc3QgVCYgeCApIGNvbnN0OwogICAgdWlu dCBjb250YWlucyggY29uc3QgVCYgeCApIGNvbnN0OwogICAgdWludCByZW1vdmUoIGNvbnN0IFQm IHggKTsKICAgIE5vZGVQdHIgYXQoIHNpemVfdHlwZSBpICkgY29uc3Q7CiAgICB2b2lkIGNsZWFy KCk7CgogICAgTm9kZVB0ciBub2RlOwogICAgc2l6ZV90eXBlIG5vZGVzOwp9OwoKdGVtcGxhdGUg PGNsYXNzIFQ+CiAgUVZhbHVlTGlzdFByaXZhdGU8VD46OlFWYWx1ZUxpc3RQcml2YXRlKCkKewog ICAgbm9kZSA9IG5ldyBOb2RlOyBub2RlLT5uZXh0ID0gbm9kZS0+cHJldiA9IG5vZGU7IG5vZGVz ID0gMDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgUVZhbHVlTGlzdFByaXZhdGU8VD46OlFWYWx1 ZUxpc3RQcml2YXRlKCBjb25zdCBRVmFsdWVMaXN0UHJpdmF0ZTxUPiYgX3AgKQogICAgOiBRU2hh cmVkKCkKewogICAgbm9kZSA9IG5ldyBOb2RlOyBub2RlLT5uZXh0ID0gbm9kZS0+cHJldiA9IG5v ZGU7IG5vZGVzID0gMDsKICAgIEl0ZXJhdG9yIGIoIF9wLm5vZGUtPm5leHQgKTsKICAgIEl0ZXJh dG9yIGUoIF9wLm5vZGUgKTsKICAgIEl0ZXJhdG9yIGkoIG5vZGUgKTsKICAgIHdoaWxlKCBiICE9 IGUgKQoJaW5zZXJ0KCBpLCAqYisrICk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIFFWYWx1ZUxp c3RQcml2YXRlPFQ+Ojp+UVZhbHVlTGlzdFByaXZhdGUoKSB7CiAgICBOb2RlUHRyIHAgPSBub2Rl LT5uZXh0OwogICAgd2hpbGUoIHAgIT0gbm9kZSApIHsKCU5vZGVQdHIgeCA9IHAtPm5leHQ7Cglk ZWxldGUgcDsKCXAgPSB4OwogICAgfQogICAgZGVsZXRlIG5vZGU7Cn0KCnRlbXBsYXRlIDxjbGFz cyBUPgogIHR5cGVuYW1lICBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6SXRlcmF0b3IgUVZhbHVlTGlz dFByaXZhdGU8VD46Omluc2VydCggdHlwZW5hbWUgIFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjpJdGVy YXRvciBpdCwgY29uc3QgVCYgeCApCnsKICAgIE5vZGVQdHIgcCA9IG5ldyBOb2RlKCB4ICk7CiAg ICBwLT5uZXh0ID0gaXQubm9kZTsKICAgIHAtPnByZXYgPSBpdC5ub2RlLT5wcmV2OwogICAgaXQu bm9kZS0+cHJldi0+bmV4dCA9IHA7CiAgICBpdC5ub2RlLT5wcmV2ID0gcDsKICAgIG5vZGVzKys7 CiAgICByZXR1cm4gcDsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgdHlwZW5hbWUgIFFWYWx1ZUxp c3RQcml2YXRlPFQ+OjpJdGVyYXRvciBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6cmVtb3ZlKCB0eXBl bmFtZSAgUVZhbHVlTGlzdFByaXZhdGU8VD46Okl0ZXJhdG9yIGl0ICkKewogICAgKCggIGl0Lm5v ZGUgIT0gbm9kZSAgKSA/ICh2b2lkKTAgOiBxV2FybmluZygiQVNTRVJUOiBcIiVzXCIgaW4gJXMg KCVkKSIsIml0Lm5vZGUgIT0gbm9kZSIsIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdmFsdWVsaXN0 LmgiLDI4OSkpIDsKICAgIE5vZGVQdHIgbmV4dCA9IGl0Lm5vZGUtPm5leHQ7CiAgICBOb2RlUHRy IHByZXYgPSBpdC5ub2RlLT5wcmV2OwogICAgcHJldi0+bmV4dCA9IG5leHQ7CiAgICBuZXh0LT5w cmV2ID0gcHJldjsKICAgIGRlbGV0ZSBpdC5ub2RlOwogICAgbm9kZXMtLTsKICAgIHJldHVybiBJ dGVyYXRvciggbmV4dCApOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICB0eXBlbmFtZSAgUVZhbHVl TGlzdFByaXZhdGU8VD46Ok5vZGVQdHIgUVZhbHVlTGlzdFByaXZhdGU8VD46OmZpbmQoIHR5cGVu YW1lICBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6Tm9kZVB0ciBzdGFydCwgY29uc3QgVCYgeCApIGNv bnN0CnsKICAgIENvbnN0SXRlcmF0b3IgZmlyc3QoIHN0YXJ0ICk7CiAgICBDb25zdEl0ZXJhdG9y IGxhc3QoIG5vZGUgKTsKICAgIHdoaWxlKCBmaXJzdCAhPSBsYXN0KSB7CglpZiAoICpmaXJzdCA9 PSB4ICkKCSAgICByZXR1cm4gZmlyc3Qubm9kZTsKCSsrZmlyc3Q7CiAgICB9CiAgICByZXR1cm4g bGFzdC5ub2RlOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBpbnQgUVZhbHVlTGlzdFByaXZhdGU8 VD46OmZpbmRJbmRleCggdHlwZW5hbWUgIFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjpOb2RlUHRyIHN0 YXJ0LCBjb25zdCBUJiB4ICkgY29uc3QKewogICAgQ29uc3RJdGVyYXRvciBmaXJzdCggc3RhcnQg KTsKICAgIENvbnN0SXRlcmF0b3IgbGFzdCggbm9kZSApOwogICAgaW50IHBvcyA9IDA7CiAgICB3 aGlsZSggZmlyc3QgIT0gbGFzdCkgewoJaWYgKCAqZmlyc3QgPT0geCApCgkgICAgcmV0dXJuIHBv czsKCSsrZmlyc3Q7CgkrK3BvczsKICAgIH0KICAgIHJldHVybiAtMTsKfQoKdGVtcGxhdGUgPGNs YXNzIFQ+CiAgdWludCBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6Y29udGFpbnMoIGNvbnN0IFQmIHgg KSBjb25zdAp7CiAgICB1aW50IHJlc3VsdCA9IDA7CiAgICBJdGVyYXRvciBmaXJzdCA9IEl0ZXJh dG9yKCBub2RlLT5uZXh0ICk7CiAgICBJdGVyYXRvciBsYXN0ID0gSXRlcmF0b3IoIG5vZGUgKTsK ICAgIHdoaWxlKCBmaXJzdCAhPSBsYXN0KSB7CglpZiAoICpmaXJzdCA9PSB4ICkKCSAgICArK3Jl c3VsdDsKCSsrZmlyc3Q7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8Y2xh c3MgVD4KICB1aW50IFFWYWx1ZUxpc3RQcml2YXRlPFQ+OjpyZW1vdmUoIGNvbnN0IFQmIHggKQp7 CiAgICB1aW50IHJlc3VsdCA9IDA7CiAgICBJdGVyYXRvciBmaXJzdCA9IEl0ZXJhdG9yKCBub2Rl LT5uZXh0ICk7CiAgICBJdGVyYXRvciBsYXN0ID0gSXRlcmF0b3IoIG5vZGUgKTsKICAgIHdoaWxl KCBmaXJzdCAhPSBsYXN0KSB7CglpZiAoICpmaXJzdCA9PSB4ICkgewoJICAgIGZpcnN0ID0gcmVt b3ZlKCBmaXJzdCApOwoJICAgICsrcmVzdWx0OwoJfSBlbHNlCgkgICAgKytmaXJzdDsKICAgIH0K ICAgIHJldHVybiByZXN1bHQ7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIHR5cGVuYW1lICBRVmFs dWVMaXN0UHJpdmF0ZTxUPjo6Tm9kZVB0ciBRVmFsdWVMaXN0UHJpdmF0ZTxUPjo6YXQoIHNpemVf dHlwZSBpICkgY29uc3QKewogICAgKCggIGkgPD0gbm9kZXMgICkgPyAodm9pZCkwIDogcVdhcm5p bmcoIkFTU0VSVDogXCIlc1wiIGluICVzICglZCkiLCJpIDw9IG5vZGVzIiwiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3F2YWx1ZWxpc3QuaCIsMzYwKSkgOwogICAgTm9kZVB0ciBwID0gbm9kZS0+bmV4 dDsKICAgIGZvciggc2l6ZV90eXBlIHggPSAwOyB4IDwgaTsgKyt4ICkKCXAgPSBwLT5uZXh0Owog ICAgcmV0dXJuIHA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIHZvaWQgUVZhbHVlTGlzdFByaXZh dGU8VD46OmNsZWFyKCkKewogICAgbm9kZXMgPSAwOwogICAgTm9kZVB0ciBwID0gbm9kZS0+bmV4 dDsKICAgIHdoaWxlKCBwICE9IG5vZGUgKSB7CglOb2RlUHRyIG5leHQgPSBwLT5uZXh0OwoJZGVs ZXRlIHA7CglwID0gbmV4dDsKICAgIH0KICAgIG5vZGUtPm5leHQgPSBub2RlLT5wcmV2ID0gbm9k ZTsKfQoKCgoKCgoKCgoKCgoKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBRVmFsdWVMaXN0CnsK cHVibGljOgogICAgIAoKCiAgICB0eXBlZGVmIFFWYWx1ZUxpc3RJdGVyYXRvcjxUPiBpdGVyYXRv cjsKICAgIHR5cGVkZWYgUVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4gY29uc3RfaXRlcmF0b3I7 CiAgICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKICAgIHR5cGVkZWYgdmFsdWVfdHlwZSogcG9pbnRl cjsKICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKICAgIHR5cGVk ZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwogICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiBj b25zdF9yZWZlcmVuY2U7CiAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7CgogICAgdHlwZWRl ZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKCgoKCiAgICAgCgoKICAgIFFWYWx1ZUxpc3Qo KSB7IHNoID0gbmV3IFFWYWx1ZUxpc3RQcml2YXRlPFQ+OyB9CiAgICBRVmFsdWVMaXN0KCBjb25z dCBRVmFsdWVMaXN0PFQ+JiBsICkgeyBzaCA9IGwuc2g7IHNoLT5yZWYoKTsgfQoKCgoKCiAgICBR VmFsdWVMaXN0KCBjb25zdCB0eXBlbmFtZSAgc3RkOjpsaXN0PFQ+JiBsICkKICAgIHsKCXNoID0g bmV3IFFWYWx1ZUxpc3RQcml2YXRlPFQ+OwoJcUNvcHkoIGwuYmVnaW4oKSwgbC5lbmQoKSwgc3Rk OjpiYWNrX2luc2VydGVyKCAqdGhpcyApICk7CiAgICB9CgogICAgflFWYWx1ZUxpc3QoKSB7IHNo LT5kZXJlZkFuZERlbGV0ZSgpOyB9CgogICAgUVZhbHVlTGlzdDxUPiYgb3BlcmF0b3I9ICggY29u c3QgUVZhbHVlTGlzdDxUPiYgbCApCiAgICB7CglsLnNoLT5yZWYoKTsKCXNoLT5kZXJlZkFuZERl bGV0ZSgpOwoJc2ggPSBsLnNoOwoJcmV0dXJuICp0aGlzOwogICAgfQoKICAgIFFWYWx1ZUxpc3Q8 VD4mIG9wZXJhdG9yPSAoIGNvbnN0IHR5cGVuYW1lICBzdGQ6Omxpc3Q8VD4mIGwgKQogICAgewoJ ZGV0YWNoKCk7CglxQ29weSggbC5iZWdpbigpLCBsLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIo ICp0aGlzICkgKTsKCXJldHVybiAqdGhpczsKICAgIH0KICAgIGJvb2wgb3BlcmF0b3I9PSAoIGNv bnN0IHR5cGVuYW1lICBzdGQ6Omxpc3Q8VD4mIGwgKSBjb25zdAogICAgewoJaWYgKCBzaXplKCkg IT0gbC5zaXplKCkgKQoJICAgIHJldHVybiBGQUxTRTsKCWNvbnN0X2l0ZXJhdG9yIGl0MiA9IGJl Z2luKCk7CgoJdHlwZW5hbWUKCglzdGQ6Omxpc3Q8VD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbC5i ZWdpbigpOwoJZm9yICggOyBpdDIgIT0gZW5kKCk7ICsraXQyLCArK2l0ICkKCWlmICggISgoKml0 MikgPT0gKCppdCkpICkKCSAgICByZXR1cm4gRkFMU0U7CglyZXR1cm4gVFJVRTsKICAgIH0KCgoK CgogICAgYm9vbCBvcGVyYXRvcj09ICggY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApIGNvbnN0Owog ICAgYm9vbCBvcGVyYXRvciE9ICggY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApIGNvbnN0IHsgcmV0 dXJuICEoICp0aGlzID09IGwgKTsgfQogICAgaXRlcmF0b3IgYmVnaW4oKSB7IGRldGFjaCgpOyBy ZXR1cm4gaXRlcmF0b3IoIHNoLT5ub2RlLT5uZXh0ICk7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGJl Z2luKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoIHNoLT5ub2RlLT5uZXh0ICk7IH0K ICAgIGl0ZXJhdG9yIGVuZCgpIHsgZGV0YWNoKCk7IHJldHVybiBpdGVyYXRvciggc2gtPm5vZGUg KTsgfQogICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0 b3IoIHNoLT5ub2RlICk7IH0KICAgIGl0ZXJhdG9yIGluc2VydCggaXRlcmF0b3IgaXQsIGNvbnN0 IFQmIHggKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPmluc2VydCggaXQsIHggKTsgfQogICAgdWlu dCByZW1vdmUoIGNvbnN0IFQmIHggKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPnJlbW92ZSggeCAp OyB9CiAgICB2b2lkIGNsZWFyKCk7CgogICAgUVZhbHVlTGlzdDxUPiYgb3BlcmF0b3I8PCAoIGNv bnN0IFQmIHggKQogICAgewoJYXBwZW5kKCB4ICk7CglyZXR1cm4gKnRoaXM7CiAgICB9CgogICAg c2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBzaC0+bm9kZXM7IH0KICAgIGJvb2wgZW1w dHkoKSBjb25zdCB7IHJldHVybiBzaC0+bm9kZXMgPT0gMDsgfQogICAgdm9pZCBwdXNoX2Zyb250 KCBjb25zdCBUJiB4ICkgeyBkZXRhY2goKTsgc2gtPmluc2VydCggYmVnaW4oKSwgeCApOyB9CiAg ICB2b2lkIHB1c2hfYmFjayggY29uc3QgVCYgeCApIHsgZGV0YWNoKCk7IHNoLT5pbnNlcnQoIGVu ZCgpLCB4ICk7IH0KICAgIGl0ZXJhdG9yIGVyYXNlKCBpdGVyYXRvciBwb3MgKSB7IGRldGFjaCgp OyByZXR1cm4gc2gtPnJlbW92ZSggcG9zICk7IH0KICAgIGl0ZXJhdG9yIGVyYXNlKCBpdGVyYXRv ciBmaXJzdCwgaXRlcmF0b3IgbGFzdCApOwogICAgcmVmZXJlbmNlIGZyb250KCkgeyAgOyByZXR1 cm4gKmJlZ2luKCk7IH0KICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgIDsgcmV0 dXJuICpiZWdpbigpOyB9CiAgICByZWZlcmVuY2UgYmFjaygpIHsgIDsgcmV0dXJuICooLS1lbmQo KSk7IH0KICAgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyAgOyByZXR1cm4gKigtLWVu ZCgpKTsgfQogICAgdm9pZCBwb3BfZnJvbnQoKSB7ICA7IGVyYXNlKCBiZWdpbigpICk7IH0KICAg IHZvaWQgcG9wX2JhY2soKSB7CgkgOwoJaXRlcmF0b3IgdG1wID0gZW5kKCk7CgllcmFzZSggLS10 bXAgKTsKICAgIH0KICAgIHZvaWQgaW5zZXJ0KCBpdGVyYXRvciBwb3MsIHNpemVfdHlwZSBuLCBj b25zdCBUJiB4ICk7CiAgICAgCiAgICAgCiAgICAgCiAgICAgCgoKCgoKCiAgICBRVmFsdWVMaXN0 PFQ+IG9wZXJhdG9yKyAoIGNvbnN0IFFWYWx1ZUxpc3Q8VD4mIGwgKSBjb25zdDsKICAgIFFWYWx1 ZUxpc3Q8VD4mIG9wZXJhdG9yKz0gKCBjb25zdCBRVmFsdWVMaXN0PFQ+JiBsICk7CgogICAgaXRl cmF0b3IgZnJvbUxhc3QoKSB7IGRldGFjaCgpOyByZXR1cm4gaXRlcmF0b3IoIHNoLT5ub2RlLT5w cmV2ICk7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGZyb21MYXN0KCkgY29uc3QgeyByZXR1cm4gY29u c3RfaXRlcmF0b3IoIHNoLT5ub2RlLT5wcmV2ICk7IH0KCiAgICBib29sIGlzRW1wdHkoKSBjb25z dCB7IHJldHVybiAoIHNoLT5ub2RlcyA9PSAwICk7IH0KCiAgICBpdGVyYXRvciBhcHBlbmQoIGNv bnN0IFQmIHggKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPmluc2VydCggZW5kKCksIHggKTsgfQog ICAgaXRlcmF0b3IgcHJlcGVuZCggY29uc3QgVCYgeCApIHsgZGV0YWNoKCk7IHJldHVybiBzaC0+ aW5zZXJ0KCBiZWdpbigpLCB4ICk7IH0KCiAgICBpdGVyYXRvciByZW1vdmUoIGl0ZXJhdG9yIGl0 ICkgeyBkZXRhY2goKTsgcmV0dXJuIHNoLT5yZW1vdmUoIGl0ICk7IH0KCiAgICBUJiBmaXJzdCgp IHsgIDsgZGV0YWNoKCk7IHJldHVybiBzaC0+bm9kZS0+bmV4dC0+ZGF0YTsgfQogICAgY29uc3Qg VCYgZmlyc3QoKSBjb25zdCB7ICA7IHJldHVybiBzaC0+bm9kZS0+bmV4dC0+ZGF0YTsgfQogICAg VCYgbGFzdCgpIHsgIDsgZGV0YWNoKCk7IHJldHVybiBzaC0+bm9kZS0+cHJldi0+ZGF0YTsgfQog ICAgY29uc3QgVCYgbGFzdCgpIGNvbnN0IHsgIDsgcmV0dXJuIHNoLT5ub2RlLT5wcmV2LT5kYXRh OyB9CgogICAgVCYgb3BlcmF0b3JbXSAoIHNpemVfdHlwZSBpICkgeyAgOyBkZXRhY2goKTsgcmV0 dXJuIHNoLT5hdChpKS0+ZGF0YTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3JbXSAoIHNpemVfdHlw ZSBpICkgY29uc3QgeyAgOyByZXR1cm4gc2gtPmF0KGkpLT5kYXRhOyB9CiAgICBpdGVyYXRvciBh dCggc2l6ZV90eXBlIGkgKSB7ICA7IGRldGFjaCgpOyByZXR1cm4gaXRlcmF0b3IoIHNoLT5hdChp KSApOyB9CiAgICBjb25zdF9pdGVyYXRvciBhdCggc2l6ZV90eXBlIGkgKSBjb25zdCB7ICA7IHJl dHVybiBjb25zdF9pdGVyYXRvciggc2gtPmF0KGkpICk7IH0KICAgIGl0ZXJhdG9yIGZpbmQgKCBj b25zdCBUJiB4ICkgeyBkZXRhY2goKTsgcmV0dXJuIGl0ZXJhdG9yKCBzaC0+ZmluZCggc2gtPm5v ZGUtPm5leHQsIHgpICk7IH0KICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQgKCBjb25zdCBUJiB4ICkg Y29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoIHNoLT5maW5kKCBzaC0+bm9kZS0+bmV4dCwg eCkgKTsgfQogICAgaXRlcmF0b3IgZmluZCAoIGl0ZXJhdG9yIGl0LCBjb25zdCBUJiB4ICkgeyBk ZXRhY2goKTsgcmV0dXJuIGl0ZXJhdG9yKCBzaC0+ZmluZCggaXQubm9kZSwgeCApICk7IH0KICAg IGNvbnN0X2l0ZXJhdG9yIGZpbmQgKCBjb25zdF9pdGVyYXRvciBpdCwgY29uc3QgVCYgeCApIGNv bnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCBzaC0+ZmluZCggaXQubm9kZSwgeCApICk7IH0K ICAgIGludCBmaW5kSW5kZXgoIGNvbnN0IFQmIHggKSBjb25zdCB7IHJldHVybiBzaC0+ZmluZElu ZGV4KCBzaC0+bm9kZS0+bmV4dCwgeCkgOyB9CiAgICBzaXplX3R5cGUgY29udGFpbnMoIGNvbnN0 IFQmIHggKSBjb25zdCB7IHJldHVybiBzaC0+Y29udGFpbnMoIHggKTsgfQoKICAgIHNpemVfdHlw ZSBjb3VudCgpIGNvbnN0IHsgcmV0dXJuIHNoLT5ub2RlczsgfQoKICAgIFFWYWx1ZUxpc3Q8VD4m IG9wZXJhdG9yKz0gKCBjb25zdCBUJiB4ICkKICAgIHsKCWFwcGVuZCggeCApOwoJcmV0dXJuICp0 aGlzOwogICAgfQogICAgdHlwZWRlZiBRVmFsdWVMaXN0SXRlcmF0b3I8VD4gSXRlcmF0b3I7CiAg ICB0eXBlZGVmIFFWYWx1ZUxpc3RDb25zdEl0ZXJhdG9yPFQ+IENvbnN0SXRlcmF0b3I7CiAgICB0 eXBlZGVmIFQgVmFsdWVUeXBlOwoKcHJvdGVjdGVkOgogICAgIAoKCiAgICB2b2lkIGRldGFjaCgp IHsgaWYgKCBzaC0+Y291bnQgPiAxICkgZGV0YWNoSW50ZXJuYWwoKTsgfQoKICAgICAKCgogICAg UVZhbHVlTGlzdFByaXZhdGU8VD4qIHNoOwogICAgCnByaXZhdGU6CiAgICB2b2lkIGRldGFjaElu dGVybmFsKCk7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBib29sIFFWYWx1ZUxpc3Q8VD46Om9w ZXJhdG9yPT0gKCBjb25zdCBRVmFsdWVMaXN0PFQ+JiBsICkgY29uc3QKewogICAgaWYgKCBzaXpl KCkgIT0gbC5zaXplKCkgKQoJcmV0dXJuIEZBTFNFOwogICAgY29uc3RfaXRlcmF0b3IgaXQyID0g YmVnaW4oKTsKICAgIGNvbnN0X2l0ZXJhdG9yIGl0ID0gbC5iZWdpbigpOwogICAgZm9yKCA7IGl0 ICE9IGwuZW5kKCk7ICsraXQsICsraXQyICkKCWlmICggISggKml0ID09ICppdDIgKSApCgkgICAg cmV0dXJuIEZBTFNFOwogICAgcmV0dXJuIFRSVUU7Cn0KCnRlbXBsYXRlIDxjbGFzcyBUPgogIHZv aWQgUVZhbHVlTGlzdDxUPjo6Y2xlYXIoKQp7CiAgICBpZiAoIHNoLT5jb3VudCA9PSAxICkgc2gt PmNsZWFyKCk7IGVsc2UgeyBzaC0+ZGVyZWYoKTsgc2ggPSBuZXcgUVZhbHVlTGlzdFByaXZhdGU8 VD47IH0KfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgdHlwZW5hbWUgIFFWYWx1ZUxpc3Q8VD46Oml0 ZXJhdG9yIFFWYWx1ZUxpc3Q8VD46OmVyYXNlKCB0eXBlbmFtZSAgUVZhbHVlTGlzdDxUPjo6aXRl cmF0b3IgZmlyc3QsIHR5cGVuYW1lICBRVmFsdWVMaXN0PFQ+OjppdGVyYXRvciBsYXN0ICkKewog ICAgd2hpbGUgKCBmaXJzdCAhPSBsYXN0ICkKCWVyYXNlKCBmaXJzdCsrICk7CiAgICByZXR1cm4g bGFzdDsKfQoKCnRlbXBsYXRlIDxjbGFzcyBUPgogIHZvaWQgUVZhbHVlTGlzdDxUPjo6aW5zZXJ0 KCB0eXBlbmFtZSAgUVZhbHVlTGlzdDxUPjo6aXRlcmF0b3IgcG9zLCBzaXplX3R5cGUgbiwgY29u c3QgVCYgeCApCnsKICAgIGZvciAoIDsgbiA+IDA7IC0tbiApCglpbnNlcnQoIHBvcywgeCApOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBRVmFsdWVMaXN0PFQ+IFFWYWx1ZUxpc3Q8VD46Om9wZXJh dG9yKyAoIGNvbnN0IFFWYWx1ZUxpc3Q8VD4mIGwgKSBjb25zdAp7CiAgICBRVmFsdWVMaXN0PFQ+ IGwyKCAqdGhpcyApOwogICAgZm9yKCBjb25zdF9pdGVyYXRvciBpdCA9IGwuYmVnaW4oKTsgaXQg IT0gbC5lbmQoKTsgKytpdCApCglsMi5hcHBlbmQoICppdCApOwogICAgcmV0dXJuIGwyOwp9Cgp0 ZW1wbGF0ZSA8Y2xhc3MgVD4KICBRVmFsdWVMaXN0PFQ+JiBRVmFsdWVMaXN0PFQ+OjpvcGVyYXRv cis9ICggY29uc3QgUVZhbHVlTGlzdDxUPiYgbCApCnsKICAgIGZvciggY29uc3RfaXRlcmF0b3Ig aXQgPSBsLmJlZ2luKCk7IGl0ICE9IGwuZW5kKCk7ICsraXQgKQoJYXBwZW5kKCAqaXQgKTsKICAg IHJldHVybiAqdGhpczsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CiAgdm9pZCBRVmFsdWVMaXN0PFQ+ OjpkZXRhY2hJbnRlcm5hbCgpCnsKICAgIHNoLT5kZXJlZigpOyBzaCA9IG5ldyBRVmFsdWVMaXN0 UHJpdmF0ZTxUPiggKnNoICk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KICBRRGF0YVN0cmVhbSYg b3BlcmF0b3I+PiggUURhdGFTdHJlYW0mIHMsIFFWYWx1ZUxpc3Q8VD4mIGwgKQp7CiAgICBsLmNs ZWFyKCk7CiAgICBRX1VJTlQzMiBjOwogICAgcyA+PiBjOwogICAgZm9yKCBRX1VJTlQzMiBpID0g MDsgaSA8IGM7ICsraSApCiAgICB7CglUIHQ7CglzID4+IHQ7CglsLmFwcGVuZCggdCApOwoJaWYg KCBzLmF0RW5kKCkgKQoJICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIHM7Cn0KCnRlbXBsYXRl IDxjbGFzcyBUPgogIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSYgcywgY29u c3QgUVZhbHVlTGlzdDxUPiYgbCApCnsKICAgIHMgPDwgKFFfVUlOVDMyKWwuc2l6ZSgpOwogICAg UVZhbHVlTGlzdENvbnN0SXRlcmF0b3I8VD4gaXQgPSBsLmJlZ2luKCk7CiAgICBmb3IoIDsgaXQg IT0gbC5lbmQoKTsgKytpdCApCglzIDw8ICppdDsKICAgIHJldHVybiBzOwp9CgoKIyA0NyAiL3Vz ci9sb2NhbC9xdC9pbmNsdWRlL3FtYXAuaCIgMgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9p NTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL21hcCIg MSAzCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDEgIi91c3IvbGliL2djYy1saWIv aTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxf dHJlZS5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4 LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9mdW5jdGlvbi5oIiAxIDMKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgogCgp0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywg Y2xhc3MgX1Jlc3VsdD4Kc3RydWN0IHVuYXJ5X2Z1bmN0aW9uIHsKICB0eXBlZGVmIF9BcmcgYXJn dW1lbnRfdHlwZTsKICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVzdWx0PgpzdHJ1Y3QgYmluYXJ5X2Z1 bmN0aW9uIHsKICB0eXBlZGVmIF9BcmcxIGZpcnN0X2FyZ3VtZW50X3R5cGU7CiAgdHlwZWRlZiBf QXJnMiBzZWNvbmRfYXJndW1lbnRfdHlwZTsKICB0eXBlZGVmIF9SZXN1bHQgcmVzdWx0X3R5cGU7 Cn07ICAgICAgCgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgcGx1cyA6IHB1YmxpYyBiaW5h cnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IHsKICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9f eCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCArIF9feTsgfQp9OwoKdGVtcGxh dGUgPGNsYXNzIF9UcD4Kc3RydWN0IG1pbnVzIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAs X1RwLF9UcD4gewogIF9UcCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9f eSkgY29uc3QgeyByZXR1cm4gX194IC0gX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpz dHJ1Y3QgbXVsdGlwbGllcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IHsK ICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsg cmV0dXJuIF9feCAqIF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGRpdmlk ZXMgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsX1RwPiB7CiAgX1RwIG9wZXJhdG9y KCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggLyBf X3k7IH0KfTsKCiAKCnRlbXBsYXRlIDxjbGFzcyBfVHA+IGlubGluZSBfVHAgaWRlbnRpdHlfZWxl bWVudChwbHVzPF9UcD4pIHsKICByZXR1cm4gX1RwKDApOwp9CnRlbXBsYXRlIDxjbGFzcyBfVHA+ IGlubGluZSBfVHAgaWRlbnRpdHlfZWxlbWVudChtdWx0aXBsaWVzPF9UcD4pIHsKICByZXR1cm4g X1RwKDEpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbW9kdWx1cyA6IHB1YmxpYyBi aW5hcnlfZnVuY3Rpb248X1RwLF9UcCxfVHA+IAp7CiAgX1RwIG9wZXJhdG9yKCkoY29uc3QgX1Rw JiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3ggJSBfX3k7IH0KfTsKCnRl bXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBuZWdhdGUgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248 X1RwLF9UcD4gCnsKICBfVHAgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29uc3QgeyByZXR1 cm4gLV9feDsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGVxdWFsX3RvIDogcHVi bGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9vbCBvcGVyYXRvcigpKGNv bnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID09IF9feTsg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IG5vdF9lcXVhbF90byA6IHB1YmxpYyBi aW5hcnlfZnVuY3Rpb248X1RwLF9UcCxib29sPiAKewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBf VHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0IHsgcmV0dXJuIF9feCAhPSBfX3k7IH0KfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBncmVhdGVyIDogcHVibGljIGJpbmFyeV9mdW5j dGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBj b25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194ID4gX195OyB9Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1RwPgpzdHJ1Y3QgbGVzcyA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxi b29sPiAKewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kp IGNvbnN0IHsgcmV0dXJuIF9feCA8IF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3Ry dWN0IGdyZWF0ZXJfZXF1YWwgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfVHAsYm9vbD4K ewogIGJvb2wgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCwgY29uc3QgX1RwJiBfX3kpIGNvbnN0 IHsgcmV0dXJuIF9feCA+PSBfX3k7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBs ZXNzX2VxdWFsIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+IAp7CiAgYm9v bCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1 cm4gX194IDw9IF9feTsgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGxvZ2ljYWxf YW5kIDogcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfVHAsX1RwLGJvb2w+CnsKICBib29sIG9wZXJh dG9yKCkoY29uc3QgX1RwJiBfX3gsIGNvbnN0IF9UcCYgX195KSBjb25zdCB7IHJldHVybiBfX3gg JiYgX195OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPgpzdHJ1Y3QgbG9naWNhbF9vciA6IHB1 YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9UcCxib29sPgp7CiAgYm9vbCBvcGVyYXRvcigpKGNv bnN0IF9UcCYgX194LCBjb25zdCBfVHAmIF9feSkgY29uc3QgeyByZXR1cm4gX194IHx8IF9feTsg fQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcD4Kc3RydWN0IGxvZ2ljYWxfbm90IDogcHVibGljIHVu YXJ5X2Z1bmN0aW9uPF9UcCxib29sPgp7CiAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IF9UcCYgX194 KSBjb25zdCB7IHJldHVybiAhX194OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4K Y2xhc3MgdW5hcnlfbmVnYXRlCiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX1By ZWRpY2F0ZTo6YXJndW1lbnRfdHlwZSwgYm9vbD4gewpwcm90ZWN0ZWQ6CiAgX1ByZWRpY2F0ZSBf TV9wcmVkOwpwdWJsaWM6CiAgZXhwbGljaXQgdW5hcnlfbmVnYXRlKGNvbnN0IF9QcmVkaWNhdGUm IF9feCkgOiBfTV9wcmVkKF9feCkge30KICBib29sIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUg X1ByZWRpY2F0ZTo6YXJndW1lbnRfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gIV9NX3By ZWQoX194KTsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1ByZWRpY2F0ZT4KaW5saW5lIHVuYXJ5 X25lZ2F0ZTxfUHJlZGljYXRlPiAKbm90MShjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpCnsKICBy ZXR1cm4gdW5hcnlfbmVnYXRlPF9QcmVkaWNhdGU+KF9fcHJlZCk7Cn0KCnRlbXBsYXRlIDxjbGFz cyBfUHJlZGljYXRlPiAKY2xhc3MgYmluYXJ5X25lZ2F0ZSAKICA6IHB1YmxpYyBiaW5hcnlfZnVu Y3Rpb248dHlwZW5hbWUgX1ByZWRpY2F0ZTo6Zmlyc3RfYXJndW1lbnRfdHlwZSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX1ByZWRpY2F0ZTo6c2Vjb25kX2FyZ3VtZW50X3R5 cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2w+IHsKcHJvdGVjdGVkOgogIF9QcmVk aWNhdGUgX01fcHJlZDsKcHVibGljOgogIGV4cGxpY2l0IGJpbmFyeV9uZWdhdGUoY29uc3QgX1By ZWRpY2F0ZSYgX194KSA6IF9NX3ByZWQoX194KSB7fQogIGJvb2wgb3BlcmF0b3IoKShjb25zdCB0 eXBlbmFtZSBfUHJlZGljYXRlOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3gsIAogICAgICAgICAg ICAgICAgICBjb25zdCB0eXBlbmFtZSBfUHJlZGljYXRlOjpzZWNvbmRfYXJndW1lbnRfdHlwZSYg X195KSBjb25zdAogIHsKICAgIHJldHVybiAhX01fcHJlZChfX3gsIF9feSk7IAogIH0KfTsKCnRl bXBsYXRlIDxjbGFzcyBfUHJlZGljYXRlPgppbmxpbmUgYmluYXJ5X25lZ2F0ZTxfUHJlZGljYXRl PiAKbm90Mihjb25zdCBfUHJlZGljYXRlJiBfX3ByZWQpCnsKICByZXR1cm4gYmluYXJ5X25lZ2F0 ZTxfUHJlZGljYXRlPihfX3ByZWQpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX09wZXJhdGlvbj4gCmNs YXNzIGJpbmRlcjFzdAogIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRp b246OnNlY29uZF9hcmd1bWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVu YW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlPiB7CnByb3RlY3RlZDoKICBfT3BlcmF0aW9uIG9w OwogIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgdmFsdWU7CnB1Ymxp YzoKICBiaW5kZXIxc3QoY29uc3QgX09wZXJhdGlvbiYgX194LAogICAgICAgICAgICBjb25zdCB0 eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3kpCiAgICAgIDogb3Ao X194KSwgdmFsdWUoX195KSB7fQogIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlCiAg b3BlcmF0b3IoKShjb25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpzZWNvbmRfYXJndW1lbnRfdHlw ZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gb3AodmFsdWUsIF9feCk7IAogIH0KfTsKCnRlbXBs YXRlIDxjbGFzcyBfT3BlcmF0aW9uLCBjbGFzcyBfVHA+CmlubGluZSBiaW5kZXIxc3Q8X09wZXJh dGlvbj4gCmJpbmQxc3QoY29uc3QgX09wZXJhdGlvbiYgX19vcGVyLCBjb25zdCBfVHAmIF9feCkg CnsKICB0eXBlZGVmIHR5cGVuYW1lIF9PcGVyYXRpb246OmZpcnN0X2FyZ3VtZW50X3R5cGUgX0Fy ZzFfdHlwZTsKICByZXR1cm4gYmluZGVyMXN0PF9PcGVyYXRpb24+KF9fb3BlciwgX0FyZzFfdHlw ZShfX3gpKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24+IApjbGFzcyBiaW5kZXIybmQK ICA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjx0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1 bWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9PcGVyYXRpb246 OnJlc3VsdF90eXBlPiB7CnByb3RlY3RlZDoKICBfT3BlcmF0aW9uIG9wOwogIHR5cGVuYW1lIF9P cGVyYXRpb246OnNlY29uZF9hcmd1bWVudF90eXBlIHZhbHVlOwpwdWJsaWM6CiAgYmluZGVyMm5k KGNvbnN0IF9PcGVyYXRpb24mIF9feCwKICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgX09wZXJh dGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUmIF9feSkgCiAgICAgIDogb3AoX194KSwgdmFsdWUo X195KSB7fQogIHR5cGVuYW1lIF9PcGVyYXRpb246OnJlc3VsdF90eXBlCiAgb3BlcmF0b3IoKShj b25zdCB0eXBlbmFtZSBfT3BlcmF0aW9uOjpmaXJzdF9hcmd1bWVudF90eXBlJiBfX3gpIGNvbnN0 IHsKICAgIHJldHVybiBvcChfX3gsIHZhbHVlKTsgCiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9P cGVyYXRpb24sIGNsYXNzIF9UcD4KaW5saW5lIGJpbmRlcjJuZDxfT3BlcmF0aW9uPiAKYmluZDJu ZChjb25zdCBfT3BlcmF0aW9uJiBfX29wZXIsIGNvbnN0IF9UcCYgX194KSAKewogIHR5cGVkZWYg dHlwZW5hbWUgX09wZXJhdGlvbjo6c2Vjb25kX2FyZ3VtZW50X3R5cGUgX0FyZzJfdHlwZTsKICBy ZXR1cm4gYmluZGVyMm5kPF9PcGVyYXRpb24+KF9fb3BlciwgX0FyZzJfdHlwZShfX3gpKTsKfQoK IAoKdGVtcGxhdGUgPGNsYXNzIF9PcGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMj4KY2xhc3Mg dW5hcnlfY29tcG9zZQogIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHR5cGVuYW1lIF9PcGVyYXRp b24yOjphcmd1bWVudF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9P cGVyYXRpb24xOjpyZXN1bHRfdHlwZT4gCnsKcHJvdGVjdGVkOgogIF9PcGVyYXRpb24xIF9fb3Ax OwogIF9PcGVyYXRpb24yIF9fb3AyOwpwdWJsaWM6CiAgdW5hcnlfY29tcG9zZShjb25zdCBfT3Bl cmF0aW9uMSYgX194LCBjb25zdCBfT3BlcmF0aW9uMiYgX195KSAKICAgIDogX19vcDEoX194KSwg X19vcDIoX195KSB7fQogIHR5cGVuYW1lIF9PcGVyYXRpb24xOjpyZXN1bHRfdHlwZQogIG9wZXJh dG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjI6OmFyZ3VtZW50X3R5cGUmIF9feCkgY29u c3QgewogICAgcmV0dXJuIF9fb3AxKF9fb3AyKF9feCkpOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFz cyBfT3BlcmF0aW9uMSwgY2xhc3MgX09wZXJhdGlvbjI+CmlubGluZSB1bmFyeV9jb21wb3NlPF9P cGVyYXRpb24xLF9PcGVyYXRpb24yPiAKY29tcG9zZTEoY29uc3QgX09wZXJhdGlvbjEmIF9fb3Ax LCBjb25zdCBfT3BlcmF0aW9uMiYgX19vcDIpCnsKICByZXR1cm4gdW5hcnlfY29tcG9zZTxfT3Bl cmF0aW9uMSxfT3BlcmF0aW9uMj4oX19vcDEsIF9fb3AyKTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9P cGVyYXRpb24xLCBjbGFzcyBfT3BlcmF0aW9uMiwgY2xhc3MgX09wZXJhdGlvbjM+CmNsYXNzIGJp bmFyeV9jb21wb3NlCiAgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248dHlwZW5hbWUgX09wZXJhdGlv bjI6OmFyZ3VtZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgX09w ZXJhdGlvbjE6OnJlc3VsdF90eXBlPiB7CnByb3RlY3RlZDoKICBfT3BlcmF0aW9uMSBfTV9vcDE7 CiAgX09wZXJhdGlvbjIgX01fb3AyOwogIF9PcGVyYXRpb24zIF9NX29wMzsKcHVibGljOgogIGJp bmFyeV9jb21wb3NlKGNvbnN0IF9PcGVyYXRpb24xJiBfX3gsIGNvbnN0IF9PcGVyYXRpb24yJiBf X3ksIAogICAgICAgICAgICAgICAgIGNvbnN0IF9PcGVyYXRpb24zJiBfX3opIAogICAgOiBfTV9v cDEoX194KSwgX01fb3AyKF9feSksIF9NX29wMyhfX3opIHsgfQogIHR5cGVuYW1lIF9PcGVyYXRp b24xOjpyZXN1bHRfdHlwZQogIG9wZXJhdG9yKCkoY29uc3QgdHlwZW5hbWUgX09wZXJhdGlvbjI6 OmFyZ3VtZW50X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9NX29wMShfTV9vcDIoX194 KSwgX01fb3AzKF9feCkpOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfT3BlcmF0aW9uMSwgY2xh c3MgX09wZXJhdGlvbjIsIGNsYXNzIF9PcGVyYXRpb24zPgppbmxpbmUgYmluYXJ5X2NvbXBvc2U8 X09wZXJhdGlvbjEsIF9PcGVyYXRpb24yLCBfT3BlcmF0aW9uMz4gCmNvbXBvc2UyKGNvbnN0IF9P cGVyYXRpb24xJiBfX29wMSwgY29uc3QgX09wZXJhdGlvbjImIF9fb3AyLCAKICAgICAgICAgY29u c3QgX09wZXJhdGlvbjMmIF9fb3AzKQp7CiAgcmV0dXJuIGJpbmFyeV9jb21wb3NlPF9PcGVyYXRp b24xLF9PcGVyYXRpb24yLF9PcGVyYXRpb24zPgogICAgKF9fb3AxLCBfX29wMiwgX19vcDMpOwp9 Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KY2xhc3MgcG9pbnRlcl90b191 bmFyeV9mdW5jdGlvbiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfQXJnLCBfUmVzdWx0PiB7CnBy b3RlY3RlZDoKICBfUmVzdWx0ICgqX01fcHRyKShfQXJnKTsKcHVibGljOgogIHBvaW50ZXJfdG9f dW5hcnlfZnVuY3Rpb24oKSB7fQogIGV4cGxpY2l0IHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rpb24o X1Jlc3VsdCAoKl9feCkoX0FyZykpIDogX01fcHRyKF9feCkge30KICBfUmVzdWx0IG9wZXJhdG9y KCkoX0FyZyBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3B0cihfX3gpOyB9Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0FyZywgY2xhc3MgX1Jlc3VsdD4KaW5saW5lIHBvaW50ZXJfdG9fdW5hcnlfZnVuY3Rp b248X0FyZywgX1Jlc3VsdD4gcHRyX2Z1bihfUmVzdWx0ICgqX194KShfQXJnKSkKewogIHJldHVy biBwb2ludGVyX3RvX3VuYXJ5X2Z1bmN0aW9uPF9BcmcsIF9SZXN1bHQ+KF9feCk7Cn0KCnRlbXBs YXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzIsIGNsYXNzIF9SZXN1bHQ+CmNsYXNzIHBvaW50 ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uIDogCiAgcHVibGljIGJpbmFyeV9mdW5jdGlvbjxfQXJnMSxf QXJnMixfUmVzdWx0PiB7CnByb3RlY3RlZDoKICAgIF9SZXN1bHQgKCpfTV9wdHIpKF9BcmcxLCBf QXJnMik7CnB1YmxpYzoKICAgIHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKCkge30KICAgIGV4 cGxpY2l0IHBvaW50ZXJfdG9fYmluYXJ5X2Z1bmN0aW9uKF9SZXN1bHQgKCpfX3gpKF9BcmcxLCBf QXJnMikpIAogICAgICA6IF9NX3B0cihfX3gpIHt9CiAgICBfUmVzdWx0IG9wZXJhdG9yKCkoX0Fy ZzEgX194LCBfQXJnMiBfX3kpIGNvbnN0IHsKICAgICAgcmV0dXJuIF9NX3B0cihfX3gsIF9feSk7 CiAgICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0FyZzEsIGNsYXNzIF9BcmcyLCBjbGFzcyBfUmVz dWx0PgppbmxpbmUgcG9pbnRlcl90b19iaW5hcnlfZnVuY3Rpb248X0FyZzEsX0FyZzIsX1Jlc3Vs dD4gCnB0cl9mdW4oX1Jlc3VsdCAoKl9feCkoX0FyZzEsIF9BcmcyKSkgewogIHJldHVybiBwb2lu dGVyX3RvX2JpbmFyeV9mdW5jdGlvbjxfQXJnMSxfQXJnMixfUmVzdWx0PihfX3gpOwp9CgogCnRl bXBsYXRlIDxjbGFzcyBfVHA+CnN0cnVjdCBfSWRlbnRpdHkgOiBwdWJsaWMgdW5hcnlfZnVuY3Rp b248X1RwLF9UcD4gewogIGNvbnN0IF9UcCYgb3BlcmF0b3IoKShjb25zdCBfVHAmIF9feCkgY29u c3QgeyByZXR1cm4gX194OyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwPiBzdHJ1Y3QgaWRlbnRp dHkgOiBwdWJsaWMgX0lkZW50aXR5PF9UcD4ge307CgogCnRlbXBsYXRlIDxjbGFzcyBfUGFpcj4K c3RydWN0IF9TZWxlY3Qxc3QgOiBwdWJsaWMgdW5hcnlfZnVuY3Rpb248X1BhaXIsIHR5cGVuYW1l IF9QYWlyOjpmaXJzdF90eXBlPiB7CiAgY29uc3QgdHlwZW5hbWUgX1BhaXI6OmZpcnN0X3R5cGUm IG9wZXJhdG9yKCkoY29uc3QgX1BhaXImIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9feC5maXJz dDsKICB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+CnN0cnVjdCBfU2VsZWN0Mm5kIDogcHVi bGljIHVuYXJ5X2Z1bmN0aW9uPF9QYWlyLCB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGU+CnsK ICBjb25zdCB0eXBlbmFtZSBfUGFpcjo6c2Vjb25kX3R5cGUmIG9wZXJhdG9yKCkoY29uc3QgX1Bh aXImIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9feC5zZWNvbmQ7CiAgfQp9OwoKdGVtcGxhdGUg PGNsYXNzIF9QYWlyPiBzdHJ1Y3Qgc2VsZWN0MXN0IDogcHVibGljIF9TZWxlY3Qxc3Q8X1BhaXI+ IHt9Owp0ZW1wbGF0ZSA8Y2xhc3MgX1BhaXI+IHN0cnVjdCBzZWxlY3QybmQgOiBwdWJsaWMgX1Nl bGVjdDJuZDxfUGFpcj4ge307CgogCnRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xhc3MgX0FyZzI+ CnN0cnVjdCBfUHJvamVjdDFzdCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0FyZzEsIF9Bcmcy LCBfQXJnMT4gewogIF9BcmcxIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmIF9feCwgY29uc3QgX0Fy ZzImKSBjb25zdCB7IHJldHVybiBfX3g7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfQXJnMSwgY2xh c3MgX0FyZzI+CnN0cnVjdCBfUHJvamVjdDJuZCA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X0Fy ZzEsIF9BcmcyLCBfQXJnMj4gewogIF9BcmcyIG9wZXJhdG9yKCkoY29uc3QgX0FyZzEmLCBjb25z dCBfQXJnMiYgX195KSBjb25zdCB7IHJldHVybiBfX3k7IH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBf QXJnMSwgY2xhc3MgX0FyZzI+IApzdHJ1Y3QgcHJvamVjdDFzdCA6IHB1YmxpYyBfUHJvamVjdDFz dDxfQXJnMSwgX0FyZzI+IHt9OwoKdGVtcGxhdGUgPGNsYXNzIF9BcmcxLCBjbGFzcyBfQXJnMj4K c3RydWN0IHByb2plY3QybmQgOiBwdWJsaWMgX1Byb2plY3QybmQ8X0FyZzEsIF9BcmcyPiB7fTsK CiAKIAogCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0PgpzdHJ1Y3QgY29uc3RhbnRfdm9pZF9mdW4K ewogIHR5cGVkZWYgX1Jlc3VsdCByZXN1bHRfdHlwZTsKICByZXN1bHRfdHlwZSBfX3ZhbDsKICBj b25zdGFudF92b2lkX2Z1bihjb25zdCByZXN1bHRfdHlwZSYgX192KSA6IF9fdmFsKF9fdikge30K ICBjb25zdCByZXN1bHRfdHlwZSYgb3BlcmF0b3IoKSgpIGNvbnN0IHsgcmV0dXJuIF9fdmFsOyB9 Cn07ICAKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZ3VtZW50ID0gX1Jlc3Vs dD4KCgoKc3RydWN0IGNvbnN0YW50X3VuYXJ5X2Z1biA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxf QXJndW1lbnQsIF9SZXN1bHQ+IHsKICBfUmVzdWx0IF9NX3ZhbDsKICBjb25zdGFudF91bmFyeV9m dW4oY29uc3QgX1Jlc3VsdCYgX192KSA6IF9NX3ZhbChfX3YpIHt9CiAgY29uc3QgX1Jlc3VsdCYg b3BlcmF0b3IoKShjb25zdCBfQXJndW1lbnQmKSBjb25zdCB7IHJldHVybiBfTV92YWw7IH0KfTsK Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Jlc3VsdCwgY2xhc3MgX0FyZzEgPSBfUmVzdWx0LCBjbGFzcyBf QXJnMiA9IF9BcmcxPgoKCgpzdHJ1Y3QgY29uc3RhbnRfYmluYXJ5X2Z1biA6IHB1YmxpYyBiaW5h cnlfZnVuY3Rpb248X0FyZzEsIF9BcmcyLCBfUmVzdWx0PiB7CiAgX1Jlc3VsdCBfTV92YWw7CiAg Y29uc3RhbnRfYmluYXJ5X2Z1bihjb25zdCBfUmVzdWx0JiBfX3YpIDogX01fdmFsKF9fdikge30K ICBjb25zdCBfUmVzdWx0JiBvcGVyYXRvcigpKGNvbnN0IF9BcmcxJiwgY29uc3QgX0FyZzImKSBj b25zdCB7CiAgICByZXR1cm4gX01fdmFsOwogIH0KfTsKCnRlbXBsYXRlIDxjbGFzcyBfUmVzdWx0 PgppbmxpbmUgY29uc3RhbnRfdm9pZF9mdW48X1Jlc3VsdD4gY29uc3RhbnQwKGNvbnN0IF9SZXN1 bHQmIF9fdmFsKQp7CiAgcmV0dXJuIGNvbnN0YW50X3ZvaWRfZnVuPF9SZXN1bHQ+KF9fdmFsKTsK fQoKdGVtcGxhdGUgPGNsYXNzIF9SZXN1bHQ+CmlubGluZSBjb25zdGFudF91bmFyeV9mdW48X1Jl c3VsdCxfUmVzdWx0PiBjb25zdGFudDEoY29uc3QgX1Jlc3VsdCYgX192YWwpCnsKICByZXR1cm4g Y29uc3RhbnRfdW5hcnlfZnVuPF9SZXN1bHQsX1Jlc3VsdD4oX192YWwpOwp9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1Jlc3VsdD4KaW5saW5lIGNvbnN0YW50X2JpbmFyeV9mdW48X1Jlc3VsdCxfUmVzdWx0 LF9SZXN1bHQ+IApjb25zdGFudDIoY29uc3QgX1Jlc3VsdCYgX192YWwpCnsKICByZXR1cm4gY29u c3RhbnRfYmluYXJ5X2Z1bjxfUmVzdWx0LF9SZXN1bHQsX1Jlc3VsdD4oX192YWwpOwp9CgogCiAK Y2xhc3Mgc3VidHJhY3RpdmVfcm5nIDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPHVuc2lnbmVkIGlu dCwgdW5zaWduZWQgaW50PiB7CnByaXZhdGU6CiAgdW5zaWduZWQgaW50IF9NX3RhYmxlWzU1XTsK ICBzaXplX3QgX01faW5kZXgxOwogIHNpemVfdCBfTV9pbmRleDI7CnB1YmxpYzoKICB1bnNpZ25l ZCBpbnQgb3BlcmF0b3IoKSh1bnNpZ25lZCBpbnQgX19saW1pdCkgewogICAgX01faW5kZXgxID0g KF9NX2luZGV4MSArIDEpICUgNTU7CiAgICBfTV9pbmRleDIgPSAoX01faW5kZXgyICsgMSkgJSA1 NTsKICAgIF9NX3RhYmxlW19NX2luZGV4MV0gPSBfTV90YWJsZVtfTV9pbmRleDFdIC0gX01fdGFi bGVbX01faW5kZXgyXTsKICAgIHJldHVybiBfTV90YWJsZVtfTV9pbmRleDFdICUgX19saW1pdDsK ICB9CgogIHZvaWQgX01faW5pdGlhbGl6ZSh1bnNpZ25lZCBpbnQgX19zZWVkKQogIHsKICAgIHVu c2lnbmVkIGludCBfX2sgPSAxOwogICAgX01fdGFibGVbNTRdID0gX19zZWVkOwogICAgc2l6ZV90 IF9faTsKICAgIGZvciAoX19pID0gMDsgX19pIDwgNTQ7IF9faSsrKSB7CiAgICAgICAgc2l6ZV90 IF9faWkgPSAoMjEgKiAoX19pICsgMSkgJSA1NSkgLSAxOwogICAgICAgIF9NX3RhYmxlW19faWld ID0gX19rOwogICAgICAgIF9fayA9IF9fc2VlZCAtIF9fazsKICAgICAgICBfX3NlZWQgPSBfTV90 YWJsZVtfX2lpXTsKICAgIH0KICAgIGZvciAoaW50IF9fbG9vcCA9IDA7IF9fbG9vcCA8IDQ7IF9f bG9vcCsrKSB7CiAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCA1NTsgX19pKyspCiAgICAgICAg ICAgIF9NX3RhYmxlW19faV0gPSBfTV90YWJsZVtfX2ldIC0gX01fdGFibGVbKDEgKyBfX2kgKyAz MCkgJSA1NV07CiAgICB9CiAgICBfTV9pbmRleDEgPSAwOwogICAgX01faW5kZXgyID0gMzE7CiAg fQoKICBzdWJ0cmFjdGl2ZV9ybmcodW5zaWduZWQgaW50IF9fc2VlZCkgeyBfTV9pbml0aWFsaXpl KF9fc2VlZCk7IH0KICBzdWJ0cmFjdGl2ZV9ybmcoKSB7IF9NX2luaXRpYWxpemUoMTYxODAzMzk4 dSk7IH0KfTsKCgogCgogCiAKIAogCiAKIAogCgogCiAKIAogCiAKCiAKIAogCiAKIAoKCnRlbXBs YXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmNsYXNzIG1lbV9mdW5fdCA6IHB1YmxpYyB1bmFy eV9mdW5jdGlvbjxfVHAqLF9SZXQ+IHsKcHVibGljOgogIGV4cGxpY2l0IG1lbV9mdW5fdChfUmV0 IChfVHA6OipfX3BmKSgpKSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoX1RwKiBf X3ApIGNvbnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1Rw OjoqX01fZikoKTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmNsYXNzIGNv bnN0X21lbV9mdW5fdCA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxjb25zdCBfVHAqLF9SZXQ+IHsK cHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21lbV9mdW5fdChfUmV0IChfVHA6OipfX3BmKSgpIGNv bnN0KSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3ApIGNv bnN0IHsgcmV0dXJuIChfX3AtPipfTV9mKSgpOyB9CnByaXZhdGU6CiAgX1JldCAoX1RwOjoqX01f ZikoKSBjb25zdDsKfTsKCgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xhc3MgX1RwPgpjbGFzcyBt ZW1fZnVuX3JlZl90IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCxfUmV0PiB7CnB1YmxpYzoK ICBleHBsaWNpdCBtZW1fZnVuX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkpIDogX01fZihfX3Bm KSB7fQogIF9SZXQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29uc3QgeyByZXR1cm4gKF9fci4qX01f ZikoKTsgfQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKCk7Cn07Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwPgpjbGFzcyBjb25zdF9tZW1fZnVuX3JlZl90IDogcHVibGljIHVu YXJ5X2Z1bmN0aW9uPF9UcCxfUmV0PiB7CnB1YmxpYzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVu X3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKCkgY29uc3QpIDogX01fZihfX3BmKSB7fQogIF9SZXQg b3BlcmF0b3IoKShjb25zdCBfVHAmIF9fcikgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZikoKTsg fQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7Cn07Cgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBtZW1fZnVuMV90IDogcHVibGlj IGJpbmFyeV9mdW5jdGlvbjxfVHAqLF9BcmcsX1JldD4gewpwdWJsaWM6CiAgZXhwbGljaXQgbWVt X2Z1bjFfdChfUmV0IChfVHA6OipfX3BmKShfQXJnKSkgOiBfTV9mKF9fcGYpIHt9CiAgX1JldCBv cGVyYXRvcigpKF9UcCogX19wLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fcC0+Kl9NX2Yp KF9feCk7IH0KcHJpdmF0ZToKICBfUmV0IChfVHA6OipfTV9mKShfQXJnKTsKfTsKCnRlbXBsYXRl IDxjbGFzcyBfUmV0LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIGNvbnN0X21lbV9mdW4x X3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyxfUmV0PiB7CnB1Ymxp YzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpIGNv bnN0KSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3AsIF9B cmcgX194KSBjb25zdAogICAgeyByZXR1cm4gKF9fcC0+Kl9NX2YpKF9feCk7IH0KcHJpdmF0ZToK ICBfUmV0IChfVHA6OipfTV9mKShfQXJnKSBjb25zdDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfUmV0 LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIG1lbV9mdW4xX3JlZl90IDogcHVibGljIGJp bmFyeV9mdW5jdGlvbjxfVHAsX0FyZyxfUmV0PiB7CnB1YmxpYzoKICBleHBsaWNpdCBtZW1fZnVu MV9yZWZfdChfUmV0IChfVHA6OipfX3BmKShfQXJnKSkgOiBfTV9mKF9fcGYpIHt9CiAgX1JldCBv cGVyYXRvcigpKF9UcCYgX19yLCBfQXJnIF9feCkgY29uc3QgeyByZXR1cm4gKF9fci4qX01fZiko X194KTsgfQpwcml2YXRlOgogIF9SZXQgKF9UcDo6Kl9NX2YpKF9BcmcpOwp9OwoKdGVtcGxhdGUg PGNsYXNzIF9SZXQsIGNsYXNzIF9UcCwgY2xhc3MgX0FyZz4KY2xhc3MgY29uc3RfbWVtX2Z1bjFf cmVmX3QgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLF9SZXQ+IHsKcHVibGljOgog IGV4cGxpY2l0IGNvbnN0X21lbV9mdW4xX3JlZl90KF9SZXQgKF9UcDo6Kl9fcGYpKF9BcmcpIGNv bnN0KSA6IF9NX2YoX19wZikge30KICBfUmV0IG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IsIF9B cmcgX194KSBjb25zdCB7IHJldHVybiAoX19yLipfTV9mKShfX3gpOyB9CnByaXZhdGU6CiAgX1Jl dCAoX1RwOjoqX01fZikoX0FyZykgY29uc3Q7Cn07CgoKCnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNs YXNzIG1lbV9mdW5fdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9uPF9UcCosdm9p ZD4gewpwdWJsaWM6CiAgZXhwbGljaXQgbWVtX2Z1bl90KHZvaWQgKF9UcDo6Kl9fcGYpKCkpIDog X01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAqIF9fcCkgY29uc3QgeyAoX19wLT4q X01fZikoKTsgfQpwcml2YXRlOgogIHZvaWQgKF9UcDo6Kl9NX2YpKCk7Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1RwPgpjbGFzcyBjb25zdF9tZW1fZnVuX3Q8dm9pZCwgX1RwPiA6IHB1YmxpYyB1bmFy eV9mdW5jdGlvbjxjb25zdCBfVHAqLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0IGNvbnN0X21l bV9mdW5fdCh2b2lkIChfVHA6OipfX3BmKSgpIGNvbnN0KSA6IF9NX2YoX19wZikge30KICB2b2lk IG9wZXJhdG9yKCkoY29uc3QgX1RwKiBfX3ApIGNvbnN0IHsgKF9fcC0+Kl9NX2YpKCk7IH0KcHJp dmF0ZToKICB2b2lkIChfVHA6OipfTV9mKSgpIGNvbnN0Owp9OwoKdGVtcGxhdGUgPGNsYXNzIF9U cD4KY2xhc3MgbWVtX2Z1bl9yZWZfdDx2b2lkLCBfVHA+IDogcHVibGljIHVuYXJ5X2Z1bmN0aW9u PF9UcCx2b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBtZW1fZnVuX3JlZl90KHZvaWQgKF9UcDo6 Kl9fcGYpKCkpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShfVHAmIF9fcikgY29u c3QgeyAoX19yLipfTV9mKSgpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoKTsKfTsK CnRlbXBsYXRlIDxjbGFzcyBfVHA+CmNsYXNzIGNvbnN0X21lbV9mdW5fcmVmX3Q8dm9pZCwgX1Rw PiA6IHB1YmxpYyB1bmFyeV9mdW5jdGlvbjxfVHAsdm9pZD4gewpwdWJsaWM6CiAgZXhwbGljaXQg Y29uc3RfbWVtX2Z1bl9yZWZfdCh2b2lkIChfVHA6OipfX3BmKSgpIGNvbnN0KSA6IF9NX2YoX19w Zikge30KICB2b2lkIG9wZXJhdG9yKCkoY29uc3QgX1RwJiBfX3IpIGNvbnN0IHsgKF9fci4qX01f ZikoKTsgfQpwcml2YXRlOgogIHZvaWQgKF9UcDo6Kl9NX2YpKCkgY29uc3Q7Cn07Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBtZW1fZnVuMV90PHZvaWQsIF9UcCwgX0Fy Zz4gOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCosX0FyZyx2b2lkPiB7CnB1YmxpYzoKICBl eHBsaWNpdCBtZW1fZnVuMV90KHZvaWQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9NX2YoX19wZikg e30KICB2b2lkIG9wZXJhdG9yKCkoX1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AtPipf TV9mKShfX3gpOyB9CnByaXZhdGU6CiAgdm9pZCAoX1RwOjoqX01fZikoX0FyZyk7Cn07Cgp0ZW1w bGF0ZSA8Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgpjbGFzcyBjb25zdF9tZW1fZnVuMV90PHZvaWQs IF9UcCwgX0FyZz4gCiAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPGNvbnN0IF9UcCosX0FyZyx2 b2lkPiB7CnB1YmxpYzoKICBleHBsaWNpdCBjb25zdF9tZW1fZnVuMV90KHZvaWQgKF9UcDo6Kl9f cGYpKF9BcmcpIGNvbnN0KSA6IF9NX2YoX19wZikge30KICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qg X1RwKiBfX3AsIF9BcmcgX194KSBjb25zdCB7IChfX3AtPipfTV9mKShfX3gpOyB9CnByaXZhdGU6 CiAgdm9pZCAoX1RwOjoqX01fZikoX0FyZykgY29uc3Q7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQXJnPgpjbGFzcyBtZW1fZnVuMV9yZWZfdDx2b2lkLCBfVHAsIF9Bcmc+CiAgOiBw dWJsaWMgYmluYXJ5X2Z1bmN0aW9uPF9UcCxfQXJnLHZvaWQ+IHsKcHVibGljOgogIGV4cGxpY2l0 IG1lbV9mdW4xX3JlZl90KHZvaWQgKF9UcDo6Kl9fcGYpKF9BcmcpKSA6IF9NX2YoX19wZikge30K ICB2b2lkIG9wZXJhdG9yKCkoX1RwJiBfX3IsIF9BcmcgX194KSBjb25zdCB7IChfX3IuKl9NX2Yp KF9feCk7IH0KcHJpdmF0ZToKICB2b2lkIChfVHA6OipfTV9mKShfQXJnKTsKfTsKCnRlbXBsYXRl IDxjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmNsYXNzIGNvbnN0X21lbV9mdW4xX3JlZl90PHZvaWQs IF9UcCwgX0FyZz4KICA6IHB1YmxpYyBiaW5hcnlfZnVuY3Rpb248X1RwLF9Bcmcsdm9pZD4gewpw dWJsaWM6CiAgZXhwbGljaXQgY29uc3RfbWVtX2Z1bjFfcmVmX3Qodm9pZCAoX1RwOjoqX19wZiko X0FyZykgY29uc3QpIDogX01fZihfX3BmKSB7fQogIHZvaWQgb3BlcmF0b3IoKShjb25zdCBfVHAm IF9fciwgX0FyZyBfX3gpIGNvbnN0IHsgKF9fci4qX01fZikoX194KTsgfQpwcml2YXRlOgogIHZv aWQgKF9UcDo6Kl9NX2YpKF9BcmcpIGNvbnN0Owp9OwoKCgogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xh c3MgX1JldCwgY2xhc3MgX1RwPgppbmxpbmUgbWVtX2Z1bl90PF9SZXQsX1RwPiBtZW1fZnVuKF9S ZXQgKF9UcDo6Kl9fZikoKSkKICB7IHJldHVybiBtZW1fZnVuX3Q8X1JldCxfVHA+KF9fZik7IH0K CnRlbXBsYXRlIDxjbGFzcyBfUmV0LCBjbGFzcyBfVHA+CmlubGluZSBjb25zdF9tZW1fZnVuX3Q8 X1JldCxfVHA+IG1lbV9mdW4oX1JldCAoX1RwOjoqX19mKSgpIGNvbnN0KQogIHsgcmV0dXJuIGNv bnN0X21lbV9mdW5fdDxfUmV0LF9UcD4oX19mKTsgfQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNs YXNzIF9UcD4KaW5saW5lIG1lbV9mdW5fcmVmX3Q8X1JldCxfVHA+IG1lbV9mdW5fcmVmKF9SZXQg KF9UcDo6Kl9fZikoKSkgCiAgeyByZXR1cm4gbWVtX2Z1bl9yZWZfdDxfUmV0LF9UcD4oX19mKTsg fQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNsYXNzIF9UcD4KaW5saW5lIGNvbnN0X21lbV9mdW5f cmVmX3Q8X1JldCxfVHA+IG1lbV9mdW5fcmVmKF9SZXQgKF9UcDo6Kl9fZikoKSBjb25zdCkKICB7 IHJldHVybiBjb25zdF9tZW1fZnVuX3JlZl90PF9SZXQsX1RwPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgbWVtX2Z1bjFfdDxfUmV0 LF9UcCxfQXJnPiBtZW1fZnVuKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykpCiAgeyByZXR1cm4gbWVt X2Z1bjFfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xh c3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgY29uc3RfbWVtX2Z1bjFfdDxfUmV0LF9UcCxfQXJn PiBtZW1fZnVuKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpCiAgeyByZXR1cm4gY29uc3Rf bWVtX2Z1bjFfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwg Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgbWVtX2Z1bjFfcmVmX3Q8X1JldCxfVHAsX0Fy Zz4gbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSkKICB7IHJldHVybiBtZW1fZnVu MV9yZWZfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwgY2xh c3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCxfVHAs X0FyZz4KbWVtX2Z1bl9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKICB7IHJldHVy biBjb25zdF9tZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX1JldCwgY2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgbWVtX2Z1bjFfdDxfUmV0 LF9UcCxfQXJnPiBtZW1fZnVuMShfUmV0IChfVHA6OipfX2YpKF9BcmcpKQogIHsgcmV0dXJuIG1l bV9mdW4xX3Q8X1JldCxfVHAsX0FyZz4oX19mKTsgfQoKdGVtcGxhdGUgPGNsYXNzIF9SZXQsIGNs YXNzIF9UcCwgY2xhc3MgX0FyZz4KaW5saW5lIGNvbnN0X21lbV9mdW4xX3Q8X1JldCxfVHAsX0Fy Zz4gbWVtX2Z1bjEoX1JldCAoX1RwOjoqX19mKShfQXJnKSBjb25zdCkKICB7IHJldHVybiBjb25z dF9tZW1fZnVuMV90PF9SZXQsX1RwLF9Bcmc+KF9fZik7IH0KCnRlbXBsYXRlIDxjbGFzcyBfUmV0 LCBjbGFzcyBfVHAsIGNsYXNzIF9Bcmc+CmlubGluZSBtZW1fZnVuMV9yZWZfdDxfUmV0LF9UcCxf QXJnPiBtZW1fZnVuMV9yZWYoX1JldCAoX1RwOjoqX19mKShfQXJnKSkKICB7IHJldHVybiBtZW1f ZnVuMV9yZWZfdDxfUmV0LF9UcCxfQXJnPihfX2YpOyB9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1JldCwg Y2xhc3MgX1RwLCBjbGFzcyBfQXJnPgppbmxpbmUgY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCxf VHAsX0FyZz4KbWVtX2Z1bjFfcmVmKF9SZXQgKF9UcDo6Kl9fZikoX0FyZykgY29uc3QpCiAgeyBy ZXR1cm4gY29uc3RfbWVtX2Z1bjFfcmVmX3Q8X1JldCxfVHAsX0FyZz4oX19mKTsgfQoKIAoKCgog CiAKIAojIDU5ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX3RyZWUuaCIgMiAzCgoKICAKCgoKCgp0eXBlZGVm IGJvb2wgX1JiX3RyZWVfQ29sb3JfdHlwZTsKY29uc3QgX1JiX3RyZWVfQ29sb3JfdHlwZSBfU19y Yl90cmVlX3JlZCA9IGZhbHNlOwpjb25zdCBfUmJfdHJlZV9Db2xvcl90eXBlIF9TX3JiX3RyZWVf YmxhY2sgPSB0cnVlOwoKc3RydWN0IF9SYl90cmVlX25vZGVfYmFzZQp7CiAgdHlwZWRlZiBfUmJf dHJlZV9Db2xvcl90eXBlIF9Db2xvcl90eXBlOwogIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNl KiBfQmFzZV9wdHI7CgogIF9Db2xvcl90eXBlIF9NX2NvbG9yOyAKICBfQmFzZV9wdHIgX01fcGFy ZW50OwogIF9CYXNlX3B0ciBfTV9sZWZ0OwogIF9CYXNlX3B0ciBfTV9yaWdodDsKCiAgc3RhdGlj IF9CYXNlX3B0ciBfU19taW5pbXVtKF9CYXNlX3B0ciBfX3gpCiAgewogICAgd2hpbGUgKF9feC0+ X01fbGVmdCAhPSAwKSBfX3ggPSBfX3gtPl9NX2xlZnQ7CiAgICByZXR1cm4gX194OwogIH0KCiAg c3RhdGljIF9CYXNlX3B0ciBfU19tYXhpbXVtKF9CYXNlX3B0ciBfX3gpCiAgewogICAgd2hpbGUg KF9feC0+X01fcmlnaHQgIT0gMCkgX194ID0gX194LT5fTV9yaWdodDsKICAgIHJldHVybiBfX3g7 CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZT4Kc3RydWN0IF9SYl90cmVlX25vZGUgOiBw dWJsaWMgX1JiX3RyZWVfbm9kZV9iYXNlCnsKICB0eXBlZGVmIF9SYl90cmVlX25vZGU8X1ZhbHVl PiogX0xpbmtfdHlwZTsKICBfVmFsdWUgX01fdmFsdWVfZmllbGQ7Cn07CgoKc3RydWN0IF9SYl90 cmVlX2Jhc2VfaXRlcmF0b3IKewogIHR5cGVkZWYgX1JiX3RyZWVfbm9kZV9iYXNlOjpfQmFzZV9w dHIgX0Jhc2VfcHRyOwogIHR5cGVkZWYgYmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcgaXRlcmF0 b3JfY2F0ZWdvcnk7CiAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwogIF9CYXNl X3B0ciBfTV9ub2RlOwoKICB2b2lkIF9NX2luY3JlbWVudCgpCiAgewogICAgaWYgKF9NX25vZGUt Pl9NX3JpZ2h0ICE9IDApIHsKICAgICAgX01fbm9kZSA9IF9NX25vZGUtPl9NX3JpZ2h0OwogICAg ICB3aGlsZSAoX01fbm9kZS0+X01fbGVmdCAhPSAwKQogICAgICAgIF9NX25vZGUgPSBfTV9ub2Rl LT5fTV9sZWZ0OwogICAgfQogICAgZWxzZSB7CiAgICAgIF9CYXNlX3B0ciBfX3kgPSBfTV9ub2Rl LT5fTV9wYXJlbnQ7CiAgICAgIHdoaWxlIChfTV9ub2RlID09IF9feS0+X01fcmlnaHQpIHsKICAg ICAgICBfTV9ub2RlID0gX195OwogICAgICAgIF9feSA9IF9feS0+X01fcGFyZW50OwogICAgICB9 CiAgICAgIGlmIChfTV9ub2RlLT5fTV9yaWdodCAhPSBfX3kpCiAgICAgICAgX01fbm9kZSA9IF9f eTsKICAgIH0KICB9CgogIHZvaWQgX01fZGVjcmVtZW50KCkKICB7CiAgICBpZiAoX01fbm9kZS0+ X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQgJiYKICAgICAgICBfTV9ub2RlLT5fTV9wYXJlbnQt Pl9NX3BhcmVudCA9PSBfTV9ub2RlKQogICAgICBfTV9ub2RlID0gX01fbm9kZS0+X01fcmlnaHQ7 CiAgICBlbHNlIGlmIChfTV9ub2RlLT5fTV9sZWZ0ICE9IDApIHsKICAgICAgX0Jhc2VfcHRyIF9f eSA9IF9NX25vZGUtPl9NX2xlZnQ7CiAgICAgIHdoaWxlIChfX3ktPl9NX3JpZ2h0ICE9IDApCiAg ICAgICAgX195ID0gX195LT5fTV9yaWdodDsKICAgICAgX01fbm9kZSA9IF9feTsKICAgIH0KICAg IGVsc2UgewogICAgICBfQmFzZV9wdHIgX195ID0gX01fbm9kZS0+X01fcGFyZW50OwogICAgICB3 aGlsZSAoX01fbm9kZSA9PSBfX3ktPl9NX2xlZnQpIHsKICAgICAgICBfTV9ub2RlID0gX195Owog ICAgICAgIF9feSA9IF9feS0+X01fcGFyZW50OwogICAgICB9CiAgICAgIF9NX25vZGUgPSBfX3k7 CiAgICB9CiAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIF9WYWx1ZSwgY2xhc3MgX1JlZiwgY2xhc3Mg X1B0cj4Kc3RydWN0IF9SYl90cmVlX2l0ZXJhdG9yIDogcHVibGljIF9SYl90cmVlX2Jhc2VfaXRl cmF0b3IKewogIHR5cGVkZWYgX1ZhbHVlIHZhbHVlX3R5cGU7CiAgdHlwZWRlZiBfUmVmIHJlZmVy ZW5jZTsKICB0eXBlZGVmIF9QdHIgcG9pbnRlcjsKICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9y PF9WYWx1ZSwgX1ZhbHVlJiwgX1ZhbHVlKj4gICAgICAgICAgICAgCiAgICBpdGVyYXRvcjsKICB0 eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9WYWx1ZSwgY29uc3QgX1ZhbHVlJiwgY29uc3QgX1Zh bHVlKj4gCiAgICBjb25zdF9pdGVyYXRvcjsKICB0eXBlZGVmIF9SYl90cmVlX2l0ZXJhdG9yPF9W YWx1ZSwgX1JlZiwgX1B0cj4gICAgICAgICAgICAgICAgICAgCiAgICBfU2VsZjsKICB0eXBlZGVm IF9SYl90cmVlX25vZGU8X1ZhbHVlPiogX0xpbmtfdHlwZTsKCiAgX1JiX3RyZWVfaXRlcmF0b3Io KSB7fQogIF9SYl90cmVlX2l0ZXJhdG9yKF9MaW5rX3R5cGUgX194KSB7IF9NX25vZGUgPSBfX3g7 IH0KICBfUmJfdHJlZV9pdGVyYXRvcihjb25zdCBpdGVyYXRvciYgX19pdCkgeyBfTV9ub2RlID0g X19pdC5fTV9ub2RlOyB9CgogIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBf TGlua190eXBlKF9NX25vZGUpLT5fTV92YWx1ZV9maWVsZDsgfQoKICBwb2ludGVyIG9wZXJhdG9y LT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQoKCiAgX1NlbGYmIG9wZXJhdG9y KysoKSB7IF9NX2luY3JlbWVudCgpOyByZXR1cm4gKnRoaXM7IH0KICBfU2VsZiBvcGVyYXRvcisr KGludCkgewogICAgX1NlbGYgX190bXAgPSAqdGhpczsKICAgIF9NX2luY3JlbWVudCgpOwogICAg cmV0dXJuIF9fdG1wOwogIH0KICAgIAogIF9TZWxmJiBvcGVyYXRvci0tKCkgeyBfTV9kZWNyZW1l bnQoKTsgcmV0dXJuICp0aGlzOyB9CiAgX1NlbGYgb3BlcmF0b3ItLShpbnQpIHsKICAgIF9TZWxm IF9fdG1wID0gKnRoaXM7CiAgICBfTV9kZWNyZW1lbnQoKTsKICAgIHJldHVybiBfX3RtcDsKICB9 Cn07CgppbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3Im IF9feCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUmJfdHJlZV9iYXNlX2l0ZXJhdG9y JiBfX3kpIHsKICByZXR1cm4gX194Ll9NX25vZGUgPT0gX195Ll9NX25vZGU7Cn0KCmlubGluZSBi b29sIG9wZXJhdG9yIT0oY29uc3QgX1JiX3RyZWVfYmFzZV9pdGVyYXRvciYgX194LAogICAgICAg ICAgICAgICAgICAgICAgIGNvbnN0IF9SYl90cmVlX2Jhc2VfaXRlcmF0b3ImIF9feSkgewogIHJl dHVybiBfX3guX01fbm9kZSAhPSBfX3kuX01fbm9kZTsKfQoKIyAyMTQgIi91c3IvbGliL2djYy1s aWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9z dGxfdHJlZS5oIiAzCgoKaW5saW5lIHZvaWQgCl9SYl90cmVlX3JvdGF0ZV9sZWZ0KF9SYl90cmVl X25vZGVfYmFzZSogX194LCBfUmJfdHJlZV9ub2RlX2Jhc2UqJiBfX3Jvb3QpCnsKICBfUmJfdHJl ZV9ub2RlX2Jhc2UqIF9feSA9IF9feC0+X01fcmlnaHQ7CiAgX194LT5fTV9yaWdodCA9IF9feS0+ X01fbGVmdDsKICBpZiAoX195LT5fTV9sZWZ0ICE9MCkKICAgIF9feS0+X01fbGVmdC0+X01fcGFy ZW50ID0gX194OwogIF9feS0+X01fcGFyZW50ID0gX194LT5fTV9wYXJlbnQ7CgogIGlmIChfX3gg PT0gX19yb290KQogICAgX19yb290ID0gX195OwogIGVsc2UgaWYgKF9feCA9PSBfX3gtPl9NX3Bh cmVudC0+X01fbGVmdCkKICAgIF9feC0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX195OwogIGVsc2UK ICAgIF9feC0+X01fcGFyZW50LT5fTV9yaWdodCA9IF9feTsKICBfX3ktPl9NX2xlZnQgPSBfX3g7 CiAgX194LT5fTV9wYXJlbnQgPSBfX3k7Cn0KCmlubGluZSB2b2lkIApfUmJfdHJlZV9yb3RhdGVf cmlnaHQoX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3gsIF9SYl90cmVlX25vZGVfYmFzZSomIF9fcm9v dCkKewogIF9SYl90cmVlX25vZGVfYmFzZSogX195ID0gX194LT5fTV9sZWZ0OwogIF9feC0+X01f bGVmdCA9IF9feS0+X01fcmlnaHQ7CiAgaWYgKF9feS0+X01fcmlnaHQgIT0gMCkKICAgIF9feS0+ X01fcmlnaHQtPl9NX3BhcmVudCA9IF9feDsKICBfX3ktPl9NX3BhcmVudCA9IF9feC0+X01fcGFy ZW50OwoKICBpZiAoX194ID09IF9fcm9vdCkKICAgIF9fcm9vdCA9IF9feTsKICBlbHNlIGlmIChf X3ggPT0gX194LT5fTV9wYXJlbnQtPl9NX3JpZ2h0KQogICAgX194LT5fTV9wYXJlbnQtPl9NX3Jp Z2h0ID0gX195OwogIGVsc2UKICAgIF9feC0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX195OwogIF9f eS0+X01fcmlnaHQgPSBfX3g7CiAgX194LT5fTV9wYXJlbnQgPSBfX3k7Cn0KCmlubGluZSB2b2lk IApfUmJfdHJlZV9yZWJhbGFuY2UoX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3gsIF9SYl90cmVlX25v ZGVfYmFzZSomIF9fcm9vdCkKewogIF9feC0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKICB3 aGlsZSAoX194ICE9IF9fcm9vdCAmJiBfX3gtPl9NX3BhcmVudC0+X01fY29sb3IgPT0gX1NfcmJf dHJlZV9yZWQpIHsKICAgIGlmIChfX3gtPl9NX3BhcmVudCA9PSBfX3gtPl9NX3BhcmVudC0+X01f cGFyZW50LT5fTV9sZWZ0KSB7CiAgICAgIF9SYl90cmVlX25vZGVfYmFzZSogX195ID0gX194LT5f TV9wYXJlbnQtPl9NX3BhcmVudC0+X01fcmlnaHQ7CiAgICAgIGlmIChfX3kgJiYgX195LT5fTV9j b2xvciA9PSBfU19yYl90cmVlX3JlZCkgewogICAgICAgIF9feC0+X01fcGFyZW50LT5fTV9jb2xv ciA9IF9TX3JiX3RyZWVfYmxhY2s7CiAgICAgICAgX195LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVf YmxhY2s7CiAgICAgICAgX194LT5fTV9wYXJlbnQtPl9NX3BhcmVudC0+X01fY29sb3IgPSBfU19y Yl90cmVlX3JlZDsKICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50OwogICAg ICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmIChfX3ggPT0gX194LT5fTV9wYXJlbnQtPl9NX3Jp Z2h0KSB7CiAgICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudDsKICAgICAgICAgIF9SYl90cmVl X3JvdGF0ZV9sZWZ0KF9feCwgX19yb290KTsKICAgICAgICB9CiAgICAgICAgX194LT5fTV9wYXJl bnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAgICAgICBfX3gtPl9NX3BhcmVudC0+ X01fcGFyZW50LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOwogICAgICAgIF9SYl90cmVlX3Jv dGF0ZV9yaWdodChfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LCBfX3Jvb3QpOwogICAgICB9CiAg ICB9CiAgICBlbHNlIHsKICAgICAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3kgPSBfX3gtPl9NX3Bh cmVudC0+X01fcGFyZW50LT5fTV9sZWZ0OwogICAgICBpZiAoX195ICYmIF9feS0+X01fY29sb3Ig PT0gX1NfcmJfdHJlZV9yZWQpIHsKICAgICAgICBfX3gtPl9NX3BhcmVudC0+X01fY29sb3IgPSBf U19yYl90cmVlX2JsYWNrOwogICAgICAgIF9feS0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNr OwogICAgICAgIF9feC0+X01fcGFyZW50LT5fTV9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJl ZV9yZWQ7CiAgICAgICAgX194ID0gX194LT5fTV9wYXJlbnQtPl9NX3BhcmVudDsKICAgICAgfQog ICAgICBlbHNlIHsKICAgICAgICBpZiAoX194ID09IF9feC0+X01fcGFyZW50LT5fTV9sZWZ0KSB7 CiAgICAgICAgICBfX3ggPSBfX3gtPl9NX3BhcmVudDsKICAgICAgICAgIF9SYl90cmVlX3JvdGF0 ZV9yaWdodChfX3gsIF9fcm9vdCk7CiAgICAgICAgfQogICAgICAgIF9feC0+X01fcGFyZW50LT5f TV9jb2xvciA9IF9TX3JiX3RyZWVfYmxhY2s7CiAgICAgICAgX194LT5fTV9wYXJlbnQtPl9NX3Bh cmVudC0+X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKICAgICAgICBfUmJfdHJlZV9yb3RhdGVf bGVmdChfX3gtPl9NX3BhcmVudC0+X01fcGFyZW50LCBfX3Jvb3QpOwogICAgICB9CiAgICB9CiAg fQogIF9fcm9vdC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwp9CgppbmxpbmUgX1JiX3Ry ZWVfbm9kZV9iYXNlKgpfUmJfdHJlZV9yZWJhbGFuY2VfZm9yX2VyYXNlKF9SYl90cmVlX25vZGVf YmFzZSogX196LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYl90cmVlX25vZGVfYmFz ZSomIF9fcm9vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUmJfdHJlZV9ub2RlX2Jh c2UqJiBfX2xlZnRtb3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9SYl90cmVlX25v ZGVfYmFzZSomIF9fcmlnaHRtb3N0KQp7CiAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3kgPSBfX3o7 CiAgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3ggPSAwOwogIF9SYl90cmVlX25vZGVfYmFzZSogX194 X3BhcmVudCA9IDA7CiAgaWYgKF9feS0+X01fbGVmdCA9PSAwKSAgICAgIAogICAgX194ID0gX195 LT5fTV9yaWdodDsgICAgICAKICBlbHNlCiAgICBpZiAoX195LT5fTV9yaWdodCA9PSAwKSAgIAog ICAgICBfX3ggPSBfX3ktPl9NX2xlZnQ7ICAgICAKICAgIGVsc2UgeyAgICAgICAgICAgICAgICAg ICAgCiAgICAgIF9feSA9IF9feS0+X01fcmlnaHQ7ICAgIAogICAgICB3aGlsZSAoX195LT5fTV9s ZWZ0ICE9IDApCiAgICAgICAgX195ID0gX195LT5fTV9sZWZ0OwogICAgICBfX3ggPSBfX3ktPl9N X3JpZ2h0OwogICAgfQogIGlmIChfX3kgIT0gX196KSB7ICAgICAgICAgICAKICAgIF9fei0+X01f bGVmdC0+X01fcGFyZW50ID0gX195OyAKICAgIF9feS0+X01fbGVmdCA9IF9fei0+X01fbGVmdDsK ICAgIGlmIChfX3kgIT0gX196LT5fTV9yaWdodCkgewogICAgICBfX3hfcGFyZW50ID0gX195LT5f TV9wYXJlbnQ7CiAgICAgIGlmIChfX3gpIF9feC0+X01fcGFyZW50ID0gX195LT5fTV9wYXJlbnQ7 CiAgICAgIF9feS0+X01fcGFyZW50LT5fTV9sZWZ0ID0gX194OyAgICAgICAKICAgICAgX195LT5f TV9yaWdodCA9IF9fei0+X01fcmlnaHQ7CiAgICAgIF9fei0+X01fcmlnaHQtPl9NX3BhcmVudCA9 IF9feTsKICAgIH0KICAgIGVsc2UKICAgICAgX194X3BhcmVudCA9IF9feTsgIAogICAgaWYgKF9f cm9vdCA9PSBfX3opCiAgICAgIF9fcm9vdCA9IF9feTsKICAgIGVsc2UgaWYgKF9fei0+X01fcGFy ZW50LT5fTV9sZWZ0ID09IF9feikKICAgICAgX196LT5fTV9wYXJlbnQtPl9NX2xlZnQgPSBfX3k7 CiAgICBlbHNlIAogICAgICBfX3otPl9NX3BhcmVudC0+X01fcmlnaHQgPSBfX3k7CiAgICBfX3kt Pl9NX3BhcmVudCA9IF9fei0+X01fcGFyZW50OwogICAgIDo6c3dhcChfX3ktPl9NX2NvbG9yLCBf X3otPl9NX2NvbG9yKTsKICAgIF9feSA9IF9fejsKICAgICAKICB9CiAgZWxzZSB7ICAgICAgICAg ICAgICAgICAgICAgICAgIAogICAgX194X3BhcmVudCA9IF9feS0+X01fcGFyZW50OwogICAgaWYg KF9feCkgX194LT5fTV9wYXJlbnQgPSBfX3ktPl9NX3BhcmVudDsgICAKICAgIGlmIChfX3Jvb3Qg PT0gX196KQogICAgICBfX3Jvb3QgPSBfX3g7CiAgICBlbHNlIAogICAgICBpZiAoX196LT5fTV9w YXJlbnQtPl9NX2xlZnQgPT0gX196KQogICAgICAgIF9fei0+X01fcGFyZW50LT5fTV9sZWZ0ID0g X194OwogICAgICBlbHNlCiAgICAgICAgX196LT5fTV9wYXJlbnQtPl9NX3JpZ2h0ID0gX194Owog ICAgaWYgKF9fbGVmdG1vc3QgPT0gX196KSAKICAgICAgaWYgKF9fei0+X01fcmlnaHQgPT0gMCkg ICAgICAgICAKICAgICAgICBfX2xlZnRtb3N0ID0gX196LT5fTV9wYXJlbnQ7CiAgICAgCiAgICAg IGVsc2UKICAgICAgICBfX2xlZnRtb3N0ID0gX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19taW5pbXVt KF9feCk7CiAgICBpZiAoX19yaWdodG1vc3QgPT0gX196KSAgCiAgICAgIGlmIChfX3otPl9NX2xl ZnQgPT0gMCkgICAgICAgICAgCiAgICAgICAgX19yaWdodG1vc3QgPSBfX3otPl9NX3BhcmVudDsg IAogICAgIAogICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBfX3JpZ2h0 bW9zdCA9IF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWF4aW11bShfX3gpOwogIH0KICBpZiAoX195 LT5fTV9jb2xvciAhPSBfU19yYl90cmVlX3JlZCkgeyAKICAgIHdoaWxlIChfX3ggIT0gX19yb290 ICYmIChfX3ggPT0gMCB8fCBfX3gtPl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2spKQogICAg ICBpZiAoX194ID09IF9feF9wYXJlbnQtPl9NX2xlZnQpIHsKICAgICAgICBfUmJfdHJlZV9ub2Rl X2Jhc2UqIF9fdyA9IF9feF9wYXJlbnQtPl9NX3JpZ2h0OwogICAgICAgIGlmIChfX3ctPl9NX2Nv bG9yID09IF9TX3JiX3RyZWVfcmVkKSB7CiAgICAgICAgICBfX3ctPl9NX2NvbG9yID0gX1NfcmJf dHJlZV9ibGFjazsKICAgICAgICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9y ZWQ7CiAgICAgICAgICBfUmJfdHJlZV9yb3RhdGVfbGVmdChfX3hfcGFyZW50LCBfX3Jvb3QpOwog ICAgICAgICAgX193ID0gX194X3BhcmVudC0+X01fcmlnaHQ7CiAgICAgICAgfQogICAgICAgIGlm ICgoX193LT5fTV9sZWZ0ID09IDAgfHwgCiAgICAgICAgICAgICBfX3ctPl9NX2xlZnQtPl9NX2Nv bG9yID09IF9TX3JiX3RyZWVfYmxhY2spICYmCiAgICAgICAgICAgIChfX3ctPl9NX3JpZ2h0ID09 IDAgfHwgCiAgICAgICAgICAgICBfX3ctPl9NX3JpZ2h0LT5fTV9jb2xvciA9PSBfU19yYl90cmVl X2JsYWNrKSkgewogICAgICAgICAgX193LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfcmVkOwogICAg ICAgICAgX194ID0gX194X3BhcmVudDsKICAgICAgICAgIF9feF9wYXJlbnQgPSBfX3hfcGFyZW50 LT5fTV9wYXJlbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChfX3ctPl9NX3JpZ2h0 ID09IDAgfHwgCiAgICAgICAgICAgICAgX193LT5fTV9yaWdodC0+X01fY29sb3IgPT0gX1NfcmJf dHJlZV9ibGFjaykgewogICAgICAgICAgICBpZiAoX193LT5fTV9sZWZ0KSBfX3ctPl9NX2xlZnQt Pl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAgICAgICAgICAgX193LT5fTV9jb2xvciA9 IF9TX3JiX3RyZWVfcmVkOwogICAgICAgICAgICBfUmJfdHJlZV9yb3RhdGVfcmlnaHQoX193LCBf X3Jvb3QpOwogICAgICAgICAgICBfX3cgPSBfX3hfcGFyZW50LT5fTV9yaWdodDsKICAgICAgICAg IH0KICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfX3hfcGFyZW50LT5fTV9jb2xvcjsKICAgICAg ICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9ibGFjazsKICAgICAgICAgIGlm IChfX3ctPl9NX3JpZ2h0KSBfX3ctPl9NX3JpZ2h0LT5fTV9jb2xvciA9IF9TX3JiX3RyZWVfYmxh Y2s7CiAgICAgICAgICBfUmJfdHJlZV9yb3RhdGVfbGVmdChfX3hfcGFyZW50LCBfX3Jvb3QpOwog ICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAg ICAKICAgICAgICBfUmJfdHJlZV9ub2RlX2Jhc2UqIF9fdyA9IF9feF9wYXJlbnQtPl9NX2xlZnQ7 CiAgICAgICAgaWYgKF9fdy0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpIHsKICAgICAgICAg IF9fdy0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAgICAgICAgX194X3BhcmVudC0+ X01fY29sb3IgPSBfU19yYl90cmVlX3JlZDsKICAgICAgICAgIF9SYl90cmVlX3JvdGF0ZV9yaWdo dChfX3hfcGFyZW50LCBfX3Jvb3QpOwogICAgICAgICAgX193ID0gX194X3BhcmVudC0+X01fbGVm dDsKICAgICAgICB9CiAgICAgICAgaWYgKChfX3ctPl9NX3JpZ2h0ID09IDAgfHwgCiAgICAgICAg ICAgICBfX3ctPl9NX3JpZ2h0LT5fTV9jb2xvciA9PSBfU19yYl90cmVlX2JsYWNrKSAmJgogICAg ICAgICAgICAoX193LT5fTV9sZWZ0ID09IDAgfHwgCiAgICAgICAgICAgICBfX3ctPl9NX2xlZnQt Pl9NX2NvbG9yID09IF9TX3JiX3RyZWVfYmxhY2spKSB7CiAgICAgICAgICBfX3ctPl9NX2NvbG9y ID0gX1NfcmJfdHJlZV9yZWQ7CiAgICAgICAgICBfX3ggPSBfX3hfcGFyZW50OwogICAgICAgICAg X194X3BhcmVudCA9IF9feF9wYXJlbnQtPl9NX3BhcmVudDsKICAgICAgICB9IGVsc2UgewogICAg ICAgICAgaWYgKF9fdy0+X01fbGVmdCA9PSAwIHx8IAogICAgICAgICAgICAgIF9fdy0+X01fbGVm dC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9ibGFjaykgewogICAgICAgICAgICBpZiAoX193LT5f TV9yaWdodCkgX193LT5fTV9yaWdodC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAg ICAgICAgICBfX3ctPl9NX2NvbG9yID0gX1NfcmJfdHJlZV9yZWQ7CiAgICAgICAgICAgIF9SYl90 cmVlX3JvdGF0ZV9sZWZ0KF9fdywgX19yb290KTsKICAgICAgICAgICAgX193ID0gX194X3BhcmVu dC0+X01fbGVmdDsKICAgICAgICAgIH0KICAgICAgICAgIF9fdy0+X01fY29sb3IgPSBfX3hfcGFy ZW50LT5fTV9jb2xvcjsKICAgICAgICAgIF9feF9wYXJlbnQtPl9NX2NvbG9yID0gX1NfcmJfdHJl ZV9ibGFjazsKICAgICAgICAgIGlmIChfX3ctPl9NX2xlZnQpIF9fdy0+X01fbGVmdC0+X01fY29s b3IgPSBfU19yYl90cmVlX2JsYWNrOwogICAgICAgICAgX1JiX3RyZWVfcm90YXRlX3JpZ2h0KF9f eF9wYXJlbnQsIF9fcm9vdCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAg IGlmIChfX3gpIF9feC0+X01fY29sb3IgPSBfU19yYl90cmVlX2JsYWNrOwogIH0KICByZXR1cm4g X195Owp9CgogCiAKIAogCgoKCiAKdGVtcGxhdGUgPGNsYXNzIF9UcCwgY2xhc3MgX0FsbG9jLCBi b29sIF9TX2luc3RhbmNlbGVzcz4KY2xhc3MgX1JiX3RyZWVfYWxsb2NfYmFzZSB7CnB1YmxpYzoK ICB0eXBlZGVmIHR5cGVuYW1lIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjphbGxvY2F0b3Jf dHlwZSBhbGxvY2F0b3JfdHlwZTsKICBhbGxvY2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29u c3QgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3I7IH0KCiAgX1JiX3RyZWVfYWxsb2NfYmFzZShj b25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQogICAgOiBfTV9ub2RlX2FsbG9jYXRvcihfX2EpLCBf TV9oZWFkZXIoMCkge30KCnByb3RlY3RlZDoKICB0eXBlbmFtZSBfQWxsb2NfdHJhaXRzPF9SYl90 cmVlX25vZGU8X1RwPiwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUKICAgICAgICAgICBfTV9ub2Rl X2FsbG9jYXRvcjsKICBfUmJfdHJlZV9ub2RlPF9UcD4qIF9NX2hlYWRlcjsKCiAgX1JiX3RyZWVf bm9kZTxfVHA+KiBfTV9nZXRfbm9kZSgpIAogICAgeyByZXR1cm4gX01fbm9kZV9hbGxvY2F0b3Iu YWxsb2NhdGUoMSk7IH0KICB2b2lkIF9NX3B1dF9ub2RlKF9SYl90cmVlX25vZGU8X1RwPiogX19w KSAKICAgIHsgX01fbm9kZV9hbGxvY2F0b3IuZGVhbGxvY2F0ZShfX3AsIDEpOyB9Cn07CgogCnRl bXBsYXRlIDxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYz4KY2xhc3MgX1JiX3RyZWVfYWxsb2NfYmFz ZTxfVHAsIF9BbGxvYywgdHJ1ZT4gewpwdWJsaWM6CiAgdHlwZWRlZiB0eXBlbmFtZSBfQWxsb2Nf dHJhaXRzPF9UcCwgX0FsbG9jPjo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9yX3R5cGU7CiAgYWxs b2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9jYXRvcl90eXBl KCk7IH0KCiAgX1JiX3RyZWVfYWxsb2NfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYpIDogX01f aGVhZGVyKDApIHt9Cgpwcm90ZWN0ZWQ6CiAgX1JiX3RyZWVfbm9kZTxfVHA+KiBfTV9oZWFkZXI7 CgogIHR5cGVkZWYgdHlwZW5hbWUgX0FsbG9jX3RyYWl0czxfUmJfdHJlZV9ub2RlPF9UcD4sIF9B bGxvYz46Ol9BbGxvY190eXBlCiAgICAgICAgICBfQWxsb2NfdHlwZTsKCiAgX1JiX3RyZWVfbm9k ZTxfVHA+KiBfTV9nZXRfbm9kZSgpCiAgICB7IHJldHVybiBfQWxsb2NfdHlwZTo6YWxsb2NhdGUo MSk7IH0KICB2b2lkIF9NX3B1dF9ub2RlKF9SYl90cmVlX25vZGU8X1RwPiogX19wKQogICAgeyBf QWxsb2NfdHlwZTo6ZGVhbGxvY2F0ZShfX3AsIDEpOyB9Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1Rw LCBjbGFzcyBfQWxsb2M+CnN0cnVjdCBfUmJfdHJlZV9iYXNlCiAgOiBwdWJsaWMgX1JiX3RyZWVf YWxsb2NfYmFzZTxfVHAsIF9BbGxvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9B bGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjpfU19pbnN0YW5jZWxlc3M+CnsKICB0eXBlZGVmIF9S Yl90cmVlX2FsbG9jX2Jhc2U8X1RwLCBfQWxsb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIF9BbGxvY190cmFpdHM8X1RwLCBfQWxsb2M+OjpfU19pbnN0YW5jZWxlc3M+CiAgICAgICAg ICBfQmFzZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0 b3JfdHlwZTsKCiAgX1JiX3RyZWVfYmFzZShjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKSAKICAg IDogX0Jhc2UoX19hKSB7IF9NX2hlYWRlciA9IF9NX2dldF9ub2RlKCk7IH0KICB+X1JiX3RyZWVf YmFzZSgpIHsgX01fcHV0X25vZGUoX01faGVhZGVyKTsgfQoKfTsKCiMgNTE5ICIvdXNyL2xpYi9n Y2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysr LTMvc3RsX3RyZWUuaCIgMwoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNs YXNzIF9LZXlPZlZhbHVlLCBjbGFzcyBfQ29tcGFyZSwKICAgICAgICAgIGNsYXNzIF9BbGxvYyA9 IGFsbG9jYXRvcjwgX1ZhbHVlID4gID4KY2xhc3MgX1JiX3RyZWUgOiBwcm90ZWN0ZWQgX1JiX3Ry ZWVfYmFzZTxfVmFsdWUsIF9BbGxvYz4gewogIHR5cGVkZWYgX1JiX3RyZWVfYmFzZTxfVmFsdWUs IF9BbGxvYz4gX0Jhc2U7CnByb3RlY3RlZDoKICB0eXBlZGVmIF9SYl90cmVlX25vZGVfYmFzZSog X0Jhc2VfcHRyOwogIHR5cGVkZWYgX1JiX3RyZWVfbm9kZTxfVmFsdWU+IF9SYl90cmVlX25vZGU7 CiAgdHlwZWRlZiBfUmJfdHJlZV9Db2xvcl90eXBlIF9Db2xvcl90eXBlOwpwdWJsaWM6CiAgdHlw ZWRlZiBfS2V5IGtleV90eXBlOwogIHR5cGVkZWYgX1ZhbHVlIHZhbHVlX3R5cGU7CiAgdHlwZWRl ZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3Rf cG9pbnRlcjsKICB0eXBlZGVmIHZhbHVlX3R5cGUmIHJlZmVyZW5jZTsKICB0eXBlZGVmIGNvbnN0 IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKICB0eXBlZGVmIF9SYl90cmVlX25vZGUqIF9M aW5rX3R5cGU7CiAgdHlwZWRlZiBzaXplX3Qgc2l6ZV90eXBlOwogIHR5cGVkZWYgcHRyZGlmZl90 IGRpZmZlcmVuY2VfdHlwZTsKCiAgdHlwZWRlZiB0eXBlbmFtZSBfQmFzZTo6YWxsb2NhdG9yX3R5 cGUgYWxsb2NhdG9yX3R5cGU7CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0 IHsgcmV0dXJuIF9CYXNlOjpnZXRfYWxsb2NhdG9yKCk7IH0KCnByb3RlY3RlZDoKCgoKCgoKcHJv dGVjdGVkOgoKICBfTGlua190eXBlIF9NX2NyZWF0ZV9ub2RlKGNvbnN0IHZhbHVlX3R5cGUmIF9f eCkKICB7CiAgICBfTGlua190eXBlIF9fdG1wID0gX01fZ2V0X25vZGUoKTsKICAgIHRyeSAgewog ICAgICBjb25zdHJ1Y3QoJl9fdG1wLT5fTV92YWx1ZV9maWVsZCwgX194KTsKICAgIH0KICAgIGNh dGNoKC4uLikgeyAgX01fcHV0X25vZGUoX190bXApIDsgdGhyb3c7IH0gOwogICAgcmV0dXJuIF9f dG1wOwogIH0KCiAgX0xpbmtfdHlwZSBfTV9jbG9uZV9ub2RlKF9MaW5rX3R5cGUgX194KQogIHsK ICAgIF9MaW5rX3R5cGUgX190bXAgPSBfTV9jcmVhdGVfbm9kZShfX3gtPl9NX3ZhbHVlX2ZpZWxk KTsKICAgIF9fdG1wLT5fTV9jb2xvciA9IF9feC0+X01fY29sb3I7CiAgICBfX3RtcC0+X01fbGVm dCA9IDA7CiAgICBfX3RtcC0+X01fcmlnaHQgPSAwOwogICAgcmV0dXJuIF9fdG1wOwogIH0KCiAg dm9pZCBkZXN0cm95X25vZGUoX0xpbmtfdHlwZSBfX3ApCiAgewogICAgZGVzdHJveSgmX19wLT5f TV92YWx1ZV9maWVsZCk7CiAgICBfTV9wdXRfbm9kZShfX3ApOwogIH0KCnByb3RlY3RlZDoKICBz aXplX3R5cGUgX01fbm9kZV9jb3VudDsgIAogIF9Db21wYXJlIF9NX2tleV9jb21wYXJlOwoKICBf TGlua190eXBlJiBfTV9yb290KCkgY29uc3QgCiAgICB7IHJldHVybiAoX0xpbmtfdHlwZSYpIF9N X2hlYWRlci0+X01fcGFyZW50OyB9CiAgX0xpbmtfdHlwZSYgX01fbGVmdG1vc3QoKSBjb25zdCAK ICAgIHsgcmV0dXJuIChfTGlua190eXBlJikgX01faGVhZGVyLT5fTV9sZWZ0OyB9CiAgX0xpbmtf dHlwZSYgX01fcmlnaHRtb3N0KCkgY29uc3QgCiAgICB7IHJldHVybiAoX0xpbmtfdHlwZSYpIF9N X2hlYWRlci0+X01fcmlnaHQ7IH0KCiAgc3RhdGljIF9MaW5rX3R5cGUmIF9TX2xlZnQoX0xpbmtf dHlwZSBfX3gpCiAgICB7IHJldHVybiAoX0xpbmtfdHlwZSYpKF9feC0+X01fbGVmdCk7IH0KICBz dGF0aWMgX0xpbmtfdHlwZSYgX1NfcmlnaHQoX0xpbmtfdHlwZSBfX3gpCiAgICB7IHJldHVybiAo X0xpbmtfdHlwZSYpKF9feC0+X01fcmlnaHQpOyB9CiAgc3RhdGljIF9MaW5rX3R5cGUmIF9TX3Bh cmVudChfTGlua190eXBlIF9feCkKICAgIHsgcmV0dXJuIChfTGlua190eXBlJikoX194LT5fTV9w YXJlbnQpOyB9CiAgc3RhdGljIHJlZmVyZW5jZSBfU192YWx1ZShfTGlua190eXBlIF9feCkKICAg IHsgcmV0dXJuIF9feC0+X01fdmFsdWVfZmllbGQ7IH0KICBzdGF0aWMgY29uc3QgX0tleSYgX1Nf a2V5KF9MaW5rX3R5cGUgX194KQogICAgeyByZXR1cm4gX0tleU9mVmFsdWUoKShfU192YWx1ZShf X3gpKTsgfQogIHN0YXRpYyBfQ29sb3JfdHlwZSYgX1NfY29sb3IoX0xpbmtfdHlwZSBfX3gpCiAg ICB7IHJldHVybiAoX0NvbG9yX3R5cGUmKShfX3gtPl9NX2NvbG9yKTsgfQoKICBzdGF0aWMgX0xp bmtfdHlwZSYgX1NfbGVmdChfQmFzZV9wdHIgX194KQogICAgeyByZXR1cm4gKF9MaW5rX3R5cGUm KShfX3gtPl9NX2xlZnQpOyB9CiAgc3RhdGljIF9MaW5rX3R5cGUmIF9TX3JpZ2h0KF9CYXNlX3B0 ciBfX3gpCiAgICB7IHJldHVybiAoX0xpbmtfdHlwZSYpKF9feC0+X01fcmlnaHQpOyB9CiAgc3Rh dGljIF9MaW5rX3R5cGUmIF9TX3BhcmVudChfQmFzZV9wdHIgX194KQogICAgeyByZXR1cm4gKF9M aW5rX3R5cGUmKShfX3gtPl9NX3BhcmVudCk7IH0KICBzdGF0aWMgcmVmZXJlbmNlIF9TX3ZhbHVl KF9CYXNlX3B0ciBfX3gpCiAgICB7IHJldHVybiAoKF9MaW5rX3R5cGUpX194KS0+X01fdmFsdWVf ZmllbGQ7IH0KICBzdGF0aWMgY29uc3QgX0tleSYgX1Nfa2V5KF9CYXNlX3B0ciBfX3gpCiAgICB7 IHJldHVybiBfS2V5T2ZWYWx1ZSgpKF9TX3ZhbHVlKF9MaW5rX3R5cGUoX194KSkpO30gCiAgc3Rh dGljIF9Db2xvcl90eXBlJiBfU19jb2xvcihfQmFzZV9wdHIgX194KQogICAgeyByZXR1cm4gKF9D b2xvcl90eXBlJikoX0xpbmtfdHlwZShfX3gpLT5fTV9jb2xvcik7IH0KCiAgc3RhdGljIF9MaW5r X3R5cGUgX1NfbWluaW11bShfTGlua190eXBlIF9feCkgCiAgICB7IHJldHVybiAoX0xpbmtfdHlw ZSkgIF9SYl90cmVlX25vZGVfYmFzZTo6X1NfbWluaW11bShfX3gpOyB9CgogIHN0YXRpYyBfTGlu a190eXBlIF9TX21heGltdW0oX0xpbmtfdHlwZSBfX3gpCiAgICB7IHJldHVybiAoX0xpbmtfdHlw ZSkgX1JiX3RyZWVfbm9kZV9iYXNlOjpfU19tYXhpbXVtKF9feCk7IH0KCnB1YmxpYzoKICB0eXBl ZGVmIF9SYl90cmVlX2l0ZXJhdG9yPHZhbHVlX3R5cGUsIHJlZmVyZW5jZSwgcG9pbnRlcj4gaXRl cmF0b3I7CiAgdHlwZWRlZiBfUmJfdHJlZV9pdGVyYXRvcjx2YWx1ZV90eXBlLCBjb25zdF9yZWZl cmVuY2UsIGNvbnN0X3BvaW50ZXI+IAogICAgICAgICAgY29uc3RfaXRlcmF0b3I7CgoKICB0eXBl ZGVmIHJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0 b3I7CiAgdHlwZWRlZiByZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9y OwoKCgoKCgoKIAoKcHJpdmF0ZToKICBpdGVyYXRvciBfTV9pbnNlcnQoX0Jhc2VfcHRyIF9feCwg X0Jhc2VfcHRyIF9feSwgY29uc3QgdmFsdWVfdHlwZSYgX192KTsKICBfTGlua190eXBlIF9NX2Nv cHkoX0xpbmtfdHlwZSBfX3gsIF9MaW5rX3R5cGUgX19wKTsKICB2b2lkIF9NX2VyYXNlKF9MaW5r X3R5cGUgX194KTsKCnB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg X1JiX3RyZWUoKQogICAgOiBfQmFzZShhbGxvY2F0b3JfdHlwZSgpKSwgX01fbm9kZV9jb3VudCgw KSwgX01fa2V5X2NvbXBhcmUoKQogICAgeyBfTV9lbXB0eV9pbml0aWFsaXplKCk7IH0KCiAgX1Ji X3RyZWUoY29uc3QgX0NvbXBhcmUmIF9fY29tcCkKICAgIDogX0Jhc2UoYWxsb2NhdG9yX3R5cGUo KSksIF9NX25vZGVfY291bnQoMCksIF9NX2tleV9jb21wYXJlKF9fY29tcCkgCiAgICB7IF9NX2Vt cHR5X2luaXRpYWxpemUoKTsgfQoKICBfUmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21wLCBj b25zdCBhbGxvY2F0b3JfdHlwZSYgX19hKQogICAgOiBfQmFzZShfX2EpLCBfTV9ub2RlX2NvdW50 KDApLCBfTV9rZXlfY29tcGFyZShfX2NvbXApIAogICAgeyBfTV9lbXB0eV9pbml0aWFsaXplKCk7 IH0KCiAgX1JiX3RyZWUoY29uc3QgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0Nv bXBhcmUsX0FsbG9jPiYgX194KSAKICAgIDogX0Jhc2UoX194LmdldF9hbGxvY2F0b3IoKSksCiAg ICAgIF9NX25vZGVfY291bnQoMCksIF9NX2tleV9jb21wYXJlKF9feC5fTV9rZXlfY29tcGFyZSkK ICB7IAogICAgaWYgKF9feC5fTV9yb290KCkgPT0gMCkKICAgICAgX01fZW1wdHlfaW5pdGlhbGl6 ZSgpOwogICAgZWxzZSB7CiAgICAgIF9TX2NvbG9yKF9NX2hlYWRlcikgPSBfU19yYl90cmVlX3Jl ZDsKICAgICAgX01fcm9vdCgpID0gX01fY29weShfX3guX01fcm9vdCgpLCBfTV9oZWFkZXIpOwog ICAgICBfTV9sZWZ0bW9zdCgpID0gX1NfbWluaW11bShfTV9yb290KCkpOwogICAgICBfTV9yaWdo dG1vc3QoKSA9IF9TX21heGltdW0oX01fcm9vdCgpKTsKICAgIH0KICAgIF9NX25vZGVfY291bnQg PSBfX3guX01fbm9kZV9jb3VudDsKICB9CiAgfl9SYl90cmVlKCkgeyBjbGVhcigpOyB9CiAgX1Ji X3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgCiAgb3BlcmF0 b3I9KGNvbnN0IF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxv Yz4mIF9feCk7Cgpwcml2YXRlOgogIHZvaWQgX01fZW1wdHlfaW5pdGlhbGl6ZSgpIHsKICAgIF9T X2NvbG9yKF9NX2hlYWRlcikgPSBfU19yYl90cmVlX3JlZDsgIAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBfTV9yb290KCkgPSAwOwogICAgX01fbGVmdG1v c3QoKSA9IF9NX2hlYWRlcjsKICAgIF9NX3JpZ2h0bW9zdCgpID0gX01faGVhZGVyOwogIH0KCnB1 YmxpYzogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIF9Db21wYXJlIGtl eV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fa2V5X2NvbXBhcmU7IH0KICBpdGVyYXRvciBiZWdp bigpIHsgcmV0dXJuIF9NX2xlZnRtb3N0KCk7IH0KICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNv bnN0IHsgcmV0dXJuIF9NX2xlZnRtb3N0KCk7IH0KICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBf TV9oZWFkZXI7IH0KICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfTV9oZWFk ZXI7IH0KICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0 b3IoZW5kKCkpOyB9CiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IAog ICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyAKICB9CiAgcmV2ZXJzZV9p dGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsgfQogIGNv bnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgCiAgICByZXR1cm4gY29uc3RfcmV2 ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKICB9IAogIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVy biBfTV9ub2RlX2NvdW50ID09IDA7IH0KICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJu IF9NX25vZGVfY291bnQ7IH0KICBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBz aXplX3R5cGUoLTEpOyB9CgogIHZvaWQgc3dhcChfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZW YWx1ZSxfQ29tcGFyZSxfQWxsb2M+JiBfX3QpIHsKICAgICA6OnN3YXAoX01faGVhZGVyLCBfX3Qu X01faGVhZGVyKTsKICAgICA6OnN3YXAoX01fbm9kZV9jb3VudCwgX190Ll9NX25vZGVfY291bnQp OwogICAgIDo6c3dhcChfTV9rZXlfY29tcGFyZSwgX190Ll9NX2tleV9jb21wYXJlKTsKICB9CiAg ICAKcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBwYWlyPGl0ZXJh dG9yLGJvb2w+IGluc2VydF91bmlxdWUoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKICBpdGVyYXRv ciBpbnNlcnRfZXF1YWwoY29uc3QgdmFsdWVfdHlwZSYgX194KTsKCiAgaXRlcmF0b3IgaW5zZXJ0 X3VuaXF1ZShpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBlJiBfX3gpOwogIGl0 ZXJhdG9yIGluc2VydF9lcXVhbChpdGVyYXRvciBfX3Bvc2l0aW9uLCBjb25zdCB2YWx1ZV90eXBl JiBfX3gpOwoKCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0 X3VuaXF1ZShfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOwog IHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4KICB2b2lkIGluc2VydF9lcXVhbChfSW5w dXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xhc3QpOwoKCgoKCgoKICB2b2lk IGVyYXNlKGl0ZXJhdG9yIF9fcG9zaXRpb24pOwogIHNpemVfdHlwZSBlcmFzZShjb25zdCBrZXlf dHlwZSYgX194KTsKICB2b2lkIGVyYXNlKGl0ZXJhdG9yIF9fZmlyc3QsIGl0ZXJhdG9yIF9fbGFz dCk7CiAgdm9pZCBlcmFzZShjb25zdCBrZXlfdHlwZSogX19maXJzdCwgY29uc3Qga2V5X3R5cGUq IF9fbGFzdCk7CiAgdm9pZCBjbGVhcigpIHsKICAgIGlmIChfTV9ub2RlX2NvdW50ICE9IDApIHsK ICAgICAgX01fZXJhc2UoX01fcm9vdCgpKTsKICAgICAgX01fbGVmdG1vc3QoKSA9IF9NX2hlYWRl cjsKICAgICAgX01fcm9vdCgpID0gMDsKICAgICAgX01fcmlnaHRtb3N0KCkgPSBfTV9oZWFkZXI7 CiAgICAgIF9NX25vZGVfY291bnQgPSAwOwogICAgfQogIH0gICAgICAKCnB1YmxpYzoKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlw ZSYgX194KTsKICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0 OwogIHNpemVfdHlwZSBjb3VudChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdDsKICBpdGVyYXRv ciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KTsKICBjb25zdF9pdGVyYXRvciBsb3dl cl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSBjb25zdDsKICBpdGVyYXRvciB1cHBlcl9ib3Vu ZChjb25zdCBrZXlfdHlwZSYgX194KTsKICBjb25zdF9pdGVyYXRvciB1cHBlcl9ib3VuZChjb25z dCBrZXlfdHlwZSYgX194KSBjb25zdDsKICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9y YW5nZShjb25zdCBrZXlfdHlwZSYgX194KTsKICBwYWlyPGNvbnN0X2l0ZXJhdG9yLCBjb25zdF9p dGVyYXRvcj4gZXF1YWxfcmFuZ2UoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3Q7CgpwdWJsaWM6 CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGJvb2wgX19yYl92ZXJpZnkoKSBj b25zdDsKfTsKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlP ZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CmlubGluZSBi b29sIApvcGVyYXRvcj09KGNvbnN0IF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9D b21wYXJlLF9BbGxvYz4mIF9feCwgCiAgICAgICAgICAgY29uc3QgX1JiX3RyZWU8X0tleSxfVmFs dWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgX195KQp7CiAgcmV0dXJuIF9feC5zaXpl KCkgPT0gX195LnNpemUoKSAmJgogICAgICAgICBlcXVhbChfX3guYmVnaW4oKSwgX194LmVuZCgp LCBfX3kuYmVnaW4oKSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNs YXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+ CmlubGluZSBib29sIApvcGVyYXRvcjwoY29uc3QgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9m VmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAgICAgICAgIGNvbnN0IF9SYl90cmVlPF9L ZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4mIF9feSkKewogIHJldHVybiBs ZXhpY29ncmFwaGljYWxfY29tcGFyZShfX3guYmVnaW4oKSwgX194LmVuZCgpLCAKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgX195LmJlZ2luKCksIF9feS5lbmQoKSk7Cn0KCgoKdGVt cGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAg ICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgCnN3YXAoX1Ji X3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAg ICBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+JiBfX3kp CnsKICBfX3guc3dhcChfX3kpOwp9CgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1Zh bHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3Mg X0FsbG9jPgpfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+ JiAKX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6 b3BlcmF0b3I9KGNvbnN0IF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJl LF9BbGxvYz4mIF9feCkKewogIGlmICh0aGlzICE9ICZfX3gpIHsKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCiAgICBjbGVhcigpOwogICAgX01fbm9kZV9jb3VudCA9IDA7CiAgICBf TV9rZXlfY29tcGFyZSA9IF9feC5fTV9rZXlfY29tcGFyZTsgICAgICAgIAogICAgaWYgKF9feC5f TV9yb290KCkgPT0gMCkgewogICAgICBfTV9yb290KCkgPSAwOwogICAgICBfTV9sZWZ0bW9zdCgp ID0gX01faGVhZGVyOwogICAgICBfTV9yaWdodG1vc3QoKSA9IF9NX2hlYWRlcjsKICAgIH0KICAg IGVsc2UgewogICAgICBfTV9yb290KCkgPSBfTV9jb3B5KF9feC5fTV9yb290KCksIF9NX2hlYWRl cik7CiAgICAgIF9NX2xlZnRtb3N0KCkgPSBfU19taW5pbXVtKF9NX3Jvb3QoKSk7CiAgICAgIF9N X3JpZ2h0bW9zdCgpID0gX1NfbWF4aW11bShfTV9yb290KCkpOwogICAgICBfTV9ub2RlX2NvdW50 ID0gX194Ll9NX25vZGVfY291bnQ7CiAgICB9CiAgfQogIHJldHVybiAqdGhpczsKfQoKdGVtcGxh dGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAg ICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlwZW5hbWUgX1JiX3RyZWU8X0tleSxf VmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3IKX1JiX3RyZWU8X0tl eSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6X01faW5zZXJ0KF9CYXNl X3B0ciBfX3hfLCBfQmFzZV9wdHIgX195XywgY29uc3QgX1ZhbHVlJiBfX3YpCnsKICBfTGlua190 eXBlIF9feCA9IChfTGlua190eXBlKSBfX3hfOwogIF9MaW5rX3R5cGUgX195ID0gKF9MaW5rX3R5 cGUpIF9feV87CiAgX0xpbmtfdHlwZSBfX3o7CgogIGlmIChfX3kgPT0gX01faGVhZGVyIHx8IF9f eCAhPSAwIHx8IAogICAgICBfTV9rZXlfY29tcGFyZShfS2V5T2ZWYWx1ZSgpKF9fdiksIF9TX2tl eShfX3kpKSkgewogICAgX196ID0gX01fY3JlYXRlX25vZGUoX192KTsKICAgIF9TX2xlZnQoX195 KSA9IF9fejsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAogICAgaWYgKF9feSA9PSBfTV9oZWFkZXIpIHsKICAgICAgX01fcm9vdCgpID0gX196 OwogICAgICBfTV9yaWdodG1vc3QoKSA9IF9fejsKICAgIH0KICAgIGVsc2UgaWYgKF9feSA9PSBf TV9sZWZ0bW9zdCgpKQogICAgICBfTV9sZWZ0bW9zdCgpID0gX196OyAgICAKICB9CiAgZWxzZSB7 CiAgICBfX3ogPSBfTV9jcmVhdGVfbm9kZShfX3YpOwogICAgX1NfcmlnaHQoX195KSA9IF9fejsK ICAgIGlmIChfX3kgPT0gX01fcmlnaHRtb3N0KCkpCiAgICAgIF9NX3JpZ2h0bW9zdCgpID0gX196 OyAgIAogIH0KICBfU19wYXJlbnQoX196KSA9IF9feTsKICBfU19sZWZ0KF9feikgPSAwOwogIF9T X3JpZ2h0KF9feikgPSAwOwogIF9SYl90cmVlX3JlYmFsYW5jZShfX3osIF9NX2hlYWRlci0+X01f cGFyZW50KTsKICArK19NX25vZGVfY291bnQ7CiAgcmV0dXJuIGl0ZXJhdG9yKF9feik7Cn0KCnRl bXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAg ICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CnR5cGVuYW1lIF9SYl90cmVlPF9L ZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46Oml0ZXJhdG9yCl9SYl90cmVl PF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Omluc2VydF9lcXVh bChjb25zdCBfVmFsdWUmIF9fdikKewogIF9MaW5rX3R5cGUgX195ID0gX01faGVhZGVyOwogIF9M aW5rX3R5cGUgX194ID0gX01fcm9vdCgpOwogIHdoaWxlIChfX3ggIT0gMCkgewogICAgX195ID0g X194OwogICAgX194ID0gX01fa2V5X2NvbXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19rZXko X194KSkgPyAKICAgICAgICAgICAgX1NfbGVmdChfX3gpIDogX1NfcmlnaHQoX194KTsKICB9CiAg cmV0dXJuIF9NX2luc2VydChfX3gsIF9feSwgX192KTsKfQoKCnRlbXBsYXRlIDxjbGFzcyBfS2V5 LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21w YXJlLCBjbGFzcyBfQWxsb2M+CnBhaXI8dHlwZW5hbWUgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tl eU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3IsIAogICAgIGJvb2w+Cl9SYl90cmVl PF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Omluc2VydF91bmlx dWUoY29uc3QgX1ZhbHVlJiBfX3YpCnsKICBfTGlua190eXBlIF9feSA9IF9NX2hlYWRlcjsKICBf TGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsKICBib29sIF9fY29tcCA9IHRydWU7CiAgd2hpbGUg KF9feCAhPSAwKSB7CiAgICBfX3kgPSBfX3g7CiAgICBfX2NvbXAgPSBfTV9rZXlfY29tcGFyZShf S2V5T2ZWYWx1ZSgpKF9fdiksIF9TX2tleShfX3gpKTsKICAgIF9feCA9IF9fY29tcCA/IF9TX2xl ZnQoX194KSA6IF9TX3JpZ2h0KF9feCk7CiAgfQogIGl0ZXJhdG9yIF9faiA9IGl0ZXJhdG9yKF9f eSk7ICAgCiAgaWYgKF9fY29tcCkKICAgIGlmIChfX2ogPT0gYmVnaW4oKSkgICAgIAogICAgICBy ZXR1cm4gcGFpcjxpdGVyYXRvcixib29sPihfTV9pbnNlcnQoX194LCBfX3ksIF9fdiksIHRydWUp OwogICAgZWxzZQogICAgICAtLV9fajsKICBpZiAoX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9fai5f TV9ub2RlKSwgX0tleU9mVmFsdWUoKShfX3YpKSkKICAgIHJldHVybiBwYWlyPGl0ZXJhdG9yLGJv b2w+KF9NX2luc2VydChfX3gsIF9feSwgX192KSwgdHJ1ZSk7CiAgcmV0dXJuIHBhaXI8aXRlcmF0 b3IsYm9vbD4oX19qLCBmYWxzZSk7Cn0KCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1Zh bCwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9B bGxvYz4KdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9Db21wYXJl LCBfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8X0tleSwgX1ZhbCwgX0tleU9mVmFsdWUsIF9D b21wYXJlLCBfQWxsb2M+CiAgOjppbnNlcnRfdW5pcXVlKGl0ZXJhdG9yIF9fcG9zaXRpb24sIGNv bnN0IF9WYWwmIF9fdikKewogIGlmIChfX3Bvc2l0aW9uLl9NX25vZGUgPT0gX01faGVhZGVyLT5f TV9sZWZ0KSB7ICAKICAgIGlmIChzaXplKCkgPiAwICYmIAogICAgICAgIF9NX2tleV9jb21wYXJl KF9LZXlPZlZhbHVlKCkoX192KSwgX1Nfa2V5KF9fcG9zaXRpb24uX01fbm9kZSkpKQogICAgICBy ZXR1cm4gX01faW5zZXJ0KF9fcG9zaXRpb24uX01fbm9kZSwgX19wb3NpdGlvbi5fTV9ub2RlLCBf X3YpOwogICAgIAogICAgZWxzZQogICAgICByZXR1cm4gaW5zZXJ0X3VuaXF1ZShfX3YpLmZpcnN0 OwogIH0gZWxzZSBpZiAoX19wb3NpdGlvbi5fTV9ub2RlID09IF9NX2hlYWRlcikgeyAgCiAgICBp ZiAoX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9NX3JpZ2h0bW9zdCgpKSwgX0tleU9mVmFsdWUoKShf X3YpKSkKICAgICAgcmV0dXJuIF9NX2luc2VydCgwLCBfTV9yaWdodG1vc3QoKSwgX192KTsKICAg IGVsc2UKICAgICAgcmV0dXJuIGluc2VydF91bmlxdWUoX192KS5maXJzdDsKICB9IGVsc2Ugewog ICAgaXRlcmF0b3IgX19iZWZvcmUgPSBfX3Bvc2l0aW9uOwogICAgLS1fX2JlZm9yZTsKICAgIGlm IChfTV9rZXlfY29tcGFyZShfU19rZXkoX19iZWZvcmUuX01fbm9kZSksIF9LZXlPZlZhbHVlKCko X192KSkgCiAgICAgICAgJiYgX01fa2V5X2NvbXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19r ZXkoX19wb3NpdGlvbi5fTV9ub2RlKSkpIHsKICAgICAgaWYgKF9TX3JpZ2h0KF9fYmVmb3JlLl9N X25vZGUpID09IDApCiAgICAgICAgcmV0dXJuIF9NX2luc2VydCgwLCBfX2JlZm9yZS5fTV9ub2Rl LCBfX3YpOyAKICAgICAgZWxzZQogICAgICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5f TV9ub2RlLCBfX3Bvc2l0aW9uLl9NX25vZGUsIF9fdik7CiAgICAgCiAgICB9IGVsc2UKICAgICAg cmV0dXJuIGluc2VydF91bmlxdWUoX192KS5maXJzdDsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBf S2V5LCBjbGFzcyBfVmFsLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29t cGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWwsX0tleU9mVmFs dWUsX0NvbXBhcmUsX0FsbG9jPjo6aXRlcmF0b3IgCl9SYl90cmVlPF9LZXksX1ZhbCxfS2V5T2ZW YWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAgOjppbnNlcnRfZXF1YWwoaXRlcmF0b3IgX19wb3NpdGlv biwgY29uc3QgX1ZhbCYgX192KQp7CiAgaWYgKF9fcG9zaXRpb24uX01fbm9kZSA9PSBfTV9oZWFk ZXItPl9NX2xlZnQpIHsgIAogICAgaWYgKHNpemUoKSA+IDAgJiYgCiAgICAgICAgX01fa2V5X2Nv bXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19rZXkoX19wb3NpdGlvbi5fTV9ub2RlKSkpCiAg ICAgIHJldHVybiBfTV9pbnNlcnQoX19wb3NpdGlvbi5fTV9ub2RlLCBfX3Bvc2l0aW9uLl9NX25v ZGUsIF9fdik7CiAgICAgCiAgICBlbHNlCiAgICAgIHJldHVybiBpbnNlcnRfZXF1YWwoX192KTsK ICB9IGVsc2UgaWYgKF9fcG9zaXRpb24uX01fbm9kZSA9PSBfTV9oZWFkZXIpIHsgCiAgICBpZiAo IV9NX2tleV9jb21wYXJlKF9LZXlPZlZhbHVlKCkoX192KSwgX1Nfa2V5KF9NX3JpZ2h0bW9zdCgp KSkpCiAgICAgIHJldHVybiBfTV9pbnNlcnQoMCwgX01fcmlnaHRtb3N0KCksIF9fdik7CiAgICBl bHNlCiAgICAgIHJldHVybiBpbnNlcnRfZXF1YWwoX192KTsKICB9IGVsc2UgewogICAgaXRlcmF0 b3IgX19iZWZvcmUgPSBfX3Bvc2l0aW9uOwogICAgLS1fX2JlZm9yZTsKICAgIGlmICghX01fa2V5 X2NvbXBhcmUoX0tleU9mVmFsdWUoKShfX3YpLCBfU19rZXkoX19iZWZvcmUuX01fbm9kZSkpCiAg ICAgICAgJiYgIV9NX2tleV9jb21wYXJlKF9TX2tleShfX3Bvc2l0aW9uLl9NX25vZGUpLCBfS2V5 T2ZWYWx1ZSgpKF9fdikpKSB7CiAgICAgIGlmIChfU19yaWdodChfX2JlZm9yZS5fTV9ub2RlKSA9 PSAwKQogICAgICAgIHJldHVybiBfTV9pbnNlcnQoMCwgX19iZWZvcmUuX01fbm9kZSwgX192KTsg CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gX01faW5zZXJ0KF9fcG9zaXRpb24uX01fbm9kZSwg X19wb3NpdGlvbi5fTV9ub2RlLCBfX3YpOwogICAgIAogICAgfSBlbHNlCiAgICAgIHJldHVybiBp bnNlcnRfZXF1YWwoX192KTsKICB9Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9W YWwsIGNsYXNzIF9Lb1YsIGNsYXNzIF9DbXAsIGNsYXNzIF9BbGxvYz4KICB0ZW1wbGF0ZTxjbGFz cyBfSUk+CnZvaWQgX1JiX3RyZWU8X0tleSxfVmFsLF9Lb1YsX0NtcCxfQWxsb2M+CiAgOjppbnNl cnRfZXF1YWwoX0lJIF9fZmlyc3QsIF9JSSBfX2xhc3QpCnsKICBmb3IgKCA7IF9fZmlyc3QgIT0g X19sYXN0OyArK19fZmlyc3QpCiAgICBpbnNlcnRfZXF1YWwoKl9fZmlyc3QpOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbCwgY2xhc3MgX0tvViwgY2xhc3MgX0NtcCwgY2xhc3Mg X0FsbG9jPiAKICB0ZW1wbGF0ZTxjbGFzcyBfSUk+CnZvaWQgX1JiX3RyZWU8X0tleSxfVmFsLF9L b1YsX0NtcCxfQWxsb2M+CiAgOjppbnNlcnRfdW5pcXVlKF9JSSBfX2ZpcnN0LCBfSUkgX19sYXN0 KSB7CiAgZm9yICggOyBfX2ZpcnN0ICE9IF9fbGFzdDsgKytfX2ZpcnN0KQogICAgaW5zZXJ0X3Vu aXF1ZSgqX19maXJzdCk7Cn0KCiMgMTAyMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtl LWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF90cmVlLmgiIDMKCiAg ICAgICAgIAp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZW YWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgdm9p ZCBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAgOjpl cmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKQp7CiAgX0xpbmtfdHlwZSBfX3kgPSAKICAgIChfTGlu a190eXBlKSBfUmJfdHJlZV9yZWJhbGFuY2VfZm9yX2VyYXNlKF9fcG9zaXRpb24uX01fbm9kZSwK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NX2hlYWRlci0+ X01fcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg X01faGVhZGVyLT5fTV9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX01faGVhZGVyLT5fTV9yaWdodCk7CiAgZGVzdHJveV9ub2RlKF9feSk7CiAgLS1f TV9ub2RlX2NvdW50Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFz cyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp0 eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+ OjpzaXplX3R5cGUgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9B bGxvYz46OmVyYXNlKGNvbnN0IF9LZXkmIF9feCkKewogIHBhaXI8aXRlcmF0b3IsaXRlcmF0b3I+ IF9fcCA9IGVxdWFsX3JhbmdlKF9feCk7CiAgc2l6ZV90eXBlIF9fbiA9IDA7CiAgZGlzdGFuY2Uo X19wLmZpcnN0LCBfX3Auc2Vjb25kLCBfX24pOwogIGVyYXNlKF9fcC5maXJzdCwgX19wLnNlY29u ZCk7CiAgcmV0dXJuIF9fbjsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWwsIGNs YXNzIF9Lb1YsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CnR5cGVuYW1lIF9SYl90cmVl PF9LZXksIF9WYWwsIF9Lb1YsIF9Db21wYXJlLCBfQWxsb2M+OjpfTGlua190eXBlIApfUmJfdHJl ZTxfS2V5LF9WYWwsX0tvVixfQ29tcGFyZSxfQWxsb2M+CiAgOjpfTV9jb3B5KF9MaW5rX3R5cGUg X194LCBfTGlua190eXBlIF9fcCkKewogICAgICAgICAgICAgICAgICAgICAgICAgCiAgX0xpbmtf dHlwZSBfX3RvcCA9IF9NX2Nsb25lX25vZGUoX194KTsKICBfX3RvcC0+X01fcGFyZW50ID0gX19w OwogCiAgdHJ5ICB7CiAgICBpZiAoX194LT5fTV9yaWdodCkKICAgICAgX190b3AtPl9NX3JpZ2h0 ID0gX01fY29weShfU19yaWdodChfX3gpLCBfX3RvcCk7CiAgICBfX3AgPSBfX3RvcDsKICAgIF9f eCA9IF9TX2xlZnQoX194KTsKCiAgICB3aGlsZSAoX194ICE9IDApIHsKICAgICAgX0xpbmtfdHlw ZSBfX3kgPSBfTV9jbG9uZV9ub2RlKF9feCk7CiAgICAgIF9fcC0+X01fbGVmdCA9IF9feTsKICAg ICAgX195LT5fTV9wYXJlbnQgPSBfX3A7CiAgICAgIGlmIChfX3gtPl9NX3JpZ2h0KQogICAgICAg IF9feS0+X01fcmlnaHQgPSBfTV9jb3B5KF9TX3JpZ2h0KF9feCksIF9feSk7CiAgICAgIF9fcCA9 IF9feTsKICAgICAgX194ID0gX1NfbGVmdChfX3gpOwogICAgfQogIH0KICBjYXRjaCguLi4pIHsg IF9NX2VyYXNlKF9fdG9wKSA7IHRocm93OyB9IDsKCiAgcmV0dXJuIF9fdG9wOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAg ICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp2b2lkIF9SYl90cmVlPF9LZXksX1ZhbHVl LF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz4KICA6Ol9NX2VyYXNlKF9MaW5rX3R5cGUgX194 KQp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIHdoaWxlIChfX3ggIT0gMCkg ewogICAgX01fZXJhc2UoX1NfcmlnaHQoX194KSk7CiAgICBfTGlua190eXBlIF9feSA9IF9TX2xl ZnQoX194KTsKICAgIGRlc3Ryb3lfbm9kZShfX3gpOwogICAgX194ID0gX195OwogIH0KfQoKdGVt cGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAg ICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4Kdm9pZCBfUmJfdHJlZTxfS2V5LF9W YWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+CiAgOjplcmFzZShpdGVyYXRvciBfX2Zp cnN0LCBpdGVyYXRvciBfX2xhc3QpCnsKICBpZiAoX19maXJzdCA9PSBiZWdpbigpICYmIF9fbGFz dCA9PSBlbmQoKSkKICAgIGNsZWFyKCk7CiAgZWxzZQogICAgd2hpbGUgKF9fZmlyc3QgIT0gX19s YXN0KSBlcmFzZShfX2ZpcnN0KyspOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1Zh bHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3Mg X0FsbG9jPgp2b2lkIF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9B bGxvYz4KICA6OmVyYXNlKGNvbnN0IF9LZXkqIF9fZmlyc3QsIGNvbnN0IF9LZXkqIF9fbGFzdCkg CnsKICB3aGlsZSAoX19maXJzdCAhPSBfX2xhc3QpIGVyYXNlKCpfX2ZpcnN0KyspOwp9Cgp0ZW1w bGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAg ICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5 LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8 X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6ZmluZChjb25zdCBfS2V5 JiBfX2spCnsKICBfTGlua190eXBlIF9feSA9IF9NX2hlYWRlcjsgICAgICAgCiAgX0xpbmtfdHlw ZSBfX3ggPSBfTV9yb290KCk7ICAgICAgIAoKICB3aGlsZSAoX194ICE9IDApIAogICAgaWYgKCFf TV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKICAgICAgX195ID0gX194LCBfX3ggPSBf U19sZWZ0KF9feCk7CiAgICBlbHNlCiAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7CgogIGl0ZXJh dG9yIF9faiA9IGl0ZXJhdG9yKF9feSk7ICAgCiAgcmV0dXJuIChfX2ogPT0gZW5kKCkgfHwgX01f a2V5X2NvbXBhcmUoX19rLCBfU19rZXkoX19qLl9NX25vZGUpKSkgPyAKICAgICBlbmQoKSA6IF9f ajsKfQoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFs dWUsIAogICAgICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KdHlwZW5hbWUgX1Ji X3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPjo6Y29uc3RfaXRl cmF0b3IgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46 OmZpbmQoY29uc3QgX0tleSYgX19rKSBjb25zdAp7CiAgX0xpbmtfdHlwZSBfX3kgPSBfTV9oZWFk ZXI7ICAKICBfTGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsgIAoKICB3aGlsZSAoX194ICE9IDAp IHsKICAgIGlmICghX01fa2V5X2NvbXBhcmUoX1Nfa2V5KF9feCksIF9faykpCiAgICAgIF9feSA9 IF9feCwgX194ID0gX1NfbGVmdChfX3gpOwogICAgZWxzZQogICAgICBfX3ggPSBfU19yaWdodChf X3gpOwogIH0KICBjb25zdF9pdGVyYXRvciBfX2ogPSBjb25zdF9pdGVyYXRvcihfX3kpOyAgIAog IHJldHVybiAoX19qID09IGVuZCgpIHx8IF9NX2tleV9jb21wYXJlKF9faywgX1Nfa2V5KF9fai5f TV9ub2RlKSkpID8KICAgIGVuZCgpIDogX19qOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xh c3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwg Y2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxf Q29tcGFyZSxfQWxsb2M+OjpzaXplX3R5cGUgCl9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZh bHVlLF9Db21wYXJlLF9BbGxvYz4KICA6OmNvdW50KGNvbnN0IF9LZXkmIF9faykgY29uc3QKewog IHBhaXI8Y29uc3RfaXRlcmF0b3IsIGNvbnN0X2l0ZXJhdG9yPiBfX3AgPSBlcXVhbF9yYW5nZShf X2spOwogIHNpemVfdHlwZSBfX24gPSAwOwogIGRpc3RhbmNlKF9fcC5maXJzdCwgX19wLnNlY29u ZCwgX19uKTsKICByZXR1cm4gX19uOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1Zh bHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFyZSwgY2xhc3Mg X0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFy ZSxfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0Nv bXBhcmUsX0FsbG9jPgogIDo6bG93ZXJfYm91bmQoY29uc3QgX0tleSYgX19rKQp7CiAgX0xpbmtf dHlwZSBfX3kgPSBfTV9oZWFkZXI7ICAKICBfTGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsgIAoK ICB3aGlsZSAoX194ICE9IDApIAogICAgaWYgKCFfTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwg X19rKSkKICAgICAgX195ID0gX194LCBfX3ggPSBfU19sZWZ0KF9feCk7CiAgICBlbHNlCiAgICAg IF9feCA9IF9TX3JpZ2h0KF9feCk7CgogIHJldHVybiBpdGVyYXRvcihfX3kpOwp9Cgp0ZW1wbGF0 ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAg ICBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9W YWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+Ojpjb25zdF9pdGVyYXRvciAKX1JiX3Ry ZWU8X0tleSxfVmFsdWUsX0tleU9mVmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6bG93ZXJfYm91 bmQoY29uc3QgX0tleSYgX19rKSBjb25zdAp7CiAgX0xpbmtfdHlwZSBfX3kgPSBfTV9oZWFkZXI7 ICAKICBfTGlua190eXBlIF9feCA9IF9NX3Jvb3QoKTsgIAoKICB3aGlsZSAoX194ICE9IDApIAog ICAgaWYgKCFfTV9rZXlfY29tcGFyZShfU19rZXkoX194KSwgX19rKSkKICAgICAgX195ID0gX194 LCBfX3ggPSBfU19sZWZ0KF9feCk7CiAgICBlbHNlCiAgICAgIF9feCA9IF9TX3JpZ2h0KF9feCk7 CgogIHJldHVybiBjb25zdF9pdGVyYXRvcihfX3kpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwg Y2xhc3MgX1ZhbHVlLCBjbGFzcyBfS2V5T2ZWYWx1ZSwgCiAgICAgICAgICBjbGFzcyBfQ29tcGFy ZSwgY2xhc3MgX0FsbG9jPgp0eXBlbmFtZSBfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1 ZSxfQ29tcGFyZSxfQWxsb2M+OjppdGVyYXRvciAKX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9m VmFsdWUsX0NvbXBhcmUsX0FsbG9jPgogIDo6dXBwZXJfYm91bmQoY29uc3QgX0tleSYgX19rKQp7 CiAgX0xpbmtfdHlwZSBfX3kgPSBfTV9oZWFkZXI7ICAKICBfTGlua190eXBlIF9feCA9IF9NX3Jv b3QoKTsgIAoKICAgd2hpbGUgKF9feCAhPSAwKSAKICAgICBpZiAoX01fa2V5X2NvbXBhcmUoX19r LCBfU19rZXkoX194KSkpCiAgICAgICBfX3kgPSBfX3gsIF9feCA9IF9TX2xlZnQoX194KTsKICAg ICBlbHNlCiAgICAgICBfX3ggPSBfU19yaWdodChfX3gpOwoKICAgcmV0dXJuIGl0ZXJhdG9yKF9f eSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZh bHVlLCAKICAgICAgICAgIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+CnR5cGVuYW1lIF9S Yl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46OmNvbnN0X2l0 ZXJhdG9yIApfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxfQ29tcGFyZSxfQWxsb2M+ CiAgOjp1cHBlcl9ib3VuZChjb25zdCBfS2V5JiBfX2spIGNvbnN0CnsKICBfTGlua190eXBlIF9f eSA9IF9NX2hlYWRlcjsgIAogIF9MaW5rX3R5cGUgX194ID0gX01fcm9vdCgpOyAgCgogICB3aGls ZSAoX194ICE9IDApIAogICAgIGlmIChfTV9rZXlfY29tcGFyZShfX2ssIF9TX2tleShfX3gpKSkK ICAgICAgIF9feSA9IF9feCwgX194ID0gX1NfbGVmdChfX3gpOwogICAgIGVsc2UKICAgICAgIF9f eCA9IF9TX3JpZ2h0KF9feCk7CgogICByZXR1cm4gY29uc3RfaXRlcmF0b3IoX195KTsKfQoKdGVt cGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIAogICAg ICAgICAgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIApwYWlyPHR5cGVuYW1l IF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21wYXJlLF9BbGxvYz46Oml0ZXJh dG9yLAogICAgIHR5cGVuYW1lIF9SYl90cmVlPF9LZXksX1ZhbHVlLF9LZXlPZlZhbHVlLF9Db21w YXJlLF9BbGxvYz46Oml0ZXJhdG9yPgpfUmJfdHJlZTxfS2V5LF9WYWx1ZSxfS2V5T2ZWYWx1ZSxf Q29tcGFyZSxfQWxsb2M+CiAgOjplcXVhbF9yYW5nZShjb25zdCBfS2V5JiBfX2spCnsKICByZXR1 cm4gcGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+KGxvd2VyX2JvdW5kKF9fayksIHVwcGVyX2JvdW5k KF9faykpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1ZhbHVlLCBjbGFzcyBfS29W LCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxpbmUgCnBhaXI8dHlwZW5hbWUgX1Ji X3RyZWU8X0tleSwgX1ZhbHVlLCBfS29WLCBfQ29tcGFyZSwgX0FsbG9jPjo6Y29uc3RfaXRlcmF0 b3IsCiAgICAgdHlwZW5hbWUgX1JiX3RyZWU8X0tleSwgX1ZhbHVlLCBfS29WLCBfQ29tcGFyZSwg X0FsbG9jPjo6Y29uc3RfaXRlcmF0b3I+Cl9SYl90cmVlPF9LZXksIF9WYWx1ZSwgX0tvViwgX0Nv bXBhcmUsIF9BbGxvYz4KICA6OmVxdWFsX3JhbmdlKGNvbnN0IF9LZXkmIF9faykgY29uc3QKewog IHJldHVybiBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPihsb3dlcl9ib3VuZChf X2spLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9i b3VuZChfX2spKTsKfQoKaW5saW5lIGludCAKX19ibGFja19jb3VudChfUmJfdHJlZV9ub2RlX2Jh c2UqIF9fbm9kZSwgX1JiX3RyZWVfbm9kZV9iYXNlKiBfX3Jvb3QpCnsKICBpZiAoX19ub2RlID09 IDApCiAgICByZXR1cm4gMDsKICBlbHNlIHsKICAgIGludCBfX2JjID0gX19ub2RlLT5fTV9jb2xv ciA9PSBfU19yYl90cmVlX2JsYWNrID8gMSA6IDA7CiAgICBpZiAoX19ub2RlID09IF9fcm9vdCkK ICAgICAgcmV0dXJuIF9fYmM7CiAgICBlbHNlCiAgICAgIHJldHVybiBfX2JjICsgX19ibGFja19j b3VudChfX25vZGUtPl9NX3BhcmVudCwgX19yb290KTsKICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBf S2V5LCBjbGFzcyBfVmFsdWUsIGNsYXNzIF9LZXlPZlZhbHVlLCAKICAgICAgICAgIGNsYXNzIF9D b21wYXJlLCBjbGFzcyBfQWxsb2M+CmJvb2wgX1JiX3RyZWU8X0tleSxfVmFsdWUsX0tleU9mVmFs dWUsX0NvbXBhcmUsX0FsbG9jPjo6X19yYl92ZXJpZnkoKSBjb25zdAp7CiAgaWYgKF9NX25vZGVf Y291bnQgPT0gMCB8fCBiZWdpbigpID09IGVuZCgpKQogICAgcmV0dXJuIF9NX25vZGVfY291bnQg PT0gMCAmJiBiZWdpbigpID09IGVuZCgpICYmCiAgICAgIF9NX2hlYWRlci0+X01fbGVmdCA9PSBf TV9oZWFkZXIgJiYgX01faGVhZGVyLT5fTV9yaWdodCA9PSBfTV9oZWFkZXI7CiAgCiAgaW50IF9f bGVuID0gX19ibGFja19jb3VudChfTV9sZWZ0bW9zdCgpLCBfTV9yb290KCkpOwogIGZvciAoY29u c3RfaXRlcmF0b3IgX19pdCA9IGJlZ2luKCk7IF9faXQgIT0gZW5kKCk7ICsrX19pdCkgewogICAg X0xpbmtfdHlwZSBfX3ggPSAoX0xpbmtfdHlwZSkgX19pdC5fTV9ub2RlOwogICAgX0xpbmtfdHlw ZSBfX0wgPSBfU19sZWZ0KF9feCk7CiAgICBfTGlua190eXBlIF9fUiA9IF9TX3JpZ2h0KF9feCk7 CgogICAgaWYgKF9feC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpCiAgICAgIGlmICgoX19M ICYmIF9fTC0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpIHx8CiAgICAgICAgICAoX19SICYm IF9fUi0+X01fY29sb3IgPT0gX1NfcmJfdHJlZV9yZWQpKQogICAgICAgIHJldHVybiBmYWxzZTsK CiAgICBpZiAoX19MICYmIF9NX2tleV9jb21wYXJlKF9TX2tleShfX3gpLCBfU19rZXkoX19MKSkp CiAgICAgIHJldHVybiBmYWxzZTsKICAgIGlmIChfX1IgJiYgX01fa2V5X2NvbXBhcmUoX1Nfa2V5 KF9fUiksIF9TX2tleShfX3gpKSkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIGlmICghX19MICYm ICFfX1IgJiYgX19ibGFja19jb3VudChfX3gsIF9NX3Jvb3QoKSkgIT0gX19sZW4pCiAgICAgIHJl dHVybiBmYWxzZTsKICB9CgogIGlmIChfTV9sZWZ0bW9zdCgpICE9IF9SYl90cmVlX25vZGVfYmFz ZTo6X1NfbWluaW11bShfTV9yb290KCkpKQogICAgcmV0dXJuIGZhbHNlOwogIGlmIChfTV9yaWdo dG1vc3QoKSAhPSBfUmJfdHJlZV9ub2RlX2Jhc2U6Ol9TX21heGltdW0oX01fcm9vdCgpKSkKICAg IHJldHVybiBmYWxzZTsKCiAgcmV0dXJuIHRydWU7Cn0KCiAKIAoKdGVtcGxhdGUgPGNsYXNzIF9L ZXksIGNsYXNzIF9WYWx1ZSwgY2xhc3MgX0tleU9mVmFsdWUsIGNsYXNzIF9Db21wYXJlLAogICAg ICAgICAgY2xhc3MgX0FsbG9jID0gYWxsb2NhdG9yPCBfVmFsdWUgPiAgPgpzdHJ1Y3QgcmJfdHJl ZSA6IHB1YmxpYyBfUmJfdHJlZTxfS2V5LCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBfQ29tcGFyZSwg X0FsbG9jPgp7CiAgdHlwZWRlZiBfUmJfdHJlZTxfS2V5LCBfVmFsdWUsIF9LZXlPZlZhbHVlLCBf Q29tcGFyZSwgX0FsbG9jPiBfQmFzZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9CYXNlOjphbGxvY2F0 b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgcmJfdHJlZShjb25zdCBfQ29tcGFyZSYgX19jb21w ID0gX0NvbXBhcmUoKSwKICAgICAgICAgIGNvbnN0IGFsbG9jYXRvcl90eXBlJiBfX2EgPSBhbGxv Y2F0b3JfdHlwZSgpKQogICAgOiBfQmFzZShfX2NvbXAsIF9fYSkge30KICAKICB+cmJfdHJlZSgp IHt9Cn07CgoKCgoKICAKCgoKIAogCiAKIyAzMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRy YWtlLWxpbnV4LzIuOTUuMy8uLi8uLi8uLi8uLi9pbmNsdWRlL2crKy0zL21hcCIgMiAzCgoKIyAx ICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4u L2luY2x1ZGUvZysrLTMvc3RsX21hcC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK IAoKCgoKCgogCgoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBf Q29tcGFyZSA9IGxlc3M8X0tleT4sCiAgICAgICAgICBjbGFzcyBfQWxsb2MgPSBhbGxvY2F0b3I8 IF9UcCA+ICA+CgoKCgpjbGFzcyBtYXAgewpwdWJsaWM6CgogCgogIHR5cGVkZWYgX0tleSAgICAg ICAgICAgICAgICAgIGtleV90eXBlOwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAgIGRh dGFfdHlwZTsKICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICBtYXBwZWRfdHlwZTsKICB0 eXBlZGVmIHBhaXI8Y29uc3QgX0tleSwgX1RwPiB2YWx1ZV90eXBlOwogIHR5cGVkZWYgX0NvbXBh cmUgICAgICAgICAgICAgIGtleV9jb21wYXJlOwogICAgCiAgY2xhc3MgdmFsdWVfY29tcGFyZQog ICAgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5cGUsIGJvb2w+ IHsKICBmcmllbmQgY2xhc3MgbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz47CiAgcHJvdGVj dGVkIDoKICAgIF9Db21wYXJlIF9NX2NvbXA7CiAgICB2YWx1ZV9jb21wYXJlKF9Db21wYXJlIF9f YykgOiBfTV9jb21wKF9fYykge30KICBwdWJsaWM6CiAgICBib29sIG9wZXJhdG9yKCkoY29uc3Qg dmFsdWVfdHlwZSYgX194LCBjb25zdCB2YWx1ZV90eXBlJiBfX3kpIGNvbnN0IHsKICAgICAgcmV0 dXJuIF9NX2NvbXAoX194LmZpcnN0LCBfX3kuZmlyc3QpOwogICAgfQogIH07Cgpwcml2YXRlOgog IHR5cGVkZWYgX1JiX3RyZWU8a2V5X3R5cGUsIHZhbHVlX3R5cGUsIAogICAgICAgICAgICAgICAg ICAgX1NlbGVjdDFzdDx2YWx1ZV90eXBlPiwga2V5X2NvbXBhcmUsIF9BbGxvYz4gX1JlcF90eXBl OwogIF9SZXBfdHlwZSBfTV90OyAgIApwdWJsaWM6CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5 cGU6OnBvaW50ZXIgcG9pbnRlcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3Rf cG9pbnRlciBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpyZWZl cmVuY2UgcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjpjb25zdF9yZWZl cmVuY2UgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBlOjppdGVy YXRvciBpdGVyYXRvcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6Y29uc3RfaXRlcmF0 b3IgY29uc3RfaXRlcmF0b3I7CiAgdHlwZWRlZiB0eXBlbmFtZSBfUmVwX3R5cGU6OnJldmVyc2Vf aXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6 Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOwogIHR5cGVkZWYg dHlwZW5hbWUgX1JlcF90eXBlOjpzaXplX3R5cGUgc2l6ZV90eXBlOwogIHR5cGVkZWYgdHlwZW5h bWUgX1JlcF90eXBlOjpkaWZmZXJlbmNlX3R5cGUgZGlmZmVyZW5jZV90eXBlOwogIHR5cGVkZWYg dHlwZW5hbWUgX1JlcF90eXBlOjphbGxvY2F0b3JfdHlwZSBhbGxvY2F0b3JfdHlwZTsKCiAgIAoK ICBtYXAoKSA6IF9NX3QoX0NvbXBhcmUoKSwgYWxsb2NhdG9yX3R5cGUoKSkge30KICBleHBsaWNp dCBtYXAoY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKICAgICAgICAgICAgICAgY29uc3QgYWxsb2Nh dG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkpCiAgICA6IF9NX3QoX19jb21wLCBfX2Ep IHt9CgoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgbWFwKF9JbnB1dEl0ZXJh dG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkKICAgIDogX01fdChfQ29tcGFyZSgp LCBhbGxvY2F0b3JfdHlwZSgpKQogICAgeyBfTV90Lmluc2VydF91bmlxdWUoX19maXJzdCwgX19s YXN0KTsgfQoKICB0ZW1wbGF0ZSA8Y2xhc3MgX0lucHV0SXRlcmF0b3I+CiAgbWFwKF9JbnB1dEl0 ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCwgY29uc3QgX0NvbXBhcmUmIF9f Y29tcCwKICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBlKCkp CiAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgX01fdC5pbnNlcnRfdW5pcXVlKF9fZmlyc3QsIF9f bGFzdCk7IH0KIyAxMjMgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1saW51eC8yLjk1 LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9zdGxfbWFwLmgiIDMKCgogIG1hcChjb25zdCBt YXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX194KSA6IF9NX3QoX194Ll9NX3QpIHt9CiAg bWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mCiAgb3BlcmF0b3I9KGNvbnN0IG1hcDxfS2V5 LCBfVHAsIF9Db21wYXJlLCBfQWxsb2M+JiBfX3gpCiAgewogICAgX01fdCA9IF9feC5fTV90Owog ICAgcmV0dXJuICp0aGlzOyAKICB9CgogICAKCiAga2V5X2NvbXBhcmUga2V5X2NvbXAoKSBjb25z dCB7IHJldHVybiBfTV90LmtleV9jb21wKCk7IH0KICB2YWx1ZV9jb21wYXJlIHZhbHVlX2NvbXAo KSBjb25zdCB7IHJldHVybiB2YWx1ZV9jb21wYXJlKF9NX3Qua2V5X2NvbXAoKSk7IH0KICBhbGxv Y2F0b3JfdHlwZSBnZXRfYWxsb2NhdG9yKCkgY29uc3QgeyByZXR1cm4gX01fdC5nZXRfYWxsb2Nh dG9yKCk7IH0KCiAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBfTV90LmJlZ2luKCk7IH0KICBj b25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9NX3QuYmVnaW4oKTsgfQogIGl0 ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIF9NX3QuZW5kKCk7IH0KICBjb25zdF9pdGVyYXRvciBlbmQo KSBjb25zdCB7IHJldHVybiBfTV90LmVuZCgpOyB9CiAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4o KSB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CiAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVn aW4oKSBjb25zdCB7IHJldHVybiBfTV90LnJiZWdpbigpOyB9CiAgcmV2ZXJzZV9pdGVyYXRvciBy ZW5kKCkgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJl bmQoKSBjb25zdCB7IHJldHVybiBfTV90LnJlbmQoKTsgfQogIGJvb2wgZW1wdHkoKSBjb25zdCB7 IHJldHVybiBfTV90LmVtcHR5KCk7IH0KICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJu IF9NX3Quc2l6ZSgpOyB9CiAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gX01f dC5tYXhfc2l6ZSgpOyB9CiAgX1RwJiBvcGVyYXRvcltdKGNvbnN0IGtleV90eXBlJiBfX2spIHsK ICAgIGl0ZXJhdG9yIF9faSA9IGxvd2VyX2JvdW5kKF9fayk7CiAgICAgCiAgICBpZiAoX19pID09 IGVuZCgpIHx8IGtleV9jb21wKCkoX19rLCAoKl9faSkuZmlyc3QpKQogICAgICBfX2kgPSBpbnNl cnQoX19pLCB2YWx1ZV90eXBlKF9faywgX1RwKCkpKTsKICAgIHJldHVybiAoKl9faSkuc2Vjb25k OwogIH0KICB2b2lkIHN3YXAobWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mIF9feCkgeyBf TV90LnN3YXAoX194Ll9NX3QpOyB9CgogICAKCiAgcGFpcjxpdGVyYXRvcixib29sPiBpbnNlcnQo Y29uc3QgdmFsdWVfdHlwZSYgX194KSAKICAgIHsgcmV0dXJuIF9NX3QuaW5zZXJ0X3VuaXF1ZShf X3gpOyB9CiAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHBvc2l0aW9uLCBjb25zdCB2YWx1ZV90 eXBlJiBfX3gpCiAgICB7IHJldHVybiBfTV90Lmluc2VydF91bmlxdWUocG9zaXRpb24sIF9feCk7 IH0KCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1dEl0ZXJhdG9yPgogIHZvaWQgaW5zZXJ0KF9JbnB1 dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJhdG9yIF9fbGFzdCkgewogICAgX01fdC5pbnNl cnRfdW5pcXVlKF9fZmlyc3QsIF9fbGFzdCk7CiAgfQoKCgoKCgoKCgogIHZvaWQgZXJhc2UoaXRl cmF0b3IgX19wb3NpdGlvbikgeyBfTV90LmVyYXNlKF9fcG9zaXRpb24pOyB9CiAgc2l6ZV90eXBl IGVyYXNlKGNvbnN0IGtleV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3QuZXJhc2UoX194KTsgfQog IHZvaWQgZXJhc2UoaXRlcmF0b3IgX19maXJzdCwgaXRlcmF0b3IgX19sYXN0KQogICAgeyBfTV90 LmVyYXNlKF9fZmlyc3QsIF9fbGFzdCk7IH0KICB2b2lkIGNsZWFyKCkgeyBfTV90LmNsZWFyKCk7 IH0KCiAgIAoKICBpdGVyYXRvciBmaW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIHsgcmV0dXJuIF9N X3QuZmluZChfX3gpOyB9CiAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBrZXlfdHlwZSYgX194 KSBjb25zdCB7IHJldHVybiBfTV90LmZpbmQoX194KTsgfQogIHNpemVfdHlwZSBjb3VudChjb25z dCBrZXlfdHlwZSYgX194KSBjb25zdCB7IHJldHVybiBfTV90LmNvdW50KF9feCk7IH0KICBpdGVy YXRvciBsb3dlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSB7cmV0dXJuIF9NX3QubG93ZXJf Ym91bmQoX194KTsgfQogIGNvbnN0X2l0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBl JiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBfTV90Lmxvd2VyX2JvdW5kKF9feCk7IAogIH0KICBp dGVyYXRvciB1cHBlcl9ib3VuZChjb25zdCBrZXlfdHlwZSYgX194KSB7cmV0dXJuIF9NX3QudXBw ZXJfYm91bmQoX194KTsgfQogIGNvbnN0X2l0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90 eXBlJiBfX3gpIGNvbnN0IHsKICAgIHJldHVybiBfTV90LnVwcGVyX2JvdW5kKF9feCk7IAogIH0K ICAKICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYg X194KSB7CiAgICByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOwogIH0KICBwYWlyPGNvbnN0 X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25zdCBrZXlfdHlwZSYgX194 KSBjb25zdCB7CiAgICByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOwogIH0KICBmcmllbmQg Ym9vbCBvcGVyYXRvcj09IDw+ICAoY29uc3QgbWFwJiwgY29uc3QgbWFwJik7CiAgZnJpZW5kIGJv b2wgb3BlcmF0b3I8IDw+ICAoY29uc3QgbWFwJiwgY29uc3QgbWFwJik7Cn07Cgp0ZW1wbGF0ZSA8 Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgppbmxp bmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBf X3gsIAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxf QWxsb2M+JiBfX3kpIHsKICByZXR1cm4gX194Ll9NX3QgPT0gX195Ll9NX3Q7Cn0KCnRlbXBsYXRl IDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFzcyBfQWxsb2M+Cmlu bGluZSBib29sIG9wZXJhdG9yPChjb25zdCBtYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYg X194LCAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxf QWxsb2M+JiBfX3kpIHsKICByZXR1cm4gX194Ll9NX3QgPCBfX3kuX01fdDsKfQoKCgp0ZW1wbGF0 ZSA8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSwgY2xhc3MgX0FsbG9jPgpp bmxpbmUgdm9pZCBzd2FwKG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsIAogICAg ICAgICAgICAgICAgIG1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3kpIHsKICBfX3gu c3dhcChfX3kpOwp9CgoKCgoKCgoKIAoKCgogCiAKIAojIDMzICIvdXNyL2xpYi9nY2MtbGliL2k1 ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4uLy4uLy4uLy4uL2luY2x1ZGUvZysrLTMvbWFwIiAy IDMKCiMgMSAiL3Vzci9saWIvZ2NjLWxpYi9pNTg2LW1hbmRyYWtlLWxpbnV4LzIuOTUuMy8uLi8u Li8uLi8uLi9pbmNsdWRlL2crKy0zL3N0bF9tdWx0aW1hcC5oIiAxIDMKIAoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKIAoKCgoKCgogCgoKCgoKCgp0ZW1wbGF0ZSA8Y2xhc3MgX0tleSwgY2xhc3Mg X1RwLCBjbGFzcyBfQ29tcGFyZSA9IGxlc3M8X0tleT4sCiAgICAgICAgICBjbGFzcyBfQWxsb2Mg PSBhbGxvY2F0b3I8IF9UcCA+ICA+CgoKCgpjbGFzcyBtdWx0aW1hcCB7CnB1YmxpYzoKCiAKCiAg dHlwZWRlZiBfS2V5ICAgICAgICAgICAgICAgICAga2V5X3R5cGU7CiAgdHlwZWRlZiBfVHAgICAg ICAgICAgICAgICAgICAgZGF0YV90eXBlOwogIHR5cGVkZWYgX1RwICAgICAgICAgICAgICAgICAg IG1hcHBlZF90eXBlOwogIHR5cGVkZWYgcGFpcjxjb25zdCBfS2V5LCBfVHA+IHZhbHVlX3R5cGU7 CiAgdHlwZWRlZiBfQ29tcGFyZSAgICAgICAgICAgICAga2V5X2NvbXBhcmU7CgogIGNsYXNzIHZh bHVlX2NvbXBhcmUgOiBwdWJsaWMgYmluYXJ5X2Z1bmN0aW9uPHZhbHVlX3R5cGUsIHZhbHVlX3R5 cGUsIGJvb2w+IHsKICBmcmllbmQgY2xhc3MgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0Fs bG9jPjsKICBwcm90ZWN0ZWQ6CiAgICBfQ29tcGFyZSBfTV9jb21wOwogICAgdmFsdWVfY29tcGFy ZShfQ29tcGFyZSBfX2MpIDogX01fY29tcChfX2MpIHt9CiAgcHVibGljOgogICAgYm9vbCBvcGVy YXRvcigpKGNvbnN0IHZhbHVlX3R5cGUmIF9feCwgY29uc3QgdmFsdWVfdHlwZSYgX195KSBjb25z dCB7CiAgICAgIHJldHVybiBfTV9jb21wKF9feC5maXJzdCwgX195LmZpcnN0KTsKICAgIH0KICB9 OwoKcHJpdmF0ZToKICB0eXBlZGVmIF9SYl90cmVlPGtleV90eXBlLCB2YWx1ZV90eXBlLCAKICAg ICAgICAgICAgICAgICAgX1NlbGVjdDFzdDx2YWx1ZV90eXBlPiwga2V5X2NvbXBhcmUsIF9BbGxv Yz4gX1JlcF90eXBlOwogIF9SZXBfdHlwZSBfTV90OyAgIApwdWJsaWM6CiAgdHlwZWRlZiB0eXBl bmFtZSBfUmVwX3R5cGU6OnBvaW50ZXIgcG9pbnRlcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBf dHlwZTo6Y29uc3RfcG9pbnRlciBjb25zdF9wb2ludGVyOwogIHR5cGVkZWYgdHlwZW5hbWUgX1Jl cF90eXBlOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90eXBl Ojpjb25zdF9yZWZlcmVuY2UgY29uc3RfcmVmZXJlbmNlOwogIHR5cGVkZWYgdHlwZW5hbWUgX1Jl cF90eXBlOjppdGVyYXRvciBpdGVyYXRvcjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6 Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7IAogIHR5cGVkZWYgdHlwZW5hbWUgX1JlcF90 eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CiAgdHlwZWRlZiB0eXBlbmFt ZSBfUmVwX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRv cjsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKICB0 eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlw ZTsKICB0eXBlZGVmIHR5cGVuYW1lIF9SZXBfdHlwZTo6YWxsb2NhdG9yX3R5cGUgYWxsb2NhdG9y X3R5cGU7CgogCgogIG11bHRpbWFwKCkgOiBfTV90KF9Db21wYXJlKCksIGFsbG9jYXRvcl90eXBl KCkpIHsgfQogIGV4cGxpY2l0IG11bHRpbWFwKGNvbnN0IF9Db21wYXJlJiBfX2NvbXAsCiAgICAg ICAgICAgICAgICAgICAgY29uc3QgYWxsb2NhdG9yX3R5cGUmIF9fYSA9IGFsbG9jYXRvcl90eXBl KCkpCiAgICA6IF9NX3QoX19jb21wLCBfX2EpIHsgfQoKCiAgdGVtcGxhdGUgPGNsYXNzIF9JbnB1 dEl0ZXJhdG9yPgogIG11bHRpbWFwKF9JbnB1dEl0ZXJhdG9yIF9fZmlyc3QsIF9JbnB1dEl0ZXJh dG9yIF9fbGFzdCkKICAgIDogX01fdChfQ29tcGFyZSgpLCBhbGxvY2F0b3JfdHlwZSgpKQogICAg eyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3QpOyB9CgogIHRlbXBsYXRlIDxjbGFz cyBfSW5wdXRJdGVyYXRvcj4KICBtdWx0aW1hcChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5w dXRJdGVyYXRvciBfX2xhc3QsCiAgICAgICAgICAgY29uc3QgX0NvbXBhcmUmIF9fY29tcCwKICAg ICAgICAgICBjb25zdCBhbGxvY2F0b3JfdHlwZSYgX19hID0gYWxsb2NhdG9yX3R5cGUoKSkKICAg IDogX01fdChfX2NvbXAsIF9fYSkgeyBfTV90Lmluc2VydF9lcXVhbChfX2ZpcnN0LCBfX2xhc3Qp OyB9CiMgMTIxICIvdXNyL2xpYi9nY2MtbGliL2k1ODYtbWFuZHJha2UtbGludXgvMi45NS4zLy4u Ly4uLy4uLy4uL2luY2x1ZGUvZysrLTMvc3RsX211bHRpbWFwLmgiIDMKCgogIG11bHRpbWFwKGNv bnN0IG11bHRpbWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mIF9feCkgOiBfTV90KF9feC5f TV90KSB7IH0KICBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JgogIG9wZXJhdG9y PShjb25zdCBtdWx0aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gpIHsKICAgIF9N X3QgPSBfX3guX01fdDsKICAgIHJldHVybiAqdGhpczsgCiAgfQoKICAgCgogIGtleV9jb21wYXJl IGtleV9jb21wKCkgY29uc3QgeyByZXR1cm4gX01fdC5rZXlfY29tcCgpOyB9CiAgdmFsdWVfY29t cGFyZSB2YWx1ZV9jb21wKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfY29tcGFyZShfTV90LmtleV9j b21wKCkpOyB9CiAgYWxsb2NhdG9yX3R5cGUgZ2V0X2FsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJu IF9NX3QuZ2V0X2FsbG9jYXRvcigpOyB9CgogIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gX01f dC5iZWdpbigpOyB9CiAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfTV90 LmJlZ2luKCk7IH0KICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBfTV90LmVuZCgpOyB9CiAgY29u c3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5lbmQoKTsgfQogIHJldmVyc2Vf aXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQogIGNvbnN0X3JldmVy c2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gX01fdC5yYmVnaW4oKTsgfQogIHJl dmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIF9NX3QucmVuZCgpOyB9CiAgY29uc3RfcmV2 ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeyByZXR1cm4gX01fdC5yZW5kKCk7IH0KICBib29s IGVtcHR5KCkgY29uc3QgeyByZXR1cm4gX01fdC5lbXB0eSgpOyB9CiAgc2l6ZV90eXBlIHNpemUo KSBjb25zdCB7IHJldHVybiBfTV90LnNpemUoKTsgfQogIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNv bnN0IHsgcmV0dXJuIF9NX3QubWF4X3NpemUoKTsgfQogIHZvaWQgc3dhcChtdWx0aW1hcDxfS2V5 LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gpIHsgX01fdC5zd2FwKF9feC5fTV90KTsgfQoKICAg CgogIGl0ZXJhdG9yIGluc2VydChjb25zdCB2YWx1ZV90eXBlJiBfX3gpIHsgcmV0dXJuIF9NX3Qu aW5zZXJ0X2VxdWFsKF9feCk7IH0KICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgX19wb3NpdGlv biwgY29uc3QgdmFsdWVfdHlwZSYgX194KSB7CiAgICByZXR1cm4gX01fdC5pbnNlcnRfZXF1YWwo X19wb3NpdGlvbiwgX194KTsKICB9CgogIHRlbXBsYXRlIDxjbGFzcyBfSW5wdXRJdGVyYXRvcj4K ICB2b2lkIGluc2VydChfSW5wdXRJdGVyYXRvciBfX2ZpcnN0LCBfSW5wdXRJdGVyYXRvciBfX2xh c3QpIHsKICAgIF9NX3QuaW5zZXJ0X2VxdWFsKF9fZmlyc3QsIF9fbGFzdCk7CiAgfQoKCgoKCgoK CiAgdm9pZCBlcmFzZShpdGVyYXRvciBfX3Bvc2l0aW9uKSB7IF9NX3QuZXJhc2UoX19wb3NpdGlv bik7IH0KICBzaXplX3R5cGUgZXJhc2UoY29uc3Qga2V5X3R5cGUmIF9feCkgeyByZXR1cm4gX01f dC5lcmFzZShfX3gpOyB9CiAgdm9pZCBlcmFzZShpdGVyYXRvciBfX2ZpcnN0LCBpdGVyYXRvciBf X2xhc3QpCiAgICB7IF9NX3QuZXJhc2UoX19maXJzdCwgX19sYXN0KTsgfQogIHZvaWQgY2xlYXIo KSB7IF9NX3QuY2xlYXIoKTsgfQoKICAgCgogIGl0ZXJhdG9yIGZpbmQoY29uc3Qga2V5X3R5cGUm IF9feCkgeyByZXR1cm4gX01fdC5maW5kKF9feCk7IH0KICBjb25zdF9pdGVyYXRvciBmaW5kKGNv bnN0IGtleV90eXBlJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuZmluZChfX3gpOyB9CiAgc2l6 ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlJiBfX3gpIGNvbnN0IHsgcmV0dXJuIF9NX3QuY291 bnQoX194KTsgfQogIGl0ZXJhdG9yIGxvd2VyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gpIHty ZXR1cm4gX01fdC5sb3dlcl9ib3VuZChfX3gpOyB9CiAgY29uc3RfaXRlcmF0b3IgbG93ZXJfYm91 bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9NX3QubG93ZXJfYm91 bmQoX194KTsgCiAgfQogIGl0ZXJhdG9yIHVwcGVyX2JvdW5kKGNvbnN0IGtleV90eXBlJiBfX3gp IHtyZXR1cm4gX01fdC51cHBlcl9ib3VuZChfX3gpOyB9CiAgY29uc3RfaXRlcmF0b3IgdXBwZXJf Ym91bmQoY29uc3Qga2V5X3R5cGUmIF9feCkgY29uc3QgewogICAgcmV0dXJuIF9NX3QudXBwZXJf Ym91bmQoX194KTsgCiAgfQogICBwYWlyPGl0ZXJhdG9yLGl0ZXJhdG9yPiBlcXVhbF9yYW5nZShj b25zdCBrZXlfdHlwZSYgX194KSB7CiAgICByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gpOwog IH0KICBwYWlyPGNvbnN0X2l0ZXJhdG9yLGNvbnN0X2l0ZXJhdG9yPiBlcXVhbF9yYW5nZShjb25z dCBrZXlfdHlwZSYgX194KSBjb25zdCB7CiAgICByZXR1cm4gX01fdC5lcXVhbF9yYW5nZShfX3gp OwogIH0KICBmcmllbmQgYm9vbCBvcGVyYXRvcj09IDw+ICAoY29uc3QgbXVsdGltYXAmLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG11bHRpbWFw Jik7CiAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8IDw+ICAoY29uc3QgbXVsdGltYXAmLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXVsdGltYXAmKTsK fTsKCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9Db21wYXJlLCBjbGFz cyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgbXVsdGltYXA8X0tleSxfVHAs X0NvbXBhcmUsX0FsbG9jPiYgX194LCAKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtdWx0 aW1hcDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3kpIHsKICByZXR1cm4gX194Ll9NX3Qg PT0gX195Ll9NX3Q7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfS2V5LCBjbGFzcyBfVHAsIGNsYXNzIF9D b21wYXJlLCBjbGFzcyBfQWxsb2M+CmlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBtdWx0aW1h cDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsIAogICAgICAgICAgICAgICAgICAgICAg Y29uc3QgbXVsdGltYXA8X0tleSxfVHAsX0NvbXBhcmUsX0FsbG9jPiYgX195KSB7CiAgcmV0dXJu IF9feC5fTV90IDwgX195Ll9NX3Q7Cn0KCgoKdGVtcGxhdGUgPGNsYXNzIF9LZXksIGNsYXNzIF9U cCwgY2xhc3MgX0NvbXBhcmUsIGNsYXNzIF9BbGxvYz4KaW5saW5lIHZvaWQgc3dhcChtdWx0aW1h cDxfS2V5LF9UcCxfQ29tcGFyZSxfQWxsb2M+JiBfX3gsIAogICAgICAgICAgICAgICAgIG11bHRp bWFwPF9LZXksX1RwLF9Db21wYXJlLF9BbGxvYz4mIF9feSkgewogIF9feC5zd2FwKF9feSk7Cn0K CgoKCgoKCgogCgoKCiAKIAogCiMgMzQgIi91c3IvbGliL2djYy1saWIvaTU4Ni1tYW5kcmFrZS1s aW51eC8yLjk1LjMvLi4vLi4vLi4vLi4vaW5jbHVkZS9nKystMy9tYXAiIDIgMwoKCgoKIAogCiAK IyA1MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FtYXAuaCIgMgoKCgogCgpzdHJ1Y3QgICBRTWFw Tm9kZUJhc2UKewogICAgZW51bSBDb2xvciB7IFJlZCwgQmxhY2sgfTsKCiAgICBRTWFwTm9kZUJh c2UqIGxlZnQ7CiAgICBRTWFwTm9kZUJhc2UqIHJpZ2h0OwogICAgUU1hcE5vZGVCYXNlKiBwYXJl bnQ7CgogICAgQ29sb3IgY29sb3I7CgogICAgUU1hcE5vZGVCYXNlKiBtaW5pbXVtKCkgewoJUU1h cE5vZGVCYXNlKiB4ID0gdGhpczsKCXdoaWxlICggeC0+bGVmdCApCgkgICAgeCA9IHgtPmxlZnQ7 CglyZXR1cm4geDsKICAgIH0KCiAgICBRTWFwTm9kZUJhc2UqIG1heGltdW0oKSB7CglRTWFwTm9k ZUJhc2UqIHggPSB0aGlzOwoJd2hpbGUgKCB4LT5yaWdodCApCgkgICAgeCA9IHgtPnJpZ2h0OwoJ cmV0dXJuIHg7CiAgICB9Cn07CgoKdGVtcGxhdGUgPGNsYXNzIEssIGNsYXNzIFQ+CnN0cnVjdCBR TWFwTm9kZSA6IHB1YmxpYyBRTWFwTm9kZUJhc2UKewogICAgUU1hcE5vZGUoIGNvbnN0IEsmIF9r ZXksIGNvbnN0IFQmIF9kYXRhICkgeyBkYXRhID0gX2RhdGE7IGtleSA9IF9rZXk7IH0KICAgIFFN YXBOb2RlKCBjb25zdCBLJiBfa2V5ICkJICAgeyBrZXkgPSBfa2V5OyB9CiAgICBRTWFwTm9kZSgg Y29uc3QgUU1hcE5vZGU8SyxUPiYgX24gKSB7IGtleSA9IF9uLmtleTsgZGF0YSA9IF9uLmRhdGE7 IH0KICAgIFFNYXBOb2RlKCkgeyB9CiAgICBUIGRhdGE7CiAgICBLIGtleTsKfTsKCgp0ZW1wbGF0 ZTxjbGFzcyBLLCBjbGFzcyBUPgpjbGFzcyBRTWFwSXRlcmF0b3IKewogcHVibGljOgogICAgIAoK CiAgICB0eXBlZGVmIFFNYXBOb2RlPCBLLCBUID4qIE5vZGVQdHI7CgogICAgdHlwZWRlZiBzdGQ6 OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnICBpdGVyYXRvcl9jYXRlZ29yeTsKCiAgICB0eXBl ZGVmIFQgICAgICAgICAgdmFsdWVfdHlwZTsKCiAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVy ZW5jZV90eXBlOwoKCgogICAgdHlwZWRlZiBUKiAgICAgICAgIHBvaW50ZXI7CiAgICB0eXBlZGVm IFQmICAgICAgICAgcmVmZXJlbmNlOwoKICAgICAKCgogICAgUU1hcE5vZGU8SyxUPiogbm9kZTsK CiAgICAgCgoKICAgIFFNYXBJdGVyYXRvcigpIDogbm9kZSggMCApIHt9CiAgICBRTWFwSXRlcmF0 b3IoIFFNYXBOb2RlPEssVD4qIHAgKSA6IG5vZGUoIHAgKSB7fQogICAgUU1hcEl0ZXJhdG9yKCBj b25zdCBRTWFwSXRlcmF0b3I8SyxUPiYgaXQgKSA6IG5vZGUoIGl0Lm5vZGUgKSB7fQoKICAgIGJv b2wgb3BlcmF0b3I9PSggY29uc3QgUU1hcEl0ZXJhdG9yPEssVD4mIGl0ICkgY29uc3QgeyByZXR1 cm4gbm9kZSA9PSBpdC5ub2RlOyB9CiAgICBib29sIG9wZXJhdG9yIT0oIGNvbnN0IFFNYXBJdGVy YXRvcjxLLFQ+JiBpdCApIGNvbnN0IHsgcmV0dXJuIG5vZGUgIT0gaXQubm9kZTsgfQogICAgVCYg b3BlcmF0b3IqKCkgeyByZXR1cm4gbm9kZS0+ZGF0YTsgfQogICAgY29uc3QgVCYgb3BlcmF0b3Iq KCkgY29uc3QgeyByZXR1cm4gbm9kZS0+ZGF0YTsgfQogICAgIAogICAgIAoKICAgIGNvbnN0IEsm IGtleSgpIGNvbnN0IHsgcmV0dXJuIG5vZGUtPmtleTsgfQogICAgVCYgZGF0YSgpIHsgcmV0dXJu IG5vZGUtPmRhdGE7IH0KICAgIGNvbnN0IFQmIGRhdGEoKSBjb25zdCB7IHJldHVybiBub2RlLT5k YXRhOyB9Cgpwcml2YXRlOgogICAgaW50IGluYygpOwogICAgaW50IGRlYygpOwoKcHVibGljOgog ICAgUU1hcEl0ZXJhdG9yPEssVD4mIG9wZXJhdG9yKysoKSB7CglpbmMoKTsKCXJldHVybiAqdGhp czsKICAgIH0KCiAgICBRTWFwSXRlcmF0b3I8SyxUPiBvcGVyYXRvcisrKGludCkgewoJUU1hcEl0 ZXJhdG9yPEssVD4gdG1wID0gKnRoaXM7CglpbmMoKTsKCXJldHVybiB0bXA7CiAgICB9CgogICAg UU1hcEl0ZXJhdG9yPEssVD4mIG9wZXJhdG9yLS0oKSB7CglkZWMoKTsKCXJldHVybiAqdGhpczsK ICAgIH0KCiAgICBRTWFwSXRlcmF0b3I8SyxUPiBvcGVyYXRvci0tKGludCkgewoJUU1hcEl0ZXJh dG9yPEssVD4gdG1wID0gKnRoaXM7CglkZWMoKTsKCXJldHVybiB0bXA7CiAgICB9Cn07Cgp0ZW1w bGF0ZSA8Y2xhc3MgSywgY2xhc3MgVD4KICBpbnQgUU1hcEl0ZXJhdG9yPEssVD46OmluYygpCnsK ICAgIFFNYXBOb2RlQmFzZSogdG1wID0gbm9kZTsKICAgIGlmICggdG1wLT5yaWdodCApIHsKCXRt cCA9IHRtcC0+cmlnaHQ7Cgl3aGlsZSAoIHRtcC0+bGVmdCApCgkgICAgdG1wID0gdG1wLT5sZWZ0 OwogICAgfSBlbHNlIHsKCVFNYXBOb2RlQmFzZSogeSA9IHRtcC0+cGFyZW50OwoJd2hpbGUgKHRt cCA9PSB5LT5yaWdodCkgewoJICAgIHRtcCA9IHk7CgkgICAgeSA9IHktPnBhcmVudDsKCX0KCWlm ICh0bXAtPnJpZ2h0ICE9IHkpCgkgICAgdG1wID0geTsKICAgIH0KICAgIG5vZGUgPSAoTm9kZVB0 cil0bXA7CiAgICByZXR1cm4gMDsKfQoKdGVtcGxhdGUgPGNsYXNzIEssIGNsYXNzIFQ+CiAgaW50 IFFNYXBJdGVyYXRvcjxLLFQ+OjpkZWMoKQp7CiAgICBRTWFwTm9kZUJhc2UqIHRtcCA9IG5vZGU7 CiAgICBpZiAodG1wLT5jb2xvciA9PSBRTWFwTm9kZUJhc2U6OlJlZCAmJgoJdG1wLT5wYXJlbnQt PnBhcmVudCA9PSB0bXAgKSB7Cgl0bXAgPSB0bXAtPnJpZ2h0OwogICAgfSBlbHNlIGlmICh0bXAt PmxlZnQgIT0gMCkgewoJUU1hcE5vZGVCYXNlKiB5ID0gdG1wLT5sZWZ0OwoJd2hpbGUgKCB5LT5y aWdodCApCgkgICAgeSA9IHktPnJpZ2h0OwoJdG1wID0geTsKICAgIH0gZWxzZSB7CglRTWFwTm9k ZUJhc2UqIHkgPSB0bXAtPnBhcmVudDsKCXdoaWxlICh0bXAgPT0geS0+bGVmdCkgewoJICAgIHRt cCA9IHk7CgkgICAgeSA9IHktPnBhcmVudDsKCX0KCXRtcCA9IHk7CiAgICB9CiAgICBub2RlID0g KE5vZGVQdHIpdG1wOwogICAgcmV0dXJuIDA7Cn0KCnRlbXBsYXRlPGNsYXNzIEssIGNsYXNzIFQ+ CmNsYXNzIFFNYXBDb25zdEl0ZXJhdG9yCnsKIHB1YmxpYzoKICAgICAKCgogICAgdHlwZWRlZiBR TWFwTm9kZTwgSywgVCA+KiBOb2RlUHRyOwoKICAgIHR5cGVkZWYgc3RkOjpiaWRpcmVjdGlvbmFs X2l0ZXJhdG9yX3RhZyAgaXRlcmF0b3JfY2F0ZWdvcnk7CgogICAgdHlwZWRlZiBUICAgICAgICAg IHZhbHVlX3R5cGU7CgogICAgdHlwZWRlZiBwdHJkaWZmX3QgIGRpZmZlcmVuY2VfdHlwZTsKCgoK ICAgIHR5cGVkZWYgY29uc3QgVCogICBwb2ludGVyOwogICAgdHlwZWRlZiBjb25zdCBUJiAgIHJl ZmVyZW5jZTsKCgogICAgIAoKCiAgICBRTWFwTm9kZTxLLFQ+KiBub2RlOwoKICAgICAKCgogICAg UU1hcENvbnN0SXRlcmF0b3IoKSA6IG5vZGUoIDAgKSB7fQogICAgUU1hcENvbnN0SXRlcmF0b3Io IFFNYXBOb2RlPEssVD4qIHAgKSA6IG5vZGUoIHAgKSB7fQogICAgUU1hcENvbnN0SXRlcmF0b3Io IGNvbnN0IFFNYXBDb25zdEl0ZXJhdG9yPEssVD4mIGl0ICkgOiBub2RlKCBpdC5ub2RlICkge30K ICAgIFFNYXBDb25zdEl0ZXJhdG9yKCBjb25zdCBRTWFwSXRlcmF0b3I8SyxUPiYgaXQgKSA6IG5v ZGUoIGl0Lm5vZGUgKSB7fQoKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUU1hcENvbnN0SXRl cmF0b3I8SyxUPiYgaXQgKSBjb25zdCB7IHJldHVybiBub2RlID09IGl0Lm5vZGU7IH0KICAgIGJv b2wgb3BlcmF0b3IhPSggY29uc3QgUU1hcENvbnN0SXRlcmF0b3I8SyxUPiYgaXQgKSBjb25zdCB7 IHJldHVybiBub2RlICE9IGl0Lm5vZGU7IH0KICAgIGNvbnN0IFQmIG9wZXJhdG9yKigpICBjb25z dCB7IHJldHVybiBub2RlLT5kYXRhOyB9CiAgICAgCiAgICAgCgogICAgY29uc3QgSyYga2V5KCkg Y29uc3QgeyByZXR1cm4gbm9kZS0+a2V5OyB9CiAgICBjb25zdCBUJiBkYXRhKCkgY29uc3QgeyBy ZXR1cm4gbm9kZS0+ZGF0YTsgfQoKcHJpdmF0ZToKICAgIGludCBpbmMoKTsKICAgIGludCBkZWMo KTsKCnB1YmxpYzoKICAgIFFNYXBDb25zdEl0ZXJhdG9yPEssVD4mIG9wZXJhdG9yKysoKSB7Cglp bmMoKTsKCXJldHVybiAqdGhpczsKICAgIH0KCiAgICBRTWFwQ29uc3RJdGVyYXRvcjxLLFQ+IG9w ZXJhdG9yKysoaW50KSB7CglRTWFwQ29uc3RJdGVyYXRvcjxLLFQ+IHRtcCA9ICp0aGlzOwoJaW5j KCk7CglyZXR1cm4gdG1wOwogICAgfQoKICAgIFFNYXBDb25zdEl0ZXJhdG9yPEssVD4mIG9wZXJh dG9yLS0oKSB7CglkZWMoKTsKCXJldHVybiAqdGhpczsKICAgIH0KCiAgICBRTWFwQ29uc3RJdGVy YXRvcjxLLFQ+IG9wZXJhdG9yLS0oaW50KSB7CglRTWFwQ29uc3RJdGVyYXRvcjxLLFQ+IHRtcCA9 ICp0aGlzOwoJZGVjKCk7CglyZXR1cm4gdG1wOwogICAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzIEss IGNsYXNzIFQ+CiAgaW50IFFNYXBDb25zdEl0ZXJhdG9yPEssVD46OmluYygpCnsKICAgIFFNYXBO b2RlQmFzZSogdG1wID0gbm9kZTsKICAgIGlmICggdG1wLT5yaWdodCApIHsKCXRtcCA9IHRtcC0+ cmlnaHQ7Cgl3aGlsZSAoIHRtcC0+bGVmdCApCgkgICAgdG1wID0gdG1wLT5sZWZ0OwogICAgfSBl bHNlIHsKCVFNYXBOb2RlQmFzZSogeSA9IHRtcC0+cGFyZW50OwoJd2hpbGUgKHRtcCA9PSB5LT5y aWdodCkgewoJICAgIHRtcCA9IHk7CgkgICAgeSA9IHktPnBhcmVudDsKCX0KCWlmICh0bXAtPnJp Z2h0ICE9IHkpCgkgICAgdG1wID0geTsKICAgIH0KICAgIG5vZGUgPSAoTm9kZVB0cil0bXA7CiAg ICByZXR1cm4gMDsKfQoKdGVtcGxhdGUgPGNsYXNzIEssIGNsYXNzIFQ+CiAgaW50IFFNYXBDb25z dEl0ZXJhdG9yPEssVD46OmRlYygpCnsKICAgIFFNYXBOb2RlQmFzZSogdG1wID0gbm9kZTsKICAg IGlmICh0bXAtPmNvbG9yID09IFFNYXBOb2RlQmFzZTo6UmVkICYmCgl0bXAtPnBhcmVudC0+cGFy ZW50ID09IHRtcCApIHsKCXRtcCA9IHRtcC0+cmlnaHQ7CiAgICB9IGVsc2UgaWYgKHRtcC0+bGVm dCAhPSAwKSB7CglRTWFwTm9kZUJhc2UqIHkgPSB0bXAtPmxlZnQ7Cgl3aGlsZSAoIHktPnJpZ2h0 ICkKCSAgICB5ID0geS0+cmlnaHQ7Cgl0bXAgPSB5OwogICAgfSBlbHNlIHsKCVFNYXBOb2RlQmFz ZSogeSA9IHRtcC0+cGFyZW50OwoJd2hpbGUgKHRtcCA9PSB5LT5sZWZ0KSB7CgkgICAgdG1wID0g eTsKCSAgICB5ID0geS0+cGFyZW50OwoJfQoJdG1wID0geTsKICAgIH0KICAgIG5vZGUgPSAoTm9k ZVB0cil0bXA7CiAgICByZXR1cm4gMDsKfQoKY2xhc3MgICBRTWFwUHJpdmF0ZUJhc2UgOiBwdWJs aWMgUVNoYXJlZAp7CnB1YmxpYzoKICAgIFFNYXBQcml2YXRlQmFzZSgpIHsKCW5vZGVfY291bnQg PSAwOwogICAgfQogICAgUU1hcFByaXZhdGVCYXNlKCBjb25zdCBRTWFwUHJpdmF0ZUJhc2UqIF9t YXApIHsKCW5vZGVfY291bnQgPSBfbWFwLT5ub2RlX2NvdW50OwogICAgfQoKICAgICAKCgogICAg dm9pZCByb3RhdGVMZWZ0KCBRTWFwTm9kZUJhc2UqIHgsIFFNYXBOb2RlQmFzZSomIHJvb3QpOwog ICAgdm9pZCByb3RhdGVSaWdodCggUU1hcE5vZGVCYXNlKiB4LCBRTWFwTm9kZUJhc2UqJiByb290 ICk7CiAgICB2b2lkIHJlYmFsYW5jZSggUU1hcE5vZGVCYXNlKiB4LCBRTWFwTm9kZUJhc2UqJiBy b290ICk7CiAgICBRTWFwTm9kZUJhc2UqIHJlbW92ZUFuZFJlYmFsYW5jZSggUU1hcE5vZGVCYXNl KiB6LCBRTWFwTm9kZUJhc2UqJiByb290LAoJCQkJICAgICAgUU1hcE5vZGVCYXNlKiYgbGVmdG1v c3QsCgkJCQkgICAgICBRTWFwTm9kZUJhc2UqJiByaWdodG1vc3QgKTsKCiAgICAgCgoKICAgIGlu dCBub2RlX2NvdW50Owp9OwoKCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQ+CmNsYXNzIFFN YXBQcml2YXRlIDogcHVibGljIFFNYXBQcml2YXRlQmFzZQp7CnB1YmxpYzoKICAgICAKCgogICAg dHlwZWRlZiBRTWFwSXRlcmF0b3I8IEtleSwgVCA+IEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRTWFw Q29uc3RJdGVyYXRvcjwgS2V5LCBUID4gQ29uc3RJdGVyYXRvcjsKICAgIHR5cGVkZWYgUU1hcE5v ZGU8IEtleSwgVCA+IE5vZGU7CiAgICB0eXBlZGVmIFFNYXBOb2RlPCBLZXksIFQgPiogTm9kZVB0 cjsKCiAgICAgCgoKICAgIFFNYXBQcml2YXRlKCk7CiAgICBRTWFwUHJpdmF0ZSggY29uc3QgUU1h cFByaXZhdGU8IEtleSwgVCA+KiBfbWFwICk7CiAgICB+UU1hcFByaXZhdGUoKSB7IGNsZWFyKCk7 IGRlbGV0ZSBoZWFkZXI7IH0KCiAgICBOb2RlUHRyIGNvcHkoIE5vZGVQdHIgcCApOwogICAgdm9p ZCBjbGVhcigpOwogICAgdm9pZCBjbGVhciggTm9kZVB0ciBwICk7CgogICAgSXRlcmF0b3IgYmVn aW4oKQl7IHJldHVybiBJdGVyYXRvciggKE5vZGVQdHIpKGhlYWRlci0+bGVmdCApICk7IH0KICAg IEl0ZXJhdG9yIGVuZCgpCXsgcmV0dXJuIEl0ZXJhdG9yKCBoZWFkZXIgKTsgfQogICAgQ29uc3RJ dGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIENvbnN0SXRlcmF0b3IoIChOb2RlUHRyKSho ZWFkZXItPmxlZnQgKSApOyB9CiAgICBDb25zdEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJu IENvbnN0SXRlcmF0b3IoIGhlYWRlciApOyB9CgogICAgQ29uc3RJdGVyYXRvciBmaW5kKGNvbnN0 IEtleSYgaykgY29uc3Q7CgogICAgdm9pZCByZW1vdmUoIEl0ZXJhdG9yIGl0ICkgewoJTm9kZVB0 ciBkZWwgPSAoTm9kZVB0cikgcmVtb3ZlQW5kUmViYWxhbmNlKCBpdC5ub2RlLCBoZWFkZXItPnBh cmVudCwgaGVhZGVyLT5sZWZ0LCBoZWFkZXItPnJpZ2h0ICk7CglkZWxldGUgZGVsOwoJLS1ub2Rl X2NvdW50OwogICAgfQoKIyA0MDAgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbWFwLmgiCgoKIyA0 MTIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbWFwLmgiCgoKICAgIEl0ZXJhdG9yIGluc2VydFNp bmdsZSggY29uc3QgS2V5JiBrICk7CiAgICBJdGVyYXRvciBpbnNlcnQoIFFNYXBOb2RlQmFzZSog eCwgUU1hcE5vZGVCYXNlKiB5LCBjb25zdCBLZXkmIGsgKTsKCnByb3RlY3RlZDoKICAgICAKCgog ICAgY29uc3QgS2V5JiBrZXkoIFFNYXBOb2RlQmFzZSogYiApIGNvbnN0IHsgcmV0dXJuICgoTm9k ZVB0ciliKS0+a2V5OyB9CgogICAgIAoKCiAgICBOb2RlUHRyIGhlYWRlcjsKfTsKCgp0ZW1wbGF0 ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIFFNYXBQcml2YXRlPEtleSxUPjo6UU1hcFByaXZhdGUo KSB7CiAgICBoZWFkZXIgPSBuZXcgTm9kZTsKICAgIGhlYWRlci0+Y29sb3IgPSBRTWFwTm9kZUJh c2U6OlJlZDsgIAogICAgaGVhZGVyLT5wYXJlbnQgPSAwOwogICAgaGVhZGVyLT5sZWZ0ID0gaGVh ZGVyLT5yaWdodCA9IGhlYWRlcjsKfQp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIFFN YXBQcml2YXRlPEtleSxUPjo6UU1hcFByaXZhdGUoIGNvbnN0IFFNYXBQcml2YXRlPCBLZXksIFQg PiogX21hcCApIDogUU1hcFByaXZhdGVCYXNlKCBfbWFwICkgewogICAgaGVhZGVyID0gbmV3IE5v ZGU7CiAgICBoZWFkZXItPmNvbG9yID0gUU1hcE5vZGVCYXNlOjpSZWQ7ICAKICAgIGlmICggX21h cC0+aGVhZGVyLT5wYXJlbnQgPT0gMCApIHsKCWhlYWRlci0+cGFyZW50ID0gMDsKCWhlYWRlci0+ bGVmdCA9IGhlYWRlci0+cmlnaHQgPSBoZWFkZXI7CiAgICB9IGVsc2UgewoJaGVhZGVyLT5wYXJl bnQgPSBjb3B5KCAoTm9kZVB0cikoX21hcC0+aGVhZGVyLT5wYXJlbnQpICk7CgloZWFkZXItPnBh cmVudC0+cGFyZW50ID0gaGVhZGVyOwoJaGVhZGVyLT5sZWZ0ID0gaGVhZGVyLT5wYXJlbnQtPm1p bmltdW0oKTsKCWhlYWRlci0+cmlnaHQgPSBoZWFkZXItPnBhcmVudC0+bWF4aW11bSgpOwogICAg fQp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIHR5cGVuYW1lICBRTWFwUHJpdmF0 ZTxLZXksVD46Ok5vZGVQdHIgUU1hcFByaXZhdGU8S2V5LFQ+Ojpjb3B5KCB0eXBlbmFtZSAgUU1h cFByaXZhdGU8S2V5LFQ+OjpOb2RlUHRyIHAgKQp7CiAgICBpZiAoICFwICkKCXJldHVybiAwOwog ICAgTm9kZVB0ciBuID0gbmV3IE5vZGUoICpwICk7CiAgICBuLT5jb2xvciA9IHAtPmNvbG9yOwog ICAgaWYgKCBwLT5sZWZ0ICkgewoJbi0+bGVmdCA9IGNvcHkoIChOb2RlUHRyKShwLT5sZWZ0KSAp OwoJbi0+bGVmdC0+cGFyZW50ID0gbjsKICAgIH0gZWxzZSB7CgluLT5sZWZ0ID0gMDsKICAgIH0K ICAgIGlmICggcC0+cmlnaHQgKSB7CgluLT5yaWdodCA9IGNvcHkoIChOb2RlUHRyKShwLT5yaWdo dCkgKTsKCW4tPnJpZ2h0LT5wYXJlbnQgPSBuOwogICAgfSBlbHNlIHsKCW4tPnJpZ2h0ID0gMDsK ICAgIH0KICAgIHJldHVybiBuOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIHZv aWQgUU1hcFByaXZhdGU8S2V5LFQ+OjpjbGVhcigpCnsKICAgIGNsZWFyKCAoTm9kZVB0cikoaGVh ZGVyLT5wYXJlbnQpICk7CiAgICBoZWFkZXItPmNvbG9yID0gUU1hcE5vZGVCYXNlOjpSZWQ7CiAg ICBoZWFkZXItPnBhcmVudCA9IDA7CiAgICBoZWFkZXItPmxlZnQgPSBoZWFkZXItPnJpZ2h0ID0g aGVhZGVyOwogICAgbm9kZV9jb3VudCA9IDA7Cn0KCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNz IFQ+CiAgdm9pZCBRTWFwUHJpdmF0ZTxLZXksVD46OmNsZWFyKCB0eXBlbmFtZSAgUU1hcFByaXZh dGU8S2V5LFQ+OjpOb2RlUHRyIHAgKQp7CiAgICB3aGlsZSAoIHAgIT0gMCApIHsKCWNsZWFyKCAo Tm9kZVB0cilwLT5yaWdodCApOwoJTm9kZVB0ciB5ID0gKE5vZGVQdHIpcC0+bGVmdDsKCWRlbGV0 ZSBwOwoJcCA9IHk7CiAgICB9Cn0KCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQ+CiAgdHlw ZW5hbWUgIFFNYXBQcml2YXRlPEtleSxUPjo6Q29uc3RJdGVyYXRvciBRTWFwUHJpdmF0ZTxLZXks VD46OmZpbmQoY29uc3QgS2V5JiBrKSBjb25zdAp7CiAgICBRTWFwTm9kZUJhc2UqIHkgPSBoZWFk ZXI7ICAgICAgICAgCiAgICBRTWFwTm9kZUJhc2UqIHggPSBoZWFkZXItPnBhcmVudDsgIAoKICAg IHdoaWxlICggeCAhPSAwICkgewoJIAoJaWYgKCAhKCBrZXkoeCkgPCBrICkgKSB7CgkgICAgeSA9 IHg7CgkgICAgeCA9IHgtPmxlZnQ7Cgl9IGVsc2UgewoJICAgIHggPSB4LT5yaWdodDsKCX0KICAg IH0KCiAgICAgCiAgICAgCiAgICBpZiAoIHkgPT0gaGVhZGVyIHx8IGsgPCBrZXkoeSkgKQoJcmV0 dXJuIENvbnN0SXRlcmF0b3IoIGhlYWRlciApOwogICAgcmV0dXJuIENvbnN0SXRlcmF0b3IoIChO b2RlUHRyKXkgKTsKfQoKdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVD4KICB0eXBlbmFtZSAg UU1hcFByaXZhdGU8S2V5LFQ+OjpJdGVyYXRvciBRTWFwUHJpdmF0ZTxLZXksVD46Omluc2VydFNp bmdsZSggY29uc3QgS2V5JiBrICkKewogICAgIAogICAgUU1hcE5vZGVCYXNlKiB5ID0gaGVhZGVy OwogICAgUU1hcE5vZGVCYXNlKiB4ID0gaGVhZGVyLT5wYXJlbnQ7CiAgICBib29sIHJlc3VsdCA9 IFRSVUU7CiAgICB3aGlsZSAoIHggIT0gMCApIHsKCXJlc3VsdCA9ICggayA8IGtleSh4KSApOwoJ eSA9IHg7Cgl4ID0gcmVzdWx0ID8geC0+bGVmdCA6IHgtPnJpZ2h0OwogICAgfQogICAgIAogICAg SXRlcmF0b3IgaiggKE5vZGVQdHIpeSApOwogICAgaWYgKCByZXN1bHQgKSB7CgkgCglpZiAoIGog PT0gYmVnaW4oKSApIHsKCSAgICByZXR1cm4gaW5zZXJ0KHgsIHksIGsgKTsKCX0gZWxzZSB7Cgkg ICAgIAoJICAgIC0tajsKCX0KICAgIH0KICAgICAKICAgIGlmICggKGoubm9kZS0+a2V5KSA8IGsg KQoJcmV0dXJuIGluc2VydCh4LCB5LCBrICk7CiAgICAgCiAgICByZXR1cm4gajsKfQoKCnRlbXBs YXRlIDxjbGFzcyBLZXksIGNsYXNzIFQ+CiAgdHlwZW5hbWUgIFFNYXBQcml2YXRlPEtleSxUPjo6 SXRlcmF0b3IgUU1hcFByaXZhdGU8S2V5LFQ+OjppbnNlcnQoIFFNYXBOb2RlQmFzZSogeCwgUU1h cE5vZGVCYXNlKiB5LCBjb25zdCBLZXkmIGsgKQp7CiAgICBOb2RlUHRyIHogPSBuZXcgTm9kZSgg ayApOwogICAgaWYgKHkgPT0gaGVhZGVyIHx8IHggIT0gMCB8fCBrIDwga2V5KHkpICkgewoJeS0+ bGVmdCA9IHo7ICAgICAgICAgICAgICAgICAKCWlmICggeSA9PSBoZWFkZXIgKSB7CgkgICAgaGVh ZGVyLT5wYXJlbnQgPSB6OwoJICAgIGhlYWRlci0+cmlnaHQgPSB6OwoJfSBlbHNlIGlmICggeSA9 PSBoZWFkZXItPmxlZnQgKQoJICAgIGhlYWRlci0+bGVmdCA9IHo7ICAgICAgICAgICAgCiAgICB9 IGVsc2UgewoJeS0+cmlnaHQgPSB6OwoJaWYgKCB5ID09IGhlYWRlci0+cmlnaHQgKQoJICAgIGhl YWRlci0+cmlnaHQgPSB6OyAgICAgICAgICAgCiAgICB9CiAgICB6LT5wYXJlbnQgPSB5OwogICAg ei0+bGVmdCA9IDA7CiAgICB6LT5yaWdodCA9IDA7CiAgICByZWJhbGFuY2UoIHosIGhlYWRlci0+ cGFyZW50ICk7CiAgICArK25vZGVfY291bnQ7CiAgICByZXR1cm4gSXRlcmF0b3Ioeik7Cn0KCgoK CgoKCgoKCgoKCgoKdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBUPgpjbGFzcyBRTWFwCnsKcHVi bGljOgogICAgIAoKCiAgICB0eXBlZGVmIEtleSBrZXlfdHlwZTsKICAgIHR5cGVkZWYgVCBtYXBw ZWRfdHlwZTsKICAgIHR5cGVkZWYgUVBhaXI8Y29uc3Qga2V5X3R5cGUsIG1hcHBlZF90eXBlPiB2 YWx1ZV90eXBlOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwogICAgdHlwZWRlZiBj b25zdCB2YWx1ZV90eXBlKiBjb25zdF9wb2ludGVyOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlJiBy ZWZlcmVuY2U7CiAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsK CiAgICB0eXBlZGVmIHB0cmRpZmZfdCAgZGlmZmVyZW5jZV90eXBlOwoKCgogICAgdHlwZWRlZiBz aXplX3QgICAgICBzaXplX3R5cGU7CiAgICB0eXBlZGVmIFFNYXBJdGVyYXRvcjxLZXksVD4gaXRl cmF0b3I7CiAgICB0eXBlZGVmIFFNYXBDb25zdEl0ZXJhdG9yPEtleSxUPiBjb25zdF9pdGVyYXRv cjsKICAgIHR5cGVkZWYgUVBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0X3BhaXI7CgogICAgdHlw ZWRlZiBRTWFwSXRlcmF0b3I8IEtleSwgVCA+IEl0ZXJhdG9yOwogICAgdHlwZWRlZiBRTWFwQ29u c3RJdGVyYXRvcjwgS2V5LCBUID4gQ29uc3RJdGVyYXRvcjsKICAgIHR5cGVkZWYgVCBWYWx1ZVR5 cGU7CiAgICB0eXBlZGVmIFFNYXBQcml2YXRlPCBLZXksIFQgPiBQcml2OwoKICAgICAKCgogICAg UU1hcCgpCiAgICB7CglzaCA9IG5ldyBRTWFwUHJpdmF0ZTwgS2V5LCBUID47CiAgICB9CiAgICBR TWFwKCBjb25zdCBRTWFwPEtleSxUPiYgbSApCiAgICB7CglzaCA9IG0uc2g7IHNoLT5yZWYoKTsK ICAgIH0KCgoKCgoKICAgIFFNYXAoIGNvbnN0IHR5cGVuYW1lICBzdGQ6Om1hcDxLZXksVD4mIG0g KQogICAgewoJc2ggPSBuZXcgUU1hcFByaXZhdGU8S2V5LFQ+OwoKCgoJUU1hcENvbnN0SXRlcmF0 b3I8S2V5LFQ+IGl0ID0gbS5iZWdpbigpOwoKCWZvciAoIDsgaXQgIT0gbS5lbmQoKTsgKytpdCAp IHsKCSAgICB2YWx1ZV90eXBlIHAoICgqaXQpLmZpcnN0LCAoKml0KS5zZWNvbmQgKTsKCSAgICBp bnNlcnQoIHAgKTsKCX0KICAgIH0KCiAgICB+UU1hcCgpCiAgICB7CglpZiAoIHNoLT5kZXJlZigp ICkKCSAgICBkZWxldGUgc2g7CiAgICB9CiAgICBRTWFwPEtleSxUPiYgb3BlcmF0b3I9ICggY29u c3QgUU1hcDxLZXksVD4mIG0gKTsKCiAgICBRTWFwPEtleSxUPiYgb3BlcmF0b3I9ICggY29uc3Qg dHlwZW5hbWUgIHN0ZDo6bWFwPEtleSxUPiYgbSApCiAgICB7CgljbGVhcigpOwoKCgoJUU1hcENv bnN0SXRlcmF0b3I8S2V5LFQ+IGl0ID0gbS5iZWdpbigpOwoKCWZvciAoIDsgaXQgIT0gbS5lbmQo KTsgKytpdCApIHsKCSAgICB2YWx1ZV90eXBlIHAoICgqaXQpLmZpcnN0LCAoKml0KS5zZWNvbmQg KTsKCSAgICBpbnNlcnQoIHAgKTsKCX0KCXJldHVybiAqdGhpczsKICAgIH0KCgoKCgoKICAgIGl0 ZXJhdG9yIGJlZ2luKCkgeyBkZXRhY2goKTsgcmV0dXJuIHNoLT5iZWdpbigpOyB9CiAgICBpdGVy YXRvciBlbmQoKSB7IGRldGFjaCgpOyByZXR1cm4gc2gtPmVuZCgpOyB9CiAgICBjb25zdF9pdGVy YXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuICgoY29uc3QgUHJpdiopc2gpLT5iZWdpbigpOyB9 CiAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiAoKGNvbnN0IFByaXYqKXNo KS0+ZW5kKCk7IH0KICAgIGl0ZXJhdG9yIHJlcGxhY2UoIGNvbnN0IEtleSYgaywgY29uc3QgVCYg diApCiAgICB7CglyZW1vdmUoIGsgKTsKCXJldHVybiBpbnNlcnQoIGssIHYgKTsKICAgIH0KCiAg ICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0CiAgICB7CglyZXR1cm4gc2gtPm5vZGVfY291bnQ7CiAg ICB9CiAgICBib29sIGVtcHR5KCkgY29uc3QKICAgIHsKCXJldHVybiBzaC0+bm9kZV9jb3VudCA9 PSAwOwogICAgfQogICAgUVBhaXI8aXRlcmF0b3IsYm9vbD4gaW5zZXJ0KCBjb25zdCB2YWx1ZV90 eXBlJiB4ICk7CgogICAgdm9pZCBlcmFzZSggaXRlcmF0b3IgaXQgKQogICAgewoJZGV0YWNoKCk7 CglzaC0+cmVtb3ZlKCBpdCApOwogICAgfQogICAgdm9pZCBlcmFzZSggY29uc3Qga2V5X3R5cGUm IGsgKTsKICAgIHNpemVfdHlwZSBjb3VudCggY29uc3Qga2V5X3R5cGUmIGsgKSBjb25zdDsKICAg IFQmIG9wZXJhdG9yW10gKCBjb25zdCBLZXkmIGsgKTsKICAgIHZvaWQgY2xlYXIoKTsKCiAgICBp dGVyYXRvciBmaW5kICggY29uc3QgS2V5JiBrICkKICAgIHsKCWRldGFjaCgpOwoJcmV0dXJuIGl0 ZXJhdG9yKCBzaC0+ZmluZCggayApLm5vZGUgKTsKICAgIH0KICAgIGNvbnN0X2l0ZXJhdG9yIGZp bmQgKCBjb25zdCBLZXkmIGsgKSBjb25zdCB7CXJldHVybiBzaC0+ZmluZCggayApOyB9CgogICAg Y29uc3QgVCYgb3BlcmF0b3JbXSAoIGNvbnN0IEtleSYgayApIGNvbnN0Cgl7ICA7IHJldHVybiBz aC0+ZmluZCggayApLmRhdGEoKTsgfQogICAgYm9vbCBjb250YWlucyAoIGNvbnN0IEtleSYgayAp IGNvbnN0Cgl7IHJldHVybiBmaW5kKCBrICkgIT0gZW5kKCk7IH0KCSAKCiAgICBzaXplX3R5cGUg Y291bnQoKSBjb25zdCB7IHJldHVybiBzaC0+bm9kZV9jb3VudDsgfQoKICAgIFFWYWx1ZUxpc3Q8 S2V5PiBrZXlzKCkgY29uc3QgewoJUVZhbHVlTGlzdDxLZXk+IHI7Cglmb3IgKGNvbnN0X2l0ZXJh dG9yIGk9YmVnaW4oKTsgaSE9ZW5kKCk7ICsraSkKCSAgICByLmFwcGVuZChpLmtleSgpKTsKCXJl dHVybiByOwogICAgfQoKICAgIFFWYWx1ZUxpc3Q8VD4gdmFsdWVzKCkgY29uc3QgewoJUVZhbHVl TGlzdDxUPiByOwoJZm9yIChjb25zdF9pdGVyYXRvciBpPWJlZ2luKCk7IGkhPWVuZCgpOyArK2kp CgkgICAgci5hcHBlbmQoKmkpOwoJcmV0dXJuIHI7CiAgICB9CgogICAgYm9vbCBpc0VtcHR5KCkg Y29uc3QgeyByZXR1cm4gc2gtPm5vZGVfY291bnQgPT0gMDsgfQoKICAgIGl0ZXJhdG9yIGluc2Vy dCggY29uc3QgS2V5JiBrZXksIGNvbnN0IFQmIHZhbHVlLCBib29sIG92ZXJ3cml0ZSA9IFRSVUUg KTsKICAgIHZvaWQgcmVtb3ZlKCBpdGVyYXRvciBpdCApIHsgZGV0YWNoKCk7IHNoLT5yZW1vdmUo IGl0ICk7IH0KICAgIHZvaWQgcmVtb3ZlKCBjb25zdCBLZXkmIGsgKTsKCgoKCgoKCgpwcm90ZWN0 ZWQ6CiAgICAgCgoKICAgIHZvaWQgZGV0YWNoKCkgeyAgaWYgKCBzaC0+Y291bnQgPiAxICkgZGV0 YWNoSW50ZXJuYWwoKTsgfQoKICAgIFByaXYqIHNoOwpwcml2YXRlOgogICAgdm9pZCBkZXRhY2hJ bnRlcm5hbCgpOwp9OwoKdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBUPgogIFFNYXA8S2V5LFQ+ JiBRTWFwPEtleSxUPjo6b3BlcmF0b3I9ICggY29uc3QgUU1hcDxLZXksVD4mIG0gKQp7CiAgICBt LnNoLT5yZWYoKTsKICAgIGlmICggc2gtPmRlcmVmKCkgKQoJZGVsZXRlIHNoOwogICAgc2ggPSBt LnNoOwogICAgcmV0dXJuICp0aGlzOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQ+CiAg dHlwZW5hbWUgIFFNYXA8S2V5LFQ+OjppbnNlcnRfcGFpciBRTWFwPEtleSxUPjo6aW5zZXJ0KCBj b25zdCB0eXBlbmFtZSAgUU1hcDxLZXksVD46OnZhbHVlX3R5cGUmIHggKQp7CiAgICBkZXRhY2go KTsKICAgIHNpemVfdHlwZSBuID0gc2l6ZSgpOwogICAgaXRlcmF0b3IgaXQgPSBzaC0+aW5zZXJ0 U2luZ2xlKCB4LmZpcnN0ICk7CiAgICBib29sIGluc2VydGVkID0gRkFMU0U7CiAgICBpZiAoIG4g PCBzaXplKCkgKSB7CglpbnNlcnRlZCA9IFRSVUU7CglpdC5kYXRhKCkgPSB4LnNlY29uZDsKICAg IH0KICAgIHJldHVybiBRUGFpcjxpdGVyYXRvcixib29sPiggaXQsIGluc2VydGVkICk7Cn0KCnRl bXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVD4KICB2b2lkIFFNYXA8S2V5LFQ+OjplcmFzZSggY29u c3QgS2V5JiBrICkKewogICAgZGV0YWNoKCk7CiAgICBpdGVyYXRvciBpdCggc2gtPmZpbmQoIGsg KS5ub2RlICk7CiAgICBpZiAoIGl0ICE9IGVuZCgpICkKCXNoLT5yZW1vdmUoIGl0ICk7Cn0KCnRl bXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVD4KICB0eXBlbmFtZSAgUU1hcDxLZXksVD46OnNpemVf dHlwZSBRTWFwPEtleSxUPjo6Y291bnQoIGNvbnN0IEtleSYgayApIGNvbnN0CnsKICAgIGNvbnN0 X2l0ZXJhdG9yIGl0KCBzaC0+ZmluZCggayApLm5vZGUgKTsKICAgIGlmICggaXQgIT0gZW5kKCkg KSB7CglzaXplX3R5cGUgYyA9IDA7Cgl3aGlsZSAoIGl0ICE9IGVuZCgpICkgewoJICAgICsraXQ7 CgkgICAgKytjOwoJfQoJcmV0dXJuIGM7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKdGVtcGxhdGU8 Y2xhc3MgS2V5LCBjbGFzcyBUPgogIFQmIFFNYXA8S2V5LFQ+OjpvcGVyYXRvcltdICggY29uc3Qg S2V5JiBrICkKewogICAgZGV0YWNoKCk7CiAgICBRTWFwTm9kZTxLZXksVD4qIHAgPSBzaC0+Zmlu ZCggayApLm5vZGU7CiAgICBpZiAoIHAgIT0gc2gtPmVuZCgpLm5vZGUgKQoJcmV0dXJuIHAtPmRh dGE7CiAgICByZXR1cm4gaW5zZXJ0KCBrLCBUKCkgKS5kYXRhKCk7Cn0KCnRlbXBsYXRlPGNsYXNz IEtleSwgY2xhc3MgVD4KICB2b2lkIFFNYXA8S2V5LFQ+OjpjbGVhcigpCnsKICAgIGlmICggc2gt PmNvdW50ID09IDEgKQoJc2gtPmNsZWFyKCk7CiAgICBlbHNlIHsKCXNoLT5kZXJlZigpOwoJc2gg PSBuZXcgUU1hcFByaXZhdGU8S2V5LFQ+OwogICAgfQp9Cgp0ZW1wbGF0ZTxjbGFzcyBLZXksIGNs YXNzIFQ+CiAgdHlwZW5hbWUgIFFNYXA8S2V5LFQ+OjppdGVyYXRvciBRTWFwPEtleSxUPjo6aW5z ZXJ0KCBjb25zdCBLZXkmIGtleSwgY29uc3QgVCYgdmFsdWUsIGJvb2wgb3ZlcndyaXRlICkKewog ICAgZGV0YWNoKCk7CiAgICBzaXplX3R5cGUgbiA9IHNpemUoKTsKICAgIGl0ZXJhdG9yIGl0ID0g c2gtPmluc2VydFNpbmdsZSgga2V5ICk7CiAgICBpZiAoIG92ZXJ3cml0ZSB8fCBuIDwgc2l6ZSgp ICkKCWl0LmRhdGEoKSA9IHZhbHVlOwogICAgcmV0dXJuIGl0Owp9Cgp0ZW1wbGF0ZTxjbGFzcyBL ZXksIGNsYXNzIFQ+CiAgdm9pZCBRTWFwPEtleSxUPjo6cmVtb3ZlKCBjb25zdCBLZXkmIGsgKQp7 CiAgICBkZXRhY2goKTsKICAgIGl0ZXJhdG9yIGl0KCBzaC0+ZmluZCggayApLm5vZGUgKTsKICAg IGlmICggaXQgIT0gZW5kKCkgKQoJc2gtPnJlbW92ZSggaXQgKTsKfQoKdGVtcGxhdGU8Y2xhc3Mg S2V5LCBjbGFzcyBUPgogIHZvaWQgUU1hcDxLZXksVD46OmRldGFjaEludGVybmFsKCkKewogICAg c2gtPmRlcmVmKCk7IHNoID0gbmV3IFFNYXBQcml2YXRlPEtleSxUPiggc2ggKTsKfQoKCgp0ZW1w bGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQ+CiAgUURhdGFTdHJlYW0mIG9wZXJhdG9yPj4oIFFEYXRh U3RyZWFtJiBzLCBRTWFwPEtleSxUPiYgbSApIHsKICAgIG0uY2xlYXIoKTsKICAgIFFfVUlOVDMy IGM7CiAgICBzID4+IGM7CiAgICBmb3IoIFFfVUlOVDMyIGkgPSAwOyBpIDwgYzsgKytpICkgewoJ S2V5IGs7IFQgdDsKCXMgPj4gayA+PiB0OwoJbS5pbnNlcnQoIGssIHQgKTsKCWlmICggcy5hdEVu ZCgpICkKCSAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBzOwp9CgoKdGVtcGxhdGU8Y2xhc3Mg S2V5LCBjbGFzcyBUPgogIFFEYXRhU3RyZWFtJiBvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSYgcywg Y29uc3QgUU1hcDxLZXksVD4mIG0gKSB7CiAgICBzIDw8IChRX1VJTlQzMiltLnNpemUoKTsKICAg IFFNYXBDb25zdEl0ZXJhdG9yPEtleSxUPiBpdCA9IG0uYmVnaW4oKTsKICAgIGZvciggOyBpdCAh PSBtLmVuZCgpOyArK2l0ICkKCXMgPDwgaXQua2V5KCkgPDwgaXQuZGF0YSgpOwogICAgcmV0dXJu IHM7Cn0KCgoKIyA0MyAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FtaW1lLmgiIDIKCgoKCgpjbGFz cyBRSW1hZ2VEcmFnOwpjbGFzcyBRVGV4dERyYWc7CgpjbGFzcyAgIFFNaW1lU291cmNlCnsKICAg IGZyaWVuZCBjbGFzcyBRQ2xpcGJvYXJkRGF0YTsKCnB1YmxpYzoKICAgIFFNaW1lU291cmNlKCk7 CiAgICB2aXJ0dWFsIH5RTWltZVNvdXJjZSgpOwogICAgdmlydHVhbCBjb25zdCBjaGFyKiBmb3Jt YXQoIGludCBuID0gMCApIGNvbnN0ID0gMDsKICAgIHZpcnR1YWwgYm9vbCBwcm92aWRlcyggY29u c3QgY2hhciogKSBjb25zdDsKICAgIHZpcnR1YWwgUUJ5dGVBcnJheSBlbmNvZGVkRGF0YSggY29u c3QgY2hhciogKSBjb25zdCA9IDA7CiAgICBpbnQgc2VyaWFsTnVtYmVyKCkgY29uc3Q7Cgpwcml2 YXRlOgogICAgaW50IHNlcl9ubzsKICAgIGVudW0geyBOb0NhY2hlLCBUZXh0LCBHcmFwaGljcyB9 IGNhY2hlVHlwZTsKICAgIHVuaW9uCiAgICB7CglzdHJ1Y3QKCXsKCSAgICBRU3RyaW5nICpzdHI7 CgkgICAgUUNTdHJpbmcgKnN1YnR5cGU7Cgl9IHR4dDsKCXN0cnVjdAoJewoJICAgIFFJbWFnZSAq aW1nOwoJICAgIFFQaXhtYXAgKnBpeDsKCX0gZ2Z4OwogICAgfSBjYWNoZTsKICAgIHZvaWQgY2xl YXJDYWNoZSgpOwoKICAgICAKICAgIGZyaWVuZCBjbGFzcyBRSW1hZ2VEcmFnOwogICAgZnJpZW5k IGNsYXNzIFFUZXh0RHJhZzsKCn07CgppbmxpbmUgaW50IFFNaW1lU291cmNlOjpzZXJpYWxOdW1i ZXIoKSBjb25zdAp7IHJldHVybiBzZXJfbm87IH0KCmNsYXNzIFFTdHJpbmdMaXN0OwpjbGFzcyBR TWltZVNvdXJjZUZhY3RvcnlEYXRhOwoKY2xhc3MgICBRTWltZVNvdXJjZUZhY3RvcnkgewpwdWJs aWM6CiAgICBRTWltZVNvdXJjZUZhY3RvcnkoKTsKICAgIHZpcnR1YWwgflFNaW1lU291cmNlRmFj dG9yeSgpOwoKICAgIHN0YXRpYyBRTWltZVNvdXJjZUZhY3RvcnkqIGRlZmF1bHRGYWN0b3J5KCk7 CiAgICBzdGF0aWMgdm9pZCBzZXREZWZhdWx0RmFjdG9yeSggUU1pbWVTb3VyY2VGYWN0b3J5KiAp OwogICAgc3RhdGljIFFNaW1lU291cmNlRmFjdG9yeSogdGFrZURlZmF1bHRGYWN0b3J5KCk7CiAg ICBzdGF0aWMgdm9pZCBhZGRGYWN0b3J5KCBRTWltZVNvdXJjZUZhY3RvcnkgKmYgKTsKICAgIHN0 YXRpYyB2b2lkIHJlbW92ZUZhY3RvcnkoIFFNaW1lU291cmNlRmFjdG9yeSAqZiApOwoKICAgIHZp cnR1YWwgY29uc3QgUU1pbWVTb3VyY2UqIGRhdGEoY29uc3QgUVN0cmluZyYgYWJzX25hbWUpIGNv bnN0OwogICAgdmlydHVhbCBRU3RyaW5nIG1ha2VBYnNvbHV0ZShjb25zdCBRU3RyaW5nJiBhYnNf b3JfcmVsX25hbWUsIGNvbnN0IFFTdHJpbmcmIGNvbnRleHQpIGNvbnN0OwogICAgY29uc3QgUU1p bWVTb3VyY2UqIGRhdGEoY29uc3QgUVN0cmluZyYgYWJzX29yX3JlbF9uYW1lLCBjb25zdCBRU3Ry aW5nJiBjb250ZXh0KSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0VGV4dCggY29uc3QgUVN0 cmluZyYgYWJzX25hbWUsIGNvbnN0IFFTdHJpbmcmIHRleHQgKTsKICAgIHZpcnR1YWwgdm9pZCBz ZXRJbWFnZSggY29uc3QgUVN0cmluZyYgYWJzX25hbWUsIGNvbnN0IFFJbWFnZSYgaW0gKTsKICAg IHZpcnR1YWwgdm9pZCBzZXRQaXhtYXAoIGNvbnN0IFFTdHJpbmcmIGFic19uYW1lLCBjb25zdCBR UGl4bWFwJiBwbSApOwogICAgdmlydHVhbCB2b2lkIHNldERhdGEoIGNvbnN0IFFTdHJpbmcmIGFi c19uYW1lLCBRTWltZVNvdXJjZSogZGF0YSApOwogICAgdmlydHVhbCB2b2lkIHNldEZpbGVQYXRo KCBjb25zdCBRU3RyaW5nTGlzdCYgKTsKICAgIHZpcnR1YWwgUVN0cmluZ0xpc3QgZmlsZVBhdGgo KSBjb25zdDsKICAgIHZvaWQgYWRkRmlsZVBhdGgoIGNvbnN0IFFTdHJpbmcmICk7CiAgICB2aXJ0 dWFsIHZvaWQgc2V0RXh0ZW5zaW9uVHlwZSggY29uc3QgUVN0cmluZyYgZXh0LCBjb25zdCBjaGFy KiBtaW1ldHlwZSApOwoKcHJpdmF0ZToKICAgIFFNaW1lU291cmNlICpkYXRhSW50ZXJuYWwoY29u c3QgUVN0cmluZyYgYWJzX25hbWUsIGNvbnN0IFFNYXA8UVN0cmluZywgUVN0cmluZz4gJmV4dGVu c2lvbnMgKSBjb25zdDsKICAgIFFNaW1lU291cmNlRmFjdG9yeURhdGEqIGQ7Cn07CgojIDE1NyAi L3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FtaW1lLmgiCgoKCgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9p bmNsdWRlL3FldmVudC5oIiAyCgoKCgpjbGFzcyAgIFFFdmVudDogcHVibGljIFF0CQkgCnsKcHVi bGljOgogICAgZW51bSBUeXBlIHsKCgkgCgkgCgkgCgkgCgoJTm9uZSA9IDAsCQkJCSAKCgoJVGlt ZXIgPSAxLAkJCQkgCglNb3VzZUJ1dHRvblByZXNzID0gMiwJCQkgCglNb3VzZUJ1dHRvblJlbGVh c2UgPSAzLAkJCSAKCU1vdXNlQnV0dG9uRGJsQ2xpY2s9IDQsCQkJIAoJTW91c2VNb3ZlID0gNSwJ CQkJIAoJS2V5UHJlc3MgPSA2LAkJCQkgCglLZXlSZWxlYXNlID0gNywJCQkJIAoJRm9jdXNJbiA9 IDgsCQkJCSAKCUZvY3VzT3V0ID0gOSwJCQkJIAoJRW50ZXIgPSAxMCwJCQkJIAoJTGVhdmUgPSAx MSwJCQkJIAoJUGFpbnQgPSAxMiwJCQkJIAoJTW92ZSA9IDEzLAkJCQkgCglSZXNpemUgPSAxNCwJ CQkJIAoJQ3JlYXRlID0gMTUsCQkJCSAKCURlc3Ryb3kgPSAxNiwJCQkJIAoJU2hvdyA9IDE3LAkJ CQkgCglIaWRlID0gMTgsCQkJCSAKCUNsb3NlID0gMTksCQkJCSAKCVF1aXQgPSAyMCwJCQkJIAoJ UmVwYXJlbnQgPSAyMSwJCQkJIAoJU2hvd01pbmltaXplZCA9IDIyLAkJICAgICAgIAkgCglTaG93 Tm9ybWFsID0gMjMsCSAgICAgICAJCSAKCVdpbmRvd0FjdGl2YXRlID0gMjQsCSAgICAgICAJCSAK CVdpbmRvd0RlYWN0aXZhdGUgPSAyNSwJICAgICAgIAkJIAoJU2hvd1RvUGFyZW50ID0gMjYsCSAg ICAgICAJCSAKCUhpZGVUb1BhcmVudCA9IDI3LAkgICAgICAgCQkgCglTaG93TWF4aW1pemVkID0g MjgsCQkgICAgICAgCSAKCVNob3dGdWxsU2NyZWVuID0gMjksCQkJIAoJQWNjZWwgPSAzMCwJCQkJ IAoJV2hlZWwgPSAzMSwJCQkJIAoJQWNjZWxBdmFpbGFibGUgPSAzMiwJCQkgCglDYXB0aW9uQ2hh bmdlID0gMzMsCQkJIAoJSWNvbkNoYW5nZSA9IDM0LAkJCSAKCVBhcmVudEZvbnRDaGFuZ2UgPSAz NSwJCQkgCglBcHBsaWNhdGlvbkZvbnRDaGFuZ2UgPSAzNiwJCSAKCVBhcmVudFBhbGV0dGVDaGFu Z2UgPSAzNywJCSAKCUFwcGxpY2F0aW9uUGFsZXR0ZUNoYW5nZSA9IDM4LAkJIAoJUGFsZXR0ZUNo YW5nZSA9IDM5LAkJCSAKCUNsaXBib2FyZCA9IDQwLAkJCQkgCglTcGVlY2ggPSA0MiwJCQkJIAoJ U29ja0FjdCA9IDUwLAkJCQkgCglBY2NlbE92ZXJyaWRlID0gNTEsCQkJIAoJRGVmZXJyZWREZWxl dGUgPSA1MiwJCQkgCglEcmFnRW50ZXIgPSA2MCwJCQkJIAoJRHJhZ01vdmUgPSA2MSwJCQkJIAoJ RHJhZ0xlYXZlID0gNjIsCQkJCSAKCURyb3AgPSA2MywJCQkJIAoJRHJhZ1Jlc3BvbnNlID0gNjQs CQkJIAoJQ2hpbGRJbnNlcnRlZCA9IDcwLAkJCSAKCUNoaWxkUmVtb3ZlZCA9IDcxLAkJCSAKCUxh eW91dEhpbnQgPSA3MiwJCQkgCglTaG93V2luZG93UmVxdWVzdCA9IDczLAkJCSAKCUFjdGl2YXRl Q29udHJvbCA9IDgwLAkJCSAKCURlYWN0aXZhdGVDb250cm9sID0gODEsCQkJIAoJQ29udGV4dE1l bnUgPSA4MiwgICAgICAgICAgICAgICAgICAgICAgICAKCUlNU3RhcnQgPSA4MywJCQkJIAoJSU1D b21wb3NlID0gODQsCQkJCSAKCUlNRW5kID0gODUsCQkJCSAKCUFjY2Vzc2liaWxpdHkgPSA4NiwJ CQkgCglUYWJsZXQgPSA4NywJCQkJIAoJVXNlciA9IDEwMDAsCQkJCSAKCU1heFVzZXIgID0gNjU1 MzUgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICB9OwoKCiAgICBRRXZlbnQoIFR5cGUgdHlw ZSApIDogdCh0eXBlKSwgcG9zdGVkKEZBTFNFKSwgc3BvbnQoRkFMU0UpIHt9CiAgICB2aXJ0dWFs IH5RRXZlbnQoKTsKICAgIFR5cGUgIHR5cGUoKSBjb25zdAl7IHJldHVybiB0OyB9CiAgICBib29s IHNwb250YW5lb3VzKCkgY29uc3QgCXsgcmV0dXJuIHNwb250OyB9CnByb3RlY3RlZDoKICAgIFR5 cGUgIHQ7CnByaXZhdGU6CiAgICB1aW50IHBvc3RlZCA6IDE7CiAgICB1aW50IHNwb250IDogMTsK CgogICAgZnJpZW5kIGNsYXNzIFFBcHBsaWNhdGlvbjsKICAgIGZyaWVuZCBjbGFzcyBRQmFzZUFw cGxpY2F0aW9uOwogICAgZnJpZW5kIGNsYXNzIFFFVFdpZGdldDsKfTsKCgpjbGFzcyAgIFFUaW1l ckV2ZW50IDogcHVibGljIFFFdmVudAp7CnB1YmxpYzoKICAgIFFUaW1lckV2ZW50KCBpbnQgdGlt ZXJJZCApCgk6IFFFdmVudChUaW1lciksIGlkKHRpbWVySWQpIHt9CiAgICBpbnQJICB0aW1lcklk KCkJY29uc3QJeyByZXR1cm4gaWQ7IH0KcHJvdGVjdGVkOgogICAgaW50CSAgaWQ7Cn07CgoKY2xh c3MgICBRTW91c2VFdmVudCA6IHB1YmxpYyBRRXZlbnQKewpwdWJsaWM6CiAgICBRTW91c2VFdmVu dCggVHlwZSB0eXBlLCBjb25zdCBRUG9pbnQgJnBvcywgaW50IGJ1dHRvbiwgaW50IHN0YXRlICk7 CgogICAgUU1vdXNlRXZlbnQoIFR5cGUgdHlwZSwgY29uc3QgUVBvaW50ICZwb3MsIGNvbnN0IFFQ b2ludCZnbG9iYWxQb3MsCgkJIGludCBidXR0b24sIGludCBzdGF0ZSApCgk6IFFFdmVudCh0eXBl KSwgcChwb3MpLCBnKGdsb2JhbFBvcyksIGIoKHVzaG9ydClidXR0b24pLHMoKHVzaG9ydClzdGF0 ZSksYWNjcHQoVFJVRSkge307CgogICAgY29uc3QgUVBvaW50ICZwb3MoKSBjb25zdAl7IHJldHVy biBwOyB9CiAgICBjb25zdCBRUG9pbnQgJmdsb2JhbFBvcygpIGNvbnN0IHsgcmV0dXJuIGc7IH0K ICAgIGludAkgICB4KCkJCWNvbnN0CXsgcmV0dXJuIHAueCgpOyB9CiAgICBpbnQJICAgeSgpCQlj b25zdAl7IHJldHVybiBwLnkoKTsgfQogICAgaW50CSAgIGdsb2JhbFgoKQljb25zdAl7IHJldHVy biBnLngoKTsgfQogICAgaW50CSAgIGdsb2JhbFkoKQljb25zdAl7IHJldHVybiBnLnkoKTsgfQog ICAgQnV0dG9uU3RhdGUgYnV0dG9uKCkgY29uc3QJeyByZXR1cm4gKEJ1dHRvblN0YXRlKSBiOyB9 CiAgICBCdXR0b25TdGF0ZSBzdGF0ZSgpCWNvbnN0CXsgcmV0dXJuIChCdXR0b25TdGF0ZSkgczsg fQogICAgQnV0dG9uU3RhdGUgc3RhdGVBZnRlcigpIGNvbnN0OwogICAgYm9vbCAgIGlzQWNjZXB0 ZWQoKSBjb25zdAl7IHJldHVybiBhY2NwdDsgfQogICAgdm9pZCAgIGFjY2VwdCgpCQl7IGFjY3B0 ID0gVFJVRTsgfQogICAgdm9pZCAgIGlnbm9yZSgpCQl7IGFjY3B0ID0gRkFMU0U7IH0KcHJvdGVj dGVkOgogICAgUVBvaW50IHA7CiAgICBRUG9pbnQgZzsKICAgIHVzaG9ydCBiOwogICAgdXNob3J0 IHM7CiAgICB1aW50ICAgYWNjcHQ6MTsKfTsKCgoKY2xhc3MgICBRV2hlZWxFdmVudCA6IHB1Ymxp YyBRRXZlbnQKewpwdWJsaWM6CiAgICBRV2hlZWxFdmVudCggY29uc3QgUVBvaW50ICZwb3MsIGlu dCBkZWx0YSwgaW50IHN0YXRlLCBPcmllbnRhdGlvbiBvcmllbnQgPSBWZXJ0aWNhbCApOwogICAg UVdoZWVsRXZlbnQoIGNvbnN0IFFQb2ludCAmcG9zLCBjb25zdCBRUG9pbnQmIGdsb2JhbFBvcywg aW50IGRlbHRhLCBpbnQgc3RhdGUsIE9yaWVudGF0aW9uIG9yaWVudCA9IFZlcnRpY2FsICApCgk6 IFFFdmVudChXaGVlbCksIHAocG9zKSwgZyhnbG9iYWxQb3MpLCBkKGRlbHRhKSwgcygodXNob3J0 KXN0YXRlKSwKCSAgYWNjcHQoVFJVRSksIG8ob3JpZW50KSB7fQogICAgaW50CSAgIGRlbHRhKCkJ Y29uc3QJeyByZXR1cm4gZDsgfQogICAgY29uc3QgUVBvaW50ICZwb3MoKSBjb25zdAl7IHJldHVy biBwOyB9CiAgICBjb25zdCBRUG9pbnQgJmdsb2JhbFBvcygpIGNvbnN0CXsgcmV0dXJuIGc7IH0K ICAgIGludAkgICB4KCkJCWNvbnN0CXsgcmV0dXJuIHAueCgpOyB9CiAgICBpbnQJICAgeSgpCQlj b25zdAl7IHJldHVybiBwLnkoKTsgfQogICAgaW50CSAgIGdsb2JhbFgoKQljb25zdAl7IHJldHVy biBnLngoKTsgfQogICAgaW50CSAgIGdsb2JhbFkoKQljb25zdAl7IHJldHVybiBnLnkoKTsgfQog ICAgQnV0dG9uU3RhdGUgc3RhdGUoKQljb25zdAl7IHJldHVybiBCdXR0b25TdGF0ZShzKTsgfQog ICAgT3JpZW50YXRpb24gb3JpZW50YXRpb24oKSAJY29uc3QgCXsgcmV0dXJuIG87IH0KICAgIGJv b2wgICBpc0FjY2VwdGVkKCkgY29uc3QJeyByZXR1cm4gYWNjcHQ7IH0KICAgIHZvaWQgICBhY2Nl cHQoKQkJeyBhY2NwdCA9IFRSVUU7IH0KICAgIHZvaWQgICBpZ25vcmUoKQkJeyBhY2NwdCA9IEZB TFNFOyB9CnByb3RlY3RlZDoKICAgIFFQb2ludCBwOwogICAgUVBvaW50IGc7CiAgICBpbnQgZDsK ICAgIHVzaG9ydCBzOwogICAgYm9vbCAgIGFjY3B0OwogICAgT3JpZW50YXRpb24gbzsKfTsKCgpj bGFzcyAgIFFUYWJsZXRFdmVudCA6IHB1YmxpYyBRRXZlbnQKewpwdWJsaWM6CiAgICBlbnVtIFRh YmxldERldmljZSB7IE5vRGV2aWNlID0gLTEsIFB1Y2ssIFN0eWx1cywgRXJhc2VyIH07CiAgICBR VGFibGV0RXZlbnQoIGNvbnN0IFFQb2ludCAmcG9zLCBpbnQgZGV2aWNlLCBpbnQgcHJlc3N1cmUs IGludCB4VGlsdCwgCiAgICAgICAgICAgICAgICAgIGludCB5VGlsdCwgY29uc3QgUVBhaXI8aW50 LGludD4gJnVJZCApCgk6IFFFdmVudCggVGFibGV0ICksIG1Qb3MoIHBvcyApLCBtRGV2KCBkZXZp Y2UgKSwgbVByZXNzKCBwcmVzc3VyZSApLAoJICBtWFQoIHhUaWx0ICksIG1ZVCggeVRpbHQgKSwg bVR5cGUoIHVJZC5maXJzdCApLCBtUGh5KCB1SWQuc2Vjb25kICkKICAgIHt9CiAgICBRVGFibGV0 RXZlbnQoIGNvbnN0IFFQb2ludCAmcG9zLCBjb25zdCBRUG9pbnQgJmdsb2JhbFBvcywgaW50IGRl dmljZSwKCQkgIGludCBwcmVzc3VyZSwgaW50IHhUaWx0LCBpbnQgeVRpbHQsIGNvbnN0IFFQYWly PGludCxpbnQ+ICZ1SWQgKQoJOiBRRXZlbnQoIFRhYmxldCApLCBtUG9zKCBwb3MgKSwgbUdQb3Mo IGdsb2JhbFBvcyApLCBtRGV2KCBkZXZpY2UgKSwKCSAgbVByZXNzKCBwcmVzc3VyZSApLCBtWFQo IHhUaWx0ICksIG1ZVCggeVRpbHQgKSwgbVR5cGUoIHVJZC5maXJzdCApLAoJICBtUGh5KCB1SWQu c2Vjb25kICkKICAgIHt9CiAgICBpbnQgcHJlc3N1cmUoKQljb25zdCB7IHJldHVybiBtUHJlc3M7 IH0KICAgIGludCB4VGlsdCgpCQljb25zdCB7IHJldHVybiBtWFQ7IH0KICAgIGludCB5VGlsdCgp CQljb25zdCB7IHJldHVybiBtWVQ7IH0KICAgIGNvbnN0IFFQb2ludCAmcG9zKCkJY29uc3QgeyBy ZXR1cm4gbVBvczsgfQogICAgY29uc3QgUVBvaW50ICZnbG9iYWxQb3MoKSBjb25zdCB7IHJldHVy biBtR1BvczsgfQogICAgaW50IHgoKQkJY29uc3QgeyByZXR1cm4gbVBvcy54KCk7IH0KICAgIGlu dCB5KCkJCWNvbnN0IHsgcmV0dXJuIG1Qb3MueSgpOyB9CiAgICBpbnQgZ2xvYmFsWCgpCWNvbnN0 IHsgcmV0dXJuIG1HUG9zLngoKTsgfQogICAgaW50IGdsb2JhbFkoKQljb25zdCB7IHJldHVybiBt R1Bvcy55KCk7IH0KICAgIFRhYmxldERldmljZSBkZXZpY2UoKSAJY29uc3QgeyByZXR1cm4gVGFi bGV0RGV2aWNlKG1EZXYpOyB9CiAgICBpbnQgaXNBY2NlcHRlZCgpIGNvbnN0IHsgcmV0dXJuIG1i QWNjOyB9CiAgICB2b2lkIGFjY2VwdCgpIHsgbWJBY2MgPSBUUlVFOyB9CiAgICB2b2lkIGlnbm9y ZSgpIHsgbWJBY2MgPSBGQUxTRTsgfQogICAgUVBhaXI8aW50LGludD4gdW5pcXVlSWQoKSB7IHJl dHVybiBRUGFpcjxpbnQsaW50PiggbVR5cGUsIG1QaHkpOyB9CnByb3RlY3RlZDoKICAgIFFQb2lu dCBtUG9zOwogICAgUVBvaW50IG1HUG9zOwogICAgaW50IG1EZXYsCiAgICAgICAgbVByZXNzLAog ICAgICAgIG1YVCwKICAgICAgICBtWVQsCiAgICAgICAgbVR5cGUsCgltUGh5OwogICAgYm9vbCBt YkFjYzsKICAgIAp9OwoKY2xhc3MgICBRS2V5RXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVibGlj OgogICAgUUtleUV2ZW50KCBUeXBlIHR5cGUsIGludCBrZXksIGludCBhc2NpaSwgaW50IHN0YXRl LAoJCWNvbnN0IFFTdHJpbmcmIHRleHQ9UVN0cmluZzo6bnVsbCwgYm9vbCBhdXRvcmVwPUZBTFNF LCB1c2hvcnQgY291bnQ9MSApCgk6IFFFdmVudCh0eXBlKSwgdHh0KHRleHQpLCBrKCh1c2hvcnQp a2V5KSwgcygodXNob3J0KXN0YXRlKSwKCSAgICBhKCh1Y2hhcilhc2NpaSksIGFjY3B0KFRSVUUp LCBhdXRvcihhdXRvcmVwKSwgYyhjb3VudCkge30KICAgIGludAkgICBrZXkoKQljb25zdAl7IHJl dHVybiBrOyB9CiAgICBpbnQJICAgYXNjaWkoKQljb25zdAl7IHJldHVybiBhOyB9CiAgICBCdXR0 b25TdGF0ZSBzdGF0ZSgpCWNvbnN0CXsgcmV0dXJuIEJ1dHRvblN0YXRlKHMpOyB9CiAgICBCdXR0 b25TdGF0ZSBzdGF0ZUFmdGVyKCkgY29uc3Q7CiAgICBib29sICAgaXNBY2NlcHRlZCgpIGNvbnN0 CXsgcmV0dXJuIGFjY3B0OyB9CiAgICBRU3RyaW5nIHRleHQoKSAgICAgIGNvbnN0ICAgeyByZXR1 cm4gdHh0OyB9CiAgICBib29sICAgaXNBdXRvUmVwZWF0KCkgY29uc3QJeyByZXR1cm4gYXV0b3I7 IH0KICAgIGludCAgIGNvdW50KCkgY29uc3QJeyByZXR1cm4gaW50KGMpOyB9CiAgICB2b2lkICAg YWNjZXB0KCkJCXsgYWNjcHQgPSBUUlVFOyB9CiAgICB2b2lkICAgaWdub3JlKCkJCXsgYWNjcHQg PSBGQUxTRTsgfQoKcHJvdGVjdGVkOgogICAgUVN0cmluZyB0eHQ7CiAgICB1c2hvcnQgaywgczsK ICAgIHVjaGFyICBhOwogICAgdWludCAgIGFjY3B0OjE7CiAgICB1aW50ICAgYXV0b3I6MTsKICAg IHVzaG9ydCBjOwp9OwoKCmNsYXNzICAgUUZvY3VzRXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVi bGljOgoKICAgIFFGb2N1c0V2ZW50KCBUeXBlIHR5cGUgKQoJOiBRRXZlbnQodHlwZSkge30KCiAg ICBib29sICAgZ290Rm9jdXMoKQljb25zdCB7IHJldHVybiB0eXBlKCkgPT0gRm9jdXNJbjsgfQog ICAgYm9vbCAgIGxvc3RGb2N1cygpCWNvbnN0IHsgcmV0dXJuIHR5cGUoKSA9PSBGb2N1c091dDsg fQoKICAgIGVudW0gUmVhc29uIHsgTW91c2UsIFRhYiwgQmFja3RhYiwgQWN0aXZlV2luZG93LCBQ b3B1cCwgU2hvcnRjdXQsIE90aGVyIH07CiAgICBzdGF0aWMgUmVhc29uIHJlYXNvbigpOwogICAg c3RhdGljIHZvaWQgc2V0UmVhc29uKCBSZWFzb24gcmVhc29uICk7CiAgICBzdGF0aWMgdm9pZCBy ZXNldFJlYXNvbigpOwoKcHJpdmF0ZToKICAgIHN0YXRpYyBSZWFzb24gbV9yZWFzb247CiAgICBz dGF0aWMgUmVhc29uIHByZXZfcmVhc29uOwp9OwoKCmNsYXNzICAgUVBhaW50RXZlbnQgOiBwdWJs aWMgUUV2ZW50CnsKcHVibGljOgogICAgUVBhaW50RXZlbnQoIGNvbnN0IFFSZWdpb24mIHBhaW50 UmVnaW9uLCBib29sIGVyYXNlZCA9IFRSVUUpCgk6IFFFdmVudChQYWludCksCgkgIHJlYyhwYWlu dFJlZ2lvbi5ib3VuZGluZ1JlY3QoKSksCgkgIHJlZyhwYWludFJlZ2lvbiksCgkgIGVyYXNlKGVy YXNlZCl7fQogICAgUVBhaW50RXZlbnQoIGNvbnN0IFFSZWN0ICZwYWludFJlY3QsIGJvb2wgZXJh c2VkID0gVFJVRSApCgk6IFFFdmVudChQYWludCksCgkgIHJlYyhwYWludFJlY3QpLAoJICByZWco cGFpbnRSZWN0KSwKCSAgZXJhc2UoZXJhc2VkKXt9CiAgICBjb25zdCBRUmVjdCAmcmVjdCgpIGNv bnN0CSAgeyByZXR1cm4gcmVjOyB9CiAgICBjb25zdCBRUmVnaW9uICZyZWdpb24oKSBjb25zdCB7 IHJldHVybiByZWc7IH0KICAgIGJvb2wgZXJhc2VkKCkgY29uc3QgeyByZXR1cm4gZXJhc2U7IH0K cHJvdGVjdGVkOgogICAgZnJpZW5kIGNsYXNzIFFBcHBsaWNhdGlvbjsKICAgIGZyaWVuZCBjbGFz cyBRQmFzZUFwcGxpY2F0aW9uOwogICAgUVJlY3QgcmVjOwogICAgUVJlZ2lvbiByZWc7CiAgICBi b29sIGVyYXNlOwp9OwoKCmNsYXNzICAgUU1vdmVFdmVudCA6IHB1YmxpYyBRRXZlbnQKewpwdWJs aWM6CiAgICBRTW92ZUV2ZW50KCBjb25zdCBRUG9pbnQgJnBvcywgY29uc3QgUVBvaW50ICZvbGRQ b3MgKQoJOiBRRXZlbnQoTW92ZSksIHAocG9zKSwgb2xkcChvbGRQb3MpIHt9CiAgICBjb25zdCBR UG9pbnQgJnBvcygpCSAgY29uc3QgeyByZXR1cm4gcDsgfQogICAgY29uc3QgUVBvaW50ICZvbGRQ b3MoKWNvbnN0IHsgcmV0dXJuIG9sZHA7fQpwcm90ZWN0ZWQ6CiAgICBRUG9pbnQgcCwgb2xkcDsK ICAgIGZyaWVuZCBjbGFzcyBRQXBwbGljYXRpb247CiAgICBmcmllbmQgY2xhc3MgUUJhc2VBcHBs aWNhdGlvbjsKfTsKCgpjbGFzcyAgIFFSZXNpemVFdmVudCA6IHB1YmxpYyBRRXZlbnQKewpwdWJs aWM6CiAgICBRUmVzaXplRXZlbnQoIGNvbnN0IFFTaXplICZzaXplLCBjb25zdCBRU2l6ZSAmb2xk U2l6ZSApCgk6IFFFdmVudChSZXNpemUpLCBzKHNpemUpLCBvbGRzKG9sZFNpemUpIHt9CiAgICBj b25zdCBRU2l6ZSAmc2l6ZSgpCSAgY29uc3QgeyByZXR1cm4gczsgfQogICAgY29uc3QgUVNpemUg Jm9sZFNpemUoKWNvbnN0IHsgcmV0dXJuIG9sZHM7fQpwcm90ZWN0ZWQ6CiAgICBRU2l6ZSBzLCBv bGRzOwogICAgZnJpZW5kIGNsYXNzIFFBcHBsaWNhdGlvbjsKICAgIGZyaWVuZCBjbGFzcyBRQmFz ZUFwcGxpY2F0aW9uOwp9OwoKCmNsYXNzICAgUUNsb3NlRXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsK cHVibGljOgogICAgUUNsb3NlRXZlbnQoKQoJOiBRRXZlbnQoQ2xvc2UpLCBhY2NwdChGQUxTRSkg e30KICAgIGJvb2wgICBpc0FjY2VwdGVkKCkgY29uc3QJeyByZXR1cm4gYWNjcHQ7IH0KICAgIHZv aWQgICBhY2NlcHQoKQkJeyBhY2NwdCA9IFRSVUU7IH0KICAgIHZvaWQgICBpZ25vcmUoKQkJeyBh Y2NwdCA9IEZBTFNFOyB9CnByb3RlY3RlZDoKICAgIGJvb2wgICBhY2NwdDsKfTsKCgpjbGFzcyAg IFFTaG93RXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVibGljOgogICAgUVNob3dFdmVudCgpCgk6 IFFFdmVudChTaG93KSB7fQp9OwoKCmNsYXNzICAgUUhpZGVFdmVudCA6IHB1YmxpYyBRRXZlbnQK ewpwdWJsaWM6CiAgICBRSGlkZUV2ZW50KCkKCTogUUV2ZW50KEhpZGUpIHt9Cn07CgpjbGFzcyAg IFFDb250ZXh0TWVudUV2ZW50IDogcHVibGljIFFFdmVudAp7CnB1YmxpYzoKICAgIGVudW0gUmVh c29uIHsgTW91c2UsIEtleWJvYXJkLCBPdGhlciB9OwogICAgUUNvbnRleHRNZW51RXZlbnQoIFJl YXNvbiByZWFzb24sIGNvbnN0IFFQb2ludCAmcG9zLCBjb25zdCBRUG9pbnQgJmdsb2JhbFBvcywg aW50IHN0YXRlICkKCTogUUV2ZW50KCBDb250ZXh0TWVudSApLCBwKCBwb3MgKSwgZ3AoIGdsb2Jh bFBvcyApLCBhY2NwdCggRkFMU0UgKSwgY29uc3VtKEZBTFNFKSwKCXJlYXMoIHJlYXNvbiApLCBz KCh1c2hvcnQpc3RhdGUpIHt9CiAgICBRQ29udGV4dE1lbnVFdmVudCggUmVhc29uIHJlYXNvbiwg Y29uc3QgUVBvaW50ICZwb3MsIGludCBzdGF0ZSApOwoKICAgIGludAkgICAgeCgpIGNvbnN0IHsg cmV0dXJuIHAueCgpOyB9CiAgICBpbnQJICAgIHkoKSBjb25zdCB7IHJldHVybiBwLnkoKTsgfQog ICAgaW50CSAgICBnbG9iYWxYKCkgY29uc3QgeyByZXR1cm4gZ3AueCgpOyB9CiAgICBpbnQJICAg IGdsb2JhbFkoKSBjb25zdCB7IHJldHVybiBncC55KCk7IH0KCiAgICBjb25zdCBRUG9pbnQmICAg cG9zKCkgY29uc3QgeyByZXR1cm4gcDsgfQogICAgY29uc3QgUVBvaW50JiAgIGdsb2JhbFBvcygp IGNvbnN0IHsgcmV0dXJuIGdwOyB9CgogICAgQnV0dG9uU3RhdGUgc3RhdGUoKQljb25zdAl7IHJl dHVybiAoQnV0dG9uU3RhdGUpIHM7IH0KICAgIGJvb2wgICAgaXNBY2NlcHRlZCgpIGNvbnN0CXsg cmV0dXJuIGFjY3B0OyB9CiAgICBib29sICAgIGlzQ29uc3VtZWQoKSBjb25zdCAgeyByZXR1cm4g Y29uc3VtOyB9CiAgICB2b2lkICAgIGNvbnN1bWUoKSAgICAgICAgICAgeyBjb25zdW0gPSBUUlVF OyB9CiAgICB2b2lkICAgIGFjY2VwdCgpCQl7IGFjY3B0ID0gVFJVRTsgY29uc3VtID0gVFJVRTsg fQogICAgdm9pZCAgICBpZ25vcmUoKQkJeyBhY2NwdCA9IEZBTFNFOyBjb25zdW0gPSBGQUxTRTsg fQoKICAgIFJlYXNvbiAgcmVhc29uKCkgY29uc3QgeyByZXR1cm4gUmVhc29uKCByZWFzICk7IH0K CnByb3RlY3RlZDoKICAgIFFQb2ludCAgcDsKICAgIFFQb2ludCAgZ3A7CiAgICBib29sICAgIGFj Y3B0OwogICAgYm9vbCAgICBjb25zdW07CiAgICB1aW50ICAgIHJlYXM6ODsKICAgIHVzaG9ydCBz Owp9OwoKCmNsYXNzICAgUUlNRXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVibGljOgogICAgUUlN RXZlbnQoIFR5cGUgdHlwZSwgY29uc3QgUVN0cmluZyAmdGV4dCwgaW50IGN1cnNvclBvc2l0aW9u ICkKCTogUUV2ZW50KHR5cGUpLCB0eHQodGV4dCksIGNwb3MoY3Vyc29yUG9zaXRpb24pLCBhKEZB TFNFKSB7fQogICAgY29uc3QgUVN0cmluZyAmdGV4dCgpIGNvbnN0IHsgcmV0dXJuIHR4dDsgfQog ICAgaW50IGN1cnNvclBvcygpIGNvbnN0IHsgcmV0dXJuIGNwb3M7IH0KICAgIGJvb2wgaXNBY2Nl cHRlZCgpIGNvbnN0IHsgcmV0dXJuIGE7IH0KICAgIHZvaWQgYWNjZXB0KCkgeyBhID0gVFJVRTsg fQogICAgdm9pZCBpZ25vcmUoKSB7IGEgPSBGQUxTRTsgfQpwcml2YXRlOgogICAgUVN0cmluZyB0 eHQ7CiAgICBpbnQgY3BvczsKICAgIGJvb2wgYTsKfTsKCgoKCiAKIAogCgpjbGFzcyAgIFFEcm9w RXZlbnQgOiBwdWJsaWMgUUV2ZW50LCBwdWJsaWMgUU1pbWVTb3VyY2UKewpwdWJsaWM6CiAgICBR RHJvcEV2ZW50KCBjb25zdCBRUG9pbnQmIHBvcywgVHlwZSB0eXA9RHJvcCApCgk6IFFFdmVudCh0 eXApLCBwKHBvcyksCgkgIGFjdCgwKSwgYWNjcHQoMCksIGFjY3B0YWN0KDApLCByZXN2KDApLAoJ ICBkKDApCgl7fQogICAgY29uc3QgUVBvaW50ICZwb3MoKSBjb25zdAl7IHJldHVybiBwOyB9CiAg ICBib29sIGlzQWNjZXB0ZWQoKSBjb25zdAl7IHJldHVybiBhY2NwdCB8fCBhY2NwdGFjdDsgfQog ICAgdm9pZCBhY2NlcHQoYm9vbCB5PVRSVUUpCXsgYWNjcHQgPSB5OyB9CiAgICB2b2lkIGlnbm9y ZSgpCQl7IGFjY3B0ID0gRkFMU0U7IH0KCiAgICBib29sIGlzQWN0aW9uQWNjZXB0ZWQoKSBjb25z dCB7IHJldHVybiBhY2NwdGFjdDsgfQogICAgdm9pZCBhY2NlcHRBY3Rpb24oYm9vbCB5PVRSVUUp IHsgYWNjcHRhY3QgPSB5OyB9CiAgICBlbnVtIEFjdGlvbiB7IENvcHksIExpbmssIE1vdmUsIFBy aXZhdGUsIFVzZXJBY3Rpb249MTAwIH07CiAgICB2b2lkIHNldEFjdGlvbiggQWN0aW9uIGEgKSB7 IGFjdCA9ICh1aW50KWE7IH0KICAgIEFjdGlvbiBhY3Rpb24oKSBjb25zdCB7IHJldHVybiBBY3Rp b24oYWN0KTsgfQoKICAgIFFXaWRnZXQqIHNvdXJjZSgpIGNvbnN0OwogICAgY29uc3QgY2hhciog Zm9ybWF0KCBpbnQgbiA9IDAgKSBjb25zdDsKICAgIFFCeXRlQXJyYXkgZW5jb2RlZERhdGEoIGNv bnN0IGNoYXIqICkgY29uc3Q7CiAgICBib29sIHByb3ZpZGVzKCBjb25zdCBjaGFyKiApIGNvbnN0 OwoKICAgIFFCeXRlQXJyYXkgZGF0YShjb25zdCBjaGFyKiBmKSBjb25zdCB7IHJldHVybiBlbmNv ZGVkRGF0YShmKTsgfQoKICAgIHZvaWQgc2V0UG9pbnQoIGNvbnN0IFFQb2ludCYgbnAgKSB7IHAg PSBucDsgfQoKcHJvdGVjdGVkOgogICAgUVBvaW50IHA7CiAgICB1aW50IGFjdDo4OwogICAgdWlu dCBhY2NwdDoxOwogICAgdWludCBhY2NwdGFjdDoxOwogICAgdWludCByZXN2OjU7CiAgICB2b2lk ICogZDsKfTsKCgoKY2xhc3MgICBRRHJhZ01vdmVFdmVudCA6IHB1YmxpYyBRRHJvcEV2ZW50CnsK cHVibGljOgogICAgUURyYWdNb3ZlRXZlbnQoIGNvbnN0IFFQb2ludCYgcG9zLCBUeXBlIHR5cD1E cmFnTW92ZSApCgk6IFFEcm9wRXZlbnQocG9zLHR5cCksCgkgIHJlY3QoIHBvcywgUVNpemUoIDEs IDEgKSApIHt9CiAgICBRUmVjdCBhbnN3ZXJSZWN0KCkgY29uc3QgeyByZXR1cm4gcmVjdDsgfQog ICAgdm9pZCBhY2NlcHQoIGJvb2wgeT1UUlVFICkgeyBRRHJvcEV2ZW50OjphY2NlcHQoeSk7IH0K ICAgIHZvaWQgYWNjZXB0KCBjb25zdCBRUmVjdCAmIHIpIHsgYWNjcHQgPSBUUlVFOyByZWN0ID0g cjsgfQogICAgdm9pZCBpZ25vcmUoIGNvbnN0IFFSZWN0ICYgcikgeyBhY2NwdCA9RkFMU0U7IHJl Y3QgPSByOyB9CiAgICB2b2lkIGlnbm9yZSgpCQl7IFFEcm9wRXZlbnQ6Omlnbm9yZSgpOyB9Cgpw cm90ZWN0ZWQ6CiAgICBRUmVjdCByZWN0Owp9OwoKCmNsYXNzICAgUURyYWdFbnRlckV2ZW50IDog cHVibGljIFFEcmFnTW92ZUV2ZW50CnsKcHVibGljOgogICAgUURyYWdFbnRlckV2ZW50KCBjb25z dCBRUG9pbnQmIHBvcyApIDoKCVFEcmFnTW92ZUV2ZW50KHBvcywgRHJhZ0VudGVyKSB7IH0KfTsK CgogCmNsYXNzICAgUURyYWdSZXNwb25zZUV2ZW50IDogcHVibGljIFFFdmVudAp7CnB1YmxpYzoK ICAgIFFEcmFnUmVzcG9uc2VFdmVudCggYm9vbCBhY2NlcHRlZCApCgk6IFFFdmVudChEcmFnUmVz cG9uc2UpLCBhKGFjY2VwdGVkKSB7fQogICAgYm9vbCAgIGRyYWdBY2NlcHRlZCgpIGNvbnN0CXsg cmV0dXJuIGE7IH0KcHJvdGVjdGVkOgogICAgYm9vbCBhOwp9OwoKCmNsYXNzICAgUURyYWdMZWF2 ZUV2ZW50IDogcHVibGljIFFFdmVudAp7CnB1YmxpYzoKICAgIFFEcmFnTGVhdmVFdmVudCgpCgk6 IFFFdmVudChEcmFnTGVhdmUpIHt9Cn07CgoKCmNsYXNzICAgUUNoaWxkRXZlbnQgOiBwdWJsaWMg UUV2ZW50CnsKcHVibGljOgogICAgUUNoaWxkRXZlbnQoIFR5cGUgdHlwZSwgUU9iamVjdCAqY2hp bGQgKQoJOiBRRXZlbnQodHlwZSksIGMoY2hpbGQpIHt9CiAgICBRT2JqZWN0ICpjaGlsZCgpIGNv bnN0CXsgcmV0dXJuIGM7IH0KICAgIGJvb2wgaW5zZXJ0ZWQoKSBjb25zdCB7IHJldHVybiB0ID09 IENoaWxkSW5zZXJ0ZWQ7IH0KICAgIGJvb2wgcmVtb3ZlZCgpIGNvbnN0IHsgcmV0dXJuIHQgPT0g Q2hpbGRSZW1vdmVkOyB9CnByb3RlY3RlZDoKICAgIFFPYmplY3QgKmM7Cn07CgoKY2xhc3MgICBR Q3VzdG9tRXZlbnQgOiBwdWJsaWMgUUV2ZW50CnsKcHVibGljOgogICAgUUN1c3RvbUV2ZW50KCBp bnQgdHlwZSApOwogICAgUUN1c3RvbUV2ZW50KCBUeXBlIHR5cGUsIHZvaWQgKmRhdGEgKQoJOiBR RXZlbnQodHlwZSksIGQoZGF0YSkge307CiAgICB2b2lkICAgICAgICpkYXRhKCkJY29uc3QJeyBy ZXR1cm4gZDsgfQogICAgdm9pZAlzZXREYXRhKCB2b2lkKiBkYXRhICkJeyBkID0gZGF0YTsgfQpw cml2YXRlOgogICAgdm9pZCAgICAgICAqZDsKfTsKCgojIDQ1ICIvdXNyL2xvY2FsL3F0L2luY2x1 ZGUvcW9iamVjdC5oIiAyCgoKCgoKCgpjbGFzcyBRTWV0YU9iamVjdDsKY2xhc3MgUVZhcmlhbnQ7 CmNsYXNzIFFNZXRhUHJvcGVydHk7CmNsYXNzIFFQb3N0RXZlbnRMaXN0OwpjbGFzcyBRT2JqZWN0 UHJpdmF0ZTsKc3RydWN0IFFVT2JqZWN0OwoKY2xhc3MgICBRT2JqZWN0OiBwdWJsaWMgUXQKewog ICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1 cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkg Y29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29s IHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwg UVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50 KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFP YmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29u c3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29u c3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmpl Y3QgKm1ldGFPYmo7IAogICAgIAoKcHVibGljOgogICAgUU9iamVjdCggUU9iamVjdCAqcGFyZW50 PTAsIGNvbnN0IGNoYXIgKm5hbWU9MCApOwogICAgdmlydHVhbCB+UU9iamVjdCgpOwoKCgoKCgoK CiAgICB2aXJ0dWFsIGJvb2wgZXZlbnQoIFFFdmVudCAqICk7CiAgICB2aXJ0dWFsIGJvb2wgZXZl bnRGaWx0ZXIoIFFPYmplY3QgKiwgUUV2ZW50ICogKTsKCiAgICBib29sCSBpc0EoIGNvbnN0IGNo YXIgKiApCSBjb25zdDsKICAgIGJvb2wJIGluaGVyaXRzKCBjb25zdCBjaGFyICogKSBjb25zdDsK CiAgICBjb25zdCBjaGFyICAqbmFtZSgpIGNvbnN0OwogICAgY29uc3QgY2hhciAgKm5hbWUoIGNv bnN0IGNoYXIgKiBkZWZhdWx0TmFtZSApIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBzZXROYW1l KCBjb25zdCBjaGFyICpuYW1lICk7CiAgICBib29sCSBpc1dpZGdldFR5cGUoKQkgIGNvbnN0IHsg cmV0dXJuIGlzV2lkZ2V0OyB9CiAgICBib29sCSBoaWdoUHJpb3JpdHkoKQkgIGNvbnN0IHsgcmV0 dXJuIEZBTFNFOyB9CgogICAgYm9vbAkgc2lnbmFsc0Jsb2NrZWQoKSAgY29uc3QgeyByZXR1cm4g YmxvY2tTaWc7IH0KICAgIHZvaWQJIGJsb2NrU2lnbmFscyggYm9vbCBiICk7CgogICAgaW50CQkg c3RhcnRUaW1lciggaW50IGludGVydmFsICk7CiAgICB2b2lkCSBraWxsVGltZXIoIGludCBpZCAp OwogICAgdm9pZAkga2lsbFRpbWVycygpOwoKICAgIFFPYmplY3QgICAgICAgICAgICpjaGlsZCgg Y29uc3QgY2hhciAqb2JqTmFtZSwgY29uc3QgY2hhciAqaW5oZXJpdHNDbGFzcyA9IDAsIGJvb2wg cmVjdXJzaXZlU2VhcmNoID0gVFJVRSApOyAgCiAgICBjb25zdCBRT2JqZWN0TGlzdCAqY2hpbGRy ZW4oKSBjb25zdCB7IHJldHVybiBjaGlsZE9iamVjdHM7IH0KCiAgICBzdGF0aWMgY29uc3QgUU9i amVjdExpc3QgKm9iamVjdFRyZWVzKCk7CgogICAgUU9iamVjdExpc3QJICAgICAgKnF1ZXJ5TGlz dCggY29uc3QgY2hhciAqaW5oZXJpdHNDbGFzcyA9IDAsCgkJCQkgIGNvbnN0IGNoYXIgKm9iak5h bWUgPSAwLAoJCQkJICBib29sIHJlZ2V4cE1hdGNoID0gVFJVRSwKCQkJCSAgYm9vbCByZWN1cnNp dmVTZWFyY2ggPSBUUlVFICkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIGluc2VydENoaWxkKCBR T2JqZWN0ICogKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVDaGlsZCggUU9iamVjdCAqICk7Cgog ICAgdm9pZAkgaW5zdGFsbEV2ZW50RmlsdGVyKCBjb25zdCBRT2JqZWN0ICogKTsKICAgIHZvaWQJ IHJlbW92ZUV2ZW50RmlsdGVyKCBjb25zdCBRT2JqZWN0ICogKTsKCiAgICBzdGF0aWMgYm9vbCAg Y29ubmVjdCggY29uc3QgUU9iamVjdCAqc2VuZGVyLCBjb25zdCBjaGFyICpzaWduYWwsCgkJCSAg Y29uc3QgUU9iamVjdCAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKm1lbWJlciApOwogICAgYm9vbAkg Y29ubmVjdCggY29uc3QgUU9iamVjdCAqc2VuZGVyLCBjb25zdCBjaGFyICpzaWduYWwsCgkJCSAg Y29uc3QgY2hhciAqbWVtYmVyICkgY29uc3Q7CiAgICBzdGF0aWMgYm9vbCAgZGlzY29ubmVjdCgg Y29uc3QgUU9iamVjdCAqc2VuZGVyLCBjb25zdCBjaGFyICpzaWduYWwsCgkJCSAgICAgY29uc3Qg UU9iamVjdCAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKm1lbWJlciApOwogICAgYm9vbAkgZGlzY29u bmVjdCggY29uc3QgY2hhciAqc2lnbmFsPTAsCgkJCSAgICAgY29uc3QgUU9iamVjdCAqcmVjZWl2 ZXI9MCwgY29uc3QgY2hhciAqbWVtYmVyPTAgKTsKICAgIGJvb2wJIGRpc2Nvbm5lY3QoIGNvbnN0 IFFPYmplY3QgKnJlY2VpdmVyLCBjb25zdCBjaGFyICptZW1iZXI9MCApOwogICAgc3RhdGljIHZv aWQgCSBjb25uZWN0SW50ZXJuYWwoIGNvbnN0IFFPYmplY3QgKnNlbmRlciwgaW50IHNpZ25hbF9p bmRleCwgY29uc3QgUU9iamVjdCAqcmVjZWl2ZXIsCgkJCQkgIGludCBtZW1iY29kZSwgaW50IG1l bWJlcl9pbmRleCApOwoKICAgIHZvaWQJIGR1bXBPYmplY3RUcmVlKCk7CiAgICB2b2lkCSBkdW1w T2JqZWN0SW5mbygpOwoKCiAgICB2aXJ0dWFsIGJvb2wgc2V0UHJvcGVydHkoIGNvbnN0IGNoYXIg Km5hbWUsIGNvbnN0IFFWYXJpYW50JiB2YWx1ZSApOwogICAgdmlydHVhbCBRVmFyaWFudCBwcm9w ZXJ0eSggY29uc3QgY2hhciAqbmFtZSApIGNvbnN0OwoKCgoKCgoKCnByb3RlY3RlZCA6CiAgICB2 b2lkCSBkZXN0cm95ZWQoKTsKICAgIHZvaWQJIGRlc3Ryb3llZCggUU9iamVjdCogb2JqICk7Cgpw dWJsaWM6CiAgICBRT2JqZWN0CSpwYXJlbnQoKSBjb25zdCB7IHJldHVybiBwYXJlbnRPYmo7IH0K CnB1YmxpYyAgOgogICAgdm9pZAlkZWxldGVMYXRlcigpOwoKcHJpdmF0ZSAgOgogICAgdm9pZAkg Y2xlYW51cEV2ZW50RmlsdGVyKCBRT2JqZWN0KiApOwoKcHJvdGVjdGVkOgogICAgYm9vbAlhY3Rp dmF0ZV9maWx0ZXJzKCBRRXZlbnQgKiApOwogICAgUUNvbm5lY3Rpb25MaXN0ICpyZWNlaXZlcnMo IGNvbnN0IGNoYXIqIHNpZ25hbCApIGNvbnN0OwogICAgUUNvbm5lY3Rpb25MaXN0ICpyZWNlaXZl cnMoIGludCBzaWduYWwgKSBjb25zdDsKICAgIHZvaWQJYWN0aXZhdGVfc2lnbmFsKCBpbnQgc2ln bmFsICk7CiAgICB2b2lkCWFjdGl2YXRlX3NpZ25hbCggaW50IHNpZ25hbCwgaW50ICk7CiAgICB2 b2lkCWFjdGl2YXRlX3NpZ25hbCggaW50IHNpZ25hbCwgZG91YmxlICk7CiAgICB2b2lkCWFjdGl2 YXRlX3NpZ25hbCggaW50IHNpZ25hbCwgUVN0cmluZyApOwogICAgdm9pZAlhY3RpdmF0ZV9zaWdu YWxfYm9vbCggaW50IHNpZ25hbCwgYm9vbCApOwogICAgdm9pZCAJYWN0aXZhdGVfc2lnbmFsKCBR Q29ubmVjdGlvbkxpc3QgKmNsaXN0LCBRVU9iamVjdCAqbyApOwoKICAgIGNvbnN0IFFPYmplY3Qg KnNlbmRlcigpOwoKICAgIHZpcnR1YWwgdm9pZCB0aW1lckV2ZW50KCBRVGltZXJFdmVudCAqICk7 CiAgICB2aXJ0dWFsIHZvaWQgY2hpbGRFdmVudCggUUNoaWxkRXZlbnQgKiApOwogICAgdmlydHVh bCB2b2lkIGN1c3RvbUV2ZW50KCBRQ3VzdG9tRXZlbnQgKiApOwoKICAgIHZpcnR1YWwgdm9pZCBj b25uZWN0Tm90aWZ5KCBjb25zdCBjaGFyICpzaWduYWwgKTsKICAgIHZpcnR1YWwgdm9pZCBkaXNj b25uZWN0Tm90aWZ5KCBjb25zdCBjaGFyICpzaWduYWwgKTsKICAgIHZpcnR1YWwgYm9vbCBjaGVj a0Nvbm5lY3RBcmdzKCBjb25zdCBjaGFyICpzaWduYWwsIGNvbnN0IFFPYmplY3QgKnJlY2VpdmVy LAoJCQkJICAgY29uc3QgY2hhciAqbWVtYmVyICk7CiAgICBzdGF0aWMgUUNTdHJpbmcgbm9ybWFs aXplU2lnbmFsU2xvdCggY29uc3QgY2hhciAqc2lnbmFsU2xvdCApOwoKcHJpdmF0ZToKICAgIHVp bnQJaXNTaWduYWwgICA6IDE7CiAgICB1aW50CWlzV2lkZ2V0ICAgOiAxOwogICAgdWludAlwZW5k VGltZXIgIDogMTsKICAgIHVpbnQJYmxvY2tTaWcgICA6IDE7CiAgICB1aW50CXdhc0RlbGV0ZWQg OiAxOwogICAgdWludAlpc1RyZWUgOiAxOwoKICAgIGNvbnN0IGNoYXIJKm9iam5hbWU7CiAgICBR T2JqZWN0CSpwYXJlbnRPYmo7CiAgICBRT2JqZWN0TGlzdCAqY2hpbGRPYmplY3RzOwogICAgUVNp Z25hbFZlYyAqY29ubmVjdGlvbnM7CiAgICBRT2JqZWN0TGlzdCAqc2VuZGVyT2JqZWN0czsKICAg IFFPYmplY3RMaXN0ICpldmVudEZpbHRlcnM7CiAgICBRUG9zdEV2ZW50TGlzdCAqcG9zdGVkRXZl bnRzOwogICAgUU9iamVjdFByaXZhdGUqIGQ7CgogICAgc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0 aWNRdE1ldGFPYmplY3QoKTsKCiAgICBmcmllbmQgY2xhc3MgUUFwcGxpY2F0aW9uOwogICAgZnJp ZW5kIGNsYXNzIFFCYXNlQXBwbGljYXRpb247CiAgICBmcmllbmQgY2xhc3MgUVdpZGdldDsKICAg IGZyaWVuZCBjbGFzcyBRU2lnbmFsOwogICAgZnJpZW5kIGNsYXNzIFFTZW5kZXJPYmplY3Q7Cgpw cml2YXRlOgkgCgogICAgUU9iamVjdCggY29uc3QgUU9iamVjdCAmICk7CiAgICBRT2JqZWN0ICZv cGVyYXRvcj0oIGNvbnN0IFFPYmplY3QgJiApOwoKfTsKCgppbmxpbmUgYm9vbCBRT2JqZWN0Ojpj b25uZWN0KCBjb25zdCBRT2JqZWN0ICpzZW5kZXIsIGNvbnN0IGNoYXIgKnNpZ25hbCwKCQkJICAg ICAgY29uc3QgY2hhciAqbWVtYmVyICkgY29uc3QKewogICAgcmV0dXJuIGNvbm5lY3QoIHNlbmRl ciwgc2lnbmFsLCB0aGlzLCBtZW1iZXIgKTsKfQoKCmlubGluZSBib29sIFFPYmplY3Q6OmRpc2Nv bm5lY3QoIGNvbnN0IGNoYXIgKnNpZ25hbCwKCQkJCSBjb25zdCBRT2JqZWN0ICpyZWNlaXZlciwg Y29uc3QgY2hhciAqbWVtYmVyICkKewogICAgcmV0dXJuIGRpc2Nvbm5lY3QoIHRoaXMsIHNpZ25h bCwgcmVjZWl2ZXIsIG1lbWJlciApOwp9CgoKaW5saW5lIGJvb2wgUU9iamVjdDo6ZGlzY29ubmVj dCggY29uc3QgUU9iamVjdCAqcmVjZWl2ZXIsIGNvbnN0IGNoYXIgKm1lbWJlciApCnsKICAgIHJl dHVybiBkaXNjb25uZWN0KCB0aGlzLCAwLCByZWNlaXZlciwgbWVtYmVyICk7Cn0KCgpjbGFzcyAg IFFTZW5kZXJPYmplY3QgOiBwdWJsaWMgUU9iamVjdAkJIAp7CnB1YmxpYzoKICAgIHZvaWQgc2V0 U2VuZGVyKCBRT2JqZWN0ICpzICk7Cn07CgojIDI0MSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fv YmplY3QuaCIKCgoKCgojIDQzICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXdpZGdldC5oIiAyCgoj IDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcGFpbnRkZXZpY2UuaCIgMQogCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBRSU9EZXZpY2U7CmNs YXNzIFFTdHJpbmc7CgoKCnN0cnVjdCBRUGFpbnREZXZpY2VYMTFEYXRhOwoKCnVuaW9uIFFQRGV2 Q21kUGFyYW0gewogICAgaW50CQkJIGl2YWw7CiAgICBpbnQJCQkqaXZlYzsKICAgIFFTdHJpbmcJ ICAgICAgICAqc3RyOwogICAgY29uc3QgUVBvaW50CSpwb2ludDsKICAgIGNvbnN0IFFSZWN0CQkq cmVjdDsKICAgIGNvbnN0IFFQb2ludEFycmF5CSpwdGFycjsKICAgIGNvbnN0IFFQaXhtYXAJKnBp eG1hcDsKICAgIGNvbnN0IFFJbWFnZQkqaW1hZ2U7CiAgICBjb25zdCBRQ29sb3IJKmNvbG9yOwog ICAgY29uc3QgUUZvbnQJCSpmb250OwogICAgY29uc3QgUVBlbgkJKnBlbjsKICAgIGNvbnN0IFFC cnVzaAkqYnJ1c2g7CiAgICBjb25zdCBRUmVnaW9uCSpyZ247CiAgICBjb25zdCBRV01hdHJpeAkq bWF0cml4OwogICAgUUlPRGV2aWNlCQkqZGV2aWNlOwp9OwoKCgpjbGFzcyAgIFFQYWludERldmlj ZQkJCQkgCnsKcHVibGljOgogICAgdmlydHVhbCB+UVBhaW50RGV2aWNlKCk7CgogICAgaW50CQlk ZXZUeXBlKCkgY29uc3Q7CiAgICBib29sCWlzRXh0RGV2KCkgY29uc3Q7CiAgICBib29sCXBhaW50 aW5nQWN0aXZlKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFJlc29sdXRpb24oIGludCAp OwogICAgdmlydHVhbCBpbnQgcmVzb2x1dGlvbigpIGNvbnN0OwoKICAgICAKICAgICAKCgoKICAg IHZpcnR1YWwgUXQ6OkhBTkRMRQloYW5kbGUoKSBjb25zdDsKICAgIHZpcnR1YWwgUXQ6OkhBTkRM RSAgeDExUmVuZGVySGFuZGxlKCkgY29uc3Q7CgoKCgoKCgogICAgRGlzcGxheSAJICAgKngxMURp c3BsYXkoKSBjb25zdDsKICAgIGludAkJICAgIHgxMVNjcmVlbigpIGNvbnN0OwogICAgaW50CQkg ICAgeDExRGVwdGgoKSBjb25zdDsKICAgIGludAkJICAgIHgxMUNlbGxzKCkgY29uc3Q7CiAgICBR dDo6SEFORExFCSAgICB4MTFDb2xvcm1hcCgpIGNvbnN0OwogICAgYm9vbAkgICAgeDExRGVmYXVs dENvbG9ybWFwKCkgY29uc3Q7CiAgICB2b2lkCSAgICp4MTFWaXN1YWwoKSBjb25zdDsKICAgIGJv b2wJICAgIHgxMURlZmF1bHRWaXN1YWwoKSBjb25zdDsKCiAgICBzdGF0aWMgRGlzcGxheSAqeDEx QXBwRGlzcGxheSgpOwogICAgc3RhdGljIGludAkgICAgeDExQXBwU2NyZWVuKCk7CiAgICBzdGF0 aWMgaW50CSAgICB4MTFBcHBEZXB0aCgpOwogICAgc3RhdGljIGludAkgICAgeDExQXBwQ2VsbHMo KTsKICAgIHN0YXRpYyBpbnQJICAgIHgxMUFwcERwaVgoKTsKICAgIHN0YXRpYyBpbnQJICAgIHgx MUFwcERwaVkoKTsKICAgIHN0YXRpYyBRdDo6SEFORExFICAgeDExQXBwQ29sb3JtYXAoKTsKICAg IHN0YXRpYyBib29sICAgICB4MTFBcHBEZWZhdWx0Q29sb3JtYXAoKTsKICAgIHN0YXRpYyB2b2lk ICAgICp4MTFBcHBWaXN1YWwoKTsKICAgIHN0YXRpYyBib29sCSAgICB4MTFBcHBEZWZhdWx0Vmlz dWFsKCk7CiAgICBzdGF0aWMgdm9pZAkgICAgeDExU2V0QXBwRHBpWChpbnQpOwogICAgc3RhdGlj IHZvaWQJICAgIHgxMVNldEFwcERwaVkoaW50KTsKCgoKCgoKCgoKICAgIGVudW0gUERldkNtZCB7 CglQZGNOT1AgPSAwLCAgCglQZGNEcmF3UG9pbnQgPSAxLCAgCglQZGNEcmF3Rmlyc3QgPSBQZGNE cmF3UG9pbnQsCglQZGNNb3ZlVG8gPSAyLCAgCglQZGNMaW5lVG8gPSAzLCAgCglQZGNEcmF3TGlu ZSA9IDQsICAKCVBkY0RyYXdSZWN0ID0gNSwgIAoJUGRjRHJhd1JvdW5kUmVjdCA9IDYsICAKCVBk Y0RyYXdFbGxpcHNlID0gNywgIAoJUGRjRHJhd0FyYyA9IDgsICAKCVBkY0RyYXdQaWUgPSA5LCAg CglQZGNEcmF3Q2hvcmQgPSAxMCwgIAoJUGRjRHJhd0xpbmVTZWdtZW50cyA9IDExLCAgCglQZGNE cmF3UG9seWxpbmUgPSAxMiwgIAoJUGRjRHJhd1BvbHlnb24gPSAxMywgIAoJUGRjRHJhd0N1Ymlj QmV6aWVyID0gMTQsICAKCVBkY0RyYXdUZXh0ID0gMTUsICAKCVBkY0RyYXdUZXh0Rm9ybWF0dGVk ID0gMTYsICAKCVBkY0RyYXdQaXhtYXAgPSAxNywgIAoJUGRjRHJhd0ltYWdlID0gMTgsICAKCVBk Y0RyYXdUZXh0MiA9IDE5LCAgCglQZGNEcmF3VGV4dDJGb3JtYXR0ZWQgPSAyMCwgIAoJUGRjRHJh d0xhc3QgPSBQZGNEcmF3VGV4dDJGb3JtYXR0ZWQsCgoJIAoKCVBkY0JlZ2luID0gMzAsICAKCVBk Y0VuZCA9IDMxLCAgCglQZGNTYXZlID0gMzIsICAKCVBkY1Jlc3RvcmUgPSAzMywgIAoJUGRjU2V0 ZGV2ID0gMzQsICAKCVBkY1NldEJrQ29sb3IgPSA0MCwgIAoJUGRjU2V0QmtNb2RlID0gNDEsICAK CVBkY1NldFJPUCA9IDQyLCAgCglQZGNTZXRCcnVzaE9yaWdpbiA9IDQzLCAgCglQZGNTZXRGb250 ID0gNDUsICAKCVBkY1NldFBlbiA9IDQ2LCAgCglQZGNTZXRCcnVzaCA9IDQ3LCAgCglQZGNTZXRU YWJTdG9wcyA9IDQ4LCAgCglQZGNTZXRUYWJBcnJheSA9IDQ5LCAgCglQZGNTZXRVbml0ID0gNTAs ICAKCVBkY1NldFZYZm9ybSA9IDUxLCAgCglQZGNTZXRXaW5kb3cgPSA1MiwgIAoJUGRjU2V0Vmll d3BvcnQgPSA1MywgIAoJUGRjU2V0V1hmb3JtID0gNTQsICAKCVBkY1NldFdNYXRyaXggPSA1NSwg IAoJUGRjU2F2ZVdNYXRyaXggPSA1NiwKCVBkY1Jlc3RvcmVXTWF0cml4ID0gNTcsCglQZGNTZXRD bGlwID0gNjAsICAKCVBkY1NldENsaXBSZWdpb24gPSA2MSwgIAoKCVBkY1Jlc2VydmVkU3RhcnQg PSAwLCAgCglQZGNSZXNlcnZlZFN0b3AgPSAxOTkgIAogICAgfTsKCnByb3RlY3RlZDoKICAgIFFQ YWludERldmljZSggdWludCBkZXZmbGFncyApOwoKCgoKICAgIFF0OjpIQU5ETEUJaGQ7CQkJCSAK ICAgIFF0OjpIQU5ETEUgIHJlbmRoZDsgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgIHZv aWQJCSBjb3B5WDExRGF0YSggY29uc3QgUVBhaW50RGV2aWNlICogKTsKICAgIHZvaWQJCSBjbG9u ZVgxMURhdGEoIGNvbnN0IFFQYWludERldmljZSAqICk7CiAgICB2aXJ0dWFsIHZvaWQJIHNldFgx MURhdGEoIGNvbnN0IFFQYWludERldmljZVgxMURhdGEqICk7CiAgICBRUGFpbnREZXZpY2VYMTFE YXRhKiBnZXRYMTFEYXRhKCBib29sIGRlZj1GQUxTRSApIGNvbnN0OwoKCgoKCgoKCgogICAgdmly dHVhbCBib29sIGNtZCggaW50LCBRUGFpbnRlciAqLCBRUERldkNtZFBhcmFtICogKTsKICAgIHZp cnR1YWwgaW50CSBtZXRyaWMoIGludCApIGNvbnN0OwogICAgdmlydHVhbCBpbnQJIGZvbnRNZXQo IFFGb250ICosIGludCwgY29uc3QgY2hhciAqID0gMCwgaW50ID0gMCApIGNvbnN0OwogICAgdmly dHVhbCBpbnQJIGZvbnRJbmYoIFFGb250ICosIGludCApIGNvbnN0OwoKICAgIHVzaG9ydAlkZXZG bGFnczsJCQkgCiAgICB1c2hvcnQJcGFpbnRlcnM7CQkJIAoKICAgIGZyaWVuZCBjbGFzcyBRUGFp bnRlcjsKICAgIGZyaWVuZCBjbGFzcyBRUGFpbnREZXZpY2VNZXRyaWNzOwoKCgoKCgoKICAgIGZy aWVuZCAgIHZvaWQgYml0Qmx0KCBRUGFpbnREZXZpY2UgKiwgaW50LCBpbnQsCgkJCQkgY29uc3Qg UVBhaW50RGV2aWNlICosCgkJCQkgaW50LCBpbnQsIGludCwgaW50LCBRdDo6UmFzdGVyT3AsIGJv b2wgKTsKCgogICAgZnJpZW5kIHZvaWQgcXRfaW5pdF9pbnRlcm5hbCggaW50ICosIGNoYXIgKios IERpc3BsYXkgKiwgUXQ6OkhBTkRMRSwgUXQ6OkhBTkRMRSApOwoKCnByaXZhdGU6CgogICAgc3Rh dGljIERpc3BsYXkgKnhfYXBwZGlzcGxheTsKICAgIHN0YXRpYyBpbnQJICAgIHhfYXBwc2NyZWVu OwogICAgc3RhdGljIGludAkgICAgeF9hcHBkZXB0aDsKICAgIHN0YXRpYyBpbnQJICAgIHhfYXBw Y2VsbHM7CiAgICBzdGF0aWMgUXQ6OkhBTkRMRSAgIHhfYXBwY29sb3JtYXA7CiAgICBzdGF0aWMg Ym9vbAkgICAgeF9hcHBkZWZjb2xvcm1hcDsKICAgIHN0YXRpYyB2b2lkCSAgICp4X2FwcHZpc3Vh bDsKICAgIHN0YXRpYyBib29sICAgICB4X2FwcGRlZnZpc3VhbDsKCiAgICBRUGFpbnREZXZpY2VY MTFEYXRhKiB4MTFEYXRhOwoKCnByaXZhdGU6CSAKCiAgICBRUGFpbnREZXZpY2UoIGNvbnN0IFFQ YWludERldmljZSAmICk7CiAgICBRUGFpbnREZXZpY2UgJm9wZXJhdG9yPSggY29uc3QgUVBhaW50 RGV2aWNlICYgKTsKCn07CgoKIAp2b2lkIGJpdEJsdCggUVBhaW50RGV2aWNlICpkc3QsIGludCBk eCwgaW50IGR5LAoJICAgICBjb25zdCBRUGFpbnREZXZpY2UgKnNyYywgaW50IHN4PTAsIGludCBz eT0wLCBpbnQgc3c9LTEsIGludCBzaD0tMSwKCSAgICAgUXQ6OlJhc3Rlck9wID0gUXQ6OkNvcHlS T1AsIGJvb2wgaWdub3JlTWFzaz1GQUxTRSApOwoKIAp2b2lkIGJpdEJsdCggUVBhaW50RGV2aWNl ICpkc3QsIGludCBkeCwgaW50IGR5LAoJICAgICBjb25zdCBRSW1hZ2UgKnNyYywgaW50IHN4PTAs IGludCBzeT0wLCBpbnQgc3c9LTEsIGludCBzaD0tMSwKCSAgICAgaW50IGNvbnZlcnNpb25fZmxh Z3M9MCApOwoKCgoKc3RydWN0ICAgUVBhaW50RGV2aWNlWDExRGF0YSA6IHB1YmxpYyBRU2hhcmVk IHsKICAgIERpc3BsYXkqCXhfZGlzcGxheTsKICAgIGludAkJeF9zY3JlZW47CiAgICBpbnQJCXhf ZGVwdGg7CiAgICBpbnQJCXhfY2VsbHM7CiAgICBRdDo6SEFORExFCXhfY29sb3JtYXA7CiAgICBi b29sCXhfZGVmY29sb3JtYXA7CiAgICB2b2lkKgl4X3Zpc3VhbDsKICAgIGJvb2wJeF9kZWZ2aXN1 YWw7Cn07CgoKCiAKCgoKaW5saW5lIGludCBRUGFpbnREZXZpY2U6OmRldlR5cGUoKSBjb25zdAp7 IHJldHVybiBkZXZGbGFncyAmIFFJbnRlcm5hbDo6RGV2aWNlVHlwZU1hc2s7IH0KCmlubGluZSBi b29sIFFQYWludERldmljZTo6aXNFeHREZXYoKSBjb25zdAp7IHJldHVybiAoZGV2RmxhZ3MgJiBR SW50ZXJuYWw6OkV4dGVybmFsRGV2aWNlKSAhPSAwOyB9CgppbmxpbmUgYm9vbCBRUGFpbnREZXZp Y2U6OnBhaW50aW5nQWN0aXZlKCkgY29uc3QKeyByZXR1cm4gcGFpbnRlcnMgIT0gMDsgfQoKCmlu bGluZSBEaXNwbGF5ICpRUGFpbnREZXZpY2U6OngxMURpc3BsYXkoKSBjb25zdAp7IHJldHVybiB4 MTFEYXRhID8geDExRGF0YS0+eF9kaXNwbGF5IDogeF9hcHBkaXNwbGF5OyB9CgppbmxpbmUgaW50 IFFQYWludERldmljZTo6eDExU2NyZWVuKCkgY29uc3QKeyByZXR1cm4geDExRGF0YSA/IHgxMURh dGEtPnhfc2NyZWVuIDogeF9hcHBzY3JlZW47IH0KCmlubGluZSBpbnQgUVBhaW50RGV2aWNlOjp4 MTFEZXB0aCgpIGNvbnN0CnsgcmV0dXJuIHgxMURhdGEgPyB4MTFEYXRhLT54X2RlcHRoIDogeF9h cHBkZXB0aDsgfQoKaW5saW5lIGludCBRUGFpbnREZXZpY2U6OngxMUNlbGxzKCkgY29uc3QKeyBy ZXR1cm4geDExRGF0YSA/IHgxMURhdGEtPnhfY2VsbHMgOiB4X2FwcGNlbGxzOyB9CgppbmxpbmUg UXQ6OkhBTkRMRSBRUGFpbnREZXZpY2U6OngxMUNvbG9ybWFwKCkgY29uc3QKeyByZXR1cm4geDEx RGF0YSA/IHgxMURhdGEtPnhfY29sb3JtYXAgOiB4X2FwcGNvbG9ybWFwOyB9CgppbmxpbmUgYm9v bCBRUGFpbnREZXZpY2U6OngxMURlZmF1bHRDb2xvcm1hcCgpIGNvbnN0CnsgcmV0dXJuIHgxMURh dGEgPyB4MTFEYXRhLT54X2RlZmNvbG9ybWFwIDogeF9hcHBkZWZjb2xvcm1hcDsgfQoKaW5saW5l IHZvaWQgKlFQYWludERldmljZTo6eDExVmlzdWFsKCkgY29uc3QKeyByZXR1cm4geDExRGF0YSA/ IHgxMURhdGEtPnhfdmlzdWFsIDogeF9hcHB2aXN1YWw7IH0KCmlubGluZSBib29sIFFQYWludERl dmljZTo6eDExRGVmYXVsdFZpc3VhbCgpIGNvbnN0CnsgcmV0dXJuIHgxMURhdGEgPyB4MTFEYXRh LT54X2RlZnZpc3VhbCA6IHhfYXBwZGVmdmlzdWFsOyB9CgppbmxpbmUgRGlzcGxheSAqUVBhaW50 RGV2aWNlOjp4MTFBcHBEaXNwbGF5KCkKeyByZXR1cm4geF9hcHBkaXNwbGF5OyB9CgppbmxpbmUg aW50IFFQYWludERldmljZTo6eDExQXBwU2NyZWVuKCkKeyByZXR1cm4geF9hcHBzY3JlZW47IH0K CmlubGluZSBpbnQgUVBhaW50RGV2aWNlOjp4MTFBcHBEZXB0aCgpCnsgcmV0dXJuIHhfYXBwZGVw dGg7IH0KCmlubGluZSBpbnQgUVBhaW50RGV2aWNlOjp4MTFBcHBDZWxscygpCnsgcmV0dXJuIHhf YXBwY2VsbHM7IH0KCmlubGluZSBRdDo6SEFORExFIFFQYWludERldmljZTo6eDExQXBwQ29sb3Jt YXAoKQp7IHJldHVybiB4X2FwcGNvbG9ybWFwOyB9CgppbmxpbmUgYm9vbCBRUGFpbnREZXZpY2U6 OngxMUFwcERlZmF1bHRDb2xvcm1hcCgpCnsgcmV0dXJuIHhfYXBwZGVmY29sb3JtYXA7IH0KCmlu bGluZSB2b2lkICpRUGFpbnREZXZpY2U6OngxMUFwcFZpc3VhbCgpCnsgcmV0dXJuIHhfYXBwdmlz dWFsOyB9CgppbmxpbmUgYm9vbCBRUGFpbnREZXZpY2U6OngxMUFwcERlZmF1bHRWaXN1YWwoKQp7 IHJldHVybiB4X2FwcGRlZnZpc3VhbDsgfQoKCgoKIAppbmxpbmUgdm9pZCBiaXRCbHQoIFFQYWlu dERldmljZSAqZHN0LCBjb25zdCBRUG9pbnQgJmRwLAoJCSAgICBjb25zdCBRUGFpbnREZXZpY2Ug KnNyYywgY29uc3QgUVJlY3QgJnNyID1RUmVjdCgwLDAsLTEsLTEpLAoJCSAgICBRdDo6UmFzdGVy T3Agcm9wPVF0OjpDb3B5Uk9QLCBib29sIGlnbm9yZU1hc2s9RkFMU0UgKQp7CiAgICBiaXRCbHQo IGRzdCwgZHAueCgpLCBkcC55KCksIHNyYywgc3IueCgpLCBzci55KCksIHNyLndpZHRoKCksIHNy LmhlaWdodCgpLAoJICAgIHJvcCwgaWdub3JlTWFzayApOwp9CgoKCgoKIyA0NCAiL3Vzci9sb2Nh bC9xdC9pbmNsdWRlL3F3aWRnZXQuaCIgMgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXBh bGV0dGUuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoj IDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xYnJ1c2guaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzICAgUUJydXNoOiBwdWJsaWMgUXQKewpm cmllbmQgY2xhc3MgUVBhaW50ZXI7CnB1YmxpYzoKICAgIFFCcnVzaCgpOwogICAgUUJydXNoKCBC cnVzaFN0eWxlICk7CiAgICBRQnJ1c2goIGNvbnN0IFFDb2xvciAmLCBCcnVzaFN0eWxlPVNvbGlk UGF0dGVybiApOwogICAgUUJydXNoKCBjb25zdCBRQ29sb3IgJiwgY29uc3QgUVBpeG1hcCAmICk7 CiAgICBRQnJ1c2goIGNvbnN0IFFCcnVzaCAmICk7CiAgIH5RQnJ1c2goKTsKICAgIFFCcnVzaCAm b3BlcmF0b3I9KCBjb25zdCBRQnJ1c2ggJiApOwoKICAgIEJydXNoU3R5bGUJc3R5bGUoKQkgY29u c3QJCXsgcmV0dXJuIGRhdGEtPnN0eWxlOyB9CiAgICB2b2lkCXNldFN0eWxlKCBCcnVzaFN0eWxl ICk7CiAgICBjb25zdCBRQ29sb3IgJmNvbG9yKCljb25zdAkJeyByZXR1cm4gZGF0YS0+Y29sb3I7 IH0KICAgIHZvaWQJc2V0Q29sb3IoIGNvbnN0IFFDb2xvciAmICk7CiAgICBRUGl4bWFwICAgICpw aXhtYXAoKSBjb25zdAkJeyByZXR1cm4gZGF0YS0+cGl4bWFwOyB9CiAgICB2b2lkCXNldFBpeG1h cCggY29uc3QgUVBpeG1hcCAmICk7CgogICAgYm9vbAlvcGVyYXRvcj09KCBjb25zdCBRQnJ1c2gg JnAgKSBjb25zdDsKICAgIGJvb2wJb3BlcmF0b3IhPSggY29uc3QgUUJydXNoICZiICkgY29uc3QK CQkJCQl7IHJldHVybiAhKG9wZXJhdG9yPT0oYikpOyB9Cgpwcml2YXRlOgogICAgUUJydXNoCWNv cHkoKQljb25zdDsKICAgIHZvaWQJZGV0YWNoKCk7CiAgICB2b2lkCWluaXQoIGNvbnN0IFFDb2xv ciAmLCBCcnVzaFN0eWxlICk7CiAgICBzdHJ1Y3QgUUJydXNoRGF0YSA6IHB1YmxpYyBRU2hhcmVk IHsJIAoJQnJ1c2hTdHlsZSBzdHlsZTsKCVFDb2xvcgkgIGNvbG9yOwoJUVBpeG1hcAkgKnBpeG1h cDsKICAgIH0gKmRhdGE7Cn07CgoKIAoKCgoKICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUURh dGFTdHJlYW0gJiwgY29uc3QgUUJydXNoICYgKTsKICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I+Pigg UURhdGFTdHJlYW0gJiwgUUJydXNoICYgKTsKCgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3FwYWxldHRlLmgiIDIKCgoKCgpjbGFzcyBRQ29sb3JHcm91cFByaXZhdGU7CgpjbGFzcyAgIFFD b2xvckdyb3VwCnsKcHVibGljOgogICAgUUNvbG9yR3JvdXAoKTsKICAgIFFDb2xvckdyb3VwKCBj b25zdCBRQ29sb3IgJmZvcmVncm91bmQsIGNvbnN0IFFDb2xvciAmYnV0dG9uLAoJCSBjb25zdCBR Q29sb3IgJmxpZ2h0LCBjb25zdCBRQ29sb3IgJmRhcmssIGNvbnN0IFFDb2xvciAmbWlkLAoJCSBj b25zdCBRQ29sb3IgJnRleHQsIGNvbnN0IFFDb2xvciAmYmFzZSApOwogICAgUUNvbG9yR3JvdXAo IGNvbnN0IFFCcnVzaCAmZm9yZWdyb3VuZCwgY29uc3QgUUJydXNoICZidXR0b24sCgkJIGNvbnN0 IFFCcnVzaCAmbGlnaHQsIGNvbnN0IFFCcnVzaCAmZGFyaywgY29uc3QgUUJydXNoICZtaWQsCgkJ IGNvbnN0IFFCcnVzaCAmdGV4dCwgY29uc3QgUUJydXNoICZicmlnaHRfdGV4dCwKCQkgY29uc3Qg UUJydXNoICZiYXNlLCBjb25zdCBRQnJ1c2ggJmJhY2tncm91bmQpOwogICAgUUNvbG9yR3JvdXAo IGNvbnN0IFFDb2xvckdyb3VwICYgKTsKCiAgIH5RQ29sb3JHcm91cCgpOwoKICAgIFFDb2xvckdy b3VwJiBvcGVyYXRvciA9KGNvbnN0IFFDb2xvckdyb3VwJik7CgogICAgIAogICAgZW51bSBDb2xv clJvbGUgeyBGb3JlZ3JvdW5kLCBCdXR0b24sIExpZ2h0LCBNaWRsaWdodCwgRGFyaywgTWlkLAoJ CSAgICAgVGV4dCwgQnJpZ2h0VGV4dCwgQnV0dG9uVGV4dCwgQmFzZSwgQmFja2dyb3VuZCwgU2hh ZG93LAoJCSAgICAgSGlnaGxpZ2h0LCBIaWdobGlnaHRlZFRleHQsIExpbmssIExpbmtWaXNpdGVk LAoJCSAgICAgTkNvbG9yUm9sZXMgfTsKCiAgICBjb25zdCBRQ29sb3IgJmNvbG9yKCBDb2xvclJv bGUgKSBjb25zdDsKICAgIGNvbnN0IFFCcnVzaCAmYnJ1c2goIENvbG9yUm9sZSApIGNvbnN0Owog ICAgdm9pZCBzZXRDb2xvciggQ29sb3JSb2xlLCBjb25zdCBRQ29sb3IgJiApOwogICAgdm9pZCBz ZXRCcnVzaCggQ29sb3JSb2xlLCBjb25zdCBRQnJ1c2ggJiApOwoKICAgIGNvbnN0IFFDb2xvciAm Zm9yZWdyb3VuZCgpCWNvbnN0CXsgcmV0dXJuIGJyW0ZvcmVncm91bmRdLmNvbG9yKCk7IH0KICAg IGNvbnN0IFFDb2xvciAmYnV0dG9uKCkJY29uc3QJeyByZXR1cm4gYnJbQnV0dG9uXS5jb2xvcigp OyB9CiAgICBjb25zdCBRQ29sb3IgJmxpZ2h0KCkJY29uc3QJeyByZXR1cm4gYnJbTGlnaHRdLmNv bG9yKCk7IH0KICAgIGNvbnN0IFFDb2xvciAmZGFyaygpCWNvbnN0CXsgcmV0dXJuIGJyW0Rhcmtd LmNvbG9yKCk7IH0KICAgIGNvbnN0IFFDb2xvciAmbWlkKCkJCWNvbnN0CXsgcmV0dXJuIGJyW01p ZF0uY29sb3IoKTsgfQogICAgY29uc3QgUUNvbG9yICZ0ZXh0KCkJY29uc3QJeyByZXR1cm4gYnJb VGV4dF0uY29sb3IoKTsgfQogICAgY29uc3QgUUNvbG9yICZiYXNlKCkJY29uc3QJeyByZXR1cm4g YnJbQmFzZV0uY29sb3IoKTsgfQogICAgY29uc3QgUUNvbG9yICZiYWNrZ3JvdW5kKCkJY29uc3QJ eyByZXR1cm4gYnJbQmFja2dyb3VuZF0uY29sb3IoKTsgfQoKICAgIGNvbnN0IFFDb2xvciAmbWlk bGlnaHQoKQljb25zdAl7IHJldHVybiBicltNaWRsaWdodF0uY29sb3IoKTsgfQogICAgY29uc3Qg UUNvbG9yICZicmlnaHRUZXh0KCkJY29uc3QJeyByZXR1cm4gYnJbQnJpZ2h0VGV4dF0uY29sb3Io KTsgfQogICAgY29uc3QgUUNvbG9yICZidXR0b25UZXh0KCkJY29uc3QJeyByZXR1cm4gYnJbQnV0 dG9uVGV4dF0uY29sb3IoKTsgfQogICAgY29uc3QgUUNvbG9yICZzaGFkb3coKQljb25zdAl7IHJl dHVybiBicltTaGFkb3ddLmNvbG9yKCk7IH0KICAgIGNvbnN0IFFDb2xvciAmaGlnaGxpZ2h0KCkJ Y29uc3QJeyByZXR1cm4gYnJbSGlnaGxpZ2h0XS5jb2xvcigpOyB9CiAgICBjb25zdCBRQ29sb3Ig JmhpZ2hsaWdodGVkVGV4dCgpIGNvbnN0e3JldHVybiBicltIaWdobGlnaHRlZFRleHRdLmNvbG9y KCk7IH0KICAgIGNvbnN0IFFDb2xvciAmbGluaygpICAgICAgICBjb25zdCAgIHsgcmV0dXJuIGJy W0xpbmtdLmNvbG9yKCk7IH0KICAgIGNvbnN0IFFDb2xvciAmbGlua1Zpc2l0ZWQoKSBjb25zdCAg IHsgcmV0dXJuIGJyW0xpbmtWaXNpdGVkXS5jb2xvcigpOyB9CgogICAgYm9vbAlvcGVyYXRvcj09 KCBjb25zdCBRQ29sb3JHcm91cCAmZyApIGNvbnN0OwogICAgYm9vbAlvcGVyYXRvciE9KCBjb25z dCBRQ29sb3JHcm91cCAmZyApIGNvbnN0Cgl7IHJldHVybiAhKG9wZXJhdG9yPT0oZykpOyB9Cgpw cml2YXRlOgogICAgUUJydXNoICpicjsKICAgIFFDb2xvckdyb3VwUHJpdmF0ZSAqIGQ7CgogICAg ZnJpZW5kIGNsYXNzIFFQYWxldHRlOwp9OwoKCmNsYXNzICAgUVBhbGV0dGUKewpwdWJsaWM6CiAg ICBRUGFsZXR0ZSgpOwogICAgUVBhbGV0dGUoIGNvbnN0IFFDb2xvciAmYnV0dG9uICk7CiAgICBR UGFsZXR0ZSggY29uc3QgUUNvbG9yICZidXR0b24sIGNvbnN0IFFDb2xvciAmYmFja2dyb3VuZCAp OwogICAgUVBhbGV0dGUoIGNvbnN0IFFDb2xvckdyb3VwICZhY3RpdmUsIGNvbnN0IFFDb2xvckdy b3VwICZkaXNhYmxlZCwKCSAgICAgIGNvbnN0IFFDb2xvckdyb3VwICZpbmFjdGl2ZSApOwogICAg UVBhbGV0dGUoIGNvbnN0IFFQYWxldHRlICYgKTsKICAgIH5RUGFsZXR0ZSgpOwogICAgUVBhbGV0 dGUgJm9wZXJhdG9yPSggY29uc3QgUVBhbGV0dGUgJiApOwoKICAgIGVudW0gQ29sb3JHcm91cCB7 IERpc2FibGVkLCBBY3RpdmUsIEluYWN0aXZlLCBOQ29sb3JHcm91cHMsIE5vcm1hbD1BY3RpdmUg fTsKCiAgICBjb25zdCBRQ29sb3IgJmNvbG9yKCBDb2xvckdyb3VwLCBRQ29sb3JHcm91cDo6Q29s b3JSb2xlICkgY29uc3Q7CiAgICBjb25zdCBRQnJ1c2ggJmJydXNoKCBDb2xvckdyb3VwLCBRQ29s b3JHcm91cDo6Q29sb3JSb2xlICkgY29uc3Q7CiAgICB2b2lkIHNldENvbG9yKCBDb2xvckdyb3Vw LCBRQ29sb3JHcm91cDo6Q29sb3JSb2xlLCBjb25zdCBRQ29sb3IgJiApOwogICAgdm9pZCBzZXRC cnVzaCggQ29sb3JHcm91cCwgUUNvbG9yR3JvdXA6OkNvbG9yUm9sZSwgY29uc3QgUUJydXNoICYg KTsKCiAgICB2b2lkIHNldENvbG9yKCBRQ29sb3JHcm91cDo6Q29sb3JSb2xlLCBjb25zdCBRQ29s b3IgJiApOwogICAgdm9pZCBzZXRCcnVzaCggUUNvbG9yR3JvdXA6OkNvbG9yUm9sZSwgY29uc3Qg UUJydXNoICYgKTsKCiAgICBRUGFsZXR0ZQljb3B5KCkgY29uc3Q7CgogICAgY29uc3QgUUNvbG9y R3JvdXAgJmFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGRhdGEtPmFjdGl2ZTsgfQogICAgY29uc3Qg UUNvbG9yR3JvdXAgJmRpc2FibGVkKCkgY29uc3QgeyByZXR1cm4gZGF0YS0+ZGlzYWJsZWQ7IH0K ICAgIGNvbnN0IFFDb2xvckdyb3VwICZpbmFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIGRhdGEtPmlu YWN0aXZlOyB9CgogICAgY29uc3QgUUNvbG9yR3JvdXAgJm5vcm1hbCgpIGNvbnN0IHsgcmV0dXJu IGFjdGl2ZSgpOyB9CgoKICAgIHZvaWQJc2V0QWN0aXZlKCBjb25zdCBRQ29sb3JHcm91cCAmICk7 CiAgICB2b2lkCXNldERpc2FibGVkKCBjb25zdCBRQ29sb3JHcm91cCAmICk7CiAgICB2b2lkCXNl dEluYWN0aXZlKCBjb25zdCBRQ29sb3JHcm91cCAmICk7CgogICAgdm9pZAlzZXROb3JtYWwoIGNv bnN0IFFDb2xvckdyb3VwICYgY2cgKSB7IHNldEFjdGl2ZShjZyk7IH0KCgogICAgYm9vbAlvcGVy YXRvcj09KCBjb25zdCBRUGFsZXR0ZSAmcCApIGNvbnN0OwogICAgYm9vbAlvcGVyYXRvciE9KCBj b25zdCBRUGFsZXR0ZSAmcCApIGNvbnN0CiAgICAgICAgICAgICAgeyByZXR1cm4gIShvcGVyYXRv cj09KHApKTsgfQogICAgYm9vbAlpc0NvcHlPZiggY29uc3QgUVBhbGV0dGUgJiApOwoKICAgIGlu dAkJc2VyaWFsTnVtYmVyKCkgY29uc3QJeyByZXR1cm4gZGF0YS0+c2VyX25vOyB9CiAgICAKICAg IAogICAgc3RhdGljIFFDb2xvckdyb3VwOjpDb2xvclJvbGUgZm9yZWdyb3VuZFJvbGVGcm9tTW9k ZSggUXQ6OkJhY2tncm91bmRNb2RlIG1vZGUgKTsKICAgIHN0YXRpYyBRQ29sb3JHcm91cDo6Q29s b3JSb2xlIGJhY2tncm91bmRSb2xlRnJvbU1vZGUoIFF0OjpCYWNrZ3JvdW5kTW9kZSBtb2RlKTsK CnByaXZhdGU6CiAgICB2b2lkCWRldGFjaCgpOwogICAgY29uc3QgUUJydXNoICZkaXJlY3RCcnVz aCggQ29sb3JHcm91cCwgUUNvbG9yR3JvdXA6OkNvbG9yUm9sZSApIGNvbnN0OwogICAgdm9pZCBk aXJlY3RTZXRCcnVzaCggQ29sb3JHcm91cCwgUUNvbG9yR3JvdXA6OkNvbG9yUm9sZSwgY29uc3Qg UUJydXNoJiApOwoKICAgIHN0cnVjdCBRUGFsRGF0YSA6IHB1YmxpYyBRU2hhcmVkIHsKCVFDb2xv ckdyb3VwIGRpc2FibGVkOwoJUUNvbG9yR3JvdXAgYWN0aXZlOwoJaW50CSAgICBzZXJfbm87CglR Q29sb3JHcm91cCBpbmFjdGl2ZTsKICAgIH0gKmRhdGE7Cn07CgoKIAoKCgoKICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUUNvbG9yR3JvdXAgJiApOwogIFFE YXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRQ29sb3JHcm91cCAmICk7Cgog IFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRUGFsZXR0ZSAm ICk7CiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFQYWxldHRlICYg KTsKCgoKCiMgNDUgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2lkZ2V0LmgiIDIKCiMgMSAiL3Vz ci9sb2NhbC9xdC9pbmNsdWRlL3Fmb250LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBRRm9udFByaXZhdGU7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAKY2xhc3MgUVN0cmluZ0xpc3Q7CgpjbGFzcyAgIFFGb250CnsK cHVibGljOgogICAgZW51bSBTdHlsZUhpbnQgewoJSGVsdmV0aWNhLCAgU2Fuc1NlcmlmID0gSGVs dmV0aWNhLAoJVGltZXMsICAgICAgU2VyaWYgPSBUaW1lcywKCUNvdXJpZXIsICAgIFR5cGVXcml0 ZXIgPSBDb3VyaWVyLAoJT2xkRW5nbGlzaCwgRGVjb3JhdGl2ZSA9IE9sZEVuZ2xpc2gsCglTeXN0 ZW0sCglBbnlTdHlsZQogICAgfTsKCiAgICBlbnVtIFN0eWxlU3RyYXRlZ3kgewoJUHJlZmVyRGVm YXVsdCA9IDB4MDAwMSwKCVByZWZlckJpdG1hcCAgPSAweDAwMDIsCglQcmVmZXJEZXZpY2UgID0g MHgwMDA0LAoJUHJlZmVyT3V0bGluZSA9IDB4MDAwOCwKCUZvcmNlT3V0bGluZSAgPSAweDAwMTAs CglQcmVmZXJNYXRjaCAgID0gMHgwMDIwLAoJUHJlZmVyUXVhbGl0eSA9IDB4MDA0MCwKCVByZWZl ckFudGlhbGlhcyA9IDB4MDA4MCwKCU5vQW50aWFsaWFzID0gMHgwMTAwCiAgICB9OwoKICAgIGVu dW0gV2VpZ2h0IHsKCUxpZ2h0ICAgID0gMjUsCglOb3JtYWwgICA9IDUwLAoJRGVtaUJvbGQgPSA2 MywKCUJvbGQgICAgID0gNzUsCglCbGFjawkgPSA4NwogICAgfTsKCiAgICAgCiAgICBRRm9udCgp OwogICAgIAogICAgUUZvbnQoIGNvbnN0IFFTdHJpbmcgJmZhbWlseSwgaW50IHBvaW50U2l6ZSA9 IDEyLCBpbnQgd2VpZ2h0ID0gTm9ybWFsLAoJICAgYm9vbCBpdGFsaWMgPSBGQUxTRSApOwogICAg IAogICAgUUZvbnQoIGNvbnN0IFFGb250ICYgKTsKCiAgICB+UUZvbnQoKTsKCiAgICBRU3RyaW5n IGZhbWlseSgpIGNvbnN0OwogICAgdm9pZCBzZXRGYW1pbHkoIGNvbnN0IFFTdHJpbmcgJik7Cgog ICAgaW50IHBvaW50U2l6ZSgpIGNvbnN0OwogICAgZmxvYXQgcG9pbnRTaXplRmxvYXQoKSBjb25z dDsKICAgIHZvaWQgc2V0UG9pbnRTaXplKCBpbnQgKTsKICAgIHZvaWQgc2V0UG9pbnRTaXplRmxv YXQoIGZsb2F0ICk7CgogICAgaW50IHBpeGVsU2l6ZSgpIGNvbnN0OwogICAgdm9pZCBzZXRQaXhl bFNpemUoIGludCApOwogICAgdm9pZCBzZXRQaXhlbFNpemVGbG9hdCggZmxvYXQgKTsKCiAgICBp bnQgd2VpZ2h0KCkgY29uc3Q7CiAgICB2b2lkIHNldFdlaWdodCggaW50ICk7CgogICAgYm9vbCBi b2xkKCkgY29uc3Q7CiAgICB2b2lkIHNldEJvbGQoIGJvb2wgKTsKCiAgICBib29sIGl0YWxpYygp IGNvbnN0OwogICAgdm9pZCBzZXRJdGFsaWMoIGJvb2wgKTsKCiAgICBib29sIHVuZGVybGluZSgp IGNvbnN0OwogICAgdm9pZCBzZXRVbmRlcmxpbmUoIGJvb2wgKTsKCiAgICBib29sIHN0cmlrZU91 dCgpIGNvbnN0OwogICAgdm9pZCBzZXRTdHJpa2VPdXQoIGJvb2wgKTsKCiAgICBib29sIGZpeGVk UGl0Y2goKSBjb25zdDsKICAgIHZvaWQgc2V0Rml4ZWRQaXRjaCggYm9vbCApOwoKICAgIFN0eWxl SGludCBzdHlsZUhpbnQoKSBjb25zdDsKICAgIFN0eWxlU3RyYXRlZ3kgc3R5bGVTdHJhdGVneSgp IGNvbnN0OwogICAgdm9pZCBzZXRTdHlsZUhpbnQoIFN0eWxlSGludCwgU3R5bGVTdHJhdGVneSA9 IFByZWZlckRlZmF1bHQgKTsKICAgIHZvaWQgc2V0U3R5bGVTdHJhdGVneSggU3R5bGVTdHJhdGVn eSBzICk7CgogICAgIAogICAgYm9vbCByYXdNb2RlKCkgY29uc3Q7CiAgICB2b2lkIHNldFJhd01v ZGUoIGJvb2wgKTsKCiAgICAgCiAgICBib29sIGV4YWN0TWF0Y2goKSBjb25zdDsKCiAgICBRRm9u dCAmb3BlcmF0b3I9KCBjb25zdCBRRm9udCAmICk7CiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0 IFFGb250ICYgKSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3IhPSggY29uc3QgUUZvbnQgJiApIGNv bnN0OwogICAgYm9vbCBpc0NvcHlPZiggY29uc3QgUUZvbnQgJiApIGNvbnN0OwoKCgoKCiAgICBR dDo6SEFORExFIGhhbmRsZSgpIGNvbnN0OwoKCgogICAgIAogICAgdm9pZCBzZXRSYXdOYW1lKCBj b25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgcmF3TmFtZSgpIGNvbnN0OwoKICAgIFFTdHJp bmcga2V5KCkgY29uc3Q7CgoKICAgIFFTdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKICAgIGJvb2wg ZnJvbVN0cmluZyhjb25zdCBRU3RyaW5nICYpOwoKICAgIHN0YXRpYyBRU3RyaW5nIHN1YnN0aXR1 dGUoY29uc3QgUVN0cmluZyAmKTsKICAgIHN0YXRpYyBRU3RyaW5nTGlzdCBzdWJzdGl0dXRlcyhj b25zdCBRU3RyaW5nICYpOwogICAgc3RhdGljIFFTdHJpbmdMaXN0IHN1YnN0aXR1dGlvbnMoKTsK ICAgIHN0YXRpYyB2b2lkIGluc2VydFN1YnN0aXR1dGlvbihjb25zdCBRU3RyaW5nJiwgY29uc3Qg UVN0cmluZyAmKTsKICAgIHN0YXRpYyB2b2lkIGluc2VydFN1YnN0aXR1dGlvbnMoY29uc3QgUVN0 cmluZyYsIGNvbnN0IFFTdHJpbmdMaXN0ICYpOwogICAgc3RhdGljIHZvaWQgcmVtb3ZlU3Vic3Rp dHV0aW9uKGNvbnN0IFFTdHJpbmcgJik7CgogICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpOwog ICAgc3RhdGljIHZvaWQgY2xlYW51cCgpOwogICAgc3RhdGljIHZvaWQgY2FjaGVTdGF0aXN0aWNz KCk7CgoKCgoKCgogICAgZW51bSBTY3JpcHQgewoJIAoJTGF0aW4sCglHcmVlaywKCUN5cmlsbGlj LAoJQXJtZW5pYW4sCglHZW9yZ2lhbiwKCVJ1bmljLAoJT2doYW0sCglTcGFjaW5nTW9kaWZpZXJz LAoJQ29tYmluaW5nTWFya3MsCgoJIAoJSGVicmV3LAoJQXJhYmljLAoJU3lyaWFjLAoJVGhhYW5h LAoKCSAKCURldmFuYWdhcmksCglCZW5nYWxpLAoJR3VybXVraGksCglHdWphcmF0aSwKCU9yaXlh LAoJVGFtaWwsCglUZWx1Z3UsCglLYW5uYWRhLAoJTWFsYXlhbGFtLAoJU2luaGFsYSwKCVRoYWks CglMYW8sCglUaWJldGFuLAoJTXlhbm1hciwKCUtobWVyLAoKCSAKCUhhbiwKCUhpcmFnYW5hLAoJ S2F0YWthbmEsCglIYW5ndWwsCglCb3BvbW9mbywKCVlpLAoKCSAKCUV0aGlvcGljLAoJQ2hlcm9r ZWUsCglDYW5hZGlhbkFib3JpZ2luYWwsCglNb25nb2xpYW4sCgoJIAoJQ3VycmVuY3lTeW1ib2xz LAoJTGV0dGVybGlrZVN5bWJvbHMsCglOdW1iZXJGb3JtcywKCU1hdGhlbWF0aWNhbE9wZXJhdG9y cywKCVRlY2huaWNhbFN5bWJvbHMsCglHZW9tZXRyaWNTeW1ib2xzLAoJTWlzY2VsbGFuZW91c1N5 bWJvbHMsCglFbmNsb3NlZEFuZFNxdWFyZSwKCUJyYWlsbGUsCgoJVW5pY29kZSwKCgkgCglOU2Ny aXB0cywKCVVua25vd25TY3JpcHQgPSBOU2NyaXB0cywKCglOb1NjcmlwdCwKCgkgCgkgCgkgCgog ICAgICAgCSAKCUhhblgxMSwKCglMYXRpbkJhc2ljID0gTGF0aW4sICAgICAgICAgICAgICAKCUxh dGluRXh0ZW5kZWRBXzIgPSBIYW5YMTEgKyAxLCAgIAoJTGF0aW5FeHRlbmRlZEFfMywgICAgICAg ICAgICAgICAgCglMYXRpbkV4dGVuZGVkQV80LCAgICAgICAgICAgICAgICAKCUxhdGluRXh0ZW5k ZWRBXzE0LCAgICAgICAgICAgICAgIAoJTGF0aW5FeHRlbmRlZEFfMTUsICAgICAgICAgICAgICAg CglLYXRha2FuYUhhbGZXaWR0aCwJCSAKCglMYXN0UHJpdmF0ZVNjcmlwdAogICAgfTsKCiAgICBR U3RyaW5nIGRlZmF1bHRGYW1pbHkoKSBjb25zdDsKICAgIFFTdHJpbmcgbGFzdFJlc29ydEZhbWls eSgpIGNvbnN0OwogICAgUVN0cmluZyBsYXN0UmVzb3J0Rm9udCgpIGNvbnN0OwoKCgogICAgc3Rh dGljIFFGb250IGRlZmF1bHRGb250KCk7CiAgICBzdGF0aWMgdm9pZCBzZXREZWZhdWx0Rm9udCgg Y29uc3QgUUZvbnQgJiApOwoKCgoKcHJvdGVjdGVkOgogICAgIAogICAgYm9vbCBkaXJ0eSgpIGNv bnN0OwogICAgaW50IGRlY2lQb2ludFNpemUoKSBjb25zdDsKCgpwcml2YXRlOgogICAgUUZvbnQo IFFGb250UHJpdmF0ZSAqLCBib29sIGRlZXAgPSBUUlVFICk7CiAgICBRRm9udCggUUZvbnRQcml2 YXRlICosIFFQYWludERldmljZSAqcGQgKTsKCiAgICB2b2lkIGRldGFjaCgpOwoKCgoKCgoKCgoK CiAgICBmcmllbmQgY2xhc3MgUUZvbnRNZXRyaWNzOwogICAgZnJpZW5kIGNsYXNzIFFGb250SW5m bzsKICAgIGZyaWVuZCBjbGFzcyBRUGFpbnRlcjsKICAgIGZyaWVuZCBjbGFzcyBRUFNQcmludGVy Rm9udDsKCgogICAgZnJpZW5kICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFt ICYsIGNvbnN0IFFGb250ICYgKTsKICAgIGZyaWVuZCAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBRRGF0YVN0cmVhbSAmLCBRRm9udCAmICk7CgoKICAgIFFGb250UHJpdmF0ZSAqZDsKfTsKCgpp bmxpbmUgYm9vbCBRRm9udDo6Ym9sZCgpIGNvbnN0CnsgcmV0dXJuIHdlaWdodCgpID4gTm9ybWFs OyB9CgoKaW5saW5lIHZvaWQgUUZvbnQ6OnNldEJvbGQoIGJvb2wgZW5hYmxlICkKeyBzZXRXZWln aHQoIGVuYWJsZSA/IEJvbGQgOiBOb3JtYWwgKTsgfQoKCgoKIAoKCgoKICBRRGF0YVN0cmVhbSAm b3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUUZvbnQgJiApOwogIFFEYXRhU3RyZWFt ICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRRm9udCAmICk7CgoKCgojIDQ2ICIvdXNyL2xv Y2FsL3F0L2luY2x1ZGUvcXdpZGdldC5oIiAyCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9x Zm9udG1ldHJpY3MuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKY2xhc3MgUUZvbnRTdHJ1Y3Q7CmNsYXNzIFFUZXh0Q29kZWM7CmNsYXNzIFFUZXh0UGFy YWc7CgpjbGFzcyAgIFFGb250TWV0cmljcwp7CnB1YmxpYzoKICAgIFFGb250TWV0cmljcyggY29u c3QgUUZvbnQgJiApOwogICAgUUZvbnRNZXRyaWNzKCBjb25zdCBRRm9udE1ldHJpY3MgJiApOwog ICAgflFGb250TWV0cmljcygpOwoKICAgIFFGb250TWV0cmljcyAmb3BlcmF0b3I9KCBjb25zdCBR Rm9udE1ldHJpY3MgJiApOwoKICAgIGludAkJYXNjZW50KCkJY29uc3Q7CiAgICBpbnQJCWRlc2Nl bnQoKQljb25zdDsKICAgIGludAkJaGVpZ2h0KCkJY29uc3Q7CiAgICBpbnQJCWxlYWRpbmcoKQlj b25zdDsKICAgIGludAkJbGluZVNwYWNpbmcoKQljb25zdDsKICAgIGludAkJbWluTGVmdEJlYXJp bmcoKSBjb25zdDsKICAgIGludAkJbWluUmlnaHRCZWFyaW5nKCkgY29uc3Q7CiAgICBpbnQJCW1h eFdpZHRoKCkJY29uc3Q7CgogICAgYm9vbAlpbkZvbnQoUUNoYXIpCWNvbnN0OwoKICAgIGludAkJ bGVmdEJlYXJpbmcoUUNoYXIpIGNvbnN0OwogICAgaW50CQlyaWdodEJlYXJpbmcoUUNoYXIpIGNv bnN0OwogICAgaW50CQl3aWR0aCggY29uc3QgUVN0cmluZyAmLCBpbnQgbGVuID0gLTEgKSBjb25z dDsKICAgIAogICAgaW50CQl3aWR0aCggUUNoYXIgKSBjb25zdDsKCiAgICBpbnQJCXdpZHRoKCBj aGFyIGMgKSBjb25zdCB7IHJldHVybiB3aWR0aCggKFFDaGFyKSBjICk7IH0KCiAgICAKICAgIGlu dCAJCWNoYXJXaWR0aCggY29uc3QgUVN0cmluZyAmc3RyLCBpbnQgcG9zICkgY29uc3Q7CiAgICBR UmVjdAlib3VuZGluZ1JlY3QoIGNvbnN0IFFTdHJpbmcgJiwgaW50IGxlbiA9IC0xICkgY29uc3Q7 CiAgICBRUmVjdAlib3VuZGluZ1JlY3QoIFFDaGFyICkgY29uc3Q7CiAgICBRUmVjdAlib3VuZGlu Z1JlY3QoIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgZmxhZ3MsCgkJCSAgICAgIGNv bnN0IFFTdHJpbmcmIHN0ciwgaW50IGxlbj0tMSwgaW50IHRhYnN0b3BzPTAsCgkJCSAgICAgIGlu dCAqdGFiYXJyYXk9MCwgUVRleHRQYXJhZyAqKmludGVybj0wICkgY29uc3Q7CiAgICBRU2l6ZQlz aXplKCBpbnQgZmxhZ3MsCgkJICAgICAgY29uc3QgUVN0cmluZyYgc3RyLCBpbnQgbGVuPS0xLCBp bnQgdGFic3RvcHM9MCwKCQkgICAgICBpbnQgKnRhYmFycmF5PTAsIFFUZXh0UGFyYWcgKippbnRl cm49MCApIGNvbnN0OwoKICAgIGludAkJdW5kZXJsaW5lUG9zKCkJY29uc3Q7CiAgICBpbnQJCXN0 cmlrZU91dFBvcygpCWNvbnN0OwogICAgaW50CQlsaW5lV2lkdGgoKQljb25zdDsKCnByaXZhdGU6 CiAgICBRRm9udE1ldHJpY3MoIGNvbnN0IFFQYWludGVyICogKTsKICAgIHN0YXRpYyB2b2lkIHJl c2V0KCBjb25zdCBRUGFpbnRlciAqICk7CgoKCgoKCgoKICAgIGZyaWVuZCBjbGFzcyBRV2lkZ2V0 OwogICAgZnJpZW5kIGNsYXNzIFFQYWludGVyOwogICAgZnJpZW5kIGNsYXNzIFFUZXh0Rm9ybWF0 OwoKCgoKICAgIFFGb250UHJpdmF0ZSAgKmQ7CiAgICBRUGFpbnRlciAgICAgICpwYWludGVyOwog ICAgaW50CQkgICBmbGFnczsKCiAgICBib29sICAgIHVuZGVybGluZUZsYWcoKSAgY29uc3QgeyBy ZXR1cm4gKGZsYWdzICYgMHgxKSAhPSAwOyB9CiAgICBib29sICAgIHN0cmlrZU91dEZsYWcoKSAg Y29uc3QgeyByZXR1cm4gKGZsYWdzICYgMHgyKSAhPSAwOyB9CiAgICB2b2lkICAgIHNldFVuZGVy bGluZUZsYWcoKQkgICB7IGZsYWdzIHw9IDB4MTsgfQogICAgdm9pZCAgICBzZXRTdHJpa2VPdXRG bGFnKCkJICAgeyBmbGFncyB8PSAweDI7IH0KfTsKCgoKIyA0NyAiL3Vzci9sb2NhbC9xdC9pbmNs dWRlL3F3aWRnZXQuaCIgMgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWZvbnRpbmZvLmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzICAg UUZvbnRJbmZvCnsKcHVibGljOgogICAgUUZvbnRJbmZvKCBjb25zdCBRRm9udCAmICk7CiAgICBR Rm9udEluZm8oIGNvbnN0IFFGb250SW5mbyAmICk7CiAgICB+UUZvbnRJbmZvKCk7CgogICAgUUZv bnRJbmZvCSAgICAgICAmb3BlcmF0b3I9KCBjb25zdCBRRm9udEluZm8gJiApOwoKICAgIFFTdHJp bmcgICAJICAgICAgICBmYW1pbHkoKQljb25zdDsKICAgIGludAkJCXBpeGVsU2l6ZSgpCWNvbnN0 OwogICAgaW50CQkJcG9pbnRTaXplKCkJY29uc3Q7CiAgICBib29sCQlpdGFsaWMoKQljb25zdDsK ICAgIGludAkJCXdlaWdodCgpCWNvbnN0OwogICAgYm9vbAkJYm9sZCgpCQljb25zdDsKICAgIGJv b2wJCXVuZGVybGluZSgpCWNvbnN0OwogICAgYm9vbAkJc3RyaWtlT3V0KCkJY29uc3Q7CiAgICBi b29sCQlmaXhlZFBpdGNoKCkJY29uc3Q7CiAgICBRRm9udDo6U3R5bGVIaW50CXN0eWxlSGludCgp CWNvbnN0OwogICAgYm9vbAkJcmF3TW9kZSgpCWNvbnN0OwoKICAgIGJvb2wJCWV4YWN0TWF0Y2go KQljb25zdDsKCgpwcml2YXRlOgogICAgUUZvbnRJbmZvKCBjb25zdCBRUGFpbnRlciAqICk7CiAg ICBzdGF0aWMgdm9pZCByZXNldCggY29uc3QgUVBhaW50ZXIgKiApOwoKICAgIFFGb250UHJpdmF0 ZSAqZDsKICAgIFFQYWludGVyICpwYWludGVyOwogICAgaW50IGZsYWdzOwoKICAgIGJvb2wgICAg dW5kZXJsaW5lRmxhZygpICBjb25zdCB7IHJldHVybiAoZmxhZ3MgJiAweDEpICE9IDA7IH0KICAg IGJvb2wgICAgc3RyaWtlT3V0RmxhZygpICBjb25zdCB7IHJldHVybiAoZmxhZ3MgJiAweDIpICE9 IDA7IH0KICAgIGJvb2wgICAgZXhhY3RNYXRjaEZsYWcoKSBjb25zdCB7IHJldHVybiAoZmxhZ3Mg JiAweDQpICE9IDA7IH0KICAgIHZvaWQgICAgc2V0VW5kZXJsaW5lRmxhZygpCSAgIHsgZmxhZ3Mg fD0gMHgxOyB9CiAgICB2b2lkICAgIHNldFN0cmlrZU91dEZsYWcoKQkgICB7IGZsYWdzIHw9IDB4 MjsgfQogICAgdm9pZCAgICBzZXRFeGFjdE1hdGNoRmxhZygpCSAgIHsgZmxhZ3MgfD0gMHg0OyB9 CgogICAgZnJpZW5kIGNsYXNzIFFXaWRnZXQ7CiAgICBmcmllbmQgY2xhc3MgUVBhaW50ZXI7Cn07 CgoKaW5saW5lIGJvb2wgUUZvbnRJbmZvOjpib2xkKCkgY29uc3QKeyByZXR1cm4gd2VpZ2h0KCkg PiBRRm9udDo6Tm9ybWFsOyB9CgoKCiMgNDggIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2lkZ2V0 LmgiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzaXplcG9saWN5LmgiIDEKIAoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgICBRU2l6ZVBvbGlj eQp7CnByaXZhdGU6CiAgICBlbnVtIHsgSFNpemUgPSA2LCBITWFzayA9IDB4M2YsIFZNYXNrID0g SE1hc2sgPDwgSFNpemUsCgkgICBNYXlHcm93ID0gMSwgRXhwTWFzayA9IDIsIE1heVNocmluayA9 IDQgfTsKcHVibGljOgogICAgZW51bSBTaXplVHlwZSB7IEZpeGVkID0gMCwKCQkgICAgTWluaW11 bSA9IE1heUdyb3csCgkJICAgIE1heGltdW0gPSBNYXlTaHJpbmssCgkJICAgIFByZWZlcnJlZCA9 IE1heUdyb3d8TWF5U2hyaW5rICwKCQkgICAgTWluaW11bUV4cGFuZGluZyA9IE1heUdyb3d8RXhw TWFzaywKCQkgICAgRXhwYW5kaW5nID0gTWF5R3Jvd3xNYXlTaHJpbmt8RXhwTWFzaywKCQkgICAg SWdub3JlZCA9IEV4cE1hc2sgIAogICAgfTsKCiAgICBlbnVtIEV4cGFuZERhdGEgeyBOb0RpcmVj dGlvbiA9IDAsCgkJICAgICAgSG9yaXpvbnRhbGx5ID0gMSwKCQkgICAgICBWZXJ0aWNhbGx5ID0g MiwKCQkgICAgICBCb3RoRGlyZWN0aW9ucyA9IEhvcml6b250YWxseSB8IFZlcnRpY2FsbHkKCgkJ ICAgICAgLEhvcml6b250YWwgPSBIb3Jpem9udGFsbHksCgkJICAgICAgVmVydGljYWwgPSBWZXJ0 aWNhbGx5CgogICAgfTsKCiAgICBRU2l6ZVBvbGljeSgpIDogZGF0YSggMCApIHt9CgogICAgUVNp emVQb2xpY3koIFNpemVUeXBlIGhvciwgU2l6ZVR5cGUgdmVyLCBib29sIGhmdyA9IEZBTFNFICkK CTogZGF0YSggaG9yIHwgKHZlcjw8SFNpemUpIHwgKGhmdyA/IChRX1VJTlQzMikoMTw8MipIU2l6 ZSkgOiAwKSApIHt9CiAgICBRU2l6ZVBvbGljeSggU2l6ZVR5cGUgaG9yLCBTaXplVHlwZSB2ZXIs IHVjaGFyIGhvcnMsIHVjaGFyIHZlcnMsIGJvb2wgaGZ3ID0gRkFMU0UgKTsKCiAgICBTaXplVHlw ZSBob3JEYXRhKCkgY29uc3QgeyByZXR1cm4gKFNpemVUeXBlKSggZGF0YSAmIEhNYXNrICk7IH0K ICAgIFNpemVUeXBlIHZlckRhdGEoKSBjb25zdCB7IHJldHVybiAoU2l6ZVR5cGUpKCggZGF0YSAm IFZNYXNrICkgPj4gSFNpemUpOyB9CgogICAgYm9vbCBtYXlTaHJpbmtIb3Jpem9udGFsbHkoKSBj b25zdCB7IHJldHVybiBob3JEYXRhKCkgJiBNYXlTaHJpbmsgfHwgaG9yRGF0YSgpID09IElnbm9y ZWQ7IH0KICAgIGJvb2wgbWF5U2hyaW5rVmVydGljYWxseSgpIGNvbnN0IHsgcmV0dXJuIHZlckRh dGEoKSAmIE1heVNocmluayB8fCB2ZXJEYXRhKCkgPT0gSWdub3JlZDsgfQogICAgYm9vbCBtYXlH cm93SG9yaXpvbnRhbGx5KCkgY29uc3QgeyByZXR1cm4gaG9yRGF0YSgpICYgTWF5R3JvdyB8fCBo b3JEYXRhKCkgPT0gSWdub3JlZDsgfQogICAgYm9vbCBtYXlHcm93VmVydGljYWxseSgpIGNvbnN0 IHsgcmV0dXJuIHZlckRhdGEoKSAmIE1heUdyb3cgfHwgdmVyRGF0YSgpID09IElnbm9yZWQ7IH0K CiAgICBFeHBhbmREYXRhIGV4cGFuZGluZygpIGNvbnN0CiAgICB7CglyZXR1cm4gKEV4cGFuZERh dGEpKCAoaW50KSh2ZXJEYXRhKCkmRXhwTWFzayA/IFZlcnRpY2FsbHkgOiAwKSsKCQkJICAgICAo aW50KShob3JEYXRhKCkmRXhwTWFzayA/IEhvcml6b250YWxseSA6IDApICk7CiAgICB9CgogICAg dm9pZCBzZXRIb3JEYXRhKCBTaXplVHlwZSBkICkgeyBkYXRhID0gKFFfVUlOVDMyKShkYXRhICYg fkhNYXNrKSB8IGQ7IH0KICAgIHZvaWQgc2V0VmVyRGF0YSggU2l6ZVR5cGUgZCApIHsgZGF0YSA9 IChRX1VJTlQzMikoZGF0YSAmIH4oSE1hc2s8PEhTaXplKSkgfAoJCQkJCSAgIChkPDxIU2l6ZSk7 IH0KCQkKICAgIHZvaWQgc2V0SGVpZ2h0Rm9yV2lkdGgoIGJvb2wgYiApIHsgZGF0YSA9IGIgPyAo UV9VSU5UMzIpKCBkYXRhIHwgKCAxIDw8IDIqSFNpemUgKSApCgkJCQkJICAgICAgOiAoUV9VSU5U MzIpKCBkYXRhICYgfiggMSA8PCAyKkhTaXplICkgKTsgIH0KICAgIGJvb2wgaGFzSGVpZ2h0Rm9y V2lkdGgoKSBjb25zdCB7IHJldHVybiBkYXRhICYgKCAxIDw8IDIqSFNpemUgKTsgfQoKICAgIGJv b2wgb3BlcmF0b3I9PSggY29uc3QgUVNpemVQb2xpY3kmIHMgKSBjb25zdCB7IHJldHVybiBkYXRh ID09IHMuZGF0YTsgfQogICAgYm9vbCBvcGVyYXRvciE9KCBjb25zdCBRU2l6ZVBvbGljeSYgcyAp IGNvbnN0IHsgcmV0dXJuIGRhdGEgIT0gcy5kYXRhOyB9CgoKICAgIHVpbnQgaG9yU3RyZXRjaCgp IGNvbnN0IHsgcmV0dXJuIGRhdGEgPj4gMjQ7IH0KICAgIHVpbnQgdmVyU3RyZXRjaCgpIGNvbnN0 IHsgcmV0dXJuIChkYXRhID4+IDE2KSAmIDB4ZmY7IH0KICAgIHZvaWQgc2V0SG9yU3RyZXRjaCgg dWNoYXIgc2YgKSB7IGRhdGEgPSAoZGF0YSYweDAwZmZmZmZmKSB8ICh1aW50KHNmKTw8MjQpOyB9 CiAgICB2b2lkIHNldFZlclN0cmV0Y2goIHVjaGFyIHNmICkgeyBkYXRhID0gKGRhdGEmMHhmZjAw ZmZmZikgfCAodWludChzZik8PDE2KTsgfQoKcHJpdmF0ZToKICAgIFFTaXplUG9saWN5KCBpbnQg aSApOiBkYXRhKCAoUV9VSU5UMzIpaSApIHt9CgogICAgUV9VSU5UMzIgZGF0YTsKfTsKCmlubGlu ZSBRU2l6ZVBvbGljeTo6UVNpemVQb2xpY3koIFNpemVUeXBlIGhvciwgU2l6ZVR5cGUgdmVyLCB1 Y2hhciBob3JzLCB1Y2hhciB2ZXJzLCBib29sIGhmdyApCiAgICA6IGRhdGEoIGhvciB8ICh2ZXI8 PEhTaXplKSB8IChoZncgPyAoUV9VSU5UMzIpKDE8PDIqSFNpemUpIDogMCkgKSB7CglzZXRIb3JT dHJldGNoKCBob3JzICk7CglzZXRWZXJTdHJldGNoKCB2ZXJzICk7Cn0KCgoKIyA0OSAiL3Vzci9s b2NhbC9xdC9pbmNsdWRlL3F3aWRnZXQuaCIgMgoKCgpjbGFzcyBRTGF5b3V0OwpzdHJ1Y3QgUVdF eHRyYTsKc3RydWN0IFFUTFdFeHRyYTsKY2xhc3MgUUZvY3VzRGF0YTsKY2xhc3MgUUN1cnNvcjsK Y2xhc3MgUVdTUmVnaW9uTWFuYWdlcjsKY2xhc3MgUVN0eWxlOwoKY2xhc3MgICBRV2lkZ2V0IDog cHVibGljIFFPYmplY3QsIHB1YmxpYyBRUGFpbnREZXZpY2UKewogICAgcHVibGljOgl2aXJ0dWFs IFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVj dCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9p ZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBR VU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1 YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRh T2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAo UU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAog ICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAog ICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAg IAoKICAgICAKICAgICAKCgogICAgIAogICAgIAogICAgIAoKICAgICAKICAgICAKICAgICAKICAg ICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAK ICAgICAKICAgICAKICAgICAKICAgICAKCnB1YmxpYzoKICAgIFFXaWRnZXQoIFFXaWRnZXQqIHBh cmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmPTAgKTsKICAgIH5RV2lkZ2V0KCk7 CgogICAgV0lkCQkgd2luSWQoKSBjb25zdDsKICAgIHZvaWQJIHNldE5hbWUoIGNvbnN0IGNoYXIg Km5hbWUgKTsKCiAgICAgCgogICAgUVN0eWxlICAgICAmc3R5bGUoKSBjb25zdDsKICAgIHZvaWQg ICAgICAgIHNldFN0eWxlKCBRU3R5bGUgKiApOwogICAgUVN0eWxlKglzZXRTdHlsZSggY29uc3Qg UVN0cmluZyYgKTsKCiAgICAgCgogICAgYm9vbAkgaXNUb3BMZXZlbCgpCWNvbnN0OwogICAgYm9v bAkgaXNEaWFsb2coKQljb25zdDsKICAgIGJvb2wJIGlzUG9wdXAoKQljb25zdDsKICAgIGJvb2wJ IGlzRGVza3RvcCgpCWNvbnN0OwogICAgYm9vbAkgaXNNb2RhbCgpCWNvbnN0OwoKICAgIGJvb2wJ IGlzRW5hYmxlZCgpCWNvbnN0OwogICAgYm9vbAkgaXNFbmFibGVkVG8oUVdpZGdldCopIGNvbnN0 OwogICAgYm9vbAkgaXNFbmFibGVkVG9UTFcoKSBjb25zdDsKCnB1YmxpYyAgOgogICAgdmlydHVh bCB2b2lkIHNldEVuYWJsZWQoIGJvb2wgKTsKICAgIHZvaWQgc2V0RGlzYWJsZWQoIGJvb2wgKTsK CiAgICAgCgpwdWJsaWM6CiAgICBRUmVjdAkgZnJhbWVHZW9tZXRyeSgpIGNvbnN0OwogICAgY29u c3QgUVJlY3QgJmdlb21ldHJ5KCkJY29uc3Q7CiAgICBpbnQJCSB4KCkJCWNvbnN0OwogICAgaW50 CQkgeSgpCQljb25zdDsKICAgIFFQb2ludAkgcG9zKCkJCWNvbnN0OwogICAgUVNpemUJIGZyYW1l U2l6ZSgpICAgIGNvbnN0OwogICAgUVNpemUJIHNpemUoKQkJY29uc3Q7CiAgICBpbnQJCSB3aWR0 aCgpCWNvbnN0OwogICAgaW50CQkgaGVpZ2h0KCkJY29uc3Q7CiAgICBRUmVjdAkgcmVjdCgpCQlj b25zdDsKICAgIFFSZWN0CSBjaGlsZHJlblJlY3QoKSBjb25zdDsKICAgIFFSZWdpb24JIGNoaWxk cmVuUmVnaW9uKCkgY29uc3Q7CgogICAgUVNpemUJIG1pbmltdW1TaXplKCkJIGNvbnN0OwogICAg UVNpemUJIG1heGltdW1TaXplKCkJIGNvbnN0OwogICAgaW50CQkgbWluaW11bVdpZHRoKCkJIGNv bnN0OwogICAgaW50CQkgbWluaW11bUhlaWdodCgpIGNvbnN0OwogICAgaW50CQkgbWF4aW11bVdp ZHRoKCkJIGNvbnN0OwogICAgaW50CQkgbWF4aW11bUhlaWdodCgpIGNvbnN0OwogICAgdm9pZAkg c2V0TWluaW11bVNpemUoIGNvbnN0IFFTaXplICYgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRNaW5p bXVtU2l6ZSggaW50IG1pbncsIGludCBtaW5oICk7CiAgICB2b2lkCSBzZXRNYXhpbXVtU2l6ZSgg Y29uc3QgUVNpemUgJiApOwogICAgdmlydHVhbCB2b2lkIHNldE1heGltdW1TaXplKCBpbnQgbWF4 dywgaW50IG1heGggKTsKICAgIHZvaWQJIHNldE1pbmltdW1XaWR0aCggaW50IG1pbncgKTsKICAg IHZvaWQJIHNldE1pbmltdW1IZWlnaHQoIGludCBtaW5oICk7CiAgICB2b2lkCSBzZXRNYXhpbXVt V2lkdGgoIGludCBtYXh3ICk7CiAgICB2b2lkCSBzZXRNYXhpbXVtSGVpZ2h0KCBpbnQgbWF4aCAp OwoKICAgIFFTaXplCSBzaXplSW5jcmVtZW50KCkgY29uc3Q7CiAgICB2b2lkCSBzZXRTaXplSW5j cmVtZW50KCBjb25zdCBRU2l6ZSAmICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZUluY3JlbWVu dCggaW50IHcsIGludCBoICk7CiAgICBRU2l6ZQkgYmFzZVNpemUoKSBjb25zdDsKICAgIHZvaWQJ IHNldEJhc2VTaXplKCBjb25zdCBRU2l6ZSAmICk7CiAgICB2b2lkCSBzZXRCYXNlU2l6ZSggaW50 IGJhc2V3LCBpbnQgYmFzZWggKTsKCiAgICB2b2lkCXNldEZpeGVkU2l6ZSggY29uc3QgUVNpemUg JiApOwogICAgdm9pZAlzZXRGaXhlZFNpemUoIGludCB3LCBpbnQgaCApOwogICAgdm9pZAlzZXRG aXhlZFdpZHRoKCBpbnQgdyApOwogICAgdm9pZAlzZXRGaXhlZEhlaWdodCggaW50IGggKTsKCiAg ICAgCgogICAgUVBvaW50CSBtYXBUb0dsb2JhbCggY29uc3QgUVBvaW50ICYgKQkgY29uc3Q7CiAg ICBRUG9pbnQJIG1hcEZyb21HbG9iYWwoIGNvbnN0IFFQb2ludCAmICkgY29uc3Q7CiAgICBRUG9p bnQJIG1hcFRvUGFyZW50KCBjb25zdCBRUG9pbnQgJiApCSBjb25zdDsKICAgIFFQb2ludAkgbWFw RnJvbVBhcmVudCggY29uc3QgUVBvaW50ICYgKSBjb25zdDsKICAgIFFQb2ludAkgbWFwVG8oIFFX aWRnZXQgKiwgY29uc3QgUVBvaW50ICYgKSBjb25zdDsKICAgIFFQb2ludAkgbWFwRnJvbSggUVdp ZGdldCAqLCBjb25zdCBRUG9pbnQgJiApIGNvbnN0OwoKICAgIFFXaWRnZXQJKnRvcExldmVsV2lk Z2V0KCkgICBjb25zdDsKCiAgICAgCgogICAgQmFja2dyb3VuZE1vZGUJYmFja2dyb3VuZE1vZGUo KSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZAlzZXRCYWNrZ3JvdW5kTW9kZSggQmFja2dyb3VuZE1v ZGUgKTsKICAgIHZvaWQgCQlzZXRCYWNrZ3JvdW5kTW9kZSggQmFja2dyb3VuZE1vZGUsIEJhY2tn cm91bmRNb2RlICk7CgogICAgY29uc3QgUUNvbG9yICYJZm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7 CgogICAgY29uc3QgUUNvbG9yICYJZXJhc2VDb2xvcigpIGNvbnN0OwogICAgdmlydHVhbCB2b2lk CXNldEVyYXNlQ29sb3IoIGNvbnN0IFFDb2xvciAmICk7CgogICAgY29uc3QgUVBpeG1hcCAqCWVy YXNlUGl4bWFwKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0RXJhc2VQaXhtYXAoIGNvbnN0 IFFQaXhtYXAgJiApOwoKCiAgICBjb25zdCBRQ29sb3JHcm91cCAmIGNvbG9yR3JvdXAoKSBjb25z dDsKICAgIGNvbnN0IFFQYWxldHRlICYJcGFsZXR0ZSgpICAgIGNvbnN0OwogICAgYm9vbAkJb3du UGFsZXR0ZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldFBhbGV0dGUoIGNvbnN0IFFQYWxl dHRlICYgKTsKICAgIHZvaWQJCXVuc2V0UGFsZXR0ZSgpOwoKCiAgICBjb25zdCBRQ29sb3IgJglw YWxldHRlRm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7CiAgICB2b2lkCQlzZXRQYWxldHRlRm9yZWdy b3VuZENvbG9yKCBjb25zdCBRQ29sb3IgJiApOwoKICAgIGNvbnN0IFFDb2xvciAmCXBhbGV0dGVC YWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZAlzZXRQYWxldHRlQmFja2dy b3VuZENvbG9yKCBjb25zdCBRQ29sb3IgJiApOwoKICAgIGNvbnN0IFFQaXhtYXAgKglwYWxldHRl QmFja2dyb3VuZFBpeG1hcCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIAlzZXRQYWxldHRlQmFj a2dyb3VuZFBpeG1hcCggY29uc3QgUVBpeG1hcCAmICk7CgogICAgY29uc3QgUUJydXNoJgliYWNr Z3JvdW5kQnJ1c2goKSBjb25zdDsKCiAgICBRRm9udAkJZm9udCgpIGNvbnN0OwogICAgYm9vbAkJ b3duRm9udCgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldEZvbnQoIGNvbnN0IFFGb250ICYg KTsKICAgIHZvaWQJCXVuc2V0Rm9udCgpOwogICAgUUZvbnRNZXRyaWNzCWZvbnRNZXRyaWNzKCkg Y29uc3Q7CiAgICBRRm9udEluZm8JIAlmb250SW5mbygpIGNvbnN0OwoKCiAgICBjb25zdCBRQ3Vy c29yICAgICAgJmN1cnNvcigpIGNvbnN0OwogICAgYm9vbAkJb3duQ3Vyc29yKCkgY29uc3Q7CiAg ICB2aXJ0dWFsIHZvaWQJc2V0Q3Vyc29yKCBjb25zdCBRQ3Vyc29yICYgKTsKICAgIHZpcnR1YWwg dm9pZAl1bnNldEN1cnNvcigpOwoKCiAgICBRU3RyaW5nCQljYXB0aW9uKCkgY29uc3Q7CiAgICBj b25zdCBRUGl4bWFwICAgICAgKmljb24oKSBjb25zdDsKICAgIFFTdHJpbmcJCWljb25UZXh0KCkg Y29uc3Q7CgogICAgYm9vbAkJaGFzTW91c2VUcmFja2luZygpIGNvbnN0OwogICAgYm9vbAkJaGFz TW91c2UoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQJc2V0TWFzayggY29uc3QgUUJpdG1hcCAm ICk7CiAgICB2aXJ0dWFsIHZvaWQJc2V0TWFzayggY29uc3QgUVJlZ2lvbiAmICk7CiAgICB2b2lk CQljbGVhck1hc2soKTsKCiAgICBjb25zdCBRQ29sb3IgJgliYWNrZ3JvdW5kQ29sb3IoKSBjb25z dDsgIAogICAgdmlydHVhbCB2b2lkCXNldEJhY2tncm91bmRDb2xvciggY29uc3QgUUNvbG9yICYg KTsgIAogICAgY29uc3QgUVBpeG1hcCAqCWJhY2tncm91bmRQaXhtYXAoKSBjb25zdDsgIAogICAg dmlydHVhbCB2b2lkCXNldEJhY2tncm91bmRQaXhtYXAoIGNvbnN0IFFQaXhtYXAgJiApOyAgCgpw dWJsaWMgIDoKCiAgICB2aXJ0dWFsIHZvaWQJc2V0Q2FwdGlvbiggY29uc3QgUVN0cmluZyAmKTsK ICAgIHZpcnR1YWwgdm9pZAlzZXRJY29uKCBjb25zdCBRUGl4bWFwICYgKTsKICAgIHZpcnR1YWwg dm9pZAlzZXRJY29uVGV4dCggY29uc3QgUVN0cmluZyAmKTsKCiAgICB2aXJ0dWFsIHZvaWQJc2V0 TW91c2VUcmFja2luZyggYm9vbCBlbmFibGUgKTsKCiAgICAgCgogICAgdmlydHVhbCB2b2lkCXNl dEZvY3VzKCk7CiAgICB2b2lkCQljbGVhckZvY3VzKCk7CgpwdWJsaWM6CiAgICBlbnVtIEZvY3Vz UG9saWN5IHsKCU5vRm9jdXMgPSAwLAoJVGFiRm9jdXMgPSAweDEsCglDbGlja0ZvY3VzID0gMHgy LAoJU3Ryb25nRm9jdXMgPSAweDMsCglXaGVlbEZvY3VzID0gMHg3CiAgICB9OwoKICAgIGJvb2wJ CWlzQWN0aXZlV2luZG93KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0QWN0aXZlV2luZG93 KCk7CiAgICBib29sCQlpc0ZvY3VzRW5hYmxlZCgpIGNvbnN0OwoKICAgIEZvY3VzUG9saWN5CQlm b2N1c1BvbGljeSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkCXNldEZvY3VzUG9saWN5KCBGb2N1 c1BvbGljeSApOwogICAgYm9vbAkJaGFzRm9jdXMoKSBjb25zdDsKICAgIHN0YXRpYyB2b2lkCQlz ZXRUYWJPcmRlciggUVdpZGdldCAqLCBRV2lkZ2V0ICogKTsKICAgIHZpcnR1YWwgdm9pZAlzZXRG b2N1c1Byb3h5KCBRV2lkZ2V0ICogKTsKICAgIFFXaWRnZXQgKgkJZm9jdXNQcm94eSgpIGNvbnN0 OwoKICAgICAKCiAgICB2b2lkCQlncmFiTW91c2UoKTsKCiAgICB2b2lkCQlncmFiTW91c2UoIGNv bnN0IFFDdXJzb3IgJiApOwoKICAgIHZvaWQJCXJlbGVhc2VNb3VzZSgpOwogICAgdm9pZAkJZ3Jh YktleWJvYXJkKCk7CiAgICB2b2lkCQlyZWxlYXNlS2V5Ym9hcmQoKTsKICAgIHN0YXRpYyBRV2lk Z2V0ICoJbW91c2VHcmFiYmVyKCk7CiAgICBzdGF0aWMgUVdpZGdldCAqCWtleWJvYXJkR3JhYmJl cigpOwoKICAgICAKCiAgICBib29sCSAJaXNVcGRhdGVzRW5hYmxlZCgpIGNvbnN0OwoKCgoKcHVi bGljICA6CiAgICB2aXJ0dWFsIHZvaWQJc2V0VXBkYXRlc0VuYWJsZWQoIGJvb2wgZW5hYmxlICk7 CiAgICB2b2lkCQl1cGRhdGUoKTsKICAgIHZvaWQJCXVwZGF0ZSggaW50IHgsIGludCB5LCBpbnQg dywgaW50IGggKTsKICAgIHZvaWQJCXVwZGF0ZSggY29uc3QgUVJlY3QmICk7CiAgICB2b2lkCQly ZXBhaW50KCk7CiAgICB2b2lkCQlyZXBhaW50KCBib29sIGVyYXNlICk7CiAgICB2b2lkCQlyZXBh aW50KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgYm9vbCBlcmFzZT1UUlVFICk7CiAgICB2 b2lkCQlyZXBhaW50KCBjb25zdCBRUmVjdCAmLCBib29sIGVyYXNlID0gVFJVRSApOwogICAgdm9p ZAkJcmVwYWludCggY29uc3QgUVJlZ2lvbiAmLCBib29sIGVyYXNlID0gVFJVRSApOwoKICAgICAK CiAgICB2aXJ0dWFsIHZvaWQJc2hvdygpOwogICAgdmlydHVhbCB2b2lkCWhpZGUoKTsKCiAgICB2 b2lkCQlpY29uaWZ5KCkgeyBzaG93TWluaW1pemVkKCk7IH0KCiAgICB2aXJ0dWFsIHZvaWQJc2hv d01pbmltaXplZCgpOwogICAgdmlydHVhbCB2b2lkCXNob3dNYXhpbWl6ZWQoKTsKICAgIHZvaWQJ CXNob3dGdWxsU2NyZWVuKCk7CiAgICB2aXJ0dWFsIHZvaWQJc2hvd05vcm1hbCgpOwogICAgdmly dHVhbCB2b2lkCXBvbGlzaCgpOwogICAgdm9pZCAJCWNvbnN0UG9saXNoKCkgY29uc3Q7CiAgICBi b29sCQljbG9zZSgpOwoKICAgIHZvaWQJCXJhaXNlKCk7CiAgICB2b2lkCQlsb3dlcigpOwogICAg dm9pZAkJc3RhY2tVbmRlciggUVdpZGdldCogKTsKICAgIHZpcnR1YWwgdm9pZAltb3ZlKCBpbnQg eCwgaW50IHkgKTsKICAgIHZvaWQJCW1vdmUoIGNvbnN0IFFQb2ludCAmICk7CiAgICB2aXJ0dWFs IHZvaWQJcmVzaXplKCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJCXJlc2l6ZSggY29uc3QgUVNp emUgJiApOwogICAgdmlydHVhbCB2b2lkCXNldEdlb21ldHJ5KCBpbnQgeCwgaW50IHksIGludCB3 LCBpbnQgaCApOwogICAgdmlydHVhbCB2b2lkCXNldEdlb21ldHJ5KCBjb25zdCBRUmVjdCAmICk7 CgpwdWJsaWM6CiAgICB2aXJ0dWFsIGJvb2wJY2xvc2UoIGJvb2wgYWxzb0RlbGV0ZSApOwogICAg Ym9vbAkJaXNWaXNpYmxlKCkJY29uc3Q7CiAgICBib29sCQlpc1Zpc2libGVUbyhRV2lkZ2V0Kikg Y29uc3Q7CiAgICBib29sCQlpc1Zpc2libGVUb1RMVygpIGNvbnN0OyAgCiAgICBRUmVjdAkJdmlz aWJsZVJlY3QoKSBjb25zdDsKICAgIGJvb2wgCQlpc0hpZGRlbigpIGNvbnN0OwogICAgYm9vbAkJ aXNNaW5pbWl6ZWQoKSBjb25zdDsKICAgIGJvb2wJCWlzTWF4aW1pemVkKCkgY29uc3Q7CgogICAg dmlydHVhbCBRU2l6ZQlzaXplSGludCgpIGNvbnN0OwogICAgdmlydHVhbCBRU2l6ZQltaW5pbXVt U2l6ZUhpbnQoKSBjb25zdDsKICAgIHZpcnR1YWwgUVNpemVQb2xpY3kJc2l6ZVBvbGljeSgpIGNv bnN0OwogICAgdmlydHVhbCB2b2lkCQlzZXRTaXplUG9saWN5KCBRU2l6ZVBvbGljeSApOwogICAg dmlydHVhbCBpbnQgaGVpZ2h0Rm9yV2lkdGgoaW50KSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQg IAlhZGp1c3RTaXplKCk7CgogICAgUUxheW91dCAqCQlsYXlvdXQoKSBjb25zdCB7IHJldHVybiBs YXlfb3V0OyB9CgogICAgdm9pZAkJdXBkYXRlR2VvbWV0cnkoKTsKICAgIHZpcnR1YWwgdm9pZCAJ cmVwYXJlbnQoIFFXaWRnZXQgKnBhcmVudCwgV0ZsYWdzLCBjb25zdCBRUG9pbnQgJiwKCQkJCSAg Ym9vbCBzaG93SXQ9RkFMU0UgKTsKICAgIHZvaWQJCXJlcGFyZW50KCBRV2lkZ2V0ICpwYXJlbnQs IGNvbnN0IFFQb2ludCAmLAoJCQkJICBib29sIHNob3dJdD1GQUxTRSApOwoKICAgIHZvaWQJCXJl Y3JlYXRlKCBRV2lkZ2V0ICpwYXJlbnQsIFdGbGFncyBmLCBjb25zdCBRUG9pbnQgJiBwLAoJCQkJ ICBib29sIHNob3dJdD1GQUxTRSApIHsgcmVwYXJlbnQocGFyZW50LGYscCxzaG93SXQpOyB9CgoK ICAgIHZvaWQJCWVyYXNlKCk7CiAgICB2b2lkCQllcmFzZSggaW50IHgsIGludCB5LCBpbnQgdywg aW50IGggKTsKICAgIHZvaWQJCWVyYXNlKCBjb25zdCBRUmVjdCAmICk7CiAgICB2b2lkCQllcmFz ZSggY29uc3QgUVJlZ2lvbiAmICk7CiAgICB2b2lkCQlzY3JvbGwoIGludCBkeCwgaW50IGR5ICk7 CiAgICB2b2lkCQlzY3JvbGwoIGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgKTsKCiAgICB2 b2lkCQlkcmF3VGV4dCggaW50IHgsIGludCB5LCBjb25zdCBRU3RyaW5nICYpOwogICAgdm9pZAkJ ZHJhd1RleHQoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBRU3RyaW5nICYpOwoKICAgICAKCiAgICBR V2lkZ2V0ICoJCWZvY3VzV2lkZ2V0KCkgY29uc3Q7CiAgICBRUmVjdCAgICAgICAgICAgICAgIG1p Y3JvRm9jdXNIaW50KCkgY29uc3Q7CgogICAgIAoKICAgIGJvb2wJCWFjY2VwdERyb3BzKCkgY29u c3Q7CiAgICB2aXJ0dWFsIHZvaWQJc2V0QWNjZXB0RHJvcHMoIGJvb2wgb24gKTsKCiAgICAgCgog ICAgdmlydHVhbCB2b2lkCXNldEF1dG9NYXNrKGJvb2wpOwogICAgYm9vbAkJYXV0b01hc2soKSBj b25zdDsKCiAgICBlbnVtIEJhY2tncm91bmRPcmlnaW4geyBXaWRnZXRPcmlnaW4sIFBhcmVudE9y aWdpbiwgV2luZG93T3JpZ2luIH07CgogICAgdmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRPcmln aW4oIEJhY2tncm91bmRPcmlnaW4gKTsKICAgIEJhY2tncm91bmRPcmlnaW4gYmFja2dyb3VuZE9y aWdpbigpIGNvbnN0OwoKCiAgICAgCiAgICB2aXJ0dWFsIGJvb2wgY3VzdG9tV2hhdHNUaGlzKCkg Y29uc3Q7CgogICAgUVdpZGdldCAqCQlwYXJlbnRXaWRnZXQoIGJvb2wgc2FtZVdpbmRvdyA9IEZB TFNFICkgY29uc3Q7CiAgICBXU3RhdGUJCXRlc3RXU3RhdGUoIFdTdGF0ZSBzICkgY29uc3Q7CiAg ICBXRmxhZ3MJCXRlc3RXRmxhZ3MoIFdGbGFncyBmICkgY29uc3Q7CiAgICBzdGF0aWMgUVdpZGdl dCAqCWZpbmQoIFdJZCApOwogICAgc3RhdGljIFFXaWRnZXRNYXBwZXIgKndtYXBwZXIoKTsKCiAg ICBRV2lkZ2V0ICAqY2hpbGRBdCggaW50IHgsIGludCB5LCBib29sIGluY2x1ZGVUaGlzID0gRkFM U0UgKSBjb25zdDsKICAgIFFXaWRnZXQgICpjaGlsZEF0KCBjb25zdCBRUG9pbnQgJiwgYm9vbCBp bmNsdWRlVGhpcyA9IEZBTFNFICkgY29uc3Q7CgoKCgoKCgoKCgoKCnByb3RlY3RlZDoKICAgICAK ICAgIGJvb2wJIGV2ZW50KCBRRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIG1vdXNlUHJlc3NF dmVudCggUU1vdXNlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50 KCBRTW91c2VFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgbW91c2VEb3VibGVDbGlja0V2ZW50 KCBRTW91c2VFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgbW91c2VNb3ZlRXZlbnQoIFFNb3Vz ZUV2ZW50ICogKTsKCiAgICB2aXJ0dWFsIHZvaWQgd2hlZWxFdmVudCggUVdoZWVsRXZlbnQgKiAp OwoKICAgIHZpcnR1YWwgdm9pZCBrZXlQcmVzc0V2ZW50KCBRS2V5RXZlbnQgKiApOwogICAgdmly dHVhbCB2b2lkIGtleVJlbGVhc2VFdmVudCggUUtleUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9p ZCBmb2N1c0luRXZlbnQoIFFGb2N1c0V2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBmb2N1c091 dEV2ZW50KCBRRm9jdXNFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgZW50ZXJFdmVudCggUUV2 ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBsZWF2ZUV2ZW50KCBRRXZlbnQgKiApOwogICAgdmly dHVhbCB2b2lkIHBhaW50RXZlbnQoIFFQYWludEV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBt b3ZlRXZlbnQoIFFNb3ZlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIHJlc2l6ZUV2ZW50KCBR UmVzaXplRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIGNsb3NlRXZlbnQoIFFDbG9zZUV2ZW50 ICogKTsKICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUV2ZW50KCBRQ29udGV4dE1lbnVFdmVu dCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgaW1TdGFydEV2ZW50KCBRSU1FdmVudCAqICk7CiAgICB2 aXJ0dWFsIHZvaWQgaW1Db21wb3NlRXZlbnQoIFFJTUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9p ZCBpbUVuZEV2ZW50KCBRSU1FdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgdGFibGV0RXZlbnQo IFFUYWJsZXRFdmVudCAqICk7CgoKICAgIHZpcnR1YWwgdm9pZCBkcmFnRW50ZXJFdmVudCggUURy YWdFbnRlckV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCBkcmFnTW92ZUV2ZW50KCBRRHJhZ01v dmVFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgZHJhZ0xlYXZlRXZlbnQoIFFEcmFnTGVhdmVF dmVudCAqICk7CiAgICB2aXJ0dWFsIHZvaWQgZHJvcEV2ZW50KCBRRHJvcEV2ZW50ICogKTsKCgog ICAgdmlydHVhbCB2b2lkIHNob3dFdmVudCggUVNob3dFdmVudCAqICk7CiAgICB2aXJ0dWFsIHZv aWQgaGlkZUV2ZW50KCBRSGlkZUV2ZW50ICogKTsKCgoKCgoKCgogICAgdmlydHVhbCBib29sIHgx MUV2ZW50KCBYRXZlbnQgKiApOwoKCgoKCgoKICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVNYXNrKCk7 CgogICAgIAoKCiAgICB2aXJ0dWFsIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKCiAgICB2 aXJ0dWFsIHZvaWQgZW5hYmxlZENoYW5nZSggYm9vbCBvbGRFbmFibGVkICk7CgogICAgdmlydHVh bCB2b2lkIHBhbGV0dGVDaGFuZ2UoIGNvbnN0IFFQYWxldHRlICYgKTsKCiAgICB2aXJ0dWFsIHZv aWQgZm9udENoYW5nZSggY29uc3QgUUZvbnQgJiApOwogICAgdmlydHVhbCB2b2lkIHdpbmRvd0Fj dGl2YXRpb25DaGFuZ2UoIGJvb2wgb2xkQWN0aXZlICk7CgogICAgaW50CQkgbWV0cmljKCBpbnQg KQljb25zdDsKCiAgICB2b2lkCSByZXNldElucHV0Q29udGV4dCgpOwoKICAgIHZpcnR1YWwgdm9p ZCBjcmVhdGUoIFdJZCA9IDAsIGJvb2wgaW5pdGlhbGl6ZVdpbmRvdyA9IFRSVUUsCgkJCSBib29s IGRlc3Ryb3lPbGRXaW5kb3cgPSBUUlVFICk7CiAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveSggYm9v bCBkZXN0cm95V2luZG93ID0gVFJVRSwKCQkJICBib29sIGRlc3Ryb3lTdWJXaW5kb3dzID0gVFJV RSApOwogICAgdWludAkgZ2V0V1N0YXRlKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0V1N0 YXRlKCB1aW50ICk7CiAgICB2b2lkCSBjbGVhcldTdGF0ZSggdWludCBuICk7CiAgICBXRmxhZ3MJ IGdldFdGbGFncygpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFdGbGFncyggV0ZsYWdzICk7 CiAgICB2b2lkCSBjbGVhcldGbGFncyggV0ZsYWdzIG4gKTsKCiAgICB2aXJ0dWFsIGJvb2wgZm9j dXNOZXh0UHJldkNoaWxkKCBib29sIG5leHQgKTsKCiAgICBRV0V4dHJhCSpleHRyYURhdGEoKTsK ICAgIFFUTFdFeHRyYQkqdG9wRGF0YSgpOwogICAgUUZvY3VzRGF0YQkqZm9jdXNEYXRhKCk7Cgog ICAgdmlydHVhbCB2b2lkIHNldEtleUNvbXByZXNzaW9uKGJvb2wpOwogICAgdmlydHVhbCB2b2lk IHNldE1pY3JvRm9jdXNIaW50KGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBib29sIHRleHQ9 VFJVRSwgUUZvbnQgKmYgPSAwKTsKCgoKCgoKcHJpdmF0ZSAgOgogICAgdm9pZAkgZm9jdXNQcm94 eURlc3Ryb3llZCgpOwoKcHJpdmF0ZToKICAgIHZvaWQJIHNldEZvbnRTeXMoIFFGb250ICpmID0g MCApOwoKICAgIHZvaWQJIGNyZWF0ZUlucHV0Q29udGV4dCgpOwogICAgdm9pZAkgZGVzdHJveUlu cHV0Q29udGV4dCgpOwogICAgdm9pZAkgZm9jdXNJbnB1dENvbnRleHQoKTsKICAgIHZvaWQJIGNo ZWNrQ2hpbGRyZW5EbmQoKTsKIyA1NjYgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd2lkZ2V0Lmgi CgoKCiAgICB2b2lkIAkgc2V0TGF5b3V0KCBRTGF5b3V0ICpsICk7CgogICAgdm9pZAkgc2V0V2lu SWQoIFdJZCApOwogICAgdm9pZAkgc2hvd1dpbmRvdygpOwogICAgdm9pZAkgaGlkZVdpbmRvdygp OwogICAgdm9pZAkgc2VuZFNob3dFdmVudHNUb0NoaWxkcmVuKCBib29sIHNwb250YW5lb3VzICk7 CiAgICB2b2lkCSBzZW5kSGlkZUV2ZW50c1RvQ2hpbGRyZW4oIGJvb2wgc3BvbnRhbmVvdXMgKTsK ICAgIHZvaWQJIHJlcGFyZW50U3lzKCBRV2lkZ2V0ICpwYXJlbnQsIFdGbGFncywgY29uc3QgUVBv aW50ICYsICBib29sIHNob3dJdCk7CiAgICB2b2lkCSBjcmVhdGVUTEV4dHJhKCk7CiAgICB2b2lk CSBjcmVhdGVFeHRyYSgpOwogICAgdm9pZAkgZGVsZXRlRXh0cmEoKTsKICAgIHZvaWQJIGNyZWF0 ZVN5c0V4dHJhKCk7CiAgICB2b2lkCSBkZWxldGVTeXNFeHRyYSgpOwogICAgdm9pZAkgY3JlYXRl VExTeXNFeHRyYSgpOwogICAgdm9pZAkgZGVsZXRlVExTeXNFeHRyYSgpOwogICAgdm9pZAkgZGVh Y3RpdmF0ZVdpZGdldENsZWFudXAoKTsKICAgIHZvaWQJIGludGVybmFsU2V0R2VvbWV0cnkoIGlu dCwgaW50LCBpbnQsIGludCwgYm9vbCApOwogICAgdm9pZAkgcmVwYXJlbnRGb2N1c1dpZGdldHMo IFFXaWRnZXQgKiApOwogICAgUUZvY3VzRGF0YQkqZm9jdXNEYXRhKCBib29sIGNyZWF0ZSApOwog ICAgdm9pZCAgICAgICAgIHNldEJhY2tncm91bmRGcm9tTW9kZSgpOwogICAgdm9pZCAgICAgICAg IHNldEJhY2tncm91bmRDb2xvckRpcmVjdCggY29uc3QgUUNvbG9yICYgKTsKICAgIHZvaWQgICAJ IHNldEJhY2tncm91bmRQaXhtYXBEaXJlY3QoIGNvbnN0IFFQaXhtYXAgJiApOwogICAgdm9pZCAg ICAgICAgIHNldEJhY2tncm91bmRNb2RlRGlyZWN0KCBCYWNrZ3JvdW5kTW9kZSApOwogICAgdm9p ZCAgICAgICAgIHNldEJhY2tncm91bmRFbXB0eSgpOwogICAgdm9pZAkgdXBkYXRlRnJhbWVTdHJ1 dCgpIGNvbnN0OwoKICAgIHZvaWQgICAgICAgICBzZXRCYWNrZ3JvdW5kWDExUmVsYXRpdmUoKTsK CgogICAgV0lkCQkgd2luaWQ7CiAgICB1aW50CSB3aWRnZXRfc3RhdGU7CiAgICB1aW50CSB3aWRn ZXRfZmxhZ3M7CiAgICB1aW50CSBmb2N1c19wb2xpY3kgOiA0OwogICAgdWludCAJIG93bl9mb250 IDoxOwogICAgdWludCAJIG93bl9wYWxldHRlIDoxOwogICAgdWludCAJIHNpemVoaW50X2ZvcmNl ZCA6MTsKICAgIHVpbnQgCSBpc19jbG9zaW5nIDoxOwogICAgdWludCAJIGluX3Nob3cgOiAxOwog ICAgdWludCAJIGluX3Nob3dfbWF4aW1pemVkIDogMTsKICAgIHVpbnQJIGZzdHJ1dF9kaXJ0eSA6 IDE7CiAgICBRUmVjdAkgY3JlY3Q7CiAgICBRQ29sb3IJIGJnX2NvbDsKCiAgICBRUGFsZXR0ZQkg cGFsOwoKICAgIFFGb250CSBmbnQ7CgogICAgUUxheW91dCAJKmxheV9vdXQ7CgogICAgUVdFeHRy YQkqZXh0cmE7CiMgNjQxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXdpZGdldC5oIgoKCiAgICBz dGF0aWMgdm9pZAkgY3JlYXRlTWFwcGVyKCk7CiAgICBzdGF0aWMgdm9pZAkgZGVzdHJveU1hcHBl cigpOwogICAgc3RhdGljIFFXaWRnZXRMaXN0CSAqd0xpc3QoKTsKICAgIHN0YXRpYyBRV2lkZ2V0 TGlzdAkgKnRsd0xpc3QoKTsKICAgIHN0YXRpYyBRV2lkZ2V0TWFwcGVyICptYXBwZXI7CiAgICBm cmllbmQgY2xhc3MgUUFwcGxpY2F0aW9uOwogICAgZnJpZW5kIGNsYXNzIFFCYXNlQXBwbGljYXRp b247CiAgICBmcmllbmQgY2xhc3MgUVBhaW50ZXI7CiAgICBmcmllbmQgY2xhc3MgUUZvbnRNZXRy aWNzOwogICAgZnJpZW5kIGNsYXNzIFFGb250SW5mbzsKICAgIGZyaWVuZCBjbGFzcyBRRVRXaWRn ZXQ7CiAgICBmcmllbmQgY2xhc3MgUUxheW91dDsKCnByaXZhdGU6CSAKCiAgICBRV2lkZ2V0KCBj b25zdCBRV2lkZ2V0ICYgKTsKICAgIFFXaWRnZXQgJm9wZXJhdG9yPSggY29uc3QgUVdpZGdldCAm ICk7CgoKcHVibGljOiAgCgogICAgdm9pZCBzZXRQYWxldHRlKCBjb25zdCBRUGFsZXR0ZSAmcCwg Ym9vbCApIHsgc2V0UGFsZXR0ZSggcCApOyB9CgogICAgdm9pZCBzZXRGb250KCBjb25zdCBRRm9u dCAmZiwgYm9vbCApIHsgc2V0Rm9udCggZiApOyB9Cn07CgoKaW5saW5lIFF0OjpXU3RhdGUgUVdp ZGdldDo6dGVzdFdTdGF0ZSggV1N0YXRlIHMgKSBjb25zdAp7IHJldHVybiAod2lkZ2V0X3N0YXRl ICYgcyk7IH0KCmlubGluZSBRdDo6V0ZsYWdzIFFXaWRnZXQ6OnRlc3RXRmxhZ3MoIFdGbGFncyBm ICkgY29uc3QKeyByZXR1cm4gKHdpZGdldF9mbGFncyAmIGYpOyB9CgoKaW5saW5lIFdJZCBRV2lk Z2V0Ojp3aW5JZCgpIGNvbnN0CnsgcmV0dXJuIHdpbmlkOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0 Ojppc1RvcExldmVsKCkgY29uc3QKeyByZXR1cm4gdGVzdFdGbGFncyhXVHlwZV9Ub3BMZXZlbCk7 IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzRGlhbG9nKCkgY29uc3QKeyByZXR1cm4gdGVzdFdG bGFncyhXVHlwZV9EaWFsb2cpOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0Ojppc1BvcHVwKCkgY29u c3QKeyByZXR1cm4gdGVzdFdGbGFncyhXVHlwZV9Qb3B1cCk7IH0KCmlubGluZSBib29sIFFXaWRn ZXQ6OmlzRGVza3RvcCgpIGNvbnN0CnsgcmV0dXJuIHRlc3RXRmxhZ3MoV1R5cGVfRGVza3RvcCk7 IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzRW5hYmxlZCgpIGNvbnN0CnsgcmV0dXJuICF0ZXN0 V1N0YXRlKFdTdGF0ZV9EaXNhYmxlZCk7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzTW9kYWwo KSBjb25zdAp7IHJldHVybiB0ZXN0V0ZsYWdzKFdTaG93TW9kYWwpOyB9CgppbmxpbmUgYm9vbCBR V2lkZ2V0Ojppc0VuYWJsZWRUb1RMVygpIGNvbnN0CnsgcmV0dXJuIGlzRW5hYmxlZCgpOyB9Cgpp bmxpbmUgY29uc3QgUVJlY3QgJlFXaWRnZXQ6Omdlb21ldHJ5KCkgY29uc3QKeyByZXR1cm4gY3Jl Y3Q7IH0KCmlubGluZSBRU2l6ZSBRV2lkZ2V0OjpzaXplKCkgY29uc3QKeyByZXR1cm4gY3JlY3Qu c2l6ZSgpOyB9CgppbmxpbmUgaW50IFFXaWRnZXQ6OndpZHRoKCkgY29uc3QKeyByZXR1cm4gY3Jl Y3Qud2lkdGgoKTsgfQoKaW5saW5lIGludCBRV2lkZ2V0OjpoZWlnaHQoKSBjb25zdAp7IHJldHVy biBjcmVjdC5oZWlnaHQoKTsgfQoKaW5saW5lIFFSZWN0IFFXaWRnZXQ6OnJlY3QoKSBjb25zdAp7 IHJldHVybiBRUmVjdCgwLDAsY3JlY3Qud2lkdGgoKSxjcmVjdC5oZWlnaHQoKSk7IH0KCmlubGlu ZSBpbnQgUVdpZGdldDo6bWluaW11bVdpZHRoKCkgY29uc3QKeyByZXR1cm4gbWluaW11bVNpemUo KS53aWR0aCgpOyB9CgppbmxpbmUgaW50IFFXaWRnZXQ6Om1pbmltdW1IZWlnaHQoKSBjb25zdAp7 IHJldHVybiBtaW5pbXVtU2l6ZSgpLmhlaWdodCgpOyB9CgppbmxpbmUgaW50IFFXaWRnZXQ6Om1h eGltdW1XaWR0aCgpIGNvbnN0CnsgcmV0dXJuIG1heGltdW1TaXplKCkud2lkdGgoKTsgfQoKaW5s aW5lIGludCBRV2lkZ2V0OjptYXhpbXVtSGVpZ2h0KCkgY29uc3QKeyByZXR1cm4gbWF4aW11bVNp emUoKS5oZWlnaHQoKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6c2V0TWluaW11bVNpemUoIGNv bnN0IFFTaXplICZzICkKeyBzZXRNaW5pbXVtU2l6ZShzLndpZHRoKCkscy5oZWlnaHQoKSk7IH0K CmlubGluZSB2b2lkIFFXaWRnZXQ6OnNldE1heGltdW1TaXplKCBjb25zdCBRU2l6ZSAmcyApCnsg c2V0TWF4aW11bVNpemUocy53aWR0aCgpLHMuaGVpZ2h0KCkpOyB9CgppbmxpbmUgdm9pZCBRV2lk Z2V0OjpzZXRTaXplSW5jcmVtZW50KCBjb25zdCBRU2l6ZSAmcyApCnsgc2V0U2l6ZUluY3JlbWVu dChzLndpZHRoKCkscy5oZWlnaHQoKSk7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OnNldEJhc2VT aXplKCBjb25zdCBRU2l6ZSAmcyApCnsgc2V0QmFzZVNpemUocy53aWR0aCgpLHMuaGVpZ2h0KCkp OyB9CgppbmxpbmUgY29uc3QgUUNvbG9yICZRV2lkZ2V0OjplcmFzZUNvbG9yKCkgY29uc3QKeyBy ZXR1cm4gYmdfY29sOyB9CgoKaW5saW5lIGNvbnN0IFFQYWxldHRlICZRV2lkZ2V0OjpwYWxldHRl KCkgY29uc3QKeyByZXR1cm4gcGFsOyB9CgoKaW5saW5lIFFGb250IFFXaWRnZXQ6OmZvbnQoKSBj b25zdAp7IHJldHVybiBmbnQ7IH0KCmlubGluZSBRRm9udE1ldHJpY3MgUVdpZGdldDo6Zm9udE1l dHJpY3MoKSBjb25zdAp7IHJldHVybiBRRm9udE1ldHJpY3MoZm9udCgpKTsgfQoKaW5saW5lIFFG b250SW5mbyBRV2lkZ2V0Ojpmb250SW5mbygpIGNvbnN0CnsgcmV0dXJuIFFGb250SW5mbyhmb250 KCkpOyB9CgppbmxpbmUgYm9vbCBRV2lkZ2V0OjpoYXNNb3VzZVRyYWNraW5nKCkgY29uc3QKeyBy ZXR1cm4gdGVzdFdTdGF0ZShXU3RhdGVfTW91c2VUcmFja2luZyk7IH0KCmlubGluZSBib29sIFFX aWRnZXQ6Omhhc01vdXNlKCkgY29uc3QKeyByZXR1cm4gdGVzdFdTdGF0ZShXU3RhdGVfSGFzTW91 c2UpOyB9CgppbmxpbmUgYm9vbCAgUVdpZGdldDo6aXNGb2N1c0VuYWJsZWQoKSBjb25zdAp7IHJl dHVybiAoRm9jdXNQb2xpY3kpZm9jdXNfcG9saWN5ICE9IE5vRm9jdXM7IH0KCmlubGluZSBRV2lk Z2V0OjpGb2N1c1BvbGljeSBRV2lkZ2V0Ojpmb2N1c1BvbGljeSgpIGNvbnN0CnsgcmV0dXJuIChG b2N1c1BvbGljeSlmb2N1c19wb2xpY3k7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzVXBkYXRl c0VuYWJsZWQoKSBjb25zdAp7IHJldHVybiAhdGVzdFdTdGF0ZShXU3RhdGVfQmxvY2tVcGRhdGVz KTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6dXBkYXRlKCBjb25zdCBRUmVjdCAmciApCnsgdXBk YXRlKCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSApOyB9CgppbmxpbmUgdm9p ZCBRV2lkZ2V0OjpyZXBhaW50KCkKeyByZXBhaW50KCAwLCAwLCBjcmVjdC53aWR0aCgpLCBjcmVj dC5oZWlnaHQoKSwgVFJVRSApOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpyZXBhaW50KCBib29s IGVyYXNlICkKeyByZXBhaW50KCAwLCAwLCBjcmVjdC53aWR0aCgpLCBjcmVjdC5oZWlnaHQoKSwg ZXJhc2UgKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6cmVwYWludCggY29uc3QgUVJlY3QgJnIs IGJvb2wgZXJhc2UgKQp7IHJlcGFpbnQoIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhlaWdo dCgpLCBlcmFzZSApOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjplcmFzZSgpCnsgZXJhc2UoIDAs IDAsIGNyZWN0LndpZHRoKCksIGNyZWN0LmhlaWdodCgpICk7IH0KCmlubGluZSB2b2lkIFFXaWRn ZXQ6OmVyYXNlKCBjb25zdCBRUmVjdCAmciApCnsgZXJhc2UoIHIueCgpLCByLnkoKSwgci53aWR0 aCgpLCByLmhlaWdodCgpICk7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmNsb3NlKCkKeyByZXR1 cm4gY2xvc2UoIEZBTFNFICk7IH0KCmlubGluZSBib29sIFFXaWRnZXQ6OmlzVmlzaWJsZSgpIGNv bnN0CnsgcmV0dXJuIHRlc3RXU3RhdGUoV1N0YXRlX1Zpc2libGUpOyB9CgppbmxpbmUgYm9vbCBR V2lkZ2V0Ojppc1Zpc2libGVUb1RMVygpIGNvbnN0ICAKeyByZXR1cm4gaXNWaXNpYmxlKCk7IH0K CmlubGluZSBib29sIFFXaWRnZXQ6OmlzSGlkZGVuKCkgY29uc3QKeyByZXR1cm4gdGVzdFdTdGF0 ZShXU3RhdGVfRm9yY2VIaWRlKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6bW92ZSggY29uc3Qg UVBvaW50ICZwICkKeyBtb3ZlKCBwLngoKSwgcC55KCkgKTsgfQoKaW5saW5lIHZvaWQgUVdpZGdl dDo6cmVzaXplKCBjb25zdCBRU2l6ZSAmcyApCnsgcmVzaXplKCBzLndpZHRoKCksIHMuaGVpZ2h0 KCkpOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpzZXRHZW9tZXRyeSggY29uc3QgUVJlY3QgJnIg KQp7IHNldEdlb21ldHJ5KCByLmxlZnQoKSwgci50b3AoKSwgci53aWR0aCgpLCByLmhlaWdodCgp ICk7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OmRyYXdUZXh0KCBjb25zdCBRUG9pbnQgJnAsIGNv bnN0IFFTdHJpbmcgJnMgKQp7IGRyYXdUZXh0KCBwLngoKSwgcC55KCksIHMgKTsgfQoKaW5saW5l IFFXaWRnZXQgKlFXaWRnZXQ6OnBhcmVudFdpZGdldCggYm9vbCBzYW1lV2luZG93ICkgY29uc3QK ewogICAgaWYgKCBzYW1lV2luZG93ICkKCXJldHVybiBpc1RvcExldmVsKCkgPyAwIDogKFFXaWRn ZXQgKilRT2JqZWN0OjpwYXJlbnQoKTsKICAgIHJldHVybiAoUVdpZGdldCAqKVFPYmplY3Q6OnBh cmVudCgpOwp9CgppbmxpbmUgUVdpZGdldE1hcHBlciAqUVdpZGdldDo6d21hcHBlcigpCnsgcmV0 dXJuIG1hcHBlcjsgfQoKaW5saW5lIHVpbnQgUVdpZGdldDo6Z2V0V1N0YXRlKCkgY29uc3QKeyBy ZXR1cm4gd2lkZ2V0X3N0YXRlOyB9CgppbmxpbmUgdm9pZCBRV2lkZ2V0OjpzZXRXU3RhdGUoIHVp bnQgZiApCnsgd2lkZ2V0X3N0YXRlIHw9IGY7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OmNsZWFy V1N0YXRlKCB1aW50IGYgKQp7IHdpZGdldF9zdGF0ZSAmPSB+ZjsgfQoKaW5saW5lIFF0OjpXRmxh Z3MgUVdpZGdldDo6Z2V0V0ZsYWdzKCkgY29uc3QKeyByZXR1cm4gd2lkZ2V0X2ZsYWdzOyB9Cgpp bmxpbmUgdm9pZCBRV2lkZ2V0OjpzZXRXRmxhZ3MoIFdGbGFncyBmICkKeyB3aWRnZXRfZmxhZ3Mg fD0gZjsgfQoKaW5saW5lIHZvaWQgUVdpZGdldDo6Y2xlYXJXRmxhZ3MoIFdGbGFncyBmICkKeyB3 aWRnZXRfZmxhZ3MgJj0gfmY7IH0KCmlubGluZSB2b2lkIFFXaWRnZXQ6OmNvbnN0UG9saXNoKCkg Y29uc3QKewogICAgaWYgKCAhdGVzdFdTdGF0ZShXU3RhdGVfUG9saXNoZWQpICkgewoJUVdpZGdl dCogdGhhdCA9IChRV2lkZ2V0KikgdGhpczsKCXRoYXQtPnBvbGlzaCgpOwogICAgICAgIHRoYXQt PnNldFdTdGF0ZShXU3RhdGVfUG9saXNoZWQpOyAgCiAgICB9Cn0KCmlubGluZSBib29sIFFXaWRn ZXQ6Om93bkN1cnNvcigpIGNvbnN0CnsKICAgIHJldHVybiB0ZXN0V1N0YXRlKCBXU3RhdGVfT3du Q3Vyc29yICk7Cn0KCmlubGluZSBib29sIFFXaWRnZXQ6Om93bkZvbnQoKSBjb25zdAp7CiAgICBy ZXR1cm4gb3duX2ZvbnQ7Cn0KCmlubGluZSBib29sIFFXaWRnZXQ6Om93blBhbGV0dGUoKSBjb25z dAp7CiAgICByZXR1cm4gb3duX3BhbGV0dGU7Cn0KCgogCiAKIAoKY2xhc3MgUUZvY3VzRGF0YTsK Y2xhc3MgUVdTTWFuYWdlcjsKCgoKCgoKCnN0cnVjdCAgIFFUTFdFeHRyYSB7CgogICAgUVN0cmlu ZyAgY2FwdGlvbjsJCQkJIAogICAgUVN0cmluZyAgaWNvblRleHQ7CQkJCSAKICAgIFFQaXhtYXAg Kmljb247CQkJCSAKCiAgICBRRm9jdXNEYXRhICpmb2N1c0RhdGE7CQkJIAogICAgc2hvcnQgICAg aW5jdywgaW5jaDsJCQkgCiAgICAgCiAgICB1bG9uZyAgICBmbGVmdCwgZnJpZ2h0LCBmdG9wLCBm Ym90dG9tOwogICAgdWludCAgICAgaWNvbmljOiAxOwkJCQkgCiAgICB1aW50ICAgICBmdWxsc2Ny ZWVuIDogMTsJCQkgCiAgICB1aW50ICAgICBzaG93TW9kZTogMjsJCQkgCiAgICB1aW50ICAgICBz YXZlZEZsYWdzOwkJCSAKICAgIHNob3J0ICAgIGJhc2V3LCBiYXNlaDsJCQkgCgogICAgV0lkICBw YXJlbnRXaW5JZDsJCQkJIAogICAgdWludCAgICAgZW1iZWRkZWQgOiAxOwkJCSAKICAgIHVpbnQg ICAgIHJlc2VydmVkOiAyOwkJCSAKICAgIHVpbnQgICAgIGRuZCA6IDE7CQkJCSAKICAgIHVpbnQg ICAgIHVzcG9zIDogMTsJCQkJIAogICAgdWludCAgICAgdXNzaXplIDogMTsJCQkgCiAgICB2b2lk ICAgICp4aWM7CQkJCSAKCgoKCgoKCgoKCgogICAgUVJlY3QgICAgbm9ybWFsR2VvbWV0cnk7CQkJ IAp9OwoKCgoKIAoKc3RydWN0ICAgUVdFeHRyYSB7CiAgICBRX0lOVDE2ICBtaW53LCBtaW5oOwkJ CSAKICAgIFFfSU5UMTYgIG1heHcsIG1heGg7CQkJIAogICAgUVBpeG1hcCAqYmdfcGl4OwkJCQkg CiAgICBRV2lkZ2V0ICpmb2N1c19wcm94eTsKCiAgICBRQ3Vyc29yICpjdXJzOwoKICAgIFFUTFdF eHRyYSAqdG9wZXh0cmE7CQkJIAoKCgoKICAgIFdJZCB4RG5kUHJveHk7CQkJCSAKCiMgOTQ3ICIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcXdpZGdldC5oIgoKICAgIHVpbnQgYmdfb3JpZ2luIDogMjsK CiAgICB1aW50IGNoaWxkcmVuX3VzZV9kbmQgOiAxOwoKCgoKICAgIGNoYXIgICAgIGJnX21vZGU7 CQkJCSAKICAgIGNoYXIgICAgIGJnX21vZGVfdmlzdWFsOwkJCSAKCiAgICBRU3R5bGUqIHN0eWxl OwoKICAgIFFSZWN0IG1pY3JvX2ZvY3VzX2hpbnQ7CQkJIAogICAgUVNpemVQb2xpY3kgc2l6ZV9w b2xpY3k7Cn07CgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZnJhbWUuaCIgMgoKCgoK CmNsYXNzICAgUUZyYW1lIDogcHVibGljIFFXaWRnZXQKewogICAgcHVibGljOgl2aXJ0dWFsIFFN ZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgp Owl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCog cXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9i amVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwg Ym9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2Jq ZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9i amVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFy ICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFy ICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAgIAog ICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAoKcHVibGljOgog ICAgUUZyYW1lKCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wLCBXRmxhZ3Mg Zj0wICk7CgogICAgaW50ICAgICAgICAgZnJhbWVTdHlsZSgpICAgIGNvbnN0OwogICAgdmlydHVh bCB2b2lkIHNldEZyYW1lU3R5bGUoIGludCApOwoKICAgIGludCAgICAgICAgIGZyYW1lV2lkdGgo KSAgICBjb25zdDsKICAgIFFSZWN0ICAgICAgIGNvbnRlbnRzUmVjdCgpICBjb25zdDsKCgogICAg Ym9vbCAgICAgICAgbGluZVNoYXBlc09rKCkgIGNvbnN0IHsgcmV0dXJuIFRSVUU7IH0KCgogICAg UVNpemUgICAgICAgc2l6ZUhpbnQoKSBjb25zdDsKCiAgICBlbnVtIFNoYXBlIHsgTm9GcmFtZSAg PSAwLCAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBCb3ggICAgICA9IDB4MDAw MSwgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIFBhbmVsICAgID0gMHgwMDAyLCAgICAg ICAgICAgICAgCiAgICAgICAgICAgICAgICAgV2luUGFuZWwgPSAweDAwMDMsICAgICAgICAgICAg ICAKICAgICAgICAgICAgICAgICBITGluZSAgICA9IDB4MDAwNCwgICAgICAgICAgICAgIAogICAg ICAgICAgICAgICAgIFZMaW5lICAgID0gMHgwMDA1LCAgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgU3R5bGVkUGFuZWwgPSAweDAwMDYsICAgICAgICAgICAKICAgICAgICAgICAgICAgICBQ b3B1cFBhbmVsID0gMHgwMDA3LCAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIE1lbnVCYXJQ YW5lbCA9IDB4MDAwOCwKICAgICAgICAgICAgICAgICBUb29sQmFyUGFuZWwgPSAweDAwMDksCgkJ IExpbmVFZGl0UGFuZWwgPSAweDAwMGEsCgkJIFRhYldpZGdldFBhbmVsID0gMHgwMDBiLAogICAg ICAgICAgICAgICAgIE1TaGFwZSAgID0gMHgwMDBmICAgICAgICAgICAgICAgCiAgICB9OwogICAg ZW51bSBTaGFkb3cgeyBQbGFpbiAgICA9IDB4MDAxMCwgICAgICAgICAgICAgCiAgICAgICAgICAg ICAgICAgIFJhaXNlZCAgID0gMHgwMDIwLCAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg U3Vua2VuICAgPSAweDAwMzAsICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBNU2hhZG93 ICA9IDB4MDBmMCB9OyAgICAgICAgICAgCgogICAgU2hhcGUgICAgICAgZnJhbWVTaGFwZSgpICAg IGNvbnN0OwogICAgdm9pZCAgICAgICAgc2V0RnJhbWVTaGFwZSggU2hhcGUgKTsKICAgIFNoYWRv dyAgICAgIGZyYW1lU2hhZG93KCkgICBjb25zdDsKICAgIHZvaWQgICAgICAgIHNldEZyYW1lU2hh ZG93KCBTaGFkb3cgKTsKCiAgICBpbnQgICAgICAgICBsaW5lV2lkdGgoKSAgICAgY29uc3Q7CiAg ICB2aXJ0dWFsIHZvaWQgc2V0TGluZVdpZHRoKCBpbnQgKTsKCiAgICBpbnQgICAgICAgICBtYXJn aW4oKSAgICAgICAgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0TWFyZ2luKCBpbnQgKTsKCiAg ICBpbnQgICAgICAgICBtaWRMaW5lV2lkdGgoKSAgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0 TWlkTGluZVdpZHRoKCBpbnQgKTsKCiAgICBRUmVjdCAgICAgICBmcmFtZVJlY3QoKSAgICAgY29u c3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVSZWN0KCBjb25zdCBRUmVjdCAmICk7Cgpwcm90 ZWN0ZWQ6CiAgICB2b2lkICAgICAgICBwYWludEV2ZW50KCBRUGFpbnRFdmVudCAqICk7CiAgICB2 b2lkICAgICAgICByZXNpemVFdmVudCggUVJlc2l6ZUV2ZW50ICogKTsKICAgIHZpcnR1YWwgdm9p ZCBkcmF3RnJhbWUoIFFQYWludGVyICogKTsKICAgIHZpcnR1YWwgdm9pZCBkcmF3Q29udGVudHMo IFFQYWludGVyICogKTsKICAgIHZpcnR1YWwgdm9pZCBmcmFtZUNoYW5nZWQoKTsKCnByaXZhdGU6 CiAgICB2b2lkICAgICAgICB1cGRhdGVGcmFtZVdpZHRoKCk7CiAgICBRUmVjdCAgICAgICBmcmVj dDsKICAgIGludCAgICAgICAgIGZzdHlsZTsKICAgIHNob3J0ICAgICAgIGx3aWR0aDsKICAgIHNo b3J0ICAgICAgIG13aWR0aDsKICAgIHNob3J0ICAgICAgIG1sd2lkdGg7CiAgICBzaG9ydCAgICAg ICBmd2lkdGg7CgogICAgdm9pZCAqIGQ7CnByaXZhdGU6ICAgICAgICAgCgogICAgUUZyYW1lKCBj b25zdCBRRnJhbWUgJiApOwogICAgUUZyYW1lICZvcGVyYXRvcj0oIGNvbnN0IFFGcmFtZSAmICk7 Cgp9OwoKCmlubGluZSBpbnQgUUZyYW1lOjpmcmFtZVN0eWxlKCkgY29uc3QKeyByZXR1cm4gZnN0 eWxlOyB9CgppbmxpbmUgUUZyYW1lOjpTaGFwZSBRRnJhbWU6OmZyYW1lU2hhcGUoKSBjb25zdAp7 IHJldHVybiAoU2hhcGUpICggZnN0eWxlICYgTVNoYXBlICk7IH0KCmlubGluZSBRRnJhbWU6OlNo YWRvdyBRRnJhbWU6OmZyYW1lU2hhZG93KCkgY29uc3QKeyByZXR1cm4gKFNoYWRvdykgKCBmc3R5 bGUgJiBNU2hhZG93ICk7IH0KCmlubGluZSB2b2lkIFFGcmFtZTo6c2V0RnJhbWVTaGFwZSggUUZy YW1lOjpTaGFwZSBzICkKeyBzZXRGcmFtZVN0eWxlKCAoIGZzdHlsZSAmIE1TaGFkb3cgKSB8IHMg KTsgfQoKaW5saW5lIHZvaWQgUUZyYW1lOjpzZXRGcmFtZVNoYWRvdyggUUZyYW1lOjpTaGFkb3cg cyApCnsgc2V0RnJhbWVTdHlsZSggKCBmc3R5bGUgJiBNU2hhcGUgKSB8IHMgKTsgfQoKaW5saW5l IGludCBRRnJhbWU6OmxpbmVXaWR0aCgpIGNvbnN0CnsgcmV0dXJuIGx3aWR0aDsgfQoKaW5saW5l IGludCBRRnJhbWU6Om1pZExpbmVXaWR0aCgpIGNvbnN0CnsgcmV0dXJuIG1sd2lkdGg7IH0KCmlu bGluZSBpbnQgUUZyYW1lOjptYXJnaW4oKSBjb25zdAp7IHJldHVybiBtd2lkdGg7IH0KCmlubGlu ZSBpbnQgUUZyYW1lOjpmcmFtZVdpZHRoKCkgY29uc3QKeyByZXR1cm4gZndpZHRoOyB9CgoKCgoK IyA0MSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzY3JvbGx2aWV3LmgiIDIKCiMgMSAiL3Vzci9s b2NhbC9xdC9pbmNsdWRlL3FzY3JvbGxiYXIuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFUaW1lcjsKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1 ZGUvcXJhbmdlY29udHJvbC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgpjbGFzcyBRUmFuZ2VDb250cm9sUHJpdmF0ZTsKCgpjbGFzcyAgIFFSYW5n ZUNvbnRyb2wKewpwdWJsaWM6CiAgICBRUmFuZ2VDb250cm9sKCk7CiAgICBRUmFuZ2VDb250cm9s KCBpbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwKCQkgICBpbnQgbGluZVN0ZXAsIGludCBwYWdl U3RlcCwgaW50IHZhbHVlICk7CiAgICB2aXJ0dWFsIH5RUmFuZ2VDb250cm9sKCk7CiAgICBpbnQJ CXZhbHVlKCkJCWNvbnN0OwogICAgdm9pZAlzZXRWYWx1ZSggaW50ICk7CiAgICB2b2lkCWFkZFBh Z2UoKTsKICAgIHZvaWQJc3VidHJhY3RQYWdlKCk7CiAgICB2b2lkCWFkZExpbmUoKTsKICAgIHZv aWQJc3VidHJhY3RMaW5lKCk7CgogICAgaW50CQltaW5WYWx1ZSgpCWNvbnN0OwogICAgaW50CQlt YXhWYWx1ZSgpCWNvbnN0OwogICAgdm9pZAlzZXRSYW5nZSggaW50IG1pblZhbHVlLCBpbnQgbWF4 VmFsdWUgKTsKICAgIHZvaWQJc2V0TWluVmFsdWUoIGludCBtaW5WYWwgKTsKICAgIHZvaWQJc2V0 TWF4VmFsdWUoIGludCBtaW5WYWwgKTsKCiAgICBpbnQJCWxpbmVTdGVwKCkJY29uc3Q7CiAgICBp bnQJCXBhZ2VTdGVwKCkJY29uc3Q7CiAgICB2b2lkCXNldFN0ZXBzKCBpbnQgbGluZSwgaW50IHBh Z2UgKTsKCiAgICBpbnQJCWJvdW5kKCBpbnQgKSBjb25zdDsKCnByb3RlY3RlZDoKICAgIGludAkJ cG9zaXRpb25Gcm9tVmFsdWUoIGludCB2YWwsIGludCBzcGFjZSApIGNvbnN0OwogICAgaW50CQl2 YWx1ZUZyb21Qb3NpdGlvbiggaW50IHBvcywgaW50IHNwYWNlICkgY29uc3Q7CiAgICB2b2lkCWRp cmVjdFNldFZhbHVlKCBpbnQgdmFsICk7CiAgICBpbnQJCXByZXZWYWx1ZSgpCWNvbnN0OwoKICAg IHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZSgpOwogICAgdmlydHVhbCB2b2lkIHJhbmdlQ2hhbmdl KCk7CiAgICB2aXJ0dWFsIHZvaWQgc3RlcENoYW5nZSgpOwoKcHJpdmF0ZToKICAgIGludAkJbWlu VmFsLCBtYXhWYWw7CiAgICBpbnQJCWxpbmUsIHBhZ2U7CiAgICBpbnQJCXZhbCwgcHJldlZhbDsK CiAgICBRUmFuZ2VDb250cm9sUHJpdmF0ZSAqIGQ7Cgpwcml2YXRlOgkgCgogICAgUVJhbmdlQ29u dHJvbCggY29uc3QgUVJhbmdlQ29udHJvbCAmICk7CiAgICBRUmFuZ2VDb250cm9sICZvcGVyYXRv cj0oIGNvbnN0IFFSYW5nZUNvbnRyb2wgJiApOwoKfTsKCgppbmxpbmUgaW50IFFSYW5nZUNvbnRy b2w6OnZhbHVlKCkgY29uc3QKeyByZXR1cm4gdmFsOyB9CgppbmxpbmUgaW50IFFSYW5nZUNvbnRy b2w6OnByZXZWYWx1ZSgpIGNvbnN0CnsgcmV0dXJuIHByZXZWYWw7IH0KCmlubGluZSBpbnQgUVJh bmdlQ29udHJvbDo6bWluVmFsdWUoKSBjb25zdAp7IHJldHVybiBtaW5WYWw7IH0KCmlubGluZSBp bnQgUVJhbmdlQ29udHJvbDo6bWF4VmFsdWUoKSBjb25zdAp7IHJldHVybiBtYXhWYWw7IH0KCmlu bGluZSBpbnQgUVJhbmdlQ29udHJvbDo6bGluZVN0ZXAoKSBjb25zdAp7IHJldHVybiBsaW5lOyB9 CgppbmxpbmUgaW50IFFSYW5nZUNvbnRyb2w6OnBhZ2VTdGVwKCkgY29uc3QKeyByZXR1cm4gcGFn ZTsgfQoKCgoKCgpjbGFzcyBRU3BpbldpZGdldFByaXZhdGU7CmNsYXNzICAgUVNwaW5XaWRnZXQg OiBwdWJsaWMgUVdpZGdldAp7CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFP YmplY3QoKSBjb25zdCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25z dCBjaGFyICpjbGFzc05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBj aGFyKiApOyB2aXJ0dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFs IGJvb2wgcXRfZW1pdCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5 KCBpbnQsIGludCwgUVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFP YmplY3QoKTsJUU9iamVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0 YXRpYyBRU3RyaW5nIHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGlj IFFTdHJpbmcgdHJVdGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZh dGU6CXN0YXRpYyBRTWV0YU9iamVjdCAqbWV0YU9iajsgCnB1YmxpYzoKICAgIFFTcGluV2lkZ2V0 KCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICB+UVNwaW5XaWRn ZXQoKTsKCiAgICB2b2lkIAlzZXRFZGl0V2lkZ2V0KCBRV2lkZ2V0ICogd2lkZ2V0ICk7CiAgICBR V2lkZ2V0ICogCWVkaXRXaWRnZXQoKTsKCiAgICBRUmVjdCB1cFJlY3QoKSBjb25zdDsKICAgIFFS ZWN0IGRvd25SZWN0KCkgY29uc3Q7CgogICAgdm9pZCBzZXRVcEVuYWJsZWQoIGJvb2wgb24gKTsK ICAgIHZvaWQgc2V0RG93bkVuYWJsZWQoIGJvb2wgb24gKTsKCiAgICBib29sIGlzVXBFbmFibGVk KCkgY29uc3Q7CiAgICBib29sIGlzRG93bkVuYWJsZWQoKSBjb25zdDsKCiAgICBlbnVtIEJ1dHRv blN5bWJvbHMgeyBVcERvd25BcnJvd3MsIFBsdXNNaW51cyB9OwogICAgdmlydHVhbCB2b2lkCXNl dEJ1dHRvblN5bWJvbHMoIEJ1dHRvblN5bWJvbHMgYnMgKTsKICAgIEJ1dHRvblN5bWJvbHMJYnV0 dG9uU3ltYm9scygpIGNvbnN0OwoKICAgIHZvaWQgYXJyYW5nZSgpOwoKcHJvdGVjdGVkIDoKICAg IHZvaWQgc3RlcFVwUHJlc3NlZCgpOwogICAgdm9pZCBzdGVwRG93blByZXNzZWQoKTsKCnB1Ymxp YyAgOgogICAgdm9pZCBzdGVwVXAoKTsKICAgIHZvaWQgc3RlcERvd24oKTsKICAgIApwcm90ZWN0 ZWQ6CiAgICB2b2lkIG1vdXNlUHJlc3NFdmVudCggUU1vdXNlRXZlbnQgKmUgKTsKICAgIHZvaWQg cmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCogZXYgKTsKICAgIHZvaWQgbW91c2VSZWxlYXNlRXZl bnQoIFFNb3VzZUV2ZW50ICplICk7CiAgICB2b2lkIG1vdXNlTW92ZUV2ZW50KCBRTW91c2VFdmVu dCAqZSApOwoKICAgIHZvaWQgd2hlZWxFdmVudCggUVdoZWVsRXZlbnQgKiApOwoKICAgIHZvaWQg c3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKICAgIHZvaWQgcGFpbnRFdmVudCggUVBhaW50RXZlbnQg KiApOwogICAgdm9pZCBlbmFibGVDaGFuZ2VkKCBib29sIG9sZCApOwogICAgdm9pZCB3aW5kb3dB Y3RpdmF0aW9uQ2hhbmdlKCBib29sICk7Cgpwcml2YXRlICA6CiAgICB2b2lkIHRpbWVyRG9uZSgp OwogICAgdm9pZCB0aW1lckRvbmVFeCgpOwoKcHJpdmF0ZToKICAgIFFTcGluV2lkZ2V0UHJpdmF0 ZSAqIGQ7CgogICAgdm9pZCB1cGRhdGVEaXNwbGF5KCk7Cgpwcml2YXRlOgkgCgogICAgUVNwaW5X aWRnZXQoIGNvbnN0IFFTcGluV2lkZ2V0JiApOwogICAgUVNwaW5XaWRnZXQmIG9wZXJhdG9yPSgg Y29uc3QgUVNwaW5XaWRnZXQmICk7Cgp9OwoKCgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3FzY3JvbGxiYXIuaCIgMgoKCgoKCgpjbGFzcyAgIFFTY3JvbGxCYXIgOiBwdWJsaWMgUVdpZGdl dCwgcHVibGljIFFSYW5nZUNvbnRyb2wKewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0 ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1 YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCgg Y29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsg dmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9w cm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0 aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhp czsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7 IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7 IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAoKcHVibGljOgogICAgUVNjcm9sbEJhcigg UVdpZGdldCAqcGFyZW50LCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKICAgIFFTY3JvbGxCYXIoIE9y aWVudGF0aW9uLCBRV2lkZ2V0ICpwYXJlbnQsIGNvbnN0IGNoYXIqIG5hbWU9MCApOwogICAgUVNj cm9sbEJhciggaW50IG1pblZhbHVlLCBpbnQgbWF4VmFsdWUsIGludCBMaW5lU3RlcCwgaW50IFBh Z2VTdGVwLAoJCWludCB2YWx1ZSwgT3JpZW50YXRpb24sCgkJUVdpZGdldCAqcGFyZW50LCBjb25z dCBjaGFyKiBuYW1lPTAgKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0T3JpZW50YXRpb24oIE9yaWVu dGF0aW9uICk7CiAgICBPcmllbnRhdGlvbiBvcmllbnRhdGlvbigpIGNvbnN0OwogICAgdmlydHVh bCB2b2lkIHNldFRyYWNraW5nKCBib29sIGVuYWJsZSApOwogICAgYm9vbAl0cmFja2luZygpIGNv bnN0OwogICAgYm9vbAlkcmFnZ2luZ1NsaWRlcigpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBz ZXRQYWxldHRlKCBjb25zdCBRUGFsZXR0ZSAmICk7CiAgICBRU2l6ZQlzaXplSGludCgpIGNvbnN0 OwoKICAgIGludAkgbWluVmFsdWUoKSBjb25zdDsKICAgIGludAkgbWF4VmFsdWUoKSBjb25zdDsK ICAgIHZvaWQgc2V0TWluVmFsdWUoIGludCApOwogICAgdm9pZCBzZXRNYXhWYWx1ZSggaW50ICk7 CiAgICBpbnQJIGxpbmVTdGVwKCkgY29uc3Q7CiAgICBpbnQJIHBhZ2VTdGVwKCkgY29uc3Q7CiAg ICB2b2lkIHNldExpbmVTdGVwKCBpbnQgKTsKICAgIHZvaWQgc2V0UGFnZVN0ZXAoIGludCApOwog ICAgaW50ICB2YWx1ZSgpIGNvbnN0OwoKICAgIGludAkJc2xpZGVyU3RhcnQoKSBjb25zdDsKICAg IFFSZWN0CXNsaWRlclJlY3QoKSBjb25zdDsKCnB1YmxpYyAgOgogICAgdm9pZCBzZXRWYWx1ZSgg aW50ICk7Cgpwcm90ZWN0ZWQgOgogICAgdm9pZAl2YWx1ZUNoYW5nZWQoIGludCB2YWx1ZSApOwog ICAgdm9pZAlzbGlkZXJQcmVzc2VkKCk7CiAgICB2b2lkCXNsaWRlck1vdmVkKCBpbnQgdmFsdWUg KTsKICAgIHZvaWQJc2xpZGVyUmVsZWFzZWQoKTsKICAgIHZvaWQJbmV4dExpbmUoKTsKICAgIHZv aWQJcHJldkxpbmUoKTsKICAgIHZvaWQJbmV4dFBhZ2UoKTsKICAgIHZvaWQJcHJldlBhZ2UoKTsK CnByb3RlY3RlZDoKCiAgICB2b2lkIAl3aGVlbEV2ZW50KCBRV2hlZWxFdmVudCAqICk7CgogICAg dm9pZAlrZXlQcmVzc0V2ZW50KCBRS2V5RXZlbnQgKiApOwogICAgdm9pZAlyZXNpemVFdmVudCgg UVJlc2l6ZUV2ZW50ICogKTsKICAgIHZvaWQJcGFpbnRFdmVudCggUVBhaW50RXZlbnQgKiApOwoK ICAgIHZvaWQJbW91c2VQcmVzc0V2ZW50KCBRTW91c2VFdmVudCAqICk7CiAgICB2b2lkCW1vdXNl UmVsZWFzZUV2ZW50KCBRTW91c2VFdmVudCAqICk7CiAgICB2b2lkCW1vdXNlTW92ZUV2ZW50KCBR TW91c2VFdmVudCAqICk7CiAgICB2b2lkCWNvbnRleHRNZW51RXZlbnQoIFFDb250ZXh0TWVudUV2 ZW50ICogKTsKICAgIHZvaWQJaGlkZUV2ZW50KCBRSGlkZUV2ZW50KiApOwoKICAgIHZvaWQJdmFs dWVDaGFuZ2UoKTsKICAgIHZvaWQJc3RlcENoYW5nZSgpOwogICAgdm9pZAlyYW5nZUNoYW5nZSgp OwoKICAgIHZvaWQJc3R5bGVDaGFuZ2UoIFFTdHlsZSYgKTsKCnByaXZhdGUgIDoKICAgIHZvaWQg ZG9BdXRvUmVwZWF0KCk7Cgpwcml2YXRlOgogICAgdm9pZCBpbml0KCk7CiAgICB2b2lkIHBvc2l0 aW9uU2xpZGVyRnJvbVZhbHVlKCk7CiAgICBpbnQgY2FsY3VsYXRlVmFsdWVGcm9tU2xpZGVyKCkg Y29uc3Q7CgogICAgdm9pZCBzdGFydEF1dG9SZXBlYXQoKTsKICAgIHZvaWQgc3RvcEF1dG9SZXBl YXQoKTsKCiAgICBpbnQgcmFuZ2VWYWx1ZVRvU2xpZGVyUG9zKCBpbnQgdmFsICkgY29uc3Q7CiAg ICBpbnQgc2xpZGVyUG9zVG9SYW5nZVZhbHVlKCBpbnQgIHZhbCApIGNvbnN0OwoKICAgIHZvaWQg YWN0aW9uKCBpbnQgY29udHJvbCApOwoKICAgIHZvaWQgZHJhd0NvbnRyb2xzKCB1aW50IGNvbnRy b2xzLCB1aW50IGFjdGl2ZUNvbnRyb2wgKSBjb25zdDsKICAgIHZvaWQgZHJhd0NvbnRyb2xzKCB1 aW50IGNvbnRyb2xzLCB1aW50IGFjdGl2ZUNvbnRyb2wsCgkJCQlRUGFpbnRlciAqcCApIGNvbnN0 OwoKICAgIHVpbnQgcHJlc3NlZENvbnRyb2w7CiAgICBib29sIHRyYWNrOwogICAgYm9vbCBjbGlj a2VkQXQ7CiAgICBPcmllbnRhdGlvbiBvcmllbnQ7CgogICAgaW50IHNsaWRlUHJldlZhbDsKICAg IFFDT09SRCBzbGlkZXJQb3M7CiAgICBRQ09PUkQgY2xpY2tPZmZzZXQ7CgogICAgUVRpbWVyICog cmVwZWF0ZXI7CiAgICB2b2lkICogZDsKCnByaXZhdGU6CSAKCiAgICBRU2Nyb2xsQmFyKCBjb25z dCBRU2Nyb2xsQmFyICYgKTsKICAgIFFTY3JvbGxCYXIgJm9wZXJhdG9yPSggY29uc3QgUVNjcm9s bEJhciAmICk7Cgp9OwoKCmlubGluZSB2b2lkIFFTY3JvbGxCYXI6OnNldFRyYWNraW5nKCBib29s IHQgKQp7CiAgICB0cmFjayA9IHQ7Cn0KCmlubGluZSBib29sIFFTY3JvbGxCYXI6OnRyYWNraW5n KCkgY29uc3QKewogICAgcmV0dXJuIHRyYWNrOwp9CgppbmxpbmUgUVNjcm9sbEJhcjo6T3JpZW50 YXRpb24gUVNjcm9sbEJhcjo6b3JpZW50YXRpb24oKSBjb25zdAp7CiAgICByZXR1cm4gb3JpZW50 Owp9CgppbmxpbmUgaW50IFFTY3JvbGxCYXI6OnNsaWRlclN0YXJ0KCkgY29uc3QKewogICAgcmV0 dXJuIHNsaWRlclBvczsKfQoKCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xc2Nyb2xs dmlldy5oIiAyCgoKCgoKY2xhc3MgUVNjcm9sbFZpZXdEYXRhOwoKY2xhc3MgICBRU2Nyb2xsVmll dyA6IHB1YmxpYyBRRnJhbWUKewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0ICptZXRh T2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1YWwgY29u c3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCggY29uc3Qg Y2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsgdmlydHVh bCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9wcm9wZXJ0 eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0aWNNZXRh T2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhpczsgfSBz dGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IHN0YXRp YyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IAlwcml2 YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAoKICAgICAKCgpwdWJsaWM6CiAg ICBRU2Nyb2xsVmlldyhRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wLCBXRmxh Z3MgZj0wKTsKICAgIH5RU2Nyb2xsVmlldygpOwoKICAgIGVudW0gUmVzaXplUG9saWN5IHsgRGVm YXVsdCwgTWFudWFsLCBBdXRvT25lLCBBdXRvT25lRml0IH07CiAgICB2aXJ0dWFsIHZvaWQgc2V0 UmVzaXplUG9saWN5KCBSZXNpemVQb2xpY3kgKTsKICAgIFJlc2l6ZVBvbGljeSByZXNpemVQb2xp Y3koKSBjb25zdDsKCiAgICB2b2lkIHN0eWxlQ2hhbmdlKFFTdHlsZSYpOwogICAgdm9pZCByZW1v dmVDaGlsZChRV2lkZ2V0KiBjaGlsZCk7CiAgICB2aXJ0dWFsIHZvaWQgYWRkQ2hpbGQoIFFXaWRn ZXQqIGNoaWxkLCBpbnQgeD0wLCBpbnQgeT0wICk7CiAgICB2aXJ0dWFsIHZvaWQgbW92ZUNoaWxk KCBRV2lkZ2V0KiBjaGlsZCwgaW50IHgsIGludCB5ICk7CiAgICBpbnQgY2hpbGRYKFFXaWRnZXQq IGNoaWxkKTsKICAgIGludCBjaGlsZFkoUVdpZGdldCogY2hpbGQpOwogICAgYm9vbCBjaGlsZElz VmlzaWJsZShRV2lkZ2V0KiBjaGlsZCkgeyByZXR1cm4gY2hpbGQtPmlzVmlzaWJsZSgpOyB9ICAK ICAgIHZvaWQgc2hvd0NoaWxkKFFXaWRnZXQqIGNoaWxkLCBib29sIHllcz1UUlVFKSB7CglpZiAo IHllcyApCgkgICAgY2hpbGQtPnNob3coKTsKCWVsc2UKCSAgICBjaGlsZC0+aGlkZSgpOwogICAg fQoKICAgIGVudW0gU2Nyb2xsQmFyTW9kZSB7IEF1dG8sIEFsd2F5c09mZiwgQWx3YXlzT24gfTsK CiAgICBTY3JvbGxCYXJNb2RlIHZTY3JvbGxCYXJNb2RlKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZv aWQgIHNldFZTY3JvbGxCYXJNb2RlKCBTY3JvbGxCYXJNb2RlICk7CgogICAgU2Nyb2xsQmFyTW9k ZSBoU2Nyb2xsQmFyTW9kZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkICBzZXRIU2Nyb2xsQmFy TW9kZSggU2Nyb2xsQmFyTW9kZSApOwoKICAgIFFXaWRnZXQqICAgICBjb3JuZXJXaWRnZXQoKSBj b25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRDb3JuZXJXaWRnZXQoUVdpZGdldCopOwoKICAgIFFT Y3JvbGxCYXIqICBob3Jpem9udGFsU2Nyb2xsQmFyKCkgY29uc3Q7CiAgICBRU2Nyb2xsQmFyKiAg dmVydGljYWxTY3JvbGxCYXIoKSBjb25zdDsKICAgIFFXaWRnZXQqCSB2aWV3cG9ydCgpIGNvbnN0 OwogICAgUVdpZGdldCoJIGNsaXBwZXIoKSBjb25zdDsKCiAgICBpbnQJCXZpc2libGVXaWR0aCgp IGNvbnN0OwogICAgaW50CQl2aXNpYmxlSGVpZ2h0KCkgY29uc3Q7CgogICAgaW50CQljb250ZW50 c1dpZHRoKCkgY29uc3Q7CiAgICBpbnQJCWNvbnRlbnRzSGVpZ2h0KCkgY29uc3Q7CiAgICBpbnQJ CWNvbnRlbnRzWCgpIGNvbnN0OwogICAgaW50CQljb250ZW50c1koKSBjb25zdDsKCiAgICB2b2lk CXJlc2l6ZSggaW50IHcsIGludCBoICk7CiAgICB2b2lkCXJlc2l6ZSggY29uc3QgUVNpemUmICk7 CiAgICB2b2lkCXNob3coKTsKCiAgICB2b2lkCXVwZGF0ZUNvbnRlbnRzKCBpbnQgeCwgaW50IHks IGludCB3LCBpbnQgaCApOwogICAgdm9pZAl1cGRhdGVDb250ZW50cyggY29uc3QgUVJlY3QmIHIg KTsKICAgIHZvaWQgCXVwZGF0ZUNvbnRlbnRzKCk7CiAgICB2b2lkCXJlcGFpbnRDb250ZW50cygg aW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGJvb2wgZXJhc2U9VFJVRSApOwogICAgdm9pZAly ZXBhaW50Q29udGVudHMoIGNvbnN0IFFSZWN0JiByLCBib29sIGVyYXNlPVRSVUUgKTsKICAgIHZv aWQgCXJlcGFpbnRDb250ZW50cyggYm9vbCBlcmFzZT1UUlVFICk7CiAgICB2b2lkCWNvbnRlbnRz VG9WaWV3cG9ydCggaW50IHgsIGludCB5LCBpbnQmIHZ4LCBpbnQmIHZ5ICkgY29uc3Q7CiAgICB2 b2lkCXZpZXdwb3J0VG9Db250ZW50cyggaW50IHZ4LCBpbnQgdnksIGludCYgeCwgaW50JiB5ICkg Y29uc3Q7CiAgICBRUG9pbnQJY29udGVudHNUb1ZpZXdwb3J0KCBjb25zdCBRUG9pbnQmICkgY29u c3Q7CiAgICBRUG9pbnQJdmlld3BvcnRUb0NvbnRlbnRzKCBjb25zdCBRUG9pbnQmICkgY29uc3Q7 CiAgICB2b2lkCWVuYWJsZUNsaXBwZXIoIGJvb2wgeSApOwoKICAgIHZvaWQJc2V0U3RhdGljQmFj a2dyb3VuZCggYm9vbCB5ICk7CiAgICBib29sCWhhc1N0YXRpY0JhY2tncm91bmQoKSBjb25zdDsK CiAgICBRU2l6ZQl2aWV3cG9ydFNpemUoIGludCwgaW50ICkgY29uc3Q7CiAgICBRU2l6ZQlzaXpl SGludCgpIGNvbnN0OwogICAgUVNpemUJbWluaW11bVNpemVIaW50KCkgY29uc3Q7CgogICAgdm9p ZAlyZW1vdmVDaGlsZChRT2JqZWN0KiBjaGlsZCk7CgoKICAgIHZpcnR1YWwgdm9pZCBzZXREcmFn QXV0b1Njcm9sbCggYm9vbCBiICk7CiAgICBib29sCSBkcmFnQXV0b1Njcm9sbCgpIGNvbnN0OwoK CnByb3RlY3RlZCA6CiAgICB2b2lkCWNvbnRlbnRzTW92aW5nKGludCB4LCBpbnQgeSk7CgpwdWJs aWMgIDoKICAgIHZpcnR1YWwgdm9pZCByZXNpemVDb250ZW50cyggaW50IHcsIGludCBoICk7CiAg ICB2b2lkCXNjcm9sbEJ5KCBpbnQgZHgsIGludCBkeSApOwogICAgdmlydHVhbCB2b2lkIHNldENv bnRlbnRzUG9zKCBpbnQgeCwgaW50IHkgKTsKICAgIHZvaWQJZW5zdXJlVmlzaWJsZShpbnQgeCwg aW50IHkpOwogICAgdm9pZAllbnN1cmVWaXNpYmxlKGludCB4LCBpbnQgeSwgaW50IHhtYXJnaW4s IGludCB5bWFyZ2luKTsKICAgIHZvaWQJY2VudGVyKGludCB4LCBpbnQgeSk7CiAgICB2b2lkCWNl bnRlcihpbnQgeCwgaW50IHksIGZsb2F0IHhtYXJnaW4sIGZsb2F0IHltYXJnaW4pOwoKICAgIHZv aWQJdXBkYXRlU2Nyb2xsQmFycygpOwogICAgdm9pZAlzZXRFbmFibGVkKCBib29sIGVuYWJsZSAp OwoKcHJvdGVjdGVkOgogICAgdmlydHVhbCB2b2lkIGRyYXdDb250ZW50cyhRUGFpbnRlciosIGlu dCBjeCwgaW50IGN5LCBpbnQgY3csIGludCBjaCk7CiAgICB2aXJ0dWFsIHZvaWQgZHJhd0NvbnRl bnRzT2Zmc2V0KFFQYWludGVyKiwgaW50IG94LCBpbnQgb3ksCgkJICAgIGludCBjeCwgaW50IGN5 LCBpbnQgY3csIGludCBjaCk7CgoKICAgIHZpcnR1YWwgdm9pZCBjb250ZW50c01vdXNlUHJlc3NF dmVudCggUU1vdXNlRXZlbnQqICk7CiAgICB2aXJ0dWFsIHZvaWQgY29udGVudHNNb3VzZVJlbGVh c2VFdmVudCggUU1vdXNlRXZlbnQqICk7CiAgICB2aXJ0dWFsIHZvaWQgY29udGVudHNNb3VzZURv dWJsZUNsaWNrRXZlbnQoIFFNb3VzZUV2ZW50KiApOwogICAgdmlydHVhbCB2b2lkIGNvbnRlbnRz TW91c2VNb3ZlRXZlbnQoIFFNb3VzZUV2ZW50KiApOwoKICAgIHZpcnR1YWwgdm9pZCBjb250ZW50 c0RyYWdFbnRlckV2ZW50KCBRRHJhZ0VudGVyRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIGNv bnRlbnRzRHJhZ01vdmVFdmVudCggUURyYWdNb3ZlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lk IGNvbnRlbnRzRHJhZ0xlYXZlRXZlbnQoIFFEcmFnTGVhdmVFdmVudCAqICk7CiAgICB2aXJ0dWFs IHZvaWQgY29udGVudHNEcm9wRXZlbnQoIFFEcm9wRXZlbnQgKiApOwoKCiAgICB2aXJ0dWFsIHZv aWQgY29udGVudHNXaGVlbEV2ZW50KCBRV2hlZWxFdmVudCAqICk7CgogICAgdmlydHVhbCB2b2lk IGNvbnRlbnRzQ29udGV4dE1lbnVFdmVudCggUUNvbnRleHRNZW51RXZlbnQgKiApOwoKCiAgICB2 aXJ0dWFsIHZvaWQgdmlld3BvcnRQYWludEV2ZW50KCBRUGFpbnRFdmVudCogKTsKICAgIHZpcnR1 YWwgdm9pZCB2aWV3cG9ydFJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQqICk7CiAgICB2aXJ0dWFs IHZvaWQgdmlld3BvcnRNb3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50KiApOwogICAgdmlydHVh bCB2b2lkIHZpZXdwb3J0TW91c2VSZWxlYXNlRXZlbnQoIFFNb3VzZUV2ZW50KiApOwogICAgdmly dHVhbCB2b2lkIHZpZXdwb3J0TW91c2VEb3VibGVDbGlja0V2ZW50KCBRTW91c2VFdmVudCogKTsK ICAgIHZpcnR1YWwgdm9pZCB2aWV3cG9ydE1vdXNlTW92ZUV2ZW50KCBRTW91c2VFdmVudCogKTsK CiAgICB2aXJ0dWFsIHZvaWQgdmlld3BvcnREcmFnRW50ZXJFdmVudCggUURyYWdFbnRlckV2ZW50 ICogKTsKICAgIHZpcnR1YWwgdm9pZCB2aWV3cG9ydERyYWdNb3ZlRXZlbnQoIFFEcmFnTW92ZUV2 ZW50ICogKTsKICAgIHZpcnR1YWwgdm9pZCB2aWV3cG9ydERyYWdMZWF2ZUV2ZW50KCBRRHJhZ0xl YXZlRXZlbnQgKiApOwogICAgdmlydHVhbCB2b2lkIHZpZXdwb3J0RHJvcEV2ZW50KCBRRHJvcEV2 ZW50ICogKTsKCgogICAgdmlydHVhbCB2b2lkIHZpZXdwb3J0V2hlZWxFdmVudCggUVdoZWVsRXZl bnQgKiApOwoKICAgIHZpcnR1YWwgdm9pZCB2aWV3cG9ydENvbnRleHRNZW51RXZlbnQoIFFDb250 ZXh0TWVudUV2ZW50ICogKTsKCiAgICB2b2lkCWZyYW1lQ2hhbmdlZCgpOwoKICAgIHZpcnR1YWwg dm9pZCBzZXRNYXJnaW5zKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20p OwogICAgaW50IGxlZnRNYXJnaW4oKSBjb25zdDsKICAgIGludCB0b3BNYXJnaW4oKSBjb25zdDsK ICAgIGludCByaWdodE1hcmdpbigpIGNvbnN0OwogICAgaW50IGJvdHRvbU1hcmdpbigpIGNvbnN0 OwoKICAgIGJvb2wgZm9jdXNOZXh0UHJldkNoaWxkKCBib29sIG5leHQgKTsKCiAgICB2aXJ0dWFs IHZvaWQgc2V0SEJhckdlb21ldHJ5KFFTY3JvbGxCYXImIGhiYXIsIGludCB4LCBpbnQgeSwgaW50 IHcsIGludCBoKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRWQmFyR2VvbWV0cnkoUVNjcm9sbEJhciYg dmJhciwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpOwoKICAgIHZvaWQJcmVzaXplRXZlbnQo UVJlc2l6ZUV2ZW50Kik7CiAgICB2b2lkIAltb3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50ICog KTsKICAgIHZvaWQgCW1vdXNlUmVsZWFzZUV2ZW50KCBRTW91c2VFdmVudCAqICk7CiAgICB2b2lk IAltb3VzZURvdWJsZUNsaWNrRXZlbnQoIFFNb3VzZUV2ZW50ICogKTsKICAgIHZvaWQgCW1vdXNl TW92ZUV2ZW50KCBRTW91c2VFdmVudCAqICk7CgogICAgdm9pZCAJd2hlZWxFdmVudCggUVdoZWVs RXZlbnQgKiApOwoKICAgIHZvaWQJY29udGV4dE1lbnVFdmVudCggUUNvbnRleHRNZW51RXZlbnQg KiApOwogICAgYm9vbAlldmVudEZpbHRlciggUU9iamVjdCAqLCBRRXZlbnQgKmUgKTsKCgpwcml2 YXRlOgogICAgdm9pZCBkcmF3Q29udGVudHMoIFFQYWludGVyKiApOwogICAgdm9pZCBtb3ZlQ29u dGVudHMoaW50IHgsIGludCB5KTsKCiAgICBRU2Nyb2xsVmlld0RhdGEqIGQ7Cgpwcml2YXRlICA6 CiAgICB2b2lkIGhzbGlkZShpbnQpOwogICAgdm9pZCB2c2xpZGUoaW50KTsKCiAgICB2b2lkIGRv RHJhZ0F1dG9TY3JvbGwoKTsKICAgIHZvaWQgc3RhcnREcmFnQXV0b1Njcm9sbCgpOwogICAgdm9p ZCBzdG9wRHJhZ0F1dG9TY3JvbGwoKTsKCgpwcml2YXRlOgkgCgogICAgUVNjcm9sbFZpZXcoIGNv bnN0IFFTY3JvbGxWaWV3ICYgKTsKICAgIFFTY3JvbGxWaWV3ICZvcGVyYXRvcj0oIGNvbnN0IFFT Y3JvbGxWaWV3ICYgKTsKCiAgICB2b2lkIGNoYW5nZUZyYW1lUmVjdChjb25zdCBRUmVjdCYpOwp9 OwoKCgoKIyA0MiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FjYW52YXMuaCIgMgoKIyAxICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcXBpeG1hcC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFHZng7CmNsYXNzIFFQaXhtYXBQcml2YXRlOwoK CgoKCgoKY2xhc3MgICBRUGl4bWFwIDogcHVibGljIFFQYWludERldmljZSwgcHVibGljIFF0CnsK cHVibGljOgogICAgZW51bSBDb2xvck1vZGUgeyBBdXRvLCBDb2xvciwgTW9ubyB9OwogICAgZW51 bSBPcHRpbWl6YXRpb24geyBEZWZhdWx0T3B0aW0sIE5vT3B0aW0sIE1lbW9yeU9wdGltPU5vT3B0 aW0sCgkJCU5vcm1hbE9wdGltLCBCZXN0T3B0aW0gfTsKCiAgICBRUGl4bWFwKCk7CiAgICBRUGl4 bWFwKCBjb25zdCBRSW1hZ2UmIGltYWdlICk7CiAgICBRUGl4bWFwKCBpbnQgdywgaW50IGgsICBp bnQgZGVwdGggPSAtMSwgT3B0aW1pemF0aW9uID0gRGVmYXVsdE9wdGltICk7CiAgICBRUGl4bWFw KCBjb25zdCBRU2l6ZSAmLCBpbnQgZGVwdGggPSAtMSwgT3B0aW1pemF0aW9uID0gRGVmYXVsdE9w dGltICk7CgogICAgUVBpeG1hcCggY29uc3QgUVN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IGNoYXIg KmZvcm1hdD0wLAoJICAgICBDb2xvck1vZGUgbW9kZT1BdXRvICk7CiAgICBRUGl4bWFwKCBjb25z dCBRU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgY2hhciAqZm9ybWF0LAoJICAgICBpbnQgY29udmVy c2lvbl9mbGFncyApOwogICAgUVBpeG1hcCggY29uc3QgY2hhciAqeHBtW10gKTsgIAogICAgUVBp eG1hcCggY29uc3QgUUJ5dGVBcnJheSAmZGF0YSApOwoKICAgIFFQaXhtYXAoIGNvbnN0IFFQaXht YXAgJiApOwogICB+UVBpeG1hcCgpOwoKICAgIFFQaXhtYXAgICAgJm9wZXJhdG9yPSggY29uc3Qg UVBpeG1hcCAmICk7CiAgICBRUGl4bWFwICAgICZvcGVyYXRvcj0oIGNvbnN0IFFJbWFnZQkgJiAp OwoKICAgIGJvb2wJaXNOdWxsKCkJY29uc3Q7CgogICAgaW50CQl3aWR0aCgpCQljb25zdCB7IHJl dHVybiBkYXRhLT53OyB9CiAgICBpbnQJCWhlaWdodCgpCWNvbnN0IHsgcmV0dXJuIGRhdGEtPmg7 IH0KICAgIFFTaXplCXNpemUoKQkJY29uc3QgeyByZXR1cm4gUVNpemUoZGF0YS0+dyxkYXRhLT5o KTsgfQogICAgUVJlY3QJcmVjdCgpCQljb25zdCB7IHJldHVybiBRUmVjdCgwLDAsZGF0YS0+dyxk YXRhLT5oKTsgfQogICAgaW50CQlkZXB0aCgpCQljb25zdCB7IHJldHVybiBkYXRhLT5kOyB9CiAg ICBzdGF0aWMgaW50CWRlZmF1bHREZXB0aCgpOwoKICAgIHZvaWQJZmlsbCggY29uc3QgUUNvbG9y ICZmaWxsQ29sb3IgPSBRdDo6d2hpdGUgKTsKICAgIHZvaWQJZmlsbCggY29uc3QgUVdpZGdldCAq LCBpbnQgeG9mcywgaW50IHlvZnMgKTsKICAgIHZvaWQJZmlsbCggY29uc3QgUVdpZGdldCAqLCBj b25zdCBRUG9pbnQgJm9mcyApOwogICAgdm9pZAlyZXNpemUoIGludCB3aWR0aCwgaW50IGhlaWdo dCApOwogICAgdm9pZAlyZXNpemUoIGNvbnN0IFFTaXplICYgKTsKCiAgICBjb25zdCBRQml0bWFw ICptYXNrKCkgY29uc3Q7CiAgICB2b2lkCXNldE1hc2soIGNvbnN0IFFCaXRtYXAgJiApOwogICAg Ym9vbAlzZWxmTWFzaygpIGNvbnN0OwoKICAgIFFCaXRtYXAJY3JlYXRlSGV1cmlzdGljTWFzaygg Ym9vbCBjbGlwVGlnaHQgPSBUUlVFICkgY29uc3Q7CgogICAgc3RhdGljICBRUGl4bWFwIGdyYWJX aW5kb3coIFdJZCwgaW50IHg9MCwgaW50IHk9MCwgaW50IHc9LTEsIGludCBoPS0xICk7CiAgICBz dGF0aWMgIFFQaXhtYXAgZ3JhYldpZGdldCggUVdpZGdldCAqIHdpZGdldCwKCQkJCWludCB4PTAs IGludCB5PTAsIGludCB3PS0xLCBpbnQgaD0tMSApOwoKCiAgICBRUGl4bWFwCSAgICB4Rm9ybSgg Y29uc3QgUVdNYXRyaXggJiApIGNvbnN0OwogICAgc3RhdGljIFFXTWF0cml4IHRydWVNYXRyaXgo IGNvbnN0IFFXTWF0cml4ICYsIGludCB3LCBpbnQgaCApOwoKCiAgICBRSW1hZ2UJY29udmVydFRv SW1hZ2UoKSBjb25zdDsKICAgIGJvb2wJY29udmVydEZyb21JbWFnZSggY29uc3QgUUltYWdlICYs IENvbG9yTW9kZSBtb2RlPUF1dG8gKTsKICAgIGJvb2wJY29udmVydEZyb21JbWFnZSggY29uc3Qg UUltYWdlICYsIGludCBjb252ZXJzaW9uX2ZsYWdzICk7CgogICAgc3RhdGljIGNvbnN0IGNoYXIq IGltYWdlRm9ybWF0KCBjb25zdCBRU3RyaW5nICZmaWxlTmFtZSApOwogICAgYm9vbAlsb2FkKCBj b25zdCBRU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgY2hhciAqZm9ybWF0PTAsCgkJICAgICAgQ29s b3JNb2RlIG1vZGU9QXV0byApOwogICAgYm9vbAlsb2FkKCBjb25zdCBRU3RyaW5nJiBmaWxlTmFt ZSwgY29uc3QgY2hhciAqZm9ybWF0LAoJCSAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzICk7CiAg ICBib29sCWxvYWRGcm9tRGF0YSggY29uc3QgdWNoYXIgKmJ1ZiwgdWludCBsZW4sCgkJCSAgICAg IGNvbnN0IGNoYXIqIGZvcm1hdD0wLAoJCQkgICAgICBDb2xvck1vZGUgbW9kZT1BdXRvICk7CiAg ICBib29sCWxvYWRGcm9tRGF0YSggY29uc3QgdWNoYXIgKmJ1ZiwgdWludCBsZW4sCgkJCSAgICAg IGNvbnN0IGNoYXIqIGZvcm1hdCwKCQkJICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3MgKTsKICAg IGJvb2wJbG9hZEZyb21EYXRhKCBjb25zdCBRQnl0ZUFycmF5ICZkYXRhLAoJCQkgICAgICBjb25z dCBjaGFyKiBmb3JtYXQ9MCwKCQkJICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3M9MCApOwogICAg Ym9vbAlzYXZlKCBjb25zdCBRU3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgY2hhciogZm9ybWF0LCBp bnQgcXVhbGl0eSA9IC0xICkgY29uc3Q7CgoKCgoKCiAgICBpbnQJCXNlcmlhbE51bWJlcigpCWNv bnN0OwoKICAgIE9wdGltaXphdGlvbglvcHRpbWl6YXRpb24oKSBjb25zdDsKICAgIHZvaWQJCXNl dE9wdGltaXphdGlvbiggT3B0aW1pemF0aW9uICk7CiAgICBzdGF0aWMgT3B0aW1pemF0aW9uIGRl ZmF1bHRPcHRpbWl6YXRpb24oKTsKICAgIHN0YXRpYyB2b2lkCQlzZXREZWZhdWx0T3B0aW1pemF0 aW9uKCBPcHRpbWl6YXRpb24gKTsKCiAgICB2aXJ0dWFsIHZvaWQgZGV0YWNoKCk7CgogICAgYm9v bAlpc1FCaXRtYXAoKSBjb25zdDsKCiMgMTU2ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXBpeG1h cC5oIgoKCgoKCgoKCgogICAgc3RhdGljIGludCB4MTFTZXREZWZhdWx0U2NyZWVuKCBpbnQgc2Ny ZWVuICk7CiAgICB2b2lkIHgxMVNldFNjcmVlbiggaW50IHNjcmVlbiApOwoKCgoKCgpwcm90ZWN0 ZWQ6CiAgICBRUGl4bWFwKCBpbnQgdywgaW50IGgsIGNvbnN0IHVjaGFyICpkYXRhLCBib29sIGlz WGJpdG1hcCApOwogICAgaW50IG1ldHJpYyggaW50ICkgY29uc3Q7CgoKCgoKCgoKICAgIHN0cnVj dCBRUGl4bWFwRGF0YSA6IHB1YmxpYyBRU2hhcmVkIHsJIAoJUUNPT1JECXcsIGg7CglzaG9ydAlk OwoJdWludAl1bmluaXQJIDogMTsKCXVpbnQJYml0bWFwCSA6IDE7Cgl1aW50CXNlbGZtYXNrIDog MTsKCgoKCWludAlzZXJfbm87CglRQml0bWFwICptYXNrOwojIDIwMyAiL3Vzci9sb2NhbC9xdC9p bmNsdWRlL3FwaXhtYXAuaCIKCgl2b2lkICAgKnhpbWFnZTsKCXZvaWQgICAqbWFza2djOwoJUVBp eG1hcCAqYWxwaGFwbTsKIyAyMTYgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcGl4bWFwLmgiCgoJ T3B0aW1pemF0aW9uIG9wdGltOwogICAgfSAqZGF0YTsKcHJpdmF0ZToKICAgIFFQaXhtYXAoIGlu dCB3LCBpbnQgaCwgaW50IGRlcHRoLCBib29sLCBPcHRpbWl6YXRpb24gKTsKICAgIHZvaWQJaW5p dCggaW50LCBpbnQsIGludCwgYm9vbCwgT3B0aW1pemF0aW9uICk7CiAgICB2b2lkCWRlcmVmKCk7 CiAgICBRUGl4bWFwCWNvcHkoIGJvb2wgaWdub3JlTWFzayA9IEZBTFNFICkgY29uc3Q7CiAgICBz dGF0aWMgT3B0aW1pemF0aW9uIGRlZk9wdGltOwogICAgZnJpZW5kICAgdm9pZCBiaXRCbHQoIFFQ YWludERldmljZSAqLCBpbnQsIGludCwKCQkJCSBjb25zdCBRUGFpbnREZXZpY2UgKiwKCQkJCSBp bnQsIGludCwgaW50LCBpbnQsIFJhc3Rlck9wLCBib29sICk7CiAgICBmcmllbmQgICB2b2lkIGJp dEJsdCggUVBhaW50RGV2aWNlICosIGludCwgaW50LAoJCQkJIGNvbnN0IFFJbWFnZSogc3JjLAoJ CQkJIGludCwgaW50LCBpbnQsIGludCwgaW50IGNvbnZlcnNpb25fZmxhZ3MgKTsKCgogICAgZnJp ZW5kIHZvaWQgcXRfeDExX2NvcHlfYWxwaGFfcGl4bWFwKFFQaXhtYXAgKmRzdCwgY29uc3QgUVBp eG1hcCAqc3JjKTsKICAgIGZyaWVuZCB2b2lkIHF0X3gxMV9ibGl0X2FscGhhX3BpeG1hcChRUGl4 bWFwICpkc3QsIGludCBkeCwgaW50IGR5LAoJCQkJCSBjb25zdCBRUGl4bWFwICpzcmMsIGludCBz eCA9IDAsIGludCBzeSA9IDAsCgkJCQkJIGludCBzdyA9IC0xLCBpbnQgc2ggPSAtMSk7CgoKICAg IGZyaWVuZCBjbGFzcyBRQml0bWFwOwogICAgZnJpZW5kIGNsYXNzIFFQYWludERldmljZTsKICAg IGZyaWVuZCBjbGFzcyBRUGFpbnRlcjsKfTsKCgppbmxpbmUgYm9vbCBRUGl4bWFwOjppc051bGwo KSBjb25zdAp7CiAgICByZXR1cm4gZGF0YS0+dyA9PSAwOwp9CgppbmxpbmUgdm9pZCBRUGl4bWFw OjpmaWxsKCBjb25zdCBRV2lkZ2V0ICp3LCBjb25zdCBRUG9pbnQgJm9mcyApCnsKICAgIGZpbGwo IHcsIG9mcy54KCksIG9mcy55KCkgKTsKfQoKaW5saW5lIHZvaWQgUVBpeG1hcDo6cmVzaXplKCBj b25zdCBRU2l6ZSAmcyApCnsKICAgIHJlc2l6ZSggcy53aWR0aCgpLCBzLmhlaWdodCgpICk7Cn0K CmlubGluZSBjb25zdCBRQml0bWFwICpRUGl4bWFwOjptYXNrKCkgY29uc3QKewogICAgcmV0dXJu IGRhdGEtPm1hc2s7Cn0KCmlubGluZSBib29sIFFQaXhtYXA6OnNlbGZNYXNrKCkgY29uc3QKewog ICAgcmV0dXJuIGRhdGEtPnNlbGZtYXNrOwp9CgoKCgoKCgoKaW5saW5lIGludCBRUGl4bWFwOjpz ZXJpYWxOdW1iZXIoKSBjb25zdAp7CiAgICByZXR1cm4gZGF0YS0+c2VyX25vOwp9CgppbmxpbmUg UVBpeG1hcDo6T3B0aW1pemF0aW9uIFFQaXhtYXA6Om9wdGltaXphdGlvbigpIGNvbnN0CnsKICAg IHJldHVybiBkYXRhLT5vcHRpbTsKfQoKaW5saW5lIGJvb2wgUVBpeG1hcDo6aXNRQml0bWFwKCkg Y29uc3QKewogICAgcmV0dXJuIGRhdGEtPmJpdG1hcDsKfQoKCgoKCgoKCgogCgoKCgogIFFEYXRh U3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRUGl4bWFwICYgKTsKICBR RGF0YVN0cmVhbSAmb3BlcmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUVBpeG1hcCAmICk7CgoKIAoK CgoKCgoKCgpib29sIHF0X3hGb3JtX2hlbHBlciggY29uc3QgUVdNYXRyaXgmLCBpbnQsIGludCwg aW50LCB1Y2hhciosIGludCwgaW50LCBpbnQsIHVjaGFyKiwgaW50LCBpbnQsIGludCApOwoKCgoj IDQzICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWNhbnZhcy5oIiAyCgojIDEgIi91c3IvbG9jYWwv cXQvaW5jbHVkZS9xcHRybGlzdC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FnbGlzdC5oIiAxCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNs dWRlL3FwdHJjb2xsZWN0aW9uLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgpjbGFzcyBRR1ZlY3RvcjsKY2xhc3MgUUdMaXN0OwpjbGFzcyBRR0RpY3Q7CgoK Y2xhc3MgICBRUHRyQ29sbGVjdGlvbgkJCSAKewpwdWJsaWM6CiAgICBib29sIGF1dG9EZWxldGUo KQljb25zdAkgICAgICAgeyByZXR1cm4gZGVsX2l0ZW07IH0KICAgIHZvaWQgc2V0QXV0b0RlbGV0 ZSggYm9vbCBlbmFibGUgKSAgeyBkZWxfaXRlbSA9IGVuYWJsZTsgfQoKICAgIHZpcnR1YWwgdWlu dCAgY291bnQoKSBjb25zdCA9IDA7CiAgICB2aXJ0dWFsIHZvaWQgIGNsZWFyKCkgPSAwOwkJCSAK CiAgICB0eXBlZGVmIHZvaWQgKkl0ZW07CQkJCSAKCnByb3RlY3RlZDoKICAgIFFQdHJDb2xsZWN0 aW9uKCkgeyBkZWxfaXRlbSA9IEZBTFNFOyB9CQkgCiAgICBRUHRyQ29sbGVjdGlvbihjb25zdCBR UHRyQ29sbGVjdGlvbiAmKSB7IGRlbF9pdGVtID0gRkFMU0U7IH0KICAgIHZpcnR1YWwgflFQdHJD b2xsZWN0aW9uKCkge30KCiAgICBib29sIGRlbF9pdGVtOwkJCQkgCgogICAgdmlydHVhbCBJdGVt ICAgICBuZXdJdGVtKCBJdGVtICk7CQkgCiAgICB2aXJ0dWFsIHZvaWQgICAgIGRlbGV0ZUl0ZW0o IEl0ZW0gKSA9IDA7CSAKfTsKCgoKCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZ2xp c3QuaCIgMgoKCgpjbGFzcyAgIFFMTm9kZQp7CmZyaWVuZCBjbGFzcyBRR0xpc3Q7CmZyaWVuZCBj bGFzcyBRR0xpc3RJdGVyYXRvcjsKcHVibGljOgogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZ2V0 RGF0YSgpCXsgcmV0dXJuIGRhdGE7IH0KcHJpdmF0ZToKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVt IGRhdGE7CiAgICBRTE5vZGUgKnByZXY7CiAgICBRTE5vZGUgKm5leHQ7CiAgICBRTE5vZGUoIFFQ dHJDb2xsZWN0aW9uOjpJdGVtIGQgKSB7IGRhdGEgPSBkOyB9Cn07CgpjbGFzcyBRR0xpc3RJdGVy YXRvckxpc3Q7ICAKCmNsYXNzICAgUUdMaXN0IDogcHVibGljIFFQdHJDb2xsZWN0aW9uCSAKewpm cmllbmQgY2xhc3MgUUdMaXN0SXRlcmF0b3I7CmZyaWVuZCBjbGFzcyBRR0xpc3RJdGVyYXRvckxp c3Q7CmZyaWVuZCBjbGFzcyBRR1ZlY3RvcjsJCQkJIApwdWJsaWM6CiAgICB1aW50ICBjb3VudCgp IGNvbnN0OwkJCSAKCgogICAgUURhdGFTdHJlYW0gJnJlYWQoIFFEYXRhU3RyZWFtICYgKTsJCSAK ICAgIFFEYXRhU3RyZWFtICZ3cml0ZSggUURhdGFTdHJlYW0gJiApIGNvbnN0OwkgCgpwcm90ZWN0 ZWQ6CiAgICBRR0xpc3QoKTsJCQkJCSAKICAgIFFHTGlzdCggY29uc3QgUUdMaXN0ICYgKTsJCQkg CiAgICB2aXJ0dWFsIH5RR0xpc3QoKTsKCiAgICBRR0xpc3QgJm9wZXJhdG9yPSggY29uc3QgUUdM aXN0ICYgKTsJIAogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRR0xpc3QmICkgY29uc3Q7Cgog ICAgdm9pZCBpblNvcnQoIFFQdHJDb2xsZWN0aW9uOjpJdGVtICk7CQkgCiAgICB2b2lkIGFwcGVu ZCggUVB0ckNvbGxlY3Rpb246Okl0ZW0gKTsJCSAKICAgIGJvb2wgaW5zZXJ0QXQoIHVpbnQgaW5k ZXgsIFFQdHJDb2xsZWN0aW9uOjpJdGVtICk7ICAKICAgIHZvaWQgcmVsaW5rTm9kZSggUUxOb2Rl ICogKTsJCSAKICAgIGJvb2wgcmVtb3ZlTm9kZSggUUxOb2RlICogKTsJCSAKICAgIGJvb2wgcmVt b3ZlKCBRUHRyQ29sbGVjdGlvbjo6SXRlbSA9IDAgKTsJIAogICAgYm9vbCByZW1vdmVSZWYoIFFQ dHJDb2xsZWN0aW9uOjpJdGVtID0gMCApOwkgCiAgICBib29sIHJlbW92ZUZpcnN0KCk7CQkJCSAK ICAgIGJvb2wgcmVtb3ZlTGFzdCgpOwkJCQkgCiAgICBib29sIHJlbW92ZUF0KCB1aW50IGluZGV4 ICk7CQkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSB0YWtlTm9kZSggUUxOb2RlICogKTsJIAog ICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gdGFrZSgpOwkJCSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJ dGVtIHRha2VBdCggdWludCBpbmRleCApOwkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSB0YWtl Rmlyc3QoKTsJCSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtIHRha2VMYXN0KCk7CQkgCgogICAg dm9pZCBzb3J0KCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgdm9pZCBjbGVhcigpOwkJ CSAKCiAgICBpbnQJIGZpbmRSZWYoIFFQdHJDb2xsZWN0aW9uOjpJdGVtLCBib29sID0gVFJVRSAp OyAgCiAgICBpbnQJIGZpbmQoIFFQdHJDb2xsZWN0aW9uOjpJdGVtLCBib29sID0gVFJVRSApOyAg CgogICAgdWludCBjb250YWluc1JlZiggUVB0ckNvbGxlY3Rpb246Okl0ZW0gKSBjb25zdDsgIAog ICAgdWludCBjb250YWlucyggUVB0ckNvbGxlY3Rpb246Okl0ZW0gKQljb25zdDsJIAoKICAgIFFQ dHJDb2xsZWN0aW9uOjpJdGVtIGF0KCB1aW50IGluZGV4ICk7CQkgCiAgICBpbnQJICBhdCgpIGNv bnN0OwkJCQkgCiAgICBRTE5vZGUgKmN1cnJlbnROb2RlKCkgY29uc3Q7CQkgCgogICAgUVB0ckNv bGxlY3Rpb246Okl0ZW0gZ2V0KCkgY29uc3Q7CQkgCgogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0g Y2ZpcnN0KCkgY29uc3Q7CSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGNsYXN0KCkgIGNvbnN0 OwkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSBmaXJzdCgpOwkJIAogICAgUVB0ckNvbGxlY3Rp b246Okl0ZW0gbGFzdCgpOwkJIAogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gbmV4dCgpOwkJIAog ICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gcHJldigpOwkJIAoKICAgIHZvaWQgIHRvVmVjdG9yKCBR R1ZlY3RvciAqICkgY29uc3Q7CQkgCgogICAgdmlydHVhbCBpbnQgY29tcGFyZUl0ZW1zKCBRUHRy Q29sbGVjdGlvbjo6SXRlbSwgUVB0ckNvbGxlY3Rpb246Okl0ZW0gKTsKCgogICAgdmlydHVhbCBR RGF0YVN0cmVhbSAmcmVhZCggUURhdGFTdHJlYW0gJiwgUVB0ckNvbGxlY3Rpb246Okl0ZW0gJiAp OwogICAgdmlydHVhbCBRRGF0YVN0cmVhbSAmd3JpdGUoIFFEYXRhU3RyZWFtICYsIFFQdHJDb2xs ZWN0aW9uOjpJdGVtICkgY29uc3Q7Cgpwcml2YXRlOgogICAgdm9pZCAgcHJlcGVuZCggUVB0ckNv bGxlY3Rpb246Okl0ZW0gKTsgIAoKICAgIHZvaWQgaGVhcFNvcnRQdXNoRG93biggUVB0ckNvbGxl Y3Rpb246Okl0ZW0qIGhlYXAsIGludCBmaXJzdCwgaW50IGxhc3QgKTsKCiAgICBRTE5vZGUgKmZp cnN0Tm9kZTsJCQkJIAogICAgUUxOb2RlICpsYXN0Tm9kZTsJCQkJIAogICAgUUxOb2RlICpjdXJO b2RlOwkJCQkgCiAgICBpbnQgY3VySW5kZXg7CQkJCSAKICAgIHVpbnQgbnVtTm9kZXM7CQkJCSAK ICAgIFFHTGlzdEl0ZXJhdG9yTGlzdCAqaXRlcmF0b3JzOyAJCQkgCgogICAgUUxOb2RlICpsb2Nh dGUoIHVpbnQgKTsJCQkgCiAgICBRTE5vZGUgKnVubGluaygpOwkJCQkgCn07CgoKaW5saW5lIHVp bnQgUUdMaXN0Ojpjb3VudCgpIGNvbnN0CnsKICAgIHJldHVybiBudW1Ob2RlczsKfQoKaW5saW5l IGJvb2wgUUdMaXN0OjpyZW1vdmVGaXJzdCgpCnsKICAgIGZpcnN0KCk7CiAgICByZXR1cm4gcmVt b3ZlKCk7Cn0KCmlubGluZSBib29sIFFHTGlzdDo6cmVtb3ZlTGFzdCgpCnsKICAgIGxhc3QoKTsK ICAgIHJldHVybiByZW1vdmUoKTsKfQoKaW5saW5lIGludCBRR0xpc3Q6OmF0KCkgY29uc3QKewog ICAgcmV0dXJuIGN1ckluZGV4Owp9CgppbmxpbmUgUVB0ckNvbGxlY3Rpb246Okl0ZW0gUUdMaXN0 OjphdCggdWludCBpbmRleCApCnsKICAgIFFMTm9kZSAqbiA9IGxvY2F0ZSggaW5kZXggKTsKICAg IHJldHVybiBuID8gbi0+ZGF0YSA6IDA7Cn0KCmlubGluZSBRTE5vZGUgKlFHTGlzdDo6Y3VycmVu dE5vZGUoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZTsKfQoKaW5saW5lIFFQdHJDb2xsZWN0 aW9uOjpJdGVtIFFHTGlzdDo6Z2V0KCkgY29uc3QKewogICAgcmV0dXJuIGN1ck5vZGUgPyBjdXJO b2RlLT5kYXRhIDogMDsKfQoKaW5saW5lIFFQdHJDb2xsZWN0aW9uOjpJdGVtIFFHTGlzdDo6Y2Zp cnN0KCkgY29uc3QKewogICAgcmV0dXJuIGZpcnN0Tm9kZSA/IGZpcnN0Tm9kZS0+ZGF0YSA6IDA7 Cn0KCmlubGluZSBRUHRyQ29sbGVjdGlvbjo6SXRlbSBRR0xpc3Q6OmNsYXN0KCkgY29uc3QKewog ICAgcmV0dXJuIGxhc3ROb2RlID8gbGFzdE5vZGUtPmRhdGEgOiAwOwp9CgoKIAoKCgoKICBRRGF0 YVN0cmVhbSAmb3BlcmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUUdMaXN0ICYgKTsKICBRRGF0YVN0 cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUUdMaXN0ICYgKTsKCgogCgoK CmNsYXNzICAgUUdMaXN0SXRlcmF0b3IJCQkgCnsKZnJpZW5kIGNsYXNzIFFHTGlzdDsKZnJpZW5k IGNsYXNzIFFHTGlzdEl0ZXJhdG9yTGlzdDsKcHJvdGVjdGVkOgogICAgUUdMaXN0SXRlcmF0b3Io IGNvbnN0IFFHTGlzdCAmICk7CiAgICBRR0xpc3RJdGVyYXRvciggY29uc3QgUUdMaXN0SXRlcmF0 b3IgJiApOwogICAgUUdMaXN0SXRlcmF0b3IgJm9wZXJhdG9yPSggY29uc3QgUUdMaXN0SXRlcmF0 b3IgJiApOwogICB+UUdMaXN0SXRlcmF0b3IoKTsKCiAgICBib29sICBhdEZpcnN0KCkgY29uc3Q7 CQkJIAogICAgYm9vbCAgYXRMYXN0KCkgIGNvbnN0OwkJCSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJ dGVtCSAgdG9GaXJzdCgpOwkJCQkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbQkgIHRvTGFzdCgp OwkJCQkgCgogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0JICBnZXQoKSBjb25zdDsJCQkJIAogICAg UVB0ckNvbGxlY3Rpb246Okl0ZW0JICBvcGVyYXRvcigpKCk7CQkJCSAKICAgIFFQdHJDb2xsZWN0 aW9uOjpJdGVtCSAgb3BlcmF0b3IrKygpOwkJCQkgCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbQkg IG9wZXJhdG9yKz0odWludCk7CQkJIAogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0JICBvcGVyYXRv ci0tKCk7CQkJCSAKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtCSAgb3BlcmF0b3ItPSh1aW50KTsJ CQkgCgpwcm90ZWN0ZWQ6CiAgICBRR0xpc3QgKmxpc3Q7CQkJCSAKCnByaXZhdGU6CiAgICBRTE5v ZGUgICpjdXJOb2RlOwkJCQkgCn07CgoKaW5saW5lIGJvb2wgUUdMaXN0SXRlcmF0b3I6OmF0Rmly c3QoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA9PSBsaXN0LT5maXJzdE5vZGU7Cn0KCmlu bGluZSBib29sIFFHTGlzdEl0ZXJhdG9yOjphdExhc3QoKSBjb25zdAp7CiAgICByZXR1cm4gY3Vy Tm9kZSA9PSBsaXN0LT5sYXN0Tm9kZTsKfQoKaW5saW5lIFFQdHJDb2xsZWN0aW9uOjpJdGVtIFFH TGlzdEl0ZXJhdG9yOjpnZXQoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA/IGN1ck5vZGUt PmRhdGEgOiAwOwp9CgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xcHRybGlzdC5oIiAy CgoKCgp0ZW1wbGF0ZTxjbGFzcyB0eXBlPiAKY2xhc3MgUVB0ckxpc3QKCgoKCTogcHVibGljIFFH TGlzdAoKewpwdWJsaWM6CiAgICBRUHRyTGlzdCgpCQkJCXt9CiAgICBRUHRyTGlzdCggY29uc3Qg UVB0ckxpc3Q8dHlwZT4gJmwgKSA6IFFHTGlzdChsKSB7fQogICAgflFQdHJMaXN0KCkJCQkJeyBj bGVhcigpOyB9CiAgICBRUHRyTGlzdDx0eXBlPiAmb3BlcmF0b3I9KGNvbnN0IFFQdHJMaXN0PHR5 cGU+ICZsKQoJCQl7IHJldHVybiAoUVB0ckxpc3Q8dHlwZT4mKVFHTGlzdDo6b3BlcmF0b3I9KGwp OyB9CiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0IFFQdHJMaXN0PHR5cGU+ICZsaXN0ICkgY29u c3QKICAgIHsgcmV0dXJuIFFHTGlzdDo6b3BlcmF0b3I9PSggbGlzdCApOyB9CiAgICB1aW50ICBj b3VudCgpICAgY29uc3QJCXsgcmV0dXJuIFFHTGlzdDo6Y291bnQoKTsgfQogICAgYm9vbCAgaXNF bXB0eSgpIGNvbnN0CQl7IHJldHVybiBRR0xpc3Q6OmNvdW50KCkgPT0gMDsgfQogICAgYm9vbCAg aW5zZXJ0KCB1aW50IGksIGNvbnN0IHR5cGUgKmQpeyByZXR1cm4gUUdMaXN0OjppbnNlcnRBdChp LChRUHRyQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgdm9pZCAgaW5Tb3J0KCBjb25zdCB0eXBl ICpkICkJeyBRR0xpc3Q6OmluU29ydCgoUVB0ckNvbGxlY3Rpb246Okl0ZW0pZCk7IH0KICAgIHZv aWQgIHByZXBlbmQoIGNvbnN0IHR5cGUgKmQgKQl7IFFHTGlzdDo6aW5zZXJ0QXQoMCwoUVB0ckNv bGxlY3Rpb246Okl0ZW0pZCk7IH0KICAgIHZvaWQgIGFwcGVuZCggY29uc3QgdHlwZSAqZCApCXsg UUdMaXN0OjphcHBlbmQoKFFQdHJDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAgICBib29sICByZW1v dmUoIHVpbnQgaSApCQl7IHJldHVybiBRR0xpc3Q6OnJlbW92ZUF0KGkpOyB9CiAgICBib29sICBy ZW1vdmUoKQkJCXsgcmV0dXJuIFFHTGlzdDo6cmVtb3ZlKChRUHRyQ29sbGVjdGlvbjo6SXRlbSkw KTsgfQogICAgYm9vbCAgcmVtb3ZlKCBjb25zdCB0eXBlICpkICkJeyByZXR1cm4gUUdMaXN0Ojpy ZW1vdmUoKFFQdHJDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAgICBib29sICByZW1vdmVSZWYoIGNv bnN0IHR5cGUgKmQgKQl7IHJldHVybiBRR0xpc3Q6OnJlbW92ZVJlZigoUVB0ckNvbGxlY3Rpb246 Okl0ZW0pZCk7IH0KICAgIHZvaWQgIHJlbW92ZU5vZGUoIFFMTm9kZSAqbiApCXsgUUdMaXN0Ojpy ZW1vdmVOb2RlKG4pOyB9CiAgICBib29sICByZW1vdmVGaXJzdCgpCQkJeyByZXR1cm4gUUdMaXN0 OjpyZW1vdmVGaXJzdCgpOyB9CiAgICBib29sICByZW1vdmVMYXN0KCkJCQl7IHJldHVybiBRR0xp c3Q6OnJlbW92ZUxhc3QoKTsgfQogICAgdHlwZSAqdGFrZSggdWludCBpICkJCXsgcmV0dXJuICh0 eXBlICopUUdMaXN0Ojp0YWtlQXQoaSk7IH0KICAgIHR5cGUgKnRha2UoKQkJCXsgcmV0dXJuICh0 eXBlICopUUdMaXN0Ojp0YWtlKCk7IH0KICAgIHR5cGUgKnRha2VOb2RlKCBRTE5vZGUgKm4gKQkJ eyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6OnRha2VOb2RlKG4pOyB9CiAgICB2b2lkICBjbGVhcigp CQkJeyBRR0xpc3Q6OmNsZWFyKCk7IH0KICAgIHZvaWQgIHNvcnQoKQkJCXsgUUdMaXN0Ojpzb3J0 KCk7IH0KICAgIGludAkgIGZpbmQoIGNvbnN0IHR5cGUgKmQgKQkJeyByZXR1cm4gUUdMaXN0Ojpm aW5kKChRUHRyQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgaW50CSAgZmluZE5leHQoIGNvbnN0 IHR5cGUgKmQgKQl7IHJldHVybiBRR0xpc3Q6OmZpbmQoKFFQdHJDb2xsZWN0aW9uOjpJdGVtKWQs RkFMU0UpOyB9CiAgICBpbnQJICBmaW5kUmVmKCBjb25zdCB0eXBlICpkICkJeyByZXR1cm4gUUdM aXN0OjpmaW5kUmVmKChRUHRyQ29sbGVjdGlvbjo6SXRlbSlkKTsgfQogICAgaW50CSAgZmluZE5l eHRSZWYoIGNvbnN0IHR5cGUgKmQgKXsgcmV0dXJuIFFHTGlzdDo6ZmluZFJlZigoUVB0ckNvbGxl Y3Rpb246Okl0ZW0pZCxGQUxTRSk7fQogICAgdWludCAgY29udGFpbnMoIGNvbnN0IHR5cGUgKmQg KSBjb25zdCB7IHJldHVybiBRR0xpc3Q6OmNvbnRhaW5zKChRUHRyQ29sbGVjdGlvbjo6SXRlbSlk KTsgfQogICAgdWludCAgY29udGFpbnNSZWYoIGNvbnN0IHR5cGUgKmQgKSBjb25zdAoJCQkJCXsg cmV0dXJuIFFHTGlzdDo6Y29udGFpbnNSZWYoKFFQdHJDb2xsZWN0aW9uOjpJdGVtKWQpOyB9CiAg ICB0eXBlICphdCggdWludCBpICkJCQl7IHJldHVybiAodHlwZSAqKVFHTGlzdDo6YXQoaSk7IH0K ICAgIGludAkgIGF0KCkgY29uc3QJCQl7IHJldHVybiBRR0xpc3Q6OmF0KCk7IH0KICAgIHR5cGUg KmN1cnJlbnQoKSAgY29uc3QJCXsgcmV0dXJuICh0eXBlICopUUdMaXN0OjpnZXQoKTsgfQogICAg UUxOb2RlICpjdXJyZW50Tm9kZSgpICBjb25zdAl7IHJldHVybiBRR0xpc3Q6OmN1cnJlbnROb2Rl KCk7IH0KICAgIHR5cGUgKmdldEZpcnN0KCkgY29uc3QJCXsgcmV0dXJuICh0eXBlICopUUdMaXN0 OjpjZmlyc3QoKTsgfQogICAgdHlwZSAqZ2V0TGFzdCgpICBjb25zdAkJeyByZXR1cm4gKHR5cGUg KilRR0xpc3Q6OmNsYXN0KCk7IH0KICAgIHR5cGUgKmZpcnN0KCkJCQl7IHJldHVybiAodHlwZSAq KVFHTGlzdDo6Zmlyc3QoKTsgfQogICAgdHlwZSAqbGFzdCgpCQkJeyByZXR1cm4gKHR5cGUgKilR R0xpc3Q6Omxhc3QoKTsgfQogICAgdHlwZSAqbmV4dCgpCQkJeyByZXR1cm4gKHR5cGUgKilRR0xp c3Q6Om5leHQoKTsgfQogICAgdHlwZSAqcHJldigpCQkJeyByZXR1cm4gKHR5cGUgKilRR0xpc3Q6 OnByZXYoKTsgfQogICAgdm9pZCAgdG9WZWN0b3IoIFFHVmVjdG9yICp2ZWMgKWNvbnN0eyBRR0xp c3Q6OnRvVmVjdG9yKHZlYyk7IH0KCgoKCgoKCgpwcml2YXRlOgogICAgdm9pZCAgZGVsZXRlSXRl bSggSXRlbSBkICk7Cn07CgoKdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBRUHRyTGlzdDx2b2lkPjo6 ZGVsZXRlSXRlbSggUVB0ckNvbGxlY3Rpb246Okl0ZW0gKQp7Cn0KCgp0ZW1wbGF0ZTxjbGFzcyB0 eXBlPiBpbmxpbmUgdm9pZCBRUHRyTGlzdDx0eXBlPjo6ZGVsZXRlSXRlbSggUVB0ckNvbGxlY3Rp b246Okl0ZW0gZCApCnsKICAgIGlmICggZGVsX2l0ZW0gKSBkZWxldGUgKHR5cGUgKilkOwp9Cgp0 ZW1wbGF0ZTxjbGFzcyB0eXBlPiAKY2xhc3MgUVB0ckxpc3RJdGVyYXRvcgo6IHB1YmxpYyBRR0xp c3RJdGVyYXRvcgp7CnB1YmxpYzoKICAgIFFQdHJMaXN0SXRlcmF0b3IoY29uc3QgUVB0ckxpc3Q8 dHlwZT4gJmwpIDpRR0xpc3RJdGVyYXRvcigoUUdMaXN0ICYpbCkge30KICAgflFQdHJMaXN0SXRl cmF0b3IoKQkgICAgICB7fQogICAgdWludCAgY291bnQoKSAgIGNvbnN0ICAgICB7IHJldHVybiBs aXN0LT5jb3VudCgpOyB9CiAgICBib29sICBpc0VtcHR5KCkgY29uc3QgICAgIHsgcmV0dXJuIGxp c3QtPmNvdW50KCkgPT0gMDsgfQogICAgYm9vbCAgYXRGaXJzdCgpIGNvbnN0ICAgICB7IHJldHVy biBRR0xpc3RJdGVyYXRvcjo6YXRGaXJzdCgpOyB9CiAgICBib29sICBhdExhc3QoKSAgY29uc3Qg ICAgIHsgcmV0dXJuIFFHTGlzdEl0ZXJhdG9yOjphdExhc3QoKTsgfQogICAgdHlwZSAqdG9GaXJz dCgpCSAgICAgIHsgcmV0dXJuICh0eXBlICopUUdMaXN0SXRlcmF0b3I6OnRvRmlyc3QoKTsgfQog ICAgdHlwZSAqdG9MYXN0KCkJICAgICAgeyByZXR1cm4gKHR5cGUgKilRR0xpc3RJdGVyYXRvcjo6 dG9MYXN0KCk7IH0KICAgIG9wZXJhdG9yIHR5cGUgKigpIGNvbnN0ICAgeyByZXR1cm4gKHR5cGUg KilRR0xpc3RJdGVyYXRvcjo6Z2V0KCk7IH0KICAgIHR5cGUgKm9wZXJhdG9yKigpICAgICAgICAg eyByZXR1cm4gKHR5cGUgKilRR0xpc3RJdGVyYXRvcjo6Z2V0KCk7IH0KCiAgICAgCiAgICAgCiAg ICAgCiAgICAgCiAgICAgCgogICAgdHlwZSAqY3VycmVudCgpICAgY29uc3QgICB7IHJldHVybiAo dHlwZSAqKVFHTGlzdEl0ZXJhdG9yOjpnZXQoKTsgfQogICAgdHlwZSAqb3BlcmF0b3IoKSgpCSAg ICAgIHsgcmV0dXJuICh0eXBlICopUUdMaXN0SXRlcmF0b3I6Om9wZXJhdG9yKCkoKTt9CiAgICB0 eXBlICpvcGVyYXRvcisrKCkJICAgICAgeyByZXR1cm4gKHR5cGUgKilRR0xpc3RJdGVyYXRvcjo6 b3BlcmF0b3IrKygpOyB9CiAgICB0eXBlICpvcGVyYXRvcis9KHVpbnQgaikgIHsgcmV0dXJuICh0 eXBlICopUUdMaXN0SXRlcmF0b3I6Om9wZXJhdG9yKz0oaik7fQogICAgdHlwZSAqb3BlcmF0b3It LSgpCSAgICAgIHsgcmV0dXJuICh0eXBlICopUUdMaXN0SXRlcmF0b3I6Om9wZXJhdG9yLS0oKTsg fQogICAgdHlwZSAqb3BlcmF0b3ItPSh1aW50IGopICB7IHJldHVybiAodHlwZSAqKVFHTGlzdEl0 ZXJhdG9yOjpvcGVyYXRvci09KGopO30KICAgIFFQdHJMaXN0SXRlcmF0b3I8dHlwZT4mIG9wZXJh dG9yPShjb25zdCBRUHRyTGlzdEl0ZXJhdG9yPHR5cGU+Jml0KQoJCQkgICAgICB7IFFHTGlzdEl0 ZXJhdG9yOjpvcGVyYXRvcj0oaXQpOyByZXR1cm4gKnRoaXM7IH0KfTsKCgoKCgoKCiMgNDQgIi91 c3IvbG9jYWwvcXQvaW5jbHVkZS9xY2FudmFzLmgiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNs dWRlL3FwdHJkaWN0LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWdkaWN0LmgiIDEKIAoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFHRGljdEl0ZXJhdG9yOwpjbGFz cyBRR0RJdExpc3Q7CgoKY2xhc3MgUUJhc2VCdWNrZXQJCQkJIAp7CnB1YmxpYzoKICAgIFFQdHJD b2xsZWN0aW9uOjpJdGVtCSBnZXREYXRhKCkJCQl7IHJldHVybiBkYXRhOyB9CiAgICBRUHRyQ29s bGVjdGlvbjo6SXRlbQkgc2V0RGF0YSggUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCApIHsgcmV0dXJu IGRhdGEgPSBkOyB9CiAgICBRQmFzZUJ1Y2tldAkJKmdldE5leHQoKQkJCXsgcmV0dXJuIG5leHQ7 IH0KICAgIHZvaWQJCSBzZXROZXh0KCBRQmFzZUJ1Y2tldCAqbikJeyBuZXh0ID0gbjsgfQpwcm90 ZWN0ZWQ6CiAgICBRQmFzZUJ1Y2tldCggUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCwgUUJhc2VCdWNr ZXQgKm4gKSA6IGRhdGEoZCksIG5leHQobikge30KICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtCSBk YXRhOwogICAgUUJhc2VCdWNrZXQJCSpuZXh0Owp9OwoKY2xhc3MgUVN0cmluZ0J1Y2tldCA6IHB1 YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoKICAgIFFTdHJpbmdCdWNrZXQoIGNvbnN0IFFTdHJp bmcgJmssIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGQsIFFCYXNlQnVja2V0ICpuICkKCTogUUJhc2VC dWNrZXQoZCxuKSwga2V5KGspCQl7fQogICAgY29uc3QgUVN0cmluZyAgJmdldEtleSgpIGNvbnN0 CQl7IHJldHVybiBrZXk7IH0KcHJpdmF0ZToKICAgIFFTdHJpbmcJICAgIGtleTsKfTsKCmNsYXNz IFFBc2NpaUJ1Y2tldCA6IHB1YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoKICAgIFFBc2NpaUJ1 Y2tldCggY29uc3QgY2hhciAqaywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCwgUUJhc2VCdWNrZXQg Km4gKQoJOiBRQmFzZUJ1Y2tldChkLG4pLCBrZXkoaykge30KICAgIGNvbnN0IGNoYXIgKmdldEtl eSgpIGNvbnN0IHsgcmV0dXJuIGtleTsgfQpwcml2YXRlOgogICAgY29uc3QgY2hhciAqa2V5Owp9 OwoKY2xhc3MgUUludEJ1Y2tldCA6IHB1YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoKICAgIFFJ bnRCdWNrZXQoIGxvbmcgaywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCwgUUJhc2VCdWNrZXQgKm4g KQoJOiBRQmFzZUJ1Y2tldChkLG4pLCBrZXkoaykge30KICAgIGxvbmcgIGdldEtleSgpIGNvbnN0 IHsgcmV0dXJuIGtleTsgfQpwcml2YXRlOgogICAgbG9uZyAga2V5Owp9OwoKY2xhc3MgUVB0ckJ1 Y2tldCA6IHB1YmxpYyBRQmFzZUJ1Y2tldAp7CnB1YmxpYzoKICAgIFFQdHJCdWNrZXQoIHZvaWQg KmssIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGQsIFFCYXNlQnVja2V0ICpuICkKCTogUUJhc2VCdWNr ZXQoZCxuKSwga2V5KGspIHt9CiAgICB2b2lkICpnZXRLZXkoKSBjb25zdCB7IHJldHVybiBrZXk7 IH0KcHJpdmF0ZToKICAgIHZvaWQgKmtleTsKfTsKCgpjbGFzcyAgIFFHRGljdCA6IHB1YmxpYyBR UHRyQ29sbGVjdGlvbgkgCnsKcHVibGljOgogICAgdWludAljb3VudCgpIGNvbnN0CXsgcmV0dXJu IG51bUl0ZW1zOyB9CiAgICB1aW50CXNpemUoKQljb25zdAl7IHJldHVybiB2bGVuOyB9CiAgICBR UHRyQ29sbGVjdGlvbjo6SXRlbSBsb29rX3N0cmluZyggY29uc3QgUVN0cmluZyYga2V5LCBRUHRy Q29sbGVjdGlvbjo6SXRlbSwKCQkJCSAgIGludCApOwogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0g bG9va19hc2NpaSggY29uc3QgY2hhciAqa2V5LCBRUHRyQ29sbGVjdGlvbjo6SXRlbSwgaW50ICk7 CiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSBsb29rX2ludCggbG9uZyBrZXksIFFQdHJDb2xsZWN0 aW9uOjpJdGVtLCBpbnQgKTsKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGxvb2tfcHRyKCB2b2lk ICprZXksIFFQdHJDb2xsZWN0aW9uOjpJdGVtLCBpbnQgKTsKCiAgICBRRGF0YVN0cmVhbSAmcmVh ZCggUURhdGFTdHJlYW0gJiApOwogICAgUURhdGFTdHJlYW0gJndyaXRlKCBRRGF0YVN0cmVhbSAm ICkgY29uc3Q7Cgpwcm90ZWN0ZWQ6CiAgICBlbnVtIEtleVR5cGUgeyBTdHJpbmdLZXksIEFzY2lp S2V5LCBJbnRLZXksIFB0cktleSB9OwoKICAgIFFHRGljdCggdWludCBsZW4sIEtleVR5cGUga3Qs IGJvb2wgY3MsIGJvb2wgY2sgKTsKICAgIFFHRGljdCggY29uc3QgUUdEaWN0ICYgKTsKICAgflFH RGljdCgpOwoKICAgIFFHRGljdCAgICAgJm9wZXJhdG9yPSggY29uc3QgUUdEaWN0ICYgKTsKCiAg ICBib29sCXJlbW92ZV9zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJmtleSwgUVB0ckNvbGxlY3Rpb246 Okl0ZW0gaXRlbT0wICk7CiAgICBib29sCXJlbW92ZV9hc2NpaSggY29uc3QgY2hhciAqa2V5LCBR UHRyQ29sbGVjdGlvbjo6SXRlbSBpdGVtPTAgKTsKICAgIGJvb2wJcmVtb3ZlX2ludCggbG9uZyBr ZXksIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGl0ZW09MCApOwogICAgYm9vbAlyZW1vdmVfcHRyKCB2 b2lkICprZXksIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGl0ZW09MCApOwogICAgUVB0ckNvbGxlY3Rp b246Okl0ZW0gdGFrZV9zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJmtleSApOwogICAgUVB0ckNvbGxl Y3Rpb246Okl0ZW0gdGFrZV9hc2NpaSggY29uc3QgY2hhciAqa2V5ICk7CiAgICBRUHRyQ29sbGVj dGlvbjo6SXRlbSB0YWtlX2ludCggbG9uZyBrZXkgKTsKICAgIFFQdHJDb2xsZWN0aW9uOjpJdGVt IHRha2VfcHRyKCB2b2lkICprZXkgKTsKCiAgICB2b2lkCWNsZWFyKCk7CiAgICB2b2lkCXJlc2l6 ZSggdWludCApOwoKICAgIGludAkJaGFzaEtleVN0cmluZyggY29uc3QgUVN0cmluZyAmICk7CiAg ICBpbnQJCWhhc2hLZXlBc2NpaSggY29uc3QgY2hhciAqICk7CgogICAgdm9pZAlzdGF0aXN0aWNz KCkgY29uc3Q7CgoKICAgIHZpcnR1YWwgUURhdGFTdHJlYW0gJnJlYWQoIFFEYXRhU3RyZWFtICYs IFFQdHJDb2xsZWN0aW9uOjpJdGVtICYgKTsKICAgIHZpcnR1YWwgUURhdGFTdHJlYW0gJndyaXRl KCBRRGF0YVN0cmVhbSAmLCBRUHRyQ29sbGVjdGlvbjo6SXRlbSApIGNvbnN0OwoKcHJpdmF0ZToK ICAgIFFCYXNlQnVja2V0ICoqdmVjOwogICAgdWludAl2bGVuOwogICAgdWludAludW1JdGVtczsK ICAgIHVpbnQJa2V5dHlwZQk6IDI7CiAgICB1aW50CWNhc2VzCTogMTsKICAgIHVpbnQJY29weWsJ OiAxOwogICAgUUdESXRMaXN0ICAqaXRlcmF0b3JzOwogICAgdm9pZAkgICB1bmxpbmtfY29tbW9u KCBpbnQsIFFCYXNlQnVja2V0ICosIFFCYXNlQnVja2V0ICogKTsKICAgIFFTdHJpbmdCdWNrZXQg KnVubGlua19zdHJpbmcoIGNvbnN0IFFTdHJpbmcgJiwKCQkJCSAgUVB0ckNvbGxlY3Rpb246Okl0 ZW0gaXRlbSA9IDAgKTsKICAgIFFBc2NpaUJ1Y2tldCAgKnVubGlua19hc2NpaSggY29uc3QgY2hh ciAqLCBRUHRyQ29sbGVjdGlvbjo6SXRlbSBpdGVtID0gMCApOwogICAgUUludEJ1Y2tldCAgICAq dW5saW5rX2ludCggbG9uZywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gaXRlbSA9IDAgKTsKICAgIFFQ dHJCdWNrZXQgICAgKnVubGlua19wdHIoIHZvaWQgKiwgUVB0ckNvbGxlY3Rpb246Okl0ZW0gaXRl bSA9IDAgKTsKICAgIHZvaWQJaW5pdCggdWludCwgS2V5VHlwZSwgYm9vbCwgYm9vbCApOwogICAg ZnJpZW5kIGNsYXNzIFFHRGljdEl0ZXJhdG9yOwp9OwoKCmNsYXNzICAgUUdEaWN0SXRlcmF0b3IJ CQkgCnsKZnJpZW5kIGNsYXNzIFFHRGljdDsKcHVibGljOgogICAgUUdEaWN0SXRlcmF0b3IoIGNv bnN0IFFHRGljdCAmICk7CiAgICBRR0RpY3RJdGVyYXRvciggY29uc3QgUUdEaWN0SXRlcmF0b3Ig JiApOwogICAgUUdEaWN0SXRlcmF0b3IgJm9wZXJhdG9yPSggY29uc3QgUUdEaWN0SXRlcmF0b3Ig JiApOwogICB+UUdEaWN0SXRlcmF0b3IoKTsKCiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSB0b0Zp cnN0KCk7CgogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZ2V0KCkJICAgICBjb25zdDsKICAgIFFT dHJpbmcJICAgICAgZ2V0S2V5U3RyaW5nKCkgY29uc3Q7CiAgICBjb25zdCBjaGFyCSAgICAgKmdl dEtleUFzY2lpKCkgIGNvbnN0OwogICAgbG9uZwkgICAgICBnZXRLZXlJbnQoKSAgICBjb25zdDsK ICAgIHZvaWQJICAgICAqZ2V0S2V5UHRyKCkgICAgY29uc3Q7CgogICAgUVB0ckNvbGxlY3Rpb246 Okl0ZW0gb3BlcmF0b3IoKSgpOwogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gb3BlcmF0b3IrKygp OwogICAgUVB0ckNvbGxlY3Rpb246Okl0ZW0gb3BlcmF0b3IrPSh1aW50KTsKCnByb3RlY3RlZDoK ICAgIFFHRGljdAkgICAgICpkaWN0OwoKcHJpdmF0ZToKICAgIFFCYXNlQnVja2V0ICAgICAgKmN1 ck5vZGU7CiAgICB1aW50CSAgICAgIGN1ckluZGV4Owp9OwoKaW5saW5lIFFQdHJDb2xsZWN0aW9u OjpJdGVtIFFHRGljdEl0ZXJhdG9yOjpnZXQoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA/ IGN1ck5vZGUtPmdldERhdGEoKSA6IDA7Cn0KCmlubGluZSBRU3RyaW5nIFFHRGljdEl0ZXJhdG9y OjpnZXRLZXlTdHJpbmcoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9kZSA/ICgoUVN0cmluZ0J1 Y2tldCopY3VyTm9kZSktPmdldEtleSgpIDogUVN0cmluZzo6bnVsbDsKfQoKaW5saW5lIGNvbnN0 IGNoYXIgKlFHRGljdEl0ZXJhdG9yOjpnZXRLZXlBc2NpaSgpIGNvbnN0CnsKICAgIHJldHVybiBj dXJOb2RlID8gKChRQXNjaWlCdWNrZXQqKWN1ck5vZGUpLT5nZXRLZXkoKSA6IDA7Cn0KCmlubGlu ZSBsb25nIFFHRGljdEl0ZXJhdG9yOjpnZXRLZXlJbnQoKSBjb25zdAp7CiAgICByZXR1cm4gY3Vy Tm9kZSA/ICgoUUludEJ1Y2tldCopY3VyTm9kZSktPmdldEtleSgpIDogMDsKfQoKaW5saW5lIHZv aWQgKlFHRGljdEl0ZXJhdG9yOjpnZXRLZXlQdHIoKSBjb25zdAp7CiAgICByZXR1cm4gY3VyTm9k ZSA/ICgoUVB0ckJ1Y2tldCopY3VyTm9kZSktPmdldEtleSgpIDogMDsKfQoKCgojIDQyICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcXB0cmRpY3QuaCIgMgoKCgp0ZW1wbGF0ZTxjbGFzcyB0eXBlPgpj bGFzcyBRUHRyRGljdAoKCgoJOiBwdWJsaWMgUUdEaWN0Cgp7CnB1YmxpYzoKICAgIFFQdHJEaWN0 KGludCBzaXplPTE3KSA6IFFHRGljdChzaXplLFB0cktleSwwLDApIHt9CiAgICBRUHRyRGljdCgg Y29uc3QgUVB0ckRpY3Q8dHlwZT4gJmQgKSA6IFFHRGljdChkKSB7fQogICB+UVB0ckRpY3QoKQkJ CQl7IGNsZWFyKCk7IH0KICAgIFFQdHJEaWN0PHR5cGU+ICZvcGVyYXRvcj0oY29uc3QgUVB0ckRp Y3Q8dHlwZT4gJmQpCgkJCXsgcmV0dXJuIChRUHRyRGljdDx0eXBlPiYpUUdEaWN0OjpvcGVyYXRv cj0oZCk7IH0KICAgIHVpbnQgIGNvdW50KCkgICBjb25zdAkJeyByZXR1cm4gUUdEaWN0Ojpjb3Vu dCgpOyB9CiAgICB1aW50ICBzaXplKCkgICAgY29uc3QJCXsgcmV0dXJuIFFHRGljdDo6c2l6ZSgp OyB9CiAgICBib29sICBpc0VtcHR5KCkgY29uc3QJCXsgcmV0dXJuIFFHRGljdDo6Y291bnQoKSA9 PSAwOyB9CiAgICB2b2lkICBpbnNlcnQoIHZvaWQgKmssIGNvbnN0IHR5cGUgKmQgKQoJCQkJCXsg UUdEaWN0Ojpsb29rX3B0cihrLChJdGVtKWQsMSk7IH0KICAgIHZvaWQgIHJlcGxhY2UoIHZvaWQg KmssIGNvbnN0IHR5cGUgKmQgKQoJCQkJCXsgUUdEaWN0Ojpsb29rX3B0cihrLChJdGVtKWQsMik7 IH0KICAgIGJvb2wgIHJlbW92ZSggdm9pZCAqayApCQl7IHJldHVybiBRR0RpY3Q6OnJlbW92ZV9w dHIoayk7IH0KICAgIHR5cGUgKnRha2UoIHZvaWQgKmsgKQkJeyByZXR1cm4gKHR5cGUqKVFHRGlj dDo6dGFrZV9wdHIoayk7IH0KICAgIHR5cGUgKmZpbmQoIHZvaWQgKmsgKSBjb25zdAoJCXsgcmV0 dXJuICh0eXBlICopKChRR0RpY3QqKXRoaXMpLT5RR0RpY3Q6Omxvb2tfcHRyKGssMCwwKTsgfQog ICAgdHlwZSAqb3BlcmF0b3JbXSggdm9pZCAqayApIGNvbnN0CgkJeyByZXR1cm4gKHR5cGUgKiko KFFHRGljdCopdGhpcyktPlFHRGljdDo6bG9va19wdHIoaywwLDApOyB9CiAgICB2b2lkICBjbGVh cigpCQkJeyBRR0RpY3Q6OmNsZWFyKCk7IH0KICAgIHZvaWQgIHJlc2l6ZSggdWludCBuICkJCXsg UUdEaWN0OjpyZXNpemUobik7IH0KICAgIHZvaWQgIHN0YXRpc3RpY3MoKSBjb25zdAkJeyBRR0Rp Y3Q6OnN0YXRpc3RpY3MoKTsgfQoKCgoKCgoKcHJpdmF0ZToKICAgIHZvaWQgIGRlbGV0ZUl0ZW0o IEl0ZW0gZCApOwp9OwoKCnRlbXBsYXRlPD4gaW5saW5lIHZvaWQgUVB0ckRpY3Q8dm9pZD46OmRl bGV0ZUl0ZW0oIFFQdHJDb2xsZWN0aW9uOjpJdGVtICkKewp9CgoKdGVtcGxhdGU8Y2xhc3MgdHlw ZT4KaW5saW5lIHZvaWQgUVB0ckRpY3Q8dHlwZT46OmRlbGV0ZUl0ZW0oIFFQdHJDb2xsZWN0aW9u OjpJdGVtIGQgKQp7CiAgICBpZiAoIGRlbF9pdGVtICkgZGVsZXRlICh0eXBlICopZDsKfQoKdGVt cGxhdGU8Y2xhc3MgdHlwZT4KY2xhc3MgUVB0ckRpY3RJdGVyYXRvcgo6IHB1YmxpYyBRR0RpY3RJ dGVyYXRvcgp7CnB1YmxpYzoKICAgIFFQdHJEaWN0SXRlcmF0b3IoY29uc3QgUVB0ckRpY3Q8dHlw ZT4gJmQpIDpRR0RpY3RJdGVyYXRvcigoUUdEaWN0ICYpZCkge30KICAgflFQdHJEaWN0SXRlcmF0 b3IoKQkgICAgICB7fQogICAgdWludCAgY291bnQoKSAgIGNvbnN0ICAgICB7IHJldHVybiBkaWN0 LT5jb3VudCgpOyB9CiAgICBib29sICBpc0VtcHR5KCkgY29uc3QgICAgIHsgcmV0dXJuIGRpY3Qt PmNvdW50KCkgPT0gMDsgfQogICAgdHlwZSAqdG9GaXJzdCgpCSAgICAgIHsgcmV0dXJuICh0eXBl ICopUUdEaWN0SXRlcmF0b3I6OnRvRmlyc3QoKTsgfQogICAgb3BlcmF0b3IgdHlwZSAqKCkgIGNv bnN0ICB7IHJldHVybiAodHlwZSAqKVFHRGljdEl0ZXJhdG9yOjpnZXQoKTsgfQogICAgdHlwZSAq Y3VycmVudCgpICAgIGNvbnN0ICB7IHJldHVybiAodHlwZSAqKVFHRGljdEl0ZXJhdG9yOjpnZXQo KTsgfQogICAgdm9pZCAqY3VycmVudEtleSgpIGNvbnN0ICB7IHJldHVybiBRR0RpY3RJdGVyYXRv cjo6Z2V0S2V5UHRyKCk7IH0KICAgIHR5cGUgKm9wZXJhdG9yKCkoKQkgICAgICB7IHJldHVybiAo dHlwZSAqKVFHRGljdEl0ZXJhdG9yOjpvcGVyYXRvcigpKCk7IH0KICAgIHR5cGUgKm9wZXJhdG9y KysoKQkgICAgICB7IHJldHVybiAodHlwZSAqKVFHRGljdEl0ZXJhdG9yOjpvcGVyYXRvcisrKCk7 IH0KICAgIHR5cGUgKm9wZXJhdG9yKz0odWludCBqKSAgeyByZXR1cm4gKHR5cGUgKilRR0RpY3RJ dGVyYXRvcjo6b3BlcmF0b3IrPShqKTt9Cn07CgoKIyA0NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3FjYW52YXMuaCIgMgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FwZW4uaCIgMQogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzICAgUVBlbjog cHVibGljIFF0CnsKZnJpZW5kIGNsYXNzIFFQYWludGVyOwpwdWJsaWM6CiAgICBRUGVuKCk7CiAg ICBRUGVuKCBQZW5TdHlsZSApOwogICAgUVBlbiggY29uc3QgUUNvbG9yICZjb2xvciwgdWludCB3 aWR0aD0wLCBQZW5TdHlsZSBzdHlsZT1Tb2xpZExpbmUgKTsKICAgIFFQZW4oIGNvbnN0IFFDb2xv ciAmY2wsIHVpbnQgdywgUGVuU3R5bGUgcywgUGVuQ2FwU3R5bGUgYywgUGVuSm9pblN0eWxlIGop OwogICAgUVBlbiggY29uc3QgUVBlbiAmICk7CiAgIH5RUGVuKCk7CiAgICBRUGVuICZvcGVyYXRv cj0oIGNvbnN0IFFQZW4gJiApOwoKICAgIFBlblN0eWxlCXN0eWxlKCkgY29uc3QJCXsgcmV0dXJu IGRhdGEtPnN0eWxlOyB9CiAgICB2b2lkCXNldFN0eWxlKCBQZW5TdHlsZSApOwogICAgdWludAl3 aWR0aCgpIGNvbnN0CQl7IHJldHVybiBkYXRhLT53aWR0aDsgfQogICAgdm9pZAlzZXRXaWR0aCgg dWludCApOwogICAgY29uc3QgUUNvbG9yICZjb2xvcigpIGNvbnN0CQl7IHJldHVybiBkYXRhLT5j b2xvcjsgfQogICAgdm9pZAlzZXRDb2xvciggY29uc3QgUUNvbG9yICYgKTsKICAgIFBlbkNhcFN0 eWxlCWNhcFN0eWxlKCkgY29uc3Q7CiAgICB2b2lkCXNldENhcFN0eWxlKCBQZW5DYXBTdHlsZSAp OwogICAgUGVuSm9pblN0eWxlIGpvaW5TdHlsZSgpIGNvbnN0OwogICAgdm9pZAlzZXRKb2luU3R5 bGUoIFBlbkpvaW5TdHlsZSApOwoKICAgIGJvb2wJb3BlcmF0b3I9PSggY29uc3QgUVBlbiAmcCAp IGNvbnN0OwogICAgYm9vbAlvcGVyYXRvciE9KCBjb25zdCBRUGVuICZwICkgY29uc3QKCQkJCQl7 IHJldHVybiAhKG9wZXJhdG9yPT0ocCkpOyB9Cgpwcml2YXRlOgogICAgUVBlbgljb3B5KCkJY29u c3Q7CiAgICB2b2lkCWRldGFjaCgpOwogICAgdm9pZAlpbml0KCBjb25zdCBRQ29sb3IgJiwgdWlu dCwgdWludCApOwogICAgc3RydWN0IFFQZW5EYXRhIDogcHVibGljIFFTaGFyZWQgewkJIAoJUGVu U3R5bGUgIHN0eWxlOwoJdWludAkgIHdpZHRoOwoJUUNvbG9yCSAgY29sb3I7CglRX1VJTlQxNiAg bGluZXN0OwogICAgfSAqZGF0YTsKfTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwo IFFEYXRhU3RyZWFtICYsIGNvbnN0IFFQZW4gJiApOwogIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+ KCBRRGF0YVN0cmVhbSAmLCBRUGVuICYgKTsKCgoKIyA0NyAiL3Vzci9sb2NhbC9xdC9pbmNsdWRl L3FjYW52YXMuaCIgMgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fwb2ludGFycmF5Lmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xh c3MgICBRUG9pbnRBcnJheSA6IHB1YmxpYyBRTWVtQXJyYXk8UVBvaW50Pgp7CnB1YmxpYzoKICAg IFFQb2ludEFycmF5KCkge30KICAgIH5RUG9pbnRBcnJheSgpIHt9CiAgICBRUG9pbnRBcnJheSgg aW50IHNpemUgKSA6IFFNZW1BcnJheTxRUG9pbnQ+KCBzaXplICkge30KICAgIFFQb2ludEFycmF5 KCBjb25zdCBRUG9pbnRBcnJheSAmYSApIDogUU1lbUFycmF5PFFQb2ludD4oIGEgKSB7fQogICAg UVBvaW50QXJyYXkoIGNvbnN0IFFSZWN0ICZyLCBib29sIGNsb3NlZD1GQUxTRSApOwogICAgUVBv aW50QXJyYXkoIGludCBuUG9pbnRzLCBjb25zdCBRQ09PUkQgKnBvaW50cyApOwoKICAgIFFQb2lu dEFycmF5CSAmb3BlcmF0b3I9KCBjb25zdCBRUG9pbnRBcnJheSAmYSApCgl7IHJldHVybiAoUVBv aW50QXJyYXkmKWFzc2lnbiggYSApOyB9CgogICAgUVBvaW50QXJyYXkgY29weSgpIGNvbnN0Cgl7 IFFQb2ludEFycmF5IHRtcDsgcmV0dXJuICooKFFQb2ludEFycmF5KikmdG1wLmR1cGxpY2F0ZSgq dGhpcykpOyB9CgogICAgdm9pZCAgICB0cmFuc2xhdGUoIGludCBkeCwgaW50IGR5ICk7CiAgICBR UmVjdCAgIGJvdW5kaW5nUmVjdCgpIGNvbnN0OwoKICAgIHZvaWQgICAgcG9pbnQoIHVpbnQgaSwg aW50ICp4LCBpbnQgKnkgKSBjb25zdDsKICAgIFFQb2ludCAgcG9pbnQoIHVpbnQgaSApIGNvbnN0 OwogICAgdm9pZCAgICBzZXRQb2ludCggdWludCBpLCBpbnQgeCwgaW50IHkgKTsKICAgIHZvaWQg ICAgc2V0UG9pbnQoIHVpbnQgaSwgY29uc3QgUVBvaW50ICZwICk7CiAgICBib29sICAgIHNldFBv aW50cyggaW50IG5Qb2ludHMsIGNvbnN0IFFDT09SRCAqcG9pbnRzICk7CiAgICBib29sICAgIHNl dFBvaW50cyggaW50IG5Qb2ludHMsIGludCBmaXJzdHgsIGludCBmaXJzdHksIC4uLiApOwogICAg Ym9vbCAgICBwdXRQb2ludHMoIGludCBpbmRleCwgaW50IG5Qb2ludHMsIGNvbnN0IFFDT09SRCAq cG9pbnRzICk7CiAgICBib29sICAgIHB1dFBvaW50cyggaW50IGluZGV4LCBpbnQgblBvaW50cywg aW50IGZpcnN0eCwgaW50IGZpcnN0eSwgLi4uICk7CiAgICBib29sICAgIHB1dFBvaW50cyggaW50 IGluZGV4LCBpbnQgblBvaW50cywKCQkgICAgICAgY29uc3QgUVBvaW50QXJyYXkgJiBmcm9tLCBp bnQgZnJvbUluZGV4PTAgKTsKCiAgICB2b2lkICAgIG1ha2VBcmMoIGludCB4LCBpbnQgeSwgaW50 IHcsIGludCBoLCBpbnQgYTEsIGludCBhMiApOwogICAgdm9pZCAgICBtYWtlRWxsaXBzZSggaW50 IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQgICAgbWFrZUFyYyggaW50IHgsIGlu dCB5LCBpbnQgdywgaW50IGgsIGludCBhMSwgaW50IGEyLAoJCSAgICAgY29uc3QgUVdNYXRyaXgm ICk7CiAgICBRUG9pbnRBcnJheSBjdWJpY0JlemllcigpIGNvbnN0OwoKICAgIHZvaWQqICBzaG9y dFBvaW50cyggaW50IGluZGV4ID0gMCwgaW50IG5Qb2ludHMgPSAtMSApIGNvbnN0OwogICAgc3Rh dGljIHZvaWQgY2xlYW5CdWZmZXJzKCk7Cgpwcm90ZWN0ZWQ6CiAgICBzdGF0aWMgdWludCBzcGxl bjsKICAgIHN0YXRpYyB2b2lkKiBzcDsKfTsKCgogCgoKCiAgUURhdGFTdHJlYW0gJm9wZXJhdG9y PDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFQb2ludEFycmF5ICYgKTsKICBRRGF0YVN0cmVhbSAm b3BlcmF0b3I+PiggUURhdGFTdHJlYW0gJiwgUVBvaW50QXJyYXkgJiApOwoKCiAKCgoKaW5saW5l IHZvaWQgUVBvaW50QXJyYXk6OnNldFBvaW50KCB1aW50IGksIGNvbnN0IFFQb2ludCAmcCApCnsK ICAgIHNldFBvaW50KCBpLCBwLngoKSwgcC55KCkgKTsKfQoKCgojIDQ5ICIvdXNyL2xvY2FsL3F0 L2luY2x1ZGUvcWNhbnZhcy5oIiAyCgoKCgoKCgoKCgoKCmNsYXNzIFFDYW52YXNTcHJpdGU7CmNs YXNzIFFDYW52YXNQb2x5Z29uYWxJdGVtOwpjbGFzcyBRQ2FudmFzUmVjdGFuZ2xlOwpjbGFzcyBR Q2FudmFzUG9seWdvbjsKY2xhc3MgUUNhbnZhc0VsbGlwc2U7CmNsYXNzIFFDYW52YXNUZXh0Owpj bGFzcyBRQ2FudmFzTGluZTsKY2xhc3MgUUNhbnZhc0NodW5rOwpjbGFzcyBRQ2FudmFzOwpjbGFz cyBRQ2FudmFzSXRlbTsKY2xhc3MgUUNhbnZhc1ZpZXc7CmNsYXNzIFFDYW52YXNQaXhtYXA7CgoK CgoKCgoKCgoKY2xhc3MgICAgUUNhbnZhc0l0ZW1MaXN0IDogcHVibGljIFFWYWx1ZUxpc3Q8UUNh bnZhc0l0ZW0qPiB7CnB1YmxpYzoKICAgIHZvaWQgc29ydCgpOwogICAgdm9pZCBkcmF3VW5pcXVl KCBRUGFpbnRlciYgcGFpbnRlciApOwp9OwoKCmNsYXNzIFFDYW52YXNJdGVtRXh0cmE7CgpjbGFz cyAgICBRQ2FudmFzSXRlbSA6IHB1YmxpYyBRdAp7CnB1YmxpYzoKICAgIFFDYW52YXNJdGVtKFFD YW52YXMqIGNhbnZhcyk7CiAgICB2aXJ0dWFsIH5RQ2FudmFzSXRlbSgpOwoKICAgIGRvdWJsZSB4 KCkgY29uc3QKCXsgcmV0dXJuIG15eDsgfQogICAgZG91YmxlIHkoKSBjb25zdAoJeyByZXR1cm4g bXl5OyB9CiAgICBkb3VibGUgeigpIGNvbnN0Cgl7IHJldHVybiBteXo7IH0gIAoKICAgIHZpcnR1 YWwgdm9pZCBtb3ZlQnkoZG91YmxlIGR4LCBkb3VibGUgZHkpOwogICAgdm9pZCBtb3ZlKGRvdWJs ZSB4LCBkb3VibGUgeSk7CiAgICB2b2lkIHNldFgoZG91YmxlIGEpIHsgbW92ZShhLHkoKSk7IH0K ICAgIHZvaWQgc2V0WShkb3VibGUgYSkgeyBtb3ZlKHgoKSxhKTsgfQogICAgdm9pZCBzZXRaKGRv dWJsZSBhKSB7IG15ej1hOyBjaGFuZ2VDaHVua3MoKTsgfQoKICAgIGJvb2wgYW5pbWF0ZWQoKSBj b25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRBbmltYXRlZChib29sIHkpOwogICAgdmlydHVhbCB2 b2lkIHNldFZlbG9jaXR5KCBkb3VibGUgdngsIGRvdWJsZSB2eSk7CiAgICB2b2lkIHNldFhWZWxv Y2l0eSggZG91YmxlIHZ4ICkgeyBzZXRWZWxvY2l0eSh2eCx5VmVsb2NpdHkoKSk7IH0KICAgIHZv aWQgc2V0WVZlbG9jaXR5KCBkb3VibGUgdnkgKSB7IHNldFZlbG9jaXR5KHhWZWxvY2l0eSgpLHZ5 KTsgfQogICAgZG91YmxlIHhWZWxvY2l0eSgpIGNvbnN0OwogICAgZG91YmxlIHlWZWxvY2l0eSgp IGNvbnN0OwogICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoaW50IHN0YWdlKTsKCiAgICB2aXJ0dWFs IGJvb2wgY29sbGlkZXNXaXRoKCBjb25zdCBRQ2FudmFzSXRlbSogKSBjb25zdD0wOwoKICAgIFFD YW52YXNJdGVtTGlzdCBjb2xsaXNpb25zKGJvb2wgZXhhY3QgICApIGNvbnN0OwoKICAgIHZpcnR1 YWwgdm9pZCBzZXRDYW52YXMoUUNhbnZhcyopOwoKICAgIHZpcnR1YWwgdm9pZCBkcmF3KFFQYWlu dGVyJik9MDsKCiAgICB2b2lkIHNob3coKTsKICAgIHZvaWQgaGlkZSgpOwoKICAgIHZpcnR1YWwg dm9pZCBzZXRWaXNpYmxlKGJvb2wgeWVzKTsKICAgIGJvb2wgaXNWaXNpYmxlKCkgY29uc3QKCXsg cmV0dXJuIChib29sKXZpczsgfQogICAgdmlydHVhbCB2b2lkIHNldFNlbGVjdGVkKGJvb2wgeWVz KTsKICAgIGJvb2wgaXNTZWxlY3RlZCgpIGNvbnN0Cgl7IHJldHVybiAoYm9vbClzZWw7IH0KICAg IHZpcnR1YWwgdm9pZCBzZXRFbmFibGVkKGJvb2wgeWVzKTsKICAgIGJvb2wgaXNFbmFibGVkKCkg Y29uc3QKCXsgcmV0dXJuIChib29sKWVuYTsgfQogICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZShi b29sIHllcyk7CiAgICBib29sIGlzQWN0aXZlKCkgY29uc3QKCXsgcmV0dXJuIChib29sKWFjdDsg fQoKICAgIGJvb2wgdmlzaWJsZSgpIGNvbnN0Cgl7IHJldHVybiAoYm9vbCl2aXM7IH0KICAgIGJv b2wgc2VsZWN0ZWQoKSBjb25zdAoJeyByZXR1cm4gKGJvb2wpc2VsOyB9CiAgICBib29sIGVuYWJs ZWQoKSBjb25zdAoJeyByZXR1cm4gKGJvb2wpZW5hOyB9CiAgICBib29sIGFjdGl2ZSgpIGNvbnN0 Cgl7IHJldHVybiAoYm9vbClhY3Q7IH0KCgogICAgZW51bSBSdHRpVmFsdWVzIHsKCVJ0dGlfSXRl bSA9IDAsCglSdHRpX1Nwcml0ZSA9IDEsCglSdHRpX1BvbHlnb25hbEl0ZW0gPSAyLAoJUnR0aV9U ZXh0ID0gMywKCVJ0dGlfUG9seWdvbiA9IDQsCglSdHRpX1JlY3RhbmdsZSA9IDUsCglSdHRpX0Vs bGlwc2UgPSA2LAoJUnR0aV9MaW5lID0gNywKCVJ0dGlfU3BsaW5lID0gOAogICAgfTsKCiAgICB2 aXJ0dWFsIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMgaW50IFJUVEk7CgogICAgdmlydHVh bCBRUmVjdCBib3VuZGluZ1JlY3QoKSBjb25zdD0wOwogICAgdmlydHVhbCBRUmVjdCBib3VuZGlu Z1JlY3RBZHZhbmNlZCgpIGNvbnN0OwoKICAgIFFDYW52YXMqIGNhbnZhcygpIGNvbnN0Cgl7IHJl dHVybiBjbnY7IH0KCnByb3RlY3RlZDoKICAgIHZvaWQgdXBkYXRlKCkgeyBjaGFuZ2VDaHVua3Mo KTsgfQoKcHJpdmF0ZToKICAgICAKCiAgICBmcmllbmQgY2xhc3MgUUNhbnZhc1BvbHlnb25hbEl0 ZW07CiAgICBmcmllbmQgY2xhc3MgUUNhbnZhc1Nwcml0ZTsKICAgIGZyaWVuZCBjbGFzcyBRQ2Fu dmFzUmVjdGFuZ2xlOwogICAgZnJpZW5kIGNsYXNzIFFDYW52YXNQb2x5Z29uOwogICAgZnJpZW5k IGNsYXNzIFFDYW52YXNFbGxpcHNlOwogICAgZnJpZW5kIGNsYXNzIFFDYW52YXNUZXh0OwogICAg ZnJpZW5kIGNsYXNzIFFDYW52YXNMaW5lOwoKICAgIHZpcnR1YWwgUVBvaW50QXJyYXkgY2h1bmtz KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgYWRkVG9DaHVua3MoKTsKICAgIHZpcnR1YWwgdm9p ZCByZW1vdmVGcm9tQ2h1bmtzKCk7CiAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlQ2h1bmtzKCk7CiAg ICB2aXJ0dWFsIGJvb2wgY29sbGlkZXNXaXRoKCBjb25zdCBRQ2FudmFzU3ByaXRlKiwKCQkJICAg ICAgIGNvbnN0IFFDYW52YXNQb2x5Z29uYWxJdGVtKiwKCQkJICAgICAgIGNvbnN0IFFDYW52YXNS ZWN0YW5nbGUqLAoJCQkgICAgICAgY29uc3QgUUNhbnZhc0VsbGlwc2UqLAoJCQkgICAgICAgY29u c3QgUUNhbnZhc1RleHQqICkgY29uc3QgPSAwOwogICAgIAoKICAgIFFDYW52YXMqIGNudjsKICAg IHN0YXRpYyBRQ2FudmFzKiBjdXJyZW50X2NhbnZhczsKICAgIGRvdWJsZSBteXgsbXl5LG15ejsK ICAgIFFDYW52YXNJdGVtRXh0cmEgKmV4dDsKICAgIFFDYW52YXNJdGVtRXh0cmEmIGV4dHJhKCk7 CiAgICB1aW50IGFuaToxOwogICAgdWludCB2aXM6MTsKICAgIHVpbnQgc2VsOjE7CiAgICB1aW50 IGVuYToxOwogICAgdWludCBhY3Q6MTsKfTsKCgpjbGFzcyBRQ2FudmFzRGF0YTsKCmNsYXNzICAg IFFDYW52YXMgOiBwdWJsaWMgUU9iamVjdAp7CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmpl Y3QgKm1ldGFPYmplY3QoKSBjb25zdCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0Jdmly dHVhbCBjb25zdCBjaGFyICpjbGFzc05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0 KCBjb25zdCBjaGFyKiApOyB2aXJ0dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiAp OyB2aXJ0dWFsIGJvb2wgcXRfZW1pdCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0 X3Byb3BlcnR5KCBpbnQsIGludCwgUVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0 YXRpY01ldGFPYmplY3QoKTsJUU9iamVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0 aGlzOyB9IHN0YXRpYyBRU3RyaW5nIHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAg KTsgc3RhdGljIFFTdHJpbmcgdHJVdGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAg KTsgCXByaXZhdGU6CXN0YXRpYyBRTWV0YU9iamVjdCAqbWV0YU9iajsgCnB1YmxpYzoKICAgIFFD YW52YXMoIFFPYmplY3QqIHBhcmVudCA9IDAsIGNvbnN0IGNoYXIqIG5hbWUgPSAwICk7CiAgICBR Q2FudmFzKGludCB3LCBpbnQgaCk7CiAgICBRQ2FudmFzKCBRUGl4bWFwIHAsIGludCBoLCBpbnQg diwgaW50IHRpbGV3aWR0aCwgaW50IHRpbGVoZWlnaHQgKTsKCiAgICB2aXJ0dWFsIH5RQ2FudmFz KCk7CgogICAgdmlydHVhbCB2b2lkIHNldFRpbGVzKCBRUGl4bWFwIHRpbGVzLCBpbnQgaCwgaW50 IHYsCgkJCSAgIGludCB0aWxld2lkdGgsIGludCB0aWxlaGVpZ2h0ICk7CiAgICB2aXJ0dWFsIHZv aWQgc2V0QmFja2dyb3VuZFBpeG1hcCggY29uc3QgUVBpeG1hcCYgcCApOwogICAgUVBpeG1hcCBi YWNrZ3JvdW5kUGl4bWFwKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldEJhY2tncm91bmRD b2xvciggY29uc3QgUUNvbG9yJiBjICk7CiAgICBRQ29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29u c3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFRpbGUoIGludCB4LCBpbnQgeSwgaW50IHRpbGVudW0g KTsKICAgIGludCB0aWxlKCBpbnQgeCwgaW50IHkgKSBjb25zdAoJeyByZXR1cm4gZ3JpZFt4K3kq aHRpbGVzXTsgfQoKICAgIGludCB0aWxlc0hvcml6b250YWxseSgpIGNvbnN0Cgl7IHJldHVybiBo dGlsZXM7IH0KICAgIGludCB0aWxlc1ZlcnRpY2FsbHkoKSBjb25zdAoJeyByZXR1cm4gdnRpbGVz OyB9CgogICAgaW50IHRpbGVXaWR0aCgpIGNvbnN0Cgl7IHJldHVybiB0aWxldzsgfQogICAgaW50 IHRpbGVIZWlnaHQoKSBjb25zdAoJeyByZXR1cm4gdGlsZWg7IH0KCiAgICB2aXJ0dWFsIHZvaWQg cmVzaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAgICBpbnQgd2lkdGgoKSBjb25zdAoJeyBy ZXR1cm4gYXdpZHRoOyB9CiAgICBpbnQgaGVpZ2h0KCkgY29uc3QKCXsgcmV0dXJuIGFoZWlnaHQ7 IH0KICAgIFFTaXplIHNpemUoKSBjb25zdAoJeyByZXR1cm4gUVNpemUoYXdpZHRoLGFoZWlnaHQp OyB9CiAgICBRUmVjdCByZWN0KCkgY29uc3QKCXsgcmV0dXJuIFFSZWN0KCAwLCAwLCBhd2lkdGgs IGFoZWlnaHQgKTsgfQogICAgYm9vbCBvbkNhbnZhcyggaW50IHgsIGludCB5ICkgY29uc3QKCXsg cmV0dXJuIHg+PTAgJiYgeT49MCAmJiB4PGF3aWR0aCAmJiB5PGFoZWlnaHQ7IH0KICAgIGJvb2wg b25DYW52YXMoIGNvbnN0IFFQb2ludCYgcCApIGNvbnN0Cgl7IHJldHVybiBvbkNhbnZhcyhwLngo KSxwLnkoKSk7IH0KICAgIGJvb2wgdmFsaWRDaHVuayggaW50IHgsIGludCB5ICkgY29uc3QKCXsg cmV0dXJuIHg+PTAgJiYgeT49MCAmJiB4PGNod2lkdGggJiYgeTxjaGhlaWdodDsgfQogICAgYm9v bCB2YWxpZENodW5rKCBjb25zdCBRUG9pbnQmIHAgKSBjb25zdAoJeyByZXR1cm4gdmFsaWRDaHVu ayhwLngoKSxwLnkoKSk7IH0KCiAgICBpbnQgY2h1bmtTaXplKCkgY29uc3QKCXsgcmV0dXJuIGNo dW5rc2l6ZTsgfQogICAgdmlydHVhbCB2b2lkIHJldHVuZShpbnQgY2h1bmtzaXplLCBpbnQgbWF4 Y2x1c3RlcnM9MTAwKTsKCiAgICBib29sIHNhbWVDaHVuayhpbnQgeDEsIGludCB5MSwgaW50IHgy LCBpbnQgeTIpIGNvbnN0Cgl7IHJldHVybiB4MS9jaHVua3NpemU9PXgyL2NodW5rc2l6ZSAmJiB5 MS9jaHVua3NpemU9PXkyL2NodW5rc2l6ZTsgfQogICAgdmlydHVhbCB2b2lkIHNldENoYW5nZWRD aHVuayhpbnQgaSwgaW50IGopOwogICAgdmlydHVhbCB2b2lkIHNldENoYW5nZWRDaHVua0NvbnRh aW5pbmcoaW50IHgsIGludCB5KTsKICAgIHZpcnR1YWwgdm9pZCBzZXRBbGxDaGFuZ2VkKCk7CiAg ICB2aXJ0dWFsIHZvaWQgc2V0Q2hhbmdlZChjb25zdCBRUmVjdCYgYXJlYSk7CiAgICB2aXJ0dWFs IHZvaWQgc2V0VW5jaGFuZ2VkKGNvbnN0IFFSZWN0JiBhcmVhKTsKCiAgICAgCiAgICB2b2lkIGFk ZEl0ZW1Ub0NodW5rKFFDYW52YXNJdGVtKiwgaW50IGksIGludCBqKTsKICAgIHZvaWQgcmVtb3Zl SXRlbUZyb21DaHVuayhRQ2FudmFzSXRlbSosIGludCBpLCBpbnQgaik7CiAgICB2b2lkIGFkZEl0 ZW1Ub0NodW5rQ29udGFpbmluZyhRQ2FudmFzSXRlbSosIGludCB4LCBpbnQgeSk7CiAgICB2b2lk IHJlbW92ZUl0ZW1Gcm9tQ2h1bmtDb250YWluaW5nKFFDYW52YXNJdGVtKiwgaW50IHgsIGludCB5 KTsKCiAgICBRQ2FudmFzSXRlbUxpc3QgYWxsSXRlbXMoKTsKICAgIFFDYW52YXNJdGVtTGlzdCBj b2xsaXNpb25zKCBjb25zdCBRUG9pbnQmKSBjb25zdDsKICAgIFFDYW52YXNJdGVtTGlzdCBjb2xs aXNpb25zKCBjb25zdCBRUmVjdCYpIGNvbnN0OwogICAgUUNhbnZhc0l0ZW1MaXN0IGNvbGxpc2lv bnMoIGNvbnN0IFFQb2ludEFycmF5JiBwYSwgY29uc3QgUUNhbnZhc0l0ZW0qIGl0ZW0sCgkJCQli b29sIGV4YWN0KSBjb25zdDsKCiAgICB2b2lkIGRyYXdBcmVhKGNvbnN0IFFSZWN0JiwgUVBhaW50 ZXIqIHAsIGJvb2wgZG91YmxlX2J1ZmZlcj1GQUxTRSk7CgogICAgIAogICAgdmlydHVhbCB2b2lk IGFkZFZpZXcoUUNhbnZhc1ZpZXcqKTsKICAgIHZpcnR1YWwgdm9pZCByZW1vdmVWaWV3KFFDYW52 YXNWaWV3Kik7CiAgICB2b2lkIGRyYXdDYW52YXNBcmVhKGNvbnN0IFFSZWN0JiwgUVBhaW50ZXIq IHA9MCwgYm9vbCBkb3VibGVfYnVmZmVyPVRSVUUpOwoKICAgIHZvaWQgZHJhd1ZpZXdBcmVhKCBR Q2FudmFzVmlldyogdmlldywgUVBhaW50ZXIqIHAsIGNvbnN0IFFSZWN0JiByLCBib29sIGRidWYg KTsKCgogICAgIAogICAgdmlydHVhbCB2b2lkIGFkZEl0ZW0oUUNhbnZhc0l0ZW0qKTsKICAgIHZp cnR1YWwgdm9pZCBhZGRBbmltYXRpb24oUUNhbnZhc0l0ZW0qKTsKICAgIHZpcnR1YWwgdm9pZCBy ZW1vdmVJdGVtKFFDYW52YXNJdGVtKik7CiAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlQW5pbWF0aW9u KFFDYW52YXNJdGVtKik7CgogICAgdmlydHVhbCB2b2lkIHNldEFkdmFuY2VQZXJpb2QoaW50IG1z KTsKICAgIHZpcnR1YWwgdm9pZCBzZXRVcGRhdGVQZXJpb2QoaW50IG1zKTsKCiAgICB2aXJ0dWFs IHZvaWQgc2V0RG91YmxlQnVmZmVyaW5nKGJvb2wgeSk7Cgpwcm90ZWN0ZWQgOgogICAgdm9pZCBy ZXNpemVkKCk7CgpwdWJsaWMgIDoKICAgIHZpcnR1YWwgdm9pZCBhZHZhbmNlKCk7CiAgICB2aXJ0 dWFsIHZvaWQgdXBkYXRlKCk7Cgpwcm90ZWN0ZWQ6CiAgICB2aXJ0dWFsIHZvaWQgZHJhd0JhY2tn cm91bmQoUVBhaW50ZXImLCBjb25zdCBRUmVjdCYgYXJlYSk7CiAgICB2aXJ0dWFsIHZvaWQgZHJh d0ZvcmVncm91bmQoUVBhaW50ZXImLCBjb25zdCBRUmVjdCYgYXJlYSk7Cgpwcml2YXRlOgogICAg dm9pZCBpbml0KGludCB3LCBpbnQgaCwgaW50IGNodW5rc3plPTE2LCBpbnQgbWF4Y2x1c3Q9MTAw KTsKCiAgICBRQ2FudmFzQ2h1bmsmIGNodW5rKGludCBpLCBpbnQgaikgY29uc3Q7CiAgICBRQ2Fu dmFzQ2h1bmsmIGNodW5rQ29udGFpbmluZyhpbnQgeCwgaW50IHkpIGNvbnN0OwoKICAgIFFSZWN0 IGNoYW5nZUJvdW5kcyhjb25zdCBRUmVjdCYgaW5hcmVhKTsKICAgIHZvaWQgZHJhd0NoYW5nZXMo Y29uc3QgUVJlY3QmIGluYXJlYSk7CgogICAgdm9pZCBlbnN1cmVPZmZTY3JTaXplKCBpbnQgb3N3 LCBpbnQgb3NoICk7CiAgICBRUGl4bWFwIG9mZnNjcjsKICAgIGludCBhd2lkdGgsYWhlaWdodDsK ICAgIGludCBjaHVua3NpemU7CiAgICBpbnQgbWF4Y2x1c3RlcnM7CiAgICBpbnQgY2h3aWR0aCxj aGhlaWdodDsKICAgIFFDYW52YXNDaHVuayogY2h1bmtzOwoKICAgIFFDYW52YXNEYXRhKiBkOwoK ICAgIHZvaWQgaW5pdFRpbGVzKFFQaXhtYXAgcCwgaW50IGgsIGludCB2LCBpbnQgdGlsZXdpZHRo LCBpbnQgdGlsZWhlaWdodCk7CiAgICB1c2hvcnQgKmdyaWQ7CiAgICB1c2hvcnQgaHRpbGVzOwog ICAgdXNob3J0IHZ0aWxlczsKICAgIHVzaG9ydCB0aWxldzsKICAgIHVzaG9ydCB0aWxlaDsKICAg IGJvb2wgb25lb25lOwogICAgUVBpeG1hcCBwbTsKICAgIFFUaW1lciogdXBkYXRlX3RpbWVyOwog ICAgUUNvbG9yIGJnY29sb3I7CiAgICBib29sIGRlYnVnX3JlZHJhd19hcmVhczsKICAgIGJvb2wg ZGJsYnVmOwoKICAgIGZyaWVuZCB2b2lkIHF0X3VudmlldyhRQ2FudmFzKiBjKTsKfTsKCmNsYXNz IFFDYW52YXNWaWV3RGF0YTsKCmNsYXNzICAgIFFDYW52YXNWaWV3IDogcHVibGljIFFTY3JvbGxW aWV3CnsKICAgIHB1YmxpYzoJdmlydHVhbCBRTWV0YU9iamVjdCAqbWV0YU9iamVjdCgpIGNvbnN0 IHsgcmV0dXJuIHN0YXRpY01ldGFPYmplY3QoKTsJfQl2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNz TmFtZSgpIGNvbnN0Owl2aXJ0dWFsIHZvaWQqIHF0X2Nhc3QoIGNvbnN0IGNoYXIqICk7IHZpcnR1 YWwgYm9vbCBxdF9pbnZva2UoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9lbWl0 KCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wgcXRfcHJvcGVydHkoIGludCwgaW50LCBR VmFyaWFudCogKTsgCXN0YXRpYyBRTWV0YU9iamVjdCogc3RhdGljTWV0YU9iamVjdCgpOwlRT2Jq ZWN0KiBxT2JqZWN0KCkgeyByZXR1cm4gKFFPYmplY3QqKXRoaXM7IH0gc3RhdGljIFFTdHJpbmcg dHIoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqID0gMCApOyBzdGF0aWMgUVN0cmluZyB0clV0 ZjgoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqID0gMCApOyAJcHJpdmF0ZToJc3RhdGljIFFN ZXRhT2JqZWN0ICptZXRhT2JqOyAKcHVibGljOgoKICAgIFFDYW52YXNWaWV3KFFXaWRnZXQqIHBh cmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmPTApOwogICAgUUNhbnZhc1ZpZXco UUNhbnZhcyogdmlld2luZywgUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIqIG5hbWU9MCwg V0ZsYWdzIGY9MCk7CiAgICB+UUNhbnZhc1ZpZXcoKTsKCiAgICBRQ2FudmFzKiBjYW52YXMoKSBj b25zdAoJeyByZXR1cm4gdmlld2luZzsgfQogICAgdm9pZCBzZXRDYW52YXMoUUNhbnZhcyogdik7 CgogICAgY29uc3QgUVdNYXRyaXggJndvcmxkTWF0cml4KCkgY29uc3Q7CiAgICBjb25zdCBRV01h dHJpeCAmaW52ZXJzZVdvcmxkTWF0cml4KCkgY29uc3Q7CiAgICBib29sIHNldFdvcmxkTWF0cml4 KCBjb25zdCBRV01hdHJpeCAmICk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIGRyYXdDb250ZW50cygg UVBhaW50ZXIqLCBpbnQgY3gsIGludCBjeSwgaW50IGN3LCBpbnQgY2ggKTsKICAgIFFTaXplIHNp emVIaW50KCkgY29uc3Q7Cgpwcml2YXRlOgogICAgdm9pZCBkcmF3Q29udGVudHMoIFFQYWludGVy KiApOwogICAgUUNhbnZhcyogdmlld2luZzsKICAgIFFDYW52YXNWaWV3RGF0YSogZDsKICAgIGZy aWVuZCB2b2lkIHF0X3VudmlldyhRQ2FudmFzKiBjKTsKCnByaXZhdGUgIDoKICAgIHZvaWQgY01v dmluZyhpbnQsaW50KTsKICAgIHZvaWQgdXBkYXRlQ29udGVudHNTaXplKCk7Cn07CgoKY2xhc3Mg ICAgUUNhbnZhc1BpeG1hcCA6IHB1YmxpYyBRUGl4bWFwCnsKcHVibGljOgoKICAgIFFDYW52YXNQ aXhtYXAoY29uc3QgUVN0cmluZyYgZGF0YWZpbGVuYW1lKTsKCiAgICBRQ2FudmFzUGl4bWFwKGNv bnN0IFFJbWFnZSYgaW1hZ2UpOwogICAgUUNhbnZhc1BpeG1hcChjb25zdCBRUGl4bWFwJiwgY29u c3QgUVBvaW50JiBob3RzcG90KTsKICAgIH5RQ2FudmFzUGl4bWFwKCk7CgogICAgaW50IG9mZnNl dFgoKSBjb25zdAoJeyByZXR1cm4gaG90eDsgfQogICAgaW50IG9mZnNldFkoKSBjb25zdAoJeyBy ZXR1cm4gaG90eTsgfQogICAgdm9pZCBzZXRPZmZzZXQoaW50IHgsIGludCB5KSB7IGhvdHggPSB4 OyBob3R5ID0geTsgfQoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdChjb25zdCBRSW1hZ2UmKTsKICAg IHZvaWQgaW5pdChjb25zdCBRUGl4bWFwJiBwaXhtYXAsIGludCBoeCwgaW50IGh5KTsKCiAgICBm cmllbmQgY2xhc3MgUUNhbnZhc1Nwcml0ZTsKICAgIGZyaWVuZCBjbGFzcyBRQ2FudmFzUGl4bWFw QXJyYXk7CiAgICBmcmllbmQgYm9vbCBxdF90ZXN0Q29sbGlzaW9uKGNvbnN0IFFDYW52YXNTcHJp dGUqIHMxLCBjb25zdCBRQ2FudmFzU3ByaXRlKiBzMik7CgogICAgaW50IGhvdHgsaG90eTsKCiAg ICBRSW1hZ2UqIGNvbGxpc2lvbl9tYXNrOwp9OwoKCmNsYXNzICAgIFFDYW52YXNQaXhtYXBBcnJh eQp7CnB1YmxpYzoKICAgIFFDYW52YXNQaXhtYXBBcnJheSgpOwoKICAgIFFDYW52YXNQaXhtYXBB cnJheShjb25zdCBRU3RyaW5nJiBkYXRhZmlsZW5hbWVwYXR0ZXJuLCBpbnQgZnJhbWVjb3VudD0w KTsKCiAgICAgCiAgICBRQ2FudmFzUGl4bWFwQXJyYXkoUVB0ckxpc3Q8UVBpeG1hcD4sIFFQdHJM aXN0PFFQb2ludD4gaG90c3BvdHMpOwoKICAgIFFDYW52YXNQaXhtYXBBcnJheShRVmFsdWVMaXN0 PFFQaXhtYXA+LCBRUG9pbnRBcnJheSBob3RzcG90cyA9IFFQb2ludEFycmF5KCkgKTsKICAgIH5R Q2FudmFzUGl4bWFwQXJyYXkoKTsKCgogICAgYm9vbCByZWFkUGl4bWFwcyhjb25zdCBRU3RyaW5n JiBkYXRhZmlsZW5hbWVwYXR0ZXJuLCBpbnQgZnJhbWVjb3VudD0wKTsKICAgIGJvb2wgcmVhZENv bGxpc2lvbk1hc2tzKGNvbnN0IFFTdHJpbmcmIGZpbGVuYW1lcGF0dGVybik7CgoKICAgICAKICAg IGJvb2wgb3BlcmF0b3IhKCk7ICAKICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OwoKICAgIFFDYW52 YXNQaXhtYXAqIGltYWdlKGludCBpKSBjb25zdAoJeyByZXR1cm4gaW1nID8gaW1nW2ldIDogMDsg fQogICAgdm9pZCBzZXRJbWFnZShpbnQgaSwgUUNhbnZhc1BpeG1hcCogcCk7CiAgICB1aW50IGNv dW50KCkgY29uc3QKCXsgcmV0dXJuICh1aW50KWZyYW1lY291bnQ7IH0KCnByaXZhdGU6CgogICAg Ym9vbCByZWFkUGl4bWFwcyhjb25zdCBRU3RyaW5nJiBkYXRhZmlsZW5hbWVwYXR0ZXJuLCBpbnQg ZnJhbWVjb3VudCwgYm9vbCBtYXNrb25seSk7CgoKICAgIHZvaWQgcmVzZXQoKTsKICAgIGludCBm cmFtZWNvdW50OwogICAgUUNhbnZhc1BpeG1hcCoqIGltZzsKfTsKCgpjbGFzcyAgICBRQ2FudmFz U3ByaXRlIDogcHVibGljIFFDYW52YXNJdGVtCnsKcHVibGljOgogICAgUUNhbnZhc1Nwcml0ZShR Q2FudmFzUGl4bWFwQXJyYXkqIGFycmF5LCBRQ2FudmFzKiBjYW52YXMpOwoKICAgIHZvaWQgc2V0 U2VxdWVuY2UoUUNhbnZhc1BpeG1hcEFycmF5KiBzZXEpOwoKICAgIHZpcnR1YWwgflFDYW52YXNT cHJpdGUoKTsKCiAgICB2b2lkIG1vdmUoZG91YmxlIHgsIGRvdWJsZSB5KTsKICAgIHZpcnR1YWwg dm9pZCBtb3ZlKGRvdWJsZSB4LCBkb3VibGUgeSwgaW50IGZyYW1lKTsKICAgIHZvaWQgc2V0RnJh bWUoaW50KTsKICAgIGVudW0gRnJhbWVBbmltYXRpb25UeXBlIHsgQ3ljbGUsIE9zY2lsbGF0ZSB9 OwogICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQW5pbWF0aW9uKEZyYW1lQW5pbWF0aW9uVHlwZT1D eWNsZSwgaW50IHN0ZXA9MSwgaW50IHN0YXRlPTApOwogICAgaW50IGZyYW1lKCkgY29uc3QKCXsg cmV0dXJuIGZybTsgfQogICAgaW50IGZyYW1lQ291bnQoKSBjb25zdAoJeyByZXR1cm4gaW1hZ2Vz LT5jb3VudCgpOyB9CgogICAgaW50IHJ0dGkoKSBjb25zdDsKICAgIHN0YXRpYyBpbnQgUlRUSTsK CiAgICBib29sIGNvbGxpZGVzV2l0aCggY29uc3QgUUNhbnZhc0l0ZW0qICkgY29uc3Q7CgogICAg UVJlY3QgYm91bmRpbmdSZWN0KCkgY29uc3Q7CgogICAgIAogCgogICAgaW50IHdpZHRoKCkgY29u c3Q7CiAgICBpbnQgaGVpZ2h0KCkgY29uc3Q7CgogICAgaW50IGxlZnRFZGdlKCkgY29uc3Q7CiAg ICBpbnQgdG9wRWRnZSgpIGNvbnN0OwogICAgaW50IHJpZ2h0RWRnZSgpIGNvbnN0OwogICAgaW50 IGJvdHRvbUVkZ2UoKSBjb25zdDsKCiAgICBpbnQgbGVmdEVkZ2UoaW50IG54KSBjb25zdDsKICAg IGludCB0b3BFZGdlKGludCBueSkgY29uc3Q7CiAgICBpbnQgcmlnaHRFZGdlKGludCBueCkgY29u c3Q7CiAgICBpbnQgYm90dG9tRWRnZShpbnQgbnkpIGNvbnN0OwogICAgUUNhbnZhc1BpeG1hcCog aW1hZ2UoKSBjb25zdAoJeyByZXR1cm4gaW1hZ2VzLT5pbWFnZShmcm0pOyB9CiAgICB2aXJ0dWFs IFFDYW52YXNQaXhtYXAqIGltYWdlQWR2YW5jZWQoKSBjb25zdDsKICAgIFFDYW52YXNQaXhtYXAq IGltYWdlKGludCBmKSBjb25zdAoJeyByZXR1cm4gaW1hZ2VzLT5pbWFnZShmKTsgfQogICAgdmly dHVhbCB2b2lkIGFkdmFuY2UoaW50IHN0YWdlKTsKCnB1YmxpYzoKICAgIHZvaWQgZHJhdyhRUGFp bnRlciYgcGFpbnRlcik7Cgpwcml2YXRlOgogICAgdm9pZCBhZGRUb0NodW5rcygpOwogICAgdm9p ZCByZW1vdmVGcm9tQ2h1bmtzKCk7CiAgICB2b2lkIGNoYW5nZUNodW5rcygpOwoKICAgIGludCBm cm07CiAgICB1c2hvcnQgYW5pbV92YWw7CiAgICB1aW50IGFuaW1fc3RhdGU6MjsKICAgIHVpbnQg YW5pbV90eXBlOjE0OwogICAgYm9vbCBjb2xsaWRlc1dpdGgoIGNvbnN0IFFDYW52YXNTcHJpdGUq LAoJCSAgICAgICBjb25zdCBRQ2FudmFzUG9seWdvbmFsSXRlbSosCgkJICAgICAgIGNvbnN0IFFD YW52YXNSZWN0YW5nbGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFzRWxsaXBzZSosCgkJICAgICAg IGNvbnN0IFFDYW52YXNUZXh0KiApIGNvbnN0OwoKICAgIGZyaWVuZCBib29sIHF0X3Rlc3RDb2xs aXNpb24oIGNvbnN0IFFDYW52YXNTcHJpdGUqIHMxLAoJCQkJICBjb25zdCBRQ2FudmFzU3ByaXRl KiBzMiApOwoKICAgIFFDYW52YXNQaXhtYXBBcnJheSogaW1hZ2VzOwp9OwoKY2xhc3MgUVBvbHln b25hbFByb2Nlc3NvcjsKCmNsYXNzICAgIFFDYW52YXNQb2x5Z29uYWxJdGVtIDogcHVibGljIFFD YW52YXNJdGVtCnsKcHVibGljOgogICAgUUNhbnZhc1BvbHlnb25hbEl0ZW0oUUNhbnZhcyogY2Fu dmFzKTsKICAgIHZpcnR1YWwgflFDYW52YXNQb2x5Z29uYWxJdGVtKCk7CgogICAgYm9vbCBjb2xs aWRlc1dpdGgoIGNvbnN0IFFDYW52YXNJdGVtKiApIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBz ZXRQZW4oUVBlbiBwKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRCcnVzaChRQnJ1c2ggYik7CgogICAg UVBlbiBwZW4oKSBjb25zdAoJeyByZXR1cm4gcG47IH0KICAgIFFCcnVzaCBicnVzaCgpIGNvbnN0 Cgl7IHJldHVybiBicjsgfQoKICAgIHZpcnR1YWwgUVBvaW50QXJyYXkgYXJlYVBvaW50cygpIGNv bnN0PTA7CiAgICB2aXJ0dWFsIFFQb2ludEFycmF5IGFyZWFQb2ludHNBZHZhbmNlZCgpIGNvbnN0 OwogICAgUVJlY3QgYm91bmRpbmdSZWN0KCkgY29uc3Q7CgogICAgaW50IHJ0dGkoKSBjb25zdDsK ICAgIHN0YXRpYyBpbnQgUlRUSTsKCnByb3RlY3RlZDoKICAgIHZvaWQgZHJhdyhRUGFpbnRlciAm KTsKICAgIHZpcnR1YWwgdm9pZCBkcmF3U2hhcGUoUVBhaW50ZXIgJikgPSAwOwoKICAgIGJvb2wg d2luZGluZygpIGNvbnN0OwogICAgdm9pZCBzZXRXaW5kaW5nKGJvb2wpOwoKcHJpdmF0ZToKICAg IHZvaWQgc2NhblBvbHlnb24oIGNvbnN0IFFQb2ludEFycmF5JiBwYSwgaW50IHdpbmRpbmcsCgkJ ICAgICAgUVBvbHlnb25hbFByb2Nlc3NvciYgcHJvY2VzcyApIGNvbnN0OwogICAgUVBvaW50QXJy YXkgY2h1bmtzKCkgY29uc3Q7CgogICAgYm9vbCBjb2xsaWRlc1dpdGgoIGNvbnN0IFFDYW52YXNT cHJpdGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFzUG9seWdvbmFsSXRlbSosCgkJICAgICAgIGNv bnN0IFFDYW52YXNSZWN0YW5nbGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFzRWxsaXBzZSosCgkJ ICAgICAgIGNvbnN0IFFDYW52YXNUZXh0KiApIGNvbnN0OwoKICAgIFFCcnVzaCBicjsKICAgIFFQ ZW4gcG47CiAgICB1aW50IHdpbmQ6MTsKfTsKCgpjbGFzcyAgICBRQ2FudmFzUmVjdGFuZ2xlIDog cHVibGljIFFDYW52YXNQb2x5Z29uYWxJdGVtCnsKcHVibGljOgogICAgUUNhbnZhc1JlY3Rhbmds ZShRQ2FudmFzKiBjYW52YXMpOwogICAgUUNhbnZhc1JlY3RhbmdsZShjb25zdCBRUmVjdCYsIFFD YW52YXMqIGNhbnZhcyk7CiAgICBRQ2FudmFzUmVjdGFuZ2xlKGludCB4LCBpbnQgeSwgaW50IHdp ZHRoLCBpbnQgaGVpZ2h0LCBRQ2FudmFzKiBjYW52YXMpOwoKICAgIH5RQ2FudmFzUmVjdGFuZ2xl KCk7CgogICAgaW50IHdpZHRoKCkgY29uc3Q7CiAgICBpbnQgaGVpZ2h0KCkgY29uc3Q7CiAgICB2 b2lkIHNldFNpemUoaW50IHcsIGludCBoKTsKICAgIFFTaXplIHNpemUoKSBjb25zdAoJeyByZXR1 cm4gUVNpemUodyxoKTsgfQogICAgUVBvaW50QXJyYXkgYXJlYVBvaW50cygpIGNvbnN0OwogICAg UVJlY3QgcmVjdCgpIGNvbnN0Cgl7IHJldHVybiBRUmVjdChpbnQoeCgpKSxpbnQoeSgpKSx3LGgp OyB9CgogICAgYm9vbCBjb2xsaWRlc1dpdGgoIGNvbnN0IFFDYW52YXNJdGVtKiApIGNvbnN0OwoK ICAgIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMgaW50IFJUVEk7Cgpwcm90ZWN0ZWQ6CiAg ICB2b2lkIGRyYXdTaGFwZShRUGFpbnRlciAmKTsKICAgIFFQb2ludEFycmF5IGNodW5rcygpIGNv bnN0OwoKcHJpdmF0ZToKICAgIGJvb2wgY29sbGlkZXNXaXRoKCAgIGNvbnN0IFFDYW52YXNTcHJp dGUqLAoJCQkgY29uc3QgUUNhbnZhc1BvbHlnb25hbEl0ZW0qLAoJCQkgY29uc3QgUUNhbnZhc1Jl Y3RhbmdsZSosCgkJCSBjb25zdCBRQ2FudmFzRWxsaXBzZSosCgkJCSBjb25zdCBRQ2FudmFzVGV4 dCogKSBjb25zdDsKCiAgICBpbnQgdywgaDsKfTsKCgpjbGFzcyAgICBRQ2FudmFzUG9seWdvbiA6 IHB1YmxpYyBRQ2FudmFzUG9seWdvbmFsSXRlbQp7CnB1YmxpYzoKICAgIFFDYW52YXNQb2x5Z29u KFFDYW52YXMqIGNhbnZhcyk7CiAgICB+UUNhbnZhc1BvbHlnb24oKTsKICAgIHZvaWQgc2V0UG9p bnRzKFFQb2ludEFycmF5KTsKICAgIFFQb2ludEFycmF5IHBvaW50cygpIGNvbnN0OwogICAgdm9p ZCBtb3ZlQnkoZG91YmxlIGR4LCBkb3VibGUgZHkpOwoKICAgIFFQb2ludEFycmF5IGFyZWFQb2lu dHMoKSBjb25zdDsKCiAgICBpbnQgcnR0aSgpIGNvbnN0OwogICAgc3RhdGljIGludCBSVFRJOwoK cHJvdGVjdGVkOgogICAgdm9pZCBkcmF3U2hhcGUoUVBhaW50ZXIgJik7CiAgICBRUG9pbnRBcnJh eSBwb2x5Owp9OwoKCmNsYXNzICAgIFFDYW52YXNTcGxpbmUgOiBwdWJsaWMgUUNhbnZhc1BvbHln b24KewpwdWJsaWM6CiAgICBRQ2FudmFzU3BsaW5lKFFDYW52YXMqIGNhbnZhcyk7CiAgICB+UUNh bnZhc1NwbGluZSgpOwoKICAgIHZvaWQgc2V0Q29udHJvbFBvaW50cyhRUG9pbnRBcnJheSwgYm9v bCBjbG9zZWQ9VFJVRSk7CiAgICBRUG9pbnRBcnJheSBjb250cm9sUG9pbnRzKCkgY29uc3Q7CiAg ICBib29sIGNsb3NlZCgpIGNvbnN0OwoKICAgIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMg aW50IFJUVEk7Cgpwcml2YXRlOgogICAgdm9pZCByZWNhbGNQb2x5KCk7CiAgICBRUG9pbnRBcnJh eSBiZXo7CiAgICBib29sIGNsOwp9OwoKCmNsYXNzICAgIFFDYW52YXNMaW5lIDogcHVibGljIFFD YW52YXNQb2x5Z29uYWxJdGVtCnsKcHVibGljOgogICAgUUNhbnZhc0xpbmUoUUNhbnZhcyogY2Fu dmFzKTsKICAgIH5RQ2FudmFzTGluZSgpOwogICAgdm9pZCBzZXRQb2ludHMoaW50IHgxLCBpbnQg eTEsIGludCB4MiwgaW50IHkyKTsKCiAgICBRUG9pbnQgc3RhcnRQb2ludCgpIGNvbnN0Cgl7IHJl dHVybiBRUG9pbnQoeDEseTEpOyB9CiAgICBRUG9pbnQgZW5kUG9pbnQoKSBjb25zdAoJeyByZXR1 cm4gUVBvaW50KHgyLHkyKTsgfQoKICAgIGludCBydHRpKCkgY29uc3Q7CiAgICBzdGF0aWMgaW50 IFJUVEk7CgogICAgdm9pZCBzZXRQZW4oUVBlbiBwKTsKCnByb3RlY3RlZDoKICAgIHZvaWQgZHJh d1NoYXBlKFFQYWludGVyICYpOwogICAgUVBvaW50QXJyYXkgYXJlYVBvaW50cygpIGNvbnN0OwoK cHJpdmF0ZToKICAgIGludCB4MSx5MSx4Mix5MjsKfTsKCgpjbGFzcyAgICBRQ2FudmFzRWxsaXBz ZSA6IHB1YmxpYyBRQ2FudmFzUG9seWdvbmFsSXRlbQp7CgpwdWJsaWM6CiAgICBRQ2FudmFzRWxs aXBzZSggUUNhbnZhcyogY2FudmFzICk7CiAgICBRQ2FudmFzRWxsaXBzZSggaW50IHdpZHRoLCBp bnQgaGVpZ2h0LCBRQ2FudmFzKiBjYW52YXMgKTsKICAgIFFDYW52YXNFbGxpcHNlKCBpbnQgd2lk dGgsIGludCBoZWlnaHQsIGludCBzdGFydGFuZ2xlLCBpbnQgYW5nbGUsCgkJICAgIFFDYW52YXMq IGNhbnZhcyApOwoKICAgIH5RQ2FudmFzRWxsaXBzZSgpOwoKICAgIGludCB3aWR0aCgpIGNvbnN0 OwogICAgaW50IGhlaWdodCgpIGNvbnN0OwogICAgdm9pZCBzZXRTaXplKGludCB3LCBpbnQgaCk7 CiAgICB2b2lkIHNldEFuZ2xlcyhpbnQgc3RhcnQsIGludCBsZW5ndGgpOwogICAgaW50IGFuZ2xl U3RhcnQoKSBjb25zdAoJeyByZXR1cm4gYTE7IH0KICAgIGludCBhbmdsZUxlbmd0aCgpIGNvbnN0 Cgl7IHJldHVybiBhMjsgfQogICAgUVBvaW50QXJyYXkgYXJlYVBvaW50cygpIGNvbnN0OwoKICAg IGJvb2wgY29sbGlkZXNXaXRoKCBjb25zdCBRQ2FudmFzSXRlbSogKSBjb25zdDsKCiAgICBpbnQg cnR0aSgpIGNvbnN0OwogICAgc3RhdGljIGludCBSVFRJOwoKcHJvdGVjdGVkOgogICAgdm9pZCBk cmF3U2hhcGUoUVBhaW50ZXIgJik7Cgpwcml2YXRlOgogICAgYm9vbCBjb2xsaWRlc1dpdGgoIGNv bnN0IFFDYW52YXNTcHJpdGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFzUG9seWdvbmFsSXRlbSos CgkJICAgICAgIGNvbnN0IFFDYW52YXNSZWN0YW5nbGUqLAoJCSAgICAgICBjb25zdCBRQ2FudmFz RWxsaXBzZSosCgkJICAgICAgIGNvbnN0IFFDYW52YXNUZXh0KiApIGNvbnN0OwogICAgaW50IHcs IGg7CiAgICBpbnQgYTEsIGEyOwp9OwoKCmNsYXNzIFFDYW52YXNUZXh0RXh0cmE7CgpjbGFzcyAg ICBRQ2FudmFzVGV4dCA6IHB1YmxpYyBRQ2FudmFzSXRlbQp7CnB1YmxpYzoKICAgIFFDYW52YXNU ZXh0KFFDYW52YXMqIGNhbnZhcyk7CiAgICBRQ2FudmFzVGV4dChjb25zdCBRU3RyaW5nJiwgUUNh bnZhcyogY2FudmFzKTsKICAgIFFDYW52YXNUZXh0KGNvbnN0IFFTdHJpbmcmLCBRRm9udCwgUUNh bnZhcyogY2FudmFzKTsKCiAgICB2aXJ0dWFsIH5RQ2FudmFzVGV4dCgpOwoKICAgIHZvaWQgc2V0 VGV4dCggY29uc3QgUVN0cmluZyYgKTsKICAgIHZvaWQgc2V0Rm9udCggY29uc3QgUUZvbnQmICk7 CiAgICB2b2lkIHNldENvbG9yKCBjb25zdCBRQ29sb3ImICk7CiAgICBRU3RyaW5nIHRleHQoKSBj b25zdDsKICAgIFFGb250IGZvbnQoKSBjb25zdDsKICAgIFFDb2xvciBjb2xvcigpIGNvbnN0OwoK ICAgIHZvaWQgbW92ZUJ5KGRvdWJsZSBkeCwgZG91YmxlIGR5KTsKCiAgICBpbnQgdGV4dEZsYWdz KCkgY29uc3QKCXsgcmV0dXJuIGZsYWdzOyB9CiAgICB2b2lkIHNldFRleHRGbGFncyhpbnQpOwoK ICAgIFFSZWN0IGJvdW5kaW5nUmVjdCgpIGNvbnN0OwoKICAgIGJvb2wgY29sbGlkZXNXaXRoKCBj b25zdCBRQ2FudmFzSXRlbSogKSBjb25zdDsKCiAgICBpbnQgcnR0aSgpIGNvbnN0OwogICAgc3Rh dGljIGludCBSVFRJOwoKcHJvdGVjdGVkOgogICAgdmlydHVhbCB2b2lkIGRyYXcoUVBhaW50ZXIm KTsKCnByaXZhdGU6CiAgICB2b2lkIGFkZFRvQ2h1bmtzKCk7CiAgICB2b2lkIHJlbW92ZUZyb21D aHVua3MoKTsKICAgIHZvaWQgY2hhbmdlQ2h1bmtzKCk7CgogICAgdm9pZCBzZXRSZWN0KCk7CiAg ICBRUmVjdCBicmVjdDsKICAgIFFTdHJpbmcgdHh0OwogICAgaW50IGZsYWdzOwogICAgUUZvbnQg Zm50OwogICAgUUNvbG9yIGNvbDsKICAgIFFDYW52YXNUZXh0RXh0cmEqIGV4dHJhOwoKICAgIGJv b2wgY29sbGlkZXNXaXRoKCAgIGNvbnN0IFFDYW52YXNTcHJpdGUqLAoJCQkgY29uc3QgUUNhbnZh c1BvbHlnb25hbEl0ZW0qLAoJCQkgY29uc3QgUUNhbnZhc1JlY3RhbmdsZSosCgkJCSBjb25zdCBR Q2FudmFzRWxsaXBzZSosCgkJCSBjb25zdCBRQ2FudmFzVGV4dCogKSBjb25zdDsKfTsKCgoKCgoj IDQgImNhbnZhc3RleHQuaCIgMgoKCmNsYXNzIFFGb250OwoKCmNsYXNzIENhbnZhc1RleHQgOiBw dWJsaWMgUUNhbnZhc1RleHQKewpwdWJsaWM6CiAgICBlbnVtIHsgQ0FOVkFTX1RFWFQgPSAxMTAw IH07CgogICAgQ2FudmFzVGV4dCggaW50IGluZGV4LCBRQ2FudmFzICpjYW52YXMgKQoJOiBRQ2Fu dmFzVGV4dCggY2FudmFzICksIG1faW5kZXgoIGluZGV4ICkge30KICAgIENhbnZhc1RleHQoIGlu dCBpbmRleCwgY29uc3QgUVN0cmluZyYgdGV4dCwgUUNhbnZhcyAqY2FudmFzICkKCTogUUNhbnZh c1RleHQoIHRleHQsIGNhbnZhcyApLCBtX2luZGV4KCBpbmRleCApIHt9CiAgICBDYW52YXNUZXh0 KCBpbnQgaW5kZXgsIGNvbnN0IFFTdHJpbmcmIHRleHQsIFFGb250IGZvbnQsIFFDYW52YXMgKmNh bnZhcyApCgk6IFFDYW52YXNUZXh0KCB0ZXh0LCBmb250LCBjYW52YXMgKSwgbV9pbmRleCggaW5k ZXggKSB7fQoKICAgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KICAgIHZv aWQgc2V0SW5kZXgoIGludCBpbmRleCApIHsgbV9pbmRleCA9IGluZGV4OyB9CgogICAgaW50IHJ0 dGkoKSBjb25zdCB7IHJldHVybiBDQU5WQVNfVEVYVDsgfQoKcHJpdmF0ZToKICAgIGludCBtX2lu ZGV4Owp9OwoKCgojIDUgImNhbnZhc3ZpZXcuaCIgMgoKCgoKCmNsYXNzIFFQb2ludDsKCgpjbGFz cyBDYW52YXNWaWV3IDogcHVibGljIFFDYW52YXNWaWV3CnsKICAgIHB1YmxpYzoJdmlydHVhbCBR TWV0YU9iamVjdCAqbWV0YU9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY01ldGFPYmplY3Qo KTsJfQl2aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzTmFtZSgpIGNvbnN0Owl2aXJ0dWFsIHZvaWQq IHF0X2Nhc3QoIGNvbnN0IGNoYXIqICk7IHZpcnR1YWwgYm9vbCBxdF9pbnZva2UoIGludCwgUVVP YmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9lbWl0KCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFs IGJvb2wgcXRfcHJvcGVydHkoIGludCwgaW50LCBRVmFyaWFudCogKTsgCXN0YXRpYyBRTWV0YU9i amVjdCogc3RhdGljTWV0YU9iamVjdCgpOwlRT2JqZWN0KiBxT2JqZWN0KCkgeyByZXR1cm4gKFFP YmplY3QqKXRoaXM7IH0gc3RhdGljIFFTdHJpbmcgdHIoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hh ciAqID0gMCApOyBzdGF0aWMgUVN0cmluZyB0clV0ZjgoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hh ciAqID0gMCApOyAJcHJpdmF0ZToJc3RhdGljIFFNZXRhT2JqZWN0ICptZXRhT2JqOyAKcHVibGlj OgogICAgQ2FudmFzVmlldyggUUNhbnZhcyAqY2FudmFzLCBFbGVtZW50VmVjdG9yICplbGVtZW50 cywKCQlRV2lkZ2V0KiBwYXJlbnQgPSAwLCBjb25zdCBjaGFyKiBuYW1lID0gImNhbnZhcyB2aWV3 IiwKCQlXRmxhZ3MgZiA9IDAgKQoJOiBRQ2FudmFzVmlldyggY2FudmFzLCBwYXJlbnQsIG5hbWUs IGYgKSwKCSAgbV9lbGVtZW50cyggZWxlbWVudHMgKSB7fQoKcHJvdGVjdGVkOgogICAgdm9pZCB2 aWV3cG9ydFJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQgKmUgKTsKICAgIHZvaWQgY29udGVudHNN b3VzZVByZXNzRXZlbnQoIFFNb3VzZUV2ZW50ICplICk7CiAgICB2b2lkIGNvbnRlbnRzTW91c2VN b3ZlRXZlbnQoIFFNb3VzZUV2ZW50ICplICk7CiAgICB2b2lkIGNvbnRlbnRzQ29udGV4dE1lbnVF dmVudCggUUNvbnRleHRNZW51RXZlbnQgKmUgKTsKCnByaXZhdGU6CiAgICBRQ2FudmFzSXRlbSAq bV9tb3ZpbmdJdGVtOwogICAgUVBvaW50IG1fcG9zOwogICAgRWxlbWVudFZlY3RvciAqbV9lbGVt ZW50czsKfTsKCgoKIyAxICJjaGFydGZvcm1fZmlsZXMuY3BwIiAyCgojIDEgImNoYXJ0Zm9ybS5o IiAxCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW1haW53aW5kb3cuaCIgMQogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0 L2luY2x1ZGUvcXRvb2xiYXIuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZG9ja3dpbmRvdy5oIiAxCiAKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgUURvY2tXaW5k b3dIYW5kbGU7CmNsYXNzIFFEb2NrV2luZG93VGl0bGVCYXI7CmNsYXNzIFFQYWludGVyOwpjbGFz cyBRRG9ja1dpbmRvd1Jlc2l6ZUhhbmRsZTsKY2xhc3MgUUJveExheW91dDsKY2xhc3MgUUhCb3hM YXlvdXQ7CmNsYXNzIFFWQm94TGF5b3V0OwpjbGFzcyBRRG9ja0FyZWE7CmNsYXNzIFFXaWRnZXRS ZXNpemVIYW5kbGVyOwpjbGFzcyBRTWFpbldpbmRvdzsKY2xhc3MgUURvY2tBcmVhTGF5b3V0Owpj bGFzcyBRRG9ja1dpbmRvd1ByaXZhdGU7CgpjbGFzcyAgIFFEb2NrV2luZG93IDogcHVibGljIFFG cmFtZQp7CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFPYmplY3QoKSBjb25z dCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25zdCBjaGFyICpjbGFz c05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBjaGFyKiApOyB2aXJ0 dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wgcXRfZW1p dCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5KCBpbnQsIGludCwg UVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFPYmplY3QoKTsJUU9i amVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0YXRpYyBRU3RyaW5n IHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGljIFFTdHJpbmcgdHJV dGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZhdGU6CXN0YXRpYyBR TWV0YU9iamVjdCAqbWV0YU9iajsgCiAgICAgCiAgICAgICAKICAgICAKICAgICAKICAgICAKICAg ICAKICAgICAKICAgICAKICAgICAKICAgICAKICAgICAKCiAgICBmcmllbmQgY2xhc3MgUURvY2tX aW5kb3dIYW5kbGU7CiAgICBmcmllbmQgY2xhc3MgUURvY2tXaW5kb3dUaXRsZUJhcjsKICAgIGZy aWVuZCBjbGFzcyBRRG9ja0FyZWE7CiAgICBmcmllbmQgY2xhc3MgUURvY2tBcmVhTGF5b3V0Owog ICAgZnJpZW5kIGNsYXNzIFFNYWluV2luZG93OwoKcHVibGljOgogICAgZW51bSBQbGFjZSB7IElu RG9jaywgT3V0c2lkZURvY2sgfTsKICAgIGVudW0gQ2xvc2VNb2RlIHsgTmV2ZXIgPSAwLCBEb2Nr ZWQgPSAxLCBVbmRvY2tlZCA9IDIsIEFsd2F5cyA9IERvY2tlZCB8IFVuZG9ja2VkIH07CgogICAg UURvY2tXaW5kb3coIFBsYWNlIHAgPSBJbkRvY2ssIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBj aGFyKiBuYW1lPTAsIFdGbGFncyBmID0gMCApOwogICAgflFEb2NrV2luZG93KCk7CgogICAgdmly dHVhbCB2b2lkIHNldFdpZGdldCggUVdpZGdldCAqdyApOwogICAgUVdpZGdldCAqd2lkZ2V0KCkg Y29uc3Q7CgogICAgUGxhY2UgcGxhY2UoKSBjb25zdCB7IHJldHVybiBjdXJQbGFjZTsgfQoKICAg IFFEb2NrQXJlYSAqYXJlYSgpIGNvbnN0OwoKICAgIHZpcnR1YWwgdm9pZCBzZXRDbG9zZU1vZGUo IGludCBtICk7CiAgICBib29sIGlzQ2xvc2VFbmFibGVkKCkgY29uc3Q7CiAgICBpbnQgY2xvc2VN b2RlKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFJlc2l6ZUVuYWJsZWQoIGJvb2wgYiAp OwogICAgdmlydHVhbCB2b2lkIHNldE1vdmluZ0VuYWJsZWQoIGJvb2wgYiApOwogICAgYm9vbCBp c1Jlc2l6ZUVuYWJsZWQoKSBjb25zdDsKICAgIGJvb2wgaXNNb3ZpbmdFbmFibGVkKCkgY29uc3Q7 CgogICAgdmlydHVhbCB2b2lkIHNldEhvcml6b250YWxseVN0cmV0Y2hhYmxlKCBib29sIGIgKTsK ICAgIHZpcnR1YWwgdm9pZCBzZXRWZXJ0aWNhbGx5U3RyZXRjaGFibGUoIGJvb2wgYiApOwogICAg Ym9vbCBpc0hvcml6b250YWxseVN0cmV0Y2hhYmxlKCkgY29uc3Q7CiAgICBib29sIGlzVmVydGlj YWxseVN0cmV0Y2hhYmxlKCkgY29uc3Q7CiAgICB2b2lkIHNldEhvcml6b250YWxTdHJldGNoYWJs ZSggYm9vbCBiICkgeyBzZXRIb3Jpem9udGFsbHlTdHJldGNoYWJsZSggYiApOyB9CiAgICB2b2lk IHNldFZlcnRpY2FsU3RyZXRjaGFibGUoIGJvb2wgYiApIHsgc2V0VmVydGljYWxseVN0cmV0Y2hh YmxlKCBiICk7IH0KICAgIGJvb2wgaXNIb3Jpem9udGFsU3RyZXRjaGFibGUoKSBjb25zdCB7IHJl dHVybiBpc0hvcml6b250YWxseVN0cmV0Y2hhYmxlKCk7IH0KICAgIGJvb2wgaXNWZXJ0aWNhbFN0 cmV0Y2hhYmxlKCkgY29uc3QgeyByZXR1cm4gaXNWZXJ0aWNhbGx5U3RyZXRjaGFibGUoKTsgfQog ICAgYm9vbCBpc1N0cmV0Y2hhYmxlKCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldE9mZnNl dCggaW50IG8gKTsKICAgIGludCBvZmZzZXQoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0 Rml4ZWRFeHRlbnRXaWR0aCggaW50IHcgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRGaXhlZEV4dGVu dEhlaWdodCggaW50IGggKTsKICAgIFFTaXplIGZpeGVkRXh0ZW50KCkgY29uc3Q7CgogICAgdmly dHVhbCB2b2lkIHNldE5ld0xpbmUoIGJvb2wgYiApOwogICAgYm9vbCBuZXdMaW5lKCkgY29uc3Q7 CgogICAgUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKCkgY29uc3Q7CgogICAgUVNpemUgc2l6 ZUhpbnQoKSBjb25zdDsKICAgIFFTaXplIG1pbmltdW1TaXplKCkgY29uc3Q7CiAgICBRU2l6ZSBt aW5pbXVtU2l6ZUhpbnQoKSBjb25zdDsKCiAgICBRQm94TGF5b3V0ICpib3hMYXlvdXQoKTsKCiAg ICB2aXJ0dWFsIHZvaWQgc2V0T3BhcXVlTW92aW5nKCBib29sIGIgKTsKICAgIGJvb2wgb3BhcXVl TW92aW5nKCkgY29uc3Q7CgogICAgYm9vbCBldmVudEZpbHRlciggUU9iamVjdCAqbywgUUV2ZW50 ICplICk7CgoKCgoKcHJvdGVjdGVkIDoKICAgIHZvaWQgb3JpZW50YXRpb25DaGFuZ2VkKCBPcmll bnRhdGlvbiBvICk7CiAgICB2b2lkIHBsYWNlQ2hhbmdlZCggUURvY2tXaW5kb3c6OlBsYWNlIHAg KTsKICAgIHZvaWQgdmlzaWJpbGl0eUNoYW5nZWQoIGJvb2wgKTsKCnB1YmxpYyAgOgogICAgdmly dHVhbCB2b2lkIHVuZG9jayggUVdpZGdldCAqdyApOwogICAgdmlydHVhbCB2b2lkIHVuZG9jaygp IHsgdW5kb2NrKCAwICk7IH0KICAgIHZpcnR1YWwgdm9pZCBkb2NrKCk7CiAgICB2aXJ0dWFsIHZv aWQgc2V0T3JpZW50YXRpb24oIE9yaWVudGF0aW9uIG8gKTsKICAgIHZvaWQgc2V0Q2FwdGlvbigg Y29uc3QgUVN0cmluZyAmcyApOwoKcHJvdGVjdGVkOgogICAgdm9pZCByZXNpemVFdmVudCggUVJl c2l6ZUV2ZW50ICplICk7CiAgICB2b2lkIHNob3dFdmVudCggUVNob3dFdmVudCAqZSApOwogICAg dm9pZCBoaWRlRXZlbnQoIFFIaWRlRXZlbnQgKmUgKTsKICAgIHZvaWQgY29udGV4dE1lbnVFdmVu dCggUUNvbnRleHRNZW51RXZlbnQgKmUgKTsKCiAgICB2b2lkIGRyYXdGcmFtZSggUVBhaW50ZXIg KiApOwoKICAgIGJvb2wgZXZlbnQoIFFFdmVudCAqZSApOwoKcHJpdmF0ZSAgOgogICAgdm9pZCB0 b2dnbGVWaXNpYmxlKCkgeyBpZiAoICFpc1Zpc2libGUoKSApIHNob3coKTsgZWxzZSBoaWRlKCk7 IH0KCnByaXZhdGU6CiAgICB2b2lkIGhhbmRsZU1vdmUoIGNvbnN0IFFQb2ludCAmcG9zLCBjb25z dCBRUG9pbnQgJmdwLCBib29sIGRyYXdSZWN0ICk7CiAgICB2b2lkIHVwZGF0ZUd1aSgpOwogICAg dm9pZCB1cGRhdGVTcGxpdHRlclZpc2liaWxpdHkoIGJvb2wgdmlzaWJsZSApOwoKICAgIHZvaWQg c3RhcnRSZWN0RHJhdyggY29uc3QgUVBvaW50ICZzbywgYm9vbCBkcmF3UmVjdCApOwogICAgdm9p ZCBlbmRSZWN0RHJhdyggYm9vbCBkcmF3UmVjdCApOwogICAgdm9pZCB1cGRhdGVQb3NpdGlvbigg Y29uc3QgUVBvaW50ICZnbG9iYWxQb3MgICk7CiAgICBRV2lkZ2V0ICphcmVhQXQoIGNvbnN0IFFQ b2ludCAmZ3AgKTsKICAgIHZvaWQgcmVtb3ZlRnJvbURvY2soIGJvb2wgZml4TmV3TGluZXMgPSBU UlVFICk7CiAgICB2b2lkIHN3YXBSZWN0KCBRUmVjdCAmciwgUXQ6Ok9yaWVudGF0aW9uIG8sIGNv bnN0IFFQb2ludCAmb2Zmc2V0LCBRRG9ja0FyZWEgKmFyZWEgKTsKCnByaXZhdGU6CiAgICBRRG9j a1dpbmRvd0hhbmRsZSAqaG9ySGFuZGxlLCAqdmVySGFuZGxlOwogICAgUURvY2tXaW5kb3dUaXRs ZUJhciAqdGl0bGVCYXI7CiAgICBRV2lkZ2V0ICp3aWQ7CiAgICBRUGFpbnRlciAqdW5jbGlwcGVk UGFpbnRlcjsKICAgIFFEb2NrQXJlYSAqZG9ja0FyZWEsICp0bXBEb2NrQXJlYTsKICAgIFFSZWN0 IGN1cnJSZWN0OwogICAgUGxhY2UgY3VyUGxhY2U7CiAgICBQbGFjZSBzdGF0ZTsKICAgIGJvb2wg cmVzaXplRW5hYmxlZCA6IDE7CiAgICBib29sIG1vdmVFbmFibGVkIDogMTsKICAgIGJvb2wgbmwg OiAxOwogICAgYm9vbCBvcGFxdWUgOiAxOwogICAgYm9vbCBzdHJldGNoYWJsZVsgMyBdOwogICAg T3JpZW50YXRpb24gc3RhcnRPcmllbnRhdGlvbjsKICAgIGludCBjTW9kZTsKICAgIFFQb2ludCBz dGFydE9mZnNldDsKICAgIGludCBvZmZzOwogICAgUVNpemUgZkV4dGVudDsKICAgIFFEb2NrV2lu ZG93UmVzaXplSGFuZGxlICpoSGFuZGxlVG9wLCAqaEhhbmRsZUJvdHRvbSwgKnZIYW5kbGVMZWZ0 LCAqdkhhbmRsZVJpZ2h0OwogICAgUVZCb3hMYXlvdXQgKmhib3g7CiAgICBRSEJveExheW91dCAq dmJveDsKICAgIFFCb3hMYXlvdXQgKmxheW91dDsKICAgIHZvaWQgKmRvY2tXaW5kb3dEYXRhOwog ICAgUVBvaW50IGxhc3RQb3M7CiAgICBRU2l6ZSBsYXN0U2l6ZTsKICAgIFFXaWRnZXRSZXNpemVI YW5kbGVyICp3aWRnZXRSZXNpemVIYW5kbGVyOwogICAgUURvY2tXaW5kb3dQcml2YXRlICpkOwoK cHJpdmF0ZToJIAoKICAgIFFEb2NrV2luZG93KCBjb25zdCBRRG9ja1dpbmRvdyAmICk7CiAgICBR RG9ja1dpbmRvdyYgb3BlcmF0b3I9KCBjb25zdCBRRG9ja1dpbmRvdyAmICk7Cgp9OwoKaW5saW5l IFFEb2NrQXJlYSAqUURvY2tXaW5kb3c6OmFyZWEoKSBjb25zdAp7CiAgICByZXR1cm4gZG9ja0Fy ZWE7Cn0KCgoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xdG9vbGJhci5oIiAyCgoKCgoK Y2xhc3MgUU1haW5XaW5kb3c7CmNsYXNzIFFCdXR0b247CmNsYXNzIFFCb3hMYXlvdXQ7CmNsYXNz IFFUb29sQmFyUHJpdmF0ZTsKCmNsYXNzICAgUVRvb2xCYXI6IHB1YmxpYyBRRG9ja1dpbmRvdwp7 CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFPYmplY3QoKSBjb25zdCB7IHJl dHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25zdCBjaGFyICpjbGFzc05hbWUo KSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBjaGFyKiApOyB2aXJ0dWFsIGJv b2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wgcXRfZW1pdCggaW50 LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5KCBpbnQsIGludCwgUVZhcmlh bnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFPYmplY3QoKTsJUU9iamVjdCog cU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0YXRpYyBRU3RyaW5nIHRyKCBj b25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGljIFFTdHJpbmcgdHJVdGY4KCBj b25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZhdGU6CXN0YXRpYyBRTWV0YU9i amVjdCAqbWV0YU9iajsgCiAgICAgCgpwdWJsaWM6CiAgICBRVG9vbEJhciggY29uc3QgUVN0cmlu ZyAmbGFiZWwsCgkgICAgICBRTWFpbldpbmRvdyAqLCBUb29sQmFyRG9jayA9IERvY2tUb3AsCgkg ICAgICBib29sIG5ld0xpbmUgPSBGQUxTRSwgY29uc3QgY2hhciogbmFtZT0wICk7CiAgICBRVG9v bEJhciggY29uc3QgUVN0cmluZyAmbGFiZWwsIFFNYWluV2luZG93ICosIFFXaWRnZXQgKiwKCSAg ICAgIGJvb2wgbmV3TGluZSA9IEZBTFNFLCBjb25zdCBjaGFyKiBuYW1lPTAsIFdGbGFncyBmID0g MCApOwogICAgUVRvb2xCYXIoIFFNYWluV2luZG93KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFt ZT0wICk7CiAgICB+UVRvb2xCYXIoKTsKCiAgICB2b2lkIGFkZFNlcGFyYXRvcigpOwoKICAgIHZv aWQgc2hvdygpOwogICAgdm9pZCBoaWRlKCk7CgogICAgUU1haW5XaW5kb3cgKiBtYWluV2luZG93 KCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkIHNldFN0cmV0Y2hhYmxlV2lkZ2V0KCBRV2lkZ2V0 ICogKTsKCiAgICBib29sIGV2ZW50KCBRRXZlbnQgKiBlICk7CgogICAgdmlydHVhbCB2b2lkIHNl dExhYmVsKCBjb25zdCBRU3RyaW5nICYgKTsKICAgIFFTdHJpbmcgbGFiZWwoKSBjb25zdDsKCiAg ICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKCiAgICBRU2l6ZSBtaW5pbXVtU2l6ZSgpIGNvbnN0Owog ICAgUVNpemUgbWluaW11bVNpemVIaW50KCkgY29uc3Q7CgogICAgdm9pZCBzZXRPcmllbnRhdGlv biggT3JpZW50YXRpb24gbyApOwogICAgdm9pZCBzZXRNaW5pbXVtU2l6ZSggaW50IG1pbncsIGlu dCBtaW5oICk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQg KmUgKTsKICAgIHZvaWQgc3R5bGVDaGFuZ2UoIFFTdHlsZSAmICk7Cgpwcml2YXRlICA6CiAgICB2 b2lkIHBvcHVwU2VsZWN0ZWQoIGludCBpZCApOwogICAgdm9pZCBlbXVsYXRlQnV0dG9uQ2xpY2tl ZCgpOwogICAgdm9pZCBzZXR1cEFycm93TWVudSgpOwoKcHJpdmF0ZToKICAgIHZvaWQgaW5pdCgp OwoKICAgIFFUb29sQmFyUHJpdmF0ZSAqIGQ7CiAgICBRTWFpbldpbmRvdyAqIG13OwogICAgUVdp ZGdldCAqIHN3OwogICAgUVN0cmluZyBsOwoKICAgIGZyaWVuZCBjbGFzcyBRTWFpbldpbmRvdzsK CnByaXZhdGU6CSAKCiAgICBRVG9vbEJhciggY29uc3QgUVRvb2xCYXIgJiApOwogICAgUVRvb2xC YXImIG9wZXJhdG9yPSggY29uc3QgUVRvb2xCYXIgJiApOwoKfTsKCgoKCiMgNDMgIi91c3IvbG9j YWwvcXQvaW5jbHVkZS9xbWFpbndpbmRvdy5oIiAyCgoKCgoKCgpjbGFzcyBRTWVudUJhcjsKY2xh c3MgUVN0YXR1c0JhcjsKY2xhc3MgUVRvb2xUaXBHcm91cDsKY2xhc3MgUU1haW5XaW5kb3dQcml2 YXRlOwpjbGFzcyBRTWFpbldpbmRvd0xheW91dDsKY2xhc3MgUVBvcHVwTWVudTsKCmNsYXNzICAg UU1haW5XaW5kb3c6IHB1YmxpYyBRV2lkZ2V0CnsKICAgIHB1YmxpYzoJdmlydHVhbCBRTWV0YU9i amVjdCAqbWV0YU9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY01ldGFPYmplY3QoKTsJfQl2 aXJ0dWFsIGNvbnN0IGNoYXIgKmNsYXNzTmFtZSgpIGNvbnN0Owl2aXJ0dWFsIHZvaWQqIHF0X2Nh c3QoIGNvbnN0IGNoYXIqICk7IHZpcnR1YWwgYm9vbCBxdF9pbnZva2UoIGludCwgUVVPYmplY3Qq ICk7IHZpcnR1YWwgYm9vbCBxdF9lbWl0KCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wg cXRfcHJvcGVydHkoIGludCwgaW50LCBRVmFyaWFudCogKTsgCXN0YXRpYyBRTWV0YU9iamVjdCog c3RhdGljTWV0YU9iamVjdCgpOwlRT2JqZWN0KiBxT2JqZWN0KCkgeyByZXR1cm4gKFFPYmplY3Qq KXRoaXM7IH0gc3RhdGljIFFTdHJpbmcgdHIoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqID0g MCApOyBzdGF0aWMgUVN0cmluZyB0clV0ZjgoIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqID0g MCApOyAJcHJpdmF0ZToJc3RhdGljIFFNZXRhT2JqZWN0ICptZXRhT2JqOyAKICAgICAKICAgICAK ICAgICAKICAgICAKICAgICAKCnB1YmxpYzoKICAgIFFNYWluV2luZG93KCBRV2lkZ2V0KiBwYXJl bnQ9MCwgY29uc3QgY2hhciogbmFtZT0wLCBXRmxhZ3MgZiA9IFdUeXBlX1RvcExldmVsICk7CiAg ICB+UU1haW5XaW5kb3coKTsKCgogICAgUU1lbnVCYXIgKiBtZW51QmFyKCkgY29uc3Q7CgogICAg UVN0YXR1c0JhciAqIHN0YXR1c0JhcigpIGNvbnN0OwoKICAgIFFUb29sVGlwR3JvdXAgKiB0b29s VGlwR3JvdXAoKSBjb25zdDsKCgogICAgdmlydHVhbCB2b2lkIHNldENlbnRyYWxXaWRnZXQoIFFX aWRnZXQgKiApOwogICAgUVdpZGdldCAqIGNlbnRyYWxXaWRnZXQoKSBjb25zdDsKCiAgICB2aXJ0 dWFsIHZvaWQgc2V0RG9ja0VuYWJsZWQoIERvY2sgZG9jaywgYm9vbCBlbmFibGUgKTsKICAgIGJv b2wgaXNEb2NrRW5hYmxlZCggRG9jayBkb2NrICkgY29uc3Q7CiAgICBib29sIGlzRG9ja0VuYWJs ZWQoIFFEb2NrQXJlYSAqYXJlYSApIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldERvY2tFbmFi bGVkKCBRRG9ja1dpbmRvdyAqdGIsIERvY2sgZG9jaywgYm9vbCBlbmFibGUgKTsKICAgIGJvb2wg aXNEb2NrRW5hYmxlZCggUURvY2tXaW5kb3cgKnRiLCBEb2NrIGRvY2sgKSBjb25zdDsKICAgIGJv b2wgaXNEb2NrRW5hYmxlZCggUURvY2tXaW5kb3cgKnRiLCBRRG9ja0FyZWEgKmFyZWEgKSBjb25z dDsKCiAgICB2aXJ0dWFsIHZvaWQgYWRkRG9ja1dpbmRvdyggUURvY2tXaW5kb3cgKiwgRG9jayA9 IERvY2tUb3AsIGJvb2wgbmV3TGluZSA9IEZBTFNFICk7CiAgICB2aXJ0dWFsIHZvaWQgYWRkRG9j a1dpbmRvdyggUURvY2tXaW5kb3cgKiwgY29uc3QgUVN0cmluZyAmbGFiZWwsCgkJCQlEb2NrID0g RG9ja1RvcCwgYm9vbCBuZXdMaW5lID0gRkFMU0UgKTsKICAgIHZpcnR1YWwgdm9pZCBtb3ZlRG9j a1dpbmRvdyggUURvY2tXaW5kb3cgKiwgRG9jayA9IERvY2tUb3AgKTsKICAgIHZpcnR1YWwgdm9p ZCBtb3ZlRG9ja1dpbmRvdyggUURvY2tXaW5kb3cgKiwgRG9jaywgYm9vbCBubCwgaW50IGluZGV4 LCBpbnQgZXh0cmFPZmZzZXQgPSAtMSApOwogICAgdmlydHVhbCB2b2lkIHJlbW92ZURvY2tXaW5k b3coIFFEb2NrV2luZG93ICogKTsKCiAgICB2b2lkIHNob3coKTsKICAgIFFTaXplIHNpemVIaW50 KCkgY29uc3Q7CiAgICBRU2l6ZSBtaW5pbXVtU2l6ZUhpbnQoKSBjb25zdDsKCiAgICBib29sIHJp Z2h0SnVzdGlmaWNhdGlvbigpIGNvbnN0OwogICAgYm9vbCB1c2VzQmlnUGl4bWFwcygpIGNvbnN0 OwogICAgYm9vbCB1c2VzVGV4dExhYmVsKCkgY29uc3Q7CiAgICBib29sIGRvY2tXaW5kb3dzTW92 YWJsZSgpIGNvbnN0OwogICAgYm9vbCBvcGFxdWVNb3ZpbmcoKSBjb25zdDsKCiAgICBib29sIGV2 ZW50RmlsdGVyKCBRT2JqZWN0KiwgUUV2ZW50KiApOwoKICAgIGJvb2wgZ2V0TG9jYXRpb24oIFFE b2NrV2luZG93ICp0YiwgRG9jayAmZG9jaywgaW50ICZpbmRleCwgYm9vbCAmbmwsIGludCAmZXh0 cmFPZmZzZXQgKSBjb25zdDsKCiAgICBRUHRyTGlzdDxRRG9ja1dpbmRvdz4gZG9ja1dpbmRvd3Mo IERvY2sgZG9jayApIGNvbnN0OwogICAgUVB0ckxpc3Q8UURvY2tXaW5kb3c+IGRvY2tXaW5kb3dz KCkgY29uc3Q7CiAgICB2b2lkIGxpbmVVcERvY2tXaW5kb3dzKCBib29sIGtlZXBOZXdMaW5lcyA9 IEZBTFNFICk7CgogICAgYm9vbCBpc0RvY2tNZW51RW5hYmxlZCgpIGNvbnN0OwoKICAgICAKICAg IGJvb2wgaGFzRG9ja1dpbmRvdyggUURvY2tXaW5kb3cgKmR3ICk7CgogICAgdm9pZCBhZGRUb29s QmFyKCBRRG9ja1dpbmRvdyAqLCBEb2NrID0gRG9ja1RvcCwgYm9vbCBuZXdMaW5lID0gRkFMU0Ug KTsKICAgIHZvaWQgYWRkVG9vbEJhciggUURvY2tXaW5kb3cgKiwgY29uc3QgUVN0cmluZyAmbGFi ZWwsCgkJICAgICBEb2NrID0gRG9ja1RvcCwgYm9vbCBuZXdMaW5lID0gRkFMU0UgKTsKICAgIHZv aWQgbW92ZVRvb2xCYXIoIFFEb2NrV2luZG93ICosIERvY2sgPSBEb2NrVG9wICk7CiAgICB2b2lk IG1vdmVUb29sQmFyKCBRRG9ja1dpbmRvdyAqLCBEb2NrLCBib29sIG5sLCBpbnQgaW5kZXgsIGlu dCBleHRyYU9mZnNldCA9IC0xICk7CiAgICB2b2lkIHJlbW92ZVRvb2xCYXIoIFFEb2NrV2luZG93 ICogKTsKCiAgICBib29sIHRvb2xCYXJzTW92YWJsZSgpIGNvbnN0OwogICAgUVB0ckxpc3Q8UVRv b2xCYXI+IHRvb2xCYXJzKCBEb2NrIGRvY2sgKSBjb25zdDsKICAgIHZvaWQgbGluZVVwVG9vbEJh cnMoIGJvb2wga2VlcE5ld0xpbmVzID0gRkFMU0UgKTsKCgogICAgdmlydHVhbCBRRG9ja0FyZWEg KmRvY2tpbmdBcmVhKCBjb25zdCBRUG9pbnQgJnAgKTsKICAgIFFEb2NrQXJlYSAqbGVmdERvY2so KSBjb25zdDsKICAgIFFEb2NrQXJlYSAqcmlnaHREb2NrKCkgY29uc3Q7CiAgICBRRG9ja0FyZWEg KnRvcERvY2soKSBjb25zdDsKICAgIFFEb2NrQXJlYSAqYm90dG9tRG9jaygpIGNvbnN0OwoKICAg IHZpcnR1YWwgYm9vbCBpc0N1c3RvbWl6YWJsZSgpIGNvbnN0OwoKICAgIGJvb2wgYXBwcm9wcmlh dGUoIFFEb2NrV2luZG93ICpkdyApIGNvbnN0OwoKICAgIGVudW0gRG9ja1dpbmRvd3MgeyBPbmx5 VG9vbEJhcnMsIE5vVG9vbEJhcnMsIEFsbERvY2tXaW5kb3dzIH07CiAgICBRUG9wdXBNZW51ICpj cmVhdGVEb2NrV2luZG93TWVudSggRG9ja1dpbmRvd3MgZG9ja1dpbmRvd3MgPSBBbGxEb2NrV2lu ZG93cyApIGNvbnN0OwoKcHVibGljICA6CiAgICB2aXJ0dWFsIHZvaWQgc2V0UmlnaHRKdXN0aWZp Y2F0aW9uKCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0VXNlc0JpZ1BpeG1hcHMoIGJvb2wg KTsKICAgIHZpcnR1YWwgdm9pZCBzZXRVc2VzVGV4dExhYmVsKCBib29sICk7CiAgICB2aXJ0dWFs IHZvaWQgc2V0RG9ja1dpbmRvd3NNb3ZhYmxlKCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0 T3BhcXVlTW92aW5nKCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0RG9ja01lbnVFbmFibGVk KCBib29sICk7CiAgICB2aXJ0dWFsIHZvaWQgd2hhdHNUaGlzKCk7CiAgICB2aXJ0dWFsIHZvaWQg c2V0QXBwcm9wcmlhdGUoIFFEb2NrV2luZG93ICpkdywgYm9vbCBhICk7CiAgICB2aXJ0dWFsIHZv aWQgY3VzdG9taXplKCk7CgogICAgIAogICAgdm9pZCBzZXRUb29sQmFyc01vdmFibGUoIGJvb2wg KTsKCnByb3RlY3RlZCA6CiAgICB2b2lkIHBpeG1hcFNpemVDaGFuZ2VkKCBib29sICk7CiAgICB2 b2lkIHVzZXNUZXh0TGFiZWxDaGFuZ2VkKCBib29sICk7CiAgICB2b2lkIGRvY2tXaW5kb3dQb3Np dGlvbkNoYW5nZWQoIFFEb2NrV2luZG93ICogKTsKCgogICAgIAogICAgdm9pZCB0b29sQmFyUG9z aXRpb25DaGFuZ2VkKCBRVG9vbEJhciAqICk7CgoKcHJvdGVjdGVkICA6CiAgICB2aXJ0dWFsIHZv aWQgc2V0VXBMYXlvdXQoKTsKICAgIHZpcnR1YWwgYm9vbCBzaG93RG9ja01lbnUoIGNvbnN0IFFQ b2ludCAmZ2xvYmFsUG9zICk7CiAgICB2b2lkIG1lbnVBYm91dFRvU2hvdygpOwoKcHJvdGVjdGVk OgogICAgdm9pZCBwYWludEV2ZW50KCBRUGFpbnRFdmVudCAqICk7CiAgICB2b2lkIGNoaWxkRXZl bnQoIFFDaGlsZEV2ZW50ICogKTsKICAgIGJvb2wgZXZlbnQoIFFFdmVudCAqICk7CiAgICB2b2lk IHN0eWxlQ2hhbmdlKCBRU3R5bGUmICk7Cgpwcml2YXRlICA6CiAgICB2b2lkIHNsb3RQbGFjZUNo YW5nZWQoKTsKICAgIHZvaWQgZG9MaW5lVXAoKSB7IGxpbmVVcERvY2tXaW5kb3dzKCBUUlVFICk7 IH0KCnByaXZhdGU6CiAgICBRTWFpbldpbmRvd1ByaXZhdGUgKiBkOwogICAgdm9pZCB0cmlnZ2Vy TGF5b3V0KCBib29sIGRlbGV0ZUxheW91dCA9IFRSVUUpOwogICAgYm9vbCBkb2NrTWFpbldpbmRv dyggUU9iamVjdCAqZG9jayApOwoKCiAgICB2aXJ0dWFsIHZvaWQgc2V0TWVudUJhciggUU1lbnVC YXIgKiApOwoKICAgIHZpcnR1YWwgdm9pZCBzZXRTdGF0dXNCYXIoIFFTdGF0dXNCYXIgKiApOwoK ICAgIHZpcnR1YWwgdm9pZCBzZXRUb29sVGlwR3JvdXAoIFFUb29sVGlwR3JvdXAgKiApOwoKCiAg ICBmcmllbmQgY2xhc3MgUURvY2tXaW5kb3c7CiAgICBmcmllbmQgY2xhc3MgUU1lbnVCYXI7CiAg ICBmcmllbmQgY2xhc3MgUUhpZGVEb2NrOwogICAgZnJpZW5kIGNsYXNzIFFUb29sQmFyOwogICAg ZnJpZW5kIGNsYXNzIFFNYWluV2luZG93TGF5b3V0Owpwcml2YXRlOgkgCgogICAgUU1haW5XaW5k b3coIGNvbnN0IFFNYWluV2luZG93ICYgKTsKICAgIFFNYWluV2luZG93JiBvcGVyYXRvcj0oIGNv bnN0IFFNYWluV2luZG93ICYgKTsKCn07CgoKaW5saW5lIHZvaWQgUU1haW5XaW5kb3c6OmFkZFRv b2xCYXIoIFFEb2NrV2luZG93ICp3LCBUb29sQmFyRG9jayBkb2NrLCBib29sIG5ld0xpbmUgKQp7 CiAgICBhZGREb2NrV2luZG93KCB3LCBkb2NrLCBuZXdMaW5lICk7Cn0KCmlubGluZSB2b2lkIFFN YWluV2luZG93OjphZGRUb29sQmFyKCBRRG9ja1dpbmRvdyAqdywgY29uc3QgUVN0cmluZyAmbGFi ZWwsCgkJCSAgICAgIFRvb2xCYXJEb2NrIGRvY2ssIGJvb2wgbmV3TGluZSApCnsKICAgIGFkZERv Y2tXaW5kb3coIHcsIGxhYmVsLCBkb2NrLCBuZXdMaW5lICk7Cn0KCmlubGluZSB2b2lkIFFNYWlu V2luZG93Ojptb3ZlVG9vbEJhciggUURvY2tXaW5kb3cgKncsIFRvb2xCYXJEb2NrIGRvY2sgKQp7 CiAgICBtb3ZlRG9ja1dpbmRvdyggdywgZG9jayApOwp9CgppbmxpbmUgdm9pZCBRTWFpbldpbmRv dzo6bW92ZVRvb2xCYXIoIFFEb2NrV2luZG93ICp3LCBUb29sQmFyRG9jayBkb2NrLCBib29sIG5s LCBpbnQgaW5kZXgsIGludCBleHRyYU9mZnNldCApCnsKICAgIG1vdmVEb2NrV2luZG93KCB3LCBk b2NrLCBubCwgaW5kZXgsIGV4dHJhT2Zmc2V0ICk7Cn0KCmlubGluZSB2b2lkIFFNYWluV2luZG93 OjpyZW1vdmVUb29sQmFyKCBRRG9ja1dpbmRvdyAqdyApCnsKICAgIHJlbW92ZURvY2tXaW5kb3co IHcgKTsKfQoKaW5saW5lIGJvb2wgUU1haW5XaW5kb3c6OnRvb2xCYXJzTW92YWJsZSgpIGNvbnN0 CnsKICAgIHJldHVybiBkb2NrV2luZG93c01vdmFibGUoKTsKfQoKaW5saW5lIHZvaWQgUU1haW5X aW5kb3c6OmxpbmVVcFRvb2xCYXJzKCBib29sIGtlZXBOZXdMaW5lcyApCnsKICAgIGxpbmVVcERv Y2tXaW5kb3dzKCBrZWVwTmV3TGluZXMgKTsKfQoKaW5saW5lIHZvaWQgUU1haW5XaW5kb3c6OnNl dFRvb2xCYXJzTW92YWJsZSggYm9vbCBiICkKewogICAgc2V0RG9ja1dpbmRvd3NNb3ZhYmxlKCBi ICk7Cn0KCgoKICBRVGV4dFN0cmVhbSAmb3BlcmF0b3I8PCggUVRleHRTdHJlYW0gJiwgY29uc3Qg UU1haW5XaW5kb3cgJiApOwogIFFUZXh0U3RyZWFtICZvcGVyYXRvcj4+KCBRVGV4dFN0cmVhbSAm LCBRTWFpbldpbmRvdyAmICk7CgoKCgoKIyA2ICJjaGFydGZvcm0uaCIgMgoKIyAxICIvdXNyL2xv Y2FsL3F0L2luY2x1ZGUvcXN0cmluZ2xpc3QuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzdHJsaXN0Lmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCnR5cGVkZWYgUVB0ckxpc3RJdGVyYXRvcjxjaGFyPiBRU3RyTGlzdEl0ZXJhdG9yOwoKCmNs YXNzICAgUVN0ckxpc3QgOiBwdWJsaWMgUVB0ckxpc3Q8Y2hhcj4KewpwdWJsaWM6CiAgICBRU3Ry TGlzdCggYm9vbCBkZWVwQ29waWVzPVRSVUUgKSB7IGRjID0gZGVlcENvcGllczsgZGVsX2l0ZW0g PSBkZWVwQ29waWVzOyB9CiAgICBRU3RyTGlzdCggY29uc3QgUVN0ckxpc3QgJiApOwogICAgflFT dHJMaXN0KCkJCQl7IGNsZWFyKCk7IH0KICAgIFFTdHJMaXN0JiBvcGVyYXRvcj0oIGNvbnN0IFFT dHJMaXN0ICYgKTsKCnByaXZhdGU6CiAgICBRUHRyQ29sbGVjdGlvbjo6SXRlbSBuZXdJdGVtKCBR UHRyQ29sbGVjdGlvbjo6SXRlbSBkICkgeyByZXR1cm4gZGMgPyBxc3RyZHVwKCAoY29uc3QgY2hh ciopZCApIDogZDsgfQogICAgdm9pZCBkZWxldGVJdGVtKCBRUHRyQ29sbGVjdGlvbjo6SXRlbSBk ICkgeyBpZiAoIGRlbF9pdGVtICkgZGVsZXRlW10gKGNoYXIqKWQ7IH0KICAgIGludCBjb21wYXJl SXRlbXMoIFFQdHJDb2xsZWN0aW9uOjpJdGVtIHMxLCBRUHRyQ29sbGVjdGlvbjo6SXRlbSBzMiAp IHsgcmV0dXJuIHFzdHJjbXAoKGNvbnN0IGNoYXIqKXMxLAoJCQkJCQkJIChjb25zdCBjaGFyKilz Mik7IH0KCiAgICBRRGF0YVN0cmVhbSAmcmVhZCggUURhdGFTdHJlYW0gJnMsIFFQdHJDb2xsZWN0 aW9uOjpJdGVtICZkICkKCQkJCXsgcyA+PiAoY2hhciAqJilkOyByZXR1cm4gczsgfQogICAgUURh dGFTdHJlYW0gJndyaXRlKCBRRGF0YVN0cmVhbSAmcywgUVB0ckNvbGxlY3Rpb246Okl0ZW0gZCAp IGNvbnN0CgkJCQl7IHJldHVybiBzIDw8IChjb25zdCBjaGFyICopZDsgfQoKICAgIGJvb2wgIGRj Owp9OwoKCmNsYXNzICAgUVN0cklMaXN0IDogcHVibGljIFFTdHJMaXN0CSAKewpwdWJsaWM6CiAg ICBRU3RySUxpc3QoIGJvb2wgZGVlcENvcGllcz1UUlVFICkgOiBRU3RyTGlzdCggZGVlcENvcGll cyApIHt9CiAgICB+UVN0cklMaXN0KCkJCQl7IGNsZWFyKCk7IH0KcHJpdmF0ZToKICAgIGludAkg IGNvbXBhcmVJdGVtcyggUVB0ckNvbGxlY3Rpb246Okl0ZW0gczEsIFFQdHJDb2xsZWN0aW9uOjpJ dGVtIHMyICkKCQkJCXsgcmV0dXJuIHFzdHJpY21wKChjb25zdCBjaGFyKilzMSwKCQkJCQkJICAg IChjb25zdCBjaGFyKilzMik7IH0KfTsKCgppbmxpbmUgUVN0ckxpc3QgJiBRU3RyTGlzdDo6b3Bl cmF0b3I9KCBjb25zdCBRU3RyTGlzdCAmc3RyTGlzdCApCnsKICAgIGNsZWFyKCk7CiAgICBkYyA9 IHN0ckxpc3QuZGM7CiAgICBkZWxfaXRlbSA9IGRjOwogICAgUVB0ckxpc3Q8Y2hhcj46Om9wZXJh dG9yPSggc3RyTGlzdCApOwogICAgcmV0dXJuICp0aGlzOwp9CgppbmxpbmUgUVN0ckxpc3Q6OlFT dHJMaXN0KCBjb25zdCBRU3RyTGlzdCAmc3RyTGlzdCApCiAgICA6IFFQdHJMaXN0PGNoYXI+KCBz dHJMaXN0ICkKewogICAgZGMgPSBGQUxTRTsKICAgIG9wZXJhdG9yPSggc3RyTGlzdCApOwp9CgoK IyA0NCAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FzdHJpbmdsaXN0LmgiIDIKCgoKCgpjbGFzcyBR UmVnRXhwOwoKY2xhc3MgICBRU3RyaW5nTGlzdCA6IHB1YmxpYyBRVmFsdWVMaXN0PFFTdHJpbmc+ CnsKcHVibGljOgogICAgUVN0cmluZ0xpc3QoKSB7IH0KICAgIFFTdHJpbmdMaXN0KCBjb25zdCBR U3RyaW5nTGlzdCYgbCApIDogUVZhbHVlTGlzdDxRU3RyaW5nPihsKSB7IH0KICAgIFFTdHJpbmdM aXN0KCBjb25zdCBRVmFsdWVMaXN0PFFTdHJpbmc+JiBsICkgOiBRVmFsdWVMaXN0PFFTdHJpbmc+ KGwpIHsgfQogICAgUVN0cmluZ0xpc3QoIGNvbnN0IFFTdHJpbmcmIGkgKSB7IGFwcGVuZChpKTsg fQoKICAgIFFTdHJpbmdMaXN0KCBjb25zdCBjaGFyKiBpICkgeyBhcHBlbmQoaSk7IH0KCgogICAg c3RhdGljIFFTdHJpbmdMaXN0IGZyb21TdHJMaXN0KGNvbnN0IFFTdHJMaXN0Jik7CgogICAgdm9p ZCBzb3J0KCk7CgogICAgc3RhdGljIFFTdHJpbmdMaXN0IHNwbGl0KCBjb25zdCBRU3RyaW5nICZz ZXAsIGNvbnN0IFFTdHJpbmcgJnN0ciwgYm9vbCBhbGxvd0VtcHR5RW50cmllcyA9IEZBTFNFICk7 CiAgICBzdGF0aWMgUVN0cmluZ0xpc3Qgc3BsaXQoIGNvbnN0IFFDaGFyICZzZXAsIGNvbnN0IFFT dHJpbmcgJnN0ciwgYm9vbCBhbGxvd0VtcHR5RW50cmllcyA9IEZBTFNFICk7CgogICAgc3RhdGlj IFFTdHJpbmdMaXN0IHNwbGl0KCBjb25zdCBRUmVnRXhwICZzZXAsIGNvbnN0IFFTdHJpbmcgJnN0 ciwgYm9vbCBhbGxvd0VtcHR5RW50cmllcyA9IEZBTFNFICk7CgogICAgUVN0cmluZyBqb2luKCBj b25zdCBRU3RyaW5nICZzZXAgKSBjb25zdDsKCiAgICBRU3RyaW5nTGlzdCBncmVwKCBjb25zdCBR U3RyaW5nICZzdHIsIGJvb2wgY3MgPSBUUlVFICkgY29uc3Q7CgogICAgUVN0cmluZ0xpc3QgZ3Jl cCggY29uc3QgUVJlZ0V4cCAmZXhwciApIGNvbnN0OwoKfTsKCgpjbGFzcyBRRGF0YVN0cmVhbTsK ZXh0ZXJuICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFTdHJpbmdM aXN0JiApOwpleHRlcm4gICBRRGF0YVN0cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwg Y29uc3QgUVN0cmluZ0xpc3QmICk7CgoKCgojIDcgImNoYXJ0Zm9ybS5oIiAyCgoKCmNsYXNzIENh bnZhc1ZpZXc7CgpjbGFzcyBRQWN0aW9uOwpjbGFzcyBRQ2FudmFzOwpjbGFzcyBRRm9udDsKY2xh c3MgUVByaW50ZXI7CmNsYXNzIFFTdHJpbmc7CgoKY2xhc3MgQ2hhcnRGb3JtOiBwdWJsaWMgUU1h aW5XaW5kb3cKewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkg Y29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAq Y2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsg dmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0 X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBp bnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7 CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0 cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5n IHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0 aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IApwdWJsaWM6CiAgICBlbnVtIHsgTUFYX0VMRU1FTlRT ID0gMTAwIH07CiAgICBlbnVtIHsgTUFYX1JFQ0VOVEZJTEVTID0gOSB9OyAgCiAgICBlbnVtIENo YXJ0VHlwZSB7IFBJRSwgVkVSVElDQUxfQkFSLCBIT1JJWk9OVEFMX0JBUiB9OwogICAgZW51bSBB ZGRWYWx1ZXNUeXBlIHsgTk8sIFlFUywgQVNfUEVSQ0VOVEFHRSB9OwoKICAgIENoYXJ0Rm9ybSgg Y29uc3QgUVN0cmluZyYgZmlsZW5hbWUgKTsKICAgIH5DaGFydEZvcm0oKTsKCiAgICBpbnQgY2hh cnRUeXBlKCkgeyByZXR1cm4gbV9jaGFydFR5cGU7IH0KICAgIHZvaWQgc2V0Q2hhbmdlZCggYm9v bCBjaGFuZ2VkID0gVFJVRSApIHsgbV9jaGFuZ2VkID0gY2hhbmdlZDsgfQogICAgdm9pZCBkcmF3 RWxlbWVudHMoKTsKCiAgICBRUG9wdXBNZW51ICpvcHRpb25zTWVudTsgIAoKcHJpdmF0ZSAgOgog ICAgdm9pZCBmaWxlTmV3KCk7CiAgICB2b2lkIGZpbGVPcGVuKCk7CiAgICB2b2lkIGZpbGVPcGVu UmVjZW50KCBpbnQgaW5kZXggKTsKICAgIHZvaWQgZmlsZVNhdmUoKTsKICAgIHZvaWQgZmlsZVNh dmVBcygpOwogICAgdm9pZCBmaWxlU2F2ZUFzUGl4bWFwKCk7CiAgICB2b2lkIGZpbGVQcmludCgp OwogICAgdm9pZCBmaWxlUXVpdCgpOwogICAgdm9pZCBvcHRpb25zU2V0RGF0YSgpOwogICAgdm9p ZCB1cGRhdGVDaGFydFR5cGUoIFFBY3Rpb24gKmFjdGlvbiApOwogICAgdm9pZCBvcHRpb25zU2V0 Rm9udCgpOwogICAgdm9pZCBvcHRpb25zU2V0T3B0aW9ucygpOwogICAgdm9pZCBoZWxwSGVscCgp OwogICAgdm9pZCBoZWxwQWJvdXQoKTsKICAgIHZvaWQgaGVscEFib3V0UXQoKTsKICAgIHZvaWQg c2F2ZU9wdGlvbnMoKTsKCnByaXZhdGU6CiAgICB2b2lkIGluaXQoKTsKICAgIHZvaWQgbG9hZCgg Y29uc3QgUVN0cmluZyYgZmlsZW5hbWUgKTsKICAgIGJvb2wgb2tUb0NsZWFyKCk7CiAgICB2b2lk IGRyYXdQaWVDaGFydCggY29uc3QgZG91YmxlIHNjYWxlc1tdLCBkb3VibGUgdG90YWwsIGludCBj b3VudCApOwogICAgdm9pZCBkcmF3VmVydGljYWxCYXJDaGFydCggY29uc3QgZG91YmxlIHNjYWxl c1tdLCBkb3VibGUgdG90YWwsIGludCBjb3VudCApOwogICAgdm9pZCBkcmF3SG9yaXpvbnRhbEJh ckNoYXJ0KCBjb25zdCBkb3VibGUgc2NhbGVzW10sIGRvdWJsZSB0b3RhbCwgaW50IGNvdW50ICk7 CgogICAgUVN0cmluZyB2YWx1ZUxhYmVsKCBjb25zdCBRU3RyaW5nJiBsYWJlbCwgZG91YmxlIHZh bHVlLCBkb3VibGUgdG90YWwgKTsKICAgIHZvaWQgdXBkYXRlUmVjZW50RmlsZXMoIGNvbnN0IFFT dHJpbmcmIGZpbGVuYW1lICk7CiAgICB2b2lkIHVwZGF0ZVJlY2VudEZpbGVzTWVudSgpOwogICAg dm9pZCBzZXRDaGFydFR5cGUoIENoYXJ0VHlwZSBjaGFydFR5cGUgKTsKCiAgICBRUG9wdXBNZW51 ICpmaWxlTWVudTsKICAgIFFBY3Rpb24gKm9wdGlvbnNQaWVDaGFydEFjdGlvbjsKICAgIFFBY3Rp b24gKm9wdGlvbnNIb3Jpem9udGFsQmFyQ2hhcnRBY3Rpb247CiAgICBRQWN0aW9uICpvcHRpb25z VmVydGljYWxCYXJDaGFydEFjdGlvbjsKCgogICAgUVN0cmluZyBtX2ZpbGVuYW1lOwogICAgUVN0 cmluZ0xpc3QgbV9yZWNlbnRGaWxlczsKICAgIFFDYW52YXMgKm1fY2FudmFzOwogICAgQ2FudmFz VmlldyAqbV9jYW52YXNWaWV3OwogICAgYm9vbCBtX2NoYW5nZWQ7CiAgICBFbGVtZW50VmVjdG9y IG1fZWxlbWVudHM7CiAgICBRUHJpbnRlciAqbV9wcmludGVyOwogICAgQ2hhcnRUeXBlIG1fY2hh cnRUeXBlOwogICAgQWRkVmFsdWVzVHlwZSBtX2FkZFZhbHVlczsKICAgIGludCBtX2RlY2ltYWxQ bGFjZXM7CiAgICBRRm9udCBtX2ZvbnQ7Cn07CgoKIyAyICJjaGFydGZvcm1fZmlsZXMuY3BwIiAy CgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWZpbGUuaCIgMQogCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFEaXI7CgoKY2xhc3MgICBRRmls ZSA6IHB1YmxpYyBRSU9EZXZpY2UJCQkgCnsKcHVibGljOgogICAgUUZpbGUoKTsKICAgIFFGaWxl KCBjb25zdCBRU3RyaW5nICZuYW1lICk7CiAgIH5RRmlsZSgpOwoKICAgIFFTdHJpbmcJbmFtZSgp CWNvbnN0OwogICAgdm9pZAlzZXROYW1lKCBjb25zdCBRU3RyaW5nICZuYW1lICk7CgogICAgdHlw ZWRlZiBRQ1N0cmluZyAoKkVuY29kZXJGbikoIGNvbnN0IFFTdHJpbmcgJmZpbGVOYW1lICk7CiAg ICB0eXBlZGVmIFFTdHJpbmcgKCpEZWNvZGVyRm4pKCBjb25zdCBRQ1N0cmluZyAmbG9jYWxmaWxl TmFtZSApOwogICAgc3RhdGljIFFDU3RyaW5nIGVuY29kZU5hbWUoIGNvbnN0IFFTdHJpbmcgJmZp bGVOYW1lICk7CiAgICBzdGF0aWMgUVN0cmluZyBkZWNvZGVOYW1lKCBjb25zdCBRQ1N0cmluZyAm bG9jYWxGaWxlTmFtZSApOwogICAgc3RhdGljIHZvaWQgc2V0RW5jb2RpbmdGdW5jdGlvbiggRW5j b2RlckZuICk7CiAgICBzdGF0aWMgdm9pZCBzZXREZWNvZGluZ0Z1bmN0aW9uKCBEZWNvZGVyRm4g KTsKCiAgICBib29sCWV4aXN0cygpICAgY29uc3Q7CiAgICBzdGF0aWMgYm9vbCBleGlzdHMoIGNv bnN0IFFTdHJpbmcgJmZpbGVOYW1lICk7CgogICAgYm9vbAlyZW1vdmUoKTsKICAgIHN0YXRpYyBi b29sIHJlbW92ZSggY29uc3QgUVN0cmluZyAmZmlsZU5hbWUgKTsKCiAgICBib29sCW9wZW4oIGlu dCApOwogICAgYm9vbAlvcGVuKCBpbnQsIEZJTEUgKiApOwogICAgYm9vbAlvcGVuKCBpbnQsIGlu dCApOwogICAgdm9pZAljbG9zZSgpOwogICAgdm9pZAlmbHVzaCgpOwoKICAgIE9mZnNldAlzaXpl KCkgY29uc3Q7CiAgICBPZmZzZXQJYXQoKSBjb25zdDsKICAgIGJvb2wJYXQoIE9mZnNldCApOwog ICAgYm9vbAlhdEVuZCgpIGNvbnN0OwoKICAgIFFfTE9ORwlyZWFkQmxvY2soIGNoYXIgKmRhdGEs IFFfVUxPTkcgbGVuICk7CiAgICBRX0xPTkcJd3JpdGVCbG9jayggY29uc3QgY2hhciAqZGF0YSwg UV9VTE9ORyBsZW4gKTsKICAgIFFfTE9ORwl3cml0ZUJsb2NrKCBjb25zdCBRQnl0ZUFycmF5JiBk YXRhICkKCQkgICAgICB7IHJldHVybiBRSU9EZXZpY2U6OndyaXRlQmxvY2soZGF0YSk7IH0KICAg IFFfTE9ORwlyZWFkTGluZSggY2hhciAqZGF0YSwgUV9VTE9ORyBtYXhsZW4gKTsKICAgIFFfTE9O RwlyZWFkTGluZSggUVN0cmluZyAmLCBRX1VMT05HIG1heGxlbiApOwoKICAgIGludAkJZ2V0Y2go KTsKICAgIGludAkJcHV0Y2goIGludCApOwogICAgaW50CQl1bmdldGNoKCBpbnQgKTsKCiAgICBp bnQJCWhhbmRsZSgpIGNvbnN0OwoKcHJvdGVjdGVkOgogICAgUVN0cmluZwlmbjsKICAgIEZJTEUg ICAgICAgKmZoOwogICAgaW50CQlmZDsKICAgIE9mZnNldAlsZW5ndGg7CiAgICBib29sCWV4dF9m OwogICAgdm9pZCAqIAlkOwoKcHJpdmF0ZToKICAgIHZvaWQJaW5pdCgpOwogICAgUUNTdHJpbmcJ dW5nZXRjaEJ1ZmZlcjsKCnByaXZhdGU6CSAKCiAgICBRRmlsZSggY29uc3QgUUZpbGUgJiApOwog ICAgUUZpbGUgJm9wZXJhdG9yPSggY29uc3QgUUZpbGUgJiApOwoKfTsKCgppbmxpbmUgUVN0cmlu ZyBRRmlsZTo6bmFtZSgpIGNvbnN0CnsgcmV0dXJuIGZuOyB9CgppbmxpbmUgUUlPRGV2aWNlOjpP ZmZzZXQgUUZpbGU6OmF0KCkgY29uc3QKeyByZXR1cm4gaW9JbmRleDsgfQoKCgojIDQgImNoYXJ0 Zm9ybV9maWxlcy5jcHAiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FmaWxlZGlhbG9n LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBRUHVz aEJ1dHRvbjsKY2xhc3MgUUJ1dHRvbjsKY2xhc3MgUUxhYmVsOwpjbGFzcyBRV2lkZ2V0OwpjbGFz cyBRRmlsZURpYWxvZzsKY2xhc3MgUVRpbWVyOwpjbGFzcyBRTmV0d29ya09wZXJhdGlvbjsKY2xh c3MgUUxpbmVFZGl0OwpjbGFzcyBRTGlzdFZpZXdJdGVtOwpjbGFzcyBRTGlzdEJveEl0ZW07CmNs YXNzIFFGaWxlRGlhbG9nUHJpdmF0ZTsKY2xhc3MgUUZpbGVEaWFsb2dRRmlsZUxpc3RWaWV3OwoK CiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FkaXIuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWZpbGVp bmZvLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMSAi L3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FkYXRldGltZS5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgpjbGFzcyAgIFFEYXRlCnsKcHVibGljOgog ICAgUURhdGUoKSAgeyBqZD0wOyB9CQkJCSAKICAgIFFEYXRlKCBpbnQgeSwgaW50IG0sIGludCBk ICk7CQkgCgogICAgYm9vbCAgIGlzTnVsbCgpCSBjb25zdCB7IHJldHVybiBqZCA9PSAwOyB9CiAg ICBib29sICAgaXNWYWxpZCgpCSBjb25zdDsJCQkgCgogICAgaW50CSAgIHllYXIoKQkgY29uc3Q7 CQkJIAogICAgaW50CSAgIG1vbnRoKCkJIGNvbnN0OwkJCSAKICAgIGludAkgICBkYXkoKQkgY29u c3Q7CQkJIAogICAgaW50CSAgIGRheU9mV2VlaygpCSBjb25zdDsJCQkgCiAgICBpbnQJICAgZGF5 T2ZZZWFyKCkJIGNvbnN0OwkJCSAKICAgIGludAkgICBkYXlzSW5Nb250aCgpIGNvbnN0OwkJCSAK ICAgIGludAkgICBkYXlzSW5ZZWFyKCkJIGNvbnN0OwkJCSAKCgoKICAgIHN0YXRpYyBRU3RyaW5n IG1vbnRoTmFtZSggaW50IG1vbnRoICkgeyByZXR1cm4gc2hvcnRNb250aE5hbWUoIG1vbnRoICk7 IH0KICAgIHN0YXRpYyBRU3RyaW5nIGRheU5hbWUoIGludCB3ZWVrZGF5ICkgeyByZXR1cm4gc2hv cnREYXlOYW1lKCB3ZWVrZGF5ICk7IH0KCiAgICBzdGF0aWMgUVN0cmluZyBzaG9ydE1vbnRoTmFt ZSggaW50IG1vbnRoICk7CiAgICBzdGF0aWMgUVN0cmluZyBzaG9ydERheU5hbWUoIGludCB3ZWVr ZGF5ICk7CiAgICBzdGF0aWMgUVN0cmluZyBsb25nTW9udGhOYW1lKCBpbnQgbW9udGggKTsKICAg IHN0YXRpYyBRU3RyaW5nIGxvbmdEYXlOYW1lKCBpbnQgd2Vla2RheSApOwoKCiAgICBRU3RyaW5n IHRvU3RyaW5nKCBRdDo6RGF0ZUZvcm1hdCBmID0gUXQ6OlRleHREYXRlICkJIGNvbnN0OwoKICAg IFFTdHJpbmcgdG9TdHJpbmcoIGNvbnN0IFFTdHJpbmcmIGZvcm1hdCApIGNvbnN0OwogICAgYm9v bCAgIHNldFlNRCggaW50IHksIGludCBtLCBpbnQgZCApOwoKICAgIFFEYXRlICBhZGREYXlzKCBp bnQgZGF5cyApCQljb25zdDsKICAgIFFEYXRlICBhZGRNb250aHMoIGludCBtb250aHMgKSAgICAg IGNvbnN0OwogICAgUURhdGUgIGFkZFllYXJzKCBpbnQgeWVhcnMgKSAgICAgICAgY29uc3Q7CiAg ICBpbnQJICAgZGF5c1RvKCBjb25zdCBRRGF0ZSAmICkJY29uc3Q7CgogICAgYm9vbCAgIG9wZXJh dG9yPT0oIGNvbnN0IFFEYXRlICZkICkgY29uc3QgeyByZXR1cm4gamQgPT0gZC5qZDsgfQogICAg Ym9vbCAgIG9wZXJhdG9yIT0oIGNvbnN0IFFEYXRlICZkICkgY29uc3QgeyByZXR1cm4gamQgIT0g ZC5qZDsgfQogICAgYm9vbCAgIG9wZXJhdG9yPCggY29uc3QgUURhdGUgJmQgKQljb25zdCB7IHJl dHVybiBqZCA8IGQuamQ7IH0KICAgIGJvb2wgICBvcGVyYXRvcjw9KCBjb25zdCBRRGF0ZSAmZCAp IGNvbnN0IHsgcmV0dXJuIGpkIDw9IGQuamQ7IH0KICAgIGJvb2wgICBvcGVyYXRvcj4oIGNvbnN0 IFFEYXRlICZkICkJY29uc3QgeyByZXR1cm4gamQgPiBkLmpkOyB9CiAgICBib29sICAgb3BlcmF0 b3I+PSggY29uc3QgUURhdGUgJmQgKSBjb25zdCB7IHJldHVybiBqZCA+PSBkLmpkOyB9CgogICAg c3RhdGljIFFEYXRlIGN1cnJlbnREYXRlKCk7CiAgICBzdGF0aWMgUURhdGUgZnJvbVN0cmluZygg Y29uc3QgUVN0cmluZyYgcywgUXQ6OkRhdGVGb3JtYXQgZiA9IFF0OjpUZXh0RGF0ZSApOwoKICAg IHN0YXRpYyBib29sCSBpc1ZhbGlkKCBpbnQgeSwgaW50IG0sIGludCBkICk7CiAgICBzdGF0aWMg Ym9vbAkgbGVhcFllYXIoIGludCB5ZWFyICk7CgogICAgc3RhdGljIHVpbnQJIGdyZWdvcmlhblRv SnVsaWFuKCBpbnQgeSwgaW50IG0sIGludCBkICk7CiAgICBzdGF0aWMgdm9pZAkganVsaWFuVG9H cmVnb3JpYW4oIHVpbnQgamQsIGludCAmeSwgaW50ICZtLCBpbnQgJmQgKTsKcHJpdmF0ZToKICAg IHVpbnQJIGpkOwogICAgZnJpZW5kIGNsYXNzIFFEYXRlVGltZTsKCiAgICBmcmllbmQgICBRRGF0 YVN0cmVhbSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUURhdGUgJiApOwogICAg ZnJpZW5kICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFEYXRlICYg KTsKCn07CgoKIAoKCgpjbGFzcyAgIFFUaW1lCnsKcHVibGljOgogICAgUVRpbWUoKSB7IGRzPTA7 IH0JCQkJIAogICAgUVRpbWUoIGludCBoLCBpbnQgbSwgaW50IHM9MCwgaW50IG1zPTAgKTsJIAoK ICAgIGJvb2wgICBpc051bGwoKQkgY29uc3QgeyByZXR1cm4gZHMgPT0gMDsgfQogICAgYm9vbCAg IGlzVmFsaWQoKQkgY29uc3Q7CQkJIAoKICAgIGludAkgICBob3VyKCkJIGNvbnN0OwkJCSAKICAg IGludAkgICBtaW51dGUoKQkgY29uc3Q7CQkJIAogICAgaW50CSAgIHNlY29uZCgpCSBjb25zdDsJ CQkgCiAgICBpbnQJICAgbXNlYygpCSBjb25zdDsJCQkgCgoKICAgIFFTdHJpbmcgdG9TdHJpbmco IFF0OjpEYXRlRm9ybWF0IGYgPSBRdDo6VGV4dERhdGUgKQkgY29uc3Q7CgogICAgUVN0cmluZyB0 b1N0cmluZyggY29uc3QgUVN0cmluZyYgZm9ybWF0ICkgY29uc3Q7CgogICAgYm9vbCAgIHNldEhN UyggaW50IGgsIGludCBtLCBpbnQgcywgaW50IG1zPTAgKTsKCiAgICBRVGltZSAgYWRkU2Vjcygg aW50IHNlY3MgKQkJY29uc3Q7CiAgICBpbnQJICAgc2Vjc1RvKCBjb25zdCBRVGltZSAmICkJY29u c3Q7CiAgICBRVGltZSAgYWRkTVNlY3MoIGludCBtcyApCQljb25zdDsKICAgIGludAkgICBtc2Vj c1RvKCBjb25zdCBRVGltZSAmICkJY29uc3Q7CgogICAgYm9vbCAgIG9wZXJhdG9yPT0oIGNvbnN0 IFFUaW1lICZkICkgY29uc3QgeyByZXR1cm4gZHMgPT0gZC5kczsgfQogICAgYm9vbCAgIG9wZXJh dG9yIT0oIGNvbnN0IFFUaW1lICZkICkgY29uc3QgeyByZXR1cm4gZHMgIT0gZC5kczsgfQogICAg Ym9vbCAgIG9wZXJhdG9yPCggY29uc3QgUVRpbWUgJmQgKQljb25zdCB7IHJldHVybiBkcyA8IGQu ZHM7IH0KICAgIGJvb2wgICBvcGVyYXRvcjw9KCBjb25zdCBRVGltZSAmZCApIGNvbnN0IHsgcmV0 dXJuIGRzIDw9IGQuZHM7IH0KICAgIGJvb2wgICBvcGVyYXRvcj4oIGNvbnN0IFFUaW1lICZkICkJ Y29uc3QgeyByZXR1cm4gZHMgPiBkLmRzOyB9CiAgICBib29sICAgb3BlcmF0b3I+PSggY29uc3Qg UVRpbWUgJmQgKSBjb25zdCB7IHJldHVybiBkcyA+PSBkLmRzOyB9CgogICAgc3RhdGljIFFUaW1l IGN1cnJlbnRUaW1lKCk7CiAgICBzdGF0aWMgUVRpbWUgZnJvbVN0cmluZyggY29uc3QgUVN0cmlu ZyYgcywgUXQ6OkRhdGVGb3JtYXQgZiA9IFF0OjpUZXh0RGF0ZSApOwogICAgc3RhdGljIGJvb2wJ IGlzVmFsaWQoIGludCBoLCBpbnQgbSwgaW50IHMsIGludCBtcz0wICk7CgogICAgdm9pZCAgIHN0 YXJ0KCk7CiAgICBpbnQJICAgcmVzdGFydCgpOwogICAgaW50CSAgIGVsYXBzZWQoKSBjb25zdDsK CnByaXZhdGU6CiAgICBzdGF0aWMgYm9vbCBjdXJyZW50VGltZSggUVRpbWUgKiApOwoKICAgIHVp bnQgICBkczsKICAgIGZyaWVuZCBjbGFzcyBRRGF0ZVRpbWU7CgogICAgZnJpZW5kICAgUURhdGFT dHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFUaW1lICYgKTsKICAgIGZy aWVuZCAgIFFEYXRhU3RyZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRVGltZSAmICk7 Cgp9OwoKCiAKCgoKY2xhc3MgICBRRGF0ZVRpbWUKewpwdWJsaWM6CiAgICBRRGF0ZVRpbWUoKSB7 fQkJCQkgCiAgICBRRGF0ZVRpbWUoIGNvbnN0IFFEYXRlICYgKTsKICAgIFFEYXRlVGltZSggY29u c3QgUURhdGUgJiwgY29uc3QgUVRpbWUgJiApOwoKICAgIGJvb2wgICBpc051bGwoKQljb25zdAkJ eyByZXR1cm4gZC5pc051bGwoKSAmJiB0LmlzTnVsbCgpOyB9CiAgICBib29sICAgaXNWYWxpZCgp CWNvbnN0CQl7IHJldHVybiBkLmlzVmFsaWQoKSAmJiB0LmlzVmFsaWQoKTsgfQoKICAgIFFEYXRl ICBkYXRlKCkJY29uc3QJCXsgcmV0dXJuIGQ7IH0KICAgIFFUaW1lICB0aW1lKCkJY29uc3QJCXsg cmV0dXJuIHQ7IH0KICAgIHZvaWQgICBzZXREYXRlKCBjb25zdCBRRGF0ZSAmZGF0ZSApIHsgZD1k YXRlOyB9CiAgICB2b2lkICAgc2V0VGltZSggY29uc3QgUVRpbWUgJnRpbWUgKSB7IHQ9dGltZTsg fQogICAgdm9pZCAgIHNldFRpbWVfdCggdWludCBzZWNzU2luY2UxSmFuMTk3MFVUQyApOwoKCiAg ICBRU3RyaW5nIHRvU3RyaW5nKCBRdDo6RGF0ZUZvcm1hdCBmID0gUXQ6OlRleHREYXRlICkJY29u c3Q7CgogICAgUVN0cmluZyB0b1N0cmluZyggY29uc3QgUVN0cmluZyYgZm9ybWF0ICkgY29uc3Q7 CgogICAgUURhdGVUaW1lIGFkZERheXMoIGludCBkYXlzICkJY29uc3Q7CiAgICBRRGF0ZVRpbWUg YWRkTW9udGhzKCBpbnQgbW9udGhzICkgICBjb25zdDsKICAgIFFEYXRlVGltZSBhZGRZZWFycygg aW50IHllYXJzICkgICAgIGNvbnN0OwogICAgUURhdGVUaW1lIGFkZFNlY3MoIGludCBzZWNzICkJ Y29uc3Q7CiAgICBpbnQJICAgZGF5c1RvKCBjb25zdCBRRGF0ZVRpbWUgJiApCWNvbnN0OwogICAg aW50CSAgIHNlY3NUbyggY29uc3QgUURhdGVUaW1lICYgKQljb25zdDsKCiAgICBib29sICAgb3Bl cmF0b3I9PSggY29uc3QgUURhdGVUaW1lICZkdCApIGNvbnN0OwogICAgYm9vbCAgIG9wZXJhdG9y IT0oIGNvbnN0IFFEYXRlVGltZSAmZHQgKSBjb25zdDsKICAgIGJvb2wgICBvcGVyYXRvcjwoIGNv bnN0IFFEYXRlVGltZSAmZHQgKSAgY29uc3Q7CiAgICBib29sICAgb3BlcmF0b3I8PSggY29uc3Qg UURhdGVUaW1lICZkdCApIGNvbnN0OwogICAgYm9vbCAgIG9wZXJhdG9yPiggY29uc3QgUURhdGVU aW1lICZkdCApICBjb25zdDsKICAgIGJvb2wgICBvcGVyYXRvcj49KCBjb25zdCBRRGF0ZVRpbWUg JmR0ICkgY29uc3Q7CgogICAgc3RhdGljIFFEYXRlVGltZSBjdXJyZW50RGF0ZVRpbWUoKTsKICAg IHN0YXRpYyBRRGF0ZVRpbWUgZnJvbVN0cmluZyggY29uc3QgUVN0cmluZyYgcywgUXQ6OkRhdGVG b3JtYXQgZiA9IFF0OjpUZXh0RGF0ZSApOwoKcHJpdmF0ZToKICAgIFFEYXRlICBkOwogICAgUVRp bWUgIHQ7CgogICAgZnJpZW5kICAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFt ICYsIGNvbnN0IFFEYXRlVGltZSAmKTsKICAgIGZyaWVuZCAgIFFEYXRhU3RyZWFtICZvcGVyYXRv cj4+KCBRRGF0YVN0cmVhbSAmLCBRRGF0ZVRpbWUgJiApOwoKfTsKCgogCgoKCgogIFFEYXRhU3Ry ZWFtICZvcGVyYXRvcjw8KCBRRGF0YVN0cmVhbSAmLCBjb25zdCBRRGF0ZSAmICk7CiAgUURhdGFT dHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFEYXRlICYgKTsKICBRRGF0YVN0cmVh bSAmb3BlcmF0b3I8PCggUURhdGFTdHJlYW0gJiwgY29uc3QgUVRpbWUgJiApOwogIFFEYXRhU3Ry ZWFtICZvcGVyYXRvcj4+KCBRRGF0YVN0cmVhbSAmLCBRVGltZSAmICk7CiAgUURhdGFTdHJlYW0g Jm9wZXJhdG9yPDwoIFFEYXRhU3RyZWFtICYsIGNvbnN0IFFEYXRlVGltZSAmICk7CiAgUURhdGFT dHJlYW0gJm9wZXJhdG9yPj4oIFFEYXRhU3RyZWFtICYsIFFEYXRlVGltZSAmICk7CgoKCgojIDQz ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcWZpbGVpbmZvLmgiIDIKCgoKCmNsYXNzIFFEaXI7CnN0 cnVjdCBRRmlsZUluZm9DYWNoZTsKCgpjbGFzcyAgIFFGaWxlSW5mbwkJCQkgICAgCnsKcHVibGlj OgogICAgZW51bSBQZXJtaXNzaW9uU3BlYyB7CglSZWFkVXNlciAgPSAwNDAwLCBXcml0ZVVzZXIg ID0gMDIwMCwgRXhlVXNlciAgPSAwMTAwLAoJUmVhZEdyb3VwID0gMDA0MCwgV3JpdGVHcm91cCA9 IDAwMjAsIEV4ZUdyb3VwID0gMDAxMCwKCVJlYWRPdGhlciA9IDAwMDQsIFdyaXRlT3RoZXIgPSAw MDAyLCBFeGVPdGhlciA9IDAwMDEgfTsKCiAgICBRRmlsZUluZm8oKTsKICAgIFFGaWxlSW5mbygg Y29uc3QgUVN0cmluZyAmZmlsZSApOwogICAgUUZpbGVJbmZvKCBjb25zdCBRRmlsZSAmICk7Cgog ICAgUUZpbGVJbmZvKCBjb25zdCBRRGlyICYsIGNvbnN0IFFTdHJpbmcgJmZpbGVOYW1lICk7Cgog ICAgUUZpbGVJbmZvKCBjb25zdCBRRmlsZUluZm8gJiApOwogICB+UUZpbGVJbmZvKCk7CgogICAg UUZpbGVJbmZvICAmb3BlcmF0b3I9KCBjb25zdCBRRmlsZUluZm8gJiApOwoKICAgIHZvaWQJc2V0 RmlsZSggY29uc3QgUVN0cmluZyAmZmlsZSApOwogICAgdm9pZAlzZXRGaWxlKCBjb25zdCBRRmls ZSAmICk7CgogICAgdm9pZAlzZXRGaWxlKCBjb25zdCBRRGlyICYsIGNvbnN0IFFTdHJpbmcgJmZp bGVOYW1lICk7CgogICAgYm9vbAlleGlzdHMoKQljb25zdDsKICAgIHZvaWQJcmVmcmVzaCgpCWNv bnN0OwogICAgYm9vbAljYWNoaW5nKCkJY29uc3Q7CiAgICB2b2lkCXNldENhY2hpbmcoIGJvb2wg KTsKCiAgICBRU3RyaW5nCWZpbGVQYXRoKCkJY29uc3Q7CiAgICBRU3RyaW5nCWZpbGVOYW1lKCkJ Y29uc3Q7CgogICAgUVN0cmluZwlhYnNGaWxlUGF0aCgpCWNvbnN0OwoKICAgIFFTdHJpbmcJYmFz ZU5hbWUoIGJvb2wgY29tcGxldGUgPSBGQUxTRSApIGNvbnN0OwogICAgUVN0cmluZwlleHRlbnNp b24oIGJvb2wgY29tcGxldGUgPSBUUlVFICkgY29uc3Q7CgoKICAgIFFTdHJpbmcJZGlyUGF0aCgg Ym9vbCBhYnNQYXRoID0gRkFMU0UgKSBjb25zdDsKCgogICAgUURpcglkaXIoIGJvb2wgYWJzUGF0 aCA9IEZBTFNFICkJY29uc3Q7CgogICAgYm9vbAlpc1JlYWRhYmxlKCkJY29uc3Q7CiAgICBib29s CWlzV3JpdGFibGUoKQljb25zdDsKICAgIGJvb2wJaXNFeGVjdXRhYmxlKCkJY29uc3Q7CgoKICAg IGJvb2wJaXNSZWxhdGl2ZSgpCWNvbnN0OwogICAgYm9vbAljb252ZXJ0VG9BYnMoKTsKCgogICAg Ym9vbAlpc0ZpbGUoKQljb25zdDsKICAgIGJvb2wJaXNEaXIoKQkJY29uc3Q7CiAgICBib29sCWlz U3ltTGluaygpCWNvbnN0OwoKICAgIFFTdHJpbmcJcmVhZExpbmsoKQljb25zdDsKCiAgICBRU3Ry aW5nCW93bmVyKCkJCWNvbnN0OwogICAgdWludAlvd25lcklkKCkJY29uc3Q7CiAgICBRU3RyaW5n CWdyb3VwKCkJCWNvbnN0OwogICAgdWludAlncm91cElkKCkJY29uc3Q7CgogICAgYm9vbAlwZXJt aXNzaW9uKCBpbnQgcGVybWlzc2lvblNwZWMgKSBjb25zdDsKCiAgICB1aW50CXNpemUoKQkJY29u c3Q7CgogICAgUURhdGVUaW1lCWNyZWF0ZWQoKQljb25zdDsKICAgIFFEYXRlVGltZQlsYXN0TW9k aWZpZWQoKQljb25zdDsKICAgIFFEYXRlVGltZQlsYXN0UmVhZCgpCWNvbnN0OwoKcHJpdmF0ZToK ICAgIHZvaWQJZG9TdGF0KCkgY29uc3Q7CiAgICBzdGF0aWMgdm9pZCBzbGFzaGlmeSggUVN0cmlu ZyAmICk7CiAgICBzdGF0aWMgdm9pZCBtYWtlQWJzKCBRU3RyaW5nICYgKTsKICAgIAogICAgUVN0 cmluZwlmbjsKICAgIFFGaWxlSW5mb0NhY2hlICpmaWM7CiAgICBib29sCWNhY2hlOwoKICAgIGJv b2wgICAgICAgIHN5bUxpbms7CgoKfTsKCgppbmxpbmUgYm9vbCBRRmlsZUluZm86OmNhY2hpbmco KSBjb25zdAp7CiAgICByZXR1cm4gY2FjaGU7Cn0KCgoKIyA0MyAiL3Vzci9sb2NhbC9xdC9pbmNs dWRlL3FkaXIuaCIgMgoKCgoKCgoKdHlwZWRlZiBRUHRyTGlzdDxRRmlsZUluZm8+IFFGaWxlSW5m b0xpc3Q7CnR5cGVkZWYgUVB0ckxpc3RJdGVyYXRvcjxRRmlsZUluZm8+IFFGaWxlSW5mb0xpc3RJ dGVyYXRvcjsKY2xhc3MgUVN0cmluZ0xpc3Q7CgoKY2xhc3MgICBRRGlyCnsKcHVibGljOgogICAg ZW51bSBGaWx0ZXJTcGVjIHsgRGlycwkgICAgPSAweDAwMSwKCQkgICAgICBGaWxlcwkgICAgPSAw eDAwMiwKCQkgICAgICBEcml2ZXMJICAgID0gMHgwMDQsCgkJICAgICAgTm9TeW1MaW5rcyAgICA9 IDB4MDA4LAoJCSAgICAgIEFsbAkgICAgPSAweDAwNywKCQkgICAgICAgVHlwZU1hc2sJICAgID0g MHgwMEYsCgoJCSAgICAgIFJlYWRhYmxlCSAgICA9IDB4MDEwLAoJCSAgICAgIFdyaXRhYmxlCSAg ICA9IDB4MDIwLAoJCSAgICAgIEV4ZWN1dGFibGUgICAgPSAweDA0MCwKCQkgICAgICAgUldFTWFz awkgICAgPSAweDA3MCwKCgkJICAgICAgTW9kaWZpZWQJICAgID0gMHgwODAsCgkJICAgICAgSGlk ZGVuCSAgICA9IDB4MTAwLAoJCSAgICAgIFN5c3RlbQkgICAgPSAweDIwMCwKCQkgICAgICAgQWNj ZXNzTWFzayAgICA9IDB4M0YwLAoKCQkgICAgICBEZWZhdWx0RmlsdGVyID0gLTEgfTsKCiAgICBl bnVtIFNvcnRTcGVjICAgeyBOYW1lCSAgICA9IDB4MDAsCgkJICAgICAgVGltZQkgICAgPSAweDAx LAoJCSAgICAgIFNpemUJICAgID0gMHgwMiwKCQkgICAgICBVbnNvcnRlZAkgICAgPSAweDAzLAoJ CSAgICAgICBTb3J0QnlNYXNrICAgID0gMHgwMywKCgkJICAgICAgRGlyc0ZpcnN0CSAgICA9IDB4 MDQsCgkJICAgICAgUmV2ZXJzZWQJICAgID0gMHgwOCwKCQkgICAgICBJZ25vcmVDYXNlICAgID0g MHgxMCwKCQkgICAgICBEZWZhdWx0U29ydCAgID0gLTEgfTsKCiAgICBRRGlyKCk7CiAgICBRRGly KCBjb25zdCBRU3RyaW5nICZwYXRoLCBjb25zdCBRU3RyaW5nICZuYW1lRmlsdGVyID0gUVN0cmlu Zzo6bnVsbCwKCSAgaW50IHNvcnRTcGVjID0gTmFtZSB8IElnbm9yZUNhc2UsIGludCBmaWx0ZXJT cGVjID0gQWxsICk7CiAgICBRRGlyKCBjb25zdCBRRGlyICYgKTsKCiAgICB2aXJ0dWFsIH5RRGly KCk7CgogICAgUURpciAgICAgICAmb3BlcmF0b3I9KCBjb25zdCBRRGlyICYgKTsKICAgIFFEaXIg ICAgICAgJm9wZXJhdG9yPSggY29uc3QgUVN0cmluZyAmcGF0aCApOwoKICAgIHZpcnR1YWwgdm9p ZCBzZXRQYXRoKCBjb25zdCBRU3RyaW5nICZwYXRoICk7CiAgICB2aXJ0dWFsIFFTdHJpbmcgcGF0 aCgpCQljb25zdDsKICAgIHZpcnR1YWwgUVN0cmluZyBhYnNQYXRoKCkJY29uc3Q7CiAgICB2aXJ0 dWFsIFFTdHJpbmcgY2Fub25pY2FsUGF0aCgpCWNvbnN0OwoKICAgIHZpcnR1YWwgUVN0cmluZyBk aXJOYW1lKCkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJpbmcgZmlsZVBhdGgoIGNvbnN0IFFTdHJp bmcgJmZpbGVOYW1lLAoJCQkgICAgICBib29sIGFjY2VwdEFic1BhdGggPSBUUlVFICkgY29uc3Q7 CiAgICB2aXJ0dWFsIFFTdHJpbmcgYWJzRmlsZVBhdGgoIGNvbnN0IFFTdHJpbmcgJmZpbGVOYW1l LAoJCQkJIGJvb2wgYWNjZXB0QWJzUGF0aCA9IFRSVUUgKSBjb25zdDsKCiAgICBzdGF0aWMgUVN0 cmluZyBjb252ZXJ0U2VwYXJhdG9ycyggY29uc3QgUVN0cmluZyAmcGF0aE5hbWUgKTsKCiAgICB2 aXJ0dWFsIGJvb2wgY2QoIGNvbnN0IFFTdHJpbmcgJmRpck5hbWUsIGJvb2wgYWNjZXB0QWJzUGF0 aCA9IFRSVUUgKTsKICAgIHZpcnR1YWwgYm9vbCBjZFVwKCk7CgogICAgUVN0cmluZwluYW1lRmls dGVyKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0TmFtZUZpbHRlciggY29uc3QgUVN0cmlu ZyAmbmFtZUZpbHRlciApOwogICAgRmlsdGVyU3BlYyBmaWx0ZXIoKSBjb25zdDsKICAgIHZpcnR1 YWwgdm9pZCBzZXRGaWx0ZXIoIGludCBmaWx0ZXJTcGVjICk7CiAgICBTb3J0U3BlYyBzb3J0aW5n KCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U29ydGluZyggaW50IHNvcnRTcGVjICk7Cgog ICAgYm9vbAltYXRjaEFsbERpcnMoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRNYXRjaEFs bERpcnMoIGJvb2wgKTsKCiAgICB1aW50IGNvdW50KCkgY29uc3Q7CiAgICBRU3RyaW5nCW9wZXJh dG9yW10oIGludCApIGNvbnN0OwoKICAgIHZpcnR1YWwgUVN0ckxpc3QgZW5jb2RlZEVudHJ5TGlz dCggaW50IGZpbHRlclNwZWMgPSBEZWZhdWx0RmlsdGVyLAoJCQkJICAgICAgIGludCBzb3J0U3Bl YyAgID0gRGVmYXVsdFNvcnQgICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJMaXN0IGVuY29kZWRF bnRyeUxpc3QoIGNvbnN0IFFTdHJpbmcgJm5hbWVGaWx0ZXIsCgkJCQkgICAgICAgaW50IGZpbHRl clNwZWMgPSBEZWZhdWx0RmlsdGVyLAoJCQkJICAgICAgIGludCBzb3J0U3BlYyAgID0gRGVmYXVs dFNvcnQgICApIGNvbnN0OwogICAgdmlydHVhbCBRU3RyaW5nTGlzdCBlbnRyeUxpc3QoIGludCBm aWx0ZXJTcGVjID0gRGVmYXVsdEZpbHRlciwKCQkJCSAgIGludCBzb3J0U3BlYyAgID0gRGVmYXVs dFNvcnQgICkgY29uc3Q7CiAgICB2aXJ0dWFsIFFTdHJpbmdMaXN0IGVudHJ5TGlzdCggY29uc3Qg UVN0cmluZyAmbmFtZUZpbHRlciwKCQkJCSAgIGludCBmaWx0ZXJTcGVjID0gRGVmYXVsdEZpbHRl ciwKCQkJCSAgIGludCBzb3J0U3BlYyAgID0gRGVmYXVsdFNvcnQgICApIGNvbnN0OwoKICAgIHZp cnR1YWwgY29uc3QgUUZpbGVJbmZvTGlzdCAqZW50cnlJbmZvTGlzdCggaW50IGZpbHRlclNwZWMg PSBEZWZhdWx0RmlsdGVyLAoJCQkJCQlpbnQgc29ydFNwZWMgPSBEZWZhdWx0U29ydCApIGNvbnN0 OwogICAgdmlydHVhbCBjb25zdCBRRmlsZUluZm9MaXN0ICplbnRyeUluZm9MaXN0KCBjb25zdCBR U3RyaW5nICZuYW1lRmlsdGVyLAoJCQkJCQlpbnQgZmlsdGVyU3BlYyA9IERlZmF1bHRGaWx0ZXIs CgkJCQkJCWludCBzb3J0U3BlYyA9IERlZmF1bHRTb3J0ICkgY29uc3Q7CgogICAgc3RhdGljIGNv bnN0IFFGaWxlSW5mb0xpc3QgKmRyaXZlcygpOwoKICAgIHZpcnR1YWwgYm9vbCBta2RpciggY29u c3QgUVN0cmluZyAmZGlyTmFtZSwKCQkJYm9vbCBhY2NlcHRBYnNQYXRoID0gVFJVRSApIGNvbnN0 OwogICAgdmlydHVhbCBib29sIHJtZGlyKCBjb25zdCBRU3RyaW5nICZkaXJOYW1lLAoJCQlib29s IGFjY2VwdEFic1BhdGggPSBUUlVFICkgY29uc3Q7CgogICAgdmlydHVhbCBib29sIGlzUmVhZGFi bGUoKSBjb25zdDsKICAgIHZpcnR1YWwgYm9vbCBleGlzdHMoKSAgIGNvbnN0OwogICAgdmlydHVh bCBib29sIGlzUm9vdCgpICAgY29uc3Q7CgogICAgdmlydHVhbCBib29sIGlzUmVsYXRpdmUoKSBj b25zdDsKICAgIHZpcnR1YWwgdm9pZCBjb252ZXJ0VG9BYnMoKTsKCiAgICB2aXJ0dWFsIGJvb2wg b3BlcmF0b3I9PSggY29uc3QgUURpciAmICkgY29uc3Q7CiAgICB2aXJ0dWFsIGJvb2wgb3BlcmF0 b3IhPSggY29uc3QgUURpciAmICkgY29uc3Q7CgogICAgdmlydHVhbCBib29sIHJlbW92ZSggY29u c3QgUVN0cmluZyAmZmlsZU5hbWUsCgkJCSBib29sIGFjY2VwdEFic1BhdGggPSBUUlVFICk7CiAg ICB2aXJ0dWFsIGJvb2wgcmVuYW1lKCBjb25zdCBRU3RyaW5nICZuYW1lLCBjb25zdCBRU3RyaW5n ICZuZXdOYW1lLAoJCQkgYm9vbCBhY2NlcHRBYnNQYXRocyA9IFRSVUUgICk7CiAgICB2aXJ0dWFs IGJvb2wgZXhpc3RzKCBjb25zdCBRU3RyaW5nICZuYW1lLAoJCQkgYm9vbCBhY2NlcHRBYnNQYXRo ID0gVFJVRSApOwoKICAgIHN0YXRpYyBjaGFyIHNlcGFyYXRvcigpOwoKICAgIHN0YXRpYyBib29s IHNldEN1cnJlbnQoIGNvbnN0IFFTdHJpbmcgJnBhdGggKTsKICAgIHN0YXRpYyBRRGlyIGN1cnJl bnQoKTsKICAgIHN0YXRpYyBRRGlyIGhvbWUoKTsKICAgIHN0YXRpYyBRRGlyIHJvb3QoKTsKICAg IHN0YXRpYyBRU3RyaW5nIGN1cnJlbnREaXJQYXRoKCk7CiAgICBzdGF0aWMgUVN0cmluZyBob21l RGlyUGF0aCgpOwogICAgc3RhdGljIFFTdHJpbmcgcm9vdERpclBhdGgoKTsKCiAgICBzdGF0aWMg Ym9vbCBtYXRjaCggY29uc3QgUVN0cmluZ0xpc3QgJmZpbHRlcnMsIGNvbnN0IFFTdHJpbmcgJmZp bGVOYW1lICk7CiAgICBzdGF0aWMgYm9vbCBtYXRjaCggY29uc3QgUVN0cmluZyAmZmlsdGVyLCBj b25zdCBRU3RyaW5nICZmaWxlTmFtZSApOwogICAgc3RhdGljIFFTdHJpbmcgY2xlYW5EaXJQYXRo KCBjb25zdCBRU3RyaW5nICZkaXJQYXRoICk7CiAgICBzdGF0aWMgYm9vbCBpc1JlbGF0aXZlUGF0 aCggY29uc3QgUVN0cmluZyAmcGF0aCApOwoKcHJpdmF0ZToKCgoKICAgIHZvaWQgaW5pdCgpOwog ICAgdmlydHVhbCBib29sIHJlYWREaXJFbnRyaWVzKCBjb25zdCBRU3RyaW5nICZuYW1lRmlsdGVy LAoJCQkJIGludCBGaWx0ZXJTcGVjLCBpbnQgU29ydFNwZWMgICk7CgogICAgc3RhdGljIHZvaWQg c2xhc2hpZnkgKCBRU3RyaW5nICYpOwoKICAgIFFTdHJpbmcJZFBhdGg7CiAgICBRU3RyaW5nTGlz dCAgICpmTGlzdDsKICAgIFFGaWxlSW5mb0xpc3QgKmZpTGlzdDsKICAgIFFTdHJpbmcJbmFtZUZp bHQ7CiAgICBGaWx0ZXJTcGVjCWZpbHRTOwogICAgU29ydFNwZWMJc29ydFM7CiAgICB1aW50CWRp cnR5CTogMTsKICAgIHVpbnQJYWxsRGlycyA6IDE7Cn07CgoKaW5saW5lIFFTdHJpbmcgUURpcjo6 cGF0aCgpIGNvbnN0CnsKICAgIHJldHVybiBkUGF0aDsKfQoKaW5saW5lIFFTdHJpbmcgUURpcjo6 bmFtZUZpbHRlcigpIGNvbnN0CnsKICAgIHJldHVybiBuYW1lRmlsdDsKfQoKaW5saW5lIFFEaXI6 OkZpbHRlclNwZWMgUURpcjo6ZmlsdGVyKCkgY29uc3QKewogICAgcmV0dXJuIGZpbHRTOwp9Cgpp bmxpbmUgUURpcjo6U29ydFNwZWMgUURpcjo6c29ydGluZygpIGNvbnN0CnsKICAgIHJldHVybiBz b3J0UzsKfQoKaW5saW5lIGJvb2wgUURpcjo6bWF0Y2hBbGxEaXJzKCkgY29uc3QKewogICAgcmV0 dXJuIGFsbERpcnM7Cn0KCmlubGluZSBib29sIFFEaXI6Om9wZXJhdG9yIT0oIGNvbnN0IFFEaXIg JmQgKSBjb25zdAp7CiAgICByZXR1cm4gISgqdGhpcyA9PSBkKTsKfQoKCnN0cnVjdCBRRGlyU29y dEl0ZW0gewogICAgUVN0cmluZyBmaWxlbmFtZV9jYWNoZTsKICAgIFFGaWxlSW5mbyogaXRlbTsK fTsKCgoKIyA1NSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FmaWxlZGlhbG9nLmgiIDIKCiMgMSAi L3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FkaWFsb2cuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgUVB1c2hCdXR0b247CmNsYXNzIFFEaWFs b2dQcml2YXRlOwoKY2xhc3MgICBRRGlhbG9nIDogcHVibGljIFFXaWRnZXQKewpmcmllbmQgY2xh c3MgUVB1c2hCdXR0b247CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFPYmpl Y3QoKSBjb25zdCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25zdCBj aGFyICpjbGFzc05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBjaGFy KiApOyB2aXJ0dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJv b2wgcXRfZW1pdCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5KCBp bnQsIGludCwgUVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFPYmpl Y3QoKTsJUU9iamVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0YXRp YyBRU3RyaW5nIHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGljIFFT dHJpbmcgdHJVdGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZhdGU6 CXN0YXRpYyBRTWV0YU9iamVjdCAqbWV0YU9iajsgCiAgICAgCgpwdWJsaWM6CiAgICBRRGlhbG9n KCBRV2lkZ2V0KiBwYXJlbnQ9MCwgY29uc3QgY2hhciogbmFtZT0wLCBib29sIG1vZGFsPUZBTFNF LAoJICAgICBXRmxhZ3MgZj0wICk7CiAgICB+UURpYWxvZygpOwoKICAgIGVudW0gRGlhbG9nQ29k ZSB7IFJlamVjdGVkLCBBY2NlcHRlZCB9OwoKICAgIGludAkJcmVzdWx0KCkgY29uc3QgeyByZXR1 cm4gcmVzY29kZTsgfQoKICAgIHZvaWQJc2hvdygpOwogICAgdm9pZAloaWRlKCk7CiAgICB2b2lk CW1vdmUoIGludCB4LCBpbnQgeSApOwogICAgdm9pZAltb3ZlKCBjb25zdCBRUG9pbnQgJnAgKTsK ICAgIHZvaWQJcmVzaXplKCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJcmVzaXplKCBjb25zdCBR U2l6ZSAmICk7CiAgICB2b2lkCXNldEdlb21ldHJ5KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQg aCApOwogICAgdm9pZAlzZXRHZW9tZXRyeSggY29uc3QgUVJlY3QgJiApOwoKICAgIHZvaWQJc2V0 T3JpZW50YXRpb24oIE9yaWVudGF0aW9uIG9yaWVudGF0aW9uICk7CiAgICBPcmllbnRhdGlvbglv cmllbnRhdGlvbigpIGNvbnN0OwoKICAgIHZvaWQJc2V0RXh0ZW5zaW9uKCBRV2lkZ2V0KiBleHRl bnNpb24gKTsKICAgIFFXaWRnZXQqCWV4dGVuc2lvbigpIGNvbnN0OwoKICAgIFFTaXplCXNpemVI aW50KCkgY29uc3Q7CiAgICBRU2l6ZQltaW5pbXVtU2l6ZUhpbnQoKSBjb25zdDsKCiAgICB2b2lk IHNldFNpemVHcmlwRW5hYmxlZCggYm9vbCApOwogICAgYm9vbCBpc1NpemVHcmlwRW5hYmxlZCgp IGNvbnN0OwoKcHVibGljICA6CiAgICBpbnQgZXhlYygpOwoKcHJvdGVjdGVkICA6CiAgICB2aXJ0 dWFsIHZvaWQgZG9uZSggaW50ICk7CiAgICB2aXJ0dWFsIHZvaWQgYWNjZXB0KCk7CiAgICB2aXJ0 dWFsIHZvaWQgcmVqZWN0KCk7CgogICAgdm9pZAlzaG93RXh0ZW5zaW9uKCBib29sICk7Cgpwcm90 ZWN0ZWQ6CiAgICB2b2lkCXNldFJlc3VsdCggaW50IHIgKQl7IHJlc2NvZGUgPSByOyB9CiAgICB2 b2lkCWtleVByZXNzRXZlbnQoIFFLZXlFdmVudCAqICk7CiAgICB2b2lkCWNsb3NlRXZlbnQoIFFD bG9zZUV2ZW50ICogKTsKICAgIHZvaWQJcmVzaXplRXZlbnQoIFFSZXNpemVFdmVudCAqICk7CiAg ICB2b2lkCWNvbnRleHRNZW51RXZlbnQoIFFDb250ZXh0TWVudUV2ZW50ICogKTsKICAgIGJvb2wJ ZXZlbnRGaWx0ZXIoIFFPYmplY3QgKiwgUUV2ZW50ICogKTsKICAgIHZvaWQJYWRqdXN0UG9zaXRp b24oIFFXaWRnZXQqKTsKCnByaXZhdGU6CiAgICB2b2lkCXNldERlZmF1bHQoIFFQdXNoQnV0dG9u ICogKTsKICAgIHZvaWQJCWhpZGVEZWZhdWx0KCk7CiAgICBpbnQJCXJlc2NvZGU7CiAgICB1aW50 CWRpZF9tb3ZlICAgOiAxOwogICAgdWludAloYXNfcmVscG9zIDogMTsKICAgIHVpbnQJZGlkX3Jl c2l6ZSA6IDE7CiAgICB1aW50CWluX2xvb3A6IDE7CiAgICB2b2lkIGFkanVzdFBvc2l0aW9uSW50 ZXJuYWwoIFFXaWRnZXQqLCBib29sIHVzZVJlbFBvcyA9IEZBTFNFICk7CiAgICBRRGlhbG9nUHJp dmF0ZSogZDsKCnByaXZhdGU6CSAKCiAgICBRRGlhbG9nKCBjb25zdCBRRGlhbG9nICYgKTsKICAg IFFEaWFsb2cgJm9wZXJhdG9yPSggY29uc3QgUURpYWxvZyAmICk7Cgp9OwoKCgojIDU2ICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcWZpbGVkaWFsb2cuaCIgMgoKIyAxICIvdXNyL2xvY2FsL3F0L2lu Y2x1ZGUvcXVybG9wZXJhdG9yLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3F1cmwuaCIgMQogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFVcmxQcml2YXRlOwoK Y2xhc3MgICBRVXJsCnsKcHVibGljOgogICAgUVVybCgpOwogICAgUVVybCggY29uc3QgUVN0cmlu ZyYgdXJsICk7CiAgICBRVXJsKCBjb25zdCBRVXJsJiB1cmwgKTsKICAgIFFVcmwoIGNvbnN0IFFV cmwmIHVybCwgY29uc3QgUVN0cmluZyYgcmVsVXJsLCBib29sIGNoZWNrU2xhc2ggPSBGQUxTRSAp OwogICAgdmlydHVhbCB+UVVybCgpOwoKICAgIFFTdHJpbmcgcHJvdG9jb2woKSBjb25zdDsKICAg IHZpcnR1YWwgdm9pZCBzZXRQcm90b2NvbCggY29uc3QgUVN0cmluZyYgcHJvdG9jb2wgKTsKCiAg ICBRU3RyaW5nIHVzZXIoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRVc2VyKCBjb25zdCBR U3RyaW5nJiB1c2VyICk7CiAgICBib29sIGhhc1VzZXIoKSBjb25zdDsKCiAgICBRU3RyaW5nIHBh c3N3b3JkKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UGFzc3dvcmQoIGNvbnN0IFFTdHJp bmcmIHBhc3MgKTsKICAgIGJvb2wgaGFzUGFzc3dvcmQoKSBjb25zdDsKCiAgICBRU3RyaW5nIGhv c3QoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRIb3N0KCBjb25zdCBRU3RyaW5nJiB1c2Vy ICk7CiAgICBib29sIGhhc0hvc3QoKSBjb25zdDsKCiAgICBpbnQgcG9ydCgpIGNvbnN0OwogICAg dmlydHVhbCB2b2lkIHNldFBvcnQoIGludCBwb3J0ICk7CiAgICBib29sIGhhc1BvcnQoKSBjb25z dDsKCiAgICBRU3RyaW5nIHBhdGgoIGJvb2wgY29ycmVjdCA9IFRSVUUgKSBjb25zdDsKICAgIHZp cnR1YWwgdm9pZCBzZXRQYXRoKCBjb25zdCBRU3RyaW5nJiBwYXRoICk7CiAgICBib29sIGhhc1Bh dGgoKSBjb25zdDsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0RW5jb2RlZFBhdGhBbmRRdWVyeSggY29u c3QgUVN0cmluZyYgZW5jICk7CiAgICBRU3RyaW5nIGVuY29kZWRQYXRoQW5kUXVlcnkoKTsKCiAg ICB2aXJ0dWFsIHZvaWQgc2V0UXVlcnkoIGNvbnN0IFFTdHJpbmcmIHR4dCApOwogICAgUVN0cmlu ZyBxdWVyeSgpIGNvbnN0OwoKICAgIFFTdHJpbmcgcmVmKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZv aWQgc2V0UmVmKCBjb25zdCBRU3RyaW5nJiB0eHQgKTsKICAgIGJvb2wgaGFzUmVmKCkgY29uc3Q7 CgogICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CiAgICBib29sIGlzTG9jYWxGaWxlKCkgY29uc3Q7 CgogICAgdmlydHVhbCB2b2lkIGFkZFBhdGgoIGNvbnN0IFFTdHJpbmcmIHBhdGggKTsKICAgIHZp cnR1YWwgdm9pZCBzZXRGaWxlTmFtZSggY29uc3QgUVN0cmluZyYgdHh0ICk7CgogICAgUVN0cmlu ZyBmaWxlTmFtZSgpIGNvbnN0OwogICAgUVN0cmluZyBkaXJQYXRoKCkgY29uc3Q7CgogICAgUVVy bCYgb3BlcmF0b3I9KCBjb25zdCBRVXJsJiB1cmwgKTsKICAgIFFVcmwmIG9wZXJhdG9yPSggY29u c3QgUVN0cmluZyYgdXJsICk7CgogICAgYm9vbCBvcGVyYXRvcj09KCBjb25zdCBRVXJsJiB1cmwg KSBjb25zdDsKICAgIGJvb2wgb3BlcmF0b3I9PSggY29uc3QgUVN0cmluZyYgdXJsICkgY29uc3Q7 CgogICAgc3RhdGljIHZvaWQgZGVjb2RlKCBRU3RyaW5nJiB1cmwgKTsKICAgIHN0YXRpYyB2b2lk IGVuY29kZSggUVN0cmluZyYgdXJsICk7CgogICAgb3BlcmF0b3IgUVN0cmluZygpIGNvbnN0Owog ICAgdmlydHVhbCBRU3RyaW5nIHRvU3RyaW5nKCBib29sIGVuY29kZWRQYXRoID0gRkFMU0UsIGJv b2wgZm9yY2VQcmVwZW5kUHJvdG9jb2wgPSBUUlVFICkgY29uc3Q7CgogICAgdmlydHVhbCBib29s IGNkVXAoKTsKCiAgICBzdGF0aWMgYm9vbCBpc1JlbGF0aXZlVXJsKCBjb25zdCBRU3RyaW5nICZ1 cmwgKTsKCnByb3RlY3RlZDoKICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOwogICAgdmlydHVhbCBi b29sIHBhcnNlKCBjb25zdCBRU3RyaW5nJiB1cmwgKTsKCnByaXZhdGU6CiAgICBRVXJsUHJpdmF0 ZSAqZDsKCn07CgoKCgojIDQzICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXVybG9wZXJhdG9yLmgi IDIKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbmV0d29ya3Byb3RvY29sLmgiIDEKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxICIvdXNyL2xvY2FsL3F0 L2luY2x1ZGUvcXVybGluZm8uaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKY2xhc3MgUVVybE9wZXJhdG9yOwpjbGFzcyBRVXJsOwpjbGFzcyBRVXJsSW5m b1ByaXZhdGU7CgpjbGFzcyAgIFFVcmxJbmZvCnsKcHVibGljOgogICAgUVVybEluZm8oKTsKICAg IFFVcmxJbmZvKCBjb25zdCBRVXJsT3BlcmF0b3IgJnBhdGgsIGNvbnN0IFFTdHJpbmcgJmZpbGUg KTsKICAgIFFVcmxJbmZvKCBjb25zdCBRVXJsSW5mbyAmdWkgKTsKICAgIFFVcmxJbmZvKCBjb25z dCBRU3RyaW5nICZuYW1lLCBpbnQgcGVybWlzc2lvbnMsIGNvbnN0IFFTdHJpbmcgJm93bmVyLAoJ ICAgICAgY29uc3QgUVN0cmluZyAmZ3JvdXAsIHVpbnQgc2l6ZSwgY29uc3QgUURhdGVUaW1lICZs YXN0TW9kaWZpZWQsCgkgICAgICBjb25zdCBRRGF0ZVRpbWUgJmxhc3RSZWFkLCBib29sIGlzRGly LCBib29sIGlzRmlsZSwgYm9vbCBpc1N5bUxpbmssCgkgICAgICBib29sIGlzV3JpdGFibGUsIGJv b2wgaXNSZWFkYWJsZSwgYm9vbCBpc0V4ZWN1dGFibGUgKTsKICAgIFFVcmxJbmZvKCBjb25zdCBR VXJsICZ1cmwsIGludCBwZXJtaXNzaW9ucywgY29uc3QgUVN0cmluZyAmb3duZXIsCgkgICAgICBj b25zdCBRU3RyaW5nICZncm91cCwgdWludCBzaXplLCBjb25zdCBRRGF0ZVRpbWUgJmxhc3RNb2Rp ZmllZCwKCSAgICAgIGNvbnN0IFFEYXRlVGltZSAmbGFzdFJlYWQsIGJvb2wgaXNEaXIsIGJvb2wg aXNGaWxlLCBib29sIGlzU3ltTGluaywKCSAgICAgIGJvb2wgaXNXcml0YWJsZSwgYm9vbCBpc1Jl YWRhYmxlLCBib29sIGlzRXhlY3V0YWJsZSApOwogICAgUVVybEluZm8gJm9wZXJhdG9yPSggY29u c3QgUVVybEluZm8gJnVpICk7CiAgICB2aXJ0dWFsIH5RVXJsSW5mbygpOwoKICAgIHZpcnR1YWwg dm9pZCBzZXROYW1lKCBjb25zdCBRU3RyaW5nICZuYW1lICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0 RGlyKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRGaWxlKCBib29sIGIgKTsKICAgIHZp cnR1YWwgdm9pZCBzZXRTeW1MaW5rKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRPd25l ciggY29uc3QgUVN0cmluZyAmcyApOwogICAgdmlydHVhbCB2b2lkIHNldEdyb3VwKCBjb25zdCBR U3RyaW5nICZzICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2l6ZSggdWludCBzICk7CiAgICB2aXJ0 dWFsIHZvaWQgc2V0V3JpdGFibGUoIGJvb2wgYiApOwogICAgdmlydHVhbCB2b2lkIHNldFJlYWRh YmxlKCBib29sIGIgKTsKICAgIHZpcnR1YWwgdm9pZCBzZXRQZXJtaXNzaW9ucyggaW50IHAgKTsK ICAgIHZpcnR1YWwgdm9pZCBzZXRMYXN0TW9kaWZpZWQoIGNvbnN0IFFEYXRlVGltZSAmZHQgKTsK CiAgICBib29sIGlzVmFsaWQoKSBjb25zdDsKCiAgICBRU3RyaW5nIG5hbWUoKSBjb25zdDsKICAg IGludCBwZXJtaXNzaW9ucygpIGNvbnN0OwogICAgUVN0cmluZyBvd25lcigpIGNvbnN0OwogICAg UVN0cmluZyBncm91cCgpIGNvbnN0OwogICAgdWludCBzaXplKCkgY29uc3Q7CiAgICBRRGF0ZVRp bWUgbGFzdE1vZGlmaWVkKCkgY29uc3Q7CiAgICBRRGF0ZVRpbWUgbGFzdFJlYWQoKSBjb25zdDsK ICAgIGJvb2wgaXNEaXIoKSBjb25zdDsKICAgIGJvb2wgaXNGaWxlKCkgY29uc3Q7CiAgICBib29s IGlzU3ltTGluaygpIGNvbnN0OwogICAgYm9vbCBpc1dyaXRhYmxlKCkgY29uc3Q7CiAgICBib29s IGlzUmVhZGFibGUoKSBjb25zdDsKICAgIGJvb2wgaXNFeGVjdXRhYmxlKCkgY29uc3Q7CgogICAg c3RhdGljIGJvb2wgZ3JlYXRlclRoYW4oIGNvbnN0IFFVcmxJbmZvICZpMSwgY29uc3QgUVVybElu Zm8gJmkyLAoJCQkgICAgIGludCBzb3J0QnkgKTsKICAgIHN0YXRpYyBib29sIGxlc3NUaGFuKCBj b25zdCBRVXJsSW5mbyAmaTEsIGNvbnN0IFFVcmxJbmZvICZpMiwKCQkJICBpbnQgc29ydEJ5ICk7 CiAgICBzdGF0aWMgYm9vbCBlcXVhbCggY29uc3QgUVVybEluZm8gJmkxLCBjb25zdCBRVXJsSW5m byAmaTIsCgkJICAgICAgIGludCBzb3J0QnkgKTsKCiAgICBib29sIG9wZXJhdG9yPT0oIGNvbnN0 IFFVcmxJbmZvICZpICkgY29uc3Q7CnByaXZhdGU6CiAgICBRVXJsSW5mb1ByaXZhdGUgKmQ7Cgp9 OwoKCiMgNDIgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xbmV0d29ya3Byb3RvY29sLmgiIDIKCgoj IDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZGljdC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnRlbXBsYXRlPGNsYXNzIHR5cGU+CmNsYXNzIFFEaWN0 CgoKCgk6IHB1YmxpYyBRR0RpY3QKCnsKcHVibGljOgogICAgUURpY3QoIGludCBzaXplID0gMTcs IGJvb2wgY2FzZVNlbnNpdGl2ZSA9IFRSVUUgKQoJOiBRR0RpY3QoIHNpemUsIFN0cmluZ0tleSwg Y2FzZVNlbnNpdGl2ZSwgRkFMU0UgKSB7IH0KICAgIFFEaWN0KCBjb25zdCBRRGljdDx0eXBlPiAm ZCApIDogUUdEaWN0KCBkICkgeyB9CiAgICB+UURpY3QoKQkJCQl7IGNsZWFyKCk7IH0KICAgIFFE aWN0PHR5cGU+ICZvcGVyYXRvcj0oY29uc3QgUURpY3Q8dHlwZT4gJmQpCgkJCXsgcmV0dXJuIChR RGljdDx0eXBlPiYpUUdEaWN0OjpvcGVyYXRvcj0oZCk7IH0KICAgIHVpbnQgIGNvdW50KCkgICBj b25zdAkJeyByZXR1cm4gUUdEaWN0Ojpjb3VudCgpOyB9CiAgICB1aW50ICBzaXplKCkgICAgY29u c3QJCXsgcmV0dXJuIFFHRGljdDo6c2l6ZSgpOyB9CiAgICBib29sICBpc0VtcHR5KCkgY29uc3QJ CXsgcmV0dXJuIFFHRGljdDo6Y291bnQoKSA9PSAwOyB9CgogICAgdm9pZCAgaW5zZXJ0KCBjb25z dCBRU3RyaW5nICZrLCBjb25zdCB0eXBlICpkICkKCQkJCQl7IFFHRGljdDo6bG9va19zdHJpbmco aywoSXRlbSlkLDEpOyB9CiAgICB2b2lkICByZXBsYWNlKCBjb25zdCBRU3RyaW5nICZrLCBjb25z dCB0eXBlICpkICkKCQkJCQl7IFFHRGljdDo6bG9va19zdHJpbmcoaywoSXRlbSlkLDIpOyB9CiAg ICBib29sICByZW1vdmUoIGNvbnN0IFFTdHJpbmcgJmsgKQl7IHJldHVybiBRR0RpY3Q6OnJlbW92 ZV9zdHJpbmcoayk7IH0KICAgIHR5cGUgKnRha2UoIGNvbnN0IFFTdHJpbmcgJmsgKQl7IHJldHVy biAodHlwZSAqKVFHRGljdDo6dGFrZV9zdHJpbmcoayk7IH0KICAgIHR5cGUgKmZpbmQoIGNvbnN0 IFFTdHJpbmcgJmsgKSBjb25zdAoJCXsgcmV0dXJuICh0eXBlICopKChRR0RpY3QqKXRoaXMpLT5R R0RpY3Q6Omxvb2tfc3RyaW5nKGssMCwwKTsgfQogICAgdHlwZSAqb3BlcmF0b3JbXSggY29uc3Qg UVN0cmluZyAmayApIGNvbnN0CgkJeyByZXR1cm4gKHR5cGUgKikoKFFHRGljdCopdGhpcyktPlFH RGljdDo6bG9va19zdHJpbmcoaywwLDApOyB9CgogICAgdm9pZCAgY2xlYXIoKQkJCXsgUUdEaWN0 OjpjbGVhcigpOyB9CiAgICB2b2lkICByZXNpemUoIHVpbnQgbiApCQl7IFFHRGljdDo6cmVzaXpl KG4pOyB9CiAgICB2b2lkICBzdGF0aXN0aWNzKCkgY29uc3QJCXsgUUdEaWN0OjpzdGF0aXN0aWNz KCk7IH0KCgoKCgoKCnByaXZhdGU6Cgl2b2lkICBkZWxldGVJdGVtKCBJdGVtIGQgKTsKfTsKCgp0 ZW1wbGF0ZTw+IGlubGluZSB2b2lkIFFEaWN0PHZvaWQ+OjpkZWxldGVJdGVtKCBJdGVtICkKewp9 CgoKdGVtcGxhdGU8Y2xhc3MgdHlwZT4gaW5saW5lIHZvaWQgUURpY3Q8dHlwZT46OmRlbGV0ZUl0 ZW0oIFFQdHJDb2xsZWN0aW9uOjpJdGVtIGQgKQp7CiAgICBpZiAoIGRlbF9pdGVtICkgZGVsZXRl ICh0eXBlICopZDsKfQoKdGVtcGxhdGU8Y2xhc3MgdHlwZT4KY2xhc3MgUURpY3RJdGVyYXRvcgog OiBwdWJsaWMgUUdEaWN0SXRlcmF0b3IKewpwdWJsaWM6CiAgICBRRGljdEl0ZXJhdG9yKGNvbnN0 IFFEaWN0PHR5cGU+ICZkKSA6IFFHRGljdEl0ZXJhdG9yKChRR0RpY3QgJilkKSB7IH0KICAgIH5R RGljdEl0ZXJhdG9yKCkJICAgICAge30KICAgIHVpbnQgIGNvdW50KCkgICBjb25zdCAgICAgeyBy ZXR1cm4gZGljdC0+Y291bnQoKTsgfQogICAgYm9vbCAgaXNFbXB0eSgpIGNvbnN0ICAgICB7IHJl dHVybiBkaWN0LT5jb3VudCgpID09IDA7IH0KICAgIHR5cGUgKnRvRmlyc3QoKQkgICAgICB7IHJl dHVybiAodHlwZSAqKVFHRGljdEl0ZXJhdG9yOjp0b0ZpcnN0KCk7IH0KICAgIG9wZXJhdG9yIHR5 cGUgKigpIGNvbnN0ICAgeyByZXR1cm4gKHR5cGUgKilRR0RpY3RJdGVyYXRvcjo6Z2V0KCk7IH0K ICAgIHR5cGUgKm9wZXJhdG9yKigpICAgICAgICAgeyByZXR1cm4gKHR5cGUgKilRR0RpY3RJdGVy YXRvcjo6Z2V0KCk7IH0KICAgIHR5cGUgICAqY3VycmVudCgpIGNvbnN0ICAgeyByZXR1cm4gKHR5 cGUgKilRR0RpY3RJdGVyYXRvcjo6Z2V0KCk7IH0KICAgIFFTdHJpbmcgY3VycmVudEtleSgpIGNv bnN0eyByZXR1cm4gUUdEaWN0SXRlcmF0b3I6OmdldEtleVN0cmluZygpOyB9CiAgICB0eXBlICpv cGVyYXRvcigpKCkJICAgICAgeyByZXR1cm4gKHR5cGUgKilRR0RpY3RJdGVyYXRvcjo6b3BlcmF0 b3IoKSgpOyB9CiAgICB0eXBlICpvcGVyYXRvcisrKCkJICAgICAgeyByZXR1cm4gKHR5cGUgKilR R0RpY3RJdGVyYXRvcjo6b3BlcmF0b3IrKygpOyB9CiAgICB0eXBlICpvcGVyYXRvcis9KHVpbnQg aikgIHsgcmV0dXJuICh0eXBlICopUUdEaWN0SXRlcmF0b3I6Om9wZXJhdG9yKz0oaik7IH0KfTsK CgojIDQ0ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcW5ldHdvcmtwcm90b2NvbC5oIiAyCgoKCgoK CmNsYXNzIFFOZXR3b3JrUHJvdG9jb2w7CmNsYXNzIFFOZXR3b3JrT3BlcmF0aW9uOwpjbGFzcyBR VGltZXI7CmNsYXNzIFFVcmxPcGVyYXRvcjsKY2xhc3MgUU5ldHdvcmtQcm90b2NvbFByaXZhdGU7 CnRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBRVmFsdWVMaXN0OwoKY2xhc3MgICBRTmV0d29ya1By b3RvY29sRmFjdG9yeUJhc2UKewpwdWJsaWM6CiAgIHZpcnR1YWwgUU5ldHdvcmtQcm90b2NvbCAq Y3JlYXRlT2JqZWN0KCkgPSAwOwoKfTsKCnRlbXBsYXRlPCBjbGFzcyBQcm90b2NvbCA+CmNsYXNz IFFOZXR3b3JrUHJvdG9jb2xGYWN0b3J5IDogcHVibGljIFFOZXR3b3JrUHJvdG9jb2xGYWN0b3J5 QmFzZQp7CnB1YmxpYzoKICAgIFFOZXR3b3JrUHJvdG9jb2wgKmNyZWF0ZU9iamVjdCgpIHsKCXJl dHVybiBuZXcgUHJvdG9jb2w7CiAgICB9Cgp9OwoKdHlwZWRlZiBRRGljdDwgUU5ldHdvcmtQcm90 b2NvbEZhY3RvcnlCYXNlID4gUU5ldHdvcmtQcm90b2NvbERpY3Q7CgpjbGFzcyAgIFFOZXR3b3Jr UHJvdG9jb2wgOiBwdWJsaWMgUU9iamVjdAp7CiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmpl Y3QgKm1ldGFPYmplY3QoKSBjb25zdCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0Jdmly dHVhbCBjb25zdCBjaGFyICpjbGFzc05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0 KCBjb25zdCBjaGFyKiApOyB2aXJ0dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiAp OyB2aXJ0dWFsIGJvb2wgcXRfZW1pdCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0 X3Byb3BlcnR5KCBpbnQsIGludCwgUVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0 YXRpY01ldGFPYmplY3QoKTsJUU9iamVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0 aGlzOyB9IHN0YXRpYyBRU3RyaW5nIHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAg KTsgc3RhdGljIFFTdHJpbmcgdHJVdGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAg KTsgCXByaXZhdGU6CXN0YXRpYyBRTWV0YU9iamVjdCAqbWV0YU9iajsgCgpwdWJsaWM6CiAgICBl bnVtIFN0YXRlIHsKCVN0V2FpdGluZyA9IDAsCglTdEluUHJvZ3Jlc3MsCglTdERvbmUsCglTdEZh aWxlZCwKCVN0U3RvcHBlZAogICAgfTsKCiAgICBlbnVtIE9wZXJhdGlvbiB7CglPcExpc3RDaGls ZHJlbiA9IDEsCglPcE1rRGlyID0gMiwKCU9wTWtkaXIgPSBPcE1rRGlyLCAgCglPcFJlbW92ZSA9 IDQsCglPcFJlbmFtZSA9IDgsCglPcEdldCA9IDMyLAoJT3BQdXQgPSA2NAogICAgfTsKCiAgICBl bnVtIENvbm5lY3Rpb25TdGF0ZSB7CglDb25Ib3N0Rm91bmQsCglDb25Db25uZWN0ZWQsCglDb25D bG9zZWQKICAgIH07CgogICAgZW51bSBFcnJvciB7CgkgCglOb0Vycm9yID0gMCwKCSAKCUVyclZh bGlkLAoJRXJyVW5rbm93blByb3RvY29sLAoJRXJyVW5zdXBwb3J0ZWQsCglFcnJQYXJzZSwKCSAK CUVyckxvZ2luSW5jb3JyZWN0LAoJRXJySG9zdE5vdEZvdW5kLAoJIAoJRXJyTGlzdENoaWxkcmVu LAoJRXJyTGlzdENobGlkcmVuID0gRXJyTGlzdENoaWxkcmVuLCAgCglFcnJNa0RpciwKCUVyck1r ZGlyID0gRXJyTWtEaXIsICAKCUVyclJlbW92ZSwKCUVyclJlbmFtZSwKCUVyckdldCwKCUVyclB1 dCwKCUVyckZpbGVOb3RFeGlzdGluZywKCUVyclBlcm1pc3Npb25EZW5pZWQKICAgIH07CgogICAg UU5ldHdvcmtQcm90b2NvbCgpOwogICAgdmlydHVhbCB+UU5ldHdvcmtQcm90b2NvbCgpOwoKICAg IHZpcnR1YWwgdm9pZCBzZXRVcmwoIFFVcmxPcGVyYXRvciAqdSApOwoKICAgIHZpcnR1YWwgdm9p ZCBzZXRBdXRvRGVsZXRlKCBib29sIGIsIGludCBpID0gMTAwMDAgKTsKICAgIGJvb2wgYXV0b0Rl bGV0ZSgpIGNvbnN0OwoKICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTmV0d29ya1Byb3RvY29sKCBj b25zdCBRU3RyaW5nICZwcm90b2NvbCwKCQkJCQkgUU5ldHdvcmtQcm90b2NvbEZhY3RvcnlCYXNl ICpwcm90b2NvbEZhY3RvcnkgKTsKICAgIHN0YXRpYyBRTmV0d29ya1Byb3RvY29sICpnZXROZXR3 b3JrUHJvdG9jb2woIGNvbnN0IFFTdHJpbmcgJnByb3RvY29sICk7CiAgICBzdGF0aWMgYm9vbCBo YXNPbmx5TG9jYWxGaWxlU3lzdGVtKCk7CgogICAgdmlydHVhbCBpbnQgc3VwcG9ydGVkT3BlcmF0 aW9ucygpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIGFkZE9wZXJhdGlvbiggUU5ldHdvcmtPcGVy YXRpb24gKm9wICk7CgogICAgUVVybE9wZXJhdG9yICp1cmwoKSBjb25zdDsKICAgIFFOZXR3b3Jr T3BlcmF0aW9uICpvcGVyYXRpb25JblByb2dyZXNzKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQg Y2xlYXJPcGVyYXRpb25RdWV1ZSgpOwogICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKCnByb3RlY3Rl ZCA6CiAgICB2b2lkIGRhdGEoIGNvbnN0IFFCeXRlQXJyYXkgJiwgUU5ldHdvcmtPcGVyYXRpb24g KnJlcyApOwogICAgdm9pZCBjb25uZWN0aW9uU3RhdGVDaGFuZ2VkKCBpbnQgc3RhdGUsIGNvbnN0 IFFTdHJpbmcgJmRhdGEgKTsKICAgIHZvaWQgZmluaXNoZWQoIFFOZXR3b3JrT3BlcmF0aW9uICpy ZXMgKTsKICAgIHZvaWQgc3RhcnQoIFFOZXR3b3JrT3BlcmF0aW9uICpyZXMgKTsKICAgIHZvaWQg bmV3Q2hpbGRyZW4oIGNvbnN0IFFWYWx1ZUxpc3Q8UVVybEluZm8+ICYsIFFOZXR3b3JrT3BlcmF0 aW9uICpyZXMgKTsKICAgIHZvaWQgbmV3Q2hpbGQoIGNvbnN0IFFVcmxJbmZvICYsIFFOZXR3b3Jr T3BlcmF0aW9uICpyZXMgKTsKICAgIHZvaWQgY3JlYXRlZERpcmVjdG9yeSggY29uc3QgUVVybElu Zm8gJiwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCByZW1vdmVkKCBRTmV0d29y a09wZXJhdGlvbiAqcmVzICk7CiAgICB2b2lkIGl0ZW1DaGFuZ2VkKCBRTmV0d29ya09wZXJhdGlv biAqcmVzICk7CiAgICB2b2lkIGRhdGFUcmFuc2ZlclByb2dyZXNzKCBpbnQgYnl0ZXNEb25lLCBp bnQgYnl0ZXNUb3RhbCwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwoKcHJvdGVjdGVkOgogICAg dmlydHVhbCB2b2lkIHByb2Nlc3NPcGVyYXRpb24oIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwog ICAgdmlydHVhbCB2b2lkIG9wZXJhdGlvbkxpc3RDaGlsZHJlbiggUU5ldHdvcmtPcGVyYXRpb24g Km9wICk7CiAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0aW9uTWtEaXIoIFFOZXR3b3JrT3BlcmF0aW9u ICpvcCApOwogICAgdmlydHVhbCB2b2lkIG9wZXJhdGlvblJlbW92ZSggUU5ldHdvcmtPcGVyYXRp b24gKm9wICk7CiAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0aW9uUmVuYW1lKCBRTmV0d29ya09wZXJh dGlvbiAqb3AgKTsKICAgIHZpcnR1YWwgdm9pZCBvcGVyYXRpb25HZXQoIFFOZXR3b3JrT3BlcmF0 aW9uICpvcCApOwogICAgdmlydHVhbCB2b2lkIG9wZXJhdGlvblB1dCggUU5ldHdvcmtPcGVyYXRp b24gKm9wICk7CiAgICB2aXJ0dWFsIHZvaWQgb3BlcmF0aW9uUHV0Q2h1bmsoIFFOZXR3b3JrT3Bl cmF0aW9uICpvcCApOwogICAgdmlydHVhbCBib29sIGNoZWNrQ29ubmVjdGlvbiggUU5ldHdvcmtP cGVyYXRpb24gKm9wICk7Cgpwcml2YXRlOgogICAgUU5ldHdvcmtQcm90b2NvbFByaXZhdGUgKmQ7 Cgpwcml2YXRlICA6CiAgICB2b2lkIHByb2Nlc3NOZXh0T3BlcmF0aW9uKCBRTmV0d29ya09wZXJh dGlvbiAqb2xkICk7CiAgICB2b2lkIHN0YXJ0T3BzKCk7CiAgICB2b2lkIGVtaXROZXdDaGlsZHJl biggY29uc3QgUVVybEluZm8gJmksIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwoKICAgIHZvaWQg cmVtb3ZlTWUoKTsKCn07CgpjbGFzcyBRTmV0d29ya09wZXJhdGlvblByaXZhdGU7CgpjbGFzcyAg IFFOZXR3b3JrT3BlcmF0aW9uIDogcHVibGljIFFPYmplY3QKewogICAgcHVibGljOgl2aXJ0dWFs IFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVj dCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9p ZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBR VU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1 YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRh T2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAo UU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAg ZnJpZW5kIGNsYXNzIFFVcmxPcGVyYXRvcjsKCnB1YmxpYzoKICAgIFFOZXR3b3JrT3BlcmF0aW9u KCBRTmV0d29ya1Byb3RvY29sOjpPcGVyYXRpb24gb3BlcmF0aW9uLAoJCSAgICBjb25zdCBRU3Ry aW5nICZhcmcwLCBjb25zdCBRU3RyaW5nICZhcmcxLAoJCSAgICBjb25zdCBRU3RyaW5nICZhcmcy ICk7CiAgICBRTmV0d29ya09wZXJhdGlvbiggUU5ldHdvcmtQcm90b2NvbDo6T3BlcmF0aW9uIG9w ZXJhdGlvbiwKCQkgICAgY29uc3QgUUJ5dGVBcnJheSAmYXJnMCwgY29uc3QgUUJ5dGVBcnJheSAm YXJnMSwKCQkgICAgY29uc3QgUUJ5dGVBcnJheSAmYXJnMiApOwogICAgflFOZXR3b3JrT3BlcmF0 aW9uKCk7CgogICAgdm9pZCBzZXRTdGF0ZSggUU5ldHdvcmtQcm90b2NvbDo6U3RhdGUgc3RhdGUg KTsKICAgIHZvaWQgc2V0UHJvdG9jb2xEZXRhaWwoIGNvbnN0IFFTdHJpbmcgJmRldGFpbCApOwog ICAgdm9pZCBzZXRFcnJvckNvZGUoIGludCBlYyApOwogICAgdm9pZCBzZXRBcmcoIGludCBudW0s IGNvbnN0IFFTdHJpbmcgJmFyZyApOwogICAgdm9pZCBzZXRSYXdBcmcoIGludCBudW0sIGNvbnN0 IFFCeXRlQXJyYXkgJmFyZyApOwoKICAgIFFOZXR3b3JrUHJvdG9jb2w6Ok9wZXJhdGlvbiBvcGVy YXRpb24oKSBjb25zdDsKICAgIFFOZXR3b3JrUHJvdG9jb2w6OlN0YXRlIHN0YXRlKCkgY29uc3Q7 CiAgICBRU3RyaW5nIGFyZyggaW50IG51bSApIGNvbnN0OwogICAgUUJ5dGVBcnJheSByYXdBcmco IGludCBudW0gKSBjb25zdDsKICAgIFFTdHJpbmcgcHJvdG9jb2xEZXRhaWwoKSBjb25zdDsKICAg IGludCBlcnJvckNvZGUoKSBjb25zdDsKCiAgICB2b2lkIGZyZWUoKTsKCnByaXZhdGUgIDoKICAg IHZvaWQgZGVsZXRlTWUoKTsKCnByaXZhdGU6CiAgICBRQnl0ZUFycmF5ICZyYXcoIGludCBudW0g KSBjb25zdDsKICAgIFFOZXR3b3JrT3BlcmF0aW9uUHJpdmF0ZSAqZDsKCn07CgoKCgojIDQ1ICIv dXNyL2xvY2FsL3F0L2luY2x1ZGUvcXVybG9wZXJhdG9yLmgiIDIKCgoKCgoKY2xhc3MgUVVybElu Zm87CmNsYXNzIFFVcmxPcGVyYXRvclByaXZhdGU7CgpjbGFzcyAgIFFVcmxPcGVyYXRvciA6IHB1 YmxpYyBRT2JqZWN0LCBwdWJsaWMgUVVybAp7CiAgICBmcmllbmQgY2xhc3MgUU5ldHdvcmtQcm90 b2NvbDsKCiAgICBwdWJsaWM6CXZpcnR1YWwgUU1ldGFPYmplY3QgKm1ldGFPYmplY3QoKSBjb25z dCB7IHJldHVybiBzdGF0aWNNZXRhT2JqZWN0KCk7CX0JdmlydHVhbCBjb25zdCBjaGFyICpjbGFz c05hbWUoKSBjb25zdDsJdmlydHVhbCB2b2lkKiBxdF9jYXN0KCBjb25zdCBjaGFyKiApOyB2aXJ0 dWFsIGJvb2wgcXRfaW52b2tlKCBpbnQsIFFVT2JqZWN0KiApOyB2aXJ0dWFsIGJvb2wgcXRfZW1p dCggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X3Byb3BlcnR5KCBpbnQsIGludCwg UVZhcmlhbnQqICk7IAlzdGF0aWMgUU1ldGFPYmplY3QqIHN0YXRpY01ldGFPYmplY3QoKTsJUU9i amVjdCogcU9iamVjdCgpIHsgcmV0dXJuIChRT2JqZWN0Kil0aGlzOyB9IHN0YXRpYyBRU3RyaW5n IHRyKCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgc3RhdGljIFFTdHJpbmcgdHJV dGY4KCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiA9IDAgKTsgCXByaXZhdGU6CXN0YXRpYyBR TWV0YU9iamVjdCAqbWV0YU9iajsgCgpwdWJsaWM6CiAgICBRVXJsT3BlcmF0b3IoKTsKICAgIFFV cmxPcGVyYXRvciggY29uc3QgUVN0cmluZyAmdXJMICk7CiAgICBRVXJsT3BlcmF0b3IoIGNvbnN0 IFFVcmxPcGVyYXRvciYgdXJsICk7CiAgICBRVXJsT3BlcmF0b3IoIGNvbnN0IFFVcmxPcGVyYXRv ciYgdXJsLCBjb25zdCBRU3RyaW5nJiByZWxVcmwsIGJvb2wgY2hlY2tTbGFzaCA9IEZBTFNFICk7 CiAgICB2aXJ0dWFsIH5RVXJsT3BlcmF0b3IoKTsKCiAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0aCgg Y29uc3QgUVN0cmluZyYgcGF0aCApOwogICAgdmlydHVhbCBib29sIGNkVXAoKTsKCiAgICB2aXJ0 dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpsaXN0Q2hpbGRyZW4oKTsKICAgIHZpcnR1YWwg Y29uc3QgUU5ldHdvcmtPcGVyYXRpb24gKm1rZGlyKCBjb25zdCBRU3RyaW5nICZkaXJuYW1lICk7 CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpyZW1vdmUoIGNvbnN0IFFTdHJp bmcgJmZpbGVuYW1lICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0aW9uICpyZW5h bWUoIGNvbnN0IFFTdHJpbmcgJm9sZG5hbWUsIGNvbnN0IFFTdHJpbmcgJm5ld25hbWUgKTsKICAg IHZpcnR1YWwgY29uc3QgUU5ldHdvcmtPcGVyYXRpb24gKmdldCggY29uc3QgUVN0cmluZyAmbG9j YXRpb24gPSBRU3RyaW5nOjpudWxsICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFOZXR3b3JrT3BlcmF0 aW9uICpwdXQoIGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsIGNvbnN0IFFTdHJpbmcgJmxvY2F0aW9u ID0gUVN0cmluZzo6bnVsbCAgKTsKICAgIHZpcnR1YWwgUVB0ckxpc3Q8UU5ldHdvcmtPcGVyYXRp b24+IGNvcHkoIGNvbnN0IFFTdHJpbmcgJmZyb20sIGNvbnN0IFFTdHJpbmcgJnRvLCBib29sIG1v dmUgPSBGQUxTRSwgYm9vbCB0b1BhdGggPSBUUlVFICk7CiAgICB2aXJ0dWFsIHZvaWQgY29weSgg Y29uc3QgUVN0cmluZ0xpc3QgJmZpbGVzLCBjb25zdCBRU3RyaW5nICZkZXN0LCBib29sIG1vdmUg PSBGQUxTRSApOwogICAgdmlydHVhbCBib29sIGlzRGlyKCBib29sICpvayA9IDAgKTsKCiAgICB2 aXJ0dWFsIHZvaWQgc2V0TmFtZUZpbHRlciggY29uc3QgUVN0cmluZyAmbmFtZUZpbHRlciApOwog ICAgUVN0cmluZyBuYW1lRmlsdGVyKCkgY29uc3Q7CgogICAgdmlydHVhbCBRVXJsSW5mbyBpbmZv KCBjb25zdCBRU3RyaW5nICZlbnRyeSApIGNvbnN0OwoKICAgIFFVcmxPcGVyYXRvciYgb3BlcmF0 b3I9KCBjb25zdCBRVXJsT3BlcmF0b3IgJnVybCApOwogICAgUVVybE9wZXJhdG9yJiBvcGVyYXRv cj0oIGNvbnN0IFFTdHJpbmcgJnVybCApOwoKICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7Cgpwcm90 ZWN0ZWQgOgogICAgdm9pZCBuZXdDaGlsZHJlbiggY29uc3QgUVZhbHVlTGlzdDxRVXJsSW5mbz4g JiwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBmaW5pc2hlZCggUU5ldHdvcmtP cGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBzdGFydCggUU5ldHdvcmtPcGVyYXRpb24gKnJlcyAp OwogICAgdm9pZCBjcmVhdGVkRGlyZWN0b3J5KCBjb25zdCBRVXJsSW5mbyAmLCBRTmV0d29ya09w ZXJhdGlvbiAqcmVzICk7CiAgICB2b2lkIHJlbW92ZWQoIFFOZXR3b3JrT3BlcmF0aW9uICpyZXMg KTsKICAgIHZvaWQgaXRlbUNoYW5nZWQoIFFOZXR3b3JrT3BlcmF0aW9uICpyZXMgKTsKICAgIHZv aWQgZGF0YSggY29uc3QgUUJ5dGVBcnJheSAmLCBRTmV0d29ya09wZXJhdGlvbiAqcmVzICk7CiAg ICB2b2lkIGRhdGFUcmFuc2ZlclByb2dyZXNzKCBpbnQgYnl0ZXNEb25lLCBpbnQgYnl0ZXNUb3Rh bCwgUU5ldHdvcmtPcGVyYXRpb24gKnJlcyApOwogICAgdm9pZCBzdGFydGVkTmV4dENvcHkoIGNv bnN0IFFQdHJMaXN0PFFOZXR3b3JrT3BlcmF0aW9uPiAmbHN0ICk7CiAgICB2b2lkIGNvbm5lY3Rp b25TdGF0ZUNoYW5nZWQoIGludCBzdGF0ZSwgY29uc3QgUVN0cmluZyAmZGF0YSApOwoKcHJvdGVj dGVkOgogICAgdm9pZCByZXNldCgpOwogICAgYm9vbCBwYXJzZSggY29uc3QgUVN0cmluZyYgdXJs ICk7CiAgICB2aXJ0dWFsIGJvb2wgY2hlY2tWYWxpZCgpOwogICAgdmlydHVhbCB2b2lkIGNsZWFy RW50cmllcygpOwogICAgdm9pZCBnZXROZXR3b3JrUHJvdG9jb2woKTsKICAgIHZvaWQgZGVsZXRl TmV0d29ya1Byb3RvY29sKCk7Cgpwcml2YXRlICA6CiAgICBjb25zdCBRTmV0d29ya09wZXJhdGlv biAqc3RhcnRPcGVyYXRpb24oIFFOZXR3b3JrT3BlcmF0aW9uICpvcCApOwogICAgdm9pZCBjb3B5 R290RGF0YSggY29uc3QgUUJ5dGVBcnJheSAmZGF0YSwgUU5ldHdvcmtPcGVyYXRpb24gKm9wICk7 CiAgICB2b2lkIGNvbnRpbnVlQ29weSggUU5ldHdvcmtPcGVyYXRpb24gKm9wICk7CiAgICB2b2lk IGZpbmlzaGVkQ29weSgpOwogICAgdm9pZCBhZGRFbnRyeSggY29uc3QgUVZhbHVlTGlzdDxRVXJs SW5mbz4gJmkgKTsKICAgIHZvaWQgc2xvdEl0ZW1DaGFuZ2VkKCBRTmV0d29ya09wZXJhdGlvbiAq b3AgKTsKCnByaXZhdGU6CiAgICB2b2lkIGRlbGV0ZU9wZXJhdGlvbiggUU5ldHdvcmtPcGVyYXRp b24gKm9wICk7CgogICAgUVVybE9wZXJhdG9yUHJpdmF0ZSAqZDsKCn07CgoKCgojIDU3ICIvdXNy L2xvY2FsL3F0L2luY2x1ZGUvcWZpbGVkaWFsb2cuaCIgMgoKCgoKCgpjbGFzcyAgIFFGaWxlSWNv blByb3ZpZGVyIDogcHVibGljIFFPYmplY3QKewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2Jq ZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZp cnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2Fz dCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCog KTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBx dF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBz dGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCop dGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAw ICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAw ICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IApwdWJsaWM6CiAgICBR RmlsZUljb25Qcm92aWRlciggUU9iamVjdCAqIHBhcmVudCA9IDAsIGNvbnN0IGNoYXIqIG5hbWUg PSAwICk7CiAgICB2aXJ0dWFsIGNvbnN0IFFQaXhtYXAgKiBwaXhtYXAoIGNvbnN0IFFGaWxlSW5m byAmICk7Cgpwcml2YXRlOgkgCgogICAgUUZpbGVJY29uUHJvdmlkZXIoIGNvbnN0IFFGaWxlSWNv blByb3ZpZGVyICYgKTsKICAgIFFGaWxlSWNvblByb3ZpZGVyJiBvcGVyYXRvcj0oIGNvbnN0IFFG aWxlSWNvblByb3ZpZGVyICYgKTsKCn07CgpjbGFzcyAgIFFGaWxlUHJldmlldwp7CnB1YmxpYzoK ICAgIFFGaWxlUHJldmlldygpOwogICAgdmlydHVhbCB2b2lkIHByZXZpZXdVcmwoIGNvbnN0IFFV cmwgJnVybCApID0gMDsKCn07CgpjbGFzcyAgIFFGaWxlRGlhbG9nIDogcHVibGljIFFEaWFsb2cK ewogICAgcHVibGljOgl2aXJ0dWFsIFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyBy ZXR1cm4gc3RhdGljTWV0YU9iamVjdCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1l KCkgY29uc3Q7CXZpcnR1YWwgdm9pZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBi b29sIHF0X2ludm9rZSggaW50LCBRVU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGlu dCwgUVVPYmplY3QqICk7IHZpcnR1YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJp YW50KiApOyAJc3RhdGljIFFNZXRhT2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3Qq IHFPYmplY3QoKSB7IHJldHVybiAoUU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0cigg Y29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCgg Y29uc3QgY2hhciAqLCBjb25zdCBjaGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFP YmplY3QgKm1ldGFPYmo7IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAg IAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAogICAgIAoKcHVibGljOgogICAgUUZpbGVE aWFsb2coIGNvbnN0IFFTdHJpbmcmIGRpck5hbWUsIGNvbnN0IFFTdHJpbmcmIGZpbHRlciA9IFFT dHJpbmc6Om51bGwsCgkJIFFXaWRnZXQqIHBhcmVudD0wLCBjb25zdCBjaGFyKiBuYW1lPTAsIGJv b2wgbW9kYWwgPSBGQUxTRSApOwogICAgUUZpbGVEaWFsb2coIFFXaWRnZXQqIHBhcmVudD0wLCBj b25zdCBjaGFyKiBuYW1lPTAsIGJvb2wgbW9kYWwgPSBGQUxTRSApOwogICAgflFGaWxlRGlhbG9n KCk7CgogICAgIAoKICAgIHN0YXRpYyBRU3RyaW5nIGdldE9wZW5GaWxlTmFtZSggY29uc3QgUVN0 cmluZyAmaW5pdGlhbGx5ID0gUVN0cmluZzo6bnVsbCwKCQkJCSAgICBjb25zdCBRU3RyaW5nICZm aWx0ZXIgPSBRU3RyaW5nOjpudWxsLAoJCQkJICAgIFFXaWRnZXQgKnBhcmVudCA9IDAsIGNvbnN0 IGNoYXIqIG5hbWUgPSAwLAoJCQkJICAgIGNvbnN0IFFTdHJpbmcgJmNhcHRpb24gPSBRU3RyaW5n OjpudWxsLAoJCQkJICAgIFFTdHJpbmcgKnNlbGVjdGVkRmlsdGVyID0gMCwKCQkJCSAgICBib29s IHJlc29sdmVTeW1saW5rcyA9IFRSVUUpOwogICAgc3RhdGljIFFTdHJpbmcgZ2V0U2F2ZUZpbGVO YW1lKCBjb25zdCBRU3RyaW5nICZpbml0aWFsbHkgPSBRU3RyaW5nOjpudWxsLAoJCQkJICAgIGNv bnN0IFFTdHJpbmcgJmZpbHRlciA9IFFTdHJpbmc6Om51bGwsCgkJCQkgICAgUVdpZGdldCAqcGFy ZW50ID0gMCwgY29uc3QgY2hhciogbmFtZSA9IDAsCgkJCQkgICAgY29uc3QgUVN0cmluZyAmY2Fw dGlvbiA9IFFTdHJpbmc6Om51bGwsCgkJCQkgICAgUVN0cmluZyAqc2VsZWN0ZWRGaWx0ZXIgPSAw LAoJCQkJICAgIGJvb2wgcmVzb2x2ZVN5bWxpbmtzID0gVFJVRSk7CiAgICBzdGF0aWMgUVN0cmlu ZyBnZXRFeGlzdGluZ0RpcmVjdG9yeSggY29uc3QgUVN0cmluZyAmZGlyID0gUVN0cmluZzo6bnVs bCwKCQkJCQkgUVdpZGdldCAqcGFyZW50ID0gMCwKCQkJCQkgY29uc3QgY2hhciogbmFtZSA9IDAs CgkJCQkJIGNvbnN0IFFTdHJpbmcgJmNhcHRpb24gPSBRU3RyaW5nOjpudWxsLAoJCQkJCSBib29s IGRpck9ubHkgPSBUUlVFLAoJCQkJCSBib29sIHJlc29sdmVTeW1saW5rcyA9IFRSVUUpOwogICAg c3RhdGljIFFTdHJpbmdMaXN0IGdldE9wZW5GaWxlTmFtZXMoIGNvbnN0IFFTdHJpbmcgJmZpbHRl cj0gUVN0cmluZzo6bnVsbCwKCQkJCQkgY29uc3QgUVN0cmluZyAmZGlyID0gUVN0cmluZzo6bnVs bCwKCQkJCQkgUVdpZGdldCAqcGFyZW50ID0gMCwKCQkJCQkgY29uc3QgY2hhciogbmFtZSA9IDAs CgkJCQkJIGNvbnN0IFFTdHJpbmcgJmNhcHRpb24gPSBRU3RyaW5nOjpudWxsLAoJCQkJCSBRU3Ry aW5nICpzZWxlY3RlZEZpbHRlciA9IDAsCgkJCQkJIGJvb2wgcmVzb2x2ZVN5bWxpbmtzID0gVFJV RSk7CgogICAgIAoKICAgIHN0YXRpYyB2b2lkIHNldEljb25Qcm92aWRlciggUUZpbGVJY29uUHJv dmlkZXIgKiApOwogICAgc3RhdGljIFFGaWxlSWNvblByb3ZpZGVyICogaWNvblByb3ZpZGVyKCk7 CgogICAgIAoKICAgIFFTdHJpbmcgc2VsZWN0ZWRGaWxlKCkgY29uc3Q7CiAgICBRU3RyaW5nIHNl bGVjdGVkRmlsdGVyKCkgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0ZWRGaWx0ZXIo IGNvbnN0IFFTdHJpbmcmICk7CiAgICB2aXJ0dWFsIHZvaWQgc2V0U2VsZWN0ZWRGaWx0ZXIoIGlu dCApOwoKICAgIHZvaWQgc2V0U2VsZWN0aW9uKCBjb25zdCBRU3RyaW5nICYpOwoKICAgIHZvaWQg c2VsZWN0QWxsKCBib29sIGIgKTsKCiAgICBRU3RyaW5nTGlzdCBzZWxlY3RlZEZpbGVzKCkgY29u c3Q7CgogICAgUVN0cmluZyBkaXJQYXRoKCkgY29uc3Q7CgogICAgdm9pZCBzZXREaXIoIGNvbnN0 IFFEaXIgJiApOwogICAgY29uc3QgUURpciAqZGlyKCkgY29uc3Q7CgogICAgdm9pZCBzZXRTaG93 SGlkZGVuRmlsZXMoIGJvb2wgcyApOwogICAgYm9vbCBzaG93SGlkZGVuRmlsZXMoKSBjb25zdDsK CiAgICB2b2lkIHJlcmVhZERpcigpOwogICAgdm9pZCByZXNvcnREaXIoKTsKCiAgICBlbnVtIE1v ZGUgeyBBbnlGaWxlLCBFeGlzdGluZ0ZpbGUsIERpcmVjdG9yeSwgRXhpc3RpbmdGaWxlcywgRGly ZWN0b3J5T25seSB9OwogICAgdm9pZCBzZXRNb2RlKCBNb2RlICk7CiAgICBNb2RlIG1vZGUoKSBj b25zdDsKCiAgICBlbnVtIFZpZXdNb2RlIHsgRGV0YWlsLCBMaXN0IH07CiAgICBlbnVtIFByZXZp ZXdNb2RlIHsgTm9QcmV2aWV3LCBDb250ZW50cywgSW5mbyB9OwogICAgdm9pZCBzZXRWaWV3TW9k ZSggVmlld01vZGUgbSApOwogICAgVmlld01vZGUgdmlld01vZGUoKSBjb25zdDsKICAgIHZvaWQg c2V0UHJldmlld01vZGUoIFByZXZpZXdNb2RlIG0gKTsKICAgIFByZXZpZXdNb2RlIHByZXZpZXdN b2RlKCkgY29uc3Q7CgogICAgYm9vbCBldmVudEZpbHRlciggUU9iamVjdCAqLCBRRXZlbnQgKiAp OwoKICAgIGJvb2wgaXNJbmZvUHJldmlld0VuYWJsZWQoKSBjb25zdDsKICAgIGJvb2wgaXNDb250 ZW50c1ByZXZpZXdFbmFibGVkKCkgY29uc3Q7CiAgICB2b2lkIHNldEluZm9QcmV2aWV3RW5hYmxl ZCggYm9vbCApOwogICAgdm9pZCBzZXRDb250ZW50c1ByZXZpZXdFbmFibGVkKCBib29sICk7Cgog ICAgdm9pZCBzZXRJbmZvUHJldmlldyggUVdpZGdldCAqdywgUUZpbGVQcmV2aWV3ICpwcmV2aWV3 ICk7CiAgICB2b2lkIHNldENvbnRlbnRzUHJldmlldyggUVdpZGdldCAqdywgUUZpbGVQcmV2aWV3 ICpwcmV2aWV3ICk7CgogICAgUVVybCB1cmwoKSBjb25zdDsKCiAgICB2b2lkIGFkZEZpbHRlcigg Y29uc3QgUVN0cmluZyAmZmlsdGVyICk7CgpwdWJsaWMgIDoKICAgIHZvaWQgZG9uZSggaW50ICk7 CiAgICB2b2lkIHNldERpciggY29uc3QgUVN0cmluZyYgKTsKICAgIHZvaWQgc2V0VXJsKCBjb25z dCBRVXJsT3BlcmF0b3IgJnVybCApOwogICAgdm9pZCBzZXRGaWx0ZXIoIGNvbnN0IFFTdHJpbmcm ICk7CiAgICB2b2lkIHNldEZpbHRlcnMoIGNvbnN0IFFTdHJpbmcmICk7CiAgICB2b2lkIHNldEZp bHRlcnMoIGNvbnN0IGNoYXIgKiogKTsKICAgIHZvaWQgc2V0RmlsdGVycyggY29uc3QgUVN0cmlu Z0xpc3QmICk7Cgpwcm90ZWN0ZWQ6CiAgICB2b2lkIHJlc2l6ZUV2ZW50KCBRUmVzaXplRXZlbnQg KiApOwogICAgdm9pZCBrZXlQcmVzc0V2ZW50KCBRS2V5RXZlbnQgKiApOwoKICAgIHZvaWQgYWRk V2lkZ2V0cyggUUxhYmVsICosIFFXaWRnZXQgKiwgUVB1c2hCdXR0b24gKiApOwogICAgdm9pZCBh ZGRUb29sQnV0dG9uKCBRQnV0dG9uICpiLCBib29sIHNlcGFyYXRvciA9IEZBTFNFICk7CiAgICB2 b2lkIGFkZExlZnRXaWRnZXQoIFFXaWRnZXQgKncgKTsKICAgIHZvaWQgYWRkUmlnaHRXaWRnZXQo IFFXaWRnZXQgKncgKTsKCnByb3RlY3RlZCA6CiAgICB2b2lkIGZpbGVIaWdobGlnaHRlZCggY29u c3QgUVN0cmluZyYgKTsKICAgIHZvaWQgZmlsZVNlbGVjdGVkKCBjb25zdCBRU3RyaW5nJiApOwog ICAgdm9pZCBmaWxlc1NlbGVjdGVkKCBjb25zdCBRU3RyaW5nTGlzdCYgKTsKICAgIHZvaWQgZGly RW50ZXJlZCggY29uc3QgUVN0cmluZyYgKTsKICAgIHZvaWQgZmlsdGVyU2VsZWN0ZWQoIGNvbnN0 IFFTdHJpbmcmICk7Cgpwcml2YXRlICA6CiAgICB2b2lkIGRldGFpbFZpZXdTZWxlY3Rpb25DaGFu Z2VkKCk7CiAgICB2b2lkIGxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKCk7CiAgICB2b2lkIGNoYW5n ZU1vZGUoIGludCApOwogICAgdm9pZCBmaWxlTmFtZUVkaXRSZXR1cm5QcmVzc2VkKCk7CiAgICB2 b2lkIHN0b3BDb3B5KCk7CiAgICB2b2lkIHJlbW92ZVByb2dyZXNzRGlhKCk7CgogICAgdm9pZCBm aWxlU2VsZWN0ZWQoIGludCApOwogICAgdm9pZCBmaWxlSGlnaGxpZ2h0ZWQoIGludCApOwogICAg dm9pZCBkaXJTZWxlY3RlZCggaW50ICk7CiAgICB2b2lkIHBhdGhTZWxlY3RlZCggaW50ICk7Cgog ICAgdm9pZCB1cGRhdGVGaWxlTmFtZUVkaXQoIFFMaXN0Vmlld0l0ZW0gKik7CiAgICB2b2lkIHNl bGVjdERpcmVjdG9yeU9yRmlsZSggUUxpc3RWaWV3SXRlbSAqICk7CiAgICB2b2lkIHBvcHVwQ29u dGV4dE1lbnUoIFFMaXN0Vmlld0l0ZW0gKiwgY29uc3QgUVBvaW50ICYsIGludCApOwogICAgdm9p ZCBwb3B1cENvbnRleHRNZW51KCBRTGlzdEJveEl0ZW0gKiwgY29uc3QgUVBvaW50ICYgKTsKICAg IHZvaWQgdXBkYXRlRmlsZU5hbWVFZGl0KCBRTGlzdEJveEl0ZW0gKik7CiAgICB2b2lkIHNlbGVj dERpcmVjdG9yeU9yRmlsZSggUUxpc3RCb3hJdGVtICogKTsKICAgIHZvaWQgZmlsZU5hbWVFZGl0 RG9uZSgpOwoKICAgIHZvaWQgb2tDbGlja2VkKCk7CiAgICB2b2lkIGZpbHRlckNsaWNrZWQoKTsg IAogICAgdm9pZCBjYW5jZWxDbGlja2VkKCk7CgogICAgdm9pZCBjZFVwQ2xpY2tlZCgpOwogICAg dm9pZCBuZXdGb2xkZXJDbGlja2VkKCk7CgogICAgdm9pZCBmaXh1cE5hbWVFZGl0KCk7CgogICAg dm9pZCBkb01pbWVUeXBlTG9va3VwKCk7CgogICAgdm9pZCB1cGRhdGVHZW9tZXRyaWVzKCk7CiAg ICB2b2lkIG1vZGVCdXR0b25zRGVzdHJveWVkKCk7CiAgICB2b2lkIHVybFN0YXJ0KCBRTmV0d29y a09wZXJhdGlvbiAqb3AgKTsKICAgIHZvaWQgdXJsRmluaXNoZWQoIFFOZXR3b3JrT3BlcmF0aW9u ICpvcCApOwogICAgdm9pZCBkYXRhVHJhbnNmZXJQcm9ncmVzcyggaW50IGJ5dGVzRG9uZSwgaW50 IGJ5dGVzVG90YWwsIFFOZXR3b3JrT3BlcmF0aW9uICogKTsKICAgIHZvaWQgaW5zZXJ0RW50cnko IGNvbnN0IFFWYWx1ZUxpc3Q8UVVybEluZm8+ICZmaSwgUU5ldHdvcmtPcGVyYXRpb24gKm9wICk7 CiAgICB2b2lkIHJlbW92ZUVudHJ5KCBRTmV0d29ya09wZXJhdGlvbiAqICk7CiAgICB2b2lkIGNy ZWF0ZWREaXJlY3RvcnkoIGNvbnN0IFFVcmxJbmZvICZpbmZvLCBRTmV0d29ya09wZXJhdGlvbiAq ICk7CiAgICB2b2lkIGl0ZW1DaGFuZ2VkKCBRTmV0d29ya09wZXJhdGlvbiAqICk7CiAgICB2b2lk IGdvQmFjaygpOwoKcHJpdmF0ZToKICAgIGVudW0gUG9wdXBBY3Rpb24gewoJUEFfT3BlbiA9IDAs CglQQV9EZWxldGUsCglQQV9SZW5hbWUsCglQQV9Tb3J0TmFtZSwKCVBBX1NvcnRTaXplLAoJUEFf U29ydFR5cGUsCglQQV9Tb3J0RGF0ZSwKCVBBX1NvcnRVbnNvcnRlZCwKCVBBX0NhbmNlbCwKCVBB X1JlbG9hZCwKCVBBX0hpZGRlbgogICAgfTsKCiAgICB2b2lkIGluaXQoKTsKICAgIGJvb2wgdHJ5 U2V0U2VsZWN0aW9uKCBib29sIGlzRGlyLCBjb25zdCBRVXJsT3BlcmF0b3IgJiwgYm9vbCApOwog ICAgdm9pZCBkZWxldGVGaWxlKCBjb25zdCBRU3RyaW5nICZmaWxlbmFtZSApOwogICAgdm9pZCBw b3B1cENvbnRleHRNZW51KCBjb25zdCBRU3RyaW5nICZmaWxlbmFtZSwgYm9vbCB3aXRoU29ydCwK CQkJICAgUG9wdXBBY3Rpb24gJmFjdGlvbiwgY29uc3QgUVBvaW50ICZwICk7CgogICAgUURpciBy ZXNlcnZlZDsgIAogICAgUVN0cmluZyBmaWxlTmFtZTsKCiAgICBmcmllbmQgY2xhc3MgUUZpbGVE aWFsb2dRRmlsZUxpc3RWaWV3OwogICAgZnJpZW5kIGNsYXNzIFFGaWxlTGlzdEJveDsKCiAgICBR RmlsZURpYWxvZ1ByaXZhdGUgKmQ7CiAgICBRRmlsZURpYWxvZ1FGaWxlTGlzdFZpZXcgICpmaWxl czsKCiAgICBRTGluZUVkaXQgICpuYW1lRWRpdDsgIAogICAgUVB1c2hCdXR0b24gKm9rQjsKICAg IFFQdXNoQnV0dG9uICpjYW5jZWxCOwoKIyAzMTggIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZmls ZWRpYWxvZy5oIgoKIyAzMjcgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xZmlsZWRpYWxvZy5oIgoK Cgpwcml2YXRlOgkgCgogICAgUUZpbGVEaWFsb2coIGNvbnN0IFFGaWxlRGlhbG9nICYgKTsKICAg IFFGaWxlRGlhbG9nICZvcGVyYXRvcj0oIGNvbnN0IFFGaWxlRGlhbG9nICYgKTsKCn07CgoKCgoj IDUgImNoYXJ0Zm9ybV9maWxlcy5jcHAiIDIKCiMgMSAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3Fw YWludGVyLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgojIDEgIi91c3IvbG9jYWwvcXQvaW5jbHVkZS9xd21hdHJpeC5oIiAxCiAKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgICBRV01hdHJpeAkJ CQkJIAp7CnB1YmxpYzoKICAgIFFXTWF0cml4KCk7CiAgICBRV01hdHJpeCggZG91YmxlIG0xMSwg ZG91YmxlIG0xMiwgZG91YmxlIG0yMSwgZG91YmxlIG0yMiwKCSAgICAgIGRvdWJsZSBkeCwgZG91 YmxlIGR5ICk7CgogICAgdm9pZAlzZXRNYXRyaXgoIGRvdWJsZSBtMTEsIGRvdWJsZSBtMTIsIGRv dWJsZSBtMjEsIGRvdWJsZSBtMjIsCgkJCSAgIGRvdWJsZSBkeCwgIGRvdWJsZSBkeSApOwoKICAg IGRvdWJsZQltMTEoKSBjb25zdCB7IHJldHVybiBfbTExOyB9CiAgICBkb3VibGUJbTEyKCkgY29u c3QgeyByZXR1cm4gX20xMjsgfQogICAgZG91YmxlCW0yMSgpIGNvbnN0IHsgcmV0dXJuIF9tMjE7 IH0KICAgIGRvdWJsZQltMjIoKSBjb25zdCB7IHJldHVybiBfbTIyOyB9CiAgICBkb3VibGUJZHgo KSAgY29uc3QgeyByZXR1cm4gX2R4OyB9CiAgICBkb3VibGUJZHkoKSAgY29uc3QgeyByZXR1cm4g X2R5OyB9CgogICAgdm9pZAltYXAoIGludCB4LCBpbnQgeSwgaW50ICp0eCwgaW50ICp0eSApCSAg ICAgIGNvbnN0OwogICAgdm9pZAltYXAoIGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlICp0eCwg ZG91YmxlICp0eSApIGNvbnN0OwogICAgUVJlY3QJbWFwUmVjdCggY29uc3QgUVJlY3QgJiApCWNv bnN0OwoKICAgIFFQb2ludAltYXAoIGNvbnN0IFFQb2ludCAmcCApCWNvbnN0IHsgcmV0dXJuIG9w ZXJhdG9yICooIHAgKTsgfQogICAgUVJlY3QJbWFwKCBjb25zdCBRUmVjdCAmciApCWNvbnN0IHsg cmV0dXJuIG1hcFJlY3QgKCByICk7IH0KICAgIFFQb2ludEFycmF5IG1hcCggY29uc3QgUVBvaW50 QXJyYXkgJmEgKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciAqICggYSApOyB9CgogICAgdm9pZAly ZXNldCgpOwogICAgYm9vbAlpc0lkZW50aXR5KCkgY29uc3Q7CgogICAgUVdNYXRyaXggICAmdHJh bnNsYXRlKCBkb3VibGUgZHgsIGRvdWJsZSBkeSApOwogICAgUVdNYXRyaXggICAmc2NhbGUoIGRv dWJsZSBzeCwgZG91YmxlIHN5ICk7CiAgICBRV01hdHJpeCAgICZzaGVhciggZG91YmxlIHNoLCBk b3VibGUgc3YgKTsKICAgIFFXTWF0cml4ICAgJnJvdGF0ZSggZG91YmxlIGEgKTsKCiAgICBib29s IGlzSW52ZXJ0aWJsZSgpIGNvbnN0IHsgcmV0dXJuIChfbTExKl9tMjIgLSBfbTEyKl9tMjEpICE9 IDA7IH0KICAgIFFXTWF0cml4CWludmVydCggYm9vbCAqID0gMCApIGNvbnN0OwoKICAgIGJvb2wJ b3BlcmF0b3I9PSggY29uc3QgUVdNYXRyaXggJiApIGNvbnN0OwogICAgYm9vbAlvcGVyYXRvciE9 KCBjb25zdCBRV01hdHJpeCAmICkgY29uc3Q7CiAgICBRV01hdHJpeCAgICZvcGVyYXRvcio9KCBj b25zdCBRV01hdHJpeCAmICk7CgogICAgIAogICAgUVBvaW50IG9wZXJhdG9yICogKGNvbnN0IFFQ b2ludCAmICkgY29uc3Q7CiAgICBRUmVnaW9uIG9wZXJhdG9yICogKGNvbnN0IFFSZWN0ICYgKSBj b25zdDsKICAgIFFSZWdpb24gb3BlcmF0b3IgKiAoY29uc3QgUVJlZ2lvbiAmICkgY29uc3Q7CiAg ICBRUG9pbnRBcnJheSBvcGVyYXRvciAqICAoIGNvbnN0IFFQb2ludEFycmF5ICZhICkgY29uc3Q7 CiAgICAKcHJpdmF0ZToKICAgIFFXTWF0cml4ICAgJmJtdWwoIGNvbnN0IFFXTWF0cml4ICYgKTsK ICAgIGRvdWJsZQlfbTExLCBfbTEyOwogICAgZG91YmxlCV9tMjEsIF9tMjI7CiAgICBkb3VibGUJ X2R4LCAgX2R5Owp9OwoKCiAgUVdNYXRyaXggb3BlcmF0b3IqKCBjb25zdCBRV01hdHJpeCAmLCBj b25zdCBRV01hdHJpeCAmICk7CgoKIAoKCgogIFFEYXRhU3RyZWFtICZvcGVyYXRvcjw8KCBRRGF0 YVN0cmVhbSAmLCBjb25zdCBRV01hdHJpeCAmICk7CiAgUURhdGFTdHJlYW0gJm9wZXJhdG9yPj4o IFFEYXRhU3RyZWFtICYsIFFXTWF0cml4ICYgKTsKCgoKCgojIDUwICIvdXNyL2xvY2FsL3F0L2lu Y2x1ZGUvcXBhaW50ZXIuaCIgMgoKCgpjbGFzcyBRR2Z4OwpjbGFzcyBRVGV4dENvZGVjOwpjbGFz cyBRVGV4dFBhcmFnOwpjbGFzcyBRUGFpbnREZXZpY2U7CgoKCmNsYXNzIFFQYWludGVyUHJpdmF0 ZTsKCmNsYXNzICAgUVBhaW50ZXIgOiBwdWJsaWMgUXQKewpwdWJsaWM6CiAgICBlbnVtIENvb3Jk aW5hdGVNb2RlIHsgQ29vcmREZXZpY2UsIENvb3JkUGFpbnRlciB9OwoKICAgIFFQYWludGVyKCk7 CiAgICBRUGFpbnRlciggY29uc3QgUVBhaW50RGV2aWNlICosIGJvb2wgdW5jbGlwcGVkID0gRkFM U0UgKTsKICAgIFFQYWludGVyKCBjb25zdCBRUGFpbnREZXZpY2UgKiwgY29uc3QgUVdpZGdldCAq LCBib29sIHVuY2xpcHBlZCA9IEZBTFNFICk7CiAgIH5RUGFpbnRlcigpOwoKICAgIGJvb2wJYmVn aW4oIGNvbnN0IFFQYWludERldmljZSAqLCBib29sIHVuY2xpcHBlZCA9IEZBTFNFICk7CiAgICBi b29sCWJlZ2luKCBjb25zdCBRUGFpbnREZXZpY2UgKiwgY29uc3QgUVdpZGdldCAqLCBib29sIHVu Y2xpcHBlZCA9IEZBTFNFICk7CiAgICBib29sCWVuZCgpOwogICAgUVBhaW50RGV2aWNlICpkZXZp Y2UoKSBjb25zdDsKCgoKCgogICAgc3RhdGljIHZvaWQgcmVkaXJlY3QoIFFQYWludERldmljZSAq cGRldiwgUVBhaW50RGV2aWNlICpyZXBsYWNlbWVudCApOwoKICAgIGJvb2wJaXNBY3RpdmUoKSBj b25zdDsKCiAgICB2b2lkCWZsdXNoKCBjb25zdCBRUmVnaW9uICZyZWdpb24sIENvb3JkaW5hdGVN b2RlIGNtID0gQ29vcmREZXZpY2UgKTsKICAgIHZvaWQJZmx1c2goKTsKICAgIHZvaWQJc2F2ZSgp OwogICAgdm9pZAlyZXN0b3JlKCk7CgogICAKCiAgICBRRm9udE1ldHJpY3MgZm9udE1ldHJpY3Mo KQljb25zdDsKICAgIFFGb250SW5mbwkgZm9udEluZm8oKQljb25zdDsKCiAgICBjb25zdCBRRm9u dCAmZm9udCgpCQljb25zdDsKICAgIHZvaWQJc2V0Rm9udCggY29uc3QgUUZvbnQgJiApOwogICAg Y29uc3QgUVBlbiAmcGVuKCkJCWNvbnN0OwogICAgdm9pZAlzZXRQZW4oIGNvbnN0IFFQZW4gJiAp OwogICAgdm9pZAlzZXRQZW4oIFBlblN0eWxlICk7CiAgICB2b2lkCXNldFBlbiggY29uc3QgUUNv bG9yICYgKTsKICAgIGNvbnN0IFFCcnVzaCAmYnJ1c2goKQljb25zdDsKICAgIHZvaWQJc2V0QnJ1 c2goIGNvbnN0IFFCcnVzaCAmICk7CiAgICB2b2lkCXNldEJydXNoKCBCcnVzaFN0eWxlICk7CiAg ICB2b2lkCXNldEJydXNoKCBjb25zdCBRQ29sb3IgJiApOwogICAgUVBvaW50CXBvcygpIGNvbnN0 OwoKICAgCgogICAgY29uc3QgUUNvbG9yICZiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKICAgIHZv aWQJc2V0QmFja2dyb3VuZENvbG9yKCBjb25zdCBRQ29sb3IgJiApOwogICAgQkdNb2RlCWJhY2tn cm91bmRNb2RlKCkgY29uc3Q7CiAgICB2b2lkCXNldEJhY2tncm91bmRNb2RlKCBCR01vZGUgKTsK ICAgIFJhc3Rlck9wCXJhc3Rlck9wKCkJY29uc3Q7CiAgICB2b2lkCXNldFJhc3Rlck9wKCBSYXN0 ZXJPcCApOwogICAgY29uc3QgUVBvaW50ICZicnVzaE9yaWdpbigpIGNvbnN0OwogICAgdm9pZAlz ZXRCcnVzaE9yaWdpbiggaW50IHgsIGludCB5ICk7CiAgICB2b2lkCXNldEJydXNoT3JpZ2luKCBj b25zdCBRUG9pbnQgJiApOwoKICAgCgogCiAKCiAgICBib29sCWhhc1ZpZXdYRm9ybSgpIGNvbnN0 OwogICAgYm9vbAloYXNXb3JsZFhGb3JtKCkgY29uc3Q7CgoKICAgIHZvaWQJc2V0Vmlld1hGb3Jt KCBib29sICk7CQkgCiAgICBRUmVjdAl3aW5kb3coKSAgICAgICBjb25zdDsJCSAKICAgIHZvaWQJ c2V0V2luZG93KCBjb25zdCBRUmVjdCAmICk7CSAKICAgIHZvaWQJc2V0V2luZG93KCBpbnQgeCwg aW50IHksIGludCB3LCBpbnQgaCApOwogICAgUVJlY3QJdmlld3BvcnQoKSAgIGNvbnN0OwkJIAog ICAgdm9pZAlzZXRWaWV3cG9ydCggY29uc3QgUVJlY3QgJiApOwkgCiAgICB2b2lkCXNldFZpZXdw b3J0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCApOwoKICAgIHZvaWQJc2V0V29ybGRYRm9y bSggYm9vbCApOwkJIAogICAgY29uc3QgUVdNYXRyaXggJndvcmxkTWF0cml4KCkgY29uc3Q7CSAK ICAgIHZvaWQJc2V0V29ybGRNYXRyaXgoIGNvbnN0IFFXTWF0cml4ICYsIGJvb2wgY29tYmluZT1G QUxTRSApOwoKICAgIHZvaWQJc2F2ZVdvcmxkTWF0cml4KCk7CiAgICB2b2lkCXJlc3RvcmVXb3Js ZE1hdHJpeCgpOwoKICAgIHZvaWQJc2NhbGUoIGRvdWJsZSBzeCwgZG91YmxlIHN5ICk7CiAgICB2 b2lkCXNoZWFyKCBkb3VibGUgc2gsIGRvdWJsZSBzdiApOwogICAgdm9pZAlyb3RhdGUoIGRvdWJs ZSBhICk7CgogICAgdm9pZAl0cmFuc2xhdGUoIGRvdWJsZSBkeCwgZG91YmxlIGR5ICk7CiAgICB2 b2lkCXJlc2V0WEZvcm0oKTsKICAgIGRvdWJsZQl0cmFuc2xhdGlvblgoKSBjb25zdDsKICAgIGRv dWJsZQl0cmFuc2xhdGlvblkoKSBjb25zdDsKCiAgICBRUG9pbnQJeEZvcm0oIGNvbnN0IFFQb2lu dCAmICkgY29uc3Q7CSAKICAgIFFSZWN0CXhGb3JtKCBjb25zdCBRUmVjdCAmICkJY29uc3Q7CiAg ICBRUG9pbnRBcnJheSB4Rm9ybSggY29uc3QgUVBvaW50QXJyYXkgJiApIGNvbnN0OwogICAgUVBv aW50QXJyYXkgeEZvcm0oIGNvbnN0IFFQb2ludEFycmF5ICYsIGludCBpbmRleCwgaW50IG5wb2lu dHMgKSBjb25zdDsKICAgIFFQb2ludAl4Rm9ybURldiggY29uc3QgUVBvaW50ICYgKSBjb25zdDsg IAogICAgUVJlY3QJeEZvcm1EZXYoIGNvbnN0IFFSZWN0ICYgKSAgY29uc3Q7CiAgICBRUG9pbnRB cnJheSB4Rm9ybURldiggY29uc3QgUVBvaW50QXJyYXkgJiApIGNvbnN0OwogICAgUVBvaW50QXJy YXkgeEZvcm1EZXYoIGNvbnN0IFFQb2ludEFycmF5ICYsIGludCBpbmRleCwgaW50IG5wb2ludHMg KSBjb25zdDsKCiAgIAoKICAgIHZvaWQJc2V0Q2xpcHBpbmcoIGJvb2wgKTsJCSAKICAgIGJvb2wJ aGFzQ2xpcHBpbmcoKSBjb25zdDsKICAgIFFSZWdpb24gY2xpcFJlZ2lvbiggQ29vcmRpbmF0ZU1v ZGUgPSBDb29yZERldmljZSApIGNvbnN0OwogICAgdm9pZAlzZXRDbGlwUmVjdCggY29uc3QgUVJl Y3QgJiwgQ29vcmRpbmF0ZU1vZGUgPSBDb29yZERldmljZSApOwkgCiAgICB2b2lkCXNldENsaXBS ZWN0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29vcmRpbmF0ZU1vZGUgPSBDb29yZERl dmljZSApOwogICAgdm9pZAlzZXRDbGlwUmVnaW9uKCBjb25zdCBRUmVnaW9uICYsIENvb3JkaW5h dGVNb2RlID0gQ29vcmREZXZpY2UgKTsgCgogICAKCiAgICB2b2lkCWRyYXdQb2ludCggaW50IHgs IGludCB5ICk7CiAgICB2b2lkCWRyYXdQb2ludCggY29uc3QgUVBvaW50ICYgKTsKICAgIHZvaWQJ ZHJhd1BvaW50cyggY29uc3QgUVBvaW50QXJyYXkmIGEsCgkJCSAgICBpbnQgaW5kZXg9MCwgaW50 IG5wb2ludHM9LTEgKTsKICAgIHZvaWQJbW92ZVRvKCBpbnQgeCwgaW50IHkgKTsKICAgIHZvaWQJ bW92ZVRvKCBjb25zdCBRUG9pbnQgJiApOwogICAgdm9pZAlsaW5lVG8oIGludCB4LCBpbnQgeSAp OwogICAgdm9pZAlsaW5lVG8oIGNvbnN0IFFQb2ludCAmICk7CiAgICB2b2lkCWRyYXdMaW5lKCBp bnQgeDEsIGludCB5MSwgaW50IHgyLCBpbnQgeTIgKTsKICAgIHZvaWQJZHJhd0xpbmUoIGNvbnN0 IFFQb2ludCAmLCBjb25zdCBRUG9pbnQgJiApOwogICAgdm9pZAlkcmF3UmVjdCggaW50IHgsIGlu dCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJZHJhd1JlY3QoIGNvbnN0IFFSZWN0ICYgKTsK ICAgIHZvaWQJZHJhd1dpbkZvY3VzUmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsK ICAgIHZvaWQJZHJhd1dpbkZvY3VzUmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCgkJ CQkgIGNvbnN0IFFDb2xvciAmYmdDb2xvciApOwogICAgdm9pZAlkcmF3V2luRm9jdXNSZWN0KCBj b25zdCBRUmVjdCAmICk7CiAgICB2b2lkCWRyYXdXaW5Gb2N1c1JlY3QoIGNvbnN0IFFSZWN0ICYs CgkJCQkgIGNvbnN0IFFDb2xvciAmYmdDb2xvciApOwogICAgdm9pZAlkcmF3Um91bmRSZWN0KCBp bnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50ID0gMjUsIGludCA9IDI1ICk7CiAgICB2b2lk CWRyYXdSb3VuZFJlY3QoIGNvbnN0IFFSZWN0ICYsIGludCA9IDI1LCBpbnQgPSAyNSApOwogICAg dm9pZAlkcmF3RWxsaXBzZSggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZvaWQJ ZHJhd0VsbGlwc2UoIGNvbnN0IFFSZWN0ICYgKTsKICAgIHZvaWQJZHJhd0FyYyggaW50IHgsIGlu dCB5LCBpbnQgdywgaW50IGgsIGludCBhLCBpbnQgYWxlbiApOwogICAgdm9pZAlkcmF3QXJjKCBj b25zdCBRUmVjdCAmLCBpbnQgYSwgaW50IGFsZW4gKTsKICAgIHZvaWQJZHJhd1BpZSggaW50IHgs IGludCB5LCBpbnQgdywgaW50IGgsIGludCBhLCBpbnQgYWxlbiApOwogICAgdm9pZAlkcmF3UGll KCBjb25zdCBRUmVjdCAmLCBpbnQgYSwgaW50IGFsZW4gKTsKICAgIHZvaWQJZHJhd0Nob3JkKCBp bnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGEsIGludCBhbGVuICk7CiAgICB2b2lkCWRy YXdDaG9yZCggY29uc3QgUVJlY3QgJiwgaW50IGEsIGludCBhbGVuICk7CiAgICB2b2lkCWRyYXdM aW5lU2VnbWVudHMoIGNvbnN0IFFQb2ludEFycmF5ICYsCgkJCQkgIGludCBpbmRleD0wLCBpbnQg bmxpbmVzPS0xICk7CiAgICB2b2lkCWRyYXdQb2x5bGluZSggY29uc3QgUVBvaW50QXJyYXkgJiwK CQkJICAgICAgaW50IGluZGV4PTAsIGludCBucG9pbnRzPS0xICk7CiAgICB2b2lkCWRyYXdQb2x5 Z29uKCBjb25zdCBRUG9pbnRBcnJheSAmLCBib29sIHdpbmRpbmc9RkFMU0UsCgkJCSAgICAgaW50 IGluZGV4PTAsIGludCBucG9pbnRzPS0xICk7CiAgICB2b2lkCWRyYXdDb252ZXhQb2x5Z29uKCBj b25zdCBRUG9pbnRBcnJheSAmLAoJCQkgICAgIGludCBpbmRleD0wLCBpbnQgbnBvaW50cz0tMSAp OwoKICAgIHZvaWQJZHJhd0N1YmljQmV6aWVyKCBjb25zdCBRUG9pbnRBcnJheSAmLCBpbnQgaW5k ZXg9MCApOwoKICAgIHZvaWQJZHJhd1BpeG1hcCggaW50IHgsIGludCB5LCBjb25zdCBRUGl4bWFw ICYsCgkJCSAgICBpbnQgc3g9MCwgaW50IHN5PTAsIGludCBzdz0tMSwgaW50IHNoPS0xICk7CiAg ICB2b2lkCWRyYXdQaXhtYXAoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBRUGl4bWFwICYsCgkJCSAg ICBjb25zdCBRUmVjdCAmc3IgKTsKICAgIHZvaWQJZHJhd1BpeG1hcCggY29uc3QgUVBvaW50ICYs IGNvbnN0IFFQaXhtYXAgJiApOwogICAgdm9pZAlkcmF3UGl4bWFwKCBjb25zdCBRUmVjdCAmLCBj b25zdCBRUGl4bWFwICYgKTsKICAgIHZvaWQJZHJhd0ltYWdlKCBpbnQgeCwgaW50IHksIGNvbnN0 IFFJbWFnZSAmLAoJCQkgICBpbnQgc3ggPSAwLCBpbnQgc3kgPSAwLCBpbnQgc3cgPSAtMSwgaW50 IHNoID0gLTEsCgkJCSAgIGludCBjb252ZXJzaW9uRmxhZ3MgPSAwICk7CiAgICB2b2lkCWRyYXdJ bWFnZSggY29uc3QgUVBvaW50ICYsIGNvbnN0IFFJbWFnZSAmLAoJCQkgICBjb25zdCBRUmVjdCAm c3IsIGludCBjb252ZXJzaW9uRmxhZ3MgPSAwICk7CiAgICB2b2lkCWRyYXdJbWFnZSggY29uc3Qg UVBvaW50ICYsIGNvbnN0IFFJbWFnZSAmLAoJCQkgICBpbnQgY29udmVyc2lvbl9mbGFncyA9IDAg KTsKICAgIHZvaWQJZHJhd0ltYWdlKCBjb25zdCBRUmVjdCAmLCBjb25zdCBRSW1hZ2UgJiApOwog ICAgdm9pZAlkcmF3VGlsZWRQaXhtYXAoIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBjb25z dCBRUGl4bWFwICYsCgkJCQkgaW50IHN4PTAsIGludCBzeT0wICk7CiAgICB2b2lkCWRyYXdUaWxl ZFBpeG1hcCggY29uc3QgUVJlY3QgJiwgY29uc3QgUVBpeG1hcCAmLAoJCQkJIGNvbnN0IFFQb2lu dCAmICk7CiAgICB2b2lkCWRyYXdUaWxlZFBpeG1hcCggY29uc3QgUVJlY3QgJiwgY29uc3QgUVBp eG1hcCAmICk7CgogICAgdm9pZAlkcmF3UGljdHVyZSggY29uc3QgUVBpY3R1cmUgJiApOwogICAg dm9pZAlkcmF3UGljdHVyZSggaW50IHgsIGludCB5LCBjb25zdCBRUGljdHVyZSAmICk7CiAgICB2 b2lkCWRyYXdQaWN0dXJlKCBjb25zdCBRUG9pbnQgJiwgY29uc3QgUVBpY3R1cmUgJiApOwoKCiAg ICB2b2lkCWZpbGxSZWN0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgY29uc3QgUUJydXNo ICYgKTsKICAgIHZvaWQJZmlsbFJlY3QoIGNvbnN0IFFSZWN0ICYsIGNvbnN0IFFCcnVzaCAmICk7 CiAgICB2b2lkCWVyYXNlUmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGggKTsKICAgIHZv aWQJZXJhc2VSZWN0KCBjb25zdCBRUmVjdCAmICk7CgogICAKCiAgICBlbnVtIFRleHREaXJlY3Rp b24gewoJQXV0bywKCVJUTCwKCUxUUgogICAgfTsKCiAgICB2b2lkCWRyYXdUZXh0KCBpbnQgeCwg aW50IHksIGNvbnN0IFFTdHJpbmcgJiwgaW50IGxlbiA9IC0xLCBUZXh0RGlyZWN0aW9uIGRpciA9 IEF1dG8gKTsKICAgIHZvaWQJZHJhd1RleHQoIGNvbnN0IFFQb2ludCAmLCBjb25zdCBRU3RyaW5n ICYsIGludCBsZW4gPSAtMSwgVGV4dERpcmVjdGlvbiBkaXIgPSBBdXRvICk7CgogICAgdm9pZCAg ICAgZHJhd1RleHQoIGludCB4LCBpbnQgeSwgY29uc3QgUVN0cmluZyAmLCBpbnQgcG9zLCBpbnQg bGVuLCBUZXh0RGlyZWN0aW9uIGRpciA9IEF1dG8gKTsKICAgIHZvaWQgICAgIGRyYXdUZXh0KCBj b25zdCBRUG9pbnQgJnAsIGNvbnN0IFFTdHJpbmcgJiwgaW50IHBvcywgaW50IGxlbiwgVGV4dERp cmVjdGlvbiBkaXIgPSBBdXRvICk7CgogICAgdm9pZAlkcmF3VGV4dCggaW50IHgsIGludCB5LCBp bnQgdywgaW50IGgsIGludCBmbGFncywKCQkJICBjb25zdCBRU3RyaW5nJiwgaW50IGxlbiA9IC0x LCBRUmVjdCAqYnI9MCwKCQkJICBRVGV4dFBhcmFnICoqaW50ZXJuPTAgKTsKICAgIHZvaWQJZHJh d1RleHQoIGNvbnN0IFFSZWN0ICYsIGludCBmbGFncywKCQkJICBjb25zdCBRU3RyaW5nJiwgaW50 IGxlbiA9IC0xLCBRUmVjdCAqYnI9MCwKCQkJICBRVGV4dFBhcmFnICoqaW50ZXJuPTAgKTsKCiAg ICAgCgogICAKCiAgICBRUmVjdAlib3VuZGluZ1JlY3QoIGludCB4LCBpbnQgeSwgaW50IHcsIGlu dCBoLCBpbnQgZmxhZ3MsCgkJCSAgICAgIGNvbnN0IFFTdHJpbmcmLCBpbnQgbGVuID0gLTEsIFFU ZXh0UGFyYWcgKippbnRlcm49MCApOwogICAgUVJlY3QJYm91bmRpbmdSZWN0KCBjb25zdCBRUmVj dCAmLCBpbnQgZmxhZ3MsCgkJCSAgICAgIGNvbnN0IFFTdHJpbmcmLCBpbnQgbGVuID0gLTEsIFFU ZXh0UGFyYWcgKippbnRlcm49MCApOwoKICAgIGludAkJdGFiU3RvcHMoKSBjb25zdDsKICAgIHZv aWQJc2V0VGFiU3RvcHMoIGludCApOwogICAgaW50CSAgICAgICAqdGFiQXJyYXkoKSBjb25zdDsK ICAgIHZvaWQJc2V0VGFiQXJyYXkoIGludCAqICk7CgogICAgIAoKCgoKICAgIEhBTkRMRQloYW5k bGUoKSBjb25zdDsKCgoKICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKTsKICAgIHN0YXRpYyB2 b2lkIGNsZWFudXAoKTsKCnByaXZhdGU6CiAgICB2b2lkCWluaXQoKTsKICAgIHZvaWQgICAgICAg IGRlc3Ryb3koKTsKICAgIHZvaWQJdXBkYXRlRm9udCgpOwogICAgdm9pZAl1cGRhdGVQZW4oKTsK ICAgIHZvaWQJdXBkYXRlQnJ1c2goKTsKCiAgICB2b2lkCXVwZGF0ZVhGb3JtKCk7CiAgICB2b2lk CXVwZGF0ZUludlhGb3JtKCk7CgogICAgdm9pZAltYXAoIGludCwgaW50LCBpbnQgKnJ4LCBpbnQg KnJ5ICkgY29uc3Q7CiAgICB2b2lkCW1hcCggaW50LCBpbnQsIGludCwgaW50LCBpbnQgKiwgaW50 ICosIGludCAqLCBpbnQgKiApIGNvbnN0OwogICAgdm9pZAltYXBJbnYoIGludCwgaW50LCBpbnQg KiwgaW50ICogKSBjb25zdDsKICAgIHZvaWQJbWFwSW52KCBpbnQsIGludCwgaW50LCBpbnQsIGlu dCAqLCBpbnQgKiwgaW50ICosIGludCAqICkgY29uc3Q7CiAgICB2b2lkCWRyYXdQb2x5SW50ZXJu YWwoIGNvbnN0IFFQb2ludEFycmF5ICYsIGJvb2wgY2xvc2U9VFJVRSApOwogICAgdm9pZAlkcmF3 V2luRm9jdXNSZWN0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgYm9vbCB4b3JQYWludCwK CQkJCSAgY29uc3QgUUNvbG9yICZwZW5Db2xvciApOwoKICAgIGVudW0geyBJc0FjdGl2ZT0weDAx LCBFeHREZXY9MHgwMiwgSXNTdGFydGluZ1VwPTB4MDQsIE5vQ2FjaGU9MHgwOCwKCSAgIFZ4Rj0w eDEwLCBXeEY9MHgyMCwgQ2xpcE9uPTB4NDAsIFNhZmVQb2x5Z29uPTB4ODAsIE1vbm9EZXY9MHgx MDAsCgkgICBEaXJ0eUZvbnQ9MHgyMDAsIERpcnR5UGVuPTB4NDAwLCBEaXJ0eUJydXNoPTB4ODAw LAoJICAgUkdCQ29sb3I9MHgxMDAwLCBGb250TWV0PTB4MjAwMCwgRm9udEluZj0weDQwMDAsIEN0 b3JCZWdpbj0weDgwMDAsCiAgICAgICAgICAgVXNlUHJpdmF0ZUN4ID0gMHgxMDAwMCwgVm9sYXRp bGVEQyA9IDB4MjAwMDAsIFF0MkNvbXBhdCA9IDB4NDAwMDAgfTsKICAgIHVpbnQJZmxhZ3M7CiAg ICBib29sCXRlc3RmKCB1aW50IGIgKSBjb25zdCB7IHJldHVybiAoZmxhZ3MmYikhPTA7IH0KICAg IHZvaWQJc2V0ZiggdWludCBiICkJeyBmbGFncyB8PSBiOyB9CiAgICB2b2lkCXNldGYoIHVpbnQg YiwgYm9vbCB2ICk7CiAgICB2b2lkCWNsZWFyZiggdWludCBiICkJeyBmbGFncyAmPSAodWludCko fmIpOyB9CiAgICB2b2lkCWZpeF9uZWdfcmVjdCggaW50ICp4LCBpbnQgKnksIGludCAqdywgaW50 ICpoICk7CgogICAgUVBhaW50ZXJQcml2YXRlICpkOwogICAgUVBhaW50RGV2aWNlICpwZGV2Owog ICAgUUNvbG9yCWJnX2NvbDsKICAgIHVjaGFyCWJnX21vZGU7CiAgICB1Y2hhcglyb3A7CiAgICB1 Y2hhcglwdTsKICAgIFFQb2ludAlicm87CiAgICBRRm9udAljZm9udDsKICAgIFFGb250ICpwZm9u dDsgCSAKICAgIFFQZW4JY3BlbjsKICAgIFFCcnVzaAljYnJ1c2g7CiAgICBRUmVnaW9uCWNyZ247 CiAgICBpbnQJCXRhYnN0b3BzOwogICAgaW50CSAgICAgICAqdGFiYXJyYXk7CiAgICBpbnQJCXRh YmFycmF5bGVuOwogICAgYm9vbAlibG9ja19leHQ7CSAKCiAgICAgCgogICAgUUNPT1JECXd4LCB3 eSwgd3csIHdoOwogICAgUUNPT1JECXZ4LCB2eSwgdncsIHZoOwogICAgUVdNYXRyaXgJd3htYXQ7 CgogICAgIAogICAgUVdNYXRyaXgJeG1hdDsKICAgIFFXTWF0cml4CWl4bWF0OwoKCgogICAgZG91 YmxlCW0xMSgpIGNvbnN0IHsgcmV0dXJuIHhtYXQubTExKCk7IH0KICAgIGRvdWJsZSAgICAgIG0x MigpIGNvbnN0IHsgcmV0dXJuIHhtYXQubTEyKCk7IH0KICAgIGRvdWJsZSAgICAgIG0yMSgpIGNv bnN0IHsgcmV0dXJuIHhtYXQubTIxKCk7IH0KICAgIGRvdWJsZSAgICAgIG0yMigpIGNvbnN0IHsg cmV0dXJuIHhtYXQubTIyKCk7IH0KICAgIGRvdWJsZSAgICAgIGR4KCkgY29uc3QgeyByZXR1cm4g eG1hdC5keCgpOyB9CiAgICBkb3VibGUgICAgICBkeSgpIGNvbnN0IHsgcmV0dXJuIHhtYXQuZHko KTsgfQogICAgZG91YmxlCWltMTEoKSBjb25zdCB7IHJldHVybiBpeG1hdC5tMTEoKTsgfQogICAg ZG91YmxlICAgICAgaW0xMigpIGNvbnN0IHsgcmV0dXJuIGl4bWF0Lm0xMigpOyB9CiAgICBkb3Vi bGUgICAgICBpbTIxKCkgY29uc3QgeyByZXR1cm4gaXhtYXQubTIxKCk7IH0KICAgIGRvdWJsZSAg ICAgIGltMjIoKSBjb25zdCB7IHJldHVybiBpeG1hdC5tMjIoKTsgfQogICAgZG91YmxlICAgICAg aWR4KCkgY29uc3QgeyByZXR1cm4gaXhtYXQuZHgoKTsgfQogICAgZG91YmxlICAgICAgaWR5KCkg Y29uc3QgeyByZXR1cm4gaXhtYXQuZHkoKTsgfQoKICAgIGludAkJdHhvcDsKICAgIGJvb2wJdHhp bnY7CgoKCgoKCgogICAgdm9pZCAgICAgICAqcGVuUmVmOwkJCQkgCiAgICB2b2lkICAgICAgICpi cnVzaFJlZjsJCQkgCiAgICB2b2lkICAgICAgICpwc19zdGFjazsKICAgIHZvaWQgICAgICAgKndt X3N0YWNrOwogICAgdm9pZAlraWxsUFN0YWNrKCk7Cgpwcm90ZWN0ZWQ6CgoKCgoKCiAgICBEaXNw bGF5ICAgICpkcHk7CQkJCSAKICAgIGludAkJc2NybjsJCQkJIAogICAgUXQ6OkhBTkRMRQloZDsJ CQkJIAogICAgUXQ6OkhBTkRMRSAgcmVuZGhkOwkJCQkgCiAgICBHQwkJZ2M7CQkJCSAKICAgIEdD CQlnY19icnVzaDsJCQkgCiAgICBRUG9pbnQJY3VyUHQ7CQkJCSAKICAgIHVpbnQJY2xpcF9zZXJp YWw7CQkJIAoKCgoKCiAgICBmcmllbmQgY2xhc3MgUUZvbnRNZXRyaWNzOwogICAgZnJpZW5kIGNs YXNzIFFGb250SW5mbzsKICAgIGZyaWVuZCB2b2lkIHF0X2Zvcm1hdF90ZXh0KCBjb25zdCBRRm9u dCAmLCBjb25zdCBRUmVjdCAmciwKCQkgICAgIGludCB0ZiwgY29uc3QgUVN0cmluZyYgc3RyLCBp bnQgbGVuLCBRUmVjdCAqYnJlY3QsCgkJICAgICBpbnQgdGFic3RvcHMsIGludCogdGFiYXJyYXks IGludCB0YWJhcnJheWxlbiwKCQkgICAgIFFUZXh0UGFyYWcgKippbnRlcm5hbCwgUVBhaW50ZXIq IHBhaW50ZXIgKTsKCnByaXZhdGU6CSAKCiAgICBRUGFpbnRlciggY29uc3QgUVBhaW50ZXIgJiAp OwogICAgUVBhaW50ZXIgJm9wZXJhdG9yPSggY29uc3QgUVBhaW50ZXIgJiApOwoKfTsKCgogCgoK CmlubGluZSBRUGFpbnREZXZpY2UgKlFQYWludGVyOjpkZXZpY2UoKSBjb25zdAp7CiAgICByZXR1 cm4gcGRldjsKfQoKaW5saW5lIGJvb2wgUVBhaW50ZXI6OmlzQWN0aXZlKCkgY29uc3QKewogICAg cmV0dXJuIHRlc3RmKElzQWN0aXZlKTsKfQoKaW5saW5lIGNvbnN0IFFGb250ICZRUGFpbnRlcjo6 Zm9udCgpIGNvbnN0CnsKICAgIHJldHVybiBjZm9udDsKfQoKaW5saW5lIGNvbnN0IFFQZW4gJlFQ YWludGVyOjpwZW4oKSBjb25zdAp7CiAgICByZXR1cm4gY3BlbjsKfQoKaW5saW5lIGNvbnN0IFFC cnVzaCAmUVBhaW50ZXI6OmJydXNoKCkgY29uc3QKewogICAgcmV0dXJuIGNicnVzaDsKfQoKIAoK CgoKCgppbmxpbmUgY29uc3QgUUNvbG9yICZRUGFpbnRlcjo6YmFja2dyb3VuZENvbG9yKCkgY29u c3QKewogICAgcmV0dXJuIGJnX2NvbDsKfQoKaW5saW5lIFF0OjpCR01vZGUgUVBhaW50ZXI6OmJh Y2tncm91bmRNb2RlKCkgY29uc3QKewogICAgcmV0dXJuIChCR01vZGUpYmdfbW9kZTsKfQoKaW5s aW5lIFF0OjpSYXN0ZXJPcCBRUGFpbnRlcjo6cmFzdGVyT3AoKSBjb25zdAp7CiAgICByZXR1cm4g KFJhc3Rlck9wKXJvcDsKfQoKaW5saW5lIGNvbnN0IFFQb2ludCAmUVBhaW50ZXI6OmJydXNoT3Jp Z2luKCkgY29uc3QKewogICAgcmV0dXJuIGJybzsKfQoKaW5saW5lIGJvb2wgUVBhaW50ZXI6Omhh c1ZpZXdYRm9ybSgpIGNvbnN0CnsKCiAgICByZXR1cm4gdGVzdGYoVnhGKTsKCgoKfQoKaW5saW5l IGJvb2wgUVBhaW50ZXI6Omhhc1dvcmxkWEZvcm0oKSBjb25zdAp7CgogICAgcmV0dXJuIHRlc3Rm KFd4Rik7CgoKCn0KCmlubGluZSBkb3VibGUgUVBhaW50ZXI6OnRyYW5zbGF0aW9uWCgpIGNvbnN0 CnsKCiAgICByZXR1cm4gd29ybGRNYXRyaXgoKS5keCgpOwoKCgp9CgppbmxpbmUgZG91YmxlIFFQ YWludGVyOjp0cmFuc2xhdGlvblkoKSBjb25zdAp7CgogICAgcmV0dXJuIHdvcmxkTWF0cml4KCku ZHkoKTsKCgoKfQoKCmlubGluZSBib29sIFFQYWludGVyOjpoYXNDbGlwcGluZygpIGNvbnN0CnsK ICAgIHJldHVybiB0ZXN0ZihDbGlwT24pOwp9CgppbmxpbmUgaW50IFFQYWludGVyOjp0YWJTdG9w cygpIGNvbnN0CnsKICAgIHJldHVybiB0YWJzdG9wczsKfQoKaW5saW5lIGludCAqUVBhaW50ZXI6 OnRhYkFycmF5KCkgY29uc3QKewogICAgcmV0dXJuIHRhYmFycmF5Owp9CgoKCgoKCgppbmxpbmUg UXQ6OkhBTkRMRSBRUGFpbnRlcjo6aGFuZGxlKCkgY29uc3QKewogICAgcmV0dXJuIGhkOwp9CgoK aW5saW5lIHZvaWQgUVBhaW50ZXI6OnNldEJydXNoT3JpZ2luKCBjb25zdCBRUG9pbnQgJnAgKQp7 CiAgICBzZXRCcnVzaE9yaWdpbiggcC54KCksIHAueSgpICk7Cn0KCgppbmxpbmUgdm9pZCBRUGFp bnRlcjo6c2V0V2luZG93KCBjb25zdCBRUmVjdCAmciApCnsKICAgIHNldFdpbmRvdyggci54KCks IHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkgKTsKfQoKaW5saW5lIHZvaWQgUVBhaW50ZXI6 OnNldFZpZXdwb3J0KCBjb25zdCBRUmVjdCAmciApCnsKICAgIHNldFZpZXdwb3J0KCByLngoKSwg ci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSApOwp9CgoKaW5saW5lIHZvaWQgUVBhaW50ZXI6 OnNldENsaXBSZWN0KCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgQ29vcmRpbmF0ZU1vZGUg bSApCnsKICAgIHNldENsaXBSZWN0KCBRUmVjdCh4LHksdyxoKSwgbSApOwp9CgppbmxpbmUgdm9p ZCBRUGFpbnRlcjo6ZHJhd1BvaW50KCBjb25zdCBRUG9pbnQgJnAgKQp7CiAgICBkcmF3UG9pbnQo IHAueCgpLCBwLnkoKSApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6bW92ZVRvKCBjb25zdCBR UG9pbnQgJnAgKQp7CiAgICBtb3ZlVG8oIHAueCgpLCBwLnkoKSApOwp9CgppbmxpbmUgdm9pZCBR UGFpbnRlcjo6bGluZVRvKCBjb25zdCBRUG9pbnQgJnAgKQp7CiAgICBsaW5lVG8oIHAueCgpLCBw LnkoKSApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6ZHJhd0xpbmUoIGNvbnN0IFFQb2ludCAm cDEsIGNvbnN0IFFQb2ludCAmcDIgKQp7CiAgICBkcmF3TGluZSggcDEueCgpLCBwMS55KCksIHAy LngoKSwgcDIueSgpICk7Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjpkcmF3UmVjdCggY29uc3Qg UVJlY3QgJnIgKQp7CiAgICBkcmF3UmVjdCggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVp Z2h0KCkgKTsKfQoKaW5saW5lIHZvaWQgUVBhaW50ZXI6OmRyYXdXaW5Gb2N1c1JlY3QoIGNvbnN0 IFFSZWN0ICZyICkKewogICAgZHJhd1dpbkZvY3VzUmVjdCggci54KCksIHIueSgpLCByLndpZHRo KCksIHIuaGVpZ2h0KCkgKTsKfQoKaW5saW5lIHZvaWQgUVBhaW50ZXI6OmRyYXdXaW5Gb2N1c1Jl Y3QoIGNvbnN0IFFSZWN0ICZyLGNvbnN0IFFDb2xvciAmcGVuQ29sb3IgKQp7CiAgICBkcmF3V2lu Rm9jdXNSZWN0KCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSwgcGVuQ29sb3Ig KTsKfQoKaW5saW5lIHZvaWQgUVBhaW50ZXI6OmRyYXdSb3VuZFJlY3QoIGNvbnN0IFFSZWN0ICZy LCBpbnQgeFJuZCwgaW50IHlSbmQgKQp7CiAgICBkcmF3Um91bmRSZWN0KCByLngoKSwgci55KCks IHIud2lkdGgoKSwgci5oZWlnaHQoKSwgeFJuZCwgeVJuZCApOwp9CgppbmxpbmUgdm9pZCBRUGFp bnRlcjo6ZHJhd0VsbGlwc2UoIGNvbnN0IFFSZWN0ICZyICkKewogICAgZHJhd0VsbGlwc2UoIHIu eCgpLCByLnkoKSwgci53aWR0aCgpLCByLmhlaWdodCgpICk7Cn0KCmlubGluZSB2b2lkIFFQYWlu dGVyOjpkcmF3QXJjKCBjb25zdCBRUmVjdCAmciwgaW50IGEsIGludCBhbGVuICkKewogICAgZHJh d0FyYyggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCksIGEsIGFsZW4gKTsKfQoK aW5saW5lIHZvaWQgUVBhaW50ZXI6OmRyYXdQaWUoIGNvbnN0IFFSZWN0ICZyLCBpbnQgYSwgaW50 IGFsZW4gKQp7CiAgICBkcmF3UGllKCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQo KSwgYSwgYWxlbiApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6ZHJhd0Nob3JkKCBjb25zdCBR UmVjdCAmciwgaW50IGEsIGludCBhbGVuICkKewogICAgZHJhd0Nob3JkKCByLngoKSwgci55KCks IHIud2lkdGgoKSwgci5oZWlnaHQoKSwgYSwgYWxlbiApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRl cjo6ZHJhd1BpeG1hcCggY29uc3QgUVBvaW50ICZwLCBjb25zdCBRUGl4bWFwICZwbSwKCQkJCSAg Y29uc3QgUVJlY3QgJnNyICkKewogICAgZHJhd1BpeG1hcCggcC54KCksIHAueSgpLCBwbSwgc3Iu eCgpLCBzci55KCksIHNyLndpZHRoKCksIHNyLmhlaWdodCgpICk7Cn0KCmlubGluZSB2b2lkIFFQ YWludGVyOjpkcmF3SW1hZ2UoIGNvbnN0IFFQb2ludCAmcCwgY29uc3QgUUltYWdlICZwbSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVJlY3QgJnNyLCBpbnQgY29udmVy c2lvbkZsYWdzICkKewogICAgZHJhd0ltYWdlKCBwLngoKSwgcC55KCksIHBtLAoJICAgICAgIHNy LngoKSwgc3IueSgpLCBzci53aWR0aCgpLCBzci5oZWlnaHQoKSwgY29udmVyc2lvbkZsYWdzICk7 Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjpkcmF3VGlsZWRQaXhtYXAoIGNvbnN0IFFSZWN0ICZy LCBjb25zdCBRUGl4bWFwICZwbSwKCQkJCSAgICAgICBjb25zdCBRUG9pbnQgJnNwICkKewogICAg ZHJhd1RpbGVkUGl4bWFwKCByLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKSwgcG0s IHNwLngoKSwgc3AueSgpICk7Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjpkcmF3VGlsZWRQaXht YXAoIGNvbnN0IFFSZWN0ICZyLCBjb25zdCBRUGl4bWFwICZwbSApCnsKICAgIGRyYXdUaWxlZFBp eG1hcCggci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCksIHBtLCAwLCAwICk7Cn0K CmlubGluZSB2b2lkIFFQYWludGVyOjpmaWxsUmVjdCggY29uc3QgUVJlY3QgJnIsIGNvbnN0IFFC cnVzaCAmYnJ1c2ggKQp7CiAgICBmaWxsUmVjdCggci54KCksIHIueSgpLCByLndpZHRoKCksIHIu aGVpZ2h0KCksIGJydXNoICk7Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjplcmFzZVJlY3QoIGlu dCB4LCBpbnQgeSwgaW50IHcsIGludCBoICkKewogICAgZmlsbFJlY3QoIHgsIHksIHcsIGgsIGJh Y2tncm91bmRDb2xvcigpICk7Cn0KCmlubGluZSB2b2lkIFFQYWludGVyOjplcmFzZVJlY3QoIGNv bnN0IFFSZWN0ICZyICkKewogICAgZmlsbFJlY3QoIHIueCgpLCByLnkoKSwgci53aWR0aCgpLCBy LmhlaWdodCgpLCBiYWNrZ3JvdW5kQ29sb3IoKSApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6 ZHJhd1RleHQoIGNvbnN0IFFQb2ludCAmcCwgY29uc3QgUVN0cmluZyAmcywgaW50IGxlbiwgVGV4 dERpcmVjdGlvbiBkaXIgKQp7CiAgICBkcmF3VGV4dCggcC54KCksIHAueSgpLCBzLCAwLCBsZW4s IGRpciApOwp9CgppbmxpbmUgdm9pZCBRUGFpbnRlcjo6ZHJhd1RleHQoIGNvbnN0IFFQb2ludCAm cCwgY29uc3QgUVN0cmluZyAmcywgaW50IHBvcywgaW50IGxlbiwgVGV4dERpcmVjdGlvbiBkaXIg KQp7CiAgICBkcmF3VGV4dCggcC54KCksIHAueSgpLCBzLCBwb3MsIGxlbiwgZGlyICk7Cn0KCmlu bGluZSB2b2lkIFFQYWludGVyOjpkcmF3VGV4dCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgs IGludCB0ZiwKCQkJCWNvbnN0IFFTdHJpbmcmIHN0ciwgaW50IGxlbiwgUVJlY3QgKmJyLCBRVGV4 dFBhcmFnICoqaSApCnsKICAgIFFSZWN0IHIoeCwgeSwgdywgaCk7CiAgICBkcmF3VGV4dCggciwg dGYsIHN0ciwgbGVuLCBiciwgaSApOwp9CgppbmxpbmUgUVJlY3QgUVBhaW50ZXI6OmJvdW5kaW5n UmVjdCggaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCB0ZiwKCQkJCSAgICAgY29uc3Qg UVN0cmluZyYgc3RyLCBpbnQgbGVuLCBRVGV4dFBhcmFnICoqaSApCnsKICAgIFFSZWN0IHIoeCwg eSwgdywgaCk7CiAgICByZXR1cm4gYm91bmRpbmdSZWN0KCByLCB0Ziwgc3RyLCBsZW4sIGkgKTsK fQoKCgoKCgoKCgojIDYgImNoYXJ0Zm9ybV9maWxlcy5jcHAiIDIKCiMgMSAiL3Vzci9sb2NhbC9x dC9pbmNsdWRlL3FwcmludGVyLmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBRUHJpbnRlclByaXZhdGU7CgpjbGFzcyAgIFFQ cmludGVyIDogcHVibGljIFFQYWludERldmljZQp7CnB1YmxpYzoKICAgIGVudW0gUHJpbnRlck1v ZGUgeyBTY3JlZW5SZXNvbHV0aW9uLCBQcmludGVyUmVzb2x1dGlvbiwgSGlnaFJlc29sdXRpb24s IENvbXBhdGlibGUgfTsKCiAgICBRUHJpbnRlciggUHJpbnRlck1vZGUgbW9kZSA9IFNjcmVlblJl c29sdXRpb24gKTsKICAgflFQcmludGVyKCk7CgogICAgZW51bSBPcmllbnRhdGlvbiB7IFBvcnRy YWl0LCBMYW5kc2NhcGUgfTsKCiAgICBlbnVtIFBhZ2VTaXplICAgIHsgQTQsIEI1LCBMZXR0ZXIs IExlZ2FsLCBFeGVjdXRpdmUsCgkJICAgICAgIEEwLCBBMSwgQTIsIEEzLCBBNSwgQTYsIEE3LCBB OCwgQTksIEIwLCBCMSwKCQkgICAgICAgQjEwLCBCMiwgQjMsIEI0LCBCNiwgQjcsIEI4LCBCOSwg QzVFLCBDb21tMTBFLAoJCSAgICAgICBETEUsIEZvbGlvLCBMZWRnZXIsIFRhYmxvaWQsIEN1c3Rv bSwgTlBhZ2VTaXplID0gQ3VzdG9tIH07CgogICAgZW51bSBQYWdlT3JkZXIgICB7IEZpcnN0UGFn ZUZpcnN0LCBMYXN0UGFnZUZpcnN0IH07CgogICAgZW51bSBDb2xvck1vZGUgICB7IEdyYXlTY2Fs ZSwgQ29sb3IgfTsKCiAgICBlbnVtIFBhcGVyU291cmNlIHsgT25seU9uZSwgTG93ZXIsIE1pZGRs ZSwgTWFudWFsLCBFbnZlbG9wZSwKICAgICAgICAgICAgICAgICAgICAgICBFbnZlbG9wZU1hbnVh bCwgQXV0bywgVHJhY3RvciwgU21hbGxGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgTGFy Z2VGb3JtYXQsIExhcmdlQ2FwYWNpdHksIENhc3NldHRlLCBGb3JtU291cmNlIH07CgogICAgUVN0 cmluZyBwcmludGVyTmFtZSgpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFByaW50ZXJOYW1l KCBjb25zdCBRU3RyaW5nICYpOwogICAgYm9vbCBvdXRwdXRUb0ZpbGUoKSBjb25zdDsKICAgIHZp cnR1YWwgdm9pZCBzZXRPdXRwdXRUb0ZpbGUoIGJvb2wgKTsKICAgIFFTdHJpbmcgb3V0cHV0Rmls ZU5hbWUoKWNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldE91dHB1dEZpbGVOYW1lKCBjb25zdCBR U3RyaW5nICYpOwoKICAgIFFTdHJpbmcgcHJpbnRQcm9ncmFtKCkgY29uc3Q7CiAgICB2aXJ0dWFs IHZvaWQgc2V0UHJpbnRQcm9ncmFtKCBjb25zdCBRU3RyaW5nICYpOwoKICAgIFFTdHJpbmcgcHJp bnRlclNlbGVjdGlvbk9wdGlvbigpIGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldFByaW50ZXJT ZWxlY3Rpb25PcHRpb24oIGNvbnN0IFFTdHJpbmcgJiApOwoKICAgIFFTdHJpbmcgZG9jTmFtZSgp IGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldERvY05hbWUoIGNvbnN0IFFTdHJpbmcgJik7CiAg ICBRU3RyaW5nIGNyZWF0b3IoKSBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRDcmVhdG9yKCBj b25zdCBRU3RyaW5nICYpOwoKICAgIE9yaWVudGF0aW9uIG9yaWVudGF0aW9uKCkgICBjb25zdDsK ICAgIHZpcnR1YWwgdm9pZCBzZXRPcmllbnRhdGlvbiggT3JpZW50YXRpb24gKTsKICAgIFBhZ2VT aXplICAgIHBhZ2VTaXplKCkgICAgICBjb25zdDsKICAgIHZpcnR1YWwgdm9pZCBzZXRQYWdlU2l6 ZSggUGFnZVNpemUgKTsKCgoKCiAgICB2aXJ0dWFsIHZvaWQgc2V0UGFnZU9yZGVyKCBQYWdlT3Jk ZXIgKTsKICAgIFBhZ2VPcmRlciAgIHBhZ2VPcmRlcigpIGNvbnN0OwoKICAgIHZvaWQgc2V0UmVz b2x1dGlvbiggaW50ICk7CiAgICBpbnQgcmVzb2x1dGlvbigpIGNvbnN0OwoKICAgIHZpcnR1YWwg dm9pZCBzZXRDb2xvck1vZGUoIENvbG9yTW9kZSApOwogICAgQ29sb3JNb2RlICAgY29sb3JNb2Rl KCkgY29uc3Q7CgogICAgdmlydHVhbCB2b2lkICAgICAgICBzZXRGdWxsUGFnZSggYm9vbCApOwog ICAgYm9vbCAgICAgICAgICAgICAgICBmdWxsUGFnZSgpIGNvbnN0OwogICAgUVNpemUgICAgICAg bWFyZ2lucygpICAgICAgIGNvbnN0OwoKICAgIGludCAgICAgICAgIGZyb21QYWdlKCkgICAgICBj b25zdDsKICAgIGludCAgICAgICAgIHRvUGFnZSgpICAgICAgICBjb25zdDsKICAgIHZpcnR1YWwg dm9pZCBzZXRGcm9tVG8oIGludCBmcm9tUGFnZSwgaW50IHRvUGFnZSApOwogICAgaW50ICAgICAg ICAgbWluUGFnZSgpICAgICAgIGNvbnN0OwogICAgaW50ICAgICAgICAgbWF4UGFnZSgpICAgICAg IGNvbnN0OwogICAgdmlydHVhbCB2b2lkIHNldE1pbk1heCggaW50IG1pblBhZ2UsIGludCBtYXhQ YWdlICk7CiAgICBpbnQgICAgICAgICBudW1Db3BpZXMoKSAgICAgY29uc3Q7CiAgICB2aXJ0dWFs IHZvaWQgc2V0TnVtQ29waWVzKCBpbnQgKTsKCiAgICBib29sCWNvbGxhdGVDb3BpZXNFbmFibGVk KCkgY29uc3Q7ICAgIAogICAgdm9pZAlzZXRDb2xsYXRlQ29waWVzRW5hYmxlZChib29sICk7Cgog ICAgYm9vbAljb2xsYXRlQ29waWVzKCkgY29uc3Q7CiAgICB2b2lkCXNldENvbGxhdGVDb3BpZXMo Ym9vbCApOwoKICAgIGJvb2wgICAgICAgIG5ld1BhZ2UoKTsKICAgIGJvb2wgICAgICAgIGFib3J0 KCk7CiAgICBib29sICAgICAgICBhYm9ydGVkKCkgICAgICAgY29uc3Q7CgogICAgYm9vbCAgICAg ICAgc2V0dXAoIFFXaWRnZXQgKnBhcmVudCA9IDAgKTsKCiAgICBQYXBlclNvdXJjZSBwYXBlclNv dXJjZSgpICAgY29uc3Q7CiAgICB2aXJ0dWFsIHZvaWQgc2V0UGFwZXJTb3VyY2UoIFBhcGVyU291 cmNlICk7Cgpwcm90ZWN0ZWQ6CiAgICBib29sICAgICAgICBjbWQoIGludCwgUVBhaW50ZXIgKiwg UVBEZXZDbWRQYXJhbSAqICk7CiAgICBpbnQgICAgICAgICBtZXRyaWMoIGludCApIGNvbnN0OwoK CgoKCgpwcml2YXRlOgoKICAgIFFQYWludERldmljZSAqcGRydjsKICAgIGludCAgICAgICAgIHBp ZDsKCgoKCgoKCgojIDE3NiAiL3Vzci9sb2NhbC9xdC9pbmNsdWRlL3FwcmludGVyLmgiCgoKICAg IGludCAgICAgICAgIHN0YXRlOwogICAgUVN0cmluZyAgICAgcHJpbnRlcl9uYW1lOwogICAgUVN0 cmluZyAgICAgb3B0aW9uX3N0cmluZzsKICAgIFFTdHJpbmcgICAgIG91dHB1dF9maWxlbmFtZTsK ICAgIGJvb2wgICAgICAgIG91dHB1dF9maWxlOwogICAgUVN0cmluZyAgICAgcHJpbnRfcHJvZzsK ICAgIFFTdHJpbmcgICAgIGRvY19uYW1lOwogICAgUVN0cmluZyAgICAgY3JlYXRvcl9uYW1lOwoK ICAgIFBhZ2VTaXplICAgIHBhZ2Vfc2l6ZTsKICAgIFBhcGVyU291cmNlIHBhcGVyX3NvdXJjZTsK ICAgIFBhZ2VPcmRlciAgIHBhZ2Vfb3JkZXI7CiAgICBDb2xvck1vZGUgICBjb2xvcl9tb2RlOwog ICAgT3JpZW50YXRpb24gb3JpZW50OwogICAgdWludAl0b19lZGdlIDogMTsKICAgIHVpbnQJYXBw Y29sY29waWVzIDogMTsKICAgIHVpbnQJdXNlcmNvbGNvcGllcyA6IDE7CiAgICB1aW50CXJlc19z ZXQgOiAxOwogICAgc2hvcnQgICAgICAgZnJvbV9wZywgdG9fcGc7CiAgICBzaG9ydCAgICAgICBt aW5fcGcsICBtYXhfcGc7CiAgICBzaG9ydCAgICAgICBuY29waWVzOwogICAgaW50ICAgICAgICAg cmVzOwogICAgUVByaW50ZXJQcml2YXRlICpkOwoKcHJpdmF0ZTogICAgICAgICAKCiAgICBRUHJp bnRlciggY29uc3QgUVByaW50ZXIgJiApOwogICAgUVByaW50ZXIgJm9wZXJhdG9yPSggY29uc3Qg UVByaW50ZXIgJiApOwoKfTsKCgppbmxpbmUgUVN0cmluZyBRUHJpbnRlcjo6cHJpbnRlck5hbWUo KSBjb25zdAp7IHJldHVybiBwcmludGVyX25hbWU7IH0KCmlubGluZSBib29sIFFQcmludGVyOjpv dXRwdXRUb0ZpbGUoKSBjb25zdAp7IHJldHVybiBvdXRwdXRfZmlsZTsgfQoKaW5saW5lIFFTdHJp bmcgUVByaW50ZXI6Om91dHB1dEZpbGVOYW1lKCkgY29uc3QKeyByZXR1cm4gb3V0cHV0X2ZpbGVu YW1lOyB9CgppbmxpbmUgUVN0cmluZyBRUHJpbnRlcjo6cHJpbnRQcm9ncmFtKCkgY29uc3QKeyBy ZXR1cm4gcHJpbnRfcHJvZzsgfQoKaW5saW5lIFFTdHJpbmcgUVByaW50ZXI6OmRvY05hbWUoKSBj b25zdAp7IHJldHVybiBkb2NfbmFtZTsgfQoKaW5saW5lIFFTdHJpbmcgUVByaW50ZXI6OmNyZWF0 b3IoKSBjb25zdAp7IHJldHVybiBjcmVhdG9yX25hbWU7IH0KCmlubGluZSBRUHJpbnRlcjo6UGFn ZVNpemUgUVByaW50ZXI6OnBhZ2VTaXplKCkgY29uc3QKeyByZXR1cm4gcGFnZV9zaXplOyB9Cgpp bmxpbmUgUVByaW50ZXI6Ok9yaWVudGF0aW9uIFFQcmludGVyOjpvcmllbnRhdGlvbigpIGNvbnN0 CnsgcmV0dXJuIG9yaWVudDsgfQoKaW5saW5lIGludCBRUHJpbnRlcjo6ZnJvbVBhZ2UoKSBjb25z dAp7IHJldHVybiBmcm9tX3BnOyB9CgppbmxpbmUgaW50IFFQcmludGVyOjp0b1BhZ2UoKSBjb25z dAp7IHJldHVybiB0b19wZzsgfQoKaW5saW5lIGludCBRUHJpbnRlcjo6bWluUGFnZSgpIGNvbnN0 CnsgcmV0dXJuIG1pbl9wZzsgfQoKaW5saW5lIGludCBRUHJpbnRlcjo6bWF4UGFnZSgpIGNvbnN0 CnsgcmV0dXJuIG1heF9wZzsgfQoKaW5saW5lIGludCBRUHJpbnRlcjo6bnVtQ29waWVzKCkgY29u c3QKeyByZXR1cm4gbmNvcGllczsgfQoKaW5saW5lIGJvb2wgUVByaW50ZXI6OmNvbGxhdGVDb3Bp ZXNFbmFibGVkKCkgY29uc3QKeyByZXR1cm4gYXBwY29sY29waWVzOyB9CgppbmxpbmUgdm9pZCBR UHJpbnRlcjo6c2V0Q29sbGF0ZUNvcGllc0VuYWJsZWQoYm9vbCB2KQp7IGFwcGNvbGNvcGllcyA9 IHY7IH0KCmlubGluZSBib29sIFFQcmludGVyOjpjb2xsYXRlQ29waWVzKCkgY29uc3QKeyByZXR1 cm4gdXNlcmNvbGNvcGllczsgfQoKCgoKCiMgNyAiY2hhcnRmb3JtX2ZpbGVzLmNwcCIgMgoKIyAx ICIvdXNyL2xvY2FsL3F0L2luY2x1ZGUvcXN0YXR1c2Jhci5oIiAxCiAKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIFFTdGF0dXNCYXJQcml2YXRlOwoK CmNsYXNzICAgUVN0YXR1c0JhcjogcHVibGljIFFXaWRnZXQKewogICAgcHVibGljOgl2aXJ0dWFs IFFNZXRhT2JqZWN0ICptZXRhT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gc3RhdGljTWV0YU9iamVj dCgpOwl9CXZpcnR1YWwgY29uc3QgY2hhciAqY2xhc3NOYW1lKCkgY29uc3Q7CXZpcnR1YWwgdm9p ZCogcXRfY2FzdCggY29uc3QgY2hhciogKTsgdmlydHVhbCBib29sIHF0X2ludm9rZSggaW50LCBR VU9iamVjdCogKTsgdmlydHVhbCBib29sIHF0X2VtaXQoIGludCwgUVVPYmplY3QqICk7IHZpcnR1 YWwgYm9vbCBxdF9wcm9wZXJ0eSggaW50LCBpbnQsIFFWYXJpYW50KiApOyAJc3RhdGljIFFNZXRh T2JqZWN0KiBzdGF0aWNNZXRhT2JqZWN0KCk7CVFPYmplY3QqIHFPYmplY3QoKSB7IHJldHVybiAo UU9iamVjdCopdGhpczsgfSBzdGF0aWMgUVN0cmluZyB0ciggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IHN0YXRpYyBRU3RyaW5nIHRyVXRmOCggY29uc3QgY2hhciAqLCBjb25zdCBj aGFyICogPSAwICk7IAlwcml2YXRlOglzdGF0aWMgUU1ldGFPYmplY3QgKm1ldGFPYmo7IAogICAg IAoKcHVibGljOgogICAgUVN0YXR1c0JhciggUVdpZGdldCogcGFyZW50PTAsIGNvbnN0IGNoYXIq IG5hbWU9MCApOwogICAgdmlydHVhbCB+UVN0YXR1c0JhcigpOwoKICAgIHZpcnR1YWwgdm9pZCBh ZGRXaWRnZXQoIFFXaWRnZXQgKiwgaW50IHN0cmV0Y2ggPSAwLCBib29sID0gRkFMU0UgKTsKICAg IHZpcnR1YWwgdm9pZCByZW1vdmVXaWRnZXQoIFFXaWRnZXQgKiApOwoKICAgIHZvaWQgc2V0U2l6 ZUdyaXBFbmFibGVkKGJvb2wpOwogICAgYm9vbCBpc1NpemVHcmlwRW5hYmxlZCgpIGNvbnN0OwoK cHVibGljICA6CiAgICB2b2lkIG1lc3NhZ2UoIGNvbnN0IFFTdHJpbmcgJik7CiAgICB2b2lkIG1l c3NhZ2UoIGNvbnN0IFFTdHJpbmcgJiwgaW50ICk7CiAgICB2b2lkIGNsZWFyKCk7Cgpwcm90ZWN0 ZWQ6CiAgICB2b2lkIHBhaW50RXZlbnQoIFFQYWludEV2ZW50ICogKTsKICAgIHZvaWQgcmVzaXpl RXZlbnQoIFFSZXNpemVFdmVudCAqICk7CgogICAgdm9pZCByZWZvcm1hdCgpOwogICAgdm9pZCBo aWRlT3JTaG93KCk7CiAgICBib29sIGV2ZW50KCBRRXZlbnQgKik7Cgpwcml2YXRlOgogICAgUVN0 YXR1c0JhclByaXZhdGUgKiBkOwpwcml2YXRlOgkgCgogICAgUVN0YXR1c0JhciggY29uc3QgUVN0 YXR1c0JhciAmICk7CiAgICBRU3RhdHVzQmFyJiBvcGVyYXRvcj0oIGNvbnN0IFFTdGF0dXNCYXIg JiApOwoKfTsKCgoKCiMgOCAiY2hhcnRmb3JtX2ZpbGVzLmNwcCIgMgoKCgp2b2lkIENoYXJ0Rm9y bTo6bG9hZCggY29uc3QgUVN0cmluZyYgZmlsZW5hbWUgKQp7CiAgICBRRmlsZSBmaWxlKCBmaWxl bmFtZSApOwogICAgaWYgKCAhZmlsZS5vcGVuKCAweDAwMDEgICkgKSB7CglzdGF0dXNCYXIoKS0+ bWVzc2FnZSggUVN0cmluZyggIkZhaWxlZCB0byBsb2FkIFwnJTFcJyIgKS4KCQkJCWFyZyggZmls ZW5hbWUgKSwgMjAwMCApOwoJcmV0dXJuOwogICAgfQoKICAgIGluaXQoKTsgIAogICAgbV9maWxl bmFtZSA9IGZpbGVuYW1lOwogICAgUVRleHRTdHJlYW0gdHMoICZmaWxlICk7CiAgICBFbGVtZW50 IGVsZW1lbnQ7CiAgICBpbnQgZXJyb3JzID0gMDsKICAgIGludCBpID0gMDsKICAgIHdoaWxlICgg IXRzLmVvZigpICkgewoJdHMgPj4gZWxlbWVudDsKCWlmICggZWxlbWVudC5pc1ZhbGlkKCkgKQoJ ICAgIG1fZWxlbWVudHNbaSsrXSA9IGVsZW1lbnQ7CgllbHNlCgkgICAgZXJyb3JzKys7CglpZiAo IGkgPT0gTUFYX0VMRU1FTlRTICkgewoJICAgIHN0YXR1c0JhcigpLT5tZXNzYWdlKAoJCVFTdHJp bmcoICJSZWFkIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzICglMSkiCgkJICAgICAgICAgIiBk aXNjYXJkaW5nIG90aGVycyIgKS5hcmcoIGkgKSwgMjAwMCApOwoJICAgIGJyZWFrOwoJfQogICAg fQoKICAgIGZpbGUuY2xvc2UoKTsKCiAgICBRU3RyaW5nIGJhZCA9ICIiOwogICAgaWYgKCBlcnJv cnMgKSB7CgliYWQgPSBRU3RyaW5nKCAiOyBza2lwcGVkICIgKSArIFFTdHJpbmc6Om51bWJlcigg ZXJyb3JzICkgKyAiIGJhZCByZWNvcmQiOwoJaWYgKCBlcnJvcnMgPiAxICkKCSAgICBiYWQgKz0g InMiOwogICAgfQogICAgc3RhdHVzQmFyKCktPm1lc3NhZ2UoIFFTdHJpbmcoICJSZWFkICUxIHZh bHVlcyBmcm9tIFwnJTJcJyUzIiApLgoJCQkgIGFyZyggaSApLmFyZyggZmlsZW5hbWUgKS5hcmco IGJhZCApLCAzMDAwICk7CgogICAgc2V0Q2FwdGlvbiggUVN0cmluZyggIkNoYXJ0IC0tICUxIiAp LmFyZyggZmlsZW5hbWUgKSApOwogICAgdXBkYXRlUmVjZW50RmlsZXMoIGZpbGVuYW1lICk7Cgog ICAgZHJhd0VsZW1lbnRzKCk7CiAgICBtX2NoYW5nZWQgPSBGQUxTRTsKfQoKCnZvaWQgQ2hhcnRG b3JtOjpmaWxlU2F2ZSgpCnsKICAgIGlmICggbV9maWxlbmFtZS5pc0VtcHR5KCkgKSB7CglmaWxl U2F2ZUFzKCk7CglyZXR1cm47CiAgICB9CgogICAgUUZpbGUgZmlsZSggbV9maWxlbmFtZSApOwog ICAgaWYgKCAhZmlsZS5vcGVuKCAweDAwMDIgICkgKSB7CglzdGF0dXNCYXIoKS0+bWVzc2FnZSgg UVN0cmluZyggIkZhaWxlZCB0byBzYXZlIFwnJTFcJyIgKS4KCQkJCWFyZyggbV9maWxlbmFtZSAp LCAyMDAwICk7CglyZXR1cm47CiAgICB9CiAgICBRVGV4dFN0cmVhbSB0cyggJmZpbGUgKTsKICAg IGZvciAoIGludCBpID0gMDsgaSA8IE1BWF9FTEVNRU5UUzsgKytpICkKCWlmICggbV9lbGVtZW50 c1tpXS5pc1ZhbGlkKCkgKQoJICAgIHRzIDw8IG1fZWxlbWVudHNbaV07CgogICAgZmlsZS5jbG9z ZSgpOwoKICAgIHNldENhcHRpb24oIFFTdHJpbmcoICJDaGFydCAtLSAlMSIgKS5hcmcoIG1fZmls ZW5hbWUgKSApOwogICAgc3RhdHVzQmFyKCktPm1lc3NhZ2UoIFFTdHJpbmcoICJTYXZlZCBcJyUx XCciICkuYXJnKCBtX2ZpbGVuYW1lICksIDIwMDAgKTsKICAgIG1fY2hhbmdlZCA9IEZBTFNFOwp9 CgoKdm9pZCBDaGFydEZvcm06OmZpbGVTYXZlQXNQaXhtYXAoKQp7CiAgICBRU3RyaW5nIGZpbGVu YW1lID0gUUZpbGVEaWFsb2c6OmdldFNhdmVGaWxlTmFtZSgKCQkJICAgIFFTdHJpbmc6Om51bGws ICJJbWFnZXMgKCoucG5nICoueHBtICouanBnKSIsCgkJCSAgICB0aGlzLCAiZmlsZSBzYXZlIGFz IGJpdG1hcCIsCgkJCSAgICAiQ2hhcnQgLS0gRmlsZSBTYXZlIEFzIEJpdG1hcCIgKTsKICAgIGlm ICggUVBpeG1hcDo6Z3JhYldpZGdldCggbV9jYW52YXNWaWV3ICkuCgkgICAgc2F2ZSggZmlsZW5h bWUsCgkJICBmaWxlbmFtZS5taWQoIGZpbGVuYW1lLmZpbmRSZXYoICcuJyApICsgMSApLnVwcGVy KCkgKSApCglzdGF0dXNCYXIoKS0+bWVzc2FnZSggUVN0cmluZyggIldyb3RlIFwnJTFcJyIgKS5h cmcoIGZpbGVuYW1lICksIDIwMDAgKTsKICAgIGVsc2UKCXN0YXR1c0JhcigpLT5tZXNzYWdlKCBR U3RyaW5nKCAiRmFpbGVkIHRvIHdyaXRlIFwnJTFcJyIgKS4KCQkJCWFyZyggZmlsZW5hbWUgKSwg MjAwMCApOwp9Cgp2b2lkIENoYXJ0Rm9ybTo6ZmlsZVByaW50KCkKewogICAgaWYgKCAhbV9wcmlu dGVyICkKCW1fcHJpbnRlciA9IG5ldyBRUHJpbnRlcjsKICAgIGlmICggbV9wcmludGVyLT5zZXR1 cCgpICkgewoJUVBhaW50ZXIgcGFpbnRlciggbV9wcmludGVyICk7CgltX2NhbnZhcy0+ZHJhd0Fy ZWEoIFFSZWN0KCAwLCAwLCBtX2NhbnZhcy0+d2lkdGgoKSwgbV9jYW52YXMtPmhlaWdodCgpICks CgkJCSAgICAmcGFpbnRlciwgRkFMU0UgKTsKCWlmICggIW1fcHJpbnRlci0+b3V0cHV0RmlsZU5h bWUoKS5pc0VtcHR5KCkgKQoJICAgIHN0YXR1c0JhcigpLT5tZXNzYWdlKCBRU3RyaW5nKCAiUHJp bnRlZCBcJyUxXCciICkuCgkJCQkgIGFyZyggbV9wcmludGVyLT5vdXRwdXRGaWxlTmFtZSgpICks IDIwMDAgKTsKICAgIH0KfQoK