From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32230 invoked by alias); 6 Nov 2002 01:16: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 32202 invoked by uid 71); 6 Nov 2002 01:16:01 -0000 Resent-Date: 6 Nov 2002 01:16:01 -0000 Resent-Message-ID: <20021106011601.32200.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, sblack@stanford.edu Received: (qmail 29836 invoked by uid 61); 6 Nov 2002 01:06:58 -0000 Message-Id: <20021106010658.29835.qmail@sources.redhat.com> Date: Tue, 05 Nov 2002 17:16:00 -0000 From: sblack@stanford.edu Reply-To: sblack@stanford.edu To: gcc-gnats@gcc.gnu.org X-Send-Pr-Version: gnatsweb-2.9.3 (1.1.1.1.2.31) Subject: c++/8472: Internal compiler error X-SW-Source: 2002-11/txt/msg00271.txt.bz2 List-Id: >Number: 8472 >Category: c++ >Synopsis: Internal compiler error >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Tue Nov 05 17:16:00 PST 2002 >Closed-Date: >Last-Modified: >Originator: Stanley Black >Release: 2.95.3 >Organization: >Environment: Sun Blade 2000 Solaris 8 >Description: elaine23:~/cs140/base/vm> gmake gmake -C SUN gmake[1]: Entering directory `/afs/ir.stanford.edu/users/s/b/sblack/cs140/base/vm/SUN' gcc -g -Wall -Wno-pmf-conversions -fwritable-strings -I../../bin -I../../filesys -I../../userprog -I../../threads -I../../vm -I../../lib -I../.. -I/usr/class/cs140/nachos/machine -DTHREADS -DUSER_PROGRAM -DVM -DUSE_TLB -DFILESYS_NEEDED -DFILESYS_STUB -D_REENTRANT -DSPARC -DSOLARIS -DHOST_IS_BIG_ENDIAN -DHOST_SVR4 -DCHANGED -save-temps -c /usr/class/cs140/nachos/machine/interrupt.cc In file included from ../../threads/main.h:21, from /usr/class/cs140/nachos/machine/interrupt.cc:25: ../../userprog/userkernel.h:56: Internal compiler error 19970302. ../../userprog/userkernel.h:56: Please submit a full bug report. ../../userprog/userkernel.h:56: See for instructions. gmake[1]: *** [interrupt.o] Error 1 gmake[1]: Leaving directory `/afs/ir.stanford.edu/users/s/b/sblack/cs140/base/vm/SUN' gmake: *** [sun] Error 2 elaine23:~/cs140/base/vm> >How-To-Repeat: >Fix: >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="interrupt.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="interrupt.ii" IyAxICIvdXNyL2NsYXNzL2NzMTQwL25hY2hvcy9tYWNoaW5lL2ludGVycnVwdC5jYyIKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCiMgMSAiLi4vLi4vbGliL2NvcHly aWdodC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDIzICIvdXNyL2NsYXNzL2NzMTQw L25hY2hvcy9tYWNoaW5lL2ludGVycnVwdC5jYyIgMgoKIyAxICIvdXNyL2NsYXNzL2NzMTQwL25h Y2hvcy9tYWNoaW5lL2ludGVycnVwdC5oIiAxCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgojIDEgIi4uLy4uL2xpYi9j b3B5cmlnaHQuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzOCAiL3Vzci9jbGFzcy9j czE0MC9uYWNob3MvbWFjaGluZS9pbnRlcnJ1cHQuaCIgMgoKIyAxICIuLi8uLi9saWIvbGlzdC5o IiAxCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKIyAxICIuLi8uLi9saWIvY29weXJpZ2h0Lmgi IDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMTYgIi4uLy4uL2xpYi9saXN0LmgiIDIKCiMg MSAiLi4vLi4vbGliL2RlYnVnLmgiIDEKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgojIDEgIi4u Ly4uL2xpYi9jb3B5cmlnaHQuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxNiAiLi4v Li4vbGliL2RlYnVnLmgiIDIKCiMgMSAiLi4vLi4vbGliL3V0aWxpdHkuaCIgMQogCiAKIAogCiAK IAoKCgoKIyAxICIuLi8uLi9saWIvY29weXJpZ2h0LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCiMgMTEgIi4uLy4uL2xpYi91dGlsaXR5LmgiIDIKCgogCgoKCgogCgoKCgogCgoKCiAKIAog CiAKIAogCiAKCnR5cGVkZWYgdm9pZCAoKlZvaWRGdW5jdGlvblB0cikodm9pZCAqYXJnKTsgCnR5 cGVkZWYgdm9pZCAoKlZvaWROb0FyZ0Z1bmN0aW9uUHRyKSgpOyAKCgojIDE3ICIuLi8uLi9saWIv ZGVidWcuaCIgMgoKIyAxICIuLi8uLi9saWIvc3lzZGVwLmgiIDEKIAogCiAKIAogCiAKIAogCiAK CgoKCiMgMSAiLi4vLi4vbGliL2NvcHlyaWdodC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgojIDE0ICIuLi8uLi9saWIvc3lzZGVwLmgiIDIKCiMgMSAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5o IiAxIDMgNAogCgoKCgogCiAKCiAKIAogCgoKCgojcHJhZ21hIGlkZW50CSJAKCMpc3RkbGliLmgJ MS40Nwk5OS8xMS8wMyBTTUkiCQoKIyAxICIvdXNyL2luY2x1ZGUvaXNvL3N0ZGxpYl9pc28uaCIg MSAzIDQKIAoKCgoKIAogCgogCiAKIAoKIAoKCgoKCgoKCgoKCgoKCiNwcmFnbWEgaWRlbnQJIkAo IylzdGRsaWJfaXNvLmgJMS4yCTk5LzEyLzIxIFNNSSIgCgojIDEgIi91c3IvaW5jbHVkZS9zeXMv ZmVhdHVyZV90ZXN0cy5oIiAxIDMgNAogCgoKCgogCiAKIAoKCgoKI3ByYWdtYSBpZGVudAkiQCgj KWZlYXR1cmVfdGVzdHMuaAkxLjE4CTk5LzA3LzI2IFNNSSIKCiMgMSAiL3Vzci9pbmNsdWRlL3N5 cy9pc2FfZGVmcy5oIiAxIDMgNAogCgoKCgoKCgojcHJhZ21hIGlkZW50CSJAKCMpaXNhX2RlZnMu aAkxLjIwCTk5LzA1LzA0IFNNSSIKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpl eHRlcm4gIkMiIHsKCgoKIAoKCgoKCiMgMjY3ICIvdXNyL2luY2x1ZGUvc3lzL2lzYV9kZWZzLmgi IDMgNAoKCiAKCgoKCgoKIAoKCgoKCgogCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCiAKCgoK CgoKCiAKCgoKCgogCgoKCgoKCgogCgoKCgoKCgoKIAoKCgojIDM2NiAiL3Vzci9pbmNsdWRlL3N5 cy9pc2FfZGVmcy5oIiAzIDQKCgogCgoKCgoKCgoKCgoKfQoKCgojIDE1ICIvdXNyL2luY2x1ZGUv c3lzL2ZlYXR1cmVfdGVzdHMuaCIgMiAzIDQKCgoKZXh0ZXJuICJDIiB7CgoKIAoKCgoKCgoKCgoK CgogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgogCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoK CgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIAoKCgoKCgp9CgoKCiMgMzAgIi91c3Iv aW5jbHVkZS9pc28vc3RkbGliX2lzby5oIiAyIDMgNAoKCgpleHRlcm4gIkMiIHsKCgoKZXh0ZXJu IHVuc2lnbmVkIGNoYXIJX19jdHlwZVtdOwoKCgoKCgoKCgoKdHlwZWRlZglzdHJ1Y3QgewoJaW50 CXF1b3Q7CglpbnQJcmVtOwp9IGRpdl90OwoKdHlwZWRlZiBzdHJ1Y3QgewoJbG9uZwlxdW90OwoJ bG9uZwlyZW07Cn0gbGRpdl90OwoKCgoKCgp0eXBlZGVmIHVuc2lnbmVkIGludCAgICBzaXplX3Q7 CQkgCgoKCgoKCgoKCgoKCgoKCgoKCgoKdHlwZWRlZiBsb25nCXdjaGFyX3Q7CgoKCgoKZXh0ZXJu IHZvaWQgYWJvcnQodm9pZCk7CmV4dGVybiBpbnQgYWJzKGludCk7CmV4dGVybiBpbnQgYXRleGl0 KHZvaWQgKCopKHZvaWQpKTsKZXh0ZXJuIGRvdWJsZSBhdG9mKGNvbnN0IGNoYXIgKik7CmV4dGVy biBpbnQgYXRvaShjb25zdCBjaGFyICopOwpleHRlcm4gbG9uZyBpbnQgYXRvbChjb25zdCBjaGFy ICopOwpleHRlcm4gdm9pZCAqYnNlYXJjaChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6 ZV90LCBzaXplX3QsCglpbnQgKCopKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7CmV4dGVy biB2b2lkICpjYWxsb2Moc2l6ZV90LCBzaXplX3QpOwpleHRlcm4gZGl2X3QgZGl2KGludCwgaW50 KTsKZXh0ZXJuIHZvaWQgZXhpdChpbnQpOwpleHRlcm4gdm9pZCBmcmVlKHZvaWQgKik7CmV4dGVy biBjaGFyICpnZXRlbnYoY29uc3QgY2hhciAqKTsKZXh0ZXJuIGxvbmcgaW50IGxhYnMobG9uZyk7 CmV4dGVybiBsZGl2X3QgbGRpdihsb25nLCBsb25nKTsKZXh0ZXJuIHZvaWQgKm1hbGxvYyhzaXpl X3QpOwpleHRlcm4gaW50IG1ibGVuKGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKZXh0ZXJuIHNpemVf dCBtYnN0b3djcyh3Y2hhcl90ICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKZXh0ZXJuIGludCBt YnRvd2Mod2NoYXJfdCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CmV4dGVybiB2b2lkIHFzb3J0 KHZvaWQgKiwgc2l6ZV90LCBzaXplX3QsCglpbnQgKCopKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9p ZCAqKSk7CmV4dGVybiBpbnQgcmFuZCh2b2lkKTsKZXh0ZXJuIHZvaWQgKnJlYWxsb2Modm9pZCAq LCBzaXplX3QpOwpleHRlcm4gdm9pZCBzcmFuZCh1bnNpZ25lZCBpbnQpOwpleHRlcm4gZG91Ymxl IHN0cnRvZChjb25zdCBjaGFyICosIGNoYXIgKiopOwpleHRlcm4gbG9uZyBpbnQgc3RydG9sKGNv bnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsKZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW50IHN0cnRv dWwoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwpleHRlcm4gaW50IHN5c3RlbShjb25zdCBj aGFyICopOwpleHRlcm4gaW50IHdjdG9tYihjaGFyICosIHdjaGFyX3QpOwpleHRlcm4gc2l6ZV90 IHdjc3RvbWJzKGNoYXIgKiwgY29uc3Qgd2NoYXJfdCAqLCBzaXplX3QpOwoKIyAxNTIgIi91c3Iv aW5jbHVkZS9pc28vc3RkbGliX2lzby5oIiAzIDQKCgoKCgoKCn0KCgoKIyAxOCAiL3Vzci9pbmNs dWRlL3N0ZGxpYi5oIiAyIDMgNAoKCgoKCgoKIAoKCgojIDYxICIvdXNyL2luY2x1ZGUvc3RkbGli LmgiIDMgNAoKCgpleHRlcm4gIkMiIHsKCgoKdHlwZWRlZiBzdHJ1Y3QgewoJbG9uZyBsb25nCXF1 b3Q7Cglsb25nIGxvbmcJcmVtOwp9IGxsZGl2X3Q7CgoKCgoKCgp0eXBlZGVmIGxvbmcJdWlkX3Q7 CQkJIAoKCgoKCiAKIyA5NCAiL3Vzci9pbmNsdWRlL3N0ZGxpYi5oIiAzIDQKCgogCiMgMTA1ICIv dXNyL2luY2x1ZGUvc3RkbGliLmgiIDMgNAoKCgoKZXh0ZXJuIGludCByYW5kX3IodW5zaWduZWQg aW50ICopOwoKCmV4dGVybiB2b2lkIF9leGl0aGFuZGxlKHZvaWQpOwoKCgoKZXh0ZXJuIGRvdWJs ZSBkcmFuZDQ4KHZvaWQpOwpleHRlcm4gZG91YmxlIGVyYW5kNDgodW5zaWduZWQgc2hvcnQgKik7 CmV4dGVybiBsb25nIGpyYW5kNDgodW5zaWduZWQgc2hvcnQgKik7CmV4dGVybiB2b2lkIGxjb25n NDgodW5zaWduZWQgc2hvcnQgKik7CmV4dGVybiBsb25nIGxyYW5kNDgodm9pZCk7CmV4dGVybiBs b25nIG1yYW5kNDgodm9pZCk7CmV4dGVybiBsb25nIG5yYW5kNDgodW5zaWduZWQgc2hvcnQgKik7 CmV4dGVybiB1bnNpZ25lZCBzaG9ydCAqc2VlZDQ4KHVuc2lnbmVkIHNob3J0ICopOwpleHRlcm4g dm9pZCBzcmFuZDQ4KGxvbmcpOwpleHRlcm4gaW50IHB1dGVudihjaGFyICopOwpleHRlcm4gdm9p ZCBzZXRrZXkoY29uc3QgY2hhciAqKTsKCgoKCgoKCgoKCgoKdHlwZWRlZiBpbnQJc3NpemVfdDsJ IAoKCgpleHRlcm4gdm9pZCBzd2FiKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBzc2l6ZV90KTsKCgoK CgpleHRlcm4gaW50CW1rc3RlbXAoY2hhciAqKTsKCgoKCmV4dGVybiBpbnQJbWtzdGVtcDY0KGNo YXIgKik7CgoKCgoKZXh0ZXJuIGxvbmcgYTY0bChjb25zdCBjaGFyICopOwpleHRlcm4gY2hhciAq ZWN2dChkb3VibGUsIGludCwgaW50ICosIGludCAqKTsKZXh0ZXJuIGNoYXIgKmZjdnQoZG91Ymxl LCBpbnQsIGludCAqLCBpbnQgKik7CmV4dGVybiBjaGFyICpnY3Z0KGRvdWJsZSwgaW50LCBjaGFy ICopOwpleHRlcm4gaW50IGdldHN1Ym9wdChjaGFyICoqLCBjaGFyICpjb25zdCAqLCBjaGFyICoq KTsKZXh0ZXJuIGludCAgZ3JhbnRwdChpbnQpOwpleHRlcm4gY2hhciAqaW5pdHN0YXRlKHVuc2ln bmVkLCBjaGFyICosIHNpemVfdCk7CmV4dGVybiBjaGFyICpsNjRhKGxvbmcpOwpleHRlcm4gY2hh ciAqbWt0ZW1wKGNoYXIgKik7CmV4dGVybiBjaGFyICpwdHNuYW1lKGludCk7CmV4dGVybiBsb25n IHJhbmRvbSh2b2lkKTsKZXh0ZXJuIGNoYXIgKnJlYWxwYXRoKGNvbnN0IGNoYXIgKiwgY2hhciAq KTsKZXh0ZXJuIGNoYXIgKnNldHN0YXRlKGNvbnN0IGNoYXIgKik7CmV4dGVybiB2b2lkIHNyYW5k b20odW5zaWduZWQpOwpleHRlcm4gaW50IHR0eXNsb3Qodm9pZCk7CmV4dGVybiBpbnQgIHVubG9j a3B0KGludCk7CmV4dGVybiB2b2lkICp2YWxsb2Moc2l6ZV90KTsKCgoKCmV4dGVybiBpbnQgZHVw MihpbnQsIGludCk7CmV4dGVybiBjaGFyICpxZWN2dChsb25nIGRvdWJsZSwgaW50LCBpbnQgKiwg aW50ICopOwpleHRlcm4gY2hhciAqcWZjdnQobG9uZyBkb3VibGUsIGludCwgaW50ICosIGludCAq KTsKZXh0ZXJuIGNoYXIgKnFnY3Z0KGxvbmcgZG91YmxlLCBpbnQsIGNoYXIgKik7CmV4dGVybiBj aGFyICpnZXRjd2QoY2hhciAqLCBzaXplX3QpOwpleHRlcm4gY29uc3QgY2hhciAqZ2V0ZXhlY25h bWUodm9pZCk7CmV4dGVybiBjaGFyICpnZXRsb2dpbih2b2lkKTsKZXh0ZXJuIGludCBnZXRvcHQo aW50LCBjaGFyICpjb25zdCAqLCBjb25zdCBjaGFyICopOwpleHRlcm4gY2hhciAqb3B0YXJnOwpl eHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CmV4dGVybiBjaGFyICpnZXRwYXNzKGNv bnN0IGNoYXIgKik7CmV4dGVybiBjaGFyICpnZXRwYXNzcGhyYXNlKGNvbnN0IGNoYXIgKik7CmV4 dGVybiBpbnQgZ2V0cHcodWlkX3QsIGNoYXIgKik7CmV4dGVybiBpbnQgaXNhdHR5KGludCk7CmV4 dGVybiB2b2lkICptZW1hbGlnbihzaXplX3QsIHNpemVfdCk7CmV4dGVybiBjaGFyICp0dHluYW1l KGludCk7CgoKZXh0ZXJuIGxvbmcgbG9uZyBhdG9sbChjb25zdCBjaGFyICopOwpleHRlcm4gbG9u ZyBsb25nIGxsYWJzKGxvbmcgbG9uZyk7CmV4dGVybiBsbGRpdl90IGxsZGl2KGxvbmcgbG9uZywg bG9uZyBsb25nKTsKZXh0ZXJuIGNoYXIgKmxsdG9zdHIobG9uZyBsb25nLCBjaGFyICopOwpleHRl cm4gbG9uZyBsb25nIHN0cnRvbGwoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwpleHRlcm4g dW5zaWduZWQgbG9uZyBsb25nIHN0cnRvdWxsKGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgaW50KTsK ZXh0ZXJuIGNoYXIgKnVsbHRvc3RyKHVuc2lnbmVkIGxvbmcgbG9uZywgY2hhciAqKTsKCgoKCiMg MzA1ICIvdXNyL2luY2x1ZGUvc3RkbGliLmgiIDMgNAoKCgp9CgoKCiMgMTUgIi4uLy4uL2xpYi9z eXNkZXAuaCIgMgoKIyAxICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIgMSAzIDQKIAogCgogCiAKIAoK IAoKCgoKIAoKCgoKCgojcHJhZ21hIGlkZW50CSJAKCMpc3RkaW8uaAkxLjc4CTk5LzEyLzA4IFNN SSIJCgojIDEgIi91c3IvaW5jbHVkZS9pc28vc3RkaW9faXNvLmgiIDEgMyA0CiAKIAoKIAogCiAK CiAKCgoKCiAKCgoKCgoKCgoKCgogCgoKCgoKCiNwcmFnbWEgaWRlbnQJIkAoIylzdGRpb19pc28u aAkxLjIJOTkvMTAvMjUgU01JIgogCgoKIyAxICIvdXNyL2luY2x1ZGUvc3lzL3ZhX2xpc3QuaCIg MSAzIDQKIAoKCgoKCgoKI3ByYWdtYSBpZGVudAkiQCgjKXZhX2xpc3QuaAkxLjEyCTk5LzA1LzA0 IFNNSSIKCiAKCgoKCgoKCgoKCmV4dGVybiAiQyIgewoKCgp0eXBlZGVmIHZvaWQgKl9fdmFfbGlz dDsKCgoKCgp9CgoKCiMgMzYgIi91c3IvaW5jbHVkZS9pc28vc3RkaW9faXNvLmgiIDIgMyA0Cgoj IDEgIi91c3IvaW5jbHVkZS9zdGRpb190YWcuaCIgMSAzIDQKIAoKCgoKCgoKI3ByYWdtYSBpZGVu dAkiQCgjKXN0ZGlvX3RhZy5oCTEuMwk5OC8wNC8yMCBTTUkiCgoKZXh0ZXJuICJDIiB7CgoKCgoK CgoKdHlwZWRlZiBzdHJ1Y3QgRklMRSAgX19GSUxFOwoKCgp9CgoKCiMgMzcgIi91c3IvaW5jbHVk ZS9pc28vc3RkaW9faXNvLmgiIDIgMyA0CgojIDEgIi91c3IvaW5jbHVkZS9zdGRpb19pbXBsLmgi IDEgMyA0CiAKCgoKCgoKCiNwcmFnbWEgaWRlbnQJIkAoIylzdGRpb19pbXBsLmgJMS44CTk5LzA2 LzEwIFNNSSIKCgoKCmV4dGVybiAiQyIgewoKCgoKCgoKCgoKCiMgMzYgIi91c3IvaW5jbHVkZS9z dGRpb19pbXBsLmgiIDMgNAoKCnN0cnVjdCBGSUxFIAkgCnsKCgoKCglzc2l6ZV90CQlfY250Owkg Cgl1bnNpZ25lZCBjaGFyCSpfcHRyOwkgCgoJdW5zaWduZWQgY2hhcgkqX2Jhc2U7CSAKCXVuc2ln bmVkIGNoYXIJX2ZsYWc7CSAKCXVuc2lnbmVkIGNoYXIJX2ZpbGU7CSAKCXVuc2lnbmVkCV9fb3Jp ZW50YXRpb246MjsgIAoJdW5zaWduZWQJX19pb25vbG9jazoxOwkgCgl1bnNpZ25lZAlfX2ZpbGxl cjo1Owp9OwoKCgoKfQoKCgojIDM4ICIvdXNyL2luY2x1ZGUvaXNvL3N0ZGlvX2lzby5oIiAyIDMg NAoKCiAKCgoKCgoKCgpleHRlcm4gIkMiIHsKCgoKIAoKCgoKCnR5cGVkZWYJbG9uZyBsb25nCV9f bG9uZ2xvbmdfdDsKCgoKCgoKCgoKCgoKCgoKdHlwZWRlZglfX0ZJTEUgRklMRTsKCgoKCgoKCgoK CgoKdHlwZWRlZiBsb25nCQlmcG9zX3Q7CgoKCgoKCgoKCgoKCgoKCgoKCiAKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKZXh0ZXJuIF9fRklMRQlfX2lvYlsyMCBdOwoKCgoK CgoKCgoKCgoKCgoKZXh0ZXJuIGludAlyZW1vdmUoY29uc3QgY2hhciAqKTsKZXh0ZXJuIGludAly ZW5hbWUoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwpleHRlcm4gRklMRQkqdG1wZmlsZSh2 b2lkKTsKZXh0ZXJuIGNoYXIJKnRtcG5hbShjaGFyICopOwpleHRlcm4gaW50CWZjbG9zZShGSUxF ICopOwpleHRlcm4gaW50CWZmbHVzaChGSUxFICopOwpleHRlcm4gRklMRQkqZm9wZW4oY29uc3Qg Y2hhciAqLCBjb25zdCBjaGFyICopOwpleHRlcm4gRklMRQkqZnJlb3Blbihjb25zdCBjaGFyICos IGNvbnN0IGNoYXIgKiwgRklMRSAqKTsKZXh0ZXJuIHZvaWQJc2V0YnVmKEZJTEUgKiwgY2hhciAq KTsKZXh0ZXJuIGludAlzZXR2YnVmKEZJTEUgKiwgY2hhciAqLCBpbnQsIHNpemVfdCk7CiAKZXh0 ZXJuIGludAlmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogCmV4dGVybiBpbnQJ ZnNjYW5mKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOwogCmV4dGVybiBpbnQJcHJpbnRmKGNv bnN0IGNoYXIgKiwgLi4uKTsKIApleHRlcm4gaW50CXNjYW5mKGNvbnN0IGNoYXIgKiwgLi4uKTsK IApleHRlcm4gaW50CXNwcmludGYoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CiAKZXh0ZXJu IGludAlzc2NhbmYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7CmV4dGVybiBpbnQJ dmZwcmludGYoRklMRSAqLCBjb25zdCBjaGFyICosIF9fdmFfbGlzdCk7CmV4dGVybiBpbnQJdnBy aW50Zihjb25zdCBjaGFyICosIF9fdmFfbGlzdCk7CmV4dGVybiBpbnQJdnNwcmludGYoY2hhciAq LCBjb25zdCBjaGFyICosIF9fdmFfbGlzdCk7CmV4dGVybiBpbnQJZmdldGMoRklMRSAqKTsKZXh0 ZXJuIGNoYXIJKmZnZXRzKGNoYXIgKiwgaW50LCBGSUxFICopOwpleHRlcm4gaW50CWZwdXRjKGlu dCwgRklMRSAqKTsKZXh0ZXJuIGludAlmcHV0cyhjb25zdCBjaGFyICosIEZJTEUgKik7CgoKZXh0 ZXJuIGludAlnZXRjKEZJTEUgKik7CmV4dGVybiBpbnQJcHV0YyhpbnQsIEZJTEUgKik7CgoKCmV4 dGVybiBpbnQJZ2V0Y2hhcih2b2lkKTsKZXh0ZXJuIGludAlwdXRjaGFyKGludCk7CgpleHRlcm4g Y2hhcgkqZ2V0cyhjaGFyICopOwpleHRlcm4gaW50CXB1dHMoY29uc3QgY2hhciAqKTsKZXh0ZXJu IGludAl1bmdldGMoaW50LCBGSUxFICopOwpleHRlcm4gc2l6ZV90CWZyZWFkKHZvaWQgKiwgc2l6 ZV90LCBzaXplX3QsIEZJTEUgKik7CmV4dGVybiBzaXplX3QJZndyaXRlKGNvbnN0IHZvaWQgKiwg c2l6ZV90LCBzaXplX3QsIEZJTEUgKik7CmV4dGVybiBpbnQJZmdldHBvcyhGSUxFICosIGZwb3Nf dCAqKTsKZXh0ZXJuIGludAlmc2VlayhGSUxFICosIGxvbmcsIGludCk7CmV4dGVybiBpbnQJZnNl dHBvcyhGSUxFICosIGNvbnN0IGZwb3NfdCAqKTsKZXh0ZXJuIGxvbmcJZnRlbGwoRklMRSAqKTsK ZXh0ZXJuIHZvaWQJcmV3aW5kKEZJTEUgKik7CgoKZXh0ZXJuIHZvaWQJY2xlYXJlcnIoRklMRSAq KTsKZXh0ZXJuIGludAlmZW9mKEZJTEUgKik7CmV4dGVybiBpbnQJZmVycm9yKEZJTEUgKik7Cgpl eHRlcm4gdm9pZAlwZXJyb3IoY29uc3QgY2hhciAqKTsKCgpleHRlcm4gaW50CV9fZmlsYnVmKEZJ TEUgKik7CmV4dGVybiBpbnQJX19mbHNidWYoaW50LCBGSUxFICopOwoKCiMgMjc1ICIvdXNyL2lu Y2x1ZGUvaXNvL3N0ZGlvX2lzby5oIiAzIDQKCgoKCgoKCgojIDMzMSAiL3Vzci9pbmNsdWRlL2lz by9zdGRpb19pc28uaCIgMyA0CgoKCgoKfQoKCgojIDIyICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIg MiAzIDQKCgogCgoKCgoKCgogCgoKCiMgODEgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAzIDQKCgoK ZXh0ZXJuICJDIiB7CgoKCgoKCnR5cGVkZWYgbG9uZwkJb2ZmX3Q7CgoKCgoKCgp0eXBlZGVmIF9f bG9uZ2xvbmdfdAlvZmY2NF90OwoKCgoKCgoKCgp0eXBlZGVmIF9fbG9uZ2xvbmdfdAlmcG9zNjRf dDsKCgoKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmV4dGVybiB1bnNpZ25lZCBjaGFyCSBfc2li dWZbXSwgX3NvYnVmW107CgoKIAojIDE3NiAiL3Vzci9pbmNsdWRlL3N0ZGlvLmgiIDMgNAoKCgpl eHRlcm4gdW5zaWduZWQgY2hhcgkqX2J1ZmVuZHRhYltdOwpleHRlcm4gRklMRQkJKl9sYXN0YnVm OwoKCiAKIyAyMDYgIi91c3IvaW5jbHVkZS9zdGRpby5oIiAzIDQKCgoKCgpleHRlcm4gY2hhcgkq dG1wbmFtX3IoY2hhciAqKTsKCgoKZXh0ZXJuIHZvaWQgc2V0YnVmZmVyKEZJTEUgKiwgY2hhciAq LCBzaXplX3QpOwpleHRlcm4gaW50IHNldGxpbmVidWYoRklMRSAqKTsKCgoKCiAKZXh0ZXJuIGlu dAlzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOwoKCgoKZXh0ZXJu IGludAl2c25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgX192YV9saXN0KTsK CgogCgoKCgoKZXh0ZXJuIEZJTEUJKmZkb3BlbihpbnQsIGNvbnN0IGNoYXIgKik7CmV4dGVybiBj aGFyCSpjdGVybWlkKGNoYXIgKik7CmV4dGVybiBpbnQJZmlsZW5vKEZJTEUgKik7CgoKCiAKCgoK CmV4dGVybiB2b2lkCWZsb2NrZmlsZShGSUxFICopOwpleHRlcm4gaW50CWZ0cnlsb2NrZmlsZShG SUxFICopOwpleHRlcm4gdm9pZAlmdW5sb2NrZmlsZShGSUxFICopOwpleHRlcm4gaW50CWdldGNf dW5sb2NrZWQoRklMRSAqKTsKZXh0ZXJuIGludAlnZXRjaGFyX3VubG9ja2VkKHZvaWQpOwpleHRl cm4gaW50CXB1dGNfdW5sb2NrZWQoaW50LCBGSUxFICopOwpleHRlcm4gaW50CXB1dGNoYXJfdW5s b2NrZWQoaW50KTsKCgoKIAoKCgoKZXh0ZXJuIEZJTEUJKnBvcGVuKGNvbnN0IGNoYXIgKiwgY29u c3QgY2hhciAqKTsKZXh0ZXJuIGNoYXIJKmN1c2VyaWQoY2hhciAqKTsKZXh0ZXJuIGNoYXIJKnRl bXBuYW0oY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwpleHRlcm4gaW50CWdldG9wdChpbnQs IGNoYXIgKmNvbnN0ICosIGNvbnN0IGNoYXIgKik7CgpleHRlcm4gaW50CWdldHN1Ym9wdChjaGFy ICoqLCBjaGFyICpjb25zdCAqLCBjaGFyICoqKTsKCmV4dGVybiBjaGFyCSpvcHRhcmc7CmV4dGVy biBpbnQJb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKZXh0ZXJuIGludAlnZXR3KEZJTEUgKik7CmV4 dGVybiBpbnQJcHV0dyhpbnQsIEZJTEUgKik7CmV4dGVybiBpbnQJcGNsb3NlKEZJTEUgKik7CgoK CiAKCgoKZXh0ZXJuIGludAlmc2Vla28oRklMRSAqLCBvZmZfdCwgaW50KTsKZXh0ZXJuIG9mZl90 CWZ0ZWxsbyhGSUxFICopOwoKCiAKCgoKCgpleHRlcm4gRklMRQkqZm9wZW42NChjb25zdCBjaGFy ICosIGNvbnN0IGNoYXIgKik7CmV4dGVybiBGSUxFCSpmcmVvcGVuNjQoY29uc3QgY2hhciAqLCBj b25zdCBjaGFyICosIEZJTEUgKik7CmV4dGVybiBGSUxFCSp0bXBmaWxlNjQodm9pZCk7CmV4dGVy biBpbnQJZmdldHBvczY0KEZJTEUgKiwgZnBvczY0X3QgKik7CmV4dGVybiBpbnQJZnNldHBvczY0 KEZJTEUgKiwgY29uc3QgZnBvczY0X3QgKik7CmV4dGVybiBpbnQJZnNlZWtvNjQoRklMRSAqLCBv ZmY2NF90LCBpbnQpOwpleHRlcm4gb2ZmNjRfdAlmdGVsbG82NChGSUxFICopOwoKCiMgMzY2ICIv dXNyL2luY2x1ZGUvc3RkaW8uaCIgMyA0CgoKCgoKCgoKCgoKCgoKCiMgMzg5ICIvdXNyL2luY2x1 ZGUvc3RkaW8uaCIgMyA0CgoKCgoKCgoKCn0KCgoKIyAxNiAiLi4vLi4vbGliL3N5c2RlcC5oIiAy CgojIDEgIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMSAzIDQKIAogCgogCiAKIAoKIAoKCgoKCgoK I3ByYWdtYSBpZGVudAkiQCgjKXN0cmluZy5oCTEuMjQJOTkvMDgvMTAgU01JIgkKCiMgMSAiL3Vz ci9pbmNsdWRlL2lzby9zdHJpbmdfaXNvLmgiIDEgMyA0CiAKIAoKIAogCiAKCiAKCgoKCiAKCgoK CgoKCgoKCgoKCgojcHJhZ21hIGlkZW50CSJAKCMpc3RyaW5nX2lzby5oCTEuMgk5OS8xMS8wOSBT TUkiCiAKCgoKCmV4dGVybiAiQyIgewoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKZXh0ZXJuIGlu dCBtZW1jbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CmV4dGVybiB2b2lk ICptZW1jcHkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CmV4dGVybiB2b2lkICptZW1t b3ZlKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwpleHRlcm4gdm9pZCAqbWVtc2V0KHZv aWQgKiwgaW50LCBzaXplX3QpOwpleHRlcm4gY2hhciAqc3RyY2F0KGNoYXIgKiwgY29uc3QgY2hh ciAqKTsKZXh0ZXJuIGludCBzdHJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwpleHRl cm4gY2hhciAqc3RyY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZXh0ZXJuIGludCBzdHJjb2xs KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZXh0ZXJuIHNpemVfdCBzdHJjc3BuKGNvbnN0 IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZXh0ZXJuIGNoYXIgKnN0cmVycm9yKGludCk7CmV4dGVy biBzaXplX3Qgc3RybGVuKGNvbnN0IGNoYXIgKik7CmV4dGVybiBjaGFyICpzdHJuY2F0KGNoYXIg KiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwpleHRlcm4gaW50IHN0cm5jbXAoY29uc3QgY2hhciAq LCBjb25zdCBjaGFyICosIHNpemVfdCk7CmV4dGVybiBjaGFyICpzdHJuY3B5KGNoYXIgKiwgY29u c3QgY2hhciAqLCBzaXplX3QpOwpleHRlcm4gc2l6ZV90IHN0cnNwbihjb25zdCBjaGFyICosIGNv bnN0IGNoYXIgKik7CmV4dGVybiBjaGFyICpzdHJ0b2soY2hhciAqLCBjb25zdCBjaGFyICopOwpl eHRlcm4gc2l6ZV90IHN0cnhmcm0oY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CiMgMTEx ICIvdXNyL2luY2x1ZGUvaXNvL3N0cmluZ19pc28uaCIgMyA0CgpleHRlcm4gdm9pZCAqbWVtY2hy KGNvbnN0IHZvaWQgKiwgaW50LCBzaXplX3QpOwpleHRlcm4gY2hhciAqc3RyY2hyKGNvbnN0IGNo YXIgKiwgaW50KTsKZXh0ZXJuIGNoYXIgKnN0cnBicmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFy ICopOwpleHRlcm4gY2hhciAqc3RycmNocihjb25zdCBjaGFyICosIGludCk7CmV4dGVybiBjaGFy ICpzdHJzdHIoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwoKCiMgMTQ0ICIvdXNyL2luY2x1 ZGUvaXNvL3N0cmluZ19pc28uaCIgMyA0CgoKCgoKCgp9CgoKCiMgMTggIi91c3IvaW5jbHVkZS9z dHJpbmcuaCIgMiAzIDQKCgogCgoKCiMgNDggIi91c3IvaW5jbHVkZS9zdHJpbmcuaCIgMyA0CgoK CmV4dGVybiAiQyIgewoKCgoKCgpleHRlcm4gY2hhciAqc3RydG9rX3IoY2hhciAqLCBjb25zdCBj aGFyICosIGNoYXIgKiopOwoKCgoKZXh0ZXJuIHZvaWQgKm1lbWNjcHkodm9pZCAqLCBjb25zdCB2 b2lkICosIGludCwgc2l6ZV90KTsKCgoKCmV4dGVybiBjaGFyICpzdHJzaWduYWwoaW50KTsKZXh0 ZXJuIGludCBmZnMoaW50KTsKZXh0ZXJuIGludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29u c3QgY2hhciAqKTsKZXh0ZXJuIGludCBzdHJuY2FzZWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNo YXIgKiwgc2l6ZV90KTsKZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAq LCBzaXplX3QpOwpleHRlcm4gc2l6ZV90IHN0cmxjYXQoY2hhciAqLCBjb25zdCBjaGFyICosIHNp emVfdCk7CgoKCgoKZXh0ZXJuIGNoYXIgKnN0cmR1cChjb25zdCBjaGFyICopOwoKCiMgMTEwICIv dXNyL2luY2x1ZGUvc3RyaW5nLmgiIDMgNAoKCgp9CgoKCiMgMTcgIi4uLy4uL2xpYi9zeXNkZXAu aCIgMgoKCiAKZXh0ZXJuIHZvaWQgQWJvcnQoKTsKZXh0ZXJuIHZvaWQgRXhpdChpbnQgZXhpdENv ZGUpOwpleHRlcm4gdm9pZCBEZWxheShpbnQgc2Vjb25kcyk7CgogCmV4dGVybiB2b2lkIENhbGxP blVzZXJBYm9ydCh2b2lkICgqY2xlYW51cCkoaW50KSk7CgogCmV4dGVybiB2b2lkIFJhbmRvbUlu aXQodW5zaWduZWQgc2VlZCk7CmV4dGVybiB1bnNpZ25lZCBpbnQgUmFuZG9tTnVtYmVyKCk7Cgog CiAKZXh0ZXJuIGNoYXIgKkFsbG9jQm91bmRlZEFycmF5KGludCBzaXplKTsKZXh0ZXJuIHZvaWQg RGVhbGxvY0JvdW5kZWRBcnJheShjaGFyICpwLCBpbnQgc2l6ZSk7CgogCiAKZXh0ZXJuIGJvb2wg UG9sbEZpbGUoaW50IGZkKTsKCiAKIApleHRlcm4gaW50IE9wZW5Gb3JXcml0ZShjaGFyICpuYW1l KTsKZXh0ZXJuIGludCBPcGVuRm9yUmVhZFdyaXRlKGNoYXIgKm5hbWUsIGJvb2wgY3Jhc2hPbkVy cm9yKTsKZXh0ZXJuIHZvaWQgUmVhZChpbnQgZmQsIGNoYXIgKmJ1ZmZlciwgaW50IG5CeXRlcyk7 CmV4dGVybiBpbnQgUmVhZFBhcnRpYWwoaW50IGZkLCBjaGFyICpidWZmZXIsIGludCBuQnl0ZXMp OwpleHRlcm4gdm9pZCBXcml0ZUZpbGUoaW50IGZkLCBjaGFyICpidWZmZXIsIGludCBuQnl0ZXMp OwpleHRlcm4gdm9pZCBMc2VlayhpbnQgZmQsIGludCBvZmZzZXQsIGludCB3aGVuY2UpOwpleHRl cm4gaW50IFRlbGwoaW50IGZkKTsKZXh0ZXJuIHZvaWQgQ2xvc2UoaW50IGZkKTsKZXh0ZXJuIGJv b2wgVW5saW5rKGNoYXIgKm5hbWUpOwoKIAogCmV4dGVybiAiQyIgewppbnQgYXRvaShjb25zdCBj aGFyICpzdHIpOwpkb3VibGUgYXRvZihjb25zdCBjaGFyICpzdHIpOwppbnQgYWJzKGludCBpKTsK fQoKIyA2OSAiLi4vLi4vbGliL3N5c2RlcC5oIgoKCgoKCgoKCiMgMTggIi4uLy4uL2xpYi9kZWJ1 Zy5oIiAyCgoKIAoKY29uc3QgY2hhciBkYmdBbGwgPSAnKyc7CQkgCmNvbnN0IGNoYXIgZGJnVGhy ZWFkID0gJ3QnOwkJIApjb25zdCBjaGFyIGRiZ1N5bmNoID0gJ3MnOwkJIApjb25zdCBjaGFyIGRi Z0ludCA9ICdpJzsgCQkgCmNvbnN0IGNoYXIgZGJnTWFjaCA9ICdtJzsgCQkgCmNvbnN0IGNoYXIg ZGJnRGlzayA9ICdkJzsgCQkgCmNvbnN0IGNoYXIgZGJnRmlsZSA9ICdmJzsgCQkgCmNvbnN0IGNo YXIgZGJnQWRkciA9ICdhJzsgCQkgCmNvbnN0IGNoYXIgZGJnTmV0ID0gJ24nOyAJCSAKCmNsYXNz IERlYnVnIHsKICBwdWJsaWM6CiAgICBEZWJ1ZyhjaGFyICpmbGFnTGlzdCk7CgogICAgYm9vbCBJ c0VuYWJsZWQoY2hhciBmbGFnKTsKCiAgcHJpdmF0ZToKICAgIGNoYXIgKmVuYWJsZUZsYWdzOwkJ IAp9OwoKZXh0ZXJuIERlYnVnICpkZWJ1ZzsKCgogCiAKIAogCgoKCgogCiAKIAogCiAKIAogCiAK CgoKCgoKIAogCiAKIAogCiAKIAogCiAKCgoKCgoKCgojIDE3ICIuLi8uLi9saWIvbGlzdC5oIiAy CgoKIAogCiAKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIFQ+CmNsYXNzIExpc3RFbGVtZW50IHsK ICBwdWJsaWM6CiAgICBMaXN0RWxlbWVudChUIGl0bSk7IAkgCiAgICBMaXN0RWxlbWVudCAqbmV4 dDsJICAgICAJIAogICAgVCBpdGVtOyAJICAgCSAgICAgCSAKfTsKCiAKIAogCiAKIAoKdGVtcGxh dGUgPGNsYXNzIFQ+CmNsYXNzIExpc3RJdGVyYXRvcjsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFz cyBMaXN0IHsKICBwdWJsaWM6CiAgICBMaXN0KCk7CQkJIAogICAgdmlydHVhbCB+TGlzdCgpOwkJ IAoKICAgIHZpcnR1YWwgdm9pZCBQcmVwZW5kKFQgaXRlbSk7IAogICAgdmlydHVhbCB2b2lkIEFw cGVuZChUIGl0ZW0pOyAgCgogICAgVCBGcm9udCgpIHsgcmV0dXJuIGZpcnN0LT5pdGVtOyB9CiAg ICAJCQkJIAoJCQkJIAogICAgVCBSZW1vdmVGcm9udCgpOyAJCSAKICAgIHZvaWQgUmVtb3ZlKFQg aXRlbSk7IAkgCgogICAgYm9vbCBJc0luTGlzdChUIGl0ZW0pIGNvbnN0OyAKCiAgICB1bnNpZ25l ZCBpbnQgTnVtSW5MaXN0KCkgeyByZXR1cm4gbnVtSW5MaXN0O307CiAgICAJCQkJIAogICAgYm9v bCBJc0VtcHR5KCkgeyByZXR1cm4gKG51bUluTGlzdCA9PSAwKTsgfTsKICAgIAkJCQkgCgogICAg dm9pZCBBcHBseSh2b2lkICgqZikoVCkpIGNvbnN0OyAKICAgIAkJCQkgCgogICAgdmlydHVhbCB2 b2lkIFNhbml0eUNoZWNrKCkgY29uc3Q7CQoJCQkJIAogICAgdm9pZCBTZWxmVGVzdChUICpwLCBp bnQgbnVtRW50cmllcyk7CgkJCQkgCgogIHByb3RlY3RlZDoKICAgIExpc3RFbGVtZW50PFQ+ICpm aXJzdDsgIAkgCiAgICBMaXN0RWxlbWVudDxUPiAqbGFzdDsJIAogICAgaW50IG51bUluTGlzdDsJ CSAKCmZyaWVuZCBMaXN0SXRlcmF0b3I8VD47Cn07CgogCiAKIAogCiAKIAogCiAKIAoKdGVtcGxh dGUgPGNsYXNzIFQ+CmNsYXNzIFNvcnRlZExpc3QgOiBwdWJsaWMgTGlzdDxUPiB7CiAgcHVibGlj OgogICAgU29ydGVkTGlzdChpbnQgKCpjb21wKShUIHgsIFQgeSkpIDogTGlzdDxUPigpIHsgY29t cGFyZSA9IGNvbXA7fTsKICAgIH5Tb3J0ZWRMaXN0KCkge307CQkgCgogICAgdm9pZCBJbnNlcnQo VCBpdGVtKTsgCSAKCiAgICB2b2lkIFNhbml0eUNoZWNrKCkgY29uc3Q7CSAKICAgIHZvaWQgU2Vs ZlRlc3QoVCAqcCwgaW50IG51bUVudHJpZXMpOwoJCQkJIAoKICBwcml2YXRlOgogICAgaW50ICgq Y29tcGFyZSkoVCB4LCBUIHkpOwkgCgogICAgdm9pZCBQcmVwZW5kKFQgaXRlbSkgeyBJbnNlcnQo aXRlbSk7IH0gICAKCQkJCSAgICAgICAgICAgICAgCiAgICB2b2lkIEFwcGVuZChUIGl0ZW0pIHsg SW5zZXJ0KGl0ZW0pOyB9ICAgIAoKfTsKCiAKIAogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBU PgpjbGFzcyBMaXN0SXRlcmF0b3IgewogIHB1YmxpYzoKICAgIExpc3RJdGVyYXRvcihMaXN0PFQ+ ICpsaXN0KSB7IGN1cnJlbnQgPSBsaXN0LT5maXJzdDsgfSAKCQkJCSAKCiAgICBib29sIElzRG9u ZSgpIHsgcmV0dXJuIGN1cnJlbnQgPT0gMCA7IH07CgkJCQkgCgogICAgVCBJdGVtKCkgeyBpZiAo ICFJc0RvbmUoKSApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQg ZmlsZSAlc1xuIiwgMTMwLCAiLi4vLi4vbGliL2xpc3QuaCIpOyBBYm9ydCgpOyB9IDsgcmV0dXJu IGN1cnJlbnQtPml0ZW07IH07CgkJCQkgCgogICAgdm9pZCBOZXh0KCkgeyBjdXJyZW50ID0gY3Vy cmVudC0+bmV4dDsgfTsJCQoJCQkJIAoKICBwcml2YXRlOgogICAgTGlzdEVsZW1lbnQ8VD4gKmN1 cnJlbnQ7CSAKfTsKCiMgMSAiLi4vLi4vbGliL2xpc3QuY2MiIDEKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCgojIDEgIi4uLy4uL2xpYi9jb3B5cmlnaHQuaCIgMQogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKIyAxOSAiLi4vLi4vbGliL2xpc3QuY2MiIDIKCgogCiAKIAogCiAKIAoK dGVtcGxhdGUgPGNsYXNzIFQ+Ckxpc3RFbGVtZW50PFQ+OjpMaXN0RWxlbWVudChUIGl0bSkKewog ICAgIGl0ZW0gPSBpdG07CiAgICAgbmV4dCA9IDAgOwkgCn0KCgogCiAKIAogCiAKCnRlbXBsYXRl IDxjbGFzcyBUPgpMaXN0PFQ+OjpMaXN0KCkKeyAKICAgIGZpcnN0ID0gbGFzdCA9IDAgOyAKICAg IG51bUluTGlzdCA9IDA7Cn0KCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBUPgpMaXN0PFQ+Ojp+ TGlzdCgpCnsgCiAgICBpZiAoIElzRW1wdHkoKSApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlv biBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgNTcsICIuLi8uLi9saWIvbGlzdC5jYyIpOyBB Ym9ydCgpOyB9IDsJCSAKfQoKIAogCiAKIAogCiAKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIFQ+ CnZvaWQKTGlzdDxUPjo6QXBwZW5kKFQgaXRlbSkKewogICAgTGlzdEVsZW1lbnQ8VD4gKmVsZW1l bnQgPSBuZXcgTGlzdEVsZW1lbnQ8VD4oaXRlbSk7CgogICAgaWYgKCAhSXNJbkxpc3QoaXRlbSkg KSB7fSBlbHNlIHsgcHJpbnRmKCJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZpbGUgJXNcbiIs IDc3LCAiLi4vLi4vbGliL2xpc3QuY2MiKTsgQWJvcnQoKTsgfSA7CiAgICBpZiAoSXNFbXB0eSgp KSB7CQkgCglmaXJzdCA9IGVsZW1lbnQ7CglsYXN0ID0gZWxlbWVudDsKICAgIH0gZWxzZSB7CQkJ IAoJbGFzdC0+bmV4dCA9IGVsZW1lbnQ7CglsYXN0ID0gZWxlbWVudDsKICAgIH0KICAgIG51bUlu TGlzdCsrOwogICAgaWYgKCBJc0luTGlzdChpdGVtKSApIHt9IGVsc2UgeyBwcmludGYoIkFzc2Vy dGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgODYsICIuLi8uLi9saWIvbGlzdC5jYyIp OyBBYm9ydCgpOyB9IDsKfQoKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIFQ+CnZvaWQKTGlzdDxU Pjo6UHJlcGVuZChUIGl0ZW0pCnsKICAgIExpc3RFbGVtZW50PFQ+ICplbGVtZW50ID0gbmV3IExp c3RFbGVtZW50PFQ+KGl0ZW0pOwoKICAgIGlmICggIUlzSW5MaXN0KGl0ZW0pICkge30gZWxzZSB7 IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAxMDAsICIuLi8u Li9saWIvbGlzdC5jYyIpOyBBYm9ydCgpOyB9IDsKICAgIGlmIChJc0VtcHR5KCkpIHsJCSAKCWZp cnN0ID0gZWxlbWVudDsKCWxhc3QgPSBlbGVtZW50OwogICAgfSBlbHNlIHsJCQkgCgllbGVtZW50 LT5uZXh0ID0gZmlyc3Q7CglmaXJzdCA9IGVsZW1lbnQ7CiAgICB9CiAgICBudW1Jbkxpc3QrKzsK ICAgIGlmICggSXNJbkxpc3QoaXRlbSkgKSB7fSBlbHNlIHsgcHJpbnRmKCJBc3NlcnRpb24gZmFp bGVkOiBsaW5lICVkIGZpbGUgJXNcbiIsIDEwOSwgIi4uLy4uL2xpYi9saXN0LmNjIik7IEFib3J0 KCk7IH0gOwp9CgogCiAKIAogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBUPgpUCkxpc3Q8VD46 OlJlbW92ZUZyb250KCkKewogICAgTGlzdEVsZW1lbnQ8VD4gKmVsZW1lbnQgPSBmaXJzdDsKICAg IFQgdGhpbmc7CgogICAgaWYgKCAhSXNFbXB0eSgpICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0 aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAxMjgsICIuLi8uLi9saWIvbGlzdC5jYyIp OyBBYm9ydCgpOyB9IDsKCiAgICB0aGluZyA9IGZpcnN0LT5pdGVtOwogICAgaWYgKGZpcnN0ID09 IGxhc3QpIHsJIAogICAgICAgIGZpcnN0ID0gMCA7CglsYXN0ID0gMCA7CiAgICB9IGVsc2Ugewog ICAgICAgIGZpcnN0ID0gZWxlbWVudC0+bmV4dDsKICAgIH0KICAgIG51bUluTGlzdC0tOwogICAg ZGVsZXRlIGVsZW1lbnQ7CiAgICByZXR1cm4gdGhpbmc7Cn0KCiAKIAogCiAKCnRlbXBsYXRlIDxj bGFzcyBUPgp2b2lkCkxpc3Q8VD46OlJlbW92ZShUIGl0ZW0pCnsKICAgIExpc3RFbGVtZW50PFQ+ ICpwcmV2LCAqcHRyOwogICAgVCByZW1vdmVkOwoKICAgIGlmICggSXNJbkxpc3QoaXRlbSkgKSB7 fSBlbHNlIHsgcHJpbnRmKCJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZpbGUgJXNcbiIsIDE1 NCwgIi4uLy4uL2xpYi9saXN0LmNjIik7IEFib3J0KCk7IH0gOwoKICAgICAKICAgIGlmIChpdGVt ID09IGZpcnN0LT5pdGVtKSB7CQogICAgICAgIHJlbW92ZWQgPSBSZW1vdmVGcm9udCgpOwogICAg ICAgIGlmICggaXRlbSA9PSByZW1vdmVkICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZh aWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAxNTksICIuLi8uLi9saWIvbGlzdC5jYyIpOyBBYm9y dCgpOyB9IDsKICAgIH0gZWxzZSB7CglwcmV2ID0gZmlyc3Q7CiAgICAgICAgZm9yIChwdHIgPSBm aXJzdC0+bmV4dDsgcHRyICE9IDAgOyBwcmV2ID0gcHRyLCBwdHIgPSBwdHItPm5leHQpIHsKICAg ICAgICAgICAgaWYgKGl0ZW0gPT0gcHRyLT5pdGVtKSB7CgkJcHJldi0+bmV4dCA9IHB0ci0+bmV4 dDsKCQlpZiAocHJldi0+bmV4dCA9PSAwICkgewoJCSAgICBsYXN0ID0gcHJldjsKCQl9CgkJZGVs ZXRlIHB0cjsKCQludW1Jbkxpc3QtLTsKCQlicmVhazsKCSAgICB9CiAgICAgICAgfQoJaWYgKCBw dHIgIT0gMCAgKSB7fSBlbHNlIHsgcHJpbnRmKCJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZp bGUgJXNcbiIsIDE3MywgIi4uLy4uL2xpYi9saXN0LmNjIik7IEFib3J0KCk7IH0gOwkgCiAgICB9 CiAgIGlmICggIUlzSW5MaXN0KGl0ZW0pICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZh aWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAxNzUsICIuLi8uLi9saWIvbGlzdC5jYyIpOyBBYm9y dCgpOyB9IDsKfQoKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIFQ+CmJvb2wKTGlzdDxUPjo6SXNJ bkxpc3QoVCBpdGVtKSBjb25zdAp7IAogICAgTGlzdEVsZW1lbnQ8VD4gKnB0cjsKCiAgICBmb3Ig KHB0ciA9IGZpcnN0OyBwdHIgIT0gMCA7IHB0ciA9IHB0ci0+bmV4dCkgewogICAgICAgIGlmIChp dGVtID09IHB0ci0+aXRlbSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZSA7CiAgICAgICAgfQog ICAgfQogICAgcmV0dXJuIGZhbHNlIDsKfQoKCiAKIAogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3Mg VD4Kdm9pZApMaXN0PFQ+OjpBcHBseSh2b2lkICgqZnVuYykoVCkpIGNvbnN0CnsgCiAgICBMaXN0 RWxlbWVudDxUPiAqcHRyOwoKICAgIGZvciAocHRyID0gZmlyc3Q7IHB0ciAhPSAwIDsgcHRyID0g cHRyLT5uZXh0KSB7CiAgICAgICAgKCpmdW5jKShwdHItPml0ZW0pOwogICAgfQp9CgoKIAogCiAK IAogCiAKIAogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkClNvcnRlZExpc3Q8VD46 Okluc2VydChUIGl0ZW0pCnsKICAgIExpc3RFbGVtZW50PFQ+ICplbGVtZW50ID0gbmV3IExpc3RF bGVtZW50PFQ+KGl0ZW0pOwogICAgTGlzdEVsZW1lbnQ8VD4gKnB0cjsJCSAKCiAgICBpZiAoICFJ c0luTGlzdChpdGVtKSApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUg JWQgZmlsZSAlc1xuIiwgMjM3LCAiLi4vLi4vbGliL2xpc3QuY2MiKTsgQWJvcnQoKTsgfSA7CiAg ICBpZiAoSXNFbXB0eSgpKSB7CQkJIAogICAgICAgIGZpcnN0ID0gZWxlbWVudDsKICAgICAgICBs YXN0ID0gZWxlbWVudDsKICAgIH0gZWxzZSBpZiAoY29tcGFyZShpdGVtLCBmaXJzdC0+aXRlbSkg PCAwKSB7ICAgCgllbGVtZW50LT5uZXh0ID0gZmlyc3Q7CglmaXJzdCA9IGVsZW1lbnQ7CiAgICB9 IGVsc2UgewkJIAogICAgICAgIGZvciAocHRyID0gZmlyc3Q7IHB0ci0+bmV4dCAhPSAwIDsgcHRy ID0gcHRyLT5uZXh0KSB7CiAgICAgICAgICAgIGlmIChjb21wYXJlKGl0ZW0sIHB0ci0+bmV4dC0+ aXRlbSkgPCAwKSB7CgkJZWxlbWVudC0+bmV4dCA9IHB0ci0+bmV4dDsKCSAgICAgICAgcHRyLT5u ZXh0ID0gZWxlbWVudDsKCQludW1Jbkxpc3QrKzsKCQlyZXR1cm47CgkgICAgfQoJfQoJbGFzdC0+ bmV4dCA9IGVsZW1lbnQ7CQkgCglsYXN0ID0gZWxlbWVudDsKICAgIH0KICAgIG51bUluTGlzdCsr OwogICAgaWYgKCBJc0luTGlzdChpdGVtKSApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBm YWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMjU3LCAiLi4vLi4vbGliL2xpc3QuY2MiKTsgQWJv cnQoKTsgfSA7Cn0KCiAKIAogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBUPgp2b2lkIApMaXN0 PFQ+OjpTYW5pdHlDaGVjaygpIGNvbnN0CnsKICAgIExpc3RFbGVtZW50PFQ+ICpwdHI7CiAgICBp bnQgbnVtRm91bmQ7CgogICAgaWYgKGZpcnN0ID09IDAgKSB7CglpZiAoIChudW1Jbkxpc3QgPT0g MCkgJiYgKGxhc3QgPT0gMCApICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDog bGluZSAlZCBmaWxlICVzXG4iLCAyNzYsICIuLi8uLi9saWIvbGlzdC5jYyIpOyBBYm9ydCgpOyB9 IDsKICAgIH0gZWxzZSBpZiAoZmlyc3QgPT0gbGFzdCkgewoJaWYgKCAobnVtSW5MaXN0ID09IDEp ICYmIChsYXN0LT5uZXh0ID09IDAgKSApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWls ZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMjc4LCAiLi4vLi4vbGliL2xpc3QuY2MiKTsgQWJvcnQo KTsgfSA7CiAgICB9IGVsc2UgewogICAgICAgIGZvciAobnVtRm91bmQgPSAxLCBwdHIgPSBmaXJz dDsgcHRyICE9IGxhc3Q7IHB0ciA9IHB0ci0+bmV4dCkgewoJICAgIG51bUZvdW5kKys7CiAgICAg ICAgICAgIGlmICggbnVtRm91bmQgPD0gbnVtSW5MaXN0ICkge30gZWxzZSB7IHByaW50ZigiQXNz ZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAyODIsICIuLi8uLi9saWIvbGlzdC5j YyIpOyBBYm9ydCgpOyB9IDsJIAogICAgICAgIH0KICAgICAgICBpZiAoIG51bUZvdW5kID09IG51 bUluTGlzdCApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmls ZSAlc1xuIiwgMjg0LCAiLi4vLi4vbGliL2xpc3QuY2MiKTsgQWJvcnQoKTsgfSA7CiAgICAgICAg aWYgKCBsYXN0LT5uZXh0ID09IDAgICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxl ZDogbGluZSAlZCBmaWxlICVzXG4iLCAyODUsICIuLi8uLi9saWIvbGlzdC5jYyIpOyBBYm9ydCgp OyB9IDsKICAgIH0KfQoKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIFQ+CnZvaWQgCkxpc3Q8VD46 OlNlbGZUZXN0KFQgKnAsIGludCBudW1FbnRyaWVzKQp7CiAgICBpbnQgaTsKICAgIExpc3RJdGVy YXRvcjxUPiAqaXRlcmF0b3IgPSBuZXcgTGlzdEl0ZXJhdG9yPFQ+KHRoaXMpOwoKICAgIFNhbml0 eUNoZWNrKCk7CiAgICAgCiAgICBpZiAoIElzRW1wdHkoKSAmJiAoZmlyc3QgPT0gMCApICkge30g ZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAzMDMs ICIuLi8uLi9saWIvbGlzdC5jYyIpOyBBYm9ydCgpOyB9IDsKICAgIGZvciAoOyAhaXRlcmF0b3It PklzRG9uZSgpOyBpdGVyYXRvci0+TmV4dCgpKSB7Cgl7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxl ZDogbGluZSAlZCBmaWxlICVzXG4iLCAzMDUsICIuLi8uLi9saWIvbGlzdC5jYyIpOyBBYm9ydCgp OyB9IDsJIAogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKCSBB cHBlbmQocFtpXSk7CgkgaWYgKCBJc0luTGlzdChwW2ldKSApIHt9IGVsc2UgeyBwcmludGYoIkFz c2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMzEwLCAiLi4vLi4vbGliL2xpc3Qu Y2MiKTsgQWJvcnQoKTsgfSA7CgkgaWYgKCAhSXNFbXB0eSgpICkge30gZWxzZSB7IHByaW50Zigi QXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAzMTEsICIuLi8uLi9saWIvbGlz dC5jYyIpOyBBYm9ydCgpOyB9IDsKICAgICB9CiAgICAgU2FuaXR5Q2hlY2soKTsKCiAgICAgIAog ICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKCSBSZW1vdmUocFtpXSk7CiAg ICAgICAgIGlmICggIUlzSW5MaXN0KHBbaV0pICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9u IGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAzMTgsICIuLi8uLi9saWIvbGlzdC5jYyIpOyBB Ym9ydCgpOyB9IDsKICAgICB9CiAgICAgaWYgKCBJc0VtcHR5KCkgKSB7fSBlbHNlIHsgcHJpbnRm KCJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZpbGUgJXNcbiIsIDMyMCwgIi4uLy4uL2xpYi9s aXN0LmNjIik7IEFib3J0KCk7IH0gOwogICAgIFNhbml0eUNoZWNrKCk7CiAgICAgZGVsZXRlIGl0 ZXJhdG9yOwp9CgogCiAKIAogCiAKIAoKdGVtcGxhdGUgPGNsYXNzIFQ+CnZvaWQgClNvcnRlZExp c3Q8VD46OlNhbml0eUNoZWNrKCkgY29uc3QKewogICAgTGlzdEVsZW1lbnQ8VD4gKnByZXYsICpw dHI7CgogICAgTGlzdDxUPjo6U2FuaXR5Q2hlY2soKTsKICAgIGlmIChmaXJzdCAhPSBsYXN0KSB7 CiAgICAgICAgZm9yIChwcmV2ID0gZmlyc3QsIHB0ciA9IGZpcnN0LT5uZXh0OyBwdHIgIT0gMCA7 IAoJCQkJCQlwcmV2ID0gcHRyLCBwdHIgPSBwdHItPm5leHQpIHsKICAgICAgICAgICAgaWYgKCBj b21wYXJlKHByZXYtPml0ZW0sIHB0ci0+aXRlbSkgPD0gMCApIHt9IGVsc2UgeyBwcmludGYoIkFz c2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMzQyLCAiLi4vLi4vbGliL2xpc3Qu Y2MiKTsgQWJvcnQoKTsgfSA7CiAgICAgICAgfQogICAgfQp9CgogCiAKIAogCgp0ZW1wbGF0ZSA8 Y2xhc3MgVD4Kdm9pZCAKU29ydGVkTGlzdDxUPjo6U2VsZlRlc3QoVCAqcCwgaW50IG51bUVudHJp ZXMpCnsKICAgIGludCBpOwogICAgVCAqcSA9IG5ldyBUW251bUVudHJpZXNdOwoKICAgIExpc3Q8 VD46OlNlbGZUZXN0KHAsIG51bUVudHJpZXMpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbnRy aWVzOyBpKyspIHsKCSBJbnNlcnQocFtpXSk7CgkgaWYgKCBJc0luTGlzdChwW2ldKSApIHt9IGVs c2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMzYzLCAi Li4vLi4vbGliL2xpc3QuY2MiKTsgQWJvcnQoKTsgfSA7CiAgICAgfQogICAgIFNhbml0eUNoZWNr KCk7CgogICAgICAKICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSsrKSB7CgkgcVtp XSA9IFJlbW92ZUZyb250KCk7CiAgICAgICAgIGlmICggIUlzSW5MaXN0KHFbaV0pICkge30gZWxz ZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAzNzAsICIu Li8uLi9saWIvbGlzdC5jYyIpOyBBYm9ydCgpOyB9IDsKICAgICB9CiAgICAgaWYgKCBJc0VtcHR5 KCkgKSB7fSBlbHNlIHsgcHJpbnRmKCJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZpbGUgJXNc biIsIDM3MiwgIi4uLy4uL2xpYi9saXN0LmNjIik7IEFib3J0KCk7IH0gOwoKICAgICAgCiAgICAg Zm9yIChpID0gMDsgaSA8IChudW1FbnRyaWVzIC0gMSk7IGkrKykgewoJIGlmICggY29tcGFyZShx W2ldLCBxW2kgKyAxXSkgPD0gMCApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6 IGxpbmUgJWQgZmlsZSAlc1xuIiwgMzc2LCAiLi4vLi4vbGliL2xpc3QuY2MiKTsgQWJvcnQoKTsg fSA7CiAgICAgfQogICAgIFNhbml0eUNoZWNrKCk7CgogICAgIGRlbGV0ZSBxOwp9CiMgMTQwICIu Li8uLi9saWIvbGlzdC5oIiAyCgoJCQkJIAoJCQkJIAoKIyAzOSAiL3Vzci9jbGFzcy9jczE0MC9u YWNob3MvbWFjaGluZS9pbnRlcnJ1cHQuaCIgMgoKIyAxICIvdXNyL2NsYXNzL2NzMTQwL25hY2hv cy9tYWNoaW5lL2NhbGxiYWNrLmgiIDEKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKCgoKCiMgMSAiLi4vLi4vbGliL2NvcHlyaWdodC5oIiAxCiAKCgoKCgoK CgoKCgoKCgoKCgoKCgoKCgojIDI5ICIvdXNyL2NsYXNzL2NzMTQwL25hY2hvcy9tYWNoaW5lL2Nh bGxiYWNrLmgiIDIKCgogCgpjbGFzcyBDYWxsQmFja09iaiB7CiAgIHB1YmxpYzoKICAgICB2aXJ0 dWFsIHZvaWQgQ2FsbEJhY2soKSA9IDA7CiAgIHByb3RlY3RlZDoKICAgICBDYWxsQmFja09iaigp IHt9OwkgCgkJCQkgCgkJCQkgCgkJCQkgCiAgICAgdmlydHVhbCB+Q2FsbEJhY2tPYmooKSB7fTsK fTsKCgojIDQwICIvdXNyL2NsYXNzL2NzMTQwL25hY2hvcy9tYWNoaW5lL2ludGVycnVwdC5oIiAy CgoKIAplbnVtIEludFN0YXR1cyB7IEludE9mZiwgSW50T24gfTsKCiAKIAogCmVudW0gTWFjaGlu ZVN0YXR1cyB7SWRsZU1vZGUsIFN5c3RlbU1vZGUsIFVzZXJNb2RlfTsKCiAKIAogCmVudW0gSW50 VHlwZSB7IFRpbWVySW50LCBEaXNrSW50LCBDb25zb2xlV3JpdGVJbnQsIENvbnNvbGVSZWFkSW50 LCAKCQkJRWxldmF0b3JJbnQsIE5ldHdvcmtTZW5kSW50LCBOZXR3b3JrUmVjdkludH07CgogCiAK IAoKY2xhc3MgUGVuZGluZ0ludGVycnVwdCB7CiAgcHVibGljOgogICAgUGVuZGluZ0ludGVycnVw dChDYWxsQmFja09iaiAqY2FsbE9uSW50LCBpbnQgdGltZSwgSW50VHlwZSBraW5kKTsKCQkJCSAK CQkJCSAKCiAgICBDYWxsQmFja09iaiAqY2FsbE9uSW50ZXJydXB0OyAKCQkJCSAKICAgIAogICAg aW50IHdoZW47CQkJIAogICAgSW50VHlwZSB0eXBlOwkJIAp9OwoKIAogCiAKIAoKY2xhc3MgSW50 ZXJydXB0IHsKICBwdWJsaWM6CiAgICBJbnRlcnJ1cHQoKTsJCSAKICAgIH5JbnRlcnJ1cHQoKTsJ CSAKICAgIAogICAgSW50U3RhdHVzIFNldExldmVsKEludFN0YXR1cyBsZXZlbCk7CiAgICAJCQkJ IAoJCQkJIAoKICAgIHZvaWQgRW5hYmxlKCkgeyAodm9pZCkgU2V0TGV2ZWwoSW50T24pOyB9CgkJ CQkgCiAgICBJbnRTdGF0dXMgZ2V0TGV2ZWwoKSB7cmV0dXJuIGxldmVsO30KICAgIAkJCQkgCgkJ CQkgCiAgICAKICAgIHZvaWQgSWRsZSgpOyAJCSAKCQkJCSAKCQkJCSAKCiAgICB2b2lkIEhhbHQo KTsgCQkgCiAgICAKICAgIHZvaWQgWWllbGRPblJldHVybigpOwkgCgkJCQkgCgogICAgTWFjaGlu ZVN0YXR1cyBnZXRTdGF0dXMoKSB7IHJldHVybiBzdGF0dXM7IH0gCiAgICB2b2lkIHNldFN0YXR1 cyhNYWNoaW5lU3RhdHVzIHN0KSB7IHN0YXR1cyA9IHN0OyB9CiAgICAgICAgCQkJIAoKICAgIGJv b2wgQW55RnV0dXJlSW50ZXJydXB0cygpIHsgcmV0dXJuICFwZW5kaW5nLT5Jc0VtcHR5KCk7IH0K ICAgIAkJCQkgCgogICAgdm9pZCBEdW1wU3RhdGUoKTsJCSAKICAgIAoKICAgICAKICAgICAKICAg ICAKICAgICAKCiAgICB2b2lkIFNjaGVkdWxlKENhbGxCYWNrT2JqICpjYWxsVG8sIGludCB3aGVu LCBJbnRUeXBlIHR5cGUpOwogICAgCQkJCSAKCQkJCSAKICAgIAkJCQkgCiAgICAKICAgIHZvaWQg T25lVGljaygpOyAgICAgICAJIAoKICAgIGJvb2wgSW5IYW5kbGVyKCkge3JldHVybiBpbkhhbmRs ZXI7fQoKICBwcml2YXRlOgogICAgSW50U3RhdHVzIGxldmVsOwkJIAogICAgU29ydGVkTGlzdDxQ ZW5kaW5nSW50ZXJydXB0ICo+ICpwZW5kaW5nOwkJCiAgICAJCQkJIAoJCQkJIAogICAgYm9vbCBp bkhhbmRsZXI7CQkgCiAgICBib29sIHlpZWxkT25SZXR1cm47IAkgCgkJCQkgCiAgICBNYWNoaW5l U3RhdHVzIHN0YXR1czsJIAoKICAgICAKCiAgICBib29sIENoZWNrSWZEdWUoYm9vbCBhZHZhbmNl Q2xvY2spOyAKICAgIAkJCQkgCgkJCQkgCgogICAgdm9pZCBDaGFuZ2VMZXZlbChJbnRTdGF0dXMg b2xkLCAJIAoJCQlJbnRTdGF0dXMgbm93KTsgIAp9OwoKCiMgMjQgIi91c3IvY2xhc3MvY3MxNDAv bmFjaG9zL21hY2hpbmUvaW50ZXJydXB0LmNjIiAyCgojIDEgIi4uLy4uL3RocmVhZHMvbWFpbi5o IiAxCiAKIAogCiAKIAogCiAKIAoKCgoKIyAxICIuLi8uLi9saWIvY29weXJpZ2h0LmgiIDEKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMTMgIi4uLy4uL3RocmVhZHMvbWFpbi5oIiAyCgoKCgoK CgoKIyAxICIuLi8uLi91c2VycHJvZy91c2Vya2VybmVsLmgiIDEKIAogCiAKIAogCiAKIAogCiAK IAogCgoKCgpjbGFzcyBVc2VyUHJvZ0tlcm5lbDsKCiMgMSAiLi4vLi4vdGhyZWFkcy9rZXJuZWwu aCIgMQogCiAKIAogCiAKIAogCgoKCgojIDEgIi4uLy4uL2xpYi9jb3B5cmlnaHQuaCIgMQogCgoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxMiAiLi4vLi4vdGhyZWFkcy9rZXJuZWwuaCIgMgoKCgoj IDEgIi4uLy4uL3RocmVhZHMvdGhyZWFkLmgiIDEKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCgoKCmNsYXNzIFRo cmVhZDsKIyAxICIuLi8uLi9jb25zdGFudHMuaCIgMQoKCgoKCgogCiAKCgogCiAKCgoKCgoKCgoj IDQyICIuLi8uLi90aHJlYWRzL3RocmVhZC5oIiAyCgoKCmNsYXNzIFNlbWFwaG9yZTsgICAgCgoK IyAxICIuLi8uLi9saWIvaGFzaC5oIiAxCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCgoKCgojIDEgIi4uLy4uL2xpYi9jb3B5cmlnaHQuaCIgMQog CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAzMiAiLi4vLi4vbGliL2hhc2guaCIgMgoKCgogCiAK IAoKdGVtcGxhdGUgPGNsYXNzIEtleSxjbGFzcyBUPgpjbGFzcyBIYXNoSXRlcmF0b3I7Cgp0ZW1w bGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPiAKY2xhc3MgSGFzaFRhYmxlIHsKICBwdWJsaWM6CiAg ICBIYXNoVGFibGUoS2V5ICgqZ2V0KShUIHgpLCB1bnNpZ25lZCAoKmhGdW5jKShLZXkgeCkpOwkK ICAgIAkJCQkgCiAgICB+SGFzaFRhYmxlKCk7CQkgCgogICAgdm9pZCBJbnNlcnQoVCBpdGVtKTsJ IAogICAgVCBSZW1vdmUoS2V5IGtleSk7CQkgCgogICAgYm9vbCBGaW5kKEtleSBrZXksIFQgKml0 ZW1QdHIpIGNvbnN0OyAKICAgIAkJCQkgCiAgICBib29sIElzSW5UYWJsZShLZXkga2V5KSB7IFQg ZHVtbXk7IHJldHVybiBGaW5kKGtleSwgJmR1bW15KTsgfSAJCgkJCQkgCgogICAgYm9vbCBJc0Vt cHR5KCkgeyByZXR1cm4gbnVtSXRlbXMgPT0gMDsgfQkKCQkJCSAKCiAgICB2b2lkIEFwcGx5KHZv aWQgKCpmKShUKSkgY29uc3Q7CiAgICAJCQkJIAoKICAgIHZvaWQgU2FuaXR5Q2hlY2soKSBjb25z dDsgCiAgICB2b2lkIFNlbGZUZXN0KFQgKnAsIGludCBudW1JdGVtcyk7CQogICAgCQkJCSAKCiAg cHJpdmF0ZToKdHlwZWRlZiBMaXN0PFQ+ICpCdWNrZXQ7CgogICAgQnVja2V0ICpidWNrZXRzOwkJ IAogICAgaW50IG51bUJ1Y2tldHM7CQkgCiAgICBpbnQgbnVtSXRlbXM7CQkgCiAgICAKICAgIEtl eSAoKmdldEtleSkoVCB4KTsJCSAKICAgIHVuc2lnbmVkICgqaGFzaCkoS2V5IHgpOwkgCgogICAg dm9pZCBJbml0QnVja2V0cyhpbnQgc2l6ZSk7IAogICAgdm9pZCBEZWxldGVCdWNrZXRzKEJ1Y2tl dCAqdGFibGUsIGludCBzaXplKTsKICAgIAkJCQkgCgkJCQkKICAgIGludCBIYXNoVmFsdWUoS2V5 IGtleSkgY29uc3Q7CiAgICAJCQkJIAoKICAgIHZvaWQgUmVIYXNoKCk7CQkgCiAgICAKICAgIGJv b2wgRmluZEluQnVja2V0KGludCBidWNrZXQsIEtleSBrZXksIFQgKml0ZW1QdHIpIGNvbnN0OyAK ICAgIAkJCQkgCiAgICBpbnQgRmluZE5leHRGdWxsQnVja2V0KGludCBzdGFydCkgY29uc3Q7CiAg ICAJCQkJIAoKZnJpZW5kIEhhc2hJdGVyYXRvcjxLZXksVD47Cn07CgogCiAKIAogCiAKIAogCgp0 ZW1wbGF0ZSA8Y2xhc3MgS2V5LGNsYXNzIFQ+CmNsYXNzIEhhc2hJdGVyYXRvciB7CiAgcHVibGlj OgogICAgSGFzaEl0ZXJhdG9yKEhhc2hUYWJsZTxLZXksVD4gKnRhYmxlKTsgIAogICAgfkhhc2hJ dGVyYXRvcigpIHsgaWYgKGJ1Y2tldEl0ZXIgIT0gMCApIGRlbGV0ZSBidWNrZXRJdGVyO307IAoJ CQkJIAoKICAgIGJvb2wgSXNEb25lKCkgeyByZXR1cm4gKGJ1Y2tldCA9PSB0YWJsZS0+bnVtQnVj a2V0cyk7IH07CgkJCQkgCiAgICBUIEl0ZW0oKSB7IGlmICggIUlzRG9uZSgpICkge30gZWxzZSB7 IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAxMTEsICIuLi8u Li9saWIvaGFzaC5oIik7IEFib3J0KCk7IH0gOyByZXR1cm4gYnVja2V0SXRlci0+SXRlbSgpOyB9 OyAKCQkJCSAKICAgIHZvaWQgTmV4dCgpOyAJCSAKCiAgcHJpdmF0ZTogICAKICAgIEhhc2hUYWJs ZTxLZXksVD4gKnRhYmxlOwkgCiAgICBpbnQgYnVja2V0OwkJCSAKICAgIExpc3RJdGVyYXRvcjxU PiAqYnVja2V0SXRlcjsgIAp9OwoKIyAxICIuLi8uLi9saWIvaGFzaC5jYyIgMQogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKCmNvbnN0IGludCBJbml0aWFsQnVja2V0cyA9IDQ7CSAKY29uc3Qg aW50IFJlc2l6ZVJhdGlvID0gMzsJIApjb25zdCBpbnQgSW5jcmVhc2VTaXplQnkgPSA0OwkgCgoj IDEgIi4uLy4uL2xpYi9jb3B5cmlnaHQuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAy MCAiLi4vLi4vbGliL2hhc2guY2MiIDIKCgogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBLZXks IGNsYXNzIFQ+Ckhhc2hUYWJsZTxLZXksVD46Okhhc2hUYWJsZShLZXkgKCpnZXQpKFQgeCksIHVu c2lnbmVkICgqaEZ1bmMpKEtleSB4KSkKeyAKICAgIG51bUl0ZW1zID0gMDsKICAgIEluaXRCdWNr ZXRzKEluaXRpYWxCdWNrZXRzKTsKICAgIGdldEtleSA9IGdldDsKICAgIGhhc2ggPSBoRnVuYzsK fQoKIAogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgp2b2lkCkhhc2hUYWJs ZTxLZXksVD46OkluaXRCdWNrZXRzKGludCBzeikKeyAKICAgIG51bUJ1Y2tldHMgPSBzejsKICAg IGJ1Y2tldHMgPSBuZXcgQnVja2V0W251bUJ1Y2tldHNdOwogICAgZm9yIChpbnQgaSA9IDA7IGkg PCBzejsgaSsrKSB7CiAgICAJYnVja2V0c1tpXSA9IG5ldyBMaXN0PFQ+OwogICAgfQp9CgogCiAK IAogCgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgpIYXNoVGFibGU8S2V5LFQ+Ojp+SGFz aFRhYmxlKCkKeyAKICAgIGlmICggSXNFbXB0eSgpICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0 aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCA2MiwgIi4uLy4uL2xpYi9oYXNoLmNjIik7 IEFib3J0KCk7IH0gOwkJIAogICAgRGVsZXRlQnVja2V0cyhidWNrZXRzLCBudW1CdWNrZXRzKTsK fQoKIAogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgp2b2lkCkhhc2hUYWJs ZTxLZXksVD46OkRlbGV0ZUJ1Y2tldHMoTGlzdDxUPiAqKnRhYmxlLCBpbnQgc3opCnsgCiAgICBm b3IgKGludCBpID0gMDsgaSA8IHN6OyBpKyspIHsKICAgIAlkZWxldGUgdGFibGVbaV07CiAgICB9 CiAgICBkZWxldGUgW10gdGFibGU7Cn0KCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNs YXNzIFQ+CmludApIYXNoVGFibGU8S2V5LCBUPjo6SGFzaFZhbHVlKEtleSBrZXkpIGNvbnN0IAp7 CiAgICBpbnQgcmVzdWx0ID0gKCpoYXNoKShrZXkpICUgbnVtQnVja2V0czsKICAgIGlmICggcmVz dWx0ID49IDAgJiYgcmVzdWx0IDwgbnVtQnVja2V0cyApIHt9IGVsc2UgeyBwcmludGYoIkFzc2Vy dGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgOTIsICIuLi8uLi9saWIvaGFzaC5jYyIp OyBBYm9ydCgpOyB9IDsKICAgIHJldHVybiByZXN1bHQ7Cn0KCiAKIAogCiAKIAogCiAKIAogCiAK IAoKdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVD4Kdm9pZApIYXNoVGFibGU8S2V5LFQ+OjpJ bnNlcnQoVCBpdGVtKQp7CiAgICBLZXkga2V5ID0gZ2V0S2V5KGl0ZW0pOwoKICAgIGlmICggIUlz SW5UYWJsZShrZXkpICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAl ZCBmaWxlICVzXG4iLCAxMTQsICIuLi8uLi9saWIvaGFzaC5jYyIpOyBBYm9ydCgpOyB9IDsKCiAg ICBpZiAoKG51bUl0ZW1zIC8gbnVtQnVja2V0cykgPj0gUmVzaXplUmF0aW8pIHsKCVJlSGFzaCgp OwogICAgfQoKICAgIGJ1Y2tldHNbSGFzaFZhbHVlKGtleSldLT5BcHBlbmQoaXRlbSk7CiAgICBu dW1JdGVtcysrOwoKICAgIGlmICggSXNJblRhYmxlKGtleSkgKSB7fSBlbHNlIHsgcHJpbnRmKCJB c3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZpbGUgJXNcbiIsIDEyMywgIi4uLy4uL2xpYi9oYXNo LmNjIik7IEFib3J0KCk7IH0gOwp9CgogCiAKIAogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5 LCBjbGFzcyBUPgp2b2lkCkhhc2hUYWJsZTxLZXksVD46OlJlSGFzaCgpCnsKICAgIEJ1Y2tldCAq b2xkVGFibGUgPSBidWNrZXRzOwogICAgaW50IG9sZFNpemUgPSBudW1CdWNrZXRzOwogICAgVCBp dGVtOwoKICAgIFNhbml0eUNoZWNrKCk7CiAgICBJbml0QnVja2V0cyhudW1CdWNrZXRzICogSW5j cmVhc2VTaXplQnkpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Cgl3 aGlsZSAoIW9sZFRhYmxlW2ldLT5Jc0VtcHR5KCkpIHsKCSAgICBpdGVtID0gb2xkVGFibGVbaV0t PlJlbW92ZUZyb250KCk7CgkgICAgYnVja2V0c1tIYXNoVmFsdWUoZ2V0S2V5KGl0ZW0pKV0tPkFw cGVuZChpdGVtKTsKICAgICAgICB9CiAgICB9CiAgICBEZWxldGVCdWNrZXRzKG9sZFRhYmxlLCBv bGRTaXplKTsKICAgIFNhbml0eUNoZWNrKCk7Cn0KCiAKIAogCiAKIAogCiAKIAogCiAKCnRlbXBs YXRlIDxjbGFzcyBLZXksIGNsYXNzIFQ+CmJvb2wKSGFzaFRhYmxlPEtleSxUPjo6RmluZEluQnVj a2V0KGludCBidWNrZXQsIAoJCQkJS2V5IGtleSwgVCAqaXRlbVB0cikgY29uc3QKewogICAgTGlz dEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKGJ1Y2tldHNbYnVja2V0XSk7CgogICAgZm9yICg7ICFpdGVy YXRvci5Jc0RvbmUoKTsgaXRlcmF0b3IuTmV4dCgpKSB7CglpZiAoa2V5ID09IGdldEtleShpdGVy YXRvci5JdGVtKCkpKSB7ICAKCSAgICAqaXRlbVB0ciA9IGl0ZXJhdG9yLkl0ZW0oKTsKCSAgICBy ZXR1cm4gdHJ1ZSA7CiAgICAgICAgfQogICAgfQogICAgKml0ZW1QdHIgPSAwIDsKICAgIHJldHVy biBmYWxzZSA7Cn0KCiAKIAogCiAKIAogCiAKCnRlbXBsYXRlIDxjbGFzcyBLZXksIGNsYXNzIFQ+ CmJvb2wKSGFzaFRhYmxlPEtleSxUPjo6RmluZChLZXkga2V5LCBUICppdGVtUHRyKSBjb25zdAp7 CiAgICBpbnQgYnVja2V0ID0gSGFzaFZhbHVlKGtleSk7CiAgICAKICAgIHJldHVybiBGaW5kSW5C dWNrZXQoYnVja2V0LCBrZXksIGl0ZW1QdHIpOyAKfQoKIAogCiAKIAogCiAKIAoKdGVtcGxhdGUg PGNsYXNzIEtleSwgY2xhc3MgVD4KVApIYXNoVGFibGU8S2V5LFQ+OjpSZW1vdmUoS2V5IGtleSkK ewogICAgaW50IGJ1Y2tldCA9IEhhc2hWYWx1ZShrZXkpOwogICAgVCBpdGVtOwogICAgYm9vbCBm b3VuZCA9IEZpbmRJbkJ1Y2tldChidWNrZXQsIGtleSwgJml0ZW0pOyAKCiAgICBpZiAoIGZvdW5k ICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4i LCAyMTYsICIuLi8uLi9saWIvaGFzaC5jYyIpOyBBYm9ydCgpOyB9IDsJIAoKICAgIGJ1Y2tldHNb YnVja2V0XS0+UmVtb3ZlKGl0ZW0pOwogICAgbnVtSXRlbXMtLTsKCiAgICBpZiAoICFJc0luVGFi bGUoa2V5KSApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmls ZSAlc1xuIiwgMjIxLCAiLi4vLi4vbGliL2hhc2guY2MiKTsgQWJvcnQoKTsgfSA7CiAgICByZXR1 cm4gaXRlbTsKfQoKCiAKIAogCiAKIAogCgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LGNsYXNzIFQ+CnZv aWQKSGFzaFRhYmxlPEtleSxUPjo6QXBwbHkodm9pZCAoKmZ1bmMpKFQpKSBjb25zdAp7CiAgICBm b3IgKGludCBidWNrZXQgPSAwOyBidWNrZXQgPCBudW1CdWNrZXRzOyBidWNrZXQrKykgewogICAg ICAgIGJ1Y2tldHNbYnVja2V0XS0+QXBwbHkoZnVuYyk7CiAgICB9Cn0KCiAKIAogCiAKIAogCgp0 ZW1wbGF0ZSA8Y2xhc3MgS2V5LGNsYXNzIFQ+CmludApIYXNoVGFibGU8S2V5LFQ+OjpGaW5kTmV4 dEZ1bGxCdWNrZXQoaW50IGJ1Y2tldCkgY29uc3QKeyAKICAgIGZvciAoOyBidWNrZXQgPCBudW1C dWNrZXRzOyBidWNrZXQrKykgewoJaWYgKCFidWNrZXRzW2J1Y2tldF0tPklzRW1wdHkoKSkgewoJ ICAgICBicmVhazsKCX0KICAgIH0KICAgIHJldHVybiBidWNrZXQ7Cn0KCiAKIAogCiAKIAogCiAK IAoKdGVtcGxhdGUgPGNsYXNzIEtleSwgY2xhc3MgVD4Kdm9pZCAKSGFzaFRhYmxlPEtleSxUPjo6 U2FuaXR5Q2hlY2soKSBjb25zdAp7CiAgICBpbnQgbnVtRm91bmQgPSAwOwogICAgTGlzdEl0ZXJh dG9yPFQ+ICppdGVyYXRvcjsKCiAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ1Y2tldHM7IGkr KykgewoJYnVja2V0c1tpXS0+U2FuaXR5Q2hlY2soKTsKCW51bUZvdW5kICs9IGJ1Y2tldHNbaV0t Pk51bUluTGlzdCgpOwoJaXRlcmF0b3IgPSBuZXcgTGlzdEl0ZXJhdG9yPFQ+KGJ1Y2tldHNbaV0p OwogICAgICAgIGZvciAoOyAhaXRlcmF0b3ItPklzRG9uZSgpOyBpdGVyYXRvci0+TmV4dCgpKSB7 CgkgICAgaWYgKCBpID09IEhhc2hWYWx1ZShnZXRLZXkoaXRlcmF0b3ItPkl0ZW0oKSkpICkge30g ZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAyODIs ICIuLi8uLi9saWIvaGFzaC5jYyIpOyBBYm9ydCgpOyB9IDsKICAgICAgICB9CiAgICAgICAgZGVs ZXRlIGl0ZXJhdG9yOwogICAgfQogICAgaWYgKCBudW1JdGVtcyA9PSBudW1Gb3VuZCApIHt9IGVs c2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMjg2LCAi Li4vLi4vbGliL2hhc2guY2MiKTsgQWJvcnQoKTsgfSA7Cgp9CgogCiAKIAogCgp0ZW1wbGF0ZSA8 Y2xhc3MgS2V5LCBjbGFzcyBUPgp2b2lkIApIYXNoVGFibGU8S2V5LFQ+OjpTZWxmVGVzdChUICpw LCBpbnQgbnVtRW50cmllcykKewogICAgaW50IGk7CiAgICBIYXNoSXRlcmF0b3I8S2V5LCBUPiAq aXRlcmF0b3IgPSBuZXcgSGFzaEl0ZXJhdG9yPEtleSxUPih0aGlzKTsKICAgIAogICAgU2FuaXR5 Q2hlY2soKTsKICAgIGlmICggSXNFbXB0eSgpICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9u IGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAzMDMsICIuLi8uLi9saWIvaGFzaC5jYyIpOyBB Ym9ydCgpOyB9IDsJIAogICAgZm9yICg7ICFpdGVyYXRvci0+SXNEb25lKCk7IGl0ZXJhdG9yLT5O ZXh0KCkpIHsKCXsgcHJpbnRmKCJBc3NlcnRpb24gZmFpbGVkOiBsaW5lICVkIGZpbGUgJXNcbiIs IDMwNSwgIi4uLy4uL2xpYi9oYXNoLmNjIik7IEFib3J0KCk7IH0gOwogICAgfQogICAgZGVsZXRl IGl0ZXJhdG9yOwoKICAgIGZvciAoaSA9IDA7IGkgPCBudW1FbnRyaWVzOyBpKyspIHsKICAgICAg ICBJbnNlcnQocFtpXSk7CiAgICAgICAgaWYgKCBJc0luVGFibGUoZ2V0S2V5KHBbaV0pKSApIHt9 IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMzEx LCAiLi4vLi4vbGliL2hhc2guY2MiKTsgQWJvcnQoKTsgfSA7CiAgICAgICAgaWYgKCAhSXNFbXB0 eSgpICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVz XG4iLCAzMTIsICIuLi8uLi9saWIvaGFzaC5jYyIpOyBBYm9ydCgpOyB9IDsKICAgIH0KICAgIAog ICAgIAogICAgZm9yIChpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykgeyAgCiAgICAgICAgaWYg KCBSZW1vdmUoZ2V0S2V5KHBbaV0pKSA9PSBwW2ldICkge30gZWxzZSB7IHByaW50ZigiQXNzZXJ0 aW9uIGZhaWxlZDogbGluZSAlZCBmaWxlICVzXG4iLCAzMTcsICIuLi8uLi9saWIvaGFzaC5jYyIp OyBBYm9ydCgpOyB9IDsKICAgIH0KCiAgICBpZiAoIElzRW1wdHkoKSApIHt9IGVsc2UgeyBwcmlu dGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMzIwLCAiLi4vLi4vbGli L2hhc2guY2MiKTsgQWJvcnQoKTsgfSA7CiAgICBTYW5pdHlDaGVjaygpOwp9CgoKIAogCiAKIAog Cgp0ZW1wbGF0ZSA8Y2xhc3MgS2V5LCBjbGFzcyBUPgpIYXNoSXRlcmF0b3I8S2V5LFQ+OjpIYXNo SXRlcmF0b3IoSGFzaFRhYmxlPEtleSxUPiAqdGJsKSAKeyAKICAgIHRhYmxlID0gdGJsOwogICAg YnVja2V0ID0gdGFibGUtPkZpbmROZXh0RnVsbEJ1Y2tldCgwKTsKICAgIGJ1Y2tldEl0ZXIgPSAw IDsKICAgIGlmIChidWNrZXQgPCB0YWJsZS0+bnVtQnVja2V0cykgewoJYnVja2V0SXRlciA9IG5l dyBMaXN0SXRlcmF0b3I8VD4odGFibGUtPmJ1Y2tldHNbYnVja2V0XSk7CiAgICB9Cn0KCiAKIAog CiAKCnRlbXBsYXRlIDxjbGFzcyBLZXksY2xhc3MgVD4Kdm9pZApIYXNoSXRlcmF0b3I8S2V5LFQ+ OjpOZXh0KCkgCnsgCiAgICBidWNrZXRJdGVyLT5OZXh0KCk7CiAgICBpZiAoYnVja2V0SXRlci0+ SXNEb25lKCkpIHsKCWRlbGV0ZSBidWNrZXRJdGVyOwoJYnVja2V0SXRlciA9IDAgOwogICAgICAg IGJ1Y2tldCA9IHRhYmxlLT5GaW5kTmV4dEZ1bGxCdWNrZXQoKytidWNrZXQpOwogICAgICAgIGlm IChidWNrZXQgPCB0YWJsZS0+bnVtQnVja2V0cykgewoJICAgIGJ1Y2tldEl0ZXIgPSBuZXcgTGlz dEl0ZXJhdG9yPFQ+KHRhYmxlLT5idWNrZXRzW2J1Y2tldF0pOwogICAgICAgIH0KICAgIH0KfQoj IDEyMSAiLi4vLi4vbGliL2hhc2guaCIgMgoKCQkJCSAKCQkJCSAKCiMgNDggIi4uLy4uL3RocmVh ZHMvdGhyZWFkLmgiIDIKCgojIDEgIi4uLy4uL2xpYi9jb3B5cmlnaHQuaCIgMQogCgoKCgoKCgoK CgoKCgoKCgoKCgoKCgoKIyA1MCAiLi4vLi4vdGhyZWFkcy90aHJlYWQuaCIgMgoKCgoKCgojIDEg Ii91c3IvY2xhc3MvY3MxNDAvbmFjaG9zL21hY2hpbmUvbWFjaGluZS5oIiAxCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCgoKCiMgMSAiLi4vLi4vbGliL2NvcHlyaWdodC5o IiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDI0ICIvdXNyL2NsYXNzL2NzMTQwL25hY2hv cy9tYWNoaW5lL21hY2hpbmUuaCIgMgoKCiMgMSAiL3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFj aGluZS90cmFuc2xhdGUuaCIgMQogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgoj IDEgIi4uLy4uL2xpYi9jb3B5cmlnaHQuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAy MSAiL3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFjaGluZS90cmFuc2xhdGUuaCIgMgoKCgogCiAK IAogCiAKCmNsYXNzIFRyYW5zbGF0aW9uRW50cnkgewogIHB1YmxpYzoKICAgIGludCB2aXJ0dWFs UGFnZTsgIAkgCiAgICBpbnQgcGh5c2ljYWxQYWdlOyAgCSAKCQkJIAogICAgYm9vbCB2YWxpZDsg ICAgICAgICAgCgkJCSAKICAgIGJvb2wgcmVhZE9ubHk7CSAKCQkJIAogICAgYm9vbCB1c2U7ICAg ICAgICAgICAgCgkJCSAKICAgIGJvb2wgZGlydHk7ICAgICAgICAgIAoJCQkgCn07CgoKIyAyNiAi L3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFjaGluZS9tYWNoaW5lLmgiIDIKCgojIDEgIi91c3Iv Y2xhc3MvY3MxNDAvbmFjaG9zL21hY2hpbmUvcmVnaXN0ZXJzLmgiIDEKCgoKIAogCiAKIAoKCgoK CgoKCgoKCgoKCgoKIyAyOCAiL3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFjaGluZS9tYWNoaW5l LmgiIDIKCgogCiAKIAogCgogCmV4dGVybiBpbnQgTnVtUGh5c1BhZ2VzOwpleHRlcm4gaW50IFBh Z2VTaXplOwpleHRlcm4gaW50IE1lbW9yeVNpemU7CmV4dGVybiBpbnQgVExCU2l6ZTsJCQkgCgpl bnVtIEV4Y2VwdGlvblR5cGUgeyBOb0V4Y2VwdGlvbiwgICAgICAgICAgICAKCQkgICAgIFN5c2Nh bGxFeGNlcHRpb24sICAgICAgIAoJCSAgICAgUGFnZUZhdWx0RXhjZXB0aW9uLCAgICAgCgkJICAg ICBSZWFkT25seUV4Y2VwdGlvbiwgICAgICAKCQkJCQkgICAgIAoJCSAgICAgQnVzRXJyb3JFeGNl cHRpb24sICAgICAgCgkJCQkJICAgICAKCQkgICAgIEFkZHJlc3NFcnJvckV4Y2VwdGlvbiwgIAoJ CQkJCSAgICAgCgkJCQkJICAgICAKCQkgICAgIE92ZXJmbG93RXhjZXB0aW9uLCAgICAgIAoJCSAg ICAgSWxsZWdhbEluc3RyRXhjZXB0aW9uLCAgCgkJICAgICAKCQkgICAgIE51bUV4Y2VwdGlvblR5 cGVzCn07CgogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKY2xhc3MgSW5zdHJ1Y3Rpb247CmNsYXNz IEludGVycnVwdDsKCmNsYXNzIE1hY2hpbmUgewogIHB1YmxpYzoKICAgIE1hY2hpbmUoYm9vbCBk ZWJ1Zyk7CSAKCQkJCSAKICAgIH5NYWNoaW5lKCk7CQkJIAoKIAogICAgdm9pZCBSdW4oKTsJIAkJ IAoKICAgIGludCBSZWFkUmVnaXN0ZXIoaW50IG51bSk7CSAKCiAgICB2b2lkIFdyaXRlUmVnaXN0 ZXIoaW50IG51bSwgaW50IHZhbHVlKTsKCQkJCSAKCiAKIAogCiAKIAoKICAgIGNoYXIgKm1haW5N ZW1vcnk7CQkgCgkJCQkgCgogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKCiAgICBU cmFuc2xhdGlvbkVudHJ5ICp0bGI7CQkgCgkJCQkJIAoKICAgIFRyYW5zbGF0aW9uRW50cnkgKnBh Z2VUYWJsZTsKICAgIHVuc2lnbmVkIGludCBwYWdlVGFibGVTaXplOwoKICBwcml2YXRlOgoKIAog ICAgdm9pZCBEZWxheWVkTG9hZChpbnQgbmV4dFJlZywgaW50IG5leHRWYWwpOyAgCQoJCQkJIAog ICAgdm9pZCBPbmVJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqaW5zdHIpOyAJCiAgICAJCQkJIAog ICAgCiAgICBib29sIFJlYWRNZW0oaW50IGFkZHIsIGludCBzaXplLCBpbnQqIHZhbHVlKTsKICAg IGJvb2wgV3JpdGVNZW0oaW50IGFkZHIsIGludCBzaXplLCBpbnQgdmFsdWUpOwogICAgCQkJCSAK CQkJCSAKCQkJCSAKCiAgICBFeGNlcHRpb25UeXBlIFRyYW5zbGF0ZShpbnQgdmlydEFkZHIsIGlu dCogcGh5c0FkZHIsIGludCBzaXplLGJvb2wgd3JpdGluZyk7CiAgICAJCQkJIAoJCQkJIAoJCQkJ IAogICAgCQkJCSAKCQkJCSAKCiAgICB2b2lkIFJhaXNlRXhjZXB0aW9uKEV4Y2VwdGlvblR5cGUg d2hpY2gsIGludCBiYWRWQWRkcik7CgkJCQkgCgkJCQkgCgogICAgdm9pZCBEZWJ1Z2dlcigpOwkJ IAogICAgdm9pZCBEdW1wU3RhdGUoKTsJCSAKCgogCgogICAgaW50IHJlZ2lzdGVyc1s0MCBdOyAg CgogICAgYm9vbCBzaW5nbGVTdGVwOwkJIAoJCQkJIAogICAgaW50IHJ1blVudGlsVGltZTsJCSAK CQkJCSAKCiBmcmllbmQgSW50ZXJydXB0OwkJIAp9OwoKZXh0ZXJuIHZvaWQgRXhjZXB0aW9uSGFu ZGxlcihFeGNlcHRpb25UeXBlIHdoaWNoKTsKCQkJCSAKCQkJCSAKCQkJCSAKCgogCiAKIAogCiAK IAogCiAKIAogCgp1bnNpZ25lZCBpbnQgV29yZFRvSG9zdCh1bnNpZ25lZCBpbnQgd29yZCk7CnVu c2lnbmVkIHNob3J0IFNob3J0VG9Ib3N0KHVuc2lnbmVkIHNob3J0IHNob3J0d29yZCk7CnVuc2ln bmVkIGludCBXb3JkVG9NYWNoaW5lKHVuc2lnbmVkIGludCB3b3JkKTsKdW5zaWduZWQgc2hvcnQg U2hvcnRUb01hY2hpbmUodW5zaWduZWQgc2hvcnQgc2hvcnR3b3JkKTsKCgojIDU2ICIuLi8uLi90 aHJlYWRzL3RocmVhZC5oIiAyCgojIDEgIi4uLy4uL3VzZXJwcm9nL2FkZHJzcGFjZS5oIiAxCiAK IAogCiAKIAogCiAKIAogCiAKIAogCgoKCgojIDEgIi4uLy4uL2xpYi9jb3B5cmlnaHQuaCIgMQog CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAxNyAiLi4vLi4vdXNlcnByb2cvYWRkcnNwYWNlLmgi IDIKCiMgMSAiLi4vLi4vZmlsZXN5cy9maWxlc3lzLmgiIDEKIAogCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKIyAxICIu Li8uLi9saWIvY29weXJpZ2h0LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMzkgIi4u Ly4uL2ZpbGVzeXMvZmlsZXN5cy5oIiAyCgojIDEgIi4uLy4uL2ZpbGVzeXMvb3BlbmZpbGUuaCIg MQogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgojIDEgIi4uLy4uL2xp Yi9jb3B5cmlnaHQuaCIgMQogCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKIyAyNCAiLi4vLi4vZmls ZXN5cy9vcGVuZmlsZS5oIiAyCgoKCgoKCQkJCQkgCgkJCQkJIAoKY2xhc3MgT3BlbkZpbGUgewog IHB1YmxpYzoKICAgIE9wZW5GaWxlKGludCBmKSB7IGZpbGUgPSBmOyBjdXJyZW50T2Zmc2V0ID0g MDsgfQkgCiAgICB+T3BlbkZpbGUoKSB7IENsb3NlKGZpbGUpOyB9CQkJIAoKICAgIGludCBSZWFk QXQoY2hhciAqaW50bywgaW50IG51bUJ5dGVzLCBpbnQgcG9zaXRpb24pIHsgCiAgICAJCUxzZWVr KGZpbGUsIHBvc2l0aW9uLCAwKTsgCgkJcmV0dXJuIFJlYWRQYXJ0aWFsKGZpbGUsIGludG8sIG51 bUJ5dGVzKTsgCgkJfQkKICAgIGludCBXcml0ZUF0KGNoYXIgKmZyb20sIGludCBudW1CeXRlcywg aW50IHBvc2l0aW9uKSB7IAogICAgCQlMc2VlayhmaWxlLCBwb3NpdGlvbiwgMCk7IAoJCVdyaXRl RmlsZShmaWxlLCBmcm9tLCBudW1CeXRlcyk7IAoJCXJldHVybiBudW1CeXRlczsKCQl9CQogICAg aW50IFJlYWQoY2hhciAqaW50bywgaW50IG51bUJ5dGVzKSB7CgkJaW50IG51bVJlYWQgPSBSZWFk QXQoaW50bywgbnVtQnl0ZXMsIGN1cnJlbnRPZmZzZXQpOyAKCQljdXJyZW50T2Zmc2V0ICs9IG51 bVJlYWQ7CgkJcmV0dXJuIG51bVJlYWQ7CiAgICAJCX0KICAgIGludCBXcml0ZShjaGFyICpmcm9t LCBpbnQgbnVtQnl0ZXMpIHsKCQlpbnQgbnVtV3JpdHRlbiA9IFdyaXRlQXQoZnJvbSwgbnVtQnl0 ZXMsIGN1cnJlbnRPZmZzZXQpOyAKCQljdXJyZW50T2Zmc2V0ICs9IG51bVdyaXR0ZW47CgkJcmV0 dXJuIG51bVdyaXR0ZW47CgkJfQoKICAgIGludCBMZW5ndGgoKSB7IExzZWVrKGZpbGUsIDAsIDIp OyByZXR1cm4gVGVsbChmaWxlKTsgfQogICAgCiAgcHJpdmF0ZToKICAgIGludCBmaWxlOwogICAg aW50IGN1cnJlbnRPZmZzZXQ7Cn07CgojIDk3ICIuLi8uLi9maWxlc3lzL29wZW5maWxlLmgiCgoK CiMgNDAgIi4uLy4uL2ZpbGVzeXMvZmlsZXN5cy5oIiAyCgoKCgkJCQkgCgkJCQkgCmNsYXNzIEZp bGVTeXN0ZW0gewogIHB1YmxpYzoKICAgIEZpbGVTeXN0ZW0oYm9vbCkge30KCiAgICBib29sIENy ZWF0ZShjaGFyICpuYW1lKSB7IAoJaW50IGZpbGVEZXNjcmlwdG9yID0gT3BlbkZvcldyaXRlKG5h bWUpOwoKCWlmIChmaWxlRGVzY3JpcHRvciA9PSAtMSkgcmV0dXJuIGZhbHNlIDsKCUNsb3NlKGZp bGVEZXNjcmlwdG9yKTsgCglyZXR1cm4gdHJ1ZSA7IAoJfQoKICAgIE9wZW5GaWxlKiBPcGVuKGNo YXIgKm5hbWUpIHsKCSAgaW50IGZpbGVEZXNjcmlwdG9yID0gT3BlbkZvclJlYWRXcml0ZShuYW1l LCBmYWxzZSApOwoKCSAgaWYgKGZpbGVEZXNjcmlwdG9yID09IC0xKSByZXR1cm4gMCA7CgkgIHJl dHVybiBuZXcgT3BlbkZpbGUoZmlsZURlc2NyaXB0b3IpOwogICAgICB9CgogICAgYm9vbCBSZW1v dmUoY2hhciAqbmFtZSkgeyByZXR1cm4gVW5saW5rKG5hbWUpID09IDA7IH0KCn07CgojIDk2ICIu Li8uLi9maWxlc3lzL2ZpbGVzeXMuaCIKCgoKIyAxOCAiLi4vLi4vdXNlcnByb2cvYWRkcnNwYWNl LmgiIDIKCgojIDEgIi4uLy4uL3VzZXJwcm9nL3N5c2NhbGwuaCIgMQogCgoKCgoKCgoKCgoKCgoK IyAxICIuLi8uLi9saWIvY29weXJpZ2h0LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMg MTYgIi4uLy4uL3VzZXJwcm9nL3N5c2NhbGwuaCIgMgoKCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoK CgoKIAoKCgoKCgoKCgogCnZvaWQgSGFsdCgpOwkJCiAKCiAKCiAKdm9pZCBFeGl0KGludCBzdGF0 dXMpOwkKCiAKdHlwZWRlZiBpbnQgU3BhY2VJZDsJCiAKIAoKClNwYWNlSWQgRXhlYyhjaGFyICpu YW1lKTsKIAogCgoKaW50IEpvaW4oU3BhY2VJZCBpZCk7IAkKIAoKIAoKCgoKCgoKIAogCnR5cGVk ZWYgaW50IE9wZW5GaWxlSWQ7CQoKIAoKCgoKCgoKCiAKCgp0eXBlZGVmIGludCBTZWdtZW50SWQ7 CgogCgoKCiAKIAppbnQgQ3JlYXRlKGNoYXIgKm5hbWUpOwoKIAppbnQgUmVtb3ZlKGNoYXIgKm5h bWUpOwoKIAoKCk9wZW5GaWxlSWQgT3BlbihjaGFyICpuYW1lKTsKCiAKaW50IFdyaXRlKGNoYXIg KmJ1ZmZlciwgaW50IHNpemUsIE9wZW5GaWxlSWQgaWQpOwoKIAoKCgoKCmludCBSZWFkKGNoYXIg KmJ1ZmZlciwgaW50IHNpemUsIE9wZW5GaWxlSWQgaWQpOwoKIAp2b2lkIENsb3NlKE9wZW5GaWxl SWQgaWQpOwoKCgogCgoKCgoKIAoKCnZvaWQgVGhyZWFkRm9yayh2b2lkICgqZnVuYykoKSk7Cgog CgoKdm9pZCBUaHJlYWRZaWVsZCgpOwkJCgogCmludCBMZW5ndGgoT3BlbkZpbGVJZCBpZCk7Cgog CgoKU2VnbWVudElkIE1tYXAoT3BlbkZpbGVJZCBpZCwgY2hhciAqYWRkciwgaW50IGxlbmd0aCk7 CgogCgoKCmludCBNdW5tYXAoU2VnbWVudElkIHNlZ21lbnQpOwoKIAoKCgppbnQgU2JyayhTZWdt ZW50SWQgc2VnbWVudCwgaW50IGluY3IpOwoKCgogCgoKCiAKaW50IENoZGlyKGNoYXIgKmRpcm5h bWUpOwoKIAp2b2lkIExzZGlyKHZvaWQpOwoKIAppbnQgTWtkaXIoY2hhciAqZGlybmFtZSk7CgoK CgojIDIwICIuLi8uLi91c2VycHJvZy9hZGRyc3BhY2UuaCIgMgoKIyAxICIuLi8uLi91c2VycHJv Zy9wdGVudHJ5LmgiIDEKIAoKCmNsYXNzIFRyYW5zbGF0aW9uRW50cnk7CgogCmNsYXNzIFBhZ2VU YWJsZUVudHJ5CnsKICBwdWJsaWM6CiAgICBQYWdlVGFibGVFbnRyeSgpOwogICAgVHJhbnNsYXRp b25FbnRyeSB0ZTsgIAogICAgU3BhY2VJZCBwaWQ7Cn07CgojIDIxICIuLi8uLi91c2VycHJvZy9h ZGRyc3BhY2UuaCIgMgoKCgoKY2xhc3MgQWRkclNwYWNlIHsKICBwdWJsaWM6CiAgICBBZGRyU3Bh Y2UoKTsJCQkgCiAgICB+QWRkclNwYWNlKCk7CQkJIAoKICAgIHZvaWQgRXhlY3V0ZShjaGFyICpm aWxlTmFtZSk7CSAKCQkJCQkgCgogICAgdm9pZCBTYXZlU3RhdGUoKTsJCQkgCiAgICB2b2lkIFJl c3RvcmVTdGF0ZSgpOwkJIAogICAgdW5zaWduZWQgaW50IEFTSUQoKSB7IHJldHVybiBhc2lkOyB9 CgogICAgIAogICAgZnJpZW5kIHZvaWQgRXhjZXB0aW9uSGFuZGxlcihFeGNlcHRpb25UeXBlIHdo aWNoKTsKCgogICAgRXhjZXB0aW9uVHlwZSB2aXJ0VG9QaHlzKGludCB2aXJ0QWRkciwgaW50ICpw aHlzQWRkciwgaW50IHNpemUsIAoJCQkgICAgIGJvb2wgd3JpdGluZyk7CiAgICBib29sIFJlYWRN ZW1vcnkoaW50IHZpcnRBZGRyLCBpbnQgc2l6ZSwgaW50ICp2YWx1ZSk7CiAgICBib29sIFdyaXRl TWVtb3J5KGludCB2aXJ0QWRkciwgaW50IHNpemUsIGludCB2YWx1ZSk7CgoKCgogICAgY2hhciAq cHJvZ3JhbU5hbWU7ICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAoKCiAgcHJpdmF0ZToKICAgIFRyYW5zbGF0aW9uRW50cnkgKnBhZ2VU YWJsZTsJIAoJCQkJCSAKICAgIHVuc2lnbmVkIGludCBudW1QYWdlczsJCSAKCQkJCQkgCgogICAg Ym9vbCBMb2FkKGNoYXIgKmZpbGVOYW1lKTsJCSAKCQkJCQkgCgogICAgdm9pZCBJbml0UmVnaXN0 ZXJzKCk7CQkgCgkJCQkJIAoKICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmV4dEFzaWQ7ICAgICAg ICAKICAgIHVuc2lnbmVkIGludCBhc2lkOwoKCiAgICB2b2lkIENvcHlJbih2b2lkICprZXJuZWxT cmMsIGludCB2aXJ0QWRkciwgaW50IGxlbmd0aCk7CiAgICB2b2lkIFRva2VuaXplKGNoYXIgKnMp OwogICAgdm9pZCBNYWluU3RhY2soY2hhciAqcyk7CiAgICBjaGFyICoqYXJnQXJyOwogICAgaW50 IG51bUFyZ3M7CgoKCiAgICBib29sIHBhZ2VUYWJsZUFsbG9jYXRlZDsgIAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoKCiAgICBI YXNoVGFibGU8aW50LCBQYWdlVGFibGVFbnRyeSAqPiAqSGFzaFBUOyAgCiAgICB2b2lkIExvYWRO ZXdQYWdlRnJvbUZpbGUoaW50IHZpcnR1YWxQYWdlLCBpbnQgc2l6ZSwgaW50IG9mZnNldCwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuRmlsZSAqZXhlY3V0YWJsZSk7Cn07CgppbnQg SGFzaEZuKFBhZ2VUYWJsZUVudHJ5ICpwdGUpIHtyZXR1cm4gcHRlLT50ZS52aXJ0dWFsUGFnZTt9 CmludCBFeHRyYWN0S2V5RnJvbVBhZ2VUYWJsZUVudHJ5KFBhZ2VUYWJsZUVudHJ5ICpwdGUpCiAg ICAgICAgICAge3JldHVybiBwdGUtPnRlLnZpcnR1YWxQYWdlO30KCgoKCgoKIyA1NyAiLi4vLi4v dGhyZWFkcy90aHJlYWQuaCIgMgoKCgogCiAKIAogCiAKIAoKCgoKIAogCmNvbnN0IGludCBTdGFj a1NpemUgPSAoNCAqIDEwMjQpOwkgCgoKIAplbnVtIFRocmVhZFN0YXR1cyB7IEpVU1RfQ1JFQVRF RCwgUlVOTklORywgUkVBRFksIEJMT0NLRUQgfTsKCgogCiAKIAogCiAKIAogCiAKIAogCgpjbGFz cyBUaHJlYWQgewogIHByaXZhdGU6CiAgICAgCiAgICAgCiAgICBpbnQgKnN0YWNrVG9wOwkJCSAg CiAgICB2b2lkICptYWNoaW5lU3RhdGVbNzUgXTsgICAKCiAgcHVibGljOgogICAgVGhyZWFkKGNo YXIqIGRlYnVnTmFtZSk7CQkgCgoKICAgIFRocmVhZChjaGFyKiBkZWJ1Z05hbWUsIGJvb2wgam9p bmFibGUpOwoKCiAgICB+VGhyZWFkKCk7IAkJCQkgCgkJCQkJIAoJCQkJCSAKCQkJCQkgCgogICAg IAoKICAgIHZvaWQgRm9yayhWb2lkRnVuY3Rpb25QdHIgZnVuYywgdm9pZCAqYXJnKTsgCiAgICAJ CQkJIAogICAgdm9pZCBZaWVsZCgpOyAgCQkgCgkJCQkgCiAgICB2b2lkIFNsZWVwKGJvb2wgZmlu aXNoaW5nKTsgIAoJCQkJIAogICAgdm9pZCBCZWdpbigpOwkJIAogICAgdm9pZCBGaW5pc2goKTsg IAkJIAogICAgCiAgICB2b2lkIENoZWNrT3ZlcmZsb3coKTsgICAJIAogICAgdm9pZCBzZXRTdGF0 dXMoVGhyZWFkU3RhdHVzIHN0KSB7IHN0YXR1cyA9IHN0OyB9CiAgICBjaGFyKiBnZXROYW1lKCkg eyByZXR1cm4gKG5hbWUpOyB9CiAgICB2b2lkIFByaW50KCkgeyBwcmludGYoIiVzIixuYW1lKTsg fQogICAgdm9pZCBTZWxmVGVzdCgpOwkJIAoKCiAgICB2b2lkIEpvaW4oKTsJCQoKCiAgcHJpdmF0 ZToKICAgICAKICAgIAogICAgaW50ICpzdGFjazsgCSAJIAoJCQkJIAoJCQkJIAogICAgVGhyZWFk U3RhdHVzIHN0YXR1czsJIAogICAgY2hhciogbmFtZTsKCiAgICB2b2lkIFN0YWNrQWxsb2NhdGUo Vm9pZEZ1bmN0aW9uUHRyIGZ1bmMsIHZvaWQgKmFyZyk7CiAgICAJCQkJIAoJCQkJIAoKCgogIHBy aXZhdGU6CiAgICBMaXN0PFRocmVhZCAqPiAqam9pbmFibGVDaGlsZHJlbkxpc3Q7CiAgICAJCQkJ IAogICAgCQkJCSAKICAgIAoKICBwdWJsaWM6CgogICAgVGhyZWFkICpwYXJlbnQ7CQkgCiAgICAJ CQkJIAoKICBwcml2YXRlOgoKICAgIAogICAgU2VtYXBob3JlICpqb2luU2VtOwkJIAogICAgCQkJ CSAKICAgIAkJCQkgCgogICAgYm9vbCBhbHJlYWR5Sm9pbmVkOwkJIAogICAgCQkJCSAKICAgIAkJ CQkgCgogICAgYm9vbCBqb2luYWJsZTsJCSAKICAgIAkJCQkgCgogICAgYm9vbCBmaW5pc2hpbmc7 CgoKICBwdWJsaWM6CiAgICB2b2lkIEFkZEpvaW5hYmxlQ2hpbGQoVGhyZWFkICp0KSB7IGpvaW5h YmxlQ2hpbGRyZW5MaXN0LT5BcHBlbmQodCk7IH0JCgogICAgdm9pZCBSZW1vdmVKb2luYWJsZUNo aWxkKFRocmVhZCAqdCkgeyBqb2luYWJsZUNoaWxkcmVuTGlzdC0+UmVtb3ZlKHQpOyB9CgogICAg Ym9vbCBIYXNDaGlsZFRocmVhZChUaHJlYWQgKnQpIHsgcmV0dXJuIGpvaW5hYmxlQ2hpbGRyZW5M aXN0LT5Jc0luTGlzdCh0KTsgfQoKICAgIGJvb2wgSGFzQWxyZWFkeUpvaW5lZCgpIHsgcmV0dXJu IGFscmVhZHlKb2luZWQ7IH0JCgogICAgYm9vbCBJc0pvaW5hYmxlKCkgeyByZXR1cm4gam9pbmFi bGU7IH0KCgogICAgYm9vbCBjaGlsZEF0dGVtcHRlZExvYWQ7CgogICAgCiAgcHJpdmF0ZToJCgoK CgoKCiAKIAogCgogICAgaW50IHVzZXJSZWdpc3RlcnNbNDAgXTsJIAoKICBwdWJsaWM6CiAgICB2 b2lkIFNhdmVVc2VyU3RhdGUoKTsJCSAKICAgIHZvaWQgUmVzdG9yZVVzZXJTdGF0ZSgpOwkJIAoK ICAgIEFkZHJTcGFjZSAqc3BhY2U7CQkJIAoKCgogICAgaW50IGV4aXRTdGF0dXM7CQkgCiAgICAJ CQkJIAoKICAgIE9wZW5GaWxlICoqb3BlbkZpbGVJZFRhYmxlOwkKICAgIAkJCQkgCiAgICAJCQkJ IAoKfTsKCiAKZXh0ZXJuIHZvaWQgVGhyZWFkUHJpbnQoVGhyZWFkICp0aHJlYWQpOwkgCgogCgpl eHRlcm4gIkMiIHsKIAogCiAKIAp2b2lkIFRocmVhZFJvb3QoKTsKCiAKdm9pZCBTV0lUQ0goVGhy ZWFkICpvbGRUaHJlYWQsIFRocmVhZCAqbmV3VGhyZWFkKTsKfQoKCiMgMTUgIi4uLy4uL3RocmVh ZHMva2VybmVsLmgiIDIKCiMgMSAiLi4vLi4vdGhyZWFkcy9zY2hlZHVsZXIuaCIgMQogCiAKIAog CiAKIAogCiAKCgoKCiMgMSAiLi4vLi4vbGliL2NvcHlyaWdodC5oIiAxCiAKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgojIDEzICIuLi8uLi90aHJlYWRzL3NjaGVkdWxlci5oIiAyCgoKCgogCiAKIAoK Y2xhc3MgU2NoZWR1bGVyIHsKICBwdWJsaWM6CiAgICBTY2hlZHVsZXIoKTsJCSAKICAgIH5TY2hl ZHVsZXIoKTsJCSAKCiAgICB2b2lkIFJlYWR5VG9SdW4oVGhyZWFkKiB0aHJlYWQpOwkKICAgIAkJ CQkgCiAgICBUaHJlYWQqIEZpbmROZXh0VG9SdW4oKTsJIAoJCQkJIAogICAgdm9pZCBSdW4oVGhy ZWFkKiBuZXh0VGhyZWFkLCBib29sIGZpbmlzaGluZyk7CiAgICAJCQkJIAogICAgdm9pZCBDaGVj a1RvQmVEZXN0cm95ZWQoKTsgCiAgICAJCQkJIAogICAgdm9pZCBQcmludCgpOwkJIAogICAgCiAg ICAgCiAgICAKICBwcml2YXRlOgogICAgTGlzdDxUaHJlYWQgKj4gKnJlYWR5TGlzdDsgICAKCQkJ CSAKICAgIFRocmVhZCAqdG9CZURlc3Ryb3llZDsJIAogICAgCQkJCSAKfTsKCgojIDE2ICIuLi8u Li90aHJlYWRzL2tlcm5lbC5oIiAyCgoKIyAxICIvdXNyL2NsYXNzL2NzMTQwL25hY2hvcy9tYWNo aW5lL3N0YXRzLmgiIDEKIAogCiAKIAogCiAKIAogCiAKCgoKCiMgMSAiLi4vLi4vbGliL2NvcHly aWdodC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDE0ICIvdXNyL2NsYXNzL2NzMTQw L25hY2hvcy9tYWNoaW5lL3N0YXRzLmgiIDIKCgogCiAKIAogCiAKCmNsYXNzIFN0YXRpc3RpY3Mg ewogIHB1YmxpYzoKICAgIGludCB0b3RhbFRpY2tzOyAgICAgIAkgCiAgICBpbnQgaWRsZVRpY2tz OyAgICAgICAJIAogICAgaW50IHN5c3RlbVRpY2tzOwkgCSAKICAgIGludCB1c2VyVGlja3M7ICAg ICAgIAkgCgkJCQkgCgkJCQkgCgogICAgaW50IG51bURpc2tSZWFkczsJCSAKICAgIGludCBudW1E aXNrV3JpdGVzOwkJIAogICAgaW50IG51bUNvbnNvbGVDaGFyc1JlYWQ7CSAKICAgIGludCBudW1D b25zb2xlQ2hhcnNXcml0dGVuOyAgCiAgICBpbnQgbnVtUGFnZUZhdWx0czsJCSAKICAgIGludCBu dW1QYWNrZXRzU2VudDsJCSAKICAgIGludCBudW1QYWNrZXRzUmVjdmQ7CSAKCiAgICBTdGF0aXN0 aWNzKCk7IAkJIAoKICAgIHZvaWQgUHJpbnQoKTsJCSAKfTsKCiAKIAogCiAKIAogCiAKCmNvbnN0 IGludCBVc2VyVGljayA9IAkgICAxOwkgCmNvbnN0IGludCBTeXN0ZW1UaWNrID0JICAxMDsgCSAK Y29uc3QgaW50IFJvdGF0aW9uVGltZSA9IDUwMDsgCSAKY29uc3QgaW50IFNlZWtUaW1lID0JIDUw MDsgIAkgCmNvbnN0IGludCBDb25zb2xlVGltZSA9CSAxMDA7CSAKY29uc3QgaW50IE5ldHdvcmtU aW1lID0JIDEwMDsgIAkgCgogCmV4dGVybiBpbnQgVGltZXJUaWNrczsgIAkgCgoKIyAxOCAiLi4v Li4vdGhyZWFkcy9rZXJuZWwuaCIgMgoKIyAxICIuLi8uLi90aHJlYWRzL2FsYXJtLmgiIDEKIAog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKIyAxICIuLi8uLi9saWIvY29weXJpZ2h0 LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjEgIi4uLy4uL3RocmVhZHMvYWxhcm0u aCIgMgoKCgojIDEgIi91c3IvY2xhc3MvY3MxNDAvbmFjaG9zL21hY2hpbmUvdGltZXIuaCIgMQog CiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKIyAxICIuLi8uLi9saWIvY29w eXJpZ2h0LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMjMgIi91c3IvY2xhc3MvY3Mx NDAvbmFjaG9zL21hY2hpbmUvdGltZXIuaCIgMgoKCgoKIApjbGFzcyBUaW1lciA6IHB1YmxpYyBD YWxsQmFja09iaiB7CiAgcHVibGljOgogICAgVGltZXIoYm9vbCBkb1JhbmRvbSwgQ2FsbEJhY2tP YmogKnRvQ2FsbCk7CgkJCQkgCgkJCQkgCiAgICB2aXJ0dWFsIH5UaW1lcigpIHt9CiAgICAKICAg IHZvaWQgRGlzYWJsZSgpIHsgZGlzYWJsZSA9IHRydWUgOyB9CiAgICAJCQkJIAoJCQkJIAoKICBw cml2YXRlOgogICAgYm9vbCByYW5kb21pemU7CQkgCiAgICBDYWxsQmFja09iaiAqY2FsbFBlcmlv ZGljYWxseTsgIAogICAgYm9vbCBkaXNhYmxlOwkJIAogICAgCQkJCSAKICAgIAogICAgdm9pZCBD YWxsQmFjaygpOwkJIAoJCQkJIAoKICAgIHZvaWQgU2V0SW50ZXJydXB0KCk7ICAJIAogICAgCQkJ CSAKCQkJCSAKfTsKCgojIDI0ICIuLi8uLi90aHJlYWRzL2FsYXJtLmgiIDIKCgogCmNsYXNzIEFs YXJtIDogcHVibGljIENhbGxCYWNrT2JqIHsKICBwdWJsaWM6CiAgICBBbGFybShib29sIGRvUmFu ZG9tWWllbGQpOwkgCgkJCQkgCiAgICB+QWxhcm0oKSB7IGRlbGV0ZSB0aW1lcjsgfQogICAgCiAg ICB2b2lkIFdhaXRVbnRpbChpbnQgeCk7CSAKCiAgICBpbnQgbnVtSm9pbldhaXRpbmc7CiAgICAK ICBwcml2YXRlOgogICAgVGltZXIgKnRpbWVyOwkJIAoKICAgIHZvaWQgQ2FsbEJhY2soKTsJCSAK CQkJCSAKCgp9OwoKCiMgMTkgIi4uLy4uL3RocmVhZHMva2VybmVsLmgiIDIKCgoKCgoKCmNsYXNz IFRocmVhZGVkS2VybmVsIHsKICBwdWJsaWM6CiAgICBUaHJlYWRlZEtlcm5lbChpbnQgYXJnYywg Y2hhciAqKmFyZ3YpOwogICAgCQkJCSAKICAgIH5UaHJlYWRlZEtlcm5lbCgpOwkJIAogICAgCiAg ICB2b2lkIEluaXRpYWxpemUoKTsgCQkgCgkJCQkgCgkJCQkgCgogICAgdm9pZCBSdW4oKTsJCQkg CgkJCQkgICAgCiAgICB2b2lkIFNlbGZUZXN0KCk7CQkgCiAgICAKIAogCiAKIAoKIAogICAgVGhy ZWFkICpjdXJyZW50VGhyZWFkOwkgCiAgICBTY2hlZHVsZXIgKnNjaGVkdWxlcjsJIAogICAgSW50 ZXJydXB0ICppbnRlcnJ1cHQ7CSAKICAgIFN0YXRpc3RpY3MgKnN0YXRzOwkJIAogICAgQWxhcm0g KmFsYXJtOwkJIAoKCiAgICBGaWxlU3lzdGVtICpmaWxlU3lzdGVtOwoKCgoKCiAgICBpbnQgbnVt VGhyZWFkczsgICAgICAgICAgICAgIAoKICBwcml2YXRlOgogICAgYm9vbCByYW5kb21TbGljZTsJ CSAKICAgIGJvb2wgZm9ybWF0OyAgICAgICAgICAgICAgICAgCn07CgoKIyAxOCAiLi4vLi4vdXNl cnByb2cvdXNlcmtlcm5lbC5oIiAyCgoKIyAxICIuLi8uLi91c2VycHJvZy9zeW5jaGNvbnNvbGUu aCIgMQogCiAKIAogCiAKIAogCiAKIAogCgoKCgpjbGFzcyBTeW5jaENvbnNvbGVJbnB1dDsKY2xh c3MgU3luY2hDb25zb2xlT3V0cHV0OwoKIyAxICIuLi8uLi9saWIvY29weXJpZ2h0LmgiIDEKIAoK CgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMTggIi4uLy4uL3VzZXJwcm9nL3N5bmNoY29uc29sZS5o IiAyCgoKCiMgMSAiL3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFjaGluZS9jb25zb2xlLmgiIDEK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKCgoKIyAx ICIuLi8uLi9saWIvY29weXJpZ2h0LmgiIDEKIAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCiMgMzAg Ii91c3IvY2xhc3MvY3MxNDAvbmFjaG9zL21hY2hpbmUvY29uc29sZS5oIiAyCgoKCgogCiAKIAog CiAKIAogCiAKIAogCiAKIAoKY2xhc3MgQ29uc29sZUlucHV0IDogcHVibGljIENhbGxCYWNrT2Jq IHsKICBwdWJsaWM6CiAgICBDb25zb2xlSW5wdXQoY2hhciAqcmVhZEZpbGUsIENhbGxCYWNrT2Jq ICp0b0NhbGwpOwoJCQkJIAogICAgfkNvbnNvbGVJbnB1dCgpOwkJIAoKICAgIGNoYXIgR2V0Q2hh cigpOwkgICAJIAoJCQkJIAogICAgCQkJCSAKCQkJCSAKCiAgICB2b2lkIENhbGxCYWNrKCk7CQkg CgkJCQkgCgogIHByaXZhdGU6CiAgICBpbnQgcmVhZEZpbGVObzsJCQkgCiAgICBDYWxsQmFja09i aiAqY2FsbFdoZW5BdmFpbDsJCSAKCQkJCQkgCiAgICBjaGFyIGluY29taW5nOyAgICAJCQkgCgkJ CQkJIAoJCQkJCSAKfTsKCmNsYXNzIENvbnNvbGVPdXRwdXQgOiBwdWJsaWMgQ2FsbEJhY2tPYmog ewogIHB1YmxpYzoKICAgIENvbnNvbGVPdXRwdXQoY2hhciAqd3JpdGVGaWxlLCBDYWxsQmFja09i aiAqdG9DYWxsKTsKCQkJCSAKICAgIH5Db25zb2xlT3V0cHV0KCk7CQkgCgogICAgdm9pZCBQdXRD aGFyKGNoYXIgY2gpOwkgCgkJCQkgCgkJCQkgCgogICAgdm9pZCBDYWxsQmFjaygpOwkJIAoJCQkJ IAoKICBwcml2YXRlOgogICAgaW50IHdyaXRlRmlsZU5vOwkJCSAKICAgIENhbGxCYWNrT2JqICpj YWxsV2hlbkRvbmU7CQkgCgkJCQkJIAogICAgYm9vbCBwdXRCdXN5OyAgICAJCQkgCgkJCQkJIAp9 OwoKCiMgMjEgIi4uLy4uL3VzZXJwcm9nL3N5bmNoY29uc29sZS5oIiAyCgojIDEgIi4uLy4uL3Ro cmVhZHMvc3luY2guaCIgMQogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgoKCgpjbGFz cyBMb2NrOwpjbGFzcyBTZW1hcGhvcmU7CmNsYXNzIENvbmRpdGlvbjsKCiMgMSAiLi4vLi4vbGli L2NvcHlyaWdodC5oIiAxCiAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgojIDI1ICIuLi8uLi90aHJl YWRzL3N5bmNoLmgiIDIKCiMgMSAiLi4vLi4vdGhyZWFkcy9tYWluLmgiIDEKIAogCiAKIAogCiAK IAogCgojIDMyICIuLi8uLi90aHJlYWRzL21haW4uaCIKCgojIDI2ICIuLi8uLi90aHJlYWRzL3N5 bmNoLmgiIDIKCgoKCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAoKY2xhc3MgU2VtYXBob3Jl IHsKICBwdWJsaWM6CiAgICBTZW1hcGhvcmUoY2hhciogZGVidWdOYW1lLCBpbnQgaW5pdGlhbFZh bHVlKTsJIAogICAgflNlbWFwaG9yZSgpOyAgIAkJCQkJIAogICAgY2hhciogZ2V0TmFtZSgpIHsg cmV0dXJuIG5hbWU7fQkJCSAKICAgIAogICAgdm9pZCBQKCk7CSAJIAogICAgdm9pZCBWKCk7CSAJ IAogICAgdm9pZCBTZWxmVGVzdCgpOwkgCiAgICAKICBwcml2YXRlOgogICAgY2hhciogbmFtZTsg ICAgICAgICAKICAgIGludCB2YWx1ZTsgICAgICAgICAgCiAgICBMaXN0PFRocmVhZCAqPiAqcXVl dWU7ICAgICAKCQkgIAkgCiAgIH07CgogCiAKIAogCiAKIAogCiAKIAogCiAKCmNsYXNzIExvY2sg ewogIHB1YmxpYzoKICAgIExvY2soY2hhciogZGVidWdOYW1lKTsgIAkgCiAgICB+TG9jaygpOwkJ CSAKICAgIGNoYXIqIGdldE5hbWUoKSB7IHJldHVybiBuYW1lOyB9CSAKCiAgICB2b2lkIEFjcXVp cmUoKTsgCQkgCiAgICB2b2lkIFJlbGVhc2UoKTsgCQkgCgogICAgYm9vbCBJc0hlbGRCeUN1cnJl bnRUaHJlYWQoKTsgCiAgICAJCQkJIAoJCQkJIAogICAgCiAgICAgCiAgICAKICBwcml2YXRlOgog ICAgY2hhciAqbmFtZTsJCQkgCiAgICBUaHJlYWQgKmxvY2tIb2xkZXI7CQkgCiAgICBTZW1hcGhv cmUgKnNlbWFwaG9yZTsJIAp9OwoKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAK IAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCgpjbGFzcyBDb25kaXRpb24gewogIHB1YmxpYzoK ICAgIENvbmRpdGlvbihjaGFyKiBkZWJ1Z05hbWUpOwkgCgkJCQkJIAogICAgfkNvbmRpdGlvbigp OwkJCSAKICAgIGNoYXIqIGdldE5hbWUoKSB7IHJldHVybiAobmFtZSk7IH0KICAgIAogICAgdm9p ZCBXYWl0KExvY2sgKmNvbmRpdGlvbkxvY2spOyAJIAoJCQkJCSAKCQkJCQkgCgkJCQkJIAogICAg dm9pZCBTaWduYWwoTG9jayAqY29uZGl0aW9uTG9jayk7ICAgIAogICAgdm9pZCBCcm9hZGNhc3Qo TG9jayAqY29uZGl0aW9uTG9jayk7IAoJCQkJCSAKICAgICAKCiAgcHJpdmF0ZToKICAgIGNoYXIq IG5hbWU7CiAgICBMaXN0PFNlbWFwaG9yZSAqPiAqd2FpdFF1ZXVlOwkgCn07CgojIDIyICIuLi8u Li91c2VycHJvZy9zeW5jaGNvbnNvbGUuaCIgMgoKCiAKIAoKY2xhc3MgU3luY2hDb25zb2xlSW5w dXQgOiBwdWJsaWMgQ2FsbEJhY2tPYmogewogIHB1YmxpYzoKICAgIFN5bmNoQ29uc29sZUlucHV0 KGNoYXIgKmlucHV0RmlsZSk7ICAKICAgIH5TeW5jaENvbnNvbGVJbnB1dCgpOwkJIAoKICAgIGNo YXIgR2V0Q2hhcigpOwkJIAogICAgCiAgcHJpdmF0ZToKICAgIENvbnNvbGVJbnB1dCAqY29uc29s ZUlucHV0OwkgCiAgICBMb2NrICpsb2NrOwkJCSAKICAgIFNlbWFwaG9yZSAqd2FpdEZvcjsJCSAK CiAgICB2b2lkIENhbGxCYWNrKCk7CQkgCn07CgpjbGFzcyBTeW5jaENvbnNvbGVPdXRwdXQgOiBw dWJsaWMgQ2FsbEJhY2tPYmogewogIHB1YmxpYzoKICAgIFN5bmNoQ29uc29sZU91dHB1dChjaGFy ICpvdXRwdXRGaWxlKTsgIAogICAgflN5bmNoQ29uc29sZU91dHB1dCgpOwoKICAgIHZvaWQgUHV0 Q2hhcihjaGFyIGNoKTsJIAogICAgCiAgcHJpdmF0ZToKICAgIENvbnNvbGVPdXRwdXQgKmNvbnNv bGVPdXRwdXQ7IAogICAgTG9jayAqbG9jazsJCQkgCiAgICBTZW1hcGhvcmUgKndhaXRGb3I7CQkg CgogICAgdm9pZCBDYWxsQmFjaygpOwkJIAp9OwoKCiMgMjAgIi4uLy4uL3VzZXJwcm9nL3VzZXJr ZXJuZWwuaCIgMgoKCiMgMSAiLi4vLi4vbGliL2JpdG1hcC5oIiAxCiAKIAogCiAKIAogCiAKIAog CiAKIAogCiAKCgoKCiMgMSAiLi4vLi4vbGliL2NvcHlyaWdodC5oIiAxCiAKCgoKCgoKCgoKCgoK CgoKCgoKCgoKCgojIDE4ICIuLi8uLi9saWIvYml0bWFwLmgiIDIKCgoKIApjb25zdCBpbnQgQml0 c0luQnl0ZSA9CTg7CmNvbnN0IGludCBCaXRzSW5Xb3JkID0gc2l6ZW9mKHVuc2lnbmVkIGludCkg KiBCaXRzSW5CeXRlOwoKIAogCiAKIAogCiAKIAoKY2xhc3MgQml0bWFwIHsKICBwdWJsaWM6CiAg ICBCaXRtYXAoaW50IG51bUl0ZW1zKTsJIAoJCQkJIAogICAgfkJpdG1hcCgpOwkJCSAKICAgIAog ICAgdm9pZCBNYXJrKGludCB3aGljaCk7ICAgCSAKICAgIHZvaWQgQ2xlYXIoaW50IHdoaWNoKTsg IAkgCiAgICBib29sIFRlc3QoaW50IHdoaWNoKSBjb25zdDsJIAogICAgaW50IEZpbmRBbmRTZXQo KTsgICAgICAgICAgCgkJCQkgCgkJCQkgCiAgICBpbnQgTnVtQ2xlYXIoKSBjb25zdDsJIAoKICAg IHZvaWQgUHJpbnQoKSBjb25zdDsJCSAKICAgIHZvaWQgU2VsZlRlc3QoKTsJCSAKICAgIAogIHBy b3RlY3RlZDoKICAgIGludCBudW1CaXRzOwkJIAogICAgaW50IG51bVdvcmRzOwkJIAoJCQkJIAoJ CQkJIAoJCQkJIAogICAgdW5zaWduZWQgaW50ICptYXA7CQkgCn07CgoKIyAyMiAiLi4vLi4vdXNl cnByb2cvdXNlcmtlcm5lbC5oIiAyCgoKCmNsYXNzIFVzZXJQcm9nS2VybmVsIDogcHVibGljIFRo cmVhZGVkS2VybmVsIHsKICBwdWJsaWM6CiAgICBVc2VyUHJvZ0tlcm5lbChpbnQgYXJnYywgY2hh ciAqKmFyZ3YpOwoJCQkJIAogICAgflVzZXJQcm9nS2VybmVsKCk7CQkgCgogICAgdm9pZCBJbml0 aWFsaXplKCk7CQkgCgogICAgdm9pZCBSdW4oKTsJCQkgCgogICAgdm9pZCBTZWxmVGVzdCgpOwkJ IAoKIAogICAgTWFjaGluZSAqbWFjaGluZTsKICAgIFN5bmNoQ29uc29sZU91dHB1dCAqY29uc29s ZU91dHB1dDsKICAgIFN5bmNoQ29uc29sZUlucHV0ICpjb25zb2xlSW5wdXQ7CgoKICAgIEJpdG1h cCAqcGh5c2ljYWxNZW1vcnk7CiAgICBMb2NrICpwaHlzTWVtTG9jazsKCgoKICAgIFBhZ2VUYWJs ZUVudHJ5ICpJbnZlcnRlZFBUW051bVBoeXNQYWdlc107ICAKICAgIGJvb2wgQWxsb2NQaHlzUGFn ZShQYWdlVGFibGVFbnRyeSAqcHRlKTsgIAogICAgCgogICAgCiAgICAKICBwcml2YXRlOgogICAg Ym9vbCBkZWJ1Z1VzZXJQcm9nOwkJIAp9OwoKCgojIDIxICIuLi8uLi90aHJlYWRzL21haW4uaCIg MgoKCgoKCgoKCmV4dGVybiBVc2VyUHJvZ0tlcm5lbCAgKmtlcm5lbDsKZXh0ZXJuIERlYnVnICpk ZWJ1ZzsKCgoKIyAyNSAiL3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFjaGluZS9pbnRlcnJ1cHQu Y2MiIDIKCgogCgpzdGF0aWMgY2hhciAqaW50TGV2ZWxOYW1lc1tdID0geyAib2ZmIiwgIm9uIn07 CnN0YXRpYyBjaGFyICppbnRUeXBlTmFtZXNbXSA9IHsgInRpbWVyIiwgImRpc2siLCAiY29uc29s ZSB3cml0ZSIsIAoJCQkiY29uc29sZSByZWFkIiwgImVsZXZhdG9yIiwgIm5ldHdvcmsgc2VuZCIs IAoJCQkibmV0d29yayByZWN2In07CgogCiAKIAogCiAKIAogCiAKIAoKUGVuZGluZ0ludGVycnVw dDo6UGVuZGluZ0ludGVycnVwdChDYWxsQmFja09iaiAqY2FsbE9uSW50LCAKCQkJCQlpbnQgdGlt ZSwgSW50VHlwZSBraW5kKQp7CiAgICBjYWxsT25JbnRlcnJ1cHQgPSBjYWxsT25JbnQ7CiAgICB3 aGVuID0gdGltZTsKICAgIHR5cGUgPSBraW5kOwp9CgogCiAKIAogCgpzdGF0aWMgaW50ClBlbmRp bmdDb21wYXJlIChQZW5kaW5nSW50ZXJydXB0ICp4LCBQZW5kaW5nSW50ZXJydXB0ICp5KQp7CiAg ICBpZiAoeC0+d2hlbiA8IHktPndoZW4pIHsgcmV0dXJuIC0xOyB9CiAgICBlbHNlIGlmICh4LT53 aGVuID4geS0+d2hlbikgeyByZXR1cm4gMTsgfQogICAgZWxzZSB7IHJldHVybiAwOyB9Cn0KCiAK IAogCiAKIAogCgpJbnRlcnJ1cHQ6OkludGVycnVwdCgpCnsKICAgIGxldmVsID0gSW50T2ZmOwog ICAgcGVuZGluZyA9IG5ldyBTb3J0ZWRMaXN0PFBlbmRpbmdJbnRlcnJ1cHQgKj4oUGVuZGluZ0Nv bXBhcmUpOwogICAgaW5IYW5kbGVyID0gZmFsc2UgOwogICAgeWllbGRPblJldHVybiA9IGZhbHNl IDsKICAgIHN0YXR1cyA9IFN5c3RlbU1vZGU7Cn0KCiAKIAogCiAKCkludGVycnVwdDo6fkludGVy cnVwdCgpCnsKICAgIHdoaWxlICghcGVuZGluZy0+SXNFbXB0eSgpKSB7CglkZWxldGUgcGVuZGlu Zy0+UmVtb3ZlRnJvbnQoKTsKICAgIH0KICAgIGRlbGV0ZSBwZW5kaW5nOwp9CgogCiAKIAogCiAK IAogCiAKIAogCgp2b2lkCkludGVycnVwdDo6Q2hhbmdlTGV2ZWwoSW50U3RhdHVzIG9sZCwgSW50 U3RhdHVzIG5vdykKewogICAgbGV2ZWwgPSBub3c7CiAgICBpZiAoIWRlYnVnLT5Jc0VuYWJsZWQo IGRiZ0ludCApKSB7fSBlbHNlIHsgcHJpbnRmICAoIlx0aW50ZXJydXB0czogJXMgLT4gJXNcbiIs IGludExldmVsTmFtZXNbb2xkXSwgaW50TGV2ZWxOYW1lc1tub3ddKSA7IH0gOwp9CgogCiAKIAog CiAKIAogCiAKIAogCgpJbnRTdGF0dXMKSW50ZXJydXB0OjpTZXRMZXZlbChJbnRTdGF0dXMgbm93 KQp7CiAgICBJbnRTdGF0dXMgb2xkID0gbGV2ZWw7CiAgICAKICAgICAKICAgIGlmICggKG5vdyA9 PSBJbnRPZmYpIHx8IChpbkhhbmRsZXIgPT0gZmFsc2UgKSApIHt9IGVsc2UgeyBwcmludGYoIkFz c2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xuIiwgMTI5LCAiL3Vzci9jbGFzcy9jczE0 MC9uYWNob3MvbWFjaGluZS9pbnRlcnJ1cHQuY2MiKTsgQWJvcnQoKTsgfSA7CgogICAgQ2hhbmdl TGV2ZWwob2xkLCBub3cpOwkJCSAKICAgIGlmICgobm93ID09IEludE9uKSAmJiAob2xkID09IElu dE9mZikpIHsKCU9uZVRpY2soKTsJCQkJIAogICAgfQogICAgcmV0dXJuIG9sZDsKfQoKIAogCiAK IAogCiAKIAogCiAKdm9pZApJbnRlcnJ1cHQ6Ok9uZVRpY2soKQp7CiAgICBNYWNoaW5lU3RhdHVz IG9sZFN0YXR1cyA9IHN0YXR1czsKICAgIFN0YXRpc3RpY3MgKnN0YXRzID0ga2VybmVsLT5zdGF0 czsKCiAKICAgIGlmIChzdGF0dXMgPT0gU3lzdGVtTW9kZSkgewogICAgICAgIHN0YXRzLT50b3Rh bFRpY2tzICs9IFN5c3RlbVRpY2s7CglzdGF0cy0+c3lzdGVtVGlja3MgKz0gU3lzdGVtVGljazsK ICAgIH0gZWxzZSB7CQkJCQkgCglzdGF0cy0+dG90YWxUaWNrcyArPSBVc2VyVGljazsKCXN0YXRz LT51c2VyVGlja3MgKz0gVXNlclRpY2s7CiAgICB9CiAgICBpZiAoIWRlYnVnLT5Jc0VuYWJsZWQo IGRiZ0ludCApKSB7fSBlbHNlIHsgcHJpbnRmICAoIj09IFRpY2sgJWQgPT1cbiIsIHN0YXRzLT50 b3RhbFRpY2tzKSA7IH0gOwoKIAogICAgQ2hhbmdlTGV2ZWwoSW50T24sIEludE9mZik7CSAKCQkJ CSAKCQkJCSAKICAgIENoZWNrSWZEdWUoZmFsc2UgKTsJCSAKICAgIENoYW5nZUxldmVsKEludE9m ZiwgSW50T24pOwkgCiAgICBpZiAoeWllbGRPblJldHVybikgewkgCiAgICAJCQkJIAoJeWllbGRP blJldHVybiA9IGZhbHNlIDsKIAlzdGF0dXMgPSBTeXN0ZW1Nb2RlOwkJIAoJa2VybmVsLT5jdXJy ZW50VGhyZWFkLT5ZaWVsZCgpOwoJc3RhdHVzID0gb2xkU3RhdHVzOwogICAgfQp9CgogCiAKIAog CiAKIAogCiAKIAogCgp2b2lkCkludGVycnVwdDo6WWllbGRPblJldHVybigpCnsgCiAgICBpZiAo IGluSGFuZGxlciA9PSB0cnVlICApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6 IGxpbmUgJWQgZmlsZSAlc1xuIiwgMTkyLCAiL3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFjaGlu ZS9pbnRlcnJ1cHQuY2MiKTsgQWJvcnQoKTsgfSA7ICAKICAgIHlpZWxkT25SZXR1cm4gPSB0cnVl IDsgCn0KCiAKIAogCiAKIAogCiAKIAogCiAKIAp2b2lkCkludGVycnVwdDo6SWRsZSgpCnsKICAg IGlmICghZGVidWctPklzRW5hYmxlZCggZGJnSW50ICkpIHt9IGVsc2UgeyBwcmludGYgICgiTWFj aGluZSBpZGxpbmc7IGNoZWNraW5nIGZvciBpbnRlcnJ1cHRzLlxuIikgOyB9IDsKICAgIHN0YXR1 cyA9IElkbGVNb2RlOwogICAgaWYgKENoZWNrSWZEdWUodHJ1ZSApKSB7CSAKCXN0YXR1cyA9IFN5 c3RlbU1vZGU7CglyZXR1cm47CQkJIAoJCQkJIAogICAgfQoKICAgICAKICAgICAKICAgICAKICAg ICAKCiAgICBpZiAoIWRlYnVnLT5Jc0VuYWJsZWQoIGRiZ0ludCApKSB7fSBlbHNlIHsgcHJpbnRm ICAoIk1hY2hpbmUgaWRsZS4gIE5vIGludGVycnVwdHMgdG8gZG8uXG4iKSA7IH0gOwogICAgcHJp bnRmKCJObyB0aHJlYWRzIHJlYWR5IG9yIHJ1bm5hYmxlLCBhbmQgbm8gcGVuZGluZyBpbnRlcnJ1 cHRzLlxuIik7CiAgICBwcmludGYoIkFzc3VtaW5nIHRoZSBwcm9ncmFtIGNvbXBsZXRlZC5cbiIp OwogICAgSGFsdCgpOwp9CgogCiAKIAogCnZvaWQKSW50ZXJydXB0OjpIYWx0KCkKewogICAgcHJp bnRmKCJNYWNoaW5lIGhhbHRpbmchXG5cbiIpOwogICAga2VybmVsLT5zdGF0cy0+UHJpbnQoKTsK ICAgIGRlbGV0ZSBrZXJuZWw7CSAKfQoKIAogCiAKIAogCiAKIAogCiAKIAogCiAKIAogCiAKdm9p ZApJbnRlcnJ1cHQ6OlNjaGVkdWxlKENhbGxCYWNrT2JqICp0b0NhbGwsIGludCBmcm9tTm93LCBJ bnRUeXBlIHR5cGUpCnsKICAgIGludCB3aGVuID0ga2VybmVsLT5zdGF0cy0+dG90YWxUaWNrcyAr IGZyb21Ob3c7CiAgICBQZW5kaW5nSW50ZXJydXB0ICp0b09jY3VyID0gbmV3IFBlbmRpbmdJbnRl cnJ1cHQodG9DYWxsLCB3aGVuLCB0eXBlKTsKCiAgICBpZiAoIWRlYnVnLT5Jc0VuYWJsZWQoIGRi Z0ludCApKSB7fSBlbHNlIHsgcHJpbnRmICAoIlNjaGVkdWxpbmcgaW50ZXJydXB0IGhhbmRsZXIg dGhlICVzIGF0IHRpbWUgPSAlZFxuIiwgaW50VHlwZU5hbWVzW3R5cGVdLCB3aGVuKSA7IH0gOwog ICAgaWYgKCBmcm9tTm93ID4gMCApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6 IGxpbmUgJWQgZmlsZSAlc1xuIiwgMjYzLCAiL3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFjaGlu ZS9pbnRlcnJ1cHQuY2MiKTsgQWJvcnQoKTsgfSA7CgogICAgcGVuZGluZy0+SW5zZXJ0KHRvT2Nj dXIpOwp9CgogCiAKIAogCiAKIAogCiAKIAogCiAKIApib29sCkludGVycnVwdDo6Q2hlY2tJZkR1 ZShib29sIGFkdmFuY2VDbG9jaykKewogICAgUGVuZGluZ0ludGVycnVwdCAqbmV4dDsKICAgIFN0 YXRpc3RpY3MgKnN0YXRzID0ga2VybmVsLT5zdGF0czsKCiAgICBpZiAoIGxldmVsID09IEludE9m ZiApIHt9IGVsc2UgeyBwcmludGYoIkFzc2VydGlvbiBmYWlsZWQ6IGxpbmUgJWQgZmlsZSAlc1xu IiwgMjg2LCAiL3Vzci9jbGFzcy9jczE0MC9uYWNob3MvbWFjaGluZS9pbnRlcnJ1cHQuY2MiKTsg QWJvcnQoKTsgfSA7CQkgCgkJCQkJIAogICAgaWYgKGRlYnVnLT5Jc0VuYWJsZWQoZGJnSW50KSkg ewoJRHVtcFN0YXRlKCk7CiAgICB9CiAgICBpZiAocGVuZGluZy0+SXNFbXB0eSgpKSB7ICAgCSAK CXJldHVybiBmYWxzZSA7CQogICAgfQkJCiAgICBuZXh0ID0gcGVuZGluZy0+RnJvbnQoKTsKICAg IGlmIChuZXh0LT53aGVuID4gc3RhdHMtPnRvdGFsVGlja3MpIHsKICAgICAgICBpZiAoIWFkdmFu Y2VDbG9jaykgewkJIAogICAgICAgICAgICByZXR1cm4gZmFsc2UgOwogICAgICAgIH0KICAgICAg ICBlbHNlIHsgICAgICAJCSAKCSAgICBzdGF0cy0+aWRsZVRpY2tzICs9IChuZXh0LT53aGVuIC0g c3RhdHMtPnRvdGFsVGlja3MpOwoJICAgIHN0YXRzLT50b3RhbFRpY2tzID0gbmV4dC0+d2hlbjsK CX0KICAgIH0KCiAgICBpZiAoIWRlYnVnLT5Jc0VuYWJsZWQoIGRiZ0ludCApKSB7fSBlbHNlIHsg cHJpbnRmICAoIkludm9raW5nIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgJXMgYXQgdGltZSAl ZFxuIiwKCSAgaW50VHlwZU5hbWVzW25leHQtPnR5cGVdLCBuZXh0LT53aGVuKSA7IH0gOwoKICAg IGlmIChrZXJuZWwtPm1hY2hpbmUgIT0gMCApIHsKICAgIAlrZXJuZWwtPm1hY2hpbmUtPkRlbGF5 ZWRMb2FkKDAsIDApOwogICAgfQoKICAgIGluSGFuZGxlciA9IHRydWUgOwogICAgZG8gewogICAg ICAgIG5leHQgPSBwZW5kaW5nLT5SZW1vdmVGcm9udCgpOyAgICAgCiAgICAgICAgbmV4dC0+Y2Fs bE9uSW50ZXJydXB0LT5DYWxsQmFjaygpOyAKCWRlbGV0ZSBuZXh0OwogICAgfSB3aGlsZSAoIXBl bmRpbmctPklzRW1wdHkoKSAKICAgIAkJJiYgKHBlbmRpbmctPkZyb250KCktPndoZW4gPD0gc3Rh dHMtPnRvdGFsVGlja3MpKTsKICAgIGluSGFuZGxlciA9IGZhbHNlIDsKICAgIHJldHVybiB0cnVl IDsKfQoKIAogCiAKIAogCgpzdGF0aWMgdm9pZApQcmludFBlbmRpbmcgKFBlbmRpbmdJbnRlcnJ1 cHQgKnBlbmRpbmcpCnsKICAgIHByaW50ZigiSW50ZXJydXB0IGhhbmRsZXIgJXMiLGludFR5cGVO YW1lc1twZW5kaW5nLT50eXBlXSk7CiAgICBwcmludGYoIiwgc2NoZWR1bGVkIGF0ICVkXG4iLCBw ZW5kaW5nLT53aGVuKTsKfQoKIAogCiAKIAogCgp2b2lkCkludGVycnVwdDo6RHVtcFN0YXRlKCkK ewogICAgcHJpbnRmKCJUaW1lOiAlZCIsIGtlcm5lbC0+c3RhdHMtPnRvdGFsVGlja3MpOwogICAg cHJpbnRmKCIsIGludGVycnVwdHMgJXNcbiIsIGludExldmVsTmFtZXNbbGV2ZWxdKTsKICAgIHBy aW50ZigiUGVuZGluZyBpbnRlcnJ1cHRzOlxuIik7CiAgICBwZW5kaW5nLT5BcHBseShQcmludFBl bmRpbmcpOwogICAgcHJpbnRmKCJcbkVuZCBvZiBwZW5kaW5nIGludGVycnVwdHNcbiIpOwp9Cg==