public inbox for gcc-prs@sourceware.org help / color / mirror / Atom feed
From: adam@os.inf.tu-dresden.de To: gcc-gnats@gcc.gnu.org Subject: optimization/9570: Assember error with -finline-functions with g++-3.3 Date: Tue, 04 Feb 2003 13:46:00 -0000 [thread overview] Message-ID: <20030204134531.16954.qmail@sources.redhat.com> (raw) >Number: 9570 >Category: optimization >Synopsis: Assember error with -finline-functions with g++-3.3 >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Tue Feb 04 13:46:00 UTC 2003 >Closed-Date: >Last-Modified: >Originator: Adam Lackorzynski >Release: gcc version 3.3 20030203 (prerelease), >Organization: >Environment: Debian Woody/3.0_r1, x86, Linux 2.4.20, SMP >Description: Hi, compiling the attached code with g++ -c -fno-rtti -fno-exceptions -march=i586 -fno-defer-pop -freg-struct-return -g -Wall -W -finline-limit=2000 -finline-functions -O2 profile.ii -o profile.o -save-temps gives the following assembler error: profile.s: Assembler messages: profile.s:501: Error: attempt to .org backwards When removing -finline-functions (or using -O2 instead of -O3) it compiles fine. It also works with g++-3.2. The GNU as version is GNU assembler version 2.13.90.0.16 (i386-linux) using BFD version 2.13.90.0.16 20021126 Debian GNU/Linux I don't know if this behaviour could also be related to "as". >How-To-Repeat: >Fix: Don't use -finline-functions or -O3 or higher, or use g++-3.2 >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/octet-stream; name="profile.ii" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="profile.ii" IyAxICJhdXRvL3Byb2ZpbGUuY2MiCiMgMSAiPGJ1aWx0LWluPiIKIyAxICI8Y29tbWFuZCBsaW5l PiIKIyAxICJhdXRvL3Byb2ZpbGUuY2MiCgoKIyAxICJhdXRvL3Byb2ZpbGUuaCIgMQoKCgoKCiMg MSAiLi4vc3JjL3R5cGVzL3R5cGVzLmgiIDEKIyAxMSAiLi4vc3JjL3R5cGVzL3R5cGVzLmgiCiMg MSAiL2hvbWUvYWRhbS9lcndpbi90bXAvZ2NjLzMuMy9pbnN0L2xpYi9nY2MtbGliL2k2ODYtcGMt bGludXgtZ251LzMuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMgNAojIDE1MSAiL2hvbWUvYWRhbS9l cndpbi90bXAvZ2NjLzMuMy9pbnN0L2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzMuMy9p bmNsdWRlL3N0ZGRlZi5oIiAzIDQKdHlwZWRlZiBpbnQgcHRyZGlmZl90OwojIDIxMyAiL2hvbWUv YWRhbS9lcndpbi90bXAvZ2NjLzMuMy9pbnN0L2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251 LzMuMy9pbmNsdWRlL3N0ZGRlZi5oIiAzIDQKdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90Owoj IDEyICIuLi9zcmMvdHlwZXMvdHlwZXMuaCIgMgojIDEgIi4uL3NyYy90eXBlcy9pYTMyL3R5cGVz LWFyY2guaCIgMQoKCgoKCgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVW5zaWduZWQ4Owp0eXBlZGVm IHNpZ25lZCBjaGFyIFNpZ25lZDg7CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVW5zaWduZWQxNjsK dHlwZWRlZiBzaWduZWQgc2hvcnQgU2lnbmVkMTY7CnR5cGVkZWYgdW5zaWduZWQgaW50IFVuc2ln bmVkMzI7CnR5cGVkZWYgc2lnbmVkIGludCBTaWduZWQzMjsKdHlwZWRlZiB1bnNpZ25lZCBsb25n IGxvbmcgaW50IFVuc2lnbmVkNjQ7CnR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnQgU2lnbmVk NjQ7CgoKdHlwZWRlZiBTaWduZWQzMiBTbXdvcmQ7CnR5cGVkZWYgVW5zaWduZWQzMiBNd29yZDsK ZW51bSB7CiAgTVdPUkRfQklUUyA9MzIKfTsKCgp0eXBlZGVmIFVuc2lnbmVkMzIgdm1fb2Zmc2V0 X3Q7CnR5cGVkZWYgVW5zaWduZWQzMiBBZGRyZXNzOwoKCnR5cGVkZWYgVW5zaWduZWQzMiB2bV9z aXplX3Q7Cgp0eXBlZGVmIFVuc2lnbmVkNjQgQ3B1X3RpbWU7CiMgMTMgIi4uL3NyYy90eXBlcy90 eXBlcy5oIiAyCgoKCnRlbXBsYXRlPCB0eXBlbmFtZSBhLCB0eXBlbmFtZSBiID4gaW5saW5lCmEg bm9udWxsX3N0YXRpY19jYXN0KCBiIHAgKQp7CiAgaW50IGQgPSByZWludGVycHJldF9jYXN0PGlu dD4oc3RhdGljX2Nhc3Q8YT4ocmVpbnRlcnByZXRfY2FzdDxiPigxMCkpKSAtIDEwOwogIHJldHVy biByZWludGVycHJldF9jYXN0PGE+KCByZWludGVycHJldF9jYXN0PE13b3JkPihwKSArIGQgKTsK fQoKCgoKdHlwZWRlZiBzdHJ1Y3QgeyBVbnNpZ25lZDMyIGxvdywgaGlnaDsgfSBsNF9sb3dfaGln aF90OwoKCnR5cGVkZWYgc3RydWN0IHsgQWRkcmVzcyBsb3csIGhpZ2g7IH0gbDRfYWRkcl9yYW5n ZV90OwoKCgp0eXBlZGVmIFNtd29yZCBzc2l6ZV90OwojIDcgImF1dG8vcHJvZmlsZS5oIiAyCgoK CgoKCmNsYXNzIHByb2ZpbGUKewogIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRpY2tzOwogIHN0YXRp YyBib29sIGV4aXQ7CgpwdWJsaWM6CgoKCgogIHN0YXRpYyB2b2lkIGluaXQoKTsKCiAgc3RhdGlj IHZvaWQgc3RhcnQoKTsKCiAgc3RhdGljIHZvaWQgc3RvcCgpOwoKICBzdGF0aWMgdm9pZCBzdG9w X2FuZF9kdW1wKCk7CgogIHN0YXRpYyB2b2lkIGhhbmRsZV9wcm9maWxlX2ludGVycnVwdCh2bV9v ZmZzZXRfdCBwYyk7Cn07CgpleHRlcm4gIkMiIHZvaWQgcHJvZmlsZV9pbnRlcnJ1cHQodm1fb2Zm c2V0X3QgcGMpOwoKZXh0ZXJuICJDIiB2b2lkIHByb2ZpbGVfbWNvdW50X3dyYXAodW5zaWduZWQg c2hvcnQgKmZyb21wY2luZGV4LCBjaGFyICpzZWxmcGMgKTsKIyA0ICJhdXRvL3Byb2ZpbGUuY2Mi IDIKIyAxICJhdXRvL3Byb2ZpbGVfaS5oIiAxCgoKCgoKIyAxICIuLi9zcmMvbGliL21pbmlsaWJj L2luY2x1ZGUvY3N0ZGxpYiIgMQoKCgoKCiMgMSAiLi4vc3JjL2xpYi9taW5pbGliYy9pbmNsdWRl L3N0ZGxpYi5oIiAxCgoKCiMgMSAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvY2RlZnMuaCIgMQoj IDUgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9zdGRsaWIuaCIgMgojIDEgIi9ob21lL2Fk YW0vZXJ3aW4vdG1wL2djYy8zLjMvaW5zdC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8z LjMvaW5jbHVkZS9zdGRkZWYuaCIgMSAzIDQKIyA2ICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1 ZGUvc3RkbGliLmgiIDIKCmV4dGVybiAiQyIgewoKaW50IGF0ZXhpdCh2b2lkICgqZnVuY3Rpb24p KHZvaWQpKTsKCmRvdWJsZSBzdHJ0b2QoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0cik7 CmxvbmcgaW50IHN0cnRvbChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFz ZSk7CnVuc2lnbmVkIGxvbmcgaW50IHN0cnRvdWwoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVu ZHB0ciwgaW50IGJhc2UpOwoKZXh0ZXJuIGludCBfX2x0b3N0cihjaGFyICpzLCB1bnNpZ25lZCBp bnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBpLCB1bnNpZ25lZCBpbnQgYmFzZSwgaW50IFVwQ2FzZSk7 CmV4dGVybiBpbnQgX19kdG9zdHIoZG91YmxlIGQsY2hhciAqYnVmLHVuc2lnbmVkIGludCBtYXhs ZW4sdW5zaWduZWQgaW50IHByZWMpOwoKCl9fZXh0ZW5zaW9uX18gbG9uZyBsb25nIGludCBzdHJ0 b2xsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKTsKX19leHRlbnNp b25fXyB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHN0cnRvdWxsKGNvbnN0IGNoYXIgKm5wdHIsIGNo YXIgKiplbmRwdHIsIGludCBiYXNlKTsKX19leHRlbnNpb25fXyBpbnQgX19sbHRvc3RyKGNoYXIg KnMsIHVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBsb25nIGxvbmcgaSwgdW5zaWduZWQgaW50 IGJhc2UsIGludCBVcENhc2UpOwoKCmludCBhdG9pKGNvbnN0IGNoYXIgKm5wdHIpOwpsb25nIGlu dCBhdG9sKGNvbnN0IGNoYXIgKm5wdHIpOwpkb3VibGUgYXRvZihjb25zdCBjaGFyICpucHRyKTsK CgoKCnZvaWQgZXhpdChpbnQgc3RhdHVzKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwp2b2lk IGFib3J0KHZvaWQpOwoKCgoKdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgcXVvdCxyZW07IH0gZGl2X3Q7 CmRpdl90IGRpdihpbnQgbnVtZXIsIGludCBkZW5vbSkgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsK CnR5cGVkZWYgc3RydWN0IHsgbG9uZyBpbnQgcXVvdCxyZW07IH0gbGRpdl90OwpsZGl2X3QgbGRp dihsb25nIGludCBudW1lciwgbG9uZyBpbnQgZGVub20pIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7 Cgp0eXBlZGVmIHN0cnVjdCB7IGxvbmcgbG9uZyBpbnQgcXVvdCxyZW07IH0gbGxkaXZfdDsKbGxk aXZfdCBsbGRpdihsb25nIGxvbmcgaW50IG51bWVyLCBsb25nIGxvbmcgaW50IGRlbm9tKSBfX2F0 dHJpYnV0ZV9fKChjb25zdCkpOwoKaW50IGFicyhpbnQgaSkgX19hdHRyaWJ1dGVfXygoY29uc3Qp KTsKbG9uZyBpbnQgbGFicyhsb25nIGludCBpKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwpfX2V4 dGVuc2lvbl9fIGxvbmcgbG9uZyBpbnQgbGxhYnMobG9uZyBsb25nIGludCBpKSBfX2F0dHJpYnV0 ZV9fKChjb25zdCkpOwoKfQojIDcgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9jc3RkbGli IiAyCgoKbmFtZXNwYWNlIHN0ZCB7CgoKCiAgdXNpbmcgOjphdGV4aXQ7CiAgdXNpbmcgOjphYnM7 CiAgdXNpbmcgOjpsYWJzOwogIHVzaW5nIDo6ZGl2X3Q7CiAgdXNpbmcgOjpsZGl2X3Q7CiAgdXNp bmcgOjpsbGRpdl90OwogIHVzaW5nIDo6ZGl2OwogIHVzaW5nIDo6bGRpdjsKICB1c2luZyA6Omxs ZGl2OwogIHVzaW5nIDo6ZXhpdDsKICB1c2luZyA6OmFib3J0OwogIHVzaW5nIDo6YXRvaTsKICB1 c2luZyA6OmF0b2w7CiAgdXNpbmcgOjphdG9mOwogIHVzaW5nIDo6c3RydG91bDsKICB1c2luZyA6 OnN0cnRvbDsKICB1c2luZyA6OnN0cnRvZDsKCgoKICBpbmxpbmUgbG9uZwogIGFicyhsb25nIGkp IHsgcmV0dXJuIGxhYnMoaSk7IH0KCiAgaW5saW5lIGxvbmcgbG9uZwogIGFicyhsb25nIGxvbmcg aSkgeyByZXR1cm4gbGxhYnMoaSk7IH0KCiAgaW5saW5lIGxkaXZfdAogIGRpdiggbG9uZyBpLCBs b25nIGogKSB7IHJldHVybiBsZGl2KGksaik7IH0KCiAgaW5saW5lIGxsZGl2X3QKICBkaXYoIGxv bmcgbG9uZyBpLCBsb25nIGxvbmcgaiApIHsgcmV0dXJuIGxsZGl2KGksaik7IH0KCn07CiMgNyAi YXV0by9wcm9maWxlX2kuaCIgMgojIDEgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2 L3NlZy5oIiAxCiMgNDQgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2L3NlZy5oIgpz dHJ1Y3QgeDg2X2Rlc2MgewogICAgICAgIHVuc2lnbmVkIGludCBsaW1pdF9sb3c6MTYsCiAgICAg ICAgICAgICAgICAgICAgICAgIGJhc2VfbG93OjE2LAogICAgICAgICAgICAgICAgICAgICAgICBi YXNlX21lZDo4LAogICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3M6OCwKICAgICAgICAgICAg ICAgICAgICAgICAgbGltaXRfaGlnaDo0LAogICAgICAgICAgICAgICAgICAgICAgICBncmFudWxh cml0eTo0LAogICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2hpZ2g6ODsKfTsKCgoKCnN0cnVj dCB4ODZfZ2F0ZSB7CiAgICAgICAgdW5zaWduZWQgaW50IG9mZnNldF9sb3c6MTYsCiAgICAgICAg ICAgICAgICAgICAgICAgIHNlbGVjdG9yOjE2LAogICAgICAgICAgICAgICAgICAgICAgICB3b3Jk X2NvdW50OjgsCiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzczo4LAogICAgICAgICAgICAg ICAgICAgICAgICBvZmZzZXRfaGlnaDoxNjsKfTsKIyAxMjcgIi4uL3NyYy9saWIva2Vybi9pbmNs dWRlL2ZsdXgveDg2L3NlZy5oIgpzdHJ1Y3QgcHNldWRvX2Rlc2NyaXB0b3IKewogICAgICAgIHNo b3J0IHBhZDsKICAgICAgICB1bnNpZ25lZCBzaG9ydCBsaW1pdDsKICAgICAgICB1bnNpZ25lZCBs b25nIGxpbmVhcl9iYXNlOwp9OwoKCgpleHRlcm4gX19pbmxpbmUgdm9pZApmaWxsX2Rlc2NyaXB0 b3Ioc3RydWN0IHg4Nl9kZXNjICpkZXNjLCB1bnNpZ25lZCBiYXNlLCB1bnNpZ25lZCBsaW1pdCwK ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYWNjZXNzLCB1bnNpZ25lZCBjaGFyIHNpemVi aXRzKQp7CiAgICAgICAgaWYgKGxpbWl0ID4gMHhmZmZmZikKICAgICAgICB7CiAgICAgICAgICAg ICAgICBsaW1pdCA+Pj0gMTI7CiAgICAgICAgICAgICAgICBzaXplYml0cyB8PSAweDg7CiAgICAg ICAgfQogICAgICAgIGRlc2MtPmxpbWl0X2xvdyA9IGxpbWl0ICYgMHhmZmZmOwogICAgICAgIGRl c2MtPmJhc2VfbG93ID0gYmFzZSAmIDB4ZmZmZjsKICAgICAgICBkZXNjLT5iYXNlX21lZCA9IChi YXNlID4+IDE2KSAmIDB4ZmY7CiAgICAgICAgZGVzYy0+YWNjZXNzID0gYWNjZXNzIHwgMHg4MDsK ICAgICAgICBkZXNjLT5saW1pdF9oaWdoID0gbGltaXQgPj4gMTY7CiAgICAgICAgZGVzYy0+Z3Jh bnVsYXJpdHkgPSBzaXplYml0czsKICAgICAgICBkZXNjLT5iYXNlX2hpZ2ggPSBiYXNlID4+IDI0 Owp9CgoKZXh0ZXJuIF9faW5saW5lIHZvaWQKZmlsbF9kZXNjcmlwdG9yX2Jhc2Uoc3RydWN0IHg4 Nl9kZXNjICpkZXNjLCB1bnNpZ25lZCBiYXNlKQp7CiAgICAgICAgZGVzYy0+YmFzZV9sb3cgPSBi YXNlICYgMHhmZmZmOwogICAgICAgIGRlc2MtPmJhc2VfbWVkID0gKGJhc2UgPj4gMTYpICYgMHhm ZjsKICAgICAgICBkZXNjLT5iYXNlX2hpZ2ggPSBiYXNlID4+IDI0Owp9CgoKZXh0ZXJuIF9faW5s aW5lIHZvaWQKZmlsbF9kZXNjcmlwdG9yX2xpbWl0KHN0cnVjdCB4ODZfZGVzYyAqZGVzYywgdW5z aWduZWQgbGltaXQpCnsKICAgICAgICBpZiAobGltaXQgPiAweGZmZmZmKQogICAgICAgIHsKICAg ICAgICAgICAgICAgIGxpbWl0ID4+PSAxMjsKICAgICAgICAgICAgICAgIGRlc2MtPmdyYW51bGFy aXR5IHw9IDB4ODsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZGVzYy0+ Z3JhbnVsYXJpdHkgJj0gfjB4ODsKICAgICAgICBkZXNjLT5saW1pdF9sb3cgPSBsaW1pdCAmIDB4 ZmZmZjsKICAgICAgICBkZXNjLT5saW1pdF9oaWdoID0gbGltaXQgPj4gMTY7Cn0KCgpleHRlcm4g X19pbmxpbmUgdm9pZApmaWxsX2dhdGUoc3RydWN0IHg4Nl9nYXRlICpnYXRlLCB1bnNpZ25lZCBv ZmZzZXQsIHVuc2lnbmVkIHNob3J0IHNlbGVjdG9yLAogICAgICAgICAgdW5zaWduZWQgY2hhciBh Y2Nlc3MsIHVuc2lnbmVkIGNoYXIgd29yZF9jb3VudCkKewogICAgICAgIGdhdGUtPm9mZnNldF9s b3cgPSBvZmZzZXQgJiAweGZmZmY7CiAgICAgICAgZ2F0ZS0+c2VsZWN0b3IgPSBzZWxlY3RvcjsK ICAgICAgICBnYXRlLT53b3JkX2NvdW50ID0gd29yZF9jb3VudDsKICAgICAgICBnYXRlLT5hY2Nl c3MgPSBhY2Nlc3MgfCAweDgwOwogICAgICAgIGdhdGUtPm9mZnNldF9oaWdoID0gKG9mZnNldCA+ PiAxNikgJiAweGZmZmY7Cn0KIyA4ICJhdXRvL3Byb2ZpbGVfaS5oIiAyCiMgMSAiLi4vc3JjL2xp Yi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvYXNtLmgiIDEKIyA5ICJhdXRvL3Byb2ZpbGVfaS5oIiAy CgojIDEgImF1dG8vY29uZmlnLmgiIDEKCgoKCgojIDEgImdsb2JhbGNvbmZpZy5oIiAxCiMgNyAi YXV0by9jb25maWcuaCIgMgoKIyAxICJhdXRvL2w0X3R5cGVzLmgiIDEKIyAyMiAiYXV0by9sNF90 eXBlcy5oIgp0eXBlZGVmIE13b3JkIFRhc2tfbnVtOwoKCnR5cGVkZWYgTXdvcmQgTFRocmVhZF9u dW07CgoKdHlwZWRlZiBNd29yZCBHVGhyZWFkX251bTsKIyAzNyAiYXV0by9sNF90eXBlcy5oIgpj bGFzcyBMNF9mcGFnZQp7CnB1YmxpYzoKIyA1MCAiYXV0by9sNF90eXBlcy5oIgogIEw0X2ZwYWdl KCBNd29yZCBncmFudCwgTXdvcmQgd3JpdGUsIE13b3JkIG9yZGVyLCBNd29yZCBwYWdlICk7CgoK CgoKCiAgTXdvcmQgZ3JhbnQoKSBjb25zdDsKCgoKCgoKICB2b2lkIGdyYW50KCBNd29yZCBnICk7 CgoKCgoKCiAgTXdvcmQgd3JpdGUoKSBjb25zdDsKCgoKCgoKICB2b2lkIHdyaXRlKCBNd29yZCB3 ICk7CgoKCgoKICBNd29yZCBzaXplKCkgY29uc3Q7CgoKCgoKICB2b2lkIHNpemUoIE13b3JkIG9y ZGVyICk7CgoKCgoKICBNd29yZCBwYWdlKCkgY29uc3Q7CgoKCgoKICB2b2lkIHBhZ2UoIE13b3Jk IGJhc2UgKTsKCgoKCgoKICBNd29yZCBpc193aG9sZV9zcGFjZSgpIGNvbnN0OwoKCgoKCgogIE13 b3JkIGlzX3ZhbGlkKCkgY29uc3Q7Cgpwcml2YXRlOgoKcHVibGljOgoKCgoKICBlbnVtIHsKICAg IFdIT0xFX1NQQUNFID0gMzIsCiAgfTsKCgoKCgogIEw0X2ZwYWdlKCBNd29yZCB3ID0gMCApOwoK CgoKCiAgTXdvcmQgcmF3KCkgY29uc3Q7Cgpwcml2YXRlOgoKICBNd29yZCBfcmF3OwoKICBlbnVt IHsKICAgIEdSQU5UX0JJVCA9IDAsCiAgICBXUklURV9CSVQgPSAxLAogICAgU0laRV9NQVNLID0g MHgwMDAwMDBmYywKICAgIFNJWkVfU0hJRlQgPSAyLAogICAgU0laRV9TSVpFID0gNiwKICAgIFBB R0VfTUFTS19TVFVQSURfTUFDUk9fV09SS0FST1VORCA9IDB4ZmZmZmYwMDAsCiAgICBQQUdFX1NI SUZUX1NUVVBJRF9NQUNST19XT1JLQVJPVU5EID0gMCwKICAgIFBBR0VfU0laRV9TVFVQSURfTUFD Uk9fV09SS0FST1VORCA9IDMyLAogIH07Cgpwcml2YXRlOgoKcHVibGljOgoKCgogIGVudW0gewog ICAgV0hPTEVfSU9fU1BBQ0UgPSAxNiwKICAgIElPX1BPUlRfTUFYID0gMUwgPDwgV0hPTEVfSU9f U1BBQ0UsCiAgfTsKCgoKCgogIE13b3JkIGlvcGFnZSgpIGNvbnN0OwoKCgoKCiAgdm9pZCBpb3Bh Z2UoIE13b3JkIGFkZHIgKTsKCgoKCgogIE13b3JkIGlzX2lvcGFnZSgpIGNvbnN0OwojIDE5MiAi YXV0by9sNF90eXBlcy5oIgogIE13b3JkIGlzX3dob2xlX2lvX3NwYWNlKCkgY29uc3Q7CgoKCgoK CgogIHN0YXRpYyBMNF9mcGFnZSBpbyggTXdvcmQgcG9ydCwgTXdvcmQgb3JkZXIsIE13b3JkIGdy YW50ICk7Cgpwcml2YXRlOgogIGVudW0gewogICAgSU9QQUdFX01BU0sgPSAweDBmZmZmMDAwLAog ICAgSU9QQUdFX1NISUZUID0gMTIsCiAgICBJT0lEX01BU0sgPSAweGYwMDAwMDAwLAogICAgSU9f SUQgPSAweGYwMDAwMDAwLAogIH07Cgp9OwoKCgoKY2xhc3MgTDRfc25kX2Rlc2MKewpwdWJsaWM6 CgoKCgogIEw0X3NuZF9kZXNjKCBNd29yZCB3ID0gKE13b3JkKS0xICk7CgoKCgogIE13b3JkIGRl Y2VpdGUoKSBjb25zdDsKCgoKCiAgTXdvcmQgbWFwKCkgY29uc3Q7CgoKCgogIHZvaWQgKm1zZygp IGNvbnN0OwoKCgoKICBNd29yZCBpc19sb25nX2lwYygpIGNvbnN0OwoKCgoKICBNd29yZCBoYXNf c2VuZCgpIGNvbnN0OwoKcHJpdmF0ZToKICBNd29yZCBfZDsKfTsKCgoKCmNsYXNzIEw0X3Jjdl9k ZXNjCnsKcHVibGljOgojIDI3MCAiYXV0by9sNF90eXBlcy5oIgogIHN0YXRpYyBMNF9yY3ZfZGVz YyBzaG9ydF9mcGFnZSggTDRfZnBhZ2UgZnAgKTsKCgoKCiAgTDRfcmN2X2Rlc2MoIE13b3JkIHcg PSAoTXdvcmQpLTEgKTsKCgoKCgogIE13b3JkIG9wZW5fd2FpdCgpIGNvbnN0OwoKCgoKCiAgTXdv cmQgcm1hcCgpIGNvbnN0OwoKCgoKCgogIHZvaWQgKm1zZygpIGNvbnN0OwoKCgoKCgogIEw0X2Zw YWdlIGZwYWdlKCkgY29uc3Q7CgoKCgoKICBNd29yZCBpc19yZWdpc3Rlcl9pcGMoKSBjb25zdDsK CgoKCgogIE13b3JkIGhhc19yZWNlaXZlKCkgY29uc3Q7Cgpwcml2YXRlOgogIE13b3JkIF9kOwoK CnB1YmxpYzoKCiAgTXdvcmQgcmF3KCkgY29uc3Q7Cn07CgoKCgpjbGFzcyBMNF90aW1lb3V0CnsK cHJpdmF0ZToKICBlbnVtIHsKICAgIFJDVl9FWFBfTUFTSyA9IDB4MGYsCiAgICBSQ1ZfRVhQX1NI SUZUID0gMCwKCiAgICBTTkRfRVhQX01BU0sgPSAweDBmMCwKICAgIFNORF9FWFBfU0hJRlQgPSA0 LAoKICAgIFJDVl9QRkFVTFRfTUFTSyA9IDB4MGYwMCwKICAgIFJDVl9QRkFVTFRfU0hJRlQgPSA4 LAoKICAgIFNORF9QRkFVTFRfTUFTSyA9IDB4MGYwMDAsCiAgICBTTkRfUEZBVUxUX1NISUZUID0g MTIsCgogICAgU05EX01BTl9NQVNLID0gMHgwZmYwMDAwLAogICAgU05EX01BTl9TSElGVCA9IDE2 LAoKICAgIFJDVl9NQU5fTUFTSyA9IDB4MGZmMDAwMDAwLAogICAgUkNWX01BTl9TSElGVCA9IDI0 LAogIH07CgpwdWJsaWM6CgogIGVudW0gewogICAgTkVWRVIgPSAwLAogIH07CgoKCgoKICBleHBs aWNpdCBMNF90aW1lb3V0KCBNd29yZCB0ID0gMCApOwojIDM3NSAiYXV0by9sNF90eXBlcy5oIgog IEw0X3RpbWVvdXQoIE13b3JkIHNuZF9tYW4sIE13b3JkIHNuZF9leHAsCiAgICAgICAgICAgICAg TXdvcmQgcmN2X21hbiwgTXdvcmQgcmN2X2V4cCwKICAgICAgICAgICAgICBNd29yZCBzbmRfcGZs dCwgTXdvcmQgcmN2X3BmbHQgKTsKCgoKCgogIFVuc2lnbmVkNjQgcmF3KCk7CgoKCgoKCiAgTXdv cmQgcmN2X2V4cCgpIGNvbnN0OwoKCgoKCgogIHZvaWQgcmN2X2V4cCggTXdvcmQgZXIgKTsKCgoK CgoKICBNd29yZCByY3ZfbWFuKCkgY29uc3Q7CgoKCgoKCiAgdm9pZCByY3ZfbWFuKCBNd29yZCBt ciApOwoKCgoKCgogIE13b3JkIHNuZF9leHAoKSBjb25zdDsKCgoKCgoKICB2b2lkIHNuZF9leHAo IE13b3JkIGVzICk7CgoKCgoKCiAgTXdvcmQgc25kX21hbigpIGNvbnN0OwoKCgoKCgogIHZvaWQg c25kX21hbiggTXdvcmQgbXMgKTsKCgoKCgogIE13b3JkIHJjdl9wZmF1bHQoKSBjb25zdDsKCgoK CgogIHZvaWQgcmN2X3BmYXVsdCggTXdvcmQgcHIgKTsKCgoKCgogIE13b3JkIHNuZF9wZmF1bHQo KSBjb25zdDsKCgoKCgogIHZvaWQgc25kX3BmYXVsdCggTXdvcmQgcHMgKTsKCgoKCgogIFVuc2ln bmVkNjQgcmN2X21pY3Jvc2VjcygpIGNvbnN0OwoKCgoKCiAgVW5zaWduZWQ2NCBzbmRfbWljcm9z ZWNzKCkgY29uc3Q7Cgpwcml2YXRlOgogIE13b3JkIF90OwoKfTsKIyA0OTIgImF1dG8vbDRfdHlw ZXMuaCIKY2xhc3MgTDRfdWlkCnsKcHVibGljOgojIDUwNCAiYXV0by9sNF90eXBlcy5oIgogIEw0 X3VpZCggVGFza19udW0gdGFzaywgTFRocmVhZF9udW0gbHRocmVhZCApOwoKCgoKCiAgdW5zaWdu ZWQgdmVyc2lvbigpIGNvbnN0OwoKCiAgTFRocmVhZF9udW0gbHRocmVhZCgpIGNvbnN0OwoKCiAg VGFza19udW0gdGFzaygpIGNvbnN0OwoKCiAgR1RocmVhZF9udW0gZ3RocmVhZCgpIGNvbnN0OwoK CiAgVGFza19udW0gY2hpZWYoKSBjb25zdDsKCgogIHZvaWQgdmVyc2lvbiggdW5zaWduZWQgKTsK CgogIHZvaWQgbHRocmVhZCggTFRocmVhZF9udW0gKTsKCgogIHZvaWQgdGFzayggVGFza19udW0g KTsKCgogIHZvaWQgY2hpZWYoIFRhc2tfbnVtICk7CgoKCgoKICBNd29yZCBpc19uaWwoKSBjb25z dDsKCgoKCgogIE13b3JkIGlzX2ludmFsaWQoKSBjb25zdDsKCgogIEw0X3VpZCB0YXNrX2lkKCkg Y29uc3Q7CgoKICBzdGF0aWMgTDRfdWlkIGlycSggdW5zaWduZWQgaXJxICk7CgoKICBNd29yZCBp c19pcnEoKSBjb25zdDsKCgoKCgoKICBNd29yZCBpcnEoKSBjb25zdDsKCgogIGJvb2wgb3BlcmF0 b3IgPT0gKCBMNF91aWQgbyApIGNvbnN0OwoKCiAgYm9vbCBvcGVyYXRvciAhPSAoIEw0X3VpZCBv ICkgY29uc3QKICB7IHJldHVybiAhIG9wZXJhdG9yID09IChvKTsgfQoKCiAgc3RhdGljIHVuc2ln bmVkIGNvbnN0IHRocmVhZHNfcGVyX3Rhc2soKTsKCnByaXZhdGU6CgpwdWJsaWM6CgoKICBlbnVt IHsKICAgIElOVkFMSUQgPSAweDBmZmZmZmZmZiwKICAgIE5JTCA9IDB4MDAwMDAwMDAwLAogIH07 CgoKICBMNF91aWQoIFVuc2lnbmVkNjQgPSBOSUwgKTsKCgogIEw0X3VpZCggVGFza19udW0gdGFz aywgTFRocmVhZF9udW0gbHRocmVhZCwgdW5zaWduZWQgc2l0ZSwKICAgICAgICAgIFRhc2tfbnVt IGNoaWVmLCB1bnNpZ25lZCBuZXN0ID0gMCwgdW5zaWduZWQgdmVyc2lvbiA9IDAgKTsKCgogIHVu c2lnbmVkIHNpdGUoKSBjb25zdDsKCgogIHVuc2lnbmVkIG5lc3QoKSBjb25zdDsKCgogIHZvaWQg c2l0ZSggdW5zaWduZWQgKTsKCgogIHZvaWQgbmVzdCggdW5zaWduZWQgKTsKCgogIFVuc2lnbmVk NjQgcmF3KCkgY29uc3Q7Cgpwcml2YXRlOgogIGVudW0gewogICAgSVJRX01BU0sgPSAweDAwMDAw MDAwMDAwMDAwZmZMTCwKICAgIExPV19NQVNLID0gMHgwMDAwMDAwMGZmZmZmZmZmTEwsCiAgICBW RVJTSU9OX0xPV19NQVNLID0gMHgwMDAwMDAwMDAwMDAwM2ZmTEwsCiAgICBWRVJTSU9OX0xPV19T SElGVCA9IDAsCiAgICBWRVJTSU9OX0xPV19TSVpFID0gMTAsCiAgICBMVEhSRUFEX01BU0sgPSAw eDAwMDAwMDAwMDAwMWZjMDBMTCwKICAgIExUSFJFQURfU0hJRlQgPSBWRVJTSU9OX0xPV19TSElG VCArIFZFUlNJT05fTE9XX1NJWkUsCiAgICBMVEhSRUFEX1NJWkUgPSA3LAogICAgVEFTS19NQVNL ID0gMHgwMDAwMDAwMDBmZmUwMDAwTEwsCiAgICBUQVNLX1NISUZUID0gTFRIUkVBRF9TSElGVCAr IExUSFJFQURfU0laRSwKICAgIFRBU0tfU0laRSA9IDExLAogICAgVkVSU0lPTl9ISUdIX01BU0sg PSAweDAwMDAwMDAwZjAwMDAwMDBMTCwKICAgIFZFUlNJT05fSElHSF9TSElGVCA9IFRBU0tfU0hJ RlQgKyBUQVNLX1NJWkUsCiAgICBWRVJTSU9OX0hJR0hfU0laRSA9IDQsCiAgICBTSVRFX01BU0sg PSAweDAwMDFmZmZmMDAwMDAwMDBMTCwKICAgIFNJVEVfU0hJRlQgPSBWRVJTSU9OX0hJR0hfU0hJ RlQgKyBWRVJTSU9OX0hJR0hfU0laRSwKICAgIFNJVEVfU0laRSA9IDE3LAogICAgQ0hJRUZfTUFT SyA9IDB4MGZmZTAwMDAwMDAwMDAwMExMLAogICAgQ0hJRUZfU0hJRlQgPSBTSVRFX1NISUZUICsg U0lURV9TSVpFLAogICAgQ0hJRUZfU0laRSA9IDExLAogICAgTkVTVF9NQVNLID0gMHhmMDAwMDAw MDAwMDAwMDAwTEwsCiAgICBORVNUX1NISUZUID0gQ0hJRUZfU0hJRlQgKyBDSElFRl9TSVpFLAog ICAgTkVTVF9TSVpFID0gNCwKICB9OwoKICBVbnNpZ25lZDY0IF9yYXc7Cgp9OwoKCgoKCgoKY2xh c3MgTDRfbXNnZG9wZQp7CnB1YmxpYzoKCgoKCiAgZW51bSB7CgogICAgU0VORF9FUlJPUiA9IDB4 MTAsCiAgICBFTk9UX0VYSVNURU5UID0gMHgxMCwKICAgIFJFVElNRU9VVCA9IDB4MjAsCiAgICBT RVRJTUVPVVQgPSAweDMwLAogICAgUkVDQU5DRUxFRCA9IDB4NDAsCiAgICBTRUNBTkNFTEVEID0g MHg1MCwKICAgIFJFTUFQRkFJTEVEID0gMHg2MCwKICAgIFNFTUFQRkFJTEVEID0gMHg3MCwKICAg IFJFU05EUEZUTyA9IDB4ODAsCiAgICBTRVNORFBGVE8gPSAweDkwLAogICAgUkVSQ1ZQRlRPID0g MHhBMCwKICAgIFNFUkNWUEZUTyA9IDB4QjAsCiAgICBSRUFCT1JURUQgPSAweEMwLAogICAgU0VB Qk9SVEVEID0gMHhEMCwKICAgIFJFTVNHQ1VUID0gMHhFMCwKICAgIFNFTVNHQ1VUID0gMHhGMCwK ICB9OwoKCgoKCiAgTDRfbXNnZG9wZSggTXdvcmQgcmF3ID0gMCApOwoKCgoKCgogIEw0X21zZ2Rv cGUoIE13b3JkIG13b3JkcywgTXdvcmQgc3RyaW5ncyApOwoKCgoKCiAgTXdvcmQgcmF3KCkgY29u c3Q7CgoKCgoKICBNd29yZCBkZWNlaWRldCgpIGNvbnN0OwoKCgoKCiAgTXdvcmQgZnBhZ2VfcmVj ZWl2ZWQoKSBjb25zdDsKCgoKCgogIHZvaWQgZnBhZ2VfcmVjZWl2ZWQoIE13b3JkIGYgKTsKCgoK CgogIE13b3JkIHJlZGlyZWN0ZWQoKSBjb25zdDsKCgoKCgogIE13b3JkIHNyY19pbnNpZGUoKSBj b25zdDsKCgoKCgogIE13b3JkIHNuZF9lcnJvcigpIGNvbnN0OwoKCgoKCiAgTXdvcmQgZXJyb3Io KSBjb25zdDsKCgoKCgoKICB2b2lkIGVycm9yKCBNd29yZCBlcnJvciApOwoKCgoKCiAgTXdvcmQg aGFzX2Vycm9yKCkgY29uc3Q7CgoKCgoKICBNd29yZCBzdHJpbmdzKCkgY29uc3Q7CgoKCgoKICB2 b2lkIHN0cmluZ3MoIE13b3JkIHMgKTsKCgoKCgogIE13b3JkIG13b3JkcygpIGNvbnN0OwoKCgoK CiAgdm9pZCBtd29yZHMoIE13b3JkIHcgKTsKCgoKCgoKICBNd29yZCByY3ZfbWFwX2ZhaWxlZCgp IGNvbnN0OwoKCgoKCgogIE13b3JkIHNuZF9tYXBfZmFpbGVkKCkgY29uc3Q7CiMgNzkxICJhdXRv L2w0X3R5cGVzLmgiCiAgdm9pZCBjb21iaW5lKCBMNF9tc2dkb3BlIG90aGVyICk7Cgpwcml2YXRl OgogIE13b3JkIF9yYXc7CiAgZW51bSB7CiAgICBERUNFSVRFX0JJVCA9IDAsCiAgICBGUEFHRV9C SVQgPSAxLAogICAgUkVESVJFQ1RFRF9CSVQgPSAyLAogICAgU1JDX0lOU0lERV9CSVQgPSAzLAog ICAgU05EX0VSUk9SX0JJVCA9IDQsCiAgICBFUlJPUl9DT0RFX1NISUZUID0gNSwKICAgIEVSUk9S X0NPREVfTUFTSyA9IDB4N0wgPDwgRVJST1JfQ09ERV9TSElGVCwKICAgIEVSUk9SX0NPREVfU0la RSA9IDMsCiAgICBFUlJPUl9TSElGVCA9IDQsCiAgICBFUlJPUl9NQVNLID0gMHhmTCA8PCBFUlJP Ul9TSElGVCwKICAgIEVSUk9SX1NJWkUgPSA0LAogICAgU1RSSU5HU19TSElGVCA9IEVSUk9SX0NP REVfU0hJRlQgKyBFUlJPUl9DT0RFX1NJWkUsCiAgICBTVFJJTkdTX01BU0sgPSAweDFmTCA8PCBT VFJJTkdTX1NISUZULAogICAgU1RSSU5HU19TSVpFID0gNSwKICAgIE1XT1JEU19TSElGVCA9IFNU UklOR1NfU0hJRlQgKyBTVFJJTkdTX1NJWkUsCiAgICBNV09SRFNfTUFTSyA9IDB4N2ZmZmZMIDw8 IE1XT1JEU19TSElGVCwKICAgIE1XT1JEU19TSVpFID0gMTksCgogIH07Cgp9OwoKCgoKCgoKY2xh c3MgTDRfc3RyX2RvcGUKewpwdWJsaWM6CgogIE13b3JkIHNuZF9zaXplOwoKCiAgTXdvcmQgc25k X3N0cjsKCgogIE13b3JkIHJjdl9zaXplOwoKCiAgTXdvcmQgcmN2X3N0cjsKfTsKCgoKCgpjbGFz cyBMNF9zY2hlZF9wYXJhbQp7CnB1YmxpYzoKCgoKCiAgTDRfc2NoZWRfcGFyYW0oIE13b3JkIHJh dyA9IDAgKTsKCgoKCgogIE13b3JkIGlzX3ZhbGlkKCkgY29uc3Q7CgoKCgoKICBNd29yZCBwcmlv KCkgY29uc3Q7CgoKCgoKICB2b2lkIHByaW8oIE13b3JkIHAgKTsKCgoKCgogIE13b3JkIHNtYWxs KCkgY29uc3Q7CgoKCgoKICB2b2lkIHNtYWxsKCBNd29yZCBzICk7CgoKCgoKCiAgdm9pZCB0aW1l KCBVbnNpZ25lZDY0IHQgKTsKCgoKCgoKICBVbnNpZ25lZDY0IHRpbWUoKTsKCgoKCgoKICBNd29y ZCB0aW1lX2V4cCgpIGNvbnN0OwoKCgoKCgogIHZvaWQgdGltZV9leHAoIE13b3JkIGUgKTsKCgoK CgoKICBNd29yZCB0aW1lX21hbigpIGNvbnN0OwoKCgoKCgogIHZvaWQgdGltZV9tYW4oIE13b3Jk IG0gKTsKCgoKCgogIE13b3JkIHJhdygpIGNvbnN0OwoKCgoKCiAgTXdvcmQgZXJyb3IoKSBjb25z dDsKCgoKCgogIHZvaWQgZXJyb3IoIE13b3JkIGUgKTsKCnByaXZhdGU6CgogIE13b3JkIF9yYXc7 CgogIGVudW0gewogICAgUFJJT19TSElGVCA9IDAsCiAgICBQUklPX01BU0sgPSAweDBmZiwKICAg IFBSSU9fU0laRSA9IDgsCiAgICBTTUFMTF9TSElGVCA9IFBSSU9fU0laRSArIFBSSU9fU0hJRlQs CiAgICBTTUFMTF9TSVpFID0gOCwKICAgIFNNQUxMX01BU0sgPSAoKDFVTCA8PCBTTUFMTF9TSVpF KS0xKSA8PCBTTUFMTF9TSElGVCwKICAgIEVSUk9SX1NISUZUID0gU01BTExfU0hJRlQgKyBTTUFM TF9TSVpFLAogICAgRVJST1JfU0laRSA9IDQsCiAgICBFUlJPUl9NQVNLID0gKCgxVUwgPDwgRVJS T1JfU0laRSktMSkgPDwgRVJST1JfU0hJRlQsCiAgICBUSU1FX0VYUF9TSElGVCA9IEVSUk9SX1NI SUZUICsgRVJST1JfU0laRSwKICAgIFRJTUVfRVhQX1NJWkUgPSA0LAogICAgVElNRV9FWFBfTUFT SyA9ICgoMVVMIDw8IFRJTUVfRVhQX1NJWkUpLTEpIDw8IFRJTUVfRVhQX1NISUZULAogICAgVElN RV9NQU5fU0hJRlQgPSBUSU1FX0VYUF9TSVpFICsgVElNRV9FWFBfU0hJRlQsCiAgICBUSU1FX01B Tl9TSVpFID0gOCwKICAgIFRJTUVfTUFOX01BU0sgPSAoKDFVTCA8PCBUSU1FX01BTl9TSVpFKS0x KSA8PCBUSU1FX01BTl9TSElGVCwKICB9OwoKfTsKIyA5NzQgImF1dG8vbDRfdHlwZXMuaCIKaW5s aW5lIE13b3JkIEw0X2ZwYWdlOjppc192YWxpZCgpIGNvbnN0CnsKICByZXR1cm4gX3JhdzsKfQoK CgppbmxpbmUgTDRfZnBhZ2U6Okw0X2ZwYWdlKCBNd29yZCByYXcgKQogIDogX3JhdyhyYXcpCnt9 CgoKCmlubGluZSBMNF9mcGFnZTo6TDRfZnBhZ2UoIE13b3JkIGdyYW50LCBNd29yZCB3cml0ZSwg TXdvcmQgc2l6ZSwgTXdvcmQgcGFnZSApCiAgOiBfcmF3KCAoZ3JhbnQgPyAoMTw8R1JBTlRfQklU KSA6IDApCiAgICAgICAgICB8ICh3cml0ZSA/ICgxPDxXUklURV9CSVQpIDogMCkKICAgICAgICAg IHwgKChzaXplIDw8IFNJWkVfU0hJRlQpICYgU0laRV9NQVNLKQogICAgICAgICAgfCAoKHBhZ2Ug PDwgUEFHRV9TSElGVF9TVFVQSURfTUFDUk9fV09SS0FST1VORCkgJiBQQUdFX01BU0tfU1RVUElE X01BQ1JPX1dPUktBUk9VTkQpICkKe30KCgoKaW5saW5lIE13b3JkIEw0X2ZwYWdlOjpncmFudCgp IGNvbnN0CnsKICByZXR1cm4gX3JhdyAmICgxPDxHUkFOVF9CSVQpOwp9CgoKCmlubGluZSBNd29y ZCBMNF9mcGFnZTo6d3JpdGUoKSBjb25zdAp7CiAgcmV0dXJuIF9yYXcgJiAoMTw8V1JJVEVfQklU KTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfZnBhZ2U6OnNpemUoKSBjb25zdAp7CiAgcmV0dXJuIChf cmF3ICYgU0laRV9NQVNLKSA+PiBTSVpFX1NISUZUOwp9CgoKCmlubGluZSBNd29yZCBMNF9mcGFn ZTo6cGFnZSgpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcgJiBQQUdFX01BU0tfU1RVUElEX01BQ1JP X1dPUktBUk9VTkQpID4+IFBBR0VfU0hJRlRfU1RVUElEX01BQ1JPX1dPUktBUk9VTkQ7Cn0KCgoK aW5saW5lIHZvaWQgTDRfZnBhZ2U6OmdyYW50KCBNd29yZCB3ICkKewogIGlmKHcpCiAgICBfcmF3 IHw9ICgxPDxHUkFOVF9CSVQpOwogIGVsc2UKICAgIF9yYXcgJj0gfigxPDxHUkFOVF9CSVQpOwp9 CgoKCmlubGluZSB2b2lkIEw0X2ZwYWdlOjp3cml0ZSggTXdvcmQgdyApCnsKICBpZih3KQogICAg X3JhdyB8PSAoMTw8V1JJVEVfQklUKTsKICBlbHNlCiAgICBfcmF3ICY9IH4oMTw8V1JJVEVfQklU KTsKfQoKCgppbmxpbmUgdm9pZCBMNF9mcGFnZTo6c2l6ZSggTXdvcmQgdyApCnsKICBfcmF3ID0g KF9yYXcgJiB+U0laRV9NQVNLKSB8ICgodzw8U0laRV9TSElGVCkgJiBTSVpFX01BU0spOwp9CgoK CmlubGluZSB2b2lkIEw0X2ZwYWdlOjpwYWdlKCBNd29yZCB3ICkKewogIF9yYXcgPSAoX3JhdyAm IH5QQUdFX01BU0tfU1RVUElEX01BQ1JPX1dPUktBUk9VTkQpIHwgKCh3PDxQQUdFX1NISUZUX1NU VVBJRF9NQUNST19XT1JLQVJPVU5EKSAmIFBBR0VfTUFTS19TVFVQSURfTUFDUk9fV09SS0FST1VO RCk7Cn0KCgoKaW5saW5lIE13b3JkIEw0X2ZwYWdlOjpyYXcoKSBjb25zdAp7CiAgcmV0dXJuIF9y YXc7Cn0KCgoKaW5saW5lIE13b3JkIEw0X2ZwYWdlOjppc193aG9sZV9zcGFjZSgpIGNvbnN0CnsK ICByZXR1cm4gKF9yYXcgPj4gMikgPT0gMzI7Cn0KCgoKaW5saW5lIE13b3JkIEw0X2ZwYWdlOjpp b3BhZ2UoKSBjb25zdAp7CiAgcmV0dXJuIChfcmF3ICYgSU9QQUdFX01BU0spID4+IElPUEFHRV9T SElGVDsKfQoKCgppbmxpbmUgdm9pZCBMNF9mcGFnZTo6aW9wYWdlKCBNd29yZCB3ICkKewogIF9y YXcgPSAoX3JhdyAmIH5JT1BBR0VfTUFTSykgfCAoKHcgPDwgSU9QQUdFX1NISUZUKSAmIElPUEFH RV9NQVNLKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfZnBhZ2U6OmlzX2lvcGFnZSgpIGNvbnN0CnsK ICByZXR1cm4gKF9yYXcgJiBJT0lEX01BU0spID09IElPX0lEOwp9CgoKCmlubGluZSBMNF9mcGFn ZSBMNF9mcGFnZTo6aW8oIE13b3JkIHBvcnQsIE13b3JkIHNpemUsIE13b3JkIGdyYW50ICkKewog IHJldHVybiBMNF9mcGFnZSggKGdyYW50ID8gMSA6IDApCiAgICAgICAgICAgICAgICAgICB8ICgo cG9ydCA8PCBJT1BBR0VfU0hJRlQpICYgSU9QQUdFX01BU0spCiAgICAgICAgICAgICAgICAgICB8 ICgoc2l6ZSA8PCBTSVpFX1NISUZUKSAmIFNJWkVfTUFTSykKICAgICAgICAgICAgICAgICAgIHwg SU9fSUQgKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfZnBhZ2U6OmlzX3dob2xlX2lvX3NwYWNlKCkg Y29uc3QKewogIHJldHVybiAoX3JhdyA+PiAyKSA9PSBXSE9MRV9JT19TUEFDRTsKfQoKCgppbmxp bmUgTDRfc25kX2Rlc2M6Okw0X3NuZF9kZXNjKCBNd29yZCB3ICkKICA6IF9kKHcpCnt9CgoKCmlu bGluZSBNd29yZCBMNF9zbmRfZGVzYzo6ZGVjZWl0ZSgpIGNvbnN0CnsKICByZXR1cm4gX2QgJiAx Owp9CgoKCmlubGluZSBNd29yZCBMNF9zbmRfZGVzYzo6bWFwKCkgY29uc3QKewogIHJldHVybiBf ZCAmIDI7Cn0KCgoKaW5saW5lIE13b3JkIEw0X3NuZF9kZXNjOjppc19sb25nX2lwYygpIGNvbnN0 CnsKICByZXR1cm4gX2QgJiB+MTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfc25kX2Rlc2M6Omhhc19z ZW5kKCkgY29uc3QKewogIHJldHVybiBfZCAhPSAoTXdvcmQpLTE7Cn0KCgoKaW5saW5lIHZvaWQg Kkw0X3NuZF9kZXNjOjptc2coKSBjb25zdAp7CiAgcmV0dXJuICh2b2lkKikoX2QgJiB+Myk7Cn0K CgoKCmlubGluZSBNd29yZCBMNF9yY3ZfZGVzYzo6cmF3KCkgY29uc3QKewogIHJldHVybiBfZDsK fQoKCgppbmxpbmUgTDRfcmN2X2Rlc2MgTDRfcmN2X2Rlc2M6OnNob3J0X2ZwYWdlKCBMNF9mcGFn ZSBmcCApCnsKICByZXR1cm4gTDRfcmN2X2Rlc2MoIDIgfCAoZnAucmF3KCkgJiB+MykgKTsKfQoK CgppbmxpbmUgTDRfcmN2X2Rlc2M6Okw0X3Jjdl9kZXNjKCBNd29yZCB3KQogIDogX2QodykKe30K CgoKaW5saW5lIE13b3JkIEw0X3Jjdl9kZXNjOjpvcGVuX3dhaXQoKSBjb25zdAp7CiAgcmV0dXJu IF9kICYgMTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfcmN2X2Rlc2M6OnJtYXAoKSBjb25zdAp7CiAg cmV0dXJuIF9kICYgMjsKfQoKCgppbmxpbmUgdm9pZCAqTDRfcmN2X2Rlc2M6Om1zZygpIGNvbnN0 CnsKICByZXR1cm4gKHZvaWQqKShfZCAmIH4zKTsKfQoKCgppbmxpbmUgTDRfZnBhZ2UgTDRfcmN2 X2Rlc2M6OmZwYWdlKCkgY29uc3QKewogIHJldHVybiBMNF9mcGFnZSggX2QgJiB+MyApOwp9CgoK CmlubGluZSBNd29yZCBMNF9yY3ZfZGVzYzo6aXNfcmVnaXN0ZXJfaXBjKCkgY29uc3QKewogIHJl dHVybiAoX2QgJiB+MSkgPT0gMDsKfQoKCgppbmxpbmUgTXdvcmQgTDRfcmN2X2Rlc2M6Omhhc19y ZWNlaXZlKCkgY29uc3QKewogIHJldHVybiBfZCAhPSAoTXdvcmQpLTE7Cn0KCgoKaW5saW5lIEw0 X3RpbWVvdXQ6Okw0X3RpbWVvdXQoIE13b3JkIHQgKQogIDogX3QodCkKe30KCgoKaW5saW5lIEw0 X3RpbWVvdXQ6Okw0X3RpbWVvdXQoIE13b3JkIHNuZF9tYW4sIE13b3JkIHNuZF9leHAsCiAgICAg ICAgICAgICAgICAgICAgICAgIE13b3JkIHJjdl9tYW4sIE13b3JkIHJjdl9leHAsCiAgICAgICAg ICAgICAgICAgICAgICAgIE13b3JkIHNuZF9wZmx0LCBNd29yZCByY3ZfcGZsdCApCiAgOiBfdCgg KChzbmRfbWFuIDw8IFNORF9NQU5fU0hJRlQpICYgU05EX01BTl9NQVNLKSB8CiAgICAgICAgKChz bmRfZXhwIDw8IFNORF9FWFBfU0hJRlQpICYgU05EX0VYUF9NQVNLKSB8CiAgICAgICAgKChyY3Zf bWFuIDw8IFJDVl9NQU5fU0hJRlQpICYgUkNWX01BTl9NQVNLKSB8CiAgICAgICAgKChyY3ZfZXhw IDw8IFJDVl9FWFBfU0hJRlQpICYgUkNWX0VYUF9NQVNLKSB8CiAgICAgICAgKChyY3ZfcGZsdCA8 PCBSQ1ZfUEZBVUxUX1NISUZUKSAmIFJDVl9QRkFVTFRfTUFTSykgfAogICAgICAgICgoc25kX3Bm bHQgPDwgU05EX1BGQVVMVF9TSElGVCkgJiBTTkRfUEZBVUxUX01BU0spICkKe30KCgoKaW5saW5l IFVuc2lnbmVkNjQgTDRfdGltZW91dDo6cmF3KCkKewogIHJldHVybiBfdDsKfQoKCgppbmxpbmUg TXdvcmQgTDRfdGltZW91dDo6cmN2X2V4cCgpIGNvbnN0CnsKICByZXR1cm4gKF90ICYgUkNWX0VY UF9NQVNLKSA+PiBSQ1ZfRVhQX1NISUZUOwp9CgoKCmlubGluZSB2b2lkIEw0X3RpbWVvdXQ6OnJj dl9leHAoIE13b3JkIHcgKQp7CiAgX3QgPSAoX3QgJiB+UkNWX0VYUF9NQVNLKSB8ICgodyA8PCBS Q1ZfRVhQX1NISUZUKSAmIFJDVl9FWFBfTUFTSyk7Cn0KCgoKaW5saW5lIE13b3JkIEw0X3RpbWVv dXQ6OnNuZF9leHAoKSBjb25zdAp7CiAgcmV0dXJuIChfdCAmIFNORF9FWFBfTUFTSykgPj4gU05E X0VYUF9TSElGVDsKfQoKCgppbmxpbmUgdm9pZCBMNF90aW1lb3V0OjpzbmRfZXhwKCBNd29yZCB3 ICkKewogIF90ID0gKF90ICYgflNORF9FWFBfTUFTSykgfCAoKHcgPDwgU05EX0VYUF9TSElGVCkg JiBTTkRfRVhQX01BU0spOwp9CgoKCmlubGluZSBNd29yZCBMNF90aW1lb3V0OjpyY3ZfcGZhdWx0 KCkgY29uc3QKewogIHJldHVybiAoX3QgJiBSQ1ZfUEZBVUxUX01BU0spID4+IFJDVl9QRkFVTFRf U0hJRlQ7Cn0KCgoKaW5saW5lIHZvaWQgTDRfdGltZW91dDo6cmN2X3BmYXVsdCggTXdvcmQgdyAp CnsKICBfdCA9IChfdCAmIH5SQ1ZfUEZBVUxUX01BU0spIHwgKCh3IDw8IFJDVl9QRkFVTFRfU0hJ RlQpICYgUkNWX1BGQVVMVF9NQVNLKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfdGltZW91dDo6c25k X3BmYXVsdCgpIGNvbnN0CnsKICByZXR1cm4gKF90ICYgU05EX1BGQVVMVF9NQVNLKSA+PiBTTkRf UEZBVUxUX1NISUZUOwp9CgoKCmlubGluZSB2b2lkIEw0X3RpbWVvdXQ6OnNuZF9wZmF1bHQoIE13 b3JkIHcgKQp7CiAgX3QgPSAoX3QgJiB+U05EX1BGQVVMVF9NQVNLKSB8ICgodyA8PCBTTkRfUEZB VUxUX1NISUZUKSAmIFNORF9QRkFVTFRfTUFTSyk7Cn0KCgoKaW5saW5lIE13b3JkIEw0X3RpbWVv dXQ6OnJjdl9tYW4oKSBjb25zdAp7CiAgcmV0dXJuIChfdCAmIFJDVl9NQU5fTUFTSykgPj4gUkNW X01BTl9TSElGVDsKfQoKCgppbmxpbmUgdm9pZCBMNF90aW1lb3V0OjpyY3ZfbWFuKCBNd29yZCB3 ICkKewogIF90ID0gKF90ICYgflJDVl9NQU5fTUFTSykgfCAoKHcgPDwgUkNWX01BTl9TSElGVCkg JiBSQ1ZfTUFOX01BU0spOwp9CgoKCmlubGluZSBNd29yZCBMNF90aW1lb3V0OjpzbmRfbWFuKCkg Y29uc3QKewogIHJldHVybiAoX3QgJiBTTkRfTUFOX01BU0spID4+IFNORF9NQU5fU0hJRlQ7Cn0K CgoKaW5saW5lIHZvaWQgTDRfdGltZW91dDo6c25kX21hbiggTXdvcmQgdyApCnsKICBfdCA9IChf dCAmIH5TTkRfTUFOX01BU0spIHwgKCh3IDw8IFNORF9NQU5fU0hJRlQpICYgU05EX01BTl9NQVNL KTsKfQoKCgppbmxpbmUgVW5zaWduZWQ2NCBMNF90aW1lb3V0OjpyY3ZfbWljcm9zZWNzKCkgY29u c3QKewogIHJldHVybiAoVW5zaWduZWQ2NCkocmN2X21hbigpKSA8PCAoKDE1IC0gcmN2X2V4cCgp KSA8PCAxKTsKfQoKCgppbmxpbmUgVW5zaWduZWQ2NCBMNF90aW1lb3V0OjpzbmRfbWljcm9zZWNz KCkgY29uc3QKewogIHJldHVybiAoVW5zaWduZWQ2NCkoc25kX21hbigpKSA8PCAoKDE1IC0gc25k X2V4cCgpKSA8PCAxKTsKfQoKCgppbmxpbmUgdW5zaWduZWQgY29uc3QgTDRfdWlkOjp0aHJlYWRz X3Blcl90YXNrKCkKewogIHJldHVybiAxPDxMVEhSRUFEX1NJWkU7Cn0KCgoKaW5saW5lIGJvb2wg TDRfdWlkOjpvcGVyYXRvciA9PSAoIEw0X3VpZCBvICkgY29uc3QKewogIHJldHVybiBvLl9yYXcg PT0gX3JhdzsKfQoKCgppbmxpbmUgTDRfdWlkOjpMNF91aWQoIFVuc2lnbmVkNjQgdyApCiAgOiBf cmF3KHcpCnt9CgoKCmlubGluZSBMNF91aWQ6Okw0X3VpZCggVGFza19udW0gdGFzaywgTFRocmVh ZF9udW0gbHRocmVhZCApCiAgOiBfcmF3KCAoKChVbnNpZ25lZDY0KXRhc2sgPDwgVEFTS19TSElG VCApICYgVEFTS19NQVNLICkKICAgICAgICAgIHwgKCgoVW5zaWduZWQ2NClsdGhyZWFkIDw8IExU SFJFQURfU0hJRlQpICYgTFRIUkVBRF9NQVNLKSkKe30KCgoKaW5saW5lIEw0X3VpZDo6TDRfdWlk KCBUYXNrX251bSB0YXNrLCBMVGhyZWFkX251bSBsdGhyZWFkLCB1bnNpZ25lZCBzaXRlLAogICAg ICAgICAgICAgICAgVGFza19udW0gY2hpZWYsIHVuc2lnbmVkIG5lc3QsIHVuc2lnbmVkIHZlcnNp b24gKQogIDogX3JhdyAoICgoKFVuc2lnbmVkNjQpdGFzayA8PCBUQVNLX1NISUZUKSAmIFRBU0tf TUFTSyApCiAgICAgICAgICB8ICgoKFVuc2lnbmVkNjQpbHRocmVhZCA8PCBMVEhSRUFEX1NISUZU KSAmIExUSFJFQURfTUFTSyApCiAgICAgICAgICB8ICgoKFVuc2lnbmVkNjQpc2l0ZSA8PCBTSVRF X1NISUZUKSAmIFNJVEVfTUFTSyApCiAgICAgICAgICB8ICgoKFVuc2lnbmVkNjQpY2hpZWYgPDwg Q0hJRUZfU0hJRlQpICYgQ0hJRUZfTUFTSyApCiAgICAgICAgICB8ICgoKFVuc2lnbmVkNjQpbmVz dCA8PCBORVNUX1NISUZUKSAmIE5FU1RfTUFTSyApCiAgICAgICAgICB8ICgoKFVuc2lnbmVkNjQp dmVyc2lvbiA8PCBWRVJTSU9OX0xPV19TSElGVCkgJiBWRVJTSU9OX0xPV19NQVNLICkKICAgICAg ICAgIHwgKCgoVW5zaWduZWQ2NCl2ZXJzaW9uIDw8IFZFUlNJT05fSElHSF9TSElGVCkgJiBWRVJT SU9OX0hJR0hfTUFTSykgKQp7fQoKCgppbmxpbmUgdW5zaWduZWQgTDRfdWlkOjp2ZXJzaW9uKCkg Y29uc3QKewogIHJldHVybiAoKF9yYXcgJiBWRVJTSU9OX0hJR0hfTUFTSykgPj4gVkVSU0lPTl9I SUdIX1NISUZUKQogICAgICAgfCAoKF9yYXcgJiBWRVJTSU9OX0xPV19NQVNLICkgPj4gVkVSU0lP Tl9MT1dfU0hJRlQpOwp9CgoKCmlubGluZSBMVGhyZWFkX251bSBMNF91aWQ6Omx0aHJlYWQoKSBj b25zdAp7CgogIHJldHVybiAoKHVuc2lnbmVkKV9yYXcgJiBMVEhSRUFEX01BU0spID4+IExUSFJF QURfU0hJRlQ7Cn0KCgoKaW5saW5lIFRhc2tfbnVtIEw0X3VpZDo6dGFzaygpIGNvbnN0CnsKCiAg cmV0dXJuICgodW5zaWduZWQpX3JhdyAmIFRBU0tfTUFTSykgPj4gVEFTS19TSElGVDsKfQoKCgpp bmxpbmUgR1RocmVhZF9udW0gTDRfdWlkOjpndGhyZWFkKCkgY29uc3QKewoKICByZXR1cm4gKCgo dW5zaWduZWQpX3JhdyAmIExUSFJFQURfTUFTSykgPj4gTFRIUkVBRF9TSElGVCkgfAogICAgICAg ICAoKCh1bnNpZ25lZClfcmF3ICYgVEFTS19NQVNLICkgPj4gKFRBU0tfU0hJRlQgLSBMVEhSRUFE X1NJWkUpKTsKfQoKCgppbmxpbmUgdW5zaWduZWQgTDRfdWlkOjpzaXRlKCkgY29uc3QKewogIHJl dHVybiAoX3JhdyAmIFNJVEVfTUFTSykgPj4gU0lURV9TSElGVDsKfQoKCgppbmxpbmUgdW5zaWdu ZWQgTDRfdWlkOjpjaGllZigpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcgJiBDSElFRl9NQVNLKSA+ PiBDSElFRl9TSElGVDsKfQoKCgppbmxpbmUgdW5zaWduZWQgTDRfdWlkOjpuZXN0KCkgY29uc3QK ewogIHJldHVybiAoX3JhdyAmIE5FU1RfTUFTSykgPj4gTkVTVF9TSElGVDsKfQoKCgppbmxpbmUg dm9pZCBMNF91aWQ6OnZlcnNpb24oIHVuc2lnbmVkIHcgKQp7CiAgX3JhdyA9IChfcmF3ICYgfihW RVJTSU9OX0xPV19NQVNLIHwgVkVSU0lPTl9ISUdIX01BU0spKQogICAgICAgfCAoKChVbnNpZ25l ZDY0KXcgPDwgVkVSU0lPTl9MT1dfU0hJRlQpICYgVkVSU0lPTl9MT1dfTUFTSykKICAgICAgIHwg KCgoVW5zaWduZWQ2NCl3IDw8IFZFUlNJT05fSElHSF9TSElGVCkgJiBWRVJTSU9OX0hJR0hfTUFT Syk7Cn0KCgoKaW5saW5lIHZvaWQgTDRfdWlkOjpsdGhyZWFkKCBMVGhyZWFkX251bSB3ICkKewog IF9yYXcgPSAoX3JhdyAmIH5MVEhSRUFEX01BU0spCiAgICAgICB8ICgoKFVuc2lnbmVkNjQpdyA8 PCBMVEhSRUFEX1NISUZUKSAmIExUSFJFQURfTUFTSyk7Cn0KCgoKaW5saW5lIHZvaWQgTDRfdWlk Ojp0YXNrKCBUYXNrX251bSB3ICkKewogIF9yYXcgPSAoX3JhdyAmIH5UQVNLX01BU0spCiAgICAg ICB8ICgoKFVuc2lnbmVkNjQpdyA8PCBUQVNLX1NISUZUKSAmIFRBU0tfTUFTSyk7Cn0KCgoKaW5s aW5lIHZvaWQgTDRfdWlkOjpzaXRlKCB1bnNpZ25lZCB3ICkKewogIF9yYXcgPSAoX3JhdyAmIH5T SVRFX01BU0spIHwgKCgoVW5zaWduZWQ2NCl3IDw8IFNJVEVfU0hJRlQpICYgU0lURV9NQVNLKTsK fQoKCgppbmxpbmUgdm9pZCBMNF91aWQ6OmNoaWVmKCBUYXNrX251bSB3ICkKewogIF9yYXcgPSAo X3JhdyAmIH5DSElFRl9NQVNLKSB8ICgoKFVuc2lnbmVkNjQpdyA8PCBDSElFRl9TSElGVCkgJiBD SElFRl9NQVNLKTsKfQoKCgppbmxpbmUgdm9pZCBMNF91aWQ6Om5lc3QoIHVuc2lnbmVkIHcgKQp7 CiAgX3JhdyA9IChfcmF3ICYgfk5FU1RfTUFTSykgfCAoKChVbnNpZ25lZDY0KXcgPDwgTkVTVF9T SElGVCkgJiBORVNUX01BU0spOwp9CgoKCmlubGluZSBNd29yZCBMNF91aWQ6OmlzX25pbCgpIGNv bnN0CnsKICByZXR1cm4gKF9yYXcgJiBMT1dfTUFTSykgPT0gMDsKfQoKCgppbmxpbmUgTXdvcmQg TDRfdWlkOjppc19pbnZhbGlkKCkgY29uc3QKewogIHJldHVybiAoX3JhdyAmIExPV19NQVNLKSA9 PSBJTlZBTElEOwp9CgoKCmlubGluZSBMNF91aWQgTDRfdWlkOjp0YXNrX2lkKCkgY29uc3QKewog IHJldHVybiBMNF91aWQoIF9yYXcgJiB+TFRIUkVBRF9NQVNLICk7Cn0KCgoKaW5saW5lIEw0X3Vp ZCBMNF91aWQ6OmlycSggdW5zaWduZWQgaXJxICkKewogIHJldHVybiBMNF91aWQoIChpcnEgKyAx KSAmIElSUV9NQVNLICk7Cn0KCgoKaW5saW5lIE13b3JkIEw0X3VpZDo6aXNfaXJxKCkgY29uc3QK ewogIHJldHVybiAoX3JhdyAmIH5JUlFfTUFTSykgPT0gMCAmJiBfcmF3Owp9CgoKCmlubGluZSBN d29yZCBMNF91aWQ6OmlycSgpIGNvbnN0CnsKICByZXR1cm4gX3Jhdy0xOwp9CgoKCmlubGluZSBV bnNpZ25lZDY0IEw0X3VpZDo6cmF3KCkgY29uc3QKewogIHJldHVybiBfcmF3Owp9CgoKCmlubGlu ZSBMNF9tc2dkb3BlOjpMNF9tc2dkb3BlKCBNd29yZCBtd29yZHMsIE13b3JkIHN0cmluZ3MgKQog IDogX3JhdyggKChzdHJpbmdzIDw8IFNUUklOR1NfU0hJRlQpICYgU1RSSU5HU19NQVNLKQogICAg ICAgICAgfCgobXdvcmRzIDw8IE1XT1JEU19TSElGVCkgJiBNV09SRFNfTUFTSykgKQp7fQoKCgpp bmxpbmUgTDRfbXNnZG9wZTo6TDRfbXNnZG9wZSggTXdvcmQgcmF3ICkKICA6IF9yYXcocmF3KQp7 fQoKCgppbmxpbmUgTXdvcmQgTDRfbXNnZG9wZTo6cmF3KCkgY29uc3QKewogIHJldHVybiBfcmF3 Owp9CgoKCmlubGluZSBNd29yZCBMNF9tc2dkb3BlOjpkZWNlaWRldCgpIGNvbnN0CnsKICByZXR1 cm4gX3JhdyAmICgxIDw8IERFQ0VJVEVfQklUKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfbXNnZG9w ZTo6ZnBhZ2VfcmVjZWl2ZWQoKSBjb25zdAp7CiAgcmV0dXJuIF9yYXcgJiAoMSA8PCBGUEFHRV9C SVQpOwp9CgoKCmlubGluZSBNd29yZCBMNF9tc2dkb3BlOjpyZWRpcmVjdGVkKCkgY29uc3QKewog IHJldHVybiBfcmF3ICYgKDEgPDwgUkVESVJFQ1RFRF9CSVQpOwp9CgoKCmlubGluZSBNd29yZCBM NF9tc2dkb3BlOjpzcmNfaW5zaWRlKCkgY29uc3QKewogIHJldHVybiBfcmF3ICYgKDEgPDwgU1JD X0lOU0lERV9CSVQpOwp9CgoKCmlubGluZSBNd29yZCBMNF9tc2dkb3BlOjpzbmRfZXJyb3IoKSBj b25zdAp7CiAgcmV0dXJuIF9yYXcgJiAoMSA8PCBTTkRfRVJST1JfQklUKTsKfQoKCgppbmxpbmUg TXdvcmQgTDRfbXNnZG9wZTo6c3RyaW5ncygpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcgJiBTVFJJ TkdTX01BU0spID4+IFNUUklOR1NfU0hJRlQ7Cn0KCgoKaW5saW5lIE13b3JkIEw0X21zZ2RvcGU6 Om13b3JkcygpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcgJiBNV09SRFNfTUFTSykgPj4gTVdPUkRT X1NISUZUOwp9CgoKCmlubGluZSB2b2lkIEw0X21zZ2RvcGU6Om13b3JkcyggTXdvcmQgdyApCnsK ICBfcmF3ID0gKF9yYXcgJiB+TVdPUkRTX01BU0spIHwgKCh3PDxNV09SRFNfU0hJRlQpICYgTVdP UkRTX01BU0spOwp9CgoKCmlubGluZSB2b2lkIEw0X21zZ2RvcGU6OnN0cmluZ3MoIE13b3JkIHcg KQp7CiAgX3JhdyA9IChfcmF3ICYgflNUUklOR1NfTUFTSykgfCAoKHc8PFNUUklOR1NfU0hJRlQp ICYgU1RSSU5HU19NQVNLKTsKfQoKCgppbmxpbmUgTXdvcmQgTDRfbXNnZG9wZTo6aGFzX2Vycm9y KCkgY29uc3QKewogIHJldHVybiBfcmF3ICYgRVJST1JfTUFTSzsKfQoKCgppbmxpbmUgTXdvcmQg TDRfbXNnZG9wZTo6ZXJyb3IoKSBjb25zdAp7CiAgcmV0dXJuIF9yYXcgJiBFUlJPUl9NQVNLOwp9 CgoKCmlubGluZSBNd29yZCBMNF9tc2dkb3BlOjpyY3ZfbWFwX2ZhaWxlZCgpIGNvbnN0CnsKICBy ZXR1cm4gKF9yYXcgJiBFUlJPUl9NQVNLKSA9PSBSRU1BUEZBSUxFRDsKfQoKCgppbmxpbmUgTXdv cmQgTDRfbXNnZG9wZTo6c25kX21hcF9mYWlsZWQoKSBjb25zdAp7CiByZXR1cm4gKF9yYXcgJiBF UlJPUl9NQVNLKSA9PSBTRU1BUEZBSUxFRDsKfQoKCgppbmxpbmUgdm9pZCBMNF9tc2dkb3BlOjpl cnJvciggTXdvcmQgZSApCnsKICBfcmF3ID0gKF9yYXcgJiB+RVJST1JfTUFTSykgfCAoZSAmIEVS Uk9SX01BU0spOwp9CgoKCmlubGluZSB2b2lkIEw0X21zZ2RvcGU6OmZwYWdlX3JlY2VpdmVkKCBN d29yZCB3ICkKewogIGlmKHcpCiAgICBfcmF3IHw9ICgxTDw8RlBBR0VfQklUKTsKICBlbHNlCiAg ICBfcmF3ICY9IH4oMUw8PEZQQUdFX0JJVCk7Cn0KCgoKaW5saW5lIHZvaWQgTDRfbXNnZG9wZTo6 Y29tYmluZSggTDRfbXNnZG9wZSBvICkKewogIF9yYXcgPSAoX3JhdyAmIH5FUlJPUl9NQVNLKSB8 IG8uX3JhdzsKfQoKCgppbmxpbmUgTDRfc2NoZWRfcGFyYW06Okw0X3NjaGVkX3BhcmFtKCBNd29y ZCByYXcgKQogIDogX3JhdyhyYXcpCnt9CgoKCmlubGluZSBNd29yZCBMNF9zY2hlZF9wYXJhbTo6 cHJpbygpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcgJiBQUklPX01BU0spID4+IFBSSU9fU0hJRlQ7 Cn0KCgoKaW5saW5lIHZvaWQgTDRfc2NoZWRfcGFyYW06OnByaW8oIE13b3JkIHAgKQp7CiAgX3Jh dyA9IChfcmF3ICYgflBSSU9fTUFTSykgfCAoKHA8PFBSSU9fU0hJRlQpICYgUFJJT19NQVNLKTsK fQoKCgppbmxpbmUgTXdvcmQgTDRfc2NoZWRfcGFyYW06OnNtYWxsKCkgY29uc3QKewogIHJldHVy biAoX3JhdyAmIFNNQUxMX01BU0spID4+IFNNQUxMX1NISUZUOwp9CgoKCmlubGluZSB2b2lkIEw0 X3NjaGVkX3BhcmFtOjpzbWFsbCggTXdvcmQgcyApCnsKICBfcmF3ID0gKF9yYXcgJiB+U01BTExf TUFTSykgfCAoKHM8PFNNQUxMX1NISUZUKSAmIFNNQUxMX01BU0spOwp9CgoKCmlubGluZSBNd29y ZCBMNF9zY2hlZF9wYXJhbTo6dGltZV9leHAoKSBjb25zdAp7CiAgcmV0dXJuIChfcmF3ICYgVElN RV9FWFBfTUFTSykgPj4gVElNRV9FWFBfU0hJRlQ7Cn0KCgoKaW5saW5lIHZvaWQgTDRfc2NoZWRf cGFyYW06OnRpbWVfZXhwKCBNd29yZCBlICkKewogIF9yYXcgPSAoX3JhdyAmIH5USU1FX0VYUF9N QVNLKSB8ICgoZTw8VElNRV9FWFBfU0hJRlQpICYgVElNRV9FWFBfTUFTSyk7Cn0KCgoKaW5saW5l IE13b3JkIEw0X3NjaGVkX3BhcmFtOjp0aW1lX21hbigpIGNvbnN0CnsKICByZXR1cm4gKF9yYXcg JiBUSU1FX01BTl9NQVNLKSA+PiBUSU1FX01BTl9TSElGVDsKfQoKCgppbmxpbmUgdm9pZCBMNF9z Y2hlZF9wYXJhbTo6dGltZV9tYW4oIE13b3JkIG0gKQp7CiAgX3JhdyA9IChfcmF3ICYgflRJTUVf TUFOX01BU0spIHwgKChtPDxUSU1FX01BTl9TSElGVCkgJiBUSU1FX01BTl9NQVNLKTsKfQoKCgpp bmxpbmUgTXdvcmQgTDRfc2NoZWRfcGFyYW06OmVycm9yKCkgY29uc3QKewogIHJldHVybiAoX3Jh dyAmIEVSUk9SX01BU0spID4+IEVSUk9SX1NISUZUOwp9CgoKCmlubGluZSB2b2lkIEw0X3NjaGVk X3BhcmFtOjplcnJvciggTXdvcmQgZSApCnsKICBfcmF3ID0gKF9yYXcgJiB+RVJST1JfTUFTSykg fCAoKGU8PEVSUk9SX1NISUZUKSAmIEVSUk9SX01BU0spOwp9CgoKCmlubGluZSBNd29yZCBMNF9z Y2hlZF9wYXJhbTo6cmF3KCkgY29uc3QKewogIHJldHVybiBfcmF3Owp9CgoKCmlubGluZSBNd29y ZCBMNF9zY2hlZF9wYXJhbTo6aXNfdmFsaWQoKSBjb25zdAp7CiAgcmV0dXJuIF9yYXcgIT0gKE13 b3JkKS0xOwp9CgoKCmlubGluZSB2b2lkIEw0X3NjaGVkX3BhcmFtOjp0aW1lKCBVbnNpZ25lZDY0 IHQgKQp7CiAgTXdvcmQgZXhwID0gMTU7CiAgd2hpbGUgKHQgPiAyNTUpCiAgICB7CiAgICAgIHQg Pj49IDI7CiAgICAgIGV4cC0tOwogICAgfQoKICB0aW1lX2V4cChleHApOwogIHRpbWVfbWFuKHQp Owp9CgoKCmlubGluZSBVbnNpZ25lZDY0IEw0X3NjaGVkX3BhcmFtOjp0aW1lKCkKewogIGlmKHRp bWVfZXhwKCkpCiAgICB7CiAgICAgIGlmKHRpbWVfbWFuKCkpCiAgICAgICAgcmV0dXJuIChVbnNp Z25lZDY0KXRpbWVfbWFuKCkgPDwgKCgxNS10aW1lX2V4cCgpKSA8PCAxKTsKICAgICAgZWxzZQog ICAgICAgIHJldHVybiAwOwogICAgfQogIGVsc2UKICAgIHJldHVybiAoVW5zaWduZWQ2NCktMTsK fQojIDkgImF1dG8vY29uZmlnLmgiIDIKIyAxICIuLi9zcmMva2Vybi9jb25maWdfdGNic2l6ZS5o IiAxCiMgMTAgImF1dG8vY29uZmlnLmgiIDIKIyA0NiAiYXV0by9jb25maWcuaCIKY2xhc3MgQ29u ZmlnCnsKcHVibGljOgoKICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga2VybmVsX3ZlcnNpb25f c3RyaW5nOwoKICBlbnVtIHsKICAgIE1BWF9OVU1fSVJRID0gMjAsCiAgICBTRVJJQUxfRVNDX0lS USA9IDIsCiAgICBTRVJJQUxfRVNDX05PSVJRID0gMSwKICAgIFNFUklBTF9OT19FU0MgPSAwLAog IH07CgoKICBzdGF0aWMgY29uc3QgdW5zaWduZWQga2VybmVsX3ZlcnNpb25faWQgPSAweDAxMDA0 NDQ0OwojIDcwICJhdXRvL2NvbmZpZy5oIgogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXJuZWxf bWVtX3Blcl9jZW50ID0gMTA7CgogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB0aHJlYWRfYmxvY2tf c2l6ZSA9ICgweDgwMCk7CgogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB0aHJlYWRfYmxvY2tfbWFz awogICAgPSAodGhyZWFkX2Jsb2NrX3NpemUgLSAxKSB8IH4oKHRocmVhZF9ibG9ja19zaXplIDw8 ICgxMSs3KSkgLSAxKTsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgdGhyZWFkX2Jsb2NrX2lkX2Zh Y3RvciA9IHRocmVhZF9ibG9ja19zaXplLzB4NDAwOwoKICBzdGF0aWMgY29uc3QgYm9vbCBjb25z ZXJ2YXRpdmUgPSBmYWxzZTsKICBzdGF0aWMgY29uc3QgYm9vbCBtb25pdG9yX3BhZ2VfZmF1bHRz ID0gY29uc2VydmF0aXZlOwoKCiAgc3RhdGljIGNvbnN0IGJvb2wgZGVjZWl0X2JpdF9kaXNhYmxl c19zd2l0Y2ggPSB0cnVlOwoKCgogIHN0YXRpYyBjb25zdCBib29sIGZpbmVfZ3JhaW5lZF9jcHV0 aW1lID0gZmFsc2U7CgogIHN0YXRpYyBib29sIGlycV9hY2tfaW5fa2VybmVsOwoKICBzdGF0aWMg Ym9vbCBlc2NfaGFjazsKICBzdGF0aWMgaW50IHNlcmlhbF9lc2M7CiAgc3RhdGljIGJvb2wgd2F0 Y2hkb2c7CiAgc3RhdGljIGJvb2wgYXBpYzsKCiAgc3RhdGljIHVuc2lnbmVkIHRidWZfZW50cmll czsKCgoKCiAgc3RhdGljIGNvbnN0IGJvb2wgcHJvZmlsaW5nID0gZmFsc2U7CgogIHN0YXRpYyBj b25zdCBpbnQgcHJvZmlsaW5nX3JhdGUgPSAxMDA7CiAgc3RhdGljIGNvbnN0IGludCBwcm9maWxl X2lycSA9IDA7CgoKICBzdGF0aWMgY29uc3QgdW5zaWduZWQga2VybmVsX3Rhc2tubyA9IDA7CiAg c3RhdGljIGNvbnN0IEw0X3VpZCBrZXJuZWxfaWQ7CiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtl cm5lbF9wcmlvID0gMTsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQga2VybmVsX21jcCA9IDI1NTsK CgogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaWdtYTBfdGFza25vID0gMjsKICBzdGF0aWMgY29u c3QgTDRfdWlkIHNpZ21hMF9pZDsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2lnbWEwX3ByaW8g PSAweDEwOwogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaWdtYTBfbWNwID0gMDsKCgogIHN0YXRp YyBjb25zdCB1bnNpZ25lZCBib290X3Rhc2tubyA9IDQ7CiAgc3RhdGljIGNvbnN0IEw0X3VpZCBi b290X2lkOwogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBib290X3ByaW8gPSAweDEwOwogIHN0YXRp YyBjb25zdCB1bnNpZ25lZCBib290X21jcCA9IDI1NTsKCgogIHN0YXRpYyBjb25zdCBpbnQgZGVm YXVsdF90aW1lX3NsaWNlID0gMTA7CgoKICBlbnVtIHsKCgoKICAgIFgyX0xJS0VfU1lTX0NBTExT ID0gMSwKCiAgfTsKCnByaXZhdGU6CgpwdWJsaWM6CgogIGVudW0gewogICAgVEJVRl9JUlEgPSAx NiwKICB9OwoKICBzdGF0aWMgY29uc3QgYm9vbCBiYWNrd2FyZF9jb21wYXRpYmlsaXR5ID0gdHJ1 ZTsKCgogIHN0YXRpYyBjb25zdCBib29sIHNjaGVkdWxpbmdfdXNpbmdfcGl0ID0gdHJ1ZTsKCgoK CgogIHN0YXRpYyBjb25zdCBib29sIGhsdF93b3Jrc19vayA9IHRydWU7CgogIHN0YXRpYyBjb25z dCBib29sIGdldGNoYXJfZG9lc19obHQgPSB0cnVlOwoKCgogIHN0YXRpYyBjb25zdCBib29sIHBp Y19wcmlvX21vZGlmeSA9IHRydWU7CgoKCgoKCiAgc3RhdGljIGNvbnN0IGJvb2wgZW5hYmxlX2lv X3Byb3RlY3Rpb24gPSBmYWxzZTsKCgogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtaWNyb3NlY19w ZXJfdGljayA9IDEwMDBMTDsKIyAxNzggImF1dG8vY29uZmlnLmgiCiAgc3RhdGljIHVuc2lnbmVk IGNvbnN0IGRlZmF1bHRfY29uc29sZV91YXJ0ID0gMjsKICBzdGF0aWMgdW5zaWduZWQgY29uc3Qg ZGVmYXVsdF9jb25zb2xlX3VhcnRfYmF1ZHJhdGUgPSAxMTUyMDA7Cgpwcml2YXRlOgoKcHVibGlj OgoKICBlbnVtIHsKICAgIFBBR0VfU0hJRlQgPSAxMiwKICAgIFBBR0VfU0laRSA9IDEgPDwgUEFH RV9TSElGVCwKICAgIFBBR0VfTUFTSyA9IH4oIFBBR0VfU0laRSAtIDEpLAoKICAgIFNVUEVSUEFH RV9TSElGVCA9IDIyLAogICAgU1VQRVJQQUdFX1NJWkUgPSAxIDw8IFNVUEVSUEFHRV9TSElGVCwK ICAgIFNVUEVSUEFHRV9NQVNLID0gfiggU1VQRVJQQUdFX1NJWkUgLTEgKSwKCiAgfTsKCiAgZW51 bSB7CiAgICBBVVRPX01BUF9LSVBfQUREUkVTUyA9IDB4YmZmZjAwMDAsCiAgfTsKCgpwdWJsaWM6 CgogIHN0YXRpYyB2b2lkIGluaXQoKTsKfTsKIyAxMSAiYXV0by9wcm9maWxlX2kuaCIgMgojIDEg ImF1dG8va21lbS5oIiAxCgoKCgoKCiMgMSAiYXV0by9raXAuaCIgMQojIDE3ICJhdXRvL2tpcC5o IgpzdHJ1Y3QgS2VybmVsX2luZm8KewoKICBNd29yZCBtYWdpYzsKICBNd29yZCB2ZXJzaW9uOwog IFVuc2lnbmVkOCBvZmZzZXRfdmVyc2lvbl9zdHJpbmdzOwogIFVuc2lnbmVkOCByZXNlcnZlZFsz XTsKICBVbnNpZ25lZDgga2lwX3N5c19jYWxsczsKICBVbnNpZ25lZDggcmVzZXJ2ZWQwMVszXTsK CgoKCgoKCiAgTXdvcmQgaW5pdF9kZWZhdWx0X2tkZWJ1ZywgZGVmYXVsdF9rZGVidWdfZXhjZXB0 aW9uLAogICAgX191bmtub3duLCBkZWZhdWx0X2tkZWJ1Z19lbmQ7CgoKICBNd29yZCBzaWdtYTBf ZXNwLCBzaWdtYTBfZWlwOwogIGw0X2xvd19oaWdoX3Qgc2lnbWEwX21lbW9yeTsKCgogIE13b3Jk IHNpZ21hMV9lc3AsIHNpZ21hMV9laXA7CiAgbDRfbG93X2hpZ2hfdCBzaWdtYTFfbWVtb3J5OwoK CiAgTXdvcmQgcm9vdF9lc3AsIHJvb3RfZWlwOwogIGw0X2xvd19oaWdoX3Qgcm9vdF9tZW1vcnk7 CgoKICBNd29yZCBsNF9jb25maWc7CiAgTXdvcmQgcmVzZXJ2ZWQyOwogIE13b3JkIGtkZWJ1Z19j b25maWc7CiAgTXdvcmQga2RlYnVnX3Blcm1pc3Npb247CgoKICBsNF9sb3dfaGlnaF90IG1haW5f bWVtb3J5OwogIGw0X2xvd19oaWdoX3QgcmVzZXJ2ZWQwOwoKCiAgbDRfbG93X2hpZ2hfdCByZXNl cnZlZDE7CiAgbDRfbG93X2hpZ2hfdCBzZW1pX3Jlc2VydmVkOwoKCiAgbDRfbG93X2hpZ2hfdCBk ZWRpY2F0ZWRbNF07CgoKICB2b2xhdGlsZSBDcHVfdGltZSBjbG9jazsKICBNd29yZCB1bnVzZWRf NFsyXTsKCgogIE13b3JkIGZyZXF1ZW5jaWVzWzJdOwogIE13b3JkIHVudXNlZF81WzJdOwoKCiAg TXdvcmQgc3lzX2lwYzsKICBNd29yZCBzeXNfaWRfbmVhcmVzdDsKICBNd29yZCBzeXNfZnBhZ2Vf dW5tYXA7CiAgTXdvcmQgc3lzX3RocmVhZF9zd2l0Y2g7CgoKICBNd29yZCBzeXNfdGhyZWFkX3Nj aGVkdWxlOwogIE13b3JkIHN5c19sdGhyZWFkX2V4X3JlZ3M7CiAgTXdvcmQgc3lzX3Rhc2tfbmV3 OwogIE13b3JkIHVudXNlZF82OwoKCiAgY2hhciB2ZXJzaW9uX3N0cmluZ3NbMjU2XTsKICBjaGFy IHN5c19jYWxsc1tdOwp9OwojIDggImF1dG8va21lbS5oIiAyCgojIDEgIi4uL3NyYy9saWIvbWlu aWxpYmMvaW5jbHVkZS9jc3RkZGVmIiAxCgoKCgoKIyAxICIvaG9tZS9hZGFtL2Vyd2luL3RtcC9n Y2MvMy4zL2luc3QvbGliL2djYy1saWIvaTY4Ni1wYy1saW51eC1nbnUvMy4zL2luY2x1ZGUvc3Rk ZGVmLmgiIDEgMyA0CiMgNyAiLi4vc3JjL2xpYi9taW5pbGliYy9pbmNsdWRlL2NzdGRkZWYiIDIK Cm5hbWVzcGFjZSBzdGQgewoKCgogIHVzaW5nIDo6cHRyZGlmZl90OwogIHVzaW5nIDo6c2l6ZV90 OwoKCgp9OwojIDEwICJhdXRvL2ttZW0uaCIgMgoKCgojIDEgIi4uL3NyYy9saWIva2Vybi9pbmNs dWRlL2ZsdXgveDg2L211bHRpYm9vdC5oIiAxCiMgMjQgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRl L2ZsdXgveDg2L211bHRpYm9vdC5oIgojIDEgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgv eDg2L3R5cGVzLmgiIDEKIyA0NiAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvdHlw ZXMuaCIKdHlwZWRlZiB1bnNpZ25lZCBpbnQgbmF0dXJhbF90OwojIDU1ICIuLi9zcmMvbGliL2tl cm4vaW5jbHVkZS9mbHV4L3g4Ni90eXBlcy5oIgp0eXBlZGVmIGludCBpbnRlZ2VyX3Q7CgoKCgoK dHlwZWRlZiBuYXR1cmFsX3Qgdm1fb2Zmc2V0X3Q7CgoKCgoKCnR5cGVkZWYgbmF0dXJhbF90IHZt X3NpemVfdDsKCgoKCgp0eXBlZGVmIHNpZ25lZCBjaGFyIHNpZ25lZDhfdDsKdHlwZWRlZiBzaWdu ZWQgc2hvcnQgc2lnbmVkMTZfdDsKdHlwZWRlZiBzaWduZWQgbG9uZyBzaWduZWQzMl90Owp0eXBl ZGVmIHNpZ25lZCBsb25nIGxvbmcgc2lnbmVkNjRfdDsKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVu c2lnbmVkOF90Owp0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVuc2lnbmVkMTZfdDsKdHlwZWRlZiB1 bnNpZ25lZCBsb25nIHVuc2lnbmVkMzJfdDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdW5z aWduZWQ2NF90Owp0eXBlZGVmIGZsb2F0IGZsb2F0MzJfdDsKdHlwZWRlZiBkb3VibGUgZmxvYXQ2 NF90OwojIDI1ICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9tdWx0aWJvb3QuaCIg MgoKCgpzdHJ1Y3QgbXVsdGlib290X2hlYWRlcgp7CgogICAgICAgIHVuc2lnbmVkIG1hZ2ljOwoK CiAgICAgICAgdW5zaWduZWQgZmxhZ3M7CgoKICAgICAgICB1bnNpZ25lZCBjaGVja3N1bTsKCgog ICAgICAgIHZtX29mZnNldF90IGhlYWRlcl9hZGRyOwogICAgICAgIHZtX29mZnNldF90IGxvYWRf YWRkcjsKICAgICAgICB2bV9vZmZzZXRfdCBsb2FkX2VuZF9hZGRyOwogICAgICAgIHZtX29mZnNl dF90IGJzc19lbmRfYWRkcjsKICAgICAgICB2bV9vZmZzZXRfdCBlbnRyeTsKfTsKIyA3NyAiLi4v c3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvbXVsdGlib290LmgiCnN0cnVjdCBtdWx0aWJv b3RfaW5mbwp7CgoKICAgICAgICB1bnNpZ25lZCBmbGFnczsKCgoKICAgICAgICB2bV9zaXplX3Qg bWVtX2xvd2VyOwogICAgICAgIHZtX3NpemVfdCBtZW1fdXBwZXI7CgoKCiAgICAgICAgdW5zaWdu ZWQgY2hhciBib290X2RldmljZVs0XTsKCgoKICAgICAgICB2bV9vZmZzZXRfdCBjbWRsaW5lOwoK CgogICAgICAgIHVuc2lnbmVkIG1vZHNfY291bnQ7CiAgICAgICAgdm1fb2Zmc2V0X3QgbW9kc19h ZGRyOwoKCiAgICAgICAgdW5pb24KICAgICAgICB7CiAgICAgICAgICBzdHJ1Y3QKICAgICAgICAg IHsKCgogICAgICAgICAgICB2bV9zaXplX3QgdGFic2l6ZTsKICAgICAgICAgICAgdm1fc2l6ZV90 IHN0cnNpemU7CiAgICAgICAgICAgIHZtX29mZnNldF90IGFkZHI7CiAgICAgICAgICAgIHVuc2ln bmVkIHJlc2VydmVkOwogICAgICAgICAgfSBhOwoKICAgICAgICAgIHN0cnVjdAogICAgICAgICAg ewoKCiAgICAgICAgICAgIHVuc2lnbmVkIG51bTsKICAgICAgICAgICAgdm1fc2l6ZV90IHNpemU7 CiAgICAgICAgICAgIHZtX29mZnNldF90IGFkZHI7CiAgICAgICAgICAgIHVuc2lnbmVkIHNobmR4 OwogICAgICAgICAgfSBlOwogICAgICAgIH0gc3ltczsKCgoKICAgICAgICB2bV9zaXplX3QgbW1h cF9jb3VudDsKICAgICAgICB2bV9vZmZzZXRfdCBtbWFwX2FkZHI7Cn07CiMgMTQ1ICIuLi9zcmMv bGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9tdWx0aWJvb3QuaCIKc3RydWN0IG11bHRpYm9vdF9t b2R1bGUKewoKICAgICAgICB2bV9vZmZzZXRfdCBtb2Rfc3RhcnQ7CiAgICAgICAgdm1fb2Zmc2V0 X3QgbW9kX2VuZDsKCgogICAgICAgIHZtX29mZnNldF90IHN0cmluZzsKCgogICAgICAgIHVuc2ln bmVkIHJlc2VydmVkOwp9OwoKCgoKCgpzdHJ1Y3QgQWRkclJhbmdlRGVzYwp7CiAgdW5zaWduZWQg bG9uZyBzaXplOwogIHVuc2lnbmVkIGxvbmcgQmFzZUFkZHJMb3c7CiAgdW5zaWduZWQgbG9uZyBC YXNlQWRkckhpZ2g7CiAgdW5zaWduZWQgbG9uZyBMZW5ndGhMb3c7CiAgdW5zaWduZWQgbG9uZyBM ZW5ndGhIaWdoOwogIHVuc2lnbmVkIGxvbmcgVHlwZTsKCgp9OwojIDE0ICJhdXRvL2ttZW0uaCIg MgojIDEgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2L3BhZ2luZy5oIiAxCiMgMzUg Ii4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2L3BhZ2luZy5oIgojIDEgIi4uL3NyYy9s aWIva2Vybi9pbmNsdWRlL2ZsdXgvcGFnZS5oIiAxCiMgNDIgIi4uL3NyYy9saWIva2Vybi9pbmNs dWRlL2ZsdXgvcGFnZS5oIgojIDEgIi4uL3NyYy9saWIva2Vybi9pbmNsdWRlL2ZsdXgveDg2L3Bh Z2UuaCIgMQojIDQzICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3BhZ2UuaCIgMgojIDM2 ICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9wYWdpbmcuaCIgMgojIDExOCAiLi4v c3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvcGFnaW5nLmgiCiMgMSAiLi4vc3JjL2xpYi9r ZXJuL2luY2x1ZGUvZmx1eC94ODYvcHJvY19yZWcuaCIgMQojIDY3ICIuLi9zcmMvbGliL2tlcm4v aW5jbHVkZS9mbHV4L3g4Ni9wcm9jX3JlZy5oIgpleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgZ2V0 X2VmbGFncygpCnsKICAgICAgICB1bnNpZ25lZCBlZmxhZ3M7CiAgICAgICAgYXNtIHZvbGF0aWxl KCJwdXNoZiA7IHBvcGwgJTAiIDogIj1yIiAoZWZsYWdzKSk7CiAgICAgICAgcmV0dXJuIGVmbGFn czsKfQoKZXh0ZXJuIF9faW5saW5lIHZvaWQgc2V0X2VmbGFncyh1bnNpZ25lZCBlZmxhZ3MpCnsK ICAgICAgICBhc20gdm9sYXRpbGUoInB1c2hsICUwIDsgcG9wZiIgOiA6ICJyIiAoZWZsYWdzKSA6 ICJtZW1vcnkiKTsKfQoKZXh0ZXJuIF9faW5saW5lIHZvaWQgY2xpKCkgeyBhc20gdm9sYXRpbGUg KCJjbGkiIDogOiA6ICJtZW1vcnkiKTsgfQpleHRlcm4gX19pbmxpbmUgdm9pZCBzdGkoKSB7IGFz bSB2b2xhdGlsZSAoInN0aSIgOiA6IDogIm1lbW9yeSIpOyB9CmV4dGVybiBfX2lubGluZSB2b2lk IGNsZCgpIHsgYXNtKCJjbGQiKTsgfQoKCgoKCgpleHRlcm4gX19pbmxpbmUgdm9pZCBjbHRzKCkg eyBhc20oImNsdHMiKTsgfQoKZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF9jcygp CnsKICAgICAgICB1bnNpZ25lZCBzaG9ydCBjczsKICAgICAgICBhc20gdm9sYXRpbGUoIm1vdncg JSVjcywldzAiIDogIj1yIiAoY3MpKTsKICAgICAgICByZXR1cm4gY3M7Cn0KCmV4dGVybiBfX2lu bGluZSB1bnNpZ25lZCBzaG9ydCBnZXRfZHMoKQp7CiAgICAgICAgdW5zaWduZWQgc2hvcnQgZHM7 CiAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3Z3ICUlZHMsJXcwIiA6ICI9ciIgKGRzKSk7CiAgICAg ICAgcmV0dXJuIGRzOwp9CmV4dGVybiBfX2lubGluZSB2b2lkIHNldF9kcyh1bnNpZ25lZCBzaG9y dCBkcykKewogICAgICAgIGFzbSB2b2xhdGlsZSgibW92dyAldzAsJSVkcyIgOiA6ICJyIiAoZHMp KTsKfQoKZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF9lcygpCnsKICAgICAgICB1 bnNpZ25lZCBzaG9ydCBlczsKICAgICAgICBhc20gdm9sYXRpbGUoIm1vdncgJSVlcywldzAiIDog Ij1yIiAoZXMpKTsKICAgICAgICByZXR1cm4gZXM7Cn0KZXh0ZXJuIF9faW5saW5lIHZvaWQgc2V0 X2VzKHVuc2lnbmVkIHNob3J0IGVzKQp7CiAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3Z3ICV3MCwl JWVzIiA6IDogInIiIChlcykpOwp9CgpleHRlcm4gX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgZ2V0 X2ZzKCkKewogICAgICAgIHVuc2lnbmVkIHNob3J0IGZzOwogICAgICAgIGFzbSB2b2xhdGlsZSgi bW92dyAlJWZzLCV3MCIgOiAiPXIiIChmcykpOwogICAgICAgIHJldHVybiBmczsKfQpleHRlcm4g X19pbmxpbmUgdm9pZCBzZXRfZnModW5zaWduZWQgc2hvcnQgZnMpCnsKICAgICAgICBhc20gdm9s YXRpbGUoIm1vdncgJXcwLCUlZnMiIDogOiAiciIgKGZzKSk7Cn0KCmV4dGVybiBfX2lubGluZSB1 bnNpZ25lZCBzaG9ydCBnZXRfZ3MoKQp7CiAgICAgICAgdW5zaWduZWQgc2hvcnQgZ3M7CiAgICAg ICAgYXNtIHZvbGF0aWxlKCJtb3Z3ICUlZ3MsJXcwIiA6ICI9ciIgKGdzKSk7CiAgICAgICAgcmV0 dXJuIGdzOwp9CmV4dGVybiBfX2lubGluZSB2b2lkIHNldF9ncyh1bnNpZ25lZCBzaG9ydCBncykK ewogICAgICAgIGFzbSB2b2xhdGlsZSgibW92dyAldzAsJSVncyIgOiA6ICJyIiAoZ3MpKTsKfQoK ZXh0ZXJuIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IGdldF9zcygpCnsKICAgICAgICB1bnNpZ25l ZCBzaG9ydCBzczsKICAgICAgICBhc20gdm9sYXRpbGUoIm1vdncgJSVzcywldzAiIDogIj1yIiAo c3MpKTsKICAgICAgICByZXR1cm4gc3M7Cn0KZXh0ZXJuIF9faW5saW5lIHZvaWQgc2V0X3NzKHVu c2lnbmVkIHNob3J0IHNzKQp7CiAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3Z3ICV3MCwlJXNzIiA6 IDogInIiIChzcykpOwp9CiMgMTE5ICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9w YWdpbmcuaCIgMgoKCgoKdHlwZWRlZiB1bnNpZ25lZCBpbnQgcHRfZW50cnlfdDsKCgp0eXBlZGVm IHVuc2lnbmVkIGludCBwZF9lbnRyeV90OwojIDE0NiAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUv Zmx1eC94ODYvcGFnaW5nLmgiCmV4dGVybiBfX2lubGluZSB2b2lkIHBhZ2luZ19lbmFibGUodm1f b2Zmc2V0X3QgcGRpcikKewoKICAgICAgICAoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgX3RlbXBf XyA9IChwZGlyKTsgYXNtIHZvbGF0aWxlKCJtb3YgJTAsICUlY3IzIiA6IDogInIiIChfdGVtcF9f KSk7IH0pOwoKCiAgICAgICAgYXNtIHZvbGF0aWxlKCJtb3ZsICAlMCwlJWNyMAlcblx0IgogICAg ICAgICAgICAgICAgICAgICAiam1wICAgMWYJCVxuXHQiCiAgICAgICAgICAgICAgICAgICAgICIx OgkJXG5cdCIKICAgICAgICAgICAgICAgICAgICAgOiA6ICJyIiAoKHsgcmVnaXN0ZXIgdW5zaWdu ZWQgaW50IF90ZW1wX187IGFzbSB2b2xhdGlsZSgibW92ICUlY3IwLCAlMCIgOiAiPXIiIChfdGVt cF9fKSk7IF90ZW1wX187IH0pIHwgMHg4MDAwMDAwMCkpOwp9CiMgMTUgImF1dG8va21lbS5oIiAy CgojIDEgImF1dG8va2Vybl90eXBlcy5oIiAxCiMgMTMgImF1dG8va2Vybl90eXBlcy5oIgp0ZW1w bGF0ZTwgdHlwZW5hbWUgX1R5ID4Kc3RydWN0IFBfcHRyCnsKCnB1YmxpYzoKCiAgdHlwZWRlZiBf VHkgKlJhd190eXBlOwogIHR5cGVkZWYgdm1fb2Zmc2V0X3QgVW5zaWduZWRfdHlwZTsKCiAgUF9w dHI8IF9UeSA+ICZvcGVyYXRvciArKyAoKQogIHsKICAgICsrX19wdHI7CiAgICByZXR1cm4gKnRo aXM7CiAgfQoKICBQX3B0cjwgX1R5ID4gJm9wZXJhdG9yIC0tICgpCiAgewogICAgLS1fX3B0cjsK ICAgIHJldHVybiAqdGhpczsKICB9CgogIFBfcHRyPCBfVHkgPiBvcGVyYXRvciArKyAoaW50KQog IHsKICAgIHJldHVybiBQX3B0cihfX3B0cisrKTsKICB9CgogIFBfcHRyPCBfVHkgPiBvcGVyYXRv ciAtLSAoaW50KQogIHsKICAgIHJldHVybiBQX3B0cihfX3B0ci0tKTsKICB9CgogIFBfcHRyPCBf VHkgPiBvcGVyYXRvciArICggU213b3JkIHBkICkgY29uc3QKICB7CiAgICByZXR1cm4gUF9wdHIo X19wdHIgKyBwZCk7CiAgfQoKICBQX3B0cjwgX1R5ID4gb3BlcmF0b3IgLSAoIFNtd29yZCBwZCAp IGNvbnN0CiAgewogICAgcmV0dXJuIFBfcHRyKF9fcHRyIC0gcGQpOwogIH0KCiAgUF9wdHI8IF9U eSA+ICZvcGVyYXRvciArPSAoIFNtd29yZCBwZCApCiAgewogICAgX19wdHIgKz0gcGQ7CiAgICBy ZXR1cm4gKnRoaXM7CiAgfQoKICBQX3B0cjwgX1R5ID4gJm9wZXJhdG9yIC09ICggU213b3JkIHBk ICkKICB7CiAgICBfX3B0ciAtPSBwZDsKICAgIHJldHVybiAqdGhpczsKICB9CgogIFBfcHRyPCBf VHkgPiBvcGVyYXRvciAmICggTXdvcmQgbyApCiAgewogICAgcmV0dXJuIChfVHkqKSgoTXdvcmQp X19wdHIgJiBvKTsKICB9CgogIGJvb2wgb3BlcmF0b3IgPT0gKCBQX3B0ciBjb25zdCAmbyApIGNv bnN0CiAgewogICAgcmV0dXJuICh2b2lkKilfX3B0ciA9PSAodm9pZCopby5fX3B0cjsKICB9Cgog IGJvb2wgb3BlcmF0b3IgIT0gKCBQX3B0ciBjb25zdCAmbyApIGNvbnN0CiAgewogICAgcmV0dXJu ICh2b2lkKilfX3B0ciAhPSAodm9pZCopby5fX3B0cjsKICB9CgogIGJvb2wgaXNfbnVsbCgpIGNv bnN0CiAgewogICAgcmV0dXJuIF9fcHRyID09ICh2b2lkKikoLTEpOwogIH0KCiAgYm9vbCBpc19p bnZhbGlkKCkgY29uc3QKICB7CiAgICByZXR1cm4gX19wdHIgPT0gKHZvaWQqKSgtMSk7CiAgfQoK ICBfVHkqIGdldF9yYXcoKSBjb25zdAogIHsKICAgIHJldHVybiBfX3B0cjsKICB9CgogIFVuc2ln bmVkX3R5cGUgZ2V0X3Vuc2lnbmVkKCkgY29uc3QKICB7CiAgICByZXR1cm4gKFVuc2lnbmVkX3R5 cGUpX19wdHI7CiAgfQoKICBQX3B0cjx2b2lkPiB0b192b2lkKCkgY29uc3QKICB7CiAgICByZXR1 cm4gUF9wdHI8dm9pZD4oKHZvaWQqKV9fcHRyKTsKICB9CgogIFBfcHRyPCBfVHkgPiBvcGVyYXRv ciA9IChfVHkgKm8pCiAgewogICAgcmV0dXJuIFBfcHRyKF9fcHRyPSBvKTsKICB9CgogIFBfcHRy PCBfVHkgPiBvcGVyYXRvciA9IChQX3B0cjxfVHk+IGNvbnN0ICZvKQogIHsKICAgIHJldHVybiBQ X3B0cihfX3B0cj0gby5fX3B0cik7CiAgfQoKICB0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RvID4KICBz dGF0aWMgUF9wdHIgY2FzdCggUF9wdHI8IF9UbyA+IGNvbnN0ICZvKQogIHsKICAgIHJldHVybiBQ X3B0cjxfVHk+KHN0YXRpY19jYXN0PF9UeSo+KG8uZ2V0X3JhdygpKSk7CiAgfQoKICBleHBsaWNp dCBQX3B0ciggTXdvcmQgYWRkciApCiAgICA6IF9fcHRyKChfVHkqKWFkZHIpCiAge30KCiAgUF9w dHIoIF9UeSAqcCA9IChfVHkqKSgtMSkgKQogICAgOiBfX3B0cihwKQogIHt9CiMgMTM3ICJhdXRv L2tlcm5fdHlwZXMuaCIKICB0ZW1wbGF0ZTwgdHlwZW5hbWUgX1RvID4KICBQX3B0ciggUF9wdHI8 X1RvPiBjb25zdCAmbyApCiAgICA6IF9fcHRyKG8uZ2V0X3JhdygpKQogIHt9Cgpwcml2YXRlOgoK ICBfVHkgKl9fcHRyOwoKfTsKIyAxNyAiYXV0by9rbWVtLmgiIDIKCgoKIyAxICIuLi9zcmMva2Vy bi9jb25maWdfZ2R0LmgiIDEKIyAyMSAiYXV0by9rbWVtLmgiIDIKIyAzMCAiYXV0by9rbWVtLmgi CiMgMSAiLi4vc3JjL2tlcm4vaWEzMi9saW5rZXJfc3ltcy5oIiAxCgoKCmV4dGVybiAiQyIgewog IGV4dGVybiBjaGFyIF9zdGFydCwgX2V0ZXh0LCBfc3N0YWNrLCBfc3RhY2ssIF9lZGF0YSwgX2Vu ZDsKICBleHRlcm4gY2hhciBfcGh5c21lbV8xOwogIGV4dGVybiBjaGFyIF90Y2JzXzE7CiAgZXh0 ZXJuIGNoYXIgX2lvYml0bWFwXzE7CiAgZXh0ZXJuIGNoYXIgX3VudXNlZDFfMSwgX3VudXNlZDJf MSwgX3VudXNlZDNfMSwgX3VudXNlZDRfaW9fMTsKICBleHRlcm4gY2hhciBfaXBjX3dpbmRvdzBf MSwgX2lwY193aW5kb3cxXzE7CiAgZXh0ZXJuIGNoYXIgX3NlcnZpY2U7Cn0KIyAzMSAiYXV0by9r bWVtLmgiIDIKCgoKCgoKc3RydWN0IHg4Nl9nYXRlOwpzdHJ1Y3QgeDg2X3RzczsKc3RydWN0IHg4 Nl9kZXNjOwoKCnZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QpOwp2b2lkIG9wZXJhdG9yIGRlbGV0 ZSh2b2lkICpibG9jayk7CgoKY2xhc3Mga21lbQp7CnB1YmxpYzoKICBzdGF0aWMgS2VybmVsX2lu Zm8gKmluZm8oKTsKcHJpdmF0ZToKCiAgZnJpZW5kIGNsYXNzIFZtZW1fYWxsb2M7CnB1YmxpYzoK CgoKCiAgc3RhdGljIGNvbnN0IHZtX29mZnNldF90IG1lbV9waHlzID0gcmVpbnRlcnByZXRfY2Fz dDx2bV9vZmZzZXRfdD4oJl9waHlzbWVtXzEpOwoKICBzdGF0aWMgY29uc3Qgdm1fb2Zmc2V0X3Qg bWVtX3RjYnMgPSByZWludGVycHJldF9jYXN0PHZtX29mZnNldF90PigmX3RjYnNfMSk7CgogIHN0 YXRpYyBjb25zdCB2bV9vZmZzZXRfdCBtZW1fdXNlcl9tYXggPSAweGMwMDAwMDAwOwoKICBzdGF0 aWMgY29uc3Qgdm1fb2Zmc2V0X3QgaW9fYml0bWFwID0KICAgICByZWludGVycHJldF9jYXN0PHZt X29mZnNldF90PigmX2lvYml0bWFwXzEpOwoKCiAgc3RhdGljIGNvbnN0IHZtX29mZnNldF90IHNl cnZpY2VfcGFnZQogICAgPSByZWludGVycHJldF9jYXN0PHZtX29mZnNldF90PigmX3NlcnZpY2Up OwoKICBzdGF0aWMgY29uc3Qgdm1fb2Zmc2V0X3QgbG9jYWxfYXBpY19wYWdlID0gc2VydmljZV9w YWdlOwoKICBzdGF0aWMgY29uc3Qgdm1fb2Zmc2V0X3QgamRiX2FkYXB0ZXJfcGFnZSA9IGxvY2Fs X2FwaWNfcGFnZSArIDB4MTAwMDsKCiAgc3RhdGljIGNvbnN0IHZtX29mZnNldF90IHRidWZfc3Rh dHVzX3BhZ2UgPSBqZGJfYWRhcHRlcl9wYWdlICsgMHgxMDAwOwoKCgogIHN0YXRpYyBjb25zdCB2 bV9vZmZzZXRfdCB0YnVmX2J1ZmZlcl9hcmVhID0gc2VydmljZV9wYWdlICsgMHgyMDAwMDA7Cgog IHN0YXRpYyBjb25zdCB2bV9vZmZzZXRfdCBpcGNfd2luZG93MAogICAgPSByZWludGVycHJldF9j YXN0PHZtX29mZnNldF90PigmX2lwY193aW5kb3cwXzEpOwoKICBzdGF0aWMgY29uc3Qgdm1fb2Zm c2V0X3QgaXBjX3dpbmRvdzEKICAgID0gcmVpbnRlcnByZXRfY2FzdDx2bV9vZmZzZXRfdD4oJl9p cGNfd2luZG93MV8xKTsKCgoKICBzdGF0aWMgcHRfZW50cnlfdCAqamRiX2FkYXB0ZXJfcHQ7CgoK ICBlbnVtIHsgZ2R0X3RzcyA9ICgweDA4KSwKICAgIGdkdF9jb2RlX2tlcm5lbCA9ICgweDEwKSwg Z2R0X2RhdGFfa2VybmVsID0gKDB4MTgpLAogICAgZ2R0X2NvZGVfdXNlciA9ICgweDIwKSwgZ2R0 X2RhdGFfdXNlciA9ICgweDI4KSwKICAgIGdkdF9tYXggPSAoMHgzMCkgfTsKCiAgdGVtcGxhdGU8 IHR5cGVuYW1lIF9UeSA+CiAgc3RhdGljIF9UeSAqcGh5c190b192aXJ0KCBQX3B0cjxfVHk+ICk7 Cgpwcm90ZWN0ZWQ6CiAgc3RhdGljIHBkX2VudHJ5X3QgKmtkaXI7CiAgc3RhdGljIHBkX2VudHJ5 X3QgY3B1X2dsb2JhbDsKCnByaXZhdGU6CiAgZnJpZW5kIGNsYXNzIGtkYjsKICBmcmllbmQgY2xh c3MgamRiOwogIGZyaWVuZCBjbGFzcyBKZGJfa2Vybl9pbmZvOwogIGZyaWVuZCBjbGFzcyBwcm9m aWxlOwoKICBrbWVtKCk7CiAga21lbShjb25zdCBrbWVtJik7CgogIHN0YXRpYyB2bV9vZmZzZXRf dCBtZW1fbWF4LCBfaGltZW07CgogIHN0YXRpYyBjb25zdCBwZF9lbnRyeV90IGZsYWdfZ2xvYmFs ID0gMHgyMDA7CgogIHN0YXRpYyB4ODZfZ2F0ZSAqa2lkdDsKICBzdGF0aWMgeDg2X3RzcyB2b2xh dGlsZSAqdHNzIGFzbSAoIktNRU1fVFNTIik7CiAgc3RhdGljIHg4Nl9kZXNjICpnZHQ7CgogIHN0 YXRpYyBLZXJuZWxfaW5mbyAqa2luZm87CgogIHN0YXRpYyBVbnNpZ25lZDggKmlvX2JpdG1hcF9k ZWxpbWl0ZXI7CgpwdWJsaWM6CiMgMTM4ICJhdXRvL2ttZW0uaCIKICBzdGF0aWMgdm1fb2Zmc2V0 X3QgdmlydF90b19waHlzKGNvbnN0IHZvaWQgKmFkZHIpOwoKICBzdGF0aWMgdm9pZCAqIGxpbmVh cl92aXJ0X3RvX3BoeXMoY29uc3Qgdm9pZCAqYWRkcik7CiMgMTQ5ICJhdXRvL2ttZW0uaCIKICBz dGF0aWMgdm9pZCAqcGh5c190b192aXJ0KHZtX29mZnNldF90IGFkZHIpOwoKCgoKCgogIHN0YXRp YyB2b2lkIGRpcl9pbml0KHBkX2VudHJ5X3QgKmQpOwoKCgoKICBzdGF0aWMgdm9pZCB0bGJfZmx1 c2godm1fb2Zmc2V0X3QgYWRkcik7CgoKICBzdGF0aWMgdm9pZCB0bGJfZmx1c2goKTsKIyAxNzMg ImF1dG8va21lbS5oIgogIHN0YXRpYyB2bV9vZmZzZXRfdCBpcGNfd2luZG93KHVuc2lnbmVkIHdp bik7CgoKCgoKCiAgc3RhdGljIGNvbnN0IHBkX2VudHJ5X3QgKmRpcigpOwoKCgoKCgoKICBzdGF0 aWMgcGRfZW50cnlfdCBwZGVfZ2xvYmFsKCk7CgogIHN0YXRpYyB4ODZfZ2F0ZSAqaWR0KCk7Cgog IHN0YXRpYyB2bV9vZmZzZXRfdCBoaW1lbSgpOwoKCiAgc3RhdGljIHZtX29mZnNldF90IHZvbGF0 aWxlICprZXJuZWxfZXNwKCk7CgogIHN0YXRpYyB2bV9vZmZzZXRfdCBpb19iaXRtYXBfZGVsaW1p dGVyX3BhZ2Uodm9pZCk7CgoKCiAgc3RhdGljIHZvaWQgaW5pdCgpOwp9OwojIDIxMSAiYXV0by9r bWVtLmgiCiMgMSAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvdHNzLmgiIDEKIyAz MiAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvdHNzLmgiCnN0cnVjdCB4ODZfdHNz IHsKICAgICAgICBpbnQgYmFja19saW5rOwoKICAgICAgICBpbnQgZXNwMDsKICAgICAgICBpbnQg c3MwOwogICAgICAgIGludCBlc3AxOwogICAgICAgIGludCBzczE7CiAgICAgICAgaW50IGVzcDI7 CiAgICAgICAgaW50IHNzMjsKICAgICAgICBpbnQgY3IzOwoKICAgICAgICBpbnQgZWlwOwogICAg ICAgIGludCBlZmxhZ3M7CiAgICAgICAgaW50IGVheDsKICAgICAgICBpbnQgZWN4OwogICAgICAg IGludCBlZHg7CiAgICAgICAgaW50IGVieDsKICAgICAgICBpbnQgZXNwOwogICAgICAgIGludCBl YnA7CiAgICAgICAgaW50IGVzaTsKICAgICAgICBpbnQgZWRpOwogICAgICAgIGludCBlczsKICAg ICAgICBpbnQgY3M7CiAgICAgICAgaW50IHNzOwogICAgICAgIGludCBkczsKICAgICAgICBpbnQg ZnM7CiAgICAgICAgaW50IGdzOwogICAgICAgIGludCBsZHQ7CiAgICAgICAgdW5zaWduZWQgc2hv cnQgdHJhY2VfdHJhcDsKICAgICAgICB1bnNpZ25lZCBzaG9ydCBpb19iaXRfbWFwX29mZnNldDsK Cgp9OwojIDIxMiAiYXV0by9rbWVtLmgiIDIKIyAyMjcgImF1dG8va21lbS5oIgppbmxpbmUgdm9p ZCAqa21lbTo6cGh5c190b192aXJ0KHZtX29mZnNldF90IGFkZHIpCnsKICByZXR1cm4gcmVpbnRl cnByZXRfY2FzdDx2b2lkICo+KGFkZHIgKyBtZW1fcGh5cyk7Cn0KCgoKCgppbmxpbmUgdm9pZCBr bWVtOjp0bGJfZmx1c2godm1fb2Zmc2V0X3QgYWRkcikKewogIGFzbSB2b2xhdGlsZQogICAgKCJp bnZscGcgJTAiIDogOiAibSIgKCooY2hhciopYWRkcikgOiAibWVtb3J5Iik7Cn0KCgoKCmlubGlu ZSB2b2lkIGttZW06OnRsYl9mbHVzaCgpCnsKCiAgdW5zaWduZWQgZHVtbXk7CiAgYXNtIHZvbGF0 aWxlICgiIG1vdiAlJWNyMywlMDsgbW92ICUwLCUlY3IzICIgOiAiPXIiKGR1bW15KSApOwp9CiMg MjYxICJhdXRvL2ttZW0uaCIKaW5saW5lIHZtX29mZnNldF90CmttZW06OmlwY193aW5kb3codW5z aWduZWQgd2luKQp7CiAgaWYgKHdpbiA9PSAwKQogICAgcmV0dXJuIGlwY193aW5kb3cwOwoKICBy ZXR1cm4gaXBjX3dpbmRvdzE7Cn0KCgoKCgoKCmlubGluZSBjb25zdCBwZF9lbnRyeV90ICprbWVt OjpkaXIoKQp7CiAgcmV0dXJuIGtkaXI7Cn0KIyAyODggImF1dG8va21lbS5oIgppbmxpbmUgcGRf ZW50cnlfdCBrbWVtOjpwZGVfZ2xvYmFsKCkKewogIHJldHVybiBjcHVfZ2xvYmFsOwp9CgoKCmlu bGluZSB4ODZfZ2F0ZSAqa21lbTo6aWR0KCkKewogIHJldHVybiBraWR0Owp9CgoKCmlubGluZSB2 bV9vZmZzZXRfdCBrbWVtOjpoaW1lbSgpCnsKICByZXR1cm4gX2hpbWVtOwp9CgoKCgppbmxpbmUg dm1fb2Zmc2V0X3Qgdm9sYXRpbGUgKmttZW06Omtlcm5lbF9lc3AoKQp7CiAgcmV0dXJuIHJlaW50 ZXJwcmV0X2Nhc3Q8dm1fb2Zmc2V0X3Qgdm9sYXRpbGUgKj4oJiB0c3MtPmVzcDApOwp9CgoKCmlu bGluZSB2bV9vZmZzZXRfdCBrbWVtOjppb19iaXRtYXBfZGVsaW1pdGVyX3BhZ2Uodm9pZCkKewog IHJldHVybiByZWludGVycHJldF9jYXN0PHZtX29mZnNldF90Pihpb19iaXRtYXBfZGVsaW1pdGVy KTsKfQojIDMzMSAiYXV0by9rbWVtLmgiCnRlbXBsYXRlPCB0eXBlbmFtZSBfVHkgPiBpbmxpbmUg X1R5ICprbWVtOjpwaHlzX3RvX3ZpcnQoIFBfcHRyPF9UeT4gYWRkcikKewogIHJldHVybiByZWlu dGVycHJldF9jYXN0PF9UeSAqPihhZGRyLmdldF91bnNpZ25lZCgpICsgbWVtX3BoeXMpOwp9CgoK CgoKaW5saW5lIEtlcm5lbF9pbmZvICprbWVtOjppbmZvKCkKewogIHJldHVybiBraW5mbzsKfQoj IDEyICJhdXRvL3Byb2ZpbGVfaS5oIiAyCiMgMSAiYXV0by9pcnEuaCIgMQoKCgoKCiMgMSAiYXV0 by9zZW5kZXIuaCIgMQojIDEzICJhdXRvL3NlbmRlci5oIgpjbGFzcyBSZWNlaXZlcjsKCgoKY2xh c3MgU2VuZGVyCnsKcHVibGljOgoKCgogIHZpcnR1YWwgdm9pZCBpcGNfcmVjZWl2ZXJfcmVhZHko KSA9IDA7Cgpwcml2YXRlOgoKCgogICAgICAgICAgICAgTDRfdWlkIF9pZDsKICAgICAgICAgICAg IFJlY2VpdmVyKiBfc2VuZF9wYXJ0bmVyOwogICAgICAgICAgICAgU2VuZGVyKiBzZW5kZXJfbmV4 dCwgKiBzZW5kZXJfcHJldjsKCgoKICBmcmllbmQgY2xhc3MgamRiOwogIGZyaWVuZCBjbGFzcyBq ZGJfdGhyZWFkX2xpc3Q7CgpwdWJsaWM6CgoKCiAgTDRfdWlkIGlkKCkgY29uc3Q7CgoKCgogIFJl Y2VpdmVyKiByZWNlaXZlcigpIGNvbnN0OwojIDU3ICJhdXRvL3NlbmRlci5oIgogIGJvb2wgaW5f c2VuZGVyX2xpc3QoKTsKCnByb3RlY3RlZDoKCgoKCgoKCiAgU2VuZGVyKGNvbnN0IEw0X3VpZCYg aWQpOwojIDc3ICJhdXRvL3NlbmRlci5oIgogIGV4cGxpY2l0IFNlbmRlcihjb25zdCBMNF91aWQm IGlkLCBpbnQgKTsKCgoKCiAgdm9pZCBzZXRfcmVjZWl2ZXIoUmVjZWl2ZXIqIHJlY2VpdmVyKTsK CgoKCiAgdm9pZCBzZW5kZXJfZW5xdWV1ZShTZW5kZXIgKipyKTsKCgoKCiAgdm9pZCBzZW5kZXJf ZGVxdWV1ZShTZW5kZXIgKipyKTsKfTsKCgoKCgoKIyAxICIuLi9zcmMvbGliL21pbmlsaWJjL2lu Y2x1ZGUvY2Fzc2VydCIgMQoKCgoKCiMgMSAiLi4vc3JjL2xpYi9taW5pbGliYy9pbmNsdWRlL2Fz c2VydC5oIiAxCgoKCgoKZXh0ZXJuICJDIiB7Cgp2b2lkIF9fYXNzZXJ0X2ZhaWwgKGNvbnN0IGNo YXIgKl9fYXNzZXJ0aW9uLCBjb25zdCBjaGFyICpfX2ZpbGUsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgIHVuc2lnbmVkIGludCBfX2xpbmUsIGNvbnN0IGNoYXIgKl9fZnVuY3Rpb24pCiAgICAg X19hdHRyaWJ1dGVfXyAoKF9fbm9yZXR1cm5fXykpOwoKfQojIDcgIi4uL3NyYy9saWIvbWluaWxp YmMvaW5jbHVkZS9jYXNzZXJ0IiAyCiMgMTAxICJhdXRvL3NlbmRlci5oIiAyCgojIDEgImF1dG8v Y3B1X2xvY2suaCIgMQojIDIyICJhdXRvL2NwdV9sb2NrLmgiCmNsYXNzIENwdV9sb2NrCnsKcHVi bGljOgoKICB0eXBlZGVmIE13b3JkIFN0YXR1czsKCgogIENwdV9sb2NrKCk7CgoKCgoKICBTdGF0 dXMgdGVzdCgpIGNvbnN0OwoKCgoKCgogIHZvaWQgbG9jaygpOwoKCgoKICB2b2lkIGNsZWFyKCk7 CgoKCgoKCiAgU3RhdHVzIHRlc3RfYW5kX3NldCgpOwoKCgoKCiAgdm9pZCBzZXQoU3RhdHVzIHN0 YXRlKTsKCnByaXZhdGU6CgogIENwdV9sb2NrIChjb25zdCBDcHVfbG9jayYpOwoKfTsKCgoKCgpl eHRlcm4gQ3B1X2xvY2sgY3B1X2xvY2s7CiMgODUgImF1dG8vY3B1X2xvY2suaCIKIyAxICIuLi9z cmMvZHJpdmVycy9wcm9jZXNzb3IuaCIgMQoKCgoKCiMgMSAiLi4vc3JjL2RyaXZlcnMvaWEzMi9w cm9jZXNzb3ItYXJjaC5oIiAxCgoKCgoKCiMgMSAiYXV0by9zdGRfbWFjcm9zLmgiIDEKCgoKCgoj IDEgImdsb2JhbGNvbmZpZy5oIiAxCiMgNyAiYXV0by9zdGRfbWFjcm9zLmgiIDIKIyA4ICIuLi9z cmMvZHJpdmVycy9pYTMyL3Byb2Nlc3Nvci1hcmNoLmgiIDIKCm5hbWVzcGFjZSBQcm9jIHsKCiAg dHlwZWRlZiBVbnNpZ25lZDMyIFN0YXR1czsKCiAgaW5saW5lCiAgdm9pZCBwYXVzZSgpCiAgewog ICAgYXNtIHZvbGF0aWxlICgiIC5ieXRlIDB4ZjMsIDB4OTAgI3BhdXNlIFxuIiApOwogIH0KIyAy NyAiLi4vc3JjL2RyaXZlcnMvaWEzMi9wcm9jZXNzb3ItYXJjaC5oIgogIGlubGluZQogIHZvaWQg aGFsdCgpCiAgewogICAgYXNtIHZvbGF0aWxlICgiIGhsdCIgOiA6IDogIm1lbW9yeSIpOwogIH0K CiAgaW5saW5lCiAgdm9pZCBjbGkoKQogIHsKICAgIGFzbSB2b2xhdGlsZSAoImNsaSIgOiA6IDog Im1lbW9yeSIpOwogIH0KCiAgaW5saW5lCiAgdm9pZCBzdGkoKQogIHsKICAgIGFzbSB2b2xhdGls ZSAoInN0aSIgOiA6IDogIm1lbW9yeSIpOwogIH0KCiAgaW5saW5lCiAgU3RhdHVzIGNsaV9zYXZl KCkKICB7CiAgICBTdGF0dXMgcmV0OwogICAgYXNtIHZvbGF0aWxlICgicHVzaGZsCVxuXHQiCiAg ICAgICAgICAgICAgICAgICJwb3BsICUwCVxuXHQiCiAgICAgICAgICAgICAgICAgICJjbGkJCVxu XHQiCiAgICAgICAgICAgICAgICAgIDogIj1nIihyZXQpIDogOiAibWVtb3J5Iik7CiAgICByZXR1 cm4gcmV0OwogIH0KCiAgaW5saW5lCiAgdm9pZCBzdGlfcmVzdG9yZSggU3RhdHVzIHN0ICkKICB7 CiAgICBhc20gdm9sYXRpbGUgKCJ0ZXN0bCAkMHgwMjAwLCAlMAlcblx0IgogICAgICAgICAgICAg ICAgICAianogMWYJCVxuXHQiCiAgICAgICAgICAgICAgICAgICJzdGkJCQlcblx0IgogICAgICAg ICAgICAgICAgICAiMToJCQlcblx0IgogICAgICAgICAgICAgICAgICA6IDogImciKHN0KSA6ICJt ZW1vcnkiKTsKICB9CgogIGlubGluZQogIFN0YXR1cyBpbnRlcnJ1cHRzKCkKICB7CiAgICBTdGF0 dXMgcmV0OwogICAgYXNtIHZvbGF0aWxlICgicHVzaGZsICAgICAgICAgXG4iCiAgICAgICAgICAg ICAgICAgICJwb3BsICUwICAgICAgICBcbiIKICAgICAgICAgICAgICAgICAgOiAiPWciKHJldCkg OiA6ICJtZW1vcnkiKTsKICAgIHJldHVybiByZXQgJiAweDAyMDA7CiAgfQp9OwojIDcgIi4uL3Ny Yy9kcml2ZXJzL3Byb2Nlc3Nvci5oIiAyCgoKbmFtZXNwYWNlIFByb2MgewojIDIwICIuLi9zcmMv ZHJpdmVycy9wcm9jZXNzb3IuaCIKICB2b2lkIGNsaSgpOwoKCiAgdm9pZCBzdGkoKTsKCgogIFN0 YXR1cyBpbnRlcnJ1cHRzKCk7CgoKICBTdGF0dXMgY2xpX3NhdmUoKTsKCgogIHZvaWQgc3RpX3Jl c3RvcmUoIFN0YXR1cyApOwoKICB2b2lkIHBhdXNlKCk7CgogIHZvaWQgaGFsdCgpOwoKfTsKIyA4 NiAiYXV0by9jcHVfbG9jay5oIiAyCiMgOTUgImF1dG8vY3B1X2xvY2suaCIKaW5saW5lIENwdV9s b2NrOjpTdGF0dXMgQ3B1X2xvY2s6OnRlc3RfYW5kX3NldCgpCnsKICBTdGF0dXMgcmV0ID0gdGVz dCgpOwogIGxvY2soKTsKICByZXR1cm4gcmV0Owp9CgoKCgppbmxpbmUgdm9pZCBDcHVfbG9jazo6 c2V0KENwdV9sb2NrOjpTdGF0dXMgc3RhdGUpCnsKICBpZiAoc3RhdGUpCiAgICBsb2NrKCk7CiAg ZWxzZQogICAgY2xlYXIoKTsKfQoKCgppbmxpbmUgdm9pZCBDcHVfbG9jazo6bG9jaygpCnsKICBQ cm9jOjpjbGkoKTsKfQoKCgppbmxpbmUgdm9pZApDcHVfbG9jazo6Y2xlYXIoKQp7CiAgUHJvYzo6 c3RpKCk7Cn0KCgoKaW5saW5lIENwdV9sb2NrOjpTdGF0dXMgQ3B1X2xvY2s6OnRlc3QoKSBjb25z dAp7CiAgcmV0dXJuICEgUHJvYzo6aW50ZXJydXB0cygpOwp9CiMgMTAzICJhdXRvL3NlbmRlci5o IiAyCiMgMSAiYXV0by9sb2NrX2d1YXJkLmgiIDEKIyAxNCAiYXV0by9sb2NrX2d1YXJkLmgiCnRl bXBsYXRlPHR5cGVuYW1lIExPQ0s+CmNsYXNzIExvY2tfZ3VhcmQKewogIExPQ0sgKl9sb2NrOwoK cHVibGljOgogIExvY2tfZ3VhcmQoTE9DSyAqbCk7CgogIH5Mb2NrX2d1YXJkKCk7Cn07CiMgMzIg ImF1dG8vbG9ja19ndWFyZC5oIgp0ZW1wbGF0ZTx0eXBlbmFtZSBMT0NLPiBpbmxpbmUgTG9ja19n dWFyZDxMT0NLPjo6TG9ja19ndWFyZChMT0NLICpsKQogIDogX2xvY2sobCkKewogIGlmIChfbG9j ay0+dGVzdF9hbmRfc2V0KCkpCiAgICBfbG9jayA9IDA7Cn0KCgoKdGVtcGxhdGU8dHlwZW5hbWUg TE9DSz4gaW5saW5lIExvY2tfZ3VhcmQ8TE9DSz46On5Mb2NrX2d1YXJkKCkKewogIGlmIChfbG9j aykKICAgIF9sb2NrLT5jbGVhcigpOwp9CiMgMTA0ICJhdXRvL3NlbmRlci5oIiAyCiMgMTE1ICJh dXRvL3NlbmRlci5oIgppbmxpbmUgTDRfdWlkIFNlbmRlcjo6aWQoKSBjb25zdAp7IHJldHVybiBf aWQ7IH0KCgoKCgoKaW5saW5lIFJlY2VpdmVyKiBTZW5kZXI6OnJlY2VpdmVyKCkgY29uc3QKeyBy ZXR1cm4gX3NlbmRfcGFydG5lcjsgfQojIDEzNiAiYXV0by9zZW5kZXIuaCIKaW5saW5lIGJvb2wK U2VuZGVyOjppbl9zZW5kZXJfbGlzdCgpCnsKICByZXR1cm4gc2VuZGVyX25leHQ7Cn0KIyAxNTEg ImF1dG8vc2VuZGVyLmgiCmlubGluZSBTZW5kZXI6OlNlbmRlcihjb25zdCBMNF91aWQmIGlkKQog IDogX2lkIChpZCksIHNlbmRlcl9uZXh0ICgwKQp7fQojIDE2NCAiYXV0by9zZW5kZXIuaCIKaW5s aW5lIFNlbmRlcjo6U2VuZGVyKGNvbnN0IEw0X3VpZCYgaWQsIGludCApCiAgOiBfaWQgKGlkKQp7 fQoKCgoKCgppbmxpbmUgdm9pZCBTZW5kZXI6OnNldF9yZWNlaXZlcihSZWNlaXZlciogcmVjZWl2 ZXIpCnsKICBfc2VuZF9wYXJ0bmVyID0gcmVjZWl2ZXI7Cn0KCgoKCgoKaW5saW5lIHZvaWQKU2Vu ZGVyOjpzZW5kZXJfZW5xdWV1ZShTZW5kZXIgKipyKQp7CiAgTG9ja19ndWFyZDxDcHVfbG9jaz4g Z3VhcmQgKCZjcHVfbG9jayk7CgogIGlmICghIGluX3NlbmRlcl9saXN0KCkpCiAgICB7CiAgICAg IGlmICgqcikKICAgICAgICB7CiAgICAgICAgICBzZW5kZXJfbmV4dCA9ICpyOwogICAgICAgICAg c2VuZGVyX3ByZXYgPSBzZW5kZXJfbmV4dC0+c2VuZGVyX3ByZXY7CiAgICAgICAgICBzZW5kZXJf cHJldi0+c2VuZGVyX25leHQgPSB0aGlzOwogICAgICAgICAgc2VuZGVyX25leHQtPnNlbmRlcl9w cmV2ID0gdGhpczsKICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAqciA9 IHNlbmRlcl9wcmV2ID0gc2VuZGVyX25leHQgPSB0aGlzOwogICAgICAgIH0KICAgIH0KfQoKCgoK CgppbmxpbmUgdm9pZApTZW5kZXI6OnNlbmRlcl9kZXF1ZXVlKFNlbmRlciAqKnIpCnsKICBMb2Nr X2d1YXJkPENwdV9sb2NrPiBndWFyZCAoJmNwdV9sb2NrKTsKCiAgaWYgKGluX3NlbmRlcl9saXN0 KCkpCiAgICB7CiAgICAgIGlmIChzZW5kZXJfbmV4dCA9PSB0aGlzKQogICAgICAgIHsKICAgICAg ICAgICgodm9pZCkgKCgqciA9PSB0aGlzKSA/IDAgOiAoX19hc3NlcnRfZmFpbCAoIipyID09IHRo aXMiLCAiYXV0by9zZW5kZXIuaCIsIDIxOCwgKChjb25zdCBjaGFyICopIDApKSwgMCkpKTsKCiAg ICAgICAgICAqciA9IDA7CiAgICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAg aWYgKCpyID09IHRoaXMpCiAgICAgICAgICAgICpyID0gc2VuZGVyX25leHQ7CgogICAgICAgICAg c2VuZGVyX3ByZXYtPnNlbmRlcl9uZXh0ID0gc2VuZGVyX25leHQ7CiAgICAgICAgICBzZW5kZXJf bmV4dC0+c2VuZGVyX3ByZXYgPSBzZW5kZXJfcHJldjsKICAgICAgICB9CgogICAgICBzZW5kZXJf bmV4dCA9IDA7CiAgICB9Cn0KIyA3ICJhdXRvL2lycS5oIiAyCgoKCgoKCmNsYXNzIFJlY2VpdmVy OwoKCgoKCmNsYXNzIGlycV90IDogcHVibGljIFNlbmRlcgp7CnB1YmxpYzoKICB2aXJ0dWFsIGJv b2wgYWxsb2MoUmVjZWl2ZXIgKnQsIGJvb2wgYWNrX2luX2tlcm5lbCkgPSAwOwogIHZpcnR1YWwg Ym9vbCBmcmVlKFJlY2VpdmVyICp0KSA9IDA7CiAgdmlydHVhbCBSZWNlaXZlciAqb3duZXIoKSBj b25zdCA9IDA7Cgpwcml2YXRlOgogIGlycV90KCk7CiAgaXJxX3QoaXJxX3QmKTsKCiAgY2xhc3Mg SXJxX3AgewogIHB1YmxpYzoKICAgIElycV9wKCBpcnFfdCAqX3AgPSAwICkgOiBwKF9wKSB7fQog ICAgSXJxX3AgJm9wZXJhdG9yID0gKGlycV90ICpfcCkgeyBwID0gX3A7IHJldHVybiAqdGhpczsg fQogICAgb3BlcmF0b3IgaXJxX3QqKCkgeyByZXR1cm4gcDsgfQogIHByaXZhdGU6CiAgICBpcnFf dCAqcDsKICB9OwoKICBzdGF0aWMgaXJxX3QgKmlycXNbXTsKCnB1YmxpYzoKCiAgc3RhdGljIGly cV90ICpsb29rdXAoIHVuc2lnbmVkIGlycSApOwogIHN0YXRpYyB2b2lkIHJlZ2lzdGVyX2lycSgg dW5zaWduZWQgaXJxLCBpcnFfdCAqaSApOwoKcHJvdGVjdGVkOgogIFJlY2VpdmVyICpfaXJxX3Ro cmVhZDsKICBpbnQgX3F1ZXVlZDsKICBib29sIF9hY2tfaW5fa2VybmVsOwoKcHVibGljOgogIHN0 YXRpYyB2b2lkIGluaXQoKTsKCgoKCiAgZXhwbGljaXQgaXJxX3QodW5zaWduZWQgaXJxbnVtKTsK CiAgdmlydHVhbCB2b2lkIGlwY19yZWNlaXZlcl9yZWFkeSgpOwoKCgoKCiAgdm9pZCBtYXliZV9h Y2tub3dsZWRnZSgpOwoKCiAgdm9pZCBtYXliZV9lbmFibGUoKTsKCnByaXZhdGU6CgoKCiAgaW50 IGNvbnN1bWUoKTsKfTsKCmV4dGVybiB1bnNpZ25lZCBwaWNfbWFza19tYXN0ZXI7CmV4dGVybiB1 bnNpZ25lZCBwaWNfbWFza19zbGF2ZTsKCmV4dGVybiAiQyIgdm9pZCBmYXN0X3JldF9mcm9tX2ly cSh2b2lkKTsKCnZvaWQgc2V0X3RpbWVyX3ZlY3Rvcl9ydW4odm9pZCk7Cgp2b2lkIHNldF90aW1l cl92ZWN0b3Jfc3RvcCh2b2lkKTsKCgoKCgoKIyAxICJhdXRvL2F0b21pYy5oIiAxCiMgMTUgImF1 dG8vYXRvbWljLmgiCmV4dGVybiAiQyIgdm9pZCBjYXNfZXJyb3JfdHlwZV93aXRoX2JhZF9zaXpl X3VzZWQodm9pZCk7CgoKCgoKCnRlbXBsYXRlPCB0eXBlbmFtZSBUeXBlID4gYm9vbCB1cF9jYXMo IFR5cGUgKnB0ciwgVHlwZSBvbGR2YWwsIFR5cGUgbmV3dmFsICk7Cgp0ZW1wbGF0ZTwgdHlwZW5h bWUgVHlwZSA+IGJvb2wgc21wX2NhcyggVHlwZSAqcHRyLCBUeXBlIG9sZHZhbCwgVHlwZSBuZXd2 YWwgKTsKCnRlbXBsYXRlPCB0eXBlbmFtZSBUeXBlID4gYm9vbCB1cF9jYXMyKCBUeXBlICpwdHIs IFR5cGUgKm9sZHZhbCwgVHlwZSAqbmV3dmFsICk7Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVHlwZSA+ IGJvb2wgc21wX2NhczIoIFR5cGUgKnB0ciwgVHlwZSAqb2xkdmFsLCBUeXBlICpuZXd2YWwgKTsK CgoKCgoKCmJvb2wgdXBfY2FzX3Vuc2F2ZSggTXdvcmQgKnB0ciwgTXdvcmQgb2xkdmFsLCBNd29y ZCBuZXd2YWwgKTsKCmJvb2wgc21wX2Nhc191bnNhdmUoIE13b3JkICpwdHIsIE13b3JkIG9sZHZh bCwgTXdvcmQgbmV3dmFsICk7Cgpib29sIHVwX2NhczJfdW5zYXZlKCBNd29yZCAqcHRyLCBNd29y ZCAqb2xkdmFsLCBNd29yZCAqbmV3dmFsICk7Cgpib29sIHNtcF9jYXMyX3Vuc2F2ZSggTXdvcmQg KnB0ciwgTXdvcmQgKm9sZHZhbCwgTXdvcmQgKm5ld3ZhbCApOwoKYm9vbCB1cF90YXMoIE13b3Jk ICpsICk7Cgpib29sIHNtcF90YXMoIE13b3JkICpsICk7CiMgNTUgImF1dG8vYXRvbWljLmgiCnRl bXBsYXRlPCB0eXBlbmFtZSBUeXBlID4gaW5saW5lIGJvb2wgdXBfY2FzKCBUeXBlICpwdHIsIFR5 cGUgb2xkdmFsLCBUeXBlIG5ld3ZhbCApCnsKICBpZiggKHNpemVvZihUeXBlKSkgIT0gKHNpemVv ZihNd29yZCkpICkgY2FzX2Vycm9yX3R5cGVfd2l0aF9iYWRfc2l6ZV91c2VkKCk7CiAgcmV0dXJu IHVwX2Nhc191bnNhdmUocmVpbnRlcnByZXRfY2FzdDxNd29yZCo+KHB0ciksCiAgICAgICAgICAg ICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8TXdvcmQqPigmb2xkdmFsKSwKICAgICAgICAg ICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxNd29yZCo+KCZuZXd2YWwpKTsKfQoKCgp0 ZW1wbGF0ZTwgdHlwZW5hbWUgVHlwZSA+IGlubGluZSBib29sIHNtcF9jYXMoIFR5cGUgKnB0ciwg VHlwZSBvbGR2YWwsIFR5cGUgbmV3dmFsICkKewogIGlmKCAoc2l6ZW9mKFR5cGUpKSAhPSAoc2l6 ZW9mKE13b3JkKSkgKSBjYXNfZXJyb3JfdHlwZV93aXRoX2JhZF9zaXplX3VzZWQoKTsKICByZXR1 cm4gc21wX2Nhc191bnNhdmUocmVpbnRlcnByZXRfY2FzdDxNd29yZCo+KHB0ciksCiAgICAgICAg ICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PE13b3JkKj4oJm9sZHZhbCksCiAgICAg ICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PE13b3JkKj4oJm5ld3ZhbCkpOwp9 CgoKCnRlbXBsYXRlPCB0eXBlbmFtZSBUeXBlID4gaW5saW5lIGJvb2wgdXBfY2FzMiggVHlwZSAq cHRyLCBUeXBlICpvbGR2YWwsIFR5cGUgKm5ld3ZhbCApCnsKICBpZiggKHNpemVvZihUeXBlKSkg IT0gKChzaXplb2YoTXdvcmQpKjIpKSApIGNhc19lcnJvcl90eXBlX3dpdGhfYmFkX3NpemVfdXNl ZCgpOwogIHJldHVybiB1cF9jYXMyX3Vuc2F2ZShyZWludGVycHJldF9jYXN0PE13b3JkKj4ocHRy KSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNd29yZCo+KG9sZHZh bCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXdvcmQqPihuZXd2 YWwpKTsKfQoKCgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVHlwZSA+IGlubGluZSBib29sIHNtcF9jYXMy KCBUeXBlICpwdHIsIFR5cGUgKm9sZHZhbCwgVHlwZSAqbmV3dmFsICkKewogIGlmKCAoc2l6ZW9m KFR5cGUpKSAhPSAoKHNpemVvZihNd29yZCkqMikpICkgY2FzX2Vycm9yX3R5cGVfd2l0aF9iYWRf c2l6ZV91c2VkKCk7CiAgcmV0dXJuIHNtcF9jYXMyX3Vuc2F2ZShyZWludGVycHJldF9jYXN0PE13 b3JkKj4ocHRyKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8TXdv cmQqPihvbGR2YWwpLAogICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxN d29yZCo+KG5ld3ZhbCkpOwp9CiMgMTAyICJhdXRvL2F0b21pYy5oIgppbmxpbmUgYm9vbCB1cF9j YXNfdW5zYXZlKCBNd29yZCAqcHRyLCBNd29yZCBvbGR2YWwsIE13b3JkIG5ld3ZhbCApCnsKICBN d29yZCB0bXA7CgogIGFzbSB2b2xhdGlsZQogICAgKCJjbXB4Y2hnbCAlMSwlMiIKICAgICA6ICI9 YSIgKHRtcCkKICAgICA6ICJyIiAobmV3dmFsKSwgIm0iICgqcHRyKSwgIjAiIChvbGR2YWwpCiAg ICAgOiAibWVtb3J5Iik7CgogIHJldHVybiB0bXAgPT0gb2xkdmFsOwp9CgoKCmlubGluZSBib29s IHNtcF9jYXNfdW5zYXZlKCBNd29yZCAqcHRyLCBNd29yZCBvbGR2YWwsIE13b3JkIG5ld3ZhbCAp CnsKICByZXR1cm4gdXBfY2FzX3Vuc2F2ZShwdHIsb2xkdmFsLG5ld3ZhbCk7Cn0KCgoKaW5saW5l IGJvb2wgdXBfY2FzMl91bnNhdmUoIE13b3JkICpwdHIsIE13b3JkICpvbGR2YWwsIE13b3JkICpu ZXd2YWwgKQp7CiAgY2hhciByZXQ7CiAgYXNtIHZvbGF0aWxlCiAgICAoImNtcHhjaGc4YiAlMyA7 IHNldGUgJSVjbCIKICAgICA6ICI9YyIgKHJldCksCiAgICAgICAiPWEiICgqIG9sZHZhbCksCiAg ICAgICAiPWQiICgqKG9sZHZhbCsxKSkKICAgICA6ICJtIiAoKnB0cikgLAogICAgICAgIjEiICgq IG9sZHZhbCksCiAgICAgICAiMiIgKCoob2xkdmFsKzEpKSwKICAgICAgICJiIiAoKiBuZXd2YWwp LAogICAgICAgIjAiICgqKG5ld3ZhbCsxKSkKICAgICA6ICJtZW1vcnkiKTsKCiAgcmV0dXJuIHJl dDsKfQoKCgppbmxpbmUgYm9vbCBzbXBfY2FzMl91bnNhdmUoIE13b3JkICpwdHIsIE13b3JkICpv bGR2YWwsIE13b3JkICpuZXd2YWwgKQp7CiAgcmV0dXJuIHVwX2NhczJfdW5zYXZlKHB0cixvbGR2 YWwsbmV3dmFsKTsKfQoKCgppbmxpbmUgYm9vbCB1cF90YXMoIE13b3JkICpsICkKewogIE13b3Jk IHRtcDsKICBhc20gdm9sYXRpbGUKICAgICgieGNoZyAlMCwlMSIgOiAiPXIiICh0bXApIDogIm0i ICgqbCksICIwIiAoMSkKICAgICA6ICJtZW1vcnkiKTsKCiAgcmV0dXJuIHRtcDsKfQoKCgppbmxp bmUgYm9vbCBzbXBfdGFzKCBNd29yZCAqbCApCnsKICByZXR1cm4gdXBfdGFzKGwpOwp9CiMgOTIg ImF1dG8vaXJxLmgiIDIKCgojIDEgImF1dG8vcGljLmgiIDEKIyAxNCAiYXV0by9waWMuaCIKY2xh c3MgUGljCnsKcHVibGljOgoKCgogIHR5cGVkZWYgdW5zaWduZWQgU3RhdHVzOwoKCgoKICBzdGF0 aWMgdm9pZCBpbml0KCk7CgoKCgogIHN0YXRpYyB2b2lkIGRpc2FibGUoIHVuc2lnbmVkIGlycW51 bSApOwoKCgoKICBzdGF0aWMgdm9pZCBlbmFibGUgKCB1bnNpZ25lZCBpcnFudW0gKTsKCgoKCiAg c3RhdGljIHZvaWQgYWNrbm93bGVkZ2UoIHVuc2lnbmVkIGlycSApOwojIDQ5ICJhdXRvL3BpYy5o IgogIHN0YXRpYyB2b2lkIGRpc2FibGVfbG9ja2VkKCB1bnNpZ25lZCBpcnFudW0gKTsKIyA1OCAi YXV0by9waWMuaCIKICBzdGF0aWMgdm9pZCBlbmFibGVfbG9ja2VkICggdW5zaWduZWQgaXJxbnVt ICk7CgoKCgoKICBzdGF0aWMgU3RhdHVzIGRpc2FibGVfYWxsX3NhdmUoKTsKCgoKCgoKICBzdGF0 aWMgdm9pZCByZXN0b3JlX2FsbCggU3RhdHVzIHMgKTsKIyA4MSAiYXV0by9waWMuaCIKICBzdGF0 aWMgdm9pZCBhY2tub3dsZWRnZV9sb2NrZWQoIHVuc2lnbmVkIGlycSApOwoKcHJpdmF0ZToKCnB1 YmxpYzoKICBlbnVtIHsKICAgIE1BU1RFUl9QSUNfQkFTRSA9IDB4MjAsCiAgICBTTEFWRVNfUElD X0JBU0UgPSAweGEwLAogICAgT0ZGX0lDVyA9IDB4MDAsCiAgICBPRkZfT0NXID0gMHgwMSwKCiAg ICBNQVNURVJfSUNXID0gTUFTVEVSX1BJQ19CQVNFICsgT0ZGX0lDVywKICAgIE1BU1RFUl9PQ1cg PSBNQVNURVJfUElDX0JBU0UgKyBPRkZfT0NXLAogICAgU0xBVkVTX0lDVyA9IFNMQVZFU19QSUNf QkFTRSArIE9GRl9JQ1csCiAgICBTTEFWRVNfT0NXID0gU0xBVkVTX1BJQ19CQVNFICsgT0ZGX09D VywKCgoKCgogICAgSUNXX1RFTVBMQVRFID0gMHgxMCwKCiAgICBMRVZMX1RSSUdHRVIgPSAweDA4 LAogICAgRURHRV9UUklHR0VSID0gMHgwMCwKICAgIEFERFJfSU5UUlZMNCA9IDB4MDQsCiAgICBB RERSX0lOVFJWTDggPSAweDAwLAogICAgU0lOR0xFX19NT0RFID0gMHgwMiwKICAgIENBU0NBREVf TU9ERSA9IDB4MDAsCiAgICBJQ1c0X19ORUVERUQgPSAweDAxLAogICAgTk9fSUNXNF9ORUVEID0g MHgwMCwKCgoKCgogICAgU0xBVkVfT05fSVIwID0gMHgwMSwKICAgIFNMQVZFX09OX0lSMSA9IDB4 MDIsCiAgICBTTEFWRV9PTl9JUjIgPSAweDA0LAogICAgU0xBVkVfT05fSVIzID0gMHgwOCwKICAg IFNMQVZFX09OX0lSNCA9IDB4MTAsCiAgICBTTEFWRV9PTl9JUjUgPSAweDIwLAogICAgU0xBVkVf T05fSVI2ID0gMHg0MCwKICAgIFNMQVZFX09OX0lSNyA9IDB4ODAsCgogICAgSV9BTV9TTEFWRV8w ID0gMHgwMCwKICAgIElfQU1fU0xBVkVfMSA9IDB4MDEsCiAgICBJX0FNX1NMQVZFXzIgPSAweDAy LAogICAgSV9BTV9TTEFWRV8zID0gMHgwMywKICAgIElfQU1fU0xBVkVfNCA9IDB4MDQsCiAgICBJ X0FNX1NMQVZFXzUgPSAweDA1LAogICAgSV9BTV9TTEFWRV82ID0gMHgwNiwKICAgIElfQU1fU0xB VkVfNyA9IDB4MDcsCgoKCgoKICAgIFNORl9NT0RFX0VOQSA9IDB4MTAsCiAgICBTTkZfTU9ERV9E SVMgPSAweDAwLAogICAgQlVGRkVSRF9NT0RFID0gMHgwOCwKICAgIE5PTkJVRkRfTU9ERSA9IDB4 MDAsCiAgICBBVVRPX0VPSV9NT0QgPSAweDAyLAogICAgTlJNTF9FT0lfTU9EID0gMHgwMCwKICAg IEk4MDg2X0VNTV9NT0QgPSAweDAxLAogICAgU0VUX01DU19NT0RFID0gMHgwMCwKCgoKCgogICAg UElDTV9NQVNLID0gMHhGRiwKICAgIFBJQ1NfTUFTSyA9IDB4RkYsCgoKCgoKICAgIE5PTl9TUEVD X0VPSSA9IDB4MjAsCiAgICBTUEVDSUZJQ19FT0kgPSAweDYwLAogICAgUk9UX05PTl9TUEVDID0g MHhhMCwKICAgIFNFVF9ST1RfQUVPSSA9IDB4ODAsCiAgICBSU0VUX1JPVEFFT0kgPSAweDAwLAog ICAgUk9UX1NQRUNfRU9JID0gMHhlMCwKICAgIFNFVF9QUklPUklUWSA9IDB4YzAsCiAgICBOT19P UEVSQVRJT04gPSAweDQwLAoKICAgIFNFTkRfRU9JX0lSMCA9IDB4MDAsCiAgICBTRU5EX0VPSV9J UjEgPSAweDAxLAogICAgU0VORF9FT0lfSVIyID0gMHgwMiwKICAgIFNFTkRfRU9JX0lSMyA9IDB4 MDMsCiAgICBTRU5EX0VPSV9JUjQgPSAweDA0LAogICAgU0VORF9FT0lfSVI1ID0gMHgwNSwKICAg IFNFTkRfRU9JX0lSNiA9IDB4MDYsCiAgICBTRU5EX0VPSV9JUjcgPSAweDA3LAoKCgoKCiAgICBP Q1dfVEVNUExBVEUgPSAweDA4LAogICAgU1BFQ0lBTF9NQVNLID0gMHg0MCwKICAgIE1BU0tfTURF X1NFVCA9IDB4MjAsCiAgICBNQVNLX01ERV9SU1QgPSAweDAwLAogICAgUE9MTF9DT01NQU5EID0g MHgwNCwKICAgIE5PX1BPTExfQ01ORCA9IDB4MDAsCiAgICBSRUFEX05FWFRfUkQgPSAweDAyLAog ICAgUkVBRF9JUl9PTlJEID0gMHgwMCwKICAgIFJFQURfSVNfT05SRCA9IDB4MDEsCgoKCgogICAg UElDTV9JQ1cxID0gKElDV19URU1QTEFURSB8IEVER0VfVFJJR0dFUiB8IEFERFJfSU5UUlZMOAog ICAgICAgICAgICAgICAgICAgICAgIHwgQ0FTQ0FERV9NT0RFIHwgSUNXNF9fTkVFREVEKSwKICAg IFBJQ01fSUNXMyA9IFNMQVZFX09OX0lSMiwKICAgIFBJQ01fSUNXNCA9IChTTkZfTU9ERV9ESVMg fCBOT05CVUZEX01PREUgfCBOUk1MX0VPSV9NT0QKICAgICAgICAgICAgICAgICAgICAgICB8IEk4 MDg2X0VNTV9NT0QpLAoKICAgIFBJQ1NfSUNXMSA9IChJQ1dfVEVNUExBVEUgfCBFREdFX1RSSUdH RVIgfCBBRERSX0lOVFJWTDgKICAgICAgICAgICAgICAgICAgICAgICB8IENBU0NBREVfTU9ERSB8 IElDVzRfX05FRURFRCksCiAgICBQSUNTX0lDVzMgPSBJX0FNX1NMQVZFXzIsCiAgICBQSUNTX0lD VzQgPSAoU05GX01PREVfRElTIHwgTk9OQlVGRF9NT0RFIHwgTlJNTF9FT0lfTU9ECiAgICAgICAg ICAgICAgICAgICAgICAgfCBJODA4Nl9FTU1fTU9EKSwKCiAgfTsKCnByaXZhdGU6CiMgMjE5ICJh dXRvL3BpYy5oIgogIHN0YXRpYyB2b2lkIHBpY19pbml0KHVuc2lnbmVkIGNoYXIgbWFzdGVyX2Jh c2UsIHVuc2lnbmVkIGNoYXIgc2xhdmVfYmFzZSk7Cn07CiMgMjI5ICJhdXRvL3BpYy5oIgojIDEg ImF1dG8vaW8uaCIgMQojIDE2ICJhdXRvL2lvLmgiCmNsYXNzIElvCnsKcHVibGljOgoKCiAgc3Rh dGljIHZvaWQgaW9kZWxheSgpOwoKCgoKICBzdGF0aWMgVW5zaWduZWQ4IGluOCAoIHVuc2lnbmVk IHBvcnQgKTsKCgoKCiAgc3RhdGljIFVuc2lnbmVkMTYgaW4xNiggdW5zaWduZWQgcG9ydCApOwoK CgoKICBzdGF0aWMgVW5zaWduZWQzMiBpbjMyKCB1bnNpZ25lZCBwb3J0ICk7CgoKCgogIHN0YXRp YyB2b2lkIG91dDggKCBVbnNpZ25lZDggdmFsLCB1bnNpZ25lZCBwb3J0ICk7CgoKCgogIHN0YXRp YyB2b2lkIG91dDE2KCBVbnNpZ25lZDE2IHZhbCwgdW5zaWduZWQgcG9ydCApOwoKCgoKICBzdGF0 aWMgdm9pZCBvdXQzMiggVW5zaWduZWQzMiB2YWwsIHVuc2lnbmVkIHBvcnQgKTsKCgoKCgoKCiAg c3RhdGljIFVuc2lnbmVkOCBpbjhfcCAoIHVuc2lnbmVkIHBvcnQgKTsKCgoKCiAgc3RhdGljIFVu c2lnbmVkMTYgaW4xNl9wKCB1bnNpZ25lZCBwb3J0ICk7CgoKCgogIHN0YXRpYyBVbnNpZ25lZDMy IGluMzJfcCggdW5zaWduZWQgcG9ydCApOwoKCgoKICBzdGF0aWMgdm9pZCBvdXQ4X3AgKCBVbnNp Z25lZDggdmFsLCB1bnNpZ25lZCBwb3J0ICk7CgoKCgogIHN0YXRpYyB2b2lkIG91dDE2X3AoIFVu c2lnbmVkMTYgdmFsLCB1bnNpZ25lZCBwb3J0ICk7CgoKCgogIHN0YXRpYyB2b2lkIG91dDMyX3Ao IFVuc2lnbmVkMzIgdmFsLCB1bnNpZ25lZCBwb3J0ICk7CgoKfTsKIyA5NiAiYXV0by9pby5oIgpp bmxpbmUgVW5zaWduZWQ4IElvOjppbjhfcCggdW5zaWduZWQgcG9ydCApCnsKICBVbnNpZ25lZDgg dG1wID0gaW44KHBvcnQpOwogIGlvZGVsYXkoKTsKICByZXR1cm4gdG1wOwp9CgoKCmlubGluZSBV bnNpZ25lZDE2IElvOjppbjE2X3AoIHVuc2lnbmVkIHBvcnQgKQp7CiAgVW5zaWduZWQxNiB0bXAg PSBpbjE2KHBvcnQpOwogIGlvZGVsYXkoKTsKICByZXR1cm4gdG1wOwp9CgoKCmlubGluZSBVbnNp Z25lZDMyIElvOjppbjMyX3AoIHVuc2lnbmVkIHBvcnQgKQp7CiAgVW5zaWduZWQzMiB0bXAgPSBp bjMyKHBvcnQpOwogIGlvZGVsYXkoKTsKICByZXR1cm4gdG1wOwp9CgoKCmlubGluZSB2b2lkIElv OjpvdXQ4X3AoIFVuc2lnbmVkOCB2YWwsIHVuc2lnbmVkIHBvcnQgKQp7CiAgb3V0OCh2YWwscG9y dCk7IGlvZGVsYXkoKTsKfQoKCgppbmxpbmUgdm9pZCBJbzo6b3V0MTZfcCggVW5zaWduZWQxNiB2 YWwsIHVuc2lnbmVkIHBvcnQgKQp7CiAgb3V0MTYodmFsLHBvcnQpOyBpb2RlbGF5KCk7Cn0KCgpp bmxpbmUgdm9pZCBJbzo6b3V0MzJfcCggVW5zaWduZWQzMiB2YWwsIHVuc2lnbmVkIHBvcnQgKQp7 CiAgb3V0MzIodmFsLHBvcnQpOyBpb2RlbGF5KCk7Cn0KCgoKCgppbmxpbmUgdm9pZCBJbzo6aW9k ZWxheSgpCnsKICBhc20oInB1c2hsICVlYXg7IGluYiAkMHg4MCwlYWw7IGluYiAkMHg4MCwlYWw7 IHBvcGwgJWVheCIpOwp9CgoKCmlubGluZSBVbnNpZ25lZDggSW86OmluOCggdW5zaWduZWQgcG9y dCApCnsKICBVbnNpZ25lZDggdG1wOwogIGFzbSB2b2xhdGlsZSAoImluYiAldzEsICViMCI6ICI9 YSIodG1wKSA6ICJOZCIocG9ydCkgKTsKICByZXR1cm4gdG1wOwp9CgoKCmlubGluZSBVbnNpZ25l ZDE2IElvOjppbjE2KCB1bnNpZ25lZCBwb3J0ICkKewogIFVuc2lnbmVkMTYgdG1wOwogIGFzbSB2 b2xhdGlsZSAoImludyAldzEsICV3MCI6ICI9YSIodG1wKSA6ICJOZCIocG9ydCkgKTsKICByZXR1 cm4gdG1wOwp9CgoKCmlubGluZSBVbnNpZ25lZDMyIElvOjppbjMyKCB1bnNpZ25lZCBwb3J0ICkK ewogIFVuc2lnbmVkMzIgdG1wOwogIGFzbSB2b2xhdGlsZSAoImluICV3MSwgJTAiOiAiPWEiKHRt cCkgOiAiTmQiKHBvcnQpICk7CiAgcmV0dXJuIHRtcDsKfQoKCgppbmxpbmUgdm9pZCBJbzo6b3V0 OCggVW5zaWduZWQ4IHZhbCwgdW5zaWduZWQgcG9ydCApCnsKICBhc20gdm9sYXRpbGUgKCJvdXRi ICViMCwgJXcxIjogOiAiYSIodmFsKSwgIk5kIihwb3J0KSApOwp9CgoKCmlubGluZSB2b2lkIElv OjpvdXQxNiggVW5zaWduZWQxNiB2YWwsIHVuc2lnbmVkIHBvcnQgKQp7CiAgYXNtIHZvbGF0aWxl ICgib3V0dyAldzAsICV3MSI6IDogImEiKHZhbCksICJOZCIocG9ydCkgKTsKfQoKCgppbmxpbmUg dm9pZCBJbzo6b3V0MzIoIFVuc2lnbmVkMzIgdmFsLCB1bnNpZ25lZCBwb3J0ICkKewogIGFzbSB2 b2xhdGlsZSAoIm91dCAlMCwgJXcxIjogOiAiYSIodmFsKSwgIk5kIihwb3J0KSApOwp9CiMgMjMw ICJhdXRvL3BpYy5oIiAyCiMgMjQ1ICJhdXRvL3BpYy5oIgppbmxpbmUgdm9pZCBQaWM6OmRpc2Fi bGUoIHVuc2lnbmVkIGlycW51bSApCnsKICBQcm9jOjpTdGF0dXMgcyA9IFByb2M6OmNsaV9zYXZl KCk7CiAgZGlzYWJsZV9sb2NrZWQoIGlycW51bSApOwogIFByb2M6OnN0aV9yZXN0b3JlKHMpOwp9 CgoKCmlubGluZSB2b2lkIFBpYzo6ZW5hYmxlKCB1bnNpZ25lZCBpcnFudW0gKQp7CiAgUHJvYzo6 U3RhdHVzIHMgPSBQcm9jOjpjbGlfc2F2ZSgpOwogIGVuYWJsZV9sb2NrZWQoIGlycW51bSApOwog IFByb2M6OnN0aV9yZXN0b3JlKHMpOwp9CgoKCmlubGluZSB2b2lkIFBpYzo6YWNrbm93bGVkZ2Uo IHVuc2lnbmVkIGlycSApCnsKICBQcm9jOjpTdGF0dXMgcyA9IFByb2M6OmNsaV9zYXZlKCk7CiAg YWNrbm93bGVkZ2VfbG9ja2VkKGlycSk7CiAgUHJvYzo6c3RpX3Jlc3RvcmUocyk7Cn0KCgoKaW5s aW5lIHZvaWQgUGljOjpkaXNhYmxlX2xvY2tlZCggdW5zaWduZWQgaXJxICkKewogIGlmIChpcnEg PCA4KQogICAgSW86Om91dDgoSW86OmluOChNQVNURVJfT0NXKSB8ICgxIDw8IGlycSksIE1BU1RF Ul9PQ1cpOwogIGVsc2UKICAgIElvOjpvdXQ4KElvOjppbjgoU0xBVkVTX09DVykgfCAoMSA8PCAo aXJxLTgpKSwgU0xBVkVTX09DVyk7Cn0KCgoKaW5saW5lIHZvaWQgUGljOjplbmFibGVfbG9ja2Vk KCB1bnNpZ25lZCBpcnEgKQp7CiAgaWYgKGlycSA8IDgpCiAgICBJbzo6b3V0OChJbzo6aW44KE1B U1RFUl9PQ1cpICYgfigxIDw8IGlycSksIE1BU1RFUl9PQ1cpOwogIGVsc2UKICAgIElvOjpvdXQ4 KElvOjppbjgoU0xBVkVTX09DVykgJiB+KDEgPDwgKGlycS04KSksIFNMQVZFU19PQ1cpOwp9CgoK CmlubGluZSB2b2lkIFBpYzo6YWNrbm93bGVkZ2VfbG9ja2VkKCB1bnNpZ25lZCBpcnEgKQp7CiAg aWYgKGlycSA+PSA4KQogICAgewogICAgICBJbzo6b3V0OChOT05fU1BFQ19FT0ksIFNMQVZFU19J Q1cpOwogICAgICBJbzo6b3V0OChPQ1dfVEVNUExBVEUgfCBSRUFEX05FWFRfUkQgfCBSRUFEX0lT X09OUkQsIFNMQVZFU19JQ1cpOwogICAgICBpZiAoSW86OmluOChTTEFWRVNfSUNXKSkKICAgICAg ICByZXR1cm47CiAgICB9CiAgSW86Om91dDgoTk9OX1NQRUNfRU9JLCBNQVNURVJfSUNXKTsKfQoK CgppbmxpbmUgUGljOjpTdGF0dXMgUGljOjpkaXNhYmxlX2FsbF9zYXZlKCkKewogIFN0YXR1cyBz OwogIHMgPSBJbzo6aW44KE1BU1RFUl9PQ1cpOwogIHMgfD0gSW86OmluOChTTEFWRVNfT0NXKSA8 PCA4OwogIElvOjpvdXQ4KCAweGZmLCBNQVNURVJfT0NXICk7CiAgSW86Om91dDgoIDB4ZmYsIFNM QVZFU19PQ1cgKTsKCiAgcmV0dXJuIHM7Cn0KCgoKaW5saW5lIHZvaWQgUGljOjpyZXN0b3JlX2Fs bCggU3RhdHVzIHMgKQp7CiAgSW86Om91dDgoIHMgJiAweDBmZiwgTUFTVEVSX09DVyApOwogIElv OjpvdXQ4KCAocyA+PiA4KSAmIDB4MGZmLCBTTEFWRVNfT0NXICk7Cn0KIyA5NSAiYXV0by9pcnEu aCIgMgojIDEwOCAiYXV0by9pcnEuaCIKaW5saW5lIHZvaWQgaXJxX3Q6Om1heWJlX2Fja25vd2xl ZGdlKCkKewogIGlmIChfYWNrX2luX2tlcm5lbCkKICAgIHsKICAgICAgdW5zaWduZWQgaXJxbnVt ID0gaWQoKS5pcnEoKTsKCiAgICAgIFBpYzo6ZGlzYWJsZV9sb2NrZWQoaXJxbnVtKTsKICAgICAg UGljOjphY2tub3dsZWRnZV9sb2NrZWQoaXJxbnVtKTsKICAgIH0KfQoKCgoKaW5saW5lIHZvaWQg aXJxX3Q6Om1heWJlX2VuYWJsZSgpCnsKICBpZiAoX2Fja19pbl9rZXJuZWwpCiAgICB7CiAgICAg IHVuc2lnbmVkIGlycW51bSA9IGlkKCkuaXJxKCk7CiAgICAgIFBpYzo6ZW5hYmxlKGlycW51bSk7 CiAgICB9Cn0KCgoKaW5saW5lIGlycV90ICppcnFfdDo6bG9va3VwKCB1bnNpZ25lZCBpcnEgKQp7 CiAgaWYoaXJxIDwgQ29uZmlnOjpNQVhfTlVNX0lSUSkKICAgIHJldHVybiBpcnFzW2lycV07CiAg ZWxzZQogICAgcmV0dXJuIDA7Cn0KCgoKaW5saW5lIHZvaWQgaXJxX3Q6OnJlZ2lzdGVyX2lycSgg dW5zaWduZWQgaXJxLCBpcnFfdCAqaSApCnsKICBpZihpcnEgPCBDb25maWc6Ok1BWF9OVU1fSVJR KSB7CiAgICBpcnFzW2lycV0gPSBpOwogIH0KfQojIDEzICJhdXRvL3Byb2ZpbGVfaS5oIiAyCgoj IDEgImF1dG8vZ21vbi5oIiAxCiMgNDggImF1dG8vZ21vbi5oIgpzdHJ1Y3QgcGhkciB7CiAgICBj aGFyICpscGM7CiAgICBjaGFyICpocGM7CiAgICBpbnQgbmNudDsKCiAgICBpbnQgdmVyc2lvbjsK ICAgIGludCBwcm9mcmF0ZTsKICAgIGNoYXIgc3BhcmVbMyo0XTsKCn07CiMgMTAyICJhdXRvL2dt b24uaCIKc3RydWN0IHRvc3RydWN0IHsKICAgIGNoYXIgKnNlbGZwYzsKICAgIGxvbmcgY291bnQ7 CiAgICB1bnNpZ25lZCBzaG9ydCBsaW5rOwp9OwoKCgoKCgpzdHJ1Y3QgcmF3YXJjIHsKICAgIHVu c2lnbmVkIGxvbmcgcmF3X2Zyb21wYzsKICAgIHVuc2lnbmVkIGxvbmcgcmF3X3NlbGZwYzsKICAg IGxvbmcgcmF3X2NvdW50Owp9OwojIDEzMCAiYXV0by9nbW9uLmgiCmV4dGVybiAiQyIgdm9pZCBt b25jb250cm9sKCBpbnQgbW9kZSApOwoKZXh0ZXJuICJDIiB2b2lkIG1vbnN0YXJ0dXAoIGNoYXIg Kmxvd3BjLCBjaGFyICpoaWdocGMsIHVuc2lnbmVkIHByb2ZfcmF0ZSApOwoKZXh0ZXJuICJDIiB2 b2lkIF9tY2xlYW51cCggdm9pZCApOwoKZXh0ZXJuICJDIiB2b2lkIF9fbWNvdW50X2ludGVybmFs KHVuc2lnbmVkIHNob3J0ICpmcm9tcGNpbmRleCwgY2hhciAqc2VsZnBjICk7CiMgMTUgImF1dG8v cHJvZmlsZV9pLmgiIDIKIyAxICJhdXRvL3VuaXN0ZC5oIiAxCiMgMTggImF1dG8vdW5pc3RkLmgi CmV4dGVybiBjaGFyICpwcl9iYXNlOwpleHRlcm4gdm1fb2Zmc2V0X3QgcHJfb2ZmOwpleHRlcm4g dm1fc2l6ZV90IHByX3NpemU7CmV4dGVybiB2bV9zaXplX3QgcHJfc2NhbGU7CgppbnQgY3JlYXQo Y29uc3QgY2hhciogZm5hbWUsIGludCBtb2RlKTsKCnZvaWQgcGVycm9yKGNvbnN0IGNoYXIgKnMp OwoKc3NpemVfdCB3cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpOwoK aW50IGNsb3NlKGludCBmZCk7Cgp2b2lkICogc2JyayhzaXplX3Qgc2l6ZSk7Cgp2b2lkIHNicmtf ZnJlZSh2b2lkKiBidWYsIHNpemVfdCBsZW4pOwoKaW50IHByb2ZpbChjaGFyICpzYW1wbGVzLCB2 bV9zaXplX3Qgc2l6ZSwgdm1fb2Zmc2V0X3Qgb2Zmc2V0LCB2bV9zaXplX3Qgc2NhbGUpOwojIDE2 ICJhdXRvL3Byb2ZpbGVfaS5oIiAyCiMgMSAiLi4vc3JjL2tlcm4vZW50cnkuaCIgMQoKCgoKCiMg MSAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvYmFzZV90cmFwLmgiIDEKIyA0MyAi Li4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvYmFzZV90cmFwLmgiCnN0cnVjdCB0cmFw X3N0YXRlCnsKCiAgICAgICAgdW5zaWduZWQgaW50IGdzOwogICAgICAgIHVuc2lnbmVkIGludCBm czsKICAgICAgICB1bnNpZ25lZCBpbnQgZXM7CiAgICAgICAgdW5zaWduZWQgaW50IGRzOwoKCiAg ICAgICAgdW5zaWduZWQgaW50IGVkaTsKICAgICAgICB1bnNpZ25lZCBpbnQgZXNpOwogICAgICAg IHVuc2lnbmVkIGludCBlYnA7CiAgICAgICAgdW5zaWduZWQgaW50IGNyMjsKICAgICAgICB1bnNp Z25lZCBpbnQgZWJ4OwogICAgICAgIHVuc2lnbmVkIGludCBlZHg7CiAgICAgICAgdW5zaWduZWQg aW50IGVjeDsKICAgICAgICB1bnNpZ25lZCBpbnQgZWF4OwoKCiAgICAgICAgdW5zaWduZWQgaW50 IHRyYXBubzsKCgogICAgICAgIHVuc2lnbmVkIGludCBlcnI7CgoKICAgICAgICB1bnNpZ25lZCBp bnQgZWlwOwogICAgICAgIHVuc2lnbmVkIGludCBjczsKICAgICAgICB1bnNpZ25lZCBpbnQgZWZs YWdzOwogICAgICAgIHVuc2lnbmVkIGludCBlc3A7CiAgICAgICAgdW5zaWduZWQgaW50IHNzOwoK CiAgICAgICAgdW5zaWduZWQgaW50IHY4Nl9lczsKICAgICAgICB1bnNpZ25lZCBpbnQgdjg2X2Rz OwogICAgICAgIHVuc2lnbmVkIGludCB2ODZfZnM7CiAgICAgICAgdW5zaWduZWQgaW50IHY4Nl9n czsKfTsKIyA5MCAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvYmFzZV90cmFwLmgi CmV4dGVybiAiQyIgewoKCgoKCgpleHRlcm4gdm9pZCBiYXNlX3RyYXBfaW5pdCh2b2lkKTsKCgoK CgoKCmV4dGVybiBzdHJ1Y3QgZ2F0ZV9pbml0X2VudHJ5IGJhc2VfdHJhcF9pbml0dGFiW107CiMg MTE3ICIuLi9zcmMvbGliL2tlcm4vaW5jbHVkZS9mbHV4L3g4Ni9iYXNlX3RyYXAuaCIKZXh0ZXJu IGludCAoKmJhc2VfdHJhcF9oYW5kbGVyKShzdHJ1Y3QgdHJhcF9zdGF0ZSAqc3RhdGUpOwojIDEy OCAiLi4vc3JjL2xpYi9rZXJuL2luY2x1ZGUvZmx1eC94ODYvYmFzZV90cmFwLmgiCnZvaWQgdHJh cF9kdW1wKGNvbnN0IHN0cnVjdCB0cmFwX3N0YXRlICpzdCk7CiMgMTM3ICIuLi9zcmMvbGliL2tl cm4vaW5jbHVkZS9mbHV4L3g4Ni9iYXNlX3RyYXAuaCIKdm9pZCB0cmFwX2R1bXBfcGFuaWMoY29u c3Qgc3RydWN0IHRyYXBfc3RhdGUgKnN0KTsKfQojIDcgIi4uL3NyYy9rZXJuL2VudHJ5LmgiIDIK CmV4dGVybiAiQyIgdm9pZCBwcm9maWxlX2ludGVycnVwdF9lbnRyeSgpOwoKZXh0ZXJuIGdhdGVf aW5pdF9lbnRyeSBpZHRfaW5pdF90YWJsZVtdOwoKY29uc3QgdW5zaWduZWQgaWR0X21heCA9IDB4 NDA7CiMgMTcgImF1dG8vcHJvZmlsZV9pLmgiIDIKIyAxICJhdXRvL3RocmVhZC5oIiAxCgoKCgoK IyAxICIuLi9zcmMvbGliL21pbmlsaWJjL2lhMzIvaW5jbHVkZS9zZXRqbXAuaCIgMQoKCgoKCgoK dHlwZWRlZiBpbnQgX19qbXBfYnVmWzZdOwojIDIxICIuLi9zcmMvbGliL21pbmlsaWJjL2lhMzIv aW5jbHVkZS9zZXRqbXAuaCIKdHlwZWRlZiBzdHJ1Y3QgX19qbXBfYnVmX3RhZwp7CgoKCiAgX19q bXBfYnVmIF9fam1wYnVmOwp9IGptcF9idWZbMV07CgpleHRlcm4gIkMiIHsKCnZvaWQgbG9uZ2pt cCAoam1wX2J1ZiBfX2VudiwgaW50IF9fdmFsKQogICAgIF9fYXR0cmlidXRlX18gKChfX25vcmV0 dXJuX18pKTsKCmludCBzZXRqbXAoam1wX2J1ZiBlbnYpOwoKfQojIDcgImF1dG8vdGhyZWFkLmgi IDIKCgoKCiMgMSAiYXV0by90aHJlYWRpZC5oIiAxCiMgMTMgImF1dG8vdGhyZWFkaWQuaCIKY2xh c3MgVGhyZWFkOwoKY2xhc3MgdGhyZWFkaWRfdAp7CgogIFRocmVhZCAqdDsKCnB1YmxpYzoKCiAg dGhyZWFkaWRfdChMNF91aWQgY29uc3QgKnB1YmxpY19pZCk7CgogIHRocmVhZGlkX3QoTDRfdWlk IHB1YmxpY19pZCk7CgogIHRocmVhZGlkX3QoVGhyZWFkKiB0aHJlYWQpOwoKICBUaHJlYWQgKiBs b29rdXAoKSBjb25zdDsKCiAgYm9vbCBpc19uaWwoKSBjb25zdDsKCiAgYm9vbCBpc192YWxpZCgp IGNvbnN0Owp9OwoKCgoKCgoKIyAxICJhdXRvL3RocmVhZF91dGlsLmgiIDEKIyAxMyAiYXV0by90 aHJlYWRfdXRpbC5oIgpjbGFzcyBUaHJlYWQ7CgpUaHJlYWQqIGxvb2t1cF90aHJlYWQoTDRfdWlk IGlkKTsKClRocmVhZCogbG9va3VwX2ZpcnN0X3RocmVhZCh1bnNpZ25lZCBzcGFjZSk7CiMgMzQg ImF1dG8vdGhyZWFkX3V0aWwuaCIKaW5saW5lIFRocmVhZCoKbG9va3VwX3RocmVhZChMNF91aWQg aWQpCnsKICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUaHJlYWQgKj4KICAgIChpZC5pc19pbnZh bGlkKCkKICAgICA/IDAKICAgICA6IGttZW06Om1lbV90Y2JzIHwgKChpZC5ndGhyZWFkKCkKICAg ICAgICAgICAgICAgICAgICAgICAgICAqIENvbmZpZzo6dGhyZWFkX2Jsb2NrX3NpemUpCiAgICAg ICAgICAgICAgICAgICAgICAgICAmIH5Db25maWc6OnRocmVhZF9ibG9ja19tYXNrKSk7Cn0KCgoK aW5saW5lIFRocmVhZCoKbG9va3VwX2ZpcnN0X3RocmVhZCh1bnNpZ25lZCBzcGFjZSkKewogIHJl dHVybiBsb29rdXBfdGhyZWFkKCBMNF91aWQoIHNwYWNlLCAwICkgKTsKfQojIDQyICJhdXRvL3Ro cmVhZGlkLmgiIDIKIyA1MSAiYXV0by90aHJlYWRpZC5oIgppbmxpbmUgdGhyZWFkaWRfdDo6dGhy ZWFkaWRfdChMNF91aWQgY29uc3QgKnB1YmxpY19pZCkKICA6IHQgKGxvb2t1cF90aHJlYWQgKCpw dWJsaWNfaWQpKQp7IH0KCgoKaW5saW5lIHRocmVhZGlkX3Q6OnRocmVhZGlkX3QoTDRfdWlkIHB1 YmxpY19pZCkKICA6IHQgKGxvb2t1cF90aHJlYWQgKHB1YmxpY19pZCkpCnsgfQoKCgppbmxpbmUg dGhyZWFkaWRfdDo6dGhyZWFkaWRfdChUaHJlYWQqIHRocmVhZCkKICA6IHQodGhyZWFkKQp7IH0K CgoKaW5saW5lIFRocmVhZCAqIHRocmVhZGlkX3Q6Omxvb2t1cCgpIGNvbnN0CnsgcmV0dXJuIHQ7 IH0KCgoKaW5saW5lIGJvb2wKdGhyZWFkaWRfdDo6aXNfbmlsKCkgY29uc3QKeyByZXR1cm4gcmVp bnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nPih0KSA9PSBrbWVtOjptZW1fdGNiczsgfQoKCgpp bmxpbmUgYm9vbAp0aHJlYWRpZF90Ojppc192YWxpZCgpIGNvbnN0CnsgcmV0dXJuIHQ7IH0KIyAx MiAiYXV0by90aHJlYWQuaCIgMgojIDEgImF1dG8vc3BhY2UuaCIgMQoKCgoKCgojIDEgImF1dG8v c3BhY2VfaW5kZXguaCIgMQojIDExICJhdXRvL3NwYWNlX2luZGV4LmgiCmNsYXNzIFNwYWNlOwpj bGFzcyBTcGFjZV9yZWdpc3RyeTsKCmNsYXNzIFNwYWNlX2luZGV4CnsKcHVibGljOgogIGVudW0g eyBtYXhfc3BhY2VfbnVtYmVyID0gMSA8PCAxMSB9OwoKcHJpdmF0ZToKCiAgc3RhdGljIFNwYWNl X3JlZ2lzdHJ5KiBzcGFjZXM7CgoKICB1bnNpZ25lZCBzcGFjZV9pZDsKCnB1YmxpYzoKICBleHBs aWNpdCBTcGFjZV9pbmRleCh1bnNpZ25lZCBudW1iZXIpOwoKCiAgb3BlcmF0b3IgdW5zaWduZWQg KCk7CgogIFNwYWNlICogbG9va3VwKCk7CgogIGJvb2wgc2V0X2NoaWVmKFNwYWNlX2luZGV4IG9s ZF9jaGllZiwgU3BhY2VfaW5kZXggbmV3X2NoaWVmKTsKCiAgU3BhY2VfaW5kZXggY2hpZWYoKTsK CiAgc3RhdGljIGJvb2wgYWRkKFNwYWNlICpuZXdfc3BhY2UsIHVuc2lnbmVkIG5ld19udW1iZXIp OwoKICBzdGF0aWMgYm9vbCBkZWwoU3BhY2VfaW5kZXggbnVtYmVyLCBTcGFjZV9pbmRleCBjaGll Zik7Cn07CiMgNjEgImF1dG8vc3BhY2VfaW5kZXguaCIKaW5saW5lIFNwYWNlX2luZGV4OjpTcGFj ZV9pbmRleCh1bnNpZ25lZCBudW1iZXIpCgogIDogc3BhY2VfaWQobnVtYmVyKQp7IH0KCgoKaW5s aW5lIFNwYWNlX2luZGV4OjpvcGVyYXRvciB1bnNpZ25lZCAoKQp7IHJldHVybiBzcGFjZV9pZDsg fQoKCgoKc3RydWN0IFNwYWNlX3JlZ2lzdHJ5CnsKICB1bmlvbiB7CiAgICBTcGFjZSAqc3BhY2U7 CiAgICBzdHJ1Y3QgewogICAgICB1bnNpZ25lZCBkZWFkIDogMTsKICAgICAgdW5zaWduZWQgY2hp ZWYgOiAzMTsKICAgIH0gc3RhdGU7CiAgfTsKCgpwdWJsaWM6CgogIFNwYWNlX3JlZ2lzdHJ5KCk7 Cn07CgoKCmlubGluZSBTcGFjZSAqClNwYWNlX2luZGV4Ojpsb29rdXAoKQp7CiAgaWYgKHNwYWNl c1tzcGFjZV9pZF0uc3RhdGUuZGVhZCkKICAgIHJldHVybiAwOwoKICByZXR1cm4gc3BhY2VzW3Nw YWNlX2lkXS5zcGFjZTsKfQoKCgoKaW5saW5lIFNwYWNlX3JlZ2lzdHJ5OjpTcGFjZV9yZWdpc3Ry eSgpCnsKICBzdGF0ZS5jaGllZiA9IDA7CiAgc3RhdGUuZGVhZCA9IDE7Cn0KCgoKaW5saW5lIGJv b2wKU3BhY2VfaW5kZXg6OnNldF9jaGllZihTcGFjZV9pbmRleCBvbGRfY2hpZWYsIFNwYWNlX2lu ZGV4IG5ld19jaGllZikKewogIFNwYWNlX3JlZ2lzdHJ5IG8oc3BhY2VzW3NwYWNlX2lkXSk7Cgog IGlmICghIG8uc3RhdGUuZGVhZCB8fCBvLnN0YXRlLmNoaWVmICE9IG9sZF9jaGllZikKICAgIHJl dHVybiBmYWxzZTsKCiAgU3BhY2VfcmVnaXN0cnkgbjsKICBuLnN0YXRlLmNoaWVmID0gbmV3X2No aWVmOwoKICByZXR1cm4gc21wX2Nhcygmc3BhY2VzW3NwYWNlX2lkXSwgbywgbik7Cn0KCgoKaW5s aW5lIFNwYWNlX2luZGV4ClNwYWNlX2luZGV4OjpjaGllZigpCnsKICAoKHZvaWQpICgoc3BhY2Vz W3NwYWNlX2lkXS5zdGF0ZS5kZWFkKSA/IDAgOiAoX19hc3NlcnRfZmFpbCAoInNwYWNlc1tzcGFj ZV9pZF0uc3RhdGUuZGVhZCIsICJhdXRvL3NwYWNlX2luZGV4LmgiLCAxMzEsICgoY29uc3QgY2hh ciAqKSAwKSksIDApKSk7CgogIHJldHVybiBTcGFjZV9pbmRleChzcGFjZXNbc3BhY2VfaWRdLnN0 YXRlLmNoaWVmKTsKfQoKCgppbmxpbmUgYm9vbApTcGFjZV9pbmRleDo6YWRkKFNwYWNlICpuZXdf c3BhY2UsIHVuc2lnbmVkIG5ld19udW1iZXIpCnsKICBTcGFjZV9yZWdpc3RyeSBvKHNwYWNlc1tu ZXdfbnVtYmVyXSk7CiAgKCh2b2lkKSAoKG8uc3RhdGUuZGVhZCkgPyAwIDogKF9fYXNzZXJ0X2Zh aWwgKCJvLnN0YXRlLmRlYWQiLCAiYXV0by9zcGFjZV9pbmRleC5oIiwgMTQyLCAoKGNvbnN0IGNo YXIgKikgMCkpLCAwKSkpOwoKICBTcGFjZV9yZWdpc3RyeSBuOwogIG4uc3BhY2UgPSBuZXdfc3Bh Y2U7CgogIHJldHVybiBzbXBfY2FzKCZzcGFjZXNbbmV3X251bWJlcl0sIG8sIG4pOwp9CgoKCmlu bGluZSBib29sClNwYWNlX2luZGV4OjpkZWwoU3BhY2VfaW5kZXggbnVtYmVyLCBTcGFjZV9pbmRl eCBjaGllZikKewogICgodm9pZCkgKChudW1iZXIgPCBtYXhfc3BhY2VfbnVtYmVyKSA/IDAgOiAo X19hc3NlcnRfZmFpbCAoIm51bWJlciA8IG1heF9zcGFjZV9udW1iZXIiLCAiYXV0by9zcGFjZV9p bmRleC5oIiwgMTU1LCAoKGNvbnN0IGNoYXIgKikgMCkpLCAwKSkpOwogICgodm9pZCkgKCghIHNw YWNlc1tudW1iZXJdLnN0YXRlLmRlYWQpID8gMCA6IChfX2Fzc2VydF9mYWlsICgiISBzcGFjZXNb bnVtYmVyXS5zdGF0ZS5kZWFkIiwgImF1dG8vc3BhY2VfaW5kZXguaCIsIDE1NiwgKChjb25zdCBj aGFyICopIDApKSwgMCkpKTsKCgogIHNwYWNlc1tudW1iZXJdLnN0YXRlLmRlYWQgPSAxOwogIHNw YWNlc1tudW1iZXJdLnN0YXRlLmNoaWVmID0gY2hpZWY7CgogIHJldHVybiB0cnVlOwp9CiMgOCAi YXV0by9zcGFjZS5oIiAyCiMgMSAiYXV0by9zcGFjZV9jb250ZXh0LmgiIDEKIyAyMCAiYXV0by9z cGFjZV9jb250ZXh0LmgiCmNsYXNzIFNwYWNlX2NvbnRleHQKewpwcm90ZWN0ZWQ6CgogIHBkX2Vu dHJ5X3QgX2RpclsxMDI0XTsKCnB1YmxpYzoKICBTcGFjZV9jb250ZXh0KCk7CgogIHN0YXRpYyBT cGFjZV9jb250ZXh0ICogY3VycmVudCgpOwoKICB2b2lkIG1ha2VfY3VycmVudCgpOwoKICB2bV9v ZmZzZXRfdCBsb29rdXAodm1fb2Zmc2V0X3QgYSkgY29uc3Q7CgogIGNvbnN0IHBkX2VudHJ5X3Qq IGRpcigpIGNvbnN0OwoKICB2b2lkIHN3aXRjaGluX2NvbnRleHQoKTsKfTsKIyA0NyAiYXV0by9z cGFjZV9jb250ZXh0LmgiCiMgMSAiYXV0by9nbG9iYWxzLmgiIDEKIyAxNyAiYXV0by9nbG9iYWxz LmgiCmNsYXNzIENvbnRleHQ7CmNsYXNzIFRocmVhZDsKY2xhc3MgU3BhY2U7CgoKZXh0ZXJuIFRo cmVhZCAqc2lnbWEwX3RocmVhZCwgKmtlcm5lbF90aHJlYWQsICpuaWxfdGhyZWFkOwpleHRlcm4g U3BhY2UgKnNpZ21hMDsKZXh0ZXJuIGJvb2wgcnVubmluZzsKIyA0NCAiYXV0by9nbG9iYWxzLmgi CkNvbnRleHQgKmNvbnRleHRfb2YoY29uc3Qgdm9pZCAqcHRyKTsKCkNvbnRleHQgKmN1cnJlbnQo KTsKIyA2NiAiYXV0by9nbG9iYWxzLmgiCmlubGluZSBDb250ZXh0ICpjb250ZXh0X29mKGNvbnN0 IHZvaWQgKnB0cikKewogIHJldHVybiByZWludGVycHJldF9jYXN0PENvbnRleHQgKj4KICAgIChy ZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGxvbmc+KHB0cikgJiB+KENvbmZpZzo6dGhyZWFkX2Js b2NrX3NpemUgLSAxKSk7Cn0KCgoKaW5saW5lIENvbnRleHQgKmN1cnJlbnQoKQp7CiAgdm9pZCog ZXNwOwogIF9fYXNtX18gX192b2xhdGlsZV9fCiAgICAoIm1vdmwgJSVlc3AsICUwIiA6ICI9cSIg KGVzcCkpOwoKICByZXR1cm4gY29udGV4dF9vZiAoZXNwKTsKfQojIDQ4ICJhdXRvL3NwYWNlX2Nv bnRleHQuaCIgMgojIDU2ICJhdXRvL3NwYWNlX2NvbnRleHQuaCIKaW5saW5lIFNwYWNlX2NvbnRl eHQgKiBTcGFjZV9jb250ZXh0OjpjdXJyZW50KCkKewogIEFkZHJlc3Mgc2M7CiAgYXNtICgiIG1v diAlJWNyMywgJTAiIDogIj1yIihzYykgKTsKICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTcGFj ZV9jb250ZXh0Kj4oa21lbTo6cGh5c190b192aXJ0KHNjKSk7Cn0KCgoKaW5saW5lIHZvaWQgU3Bh Y2VfY29udGV4dDo6bWFrZV9jdXJyZW50KCkKewogIGFzbSB2b2xhdGlsZSAoIiBtb3YgJTAsICUl Y3IzIiA6IDogInIiKGttZW06OnZpcnRfdG9fcGh5cyh0aGlzKSkgKTsKfQoKCgppbmxpbmUgdm1f b2Zmc2V0X3QKU3BhY2VfY29udGV4dDo6bG9va3VwKHZtX29mZnNldF90IGEpIGNvbnN0CnsKIyA4 NCAiYXV0by9zcGFjZV9jb250ZXh0LmgiCiAgcGRfZW50cnlfdCBwID0gX2RpclsoYSA+PiAyMikg JiAweDNmZl07CiAgaWYgKCEgKHAgJiAweDAwMDAwMDAxKSkgcmV0dXJuIDB4ZmZmZmZmZmY7CiAg aWYgKHAgJiAweDAwMDAwMDgwKSByZXR1cm4gKHAgJiBDb25maWc6OlNVUEVSUEFHRV9NQVNLKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChhICYgfkNvbmZpZzo6U1VQRVJQQUdF X01BU0spOwogIHB0X2VudHJ5X3QgdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8cHRfZW50cnlfdCAqPgog ICAgKChwICYgQ29uZmlnOjpQQUdFX01BU0spICsga21lbTo6bWVtX3BoeXMpWyhhID4+IDEyKSAm IDB4M2ZmXTsKCiAgcmV0dXJuICh0ICYgMHgwMDAwMDAwMSkgPyAodCAmIENvbmZpZzo6UEFHRV9N QVNLKSB8IChhICYgfkNvbmZpZzo6UEFHRV9NQVNLKQogICAgOiAweGZmZmZmZmZmOwp9CgoKCmlu bGluZSBjb25zdCBwZF9lbnRyeV90KgpTcGFjZV9jb250ZXh0OjpkaXIoKSBjb25zdAp7CiAgcmV0 dXJuIF9kaXI7Cn0KCgoKaW5saW5lIHZvaWQKU3BhY2VfY29udGV4dDo6c3dpdGNoaW5fY29udGV4 dCgpCnsKCiAgYm9vbCBuZWVkX2ZsdXNoX3RsYiA9IGZhbHNlOwoKICB1bnNpZ25lZCBpbmRleCA9 IChrbWVtOjppcGNfd2luZG93KDApID4+IDIyKSAmIDB4M2ZmOwoKICBpZiAoX2RpcltpbmRleF0g fHwgX2RpciBbaW5kZXggKyAxXSkKICAgIHsKICAgICAgX2RpcltpbmRleF0gPSAwOwogICAgICBf ZGlyW2luZGV4ICsgMV0gPSAwOwogICAgICBuZWVkX2ZsdXNoX3RsYiA9IHRydWU7CiAgICB9Cgog IGluZGV4ID0gKGttZW06OmlwY193aW5kb3coMSkgPj4gMjIpICYgMHgzZmY7CgogIGlmIChfZGly W2luZGV4XSB8fCBfZGlyIFtpbmRleCArIDFdKQogICAgewogICAgICBfZGlyW2luZGV4XSA9IDA7 CiAgICAgIF9kaXJbaW5kZXggKyAxXSA9IDA7CiAgICAgIG5lZWRfZmx1c2hfdGxiID0gdHJ1ZTsK ICAgIH0KCiAgaWYgKG5lZWRfZmx1c2hfdGxiCiAgICAgIHx8IFNwYWNlX2NvbnRleHQ6OmN1cnJl bnQoKSAhPSB0aGlzKQogICAgewogICAgICBtYWtlX2N1cnJlbnQoKTsKICAgIH0KfQojIDkgImF1 dG8vc3BhY2UuaCIgMgojIDIyICJhdXRvL3NwYWNlLmgiCmNsYXNzIFNwYWNlIDogcHVibGljIFNw YWNlX2NvbnRleHQKewpwdWJsaWM6CgogIGVudW0gc3RhdHVzX3QgewogICAgSW5zZXJ0X29rID0g MCwKICAgIEluc2VydF93YXJuX2V4aXN0cywKICAgIEluc2VydF93YXJuX2F0dHJpYl91cGdyYWRl LAogICAgSW5zZXJ0X2Vycl9ub21lbSwKICAgIEluc2VydF9lcnJfZXhpc3RzCiAgfTsKCgogIGVu dW0gcGFnZV9hdHRyaWJfdCB7CiAgICBQYWdlX25vX2F0dHJpYnMgPSAwLAogICAgUGFnZV93cml0 YWJsZSA9IDB4MDAwMDAwMDIsCiAgICBQYWdlX25vbmNhY2hlYWJsZSA9IDB4MDAwMDAwMTAgfCAw eDAwMDAwMDA4LAoKICAgIFBhZ2VfdXNlcl9hY2Nlc3NpYmxlID0gMHgwMDAwMDAwNCwKCgogICAg UGFnZV9hbGxfYXR0cmlicyA9IFBhZ2Vfd3JpdGFibGUgfCBQYWdlX25vbmNhY2hlYWJsZSB8IFBh Z2VfdXNlcl9hY2Nlc3NpYmxlCiAgfTsKCnByaXZhdGU6CiAgU3BhY2UoKTsKICBTcGFjZShjb25z dCBTcGFjZSYpOwoKCiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbnVtYmVyX2luZGV4CiAg ICA9IChyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGxvbmc+KCZfdW51c2VkMV8xKSA+PiAyMikg JiAweDNmZjsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBjaGllZl9pbmRleAogICAgPSAo cmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBsb25nPigmX3VudXNlZDJfMSkgPj4gMjIpICYgMHgz ZmY7CgogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGlvX2NvdW50ZXJfcGRfaW5kZXgKICAg ID0gKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4oJl91bnVzZWQ0X2lvXzEpID4+IDIy KSAmIDB4M2ZmOwogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGlvX2NvdW50ZXJfcHRfaW5k ZXgKICAgID0gKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgbG9uZz4oJl91bnVzZWQ0X2lvXzEp ID4+IDEyKSAmIDB4M2ZmOwoKcHVibGljOgoKCgoKICBTcGFjZV9pbmRleCBzcGFjZSgpIGNvbnN0 OwoKCgoKICBTcGFjZV9pbmRleCBjaGllZigpIGNvbnN0OwojIDgzICJhdXRvL3NwYWNlLmgiCiAg Ym9vbCB1cGRhdGUodm1fb2Zmc2V0X3QgYWRkciwgY29uc3QgU3BhY2VfY29udGV4dCAqZnJvbSwg dm1fb2Zmc2V0X3QgZnJvbV9hZGRyKTsKCgogIHZvaWQgKiBvcGVyYXRvciBuZXcoc2l6ZV90KTsK CiAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqYmxvY2spOwojIDEwMSAiYXV0by9zcGFjZS5o IgogIHZtX29mZnNldF90IHZpcnRfdG9fcGh5cyh2bV9vZmZzZXRfdCBhKSBjb25zdDsKIyAxMTEg ImF1dG8vc3BhY2UuaCIKICB1bnNpZ25lZCBnZXRfaW9fY291bnRlcih2b2lkKTsKCgoKCgogIGJv b2wgaXNfcHJpdmlsZWdlZCh2b2lkKTsKCgoKCgogIHZvaWQgYWRkdG9faW9fY291bnRlcihpbnQg aW5jcik7CgoKCgoKCiAgYm9vbCBpb19sb29rdXAodm1fb2Zmc2V0X3QgcG9ydF9udW1iZXIpOwoK CgoKCgoKICBTcGFjZTo6c3RhdHVzX3QgaW9faW5zZXJ0KHZtX29mZnNldF90IHBvcnRfbnVtYmVy KTsKCgoKCiAgdm9pZCBpb19kZWxldGUodm1fb2Zmc2V0X3QgcG9ydF9udW1iZXIpOwoKCgoKICB+ U3BhY2UoKTsKIyAxNTcgImF1dG8vc3BhY2UuaCIKICB2b2lkIGttZW1fdXBkYXRlKHZtX29mZnNl dF90IGFkZHIpOwojIDE3NyAiYXV0by9zcGFjZS5oIgogIFNwYWNlOjpzdGF0dXNfdCB2X2luc2Vy dCh2bV9vZmZzZXRfdCBwaHlzLCB2bV9vZmZzZXRfdCB2aXJ0LCB2bV9vZmZzZXRfdCBzaXplLCB1 bnNpZ25lZCBwYWdlX2F0dHJpYnMpOwojIDE5NCAiYXV0by9zcGFjZS5oIgogIGJvb2wgdl9sb29r dXAodm1fb2Zmc2V0X3QgdmlydCwgdm1fb2Zmc2V0X3QgKnBoeXMgPSAwLCB2bV9vZmZzZXRfdCAq c2l6ZSA9IDAsIHVuc2lnbmVkICpwYWdlX2F0dHJpYnMgPSAwKTsKIyAyMDUgImF1dG8vc3BhY2Uu aCIKICBib29sIHZfZGVsZXRlKHZtX29mZnNldF90IHZpcnQsIHZtX29mZnNldF90IHNpemUsIHVu c2lnbmVkIHBhZ2VfYXR0cmlicyA9IDApOwoKCgoKCgogIHZvaWQgcGFnZV9tYXAodm1fb2Zmc2V0 X3QsIHZtX29mZnNldF90LCB2bV9vZmZzZXRfdCwgdW5zaWduZWQpOwoKICB2b2lkIHBhZ2VfcHJv dGVjdCh2bV9vZmZzZXRfdCwgdm1fb2Zmc2V0X3QsIHVuc2lnbmVkKTsKCiAgdm9pZCBwYWdlX3Vu bWFwKHZtX29mZnNldF90LCB2bV9vZmZzZXRfdCk7Cgpwcm90ZWN0ZWQ6CiMgMjI5ICJhdXRvL3Nw YWNlLmgiCiAgU3BhY2UodW5zaWduZWQgbmV3X251bWJlcik7Cgpwcml2YXRlOgoKCgogIHZtX29m ZnNldF90IGdldF92aXJ0X3BvcnRfYWRkcih2bV9vZmZzZXRfdCBjb25zdCBwb3J0KSBjb25zdDsK CiAgdm1fb2Zmc2V0X3QgZ2V0X3BoeXNfcG9ydF9hZGRyKHZtX29mZnNldF90IGNvbnN0IHBvcnQp IGNvbnN0Owp9OwoKClNwYWNlICogY3VycmVudF9zcGFjZSgpOwoKVW5zaWduZWQ4IGdldF9wb3J0 X2JpdCh2bV9vZmZzZXRfdCBjb25zdCBwb3J0KTsKIyAyNjIgImF1dG8vc3BhY2UuaCIKaW5saW5l IFNwYWNlX2luZGV4ClNwYWNlOjpzcGFjZSgpIGNvbnN0CnsKICByZXR1cm4gU3BhY2VfaW5kZXgo X2RpcltudW1iZXJfaW5kZXhdID4+IDgpOwp9CgoKCgoKaW5saW5lIFNwYWNlX2luZGV4ClNwYWNl OjpjaGllZigpIGNvbnN0CnsKICByZXR1cm4gU3BhY2VfaW5kZXgoX2RpcltjaGllZl9pbmRleF0g Pj4gOCk7Cn0KIyAyODkgImF1dG8vc3BhY2UuaCIKaW5saW5lIGJvb2wKU3BhY2U6OnVwZGF0ZSh2 bV9vZmZzZXRfdCBhZGRyLCBjb25zdCBTcGFjZV9jb250ZXh0ICpmcm9tLAogICAgICAgICAgICAg ICAgdm1fb2Zmc2V0X3QgZnJvbV9hZGRyKQp7CiAgaWYgKGZyb20tPmxvb2t1cChmcm9tX2FkZHIp ID09IDB4ZmZmZmZmZmYpCiAgICByZXR1cm4gZmFsc2U7CgogIF9kaXJbKGFkZHIgPj4gMjIpICYg MHgzZmZdCiAgICA9IGZyb20tPmRpcigpWyhmcm9tX2FkZHIgPj4gMjIpICYgMHgzZmZdOwogIHJl dHVybiB0cnVlOwp9CiMgMzE0ICJhdXRvL3NwYWNlLmgiCmlubGluZSB2bV9vZmZzZXRfdApTcGFj ZTo6dmlydF90b19waHlzKHZtX29mZnNldF90IGEpIGNvbnN0CnsKICBpZiAodGhpcyA9PSBzaWdt YTApCiAgICByZXR1cm4gYTsKCiAgcmV0dXJuIFNwYWNlX2NvbnRleHQ6Omxvb2t1cChhKTsKfQoj IDMzMCAiYXV0by9zcGFjZS5oIgppbmxpbmUgYm9vbCBTcGFjZTo6aXNfcHJpdmlsZWdlZCh2b2lk KQp7CiAgcmV0dXJuICEgQ29uZmlnOjplbmFibGVfaW9fcHJvdGVjdGlvbgogICAgICAgICB8fCAo Z2V0X2lvX2NvdW50ZXIoKSA9PSBMNF9mcGFnZTo6SU9fUE9SVF9NQVgpOwp9CiMgMzQ0ICJhdXRv L3NwYWNlLmgiCmlubGluZSB2b2lkClNwYWNlOjprbWVtX3VwZGF0ZSh2bV9vZmZzZXRfdCBhZGRy KQp7CiAgdW5zaWduZWQgaSA9IChhZGRyID4+IDIyKSAmIDB4M2ZmOwogIF9kaXJbaV0gPSBrbWVt OjpkaXIoKVtpXTsKfQojIDM1OCAiYXV0by9zcGFjZS5oIgppbmxpbmUgdm9pZApTcGFjZTo6cGFn ZV9tYXAodm1fb2Zmc2V0X3QsIHZtX29mZnNldF90LCB2bV9vZmZzZXRfdCwgdW5zaWduZWQpCnt9 CgoKCmlubGluZSB2b2lkClNwYWNlOjpwYWdlX3Byb3RlY3Qodm1fb2Zmc2V0X3QsIHZtX29mZnNl dF90LCB1bnNpZ25lZCkKe30KCgoKaW5saW5lIHZvaWQKU3BhY2U6OnBhZ2VfdW5tYXAodm1fb2Zm c2V0X3QsIHZtX29mZnNldF90KQp7fQoKCgoKaW5saW5lIFNwYWNlICoKY3VycmVudF9zcGFjZSgp CnsKICByZXR1cm4gc3RhdGljX2Nhc3Q8U3BhY2UqPihTcGFjZV9jb250ZXh0OjpjdXJyZW50KCkp Owp9CgoKCmlubGluZSBVbnNpZ25lZDggZ2V0X3BvcnRfYml0KHZtX29mZnNldF90IGNvbnN0IHBv cnQpCnsKICByZXR1cm4gMSA8PCAocG9ydCAmIDcpOwp9CiMgMTMgImF1dG8vdGhyZWFkLmgiIDIK CiMgMSAiYXV0by9yZWNlaXZlci5oIiAxCgoKCgoKIyAxICJhdXRvL2NvbnRleHQuaCIgMQoKCgoK CiMgMSAiLi4vc3JjL2xpYi9taW5pbGliYy9pbmNsdWRlL2NzdGRpbyIgMQoKCgoKCiMgMSAiLi4v c3JjL2xpYi9taW5pbGliYy9pbmNsdWRlL3N0ZGlvLmgiIDEKCgoKCiMgMSAiL2hvbWUvYWRhbS9l cndpbi90bXAvZ2NjLzMuMy9pbnN0L2xpYi9nY2MtbGliL2k2ODYtcGMtbGludXgtZ251LzMuMy9p bmNsdWRlL3N0ZGRlZi5oIiAxIDMgNAojIDYgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9z dGRpby5oIiAyCiMgMSAiLi4vc3JjL2xpYi9taW5pbGliYy9pbmNsdWRlL21pbmlfZGVmcy5oIiAx CiMgNyAiLi4vc3JjL2xpYi9taW5pbGliYy9pbmNsdWRlL3N0ZGlvLmgiIDIKCmV4dGVybiAiQyIg ewoKaW50IHB1dGNoYXIoaW50IGMpOwppbnQgcHV0cyhjb25zdCBjaGFyICpzKTsKaW50IHB1dHN0 cihjb25zdCBjaGFyICpjb25zdCBzKTsKaW50IHB1dG5zdHIoIGNvbnN0IGNoYXIgKmNvbnN0IGMs IGludCBsZW4gKTsKaW50IHByaW50Zihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1 dGVfXygoZm9ybWF0KHByaW50ZiwxLDIpKSk7CmludCBzcHJpbnRmKGNoYXIgKnN0ciwgY29uc3Qg Y2hhciAqZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMiwzKSkpOwpp bnQgc25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm9ybWF0LCAu Li4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMyw0KSkpOwppbnQgYXNwcmludGYoY2hh ciAqKnB0ciwgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChw cmludGYsMiwzKSkpOwoKCgoKCgojIDEgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9zdGRh cmcuaCIgMQojIDkgIi4uL3NyYy9saWIvbWluaWxpYmMvaW5jbHVkZS9zdGRhcmcuaCIKdHlwZWRl ZiBfX2J1aWx0aW5fdmFfbGlzdCB2YV9saXN0OwojIDI1ICIuLi9zcmMvbGliL21pbmlsaWJjL2lu Y2x1ZGUvc3RkaW8uaCIgMgoKaW50IHZwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0 IGFwKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDEsMCkpKTsKaW50IHZzcHJpbnRmKGNo YXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKSBfX2F0dHJpYnV0ZV9fKChm b3JtYXQocHJpbnRmLDIsMCkpKTsKaW50IHZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXpl LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApIF9fYXR0cmlidXRlX18oKGZvcm1hdChw cmludGYsMywwKSkpOwoKCnR5cGVkZWYgaW50IEZJTEU7CgppbnQgZ2V0Y2hhcih2b2lkKTsKY2hh ciAqZ2V0cyhjaGFyICpzKSBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSk7CmNoYXIgKmZnZXRz KGNoYXIgKnMsIGludCBzaXplLCBGSUxFICpzdHJlYW0pOwoKaW50IHZzY2FuZihjb25zdCBjaGFy ICpmb3JtYXQsIHZhX2xpc3QgYXApIF9fYXR0cmlidXRlX18oKGZvcm1hdChzY2FuZiwxLDApKSk7 CmludCB2c3NjYW5mKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0 IGFwKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQoc2NhbmYsMiwwKSkpOwoKaW50IHNzY2FuZihjb25z dCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKCn0KIyA3ICIuLi9zcmMvbGli L21pbmlsaWJjL2luY2x1ZGUvY3N0ZGlvIiAyCgoKbmFtZXNwYWNlIHN0ZCB7CiAgdXNpbmcgOjpw dXRjaGFyOwogIHVzaW5nIDo6cHV0czsKICB1c2luZyA6OnB1dHN0cjsKICB1c2luZyA6OnB1dG5z dHI7CiAgdXNpbmcgOjpwcmludGY7CiAgdXNpbmcgOjpzcHJpbnRmOwogIHVzaW5nIDo6c25wcmlu dGY7CiAgdXNpbmcgOjphc3ByaW50ZjsKICB1c2luZyA6OnNzY2FuZjsKCiAgdXNpbmcgOjp2cHJp bnRmOwogIHVzaW5nIDo6dnNwcmludGY7CiAgdXNpbmcgOjp2c25wcmludGY7CiAgdXNpbmcgOjpn ZXRjaGFyOwogIHVzaW5nIDo6Z2V0czsKICB1c2luZyA6OmZnZXRzOwogIHVzaW5nIDo6dnNjYW5m OwogIHVzaW5nIDo6dnNzY2FuZjsKCn07CiMgNyAiYXV0by9jb250ZXh0LmgiIDIKCgoKIyAxICJh dXRvL3NjaGVkLmgiIDEKIyAxNCAiYXV0by9zY2hlZC5oIgpjbGFzcyBzY2hlZF90CnsKICB1bnNp Z25lZCBzaG9ydCBfcHJpbzsKICB1bnNpZ25lZCBzaG9ydCBfbWNwOwogIHVuc2lnbmVkIHNob3J0 IF90aW1lc2xpY2UsIF90aWNrc19sZWZ0OwogIHVuc2lnbmVkIGxvbmcgX3RvdGFsX3RpY2tzOwog IHVuc2lnbmVkIGxvbmcgX3N0YXJ0X2NwdXRpbWU7CiAgdW5zaWduZWQgbG9uZyBsb25nIF90b3Rh bF9jcHV0aW1lOwoKcHVibGljOgogIHVuc2lnbmVkIHNob3J0IHByaW8oKSBjb25zdDsKCiAgdm9p ZCBzZXRfcHJpbyh1bnNpZ25lZCBzaG9ydCBwcmlvKTsKCiAgdW5zaWduZWQgc2hvcnQgbWNwKCkg Y29uc3Q7CgogIHZvaWQgc2V0X21jcCh1bnNpZ25lZCBzaG9ydCBtY3ApOwoKICB1bnNpZ25lZCBz aG9ydCB0aW1lc2xpY2UoKSBjb25zdDsKCiAgdm9pZCBzZXRfdGltZXNsaWNlKHVuc2lnbmVkIHNo b3J0IHRpbWVzbGljZSk7CgogIHVuc2lnbmVkIHNob3J0IHRpY2tzX2xlZnQoKSBjb25zdDsKCiAg dm9pZCBzZXRfdGlja3NfbGVmdCh1bnNpZ25lZCBzaG9ydCB0aWNrc19sZWZ0KTsKCiAgdm9pZCBy ZXNldF9jcHV0aW1lKHZvaWQpOwoKICB2b2lkIHVwZGF0ZV9jcHV0aW1lKHZvaWQpOwoKICB1bnNp Z25lZCBsb25nIGxvbmcgZ2V0X3RvdGFsX2NwdXRpbWUoKTsKCiAgdm9pZCBzdGFydF90aHJlYWQo dW5zaWduZWQgbG9uZyB0c2NfMzIpOwoKICB2b2lkIHN0b3BfdGhyZWFkKHVuc2lnbmVkIGxvbmcg dHNjXzMyKTsKfTsKIyA1OCAiYXV0by9zY2hlZC5oIgppbmxpbmUgdW5zaWduZWQgc2hvcnQKc2No ZWRfdDo6cHJpbygpIGNvbnN0CnsKICByZXR1cm4gX3ByaW87Cn0KCgoKaW5saW5lIHZvaWQKc2No ZWRfdDo6c2V0X3ByaW8odW5zaWduZWQgc2hvcnQgcHJpbykKewogIF9wcmlvID0gcHJpbzsKfQoK CgppbmxpbmUgdW5zaWduZWQgc2hvcnQKc2NoZWRfdDo6bWNwKCkgY29uc3QKewogIHJldHVybiBf bWNwOwp9CgoKCmlubGluZSB2b2lkCnNjaGVkX3Q6OnNldF9tY3AodW5zaWduZWQgc2hvcnQgbWNw KQp7CiAgX21jcCA9IG1jcDsKfQoKCgppbmxpbmUgdW5zaWduZWQgc2hvcnQKc2NoZWRfdDo6dGlt ZXNsaWNlKCkgY29uc3QKewogIHJldHVybiBfdGltZXNsaWNlOwp9CgoKCmlubGluZSB2b2lkCnNj aGVkX3Q6OnNldF90aW1lc2xpY2UodW5zaWduZWQgc2hvcnQgdGltZXNsaWNlKQp7CiAgX3RpbWVz bGljZSA9IHRpbWVzbGljZTsKfQoKCgppbmxpbmUgdW5zaWduZWQgc2hvcnQKc2NoZWRfdDo6dGlj a3NfbGVmdCgpIGNvbnN0CnsKICByZXR1cm4gX3RpY2tzX2xlZnQ7Cn0KCgoKaW5saW5lIHZvaWQK c2NoZWRfdDo6c2V0X3RpY2tzX2xlZnQodW5zaWduZWQgc2hvcnQgdGlja3NfbGVmdCkKewogIF90 aWNrc19sZWZ0ID0gdGlja3NfbGVmdDsKfQoKCgppbmxpbmUgdm9pZApzY2hlZF90OjpyZXNldF9j cHV0aW1lKHZvaWQpCnsKICBpZiAoQ29uZmlnOjpmaW5lX2dyYWluZWRfY3B1dGltZSkKICAgIF90 b3RhbF9jcHV0aW1lID0gMDsKICBlbHNlCiAgICBfdG90YWxfdGlja3MgPSAwOwp9CgoKCmlubGlu ZSB2b2lkCnNjaGVkX3Q6OnVwZGF0ZV9jcHV0aW1lKHZvaWQpCnsKICBfdG90YWxfdGlja3MrKzsK fQoKCgppbmxpbmUgdm9pZApzY2hlZF90OjpzdGFydF90aHJlYWQodW5zaWduZWQgbG9uZyB0c2Nf MzIpCnsKICBfc3RhcnRfY3B1dGltZSA9IHRzY18zMjsKfQoKCgppbmxpbmUgdm9pZApzY2hlZF90 OjpzdG9wX3RocmVhZCh1bnNpZ25lZCBsb25nIHRzY18zMikKewogIF90b3RhbF9jcHV0aW1lICs9 IHRzY18zMiAtIF9zdGFydF9jcHV0aW1lOwp9CiMgMTEgImF1dG8vY29udGV4dC5oIiAyCgojIDEg ImF1dG8vZnB1LmgiIDEKIyAxMSAiYXV0by9mcHUuaCIKY2xhc3Mgc2xhYl9jYWNoZV9hbm9uOwpj bGFzcyBDb250ZXh0OwoKCgoKCgpjbGFzcyBGcHVfc3RhdGUKewpwdWJsaWM6CiAgdm9pZCBhbGxv Y19zdGF0ZSgpOwogIHZvaWQgZnJlZV9zdGF0ZSgpOwogIHZvaWQgc2F2ZV9zdGF0ZSgpOwogIHZv aWQgcmVzdG9yZV9zdGF0ZSgpOwogIHZvaWQgKnN0YXRlX2J1ZmZlcigpOwoKICBGcHVfc3RhdGUo KTsKICB+RnB1X3N0YXRlKCk7Cgpwcml2YXRlOgoKICB2b2lkICpfc3RhdGVfYnVmZmVyOwoKcHJp dmF0ZToKICBzdGF0aWMgc2xhYl9jYWNoZV9hbm9uICpzbGFiX2FsbG9jKCk7Cn07CgpjbGFzcyBG cHUKewpwdWJsaWM6CgogIHN0YXRpYyBDb250ZXh0ICpvd25lcigpOwogIHN0YXRpYyB2b2lkIHNl dF9vd25lcihDb250ZXh0ICpvd25lcik7CiAgc3RhdGljIGJvb2wgaXNfb3duZXIoQ29udGV4dCAq b3duZXIpOwoKCiAgc3RhdGljIHZvaWQgaW5pdCgpOwogIHN0YXRpYyB1bnNpZ25lZCBjb25zdCBz dGF0ZV9zaXplKCk7CiAgc3RhdGljIHVuc2lnbmVkIGNvbnN0IHN0YXRlX2FsaWduKCk7CiAgc3Rh dGljIHZvaWQgaW5pdF9zdGF0ZSggRnB1X3N0YXRlICopOwogIHN0YXRpYyB2b2lkIHJlc3RvcmVf c3RhdGUoIEZwdV9zdGF0ZSAqICk7CiAgc3RhdGljIHZvaWQgc2F2ZV9zdGF0ZSggRnB1X3N0YXRl ICogKTsKICBzdGF0aWMgdm9pZCBzeW5jaHJvbml6ZSgpOwogIHN0YXRpYyB2b2lkIGRpc2FibGUo KTsKICBzdGF0aWMgdm9pZCBlbmFibGUoKTsKCnByaXZhdGU6CgogIHN0YXRpYyBDb250ZXh0ICpf b3duZXI7CnByaXZhdGU6Cgpwcml2YXRlOgogIHN0cnVjdCBmcHVfcmVncwogIHsKICAgIGxvbmcg Y3dkOwogICAgbG9uZyBzd2Q7CiAgICBsb25nIHR3ZDsKICAgIGxvbmcgZmlwOwogICAgbG9uZyBm Y3M7CiAgICBsb25nIGZvbzsKICAgIGxvbmcgZm9zOwogICAgbG9uZyBzdF9zcGFjZVsyMF07CiAg fTsKCiAgc3RydWN0IHNzZV9yZWdzCiAgewogICAgdW5zaWduZWQgc2hvcnQgY3dkOwogICAgdW5z aWduZWQgc2hvcnQgc3dkOwogICAgdW5zaWduZWQgc2hvcnQgdHdkOwogICAgdW5zaWduZWQgc2hv cnQgZm9wOwogICAgbG9uZyBmaXA7CiAgICBsb25nIGZjczsKICAgIGxvbmcgZm9vOwogICAgbG9u ZyBmb3M7CiAgICBsb25nIG14Y3NyOwogICAgbG9uZyByZXNlcnZlZDsKICAgIGxvbmcgc3Rfc3Bh Y2VbMzJdOwogICAgbG9uZyB4bW1fc3BhY2VbMzJdOwogICAgbG9uZyBwYWRkaW5nWzU2XTsKICB9 Owp9OwojIDEwMyAiYXV0by9mcHUuaCIKIyAxICJhdXRvL2ttZW1fc2xhYl9zaW1wbGUuaCIgMQoK CgoKCiMgMSAiL2hvbWUvYWRhbS9lcndpbi90bXAvZ2NjLzMuMy9pbnN0L2xpYi9nY2MtbGliL2k2 ODYtcGMtbGludXgtZ251LzMuMy9pbmNsdWRlL3N0ZGRlZi5oIiAxIDMgNAojIDcgImF1dG8va21l bV9zbGFiX3NpbXBsZS5oIiAyCiMgMSAiYXV0by9oZWxwaW5nX2xvY2suaCIgMQoKCgoKCgojIDEg ImF1dG8vc3dpdGNoX2xvY2suaCIgMQoKCgoKCiMgMSAiYXV0by9zdGFjay5oIiAxCiMgMTEgImF1 dG8vc3RhY2suaCIKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgU3RhY2s7Cgp0ZW1wbGF0ZTx0 eXBlbmFtZSBUPgpjbGFzcyBTdGFja190b3AKewpwcml2YXRlOgogIGZyaWVuZCBjbGFzcyBTdGFj azxUPjsKCgoKICBpbnQgX3ZlcnNpb247CiAgVCAqX25leHQ7CgpwdWJsaWM6CiMgMzcgImF1dG8v c3RhY2suaCIKICBTdGFja190b3AoaW50IHZlcnNpb24sIFQgKm5leHQpOwoKICBTdGFja190b3Ao KTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIFN0YWNrCnsKcHJpdmF0ZToKICBTdGFj a190b3A8VD4gX2hlYWQ7CgpwdWJsaWM6CgoKCiAgU3RhY2soKTsKCiAgaW50IGluc2VydChUICpl KTsKCiAgVCogZGVxdWV1ZSgpOwoKCgogIFQqIGRlcXVldWUoVCAqdG9wKTsKCiAgVCogZmlyc3Qo KTsKCiAgdm9pZCByZXNldCgpOwp9OwojIDkyICJhdXRvL3N0YWNrLmgiCnRlbXBsYXRlPHR5cGVu YW1lIFQ+IGlubGluZSBTdGFja190b3A8VD46OlN0YWNrX3RvcChpbnQgdmVyc2lvbiwgVCAqbmV4 dCkKICA6IF92ZXJzaW9uICh2ZXJzaW9uKSwKICAgIF9uZXh0IChuZXh0KQp7fQoKCgp0ZW1wbGF0 ZTx0eXBlbmFtZSBUPiBpbmxpbmUgU3RhY2tfdG9wPFQ+OjpTdGFja190b3AoKQogIDogX3ZlcnNp b24gKDApLAogICAgX25leHQgKDApCnt9CiMgMTE0ICJhdXRvL3N0YWNrLmgiCnRlbXBsYXRlPHR5 cGVuYW1lIFQ+IFN0YWNrPFQ+OjpTdGFjaygpCiAgOiBfaGVhZCAoMCwgMCkKe30KCgoKdGVtcGxh dGU8dHlwZW5hbWUgVD4gaW50ClN0YWNrPFQ+OjppbnNlcnQoVCAqZSkKewogIFN0YWNrX3RvcDxU PiBvbGRfaGVhZCwKICAgICAgICAgICAgICAgICAgbmV3X2hlYWQ7CgogIGRvIHsKICAgICAgb2xk X2hlYWQgPSBfaGVhZDsKICAgICAgZS0+c2V0X25leHQob2xkX2hlYWQuX25leHQpOwogICAgICBu ZXdfaGVhZC5fdmVyc2lvbiA9IG9sZF9oZWFkLl92ZXJzaW9uKzE7CiAgICAgIG5ld19oZWFkLl9u ZXh0ID0gZTsKICB9IHdoaWxlICghIHNtcF9jYXMyKCZfaGVhZCwKICAgICAgICAgICAgICAgICAg ICAgICAmb2xkX2hlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgJm5ld19oZWFkKSk7CiAgcmV0 dXJuIG5ld19oZWFkLl92ZXJzaW9uOwp9CgoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQqClN0YWNr PFQ+OjpkZXF1ZXVlKCkKewogIFN0YWNrX3RvcDxUPiBvbGRfaGVhZCwKICAgICAgICAgICAgICAg ICBuZXdfaGVhZDsKCiAgVCAqZmlyc3Q7CgogIGRvIHsKICAgIG9sZF9oZWFkID0gX2hlYWQ7Cgog ICAgZmlyc3QgPSBvbGRfaGVhZC5fbmV4dDsKICAgIGlmKCEgZmlyc3QpCiAgICAgIGJyZWFrOwoK ICAgIG5ld19oZWFkLl9uZXh0ID0gZmlyc3QtPmdldF9uZXh0KCk7CiAgICBuZXdfaGVhZC5fdmVy c2lvbiA9IG9sZF9oZWFkLl92ZXJzaW9uICsgMTsKICB9IHdoaWxlICghIHNtcF9jYXMyKCZfaGVh ZCwKICAgICAgICAgICAgICAgICAgICAgICAmb2xkX2hlYWQsCiAgICAgICAgICAgICAgICAgICAg ICAgJm5ld19oZWFkKSk7CgoKCgoKICByZXR1cm4gZmlyc3Q7Cn0KCgoKCgp0ZW1wbGF0ZTx0eXBl bmFtZSBUPiBUKgpTdGFjazxUPjo6ZGVxdWV1ZShUICp0b3ApCnsKICBTdGFja190b3A8VD4gb2xk X2hlYWQsCiAgICAgICAgICAgICAgICAgbmV3X2hlYWQ7CgoKICBvbGRfaGVhZC5fdmVyc2lvbiA9 IF9oZWFkLl92ZXJzaW9uOwogIG9sZF9oZWFkLl9uZXh0ID0gdG9wOwogIGlmICghb2xkX2hlYWQu X25leHQpCiAgICByZXR1cm4gMDsKCiAgbmV3X2hlYWQuX3ZlcnNpb24gPSBvbGRfaGVhZC5fdmVy c2lvbiArIDE7CiAgbmV3X2hlYWQuX25leHQgPSB0b3AtPmdldF9uZXh0KCk7CgogIGlmKCEgc21w X2NhczIoJl9oZWFkLAogICAgICAgICAgICAgICAgJm9sZF9oZWFkLAogICAgICAgICAgICAgICAg Jm5ld19oZWFkKSkKCiAgICByZXR1cm4gMDsKICBlbHNlCgogICAgcmV0dXJuIHRvcDsKfQoKCgp0 ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUKgpTdGFjazxUPjo6Zmlyc3QoKQp7CiAgcmV0dXJuIF9oZWFk Ll9uZXh0Owp9CgoKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQKU3RhY2s8VD46OnJlc2V0KCkK ewogIF9oZWFkLl92ZXJzaW9uID0gMDsKICBfaGVhZC5fbmV4dCA9IDA7Cn0KIyA3ICJhdXRvL3N3 aXRjaF9sb2NrLmgiIDIKCgoKCgoKY2xhc3MgQ29udGV4dDsKCgoKY2xhc3MgU3dpdGNoX2xvY2sK ewogIENvbnRleHQgKl9sb2NrX293bmVyOwogIFN0YWNrPENvbnRleHQ+IF9sb2NrX3N0YWNrOwoK cHVibGljOgoKCgoKCiAgU3dpdGNoX2xvY2soKTsKCgoKCiAgQ29udGV4dCAqIGxvY2tfb3duZXIo KSBjb25zdDsKCgoKCiAgYm9vbCB0ZXN0KCkgY29uc3Q7CgoKCgoKICB2b2lkIGxvY2soKTsKCgoK CiAgYm9vbCB0ZXN0X2FuZF9zZXQoKTsKCgoKCgogIHZvaWQgY2xlYXIoKTsKCnByaXZhdGU6CgoK CgoKICBib29sIHRyeV9sb2NrKCk7Cn07CiMgODUgImF1dG8vc3dpdGNoX2xvY2suaCIKaW5saW5l IFN3aXRjaF9sb2NrOjpTd2l0Y2hfbG9jaygpCiAgOiBfbG9ja19vd25lcigwKQp7Cn0KCgoKCgoK aW5saW5lIENvbnRleHQgKgpTd2l0Y2hfbG9jazo6bG9ja19vd25lcigpIGNvbnN0CnsKICByZXR1 cm4gX2xvY2tfb3duZXI7Cn0KCgoKCgoKaW5saW5lIGJvb2wKU3dpdGNoX2xvY2s6OnRlc3QoKSBj b25zdAp7CiAgcmV0dXJuIF9sb2NrX293bmVyOwp9CiMgOCAiYXV0by9oZWxwaW5nX2xvY2suaCIg MgojIDE5ICJhdXRvL2hlbHBpbmdfbG9jay5oIgpjbGFzcyBIZWxwaW5nX2xvY2sKewogIFN3aXRj aF9sb2NrIF9zd2l0Y2hfbG9jazsKCnB1YmxpYzoKICBzdGF0aWMgYm9vbCB0aHJlYWRpbmdfc3lz dGVtX2FjdGl2ZTsKCnB1YmxpYzoKCgoKICBib29sIHRlc3RfYW5kX3NldCgpOwoKCgoKCiAgdm9p ZCBsb2NrKCk7CgoKCgogIGJvb2wgdGVzdCgpOwoKCgoKCiAgdm9pZCBjbGVhcigpOwoKCgoKICBD b250ZXh0KiBsb2NrX293bmVyKCk7Cn07Cgp0eXBlZGVmIExvY2tfZ3VhcmQ8SGVscGluZ19sb2Nr PiBIZWxwaW5nX2xvY2tfZ3VhcmQ7CiMgNjcgImF1dG8vaGVscGluZ19sb2NrLmgiCmlubGluZSBi b29sCkhlbHBpbmdfbG9jazo6dGVzdCgpCnsKICByZXR1cm4gX3N3aXRjaF9sb2NrLnRlc3QoKTsK fQoKCgoKCgppbmxpbmUgQ29udGV4dCoKSGVscGluZ19sb2NrOjpsb2NrX293bmVyKCkKewogIHJl dHVybiBfc3dpdGNoX2xvY2subG9ja19vd25lcigpOwp9CiMgOCAiYXV0by9rbWVtX3NsYWJfc2lt cGxlLmgiIDIKCiMgMSAiYXV0by9zbGFiX2NhY2hlX2Fub24uaCIgMQojIDE0ICJhdXRvL3NsYWJf Y2FjaGVfYW5vbi5oIgpjbGFzcyBzbGFiX2NhY2hlX2Fub24Kewpwcm90ZWN0ZWQ6CiAgZnJpZW5k IGNsYXNzIHNsYWI7CgoKCgogIHZpcnR1YWwgdm9pZCAqYmxvY2tfYWxsb2ModW5zaWduZWQgbG9u ZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWdubWVudCkgPSAwOwogIHZpcnR1YWwgdm9pZCBibG9j a19mcmVlKHZvaWQgKmJsb2NrLCB1bnNpZ25lZCBsb25nIHNpemUpID0gMDsKCnByaXZhdGU6CiAg c2xhYl9jYWNoZV9hbm9uKCk7CiAgc2xhYl9jYWNoZV9hbm9uKGNvbnN0IHNsYWJfY2FjaGVfYW5v biYpOwojIDM3ICJhdXRvL3NsYWJfY2FjaGVfYW5vbi5oIgogIHNsYWIgKl9maXJzdF9zbGFiLCAq X2ZpcnN0X2F2YWlsYWJsZV9zbGFiLCAqX2xhc3Rfc2xhYjsKICB1bnNpZ25lZCBsb25nIF9zbGFi X3NpemU7CiAgdW5zaWduZWQgX2VsZW1fc2l6ZSwgX2xhdGVzdF9vZmZzZXQsIF9hbGlnbm1lbnQ7 CgpwdWJsaWM6CgoKCiAgc2xhYl9jYWNoZV9hbm9uKHVuc2lnbmVkIGxvbmcgc2xhYl9zaXplLCB1 bnNpZ25lZCBlbGVtX3NpemUsIHVuc2lnbmVkIGFsaWdubWVudCk7CgogIHZpcnR1YWwgfnNsYWJf Y2FjaGVfYW5vbigpOwoKICB2aXJ0dWFsIHZvaWQgKiBhbGxvYygpOwoKICB2aXJ0dWFsIHZvaWQg ZnJlZSh2b2lkICpjYWNoZV9lbnRyeSk7CgogIHZpcnR1YWwgYm9vbCByZWFwKCk7Cgpwcm90ZWN0 ZWQ6CiAgdm9pZCBkZXN0cm95KCk7CgoKICB2aXJ0dWFsIHZvaWQgZWxlbV9jdG9yKHZvaWQgKik7 CgogIHZpcnR1YWwgdm9pZCBlbGVtX2R0b3Iodm9pZCAqKTsKfTsKIyAxMCAiYXV0by9rbWVtX3Ns YWJfc2ltcGxlLmgiIDIKCgoKCgoKY2xhc3Mga21lbV9zbGFiX3NpbXBsZV90IDogcHVibGljIHNs YWJfY2FjaGVfYW5vbgp7CgogIEhlbHBpbmdfbG9jayBfbG9jazsKCnB1YmxpYzoKCiAga21lbV9z bGFiX3NpbXBsZV90KHVuc2lnbmVkIGVsZW1fc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KTsKCiAg fmttZW1fc2xhYl9zaW1wbGVfdCgpOwoKCiAgdm9pZCAqIGFsbG9jKCk7CgogIHZvaWQgZnJlZSh2 b2lkICpjYWNoZV9lbnRyeSk7CgogIGJvb2wgcmVhcCgpOwoKCiAgdm9pZCAqIG9wZXJhdG9yIG5l dyhzaXplX3Qgc2l6ZSk7CgogIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKmJsb2NrLCBzaXpl X3Qgc2l6ZSk7Cgpwcm90ZWN0ZWQ6CgoKICBrbWVtX3NsYWJfc2ltcGxlX3QodW5zaWduZWQgbG9u ZyBzbGFiX3NpemUsIHVuc2lnbmVkIGVsZW1fc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KTsKCnBy aXZhdGU6CgoKICB2aXJ0dWFsIHZvaWQgKiBibG9ja19hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUs IHVuc2lnbmVkIGxvbmcpOwoKICB2aXJ0dWFsIHZvaWQgYmxvY2tfZnJlZSh2b2lkICpibG9jaywg dW5zaWduZWQgbG9uZyk7Cn07CiMgMTA0ICJhdXRvL2ZwdS5oIiAyCgoKIyAxICIuLi9zcmMvbGli L21pbmlsaWJjL2luY2x1ZGUvY3N0cmluZyIgMQoKCgoKCiMgMSAiLi4vc3JjL2xpYi9taW5pbGli Yy9pbmNsdWRlL3N0cmluZy5oIiAxCgoKCgojIDEgIi9ob21lL2FkYW0vZXJ3aW4vdG1wL2djYy8z LjMvaW5zdC9saWIvZ2NjLWxpYi9pNjg2LXBjLWxpbnV4LWdudS8zLjMvaW5jbHVkZS9zdGRkZWYu aCIgMSAzIDQKIyA2ICIuLi9zcmMvbGliL21pbmlsaWJjL2luY2x1ZGUvc3RyaW5nLmgiIDIKCmV4 dGVybiAiQyIgewoKY2hhciAqc3RyY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7CmNo YXIgKnN0cm5jcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgbik7Cgp2b2lk ICptZW1jY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgaW50IGMsIHNpemVfdCBuKTsK dm9pZCAqbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pOwp2b2lk ICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IG4pOwoKaW50IG1l bWNjbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBpbnQgYywgc2l6ZV90IG4pOwpp bnQgbWVtY21wKGNvbnN0IHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOwppbnQg c3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CmludCBzdHJuY21wKGNvbnN0 IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOwoKaW50IHN0cmNhc2VjbXAoY29u c3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKaW50IHN0cm5jYXNlY21wKGNvbnN0IGNoYXIg KnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOwoKc2l6ZV90IHN0cmxlbihjb25zdCBjaGFy ICpzKTsKCmNoYXIgKnN0cnN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVl ZGxlKTsKCmNoYXIgKnN0cmR1cChjb25zdCBjaGFyICpzKTsKCmNoYXIgKnN0cmNocihjb25zdCBj aGFyICpzLCBpbnQgYyk7CmNoYXIgKnN0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpOwoKY2hh ciAqc3RyY2F0KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYyk7CmNoYXIgKnN0cm5jYXQoY2hh ciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgbik7CgpzaXplX3Qgc3Ryc3BuKGNvbnN0 IGNoYXIgKnMsIGNvbnN0IGNoYXIgKl9hY2NlcHQpOwpzaXplX3Qgc3RyY3Nwbihjb25zdCBjaGFy ICpzLCBjb25zdCBjaGFyICpyZWplY3QpOwoKY2hhciAqc3RycGJyayhjb25zdCBjaGFyICpzLCBj b25zdCBjaGFyICpfYWNjZXB0KTsKY2hhciAqc3Ryc2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBj aGFyICpkZWxpbSk7Cgp2b2lkKiBtZW1zZXQodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsKdm9p ZCogbWVtY2hyKGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CgppbnQgc3RyY29sbChj b25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOwoKCn0KIyA3ICIuLi9zcmMvbGliL21pbmls aWJjL2luY2x1ZGUvY3N0cmluZyIgMgoKCm5hbWVzcGFjZSBzdGQgewoKCgoKCgogIHVzaW5nIDo6 bWVtY3B5OwogIHVzaW5nIDo6bWVtY2NweTsKICB1c2luZyA6Om1lbW1vdmU7CiAgdXNpbmcgOjpt ZW1jY21wOwogIHVzaW5nIDo6bWVtY21wOwogIHVzaW5nIDo6bWVtc2V0OwogIHVzaW5nIDo6bWVt Y2hyOwoKCiAgdXNpbmcgOjpzdHJjcHk7CiAgdXNpbmcgOjpzdHJuY3B5OwogIHVzaW5nIDo6c3Ry Y2F0OwogIHVzaW5nIDo6c3RybmNhdDsKICB1c2luZyA6OnN0cmNtcDsKICB1c2luZyA6OnN0cm5j bXA7CiAgdXNpbmcgOjpzdHJsZW47CiAgdXNpbmcgOjpzdHJzcG47CiAgdXNpbmcgOjpzdHJjc3Bu OwogIHVzaW5nIDo6c3RyY29sbDsKCgogIHVzaW5nIDo6c3RycGJyazsKICB1c2luZyA6OnN0cnJj aHI7CiAgdXNpbmcgOjpzdHJjaHI7CiAgdXNpbmcgOjpzdHJzdHI7CgoKCgoKICBpbmxpbmUgY2hh cioKICBzdHJwYnJrKGNoYXIqIF9fczEsIGNvbnN0IGNoYXIqIF9fczIpCiAgeyByZXR1cm4gX19i dWlsdGluX3N0cnBicmsoY29uc3RfY2FzdDxjb25zdCBjaGFyKj4oX19zMSksIF9fczIpOyB9CgoK CiAgaW5saW5lIGNoYXIqCiAgc3RycmNocihjaGFyKiBfX3MxLCBpbnQgX19uKQogIHsgcmV0dXJu IF9fYnVpbHRpbl9zdHJyY2hyKGNvbnN0X2Nhc3Q8Y29uc3QgY2hhcio+KF9fczEpLCBfX24pOyB9 CgoKCiAgaW5saW5lIGNoYXIqCiAgc3RyY2hyKGNoYXIqIF9fczEsIGludCBfX24pCiAgeyByZXR1 cm4gX19idWlsdGluX3N0cmNocihjb25zdF9jYXN0PGNvbnN0IGNoYXIqPihfX3MxKSwgX19uKTsg fQoKCgogIGlubGluZSBjaGFyKgogIHN0cnN0cihjaGFyKiBfX3MxLCBjb25zdCBjaGFyKiBfX3My KQogIHsgcmV0dXJuIF9fYnVpbHRpbl9zdHJzdHIoY29uc3RfY2FzdDxjb25zdCBjaGFyKj4oX19z MSksIF9fczIpOyB9CgoKCn07CiMgMTA3ICJhdXRvL2ZwdS5oIiAyCiMgMSAiYXV0by9jcHUuaCIg MQojIDE2ICJhdXRvL2NwdS5oIgpjbGFzcyBDcHUKewpwdWJsaWM6CgogIGVudW0gVmVuZG9yIHsK ICAgIFZFTkRPUl9VTktOT1dOID0gMCwKICAgIFZFTkRPUl9JTlRFTCwKICAgIFZFTkRPUl9BTUQs CiAgICBWRU5ET1JfQ1lSSVgsCiAgICBWRU5ET1JfSURULAogICAgVkVORE9SX1VNQywKICAgIFZF TkRPUl9ORVhHRU4sCiAgICBWRU5ET1JfUklTRSwKICAgIFZFTkRPUl9UUkFOU01FVEEsCiAgfTsK CiAgZW51bSBDYWNoZSB7CiAgICBDQUNIRV9VTktOT1dOID0gMCwKICAgIENBQ0hFX0wxX0RBVEEs CiAgICBDQUNIRV9MMV9JTlNULAogICAgQ0FDSEVfVFJBQ0UsCiAgICBDQUNIRV9MMiwKICAgIENB Q0hFX0wzLAogIH07CgogIHN0YXRpYyBjb25zdCBjaGFyICogdmVuZG9yX3N0cigpOwogIHN0YXRp YyBjb25zdCBjaGFyICogbW9kZWxfc3RyKCk7CiAgc3RhdGljIGNvbnN0IENwdTo6VmVuZG9yIHZl bmRvcigpOwogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZmFtaWx5KCk7CiAgc3RhdGljIGNv bnN0IHVuc2lnbmVkIGludCBtb2RlbCgpOwogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3Rl cHBpbmcoKTsKICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFwaWMoKTsKICBzdGF0aWMgY29u c3QgdW5zaWduZWQgaW50IGZlYXR1cmVzKCk7CiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0 IGwxX2NhY2hlKCk7CiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGwyX2NhY2hlKCk7CiAg c3RhdGljIHZvaWQgaWRlbnRpZnkoKTsKICBzdGF0aWMgdm9pZCBzZXRfc3lzZW50ZXJfc3RhY2sg KHVuc2lnbmVkIHN0YWNrcHRyKTsKCnByaXZhdGU6CgogIHN0cnVjdCBWZW5kb3JfdGFibGUgewog ICAgdW5zaWduZWQgdmVuZG9yX21hc2s7CiAgICB1bnNpZ25lZCB2ZW5kb3JfY29kZTsKICAgIHVu c2lnbmVkIHNob3J0IGwyX2NhY2hlOwogICAgY29uc3QgY2hhciAqIHZlbmRvcl9zdHJpbmc7CiAg fTsKCiAgc3RydWN0IENhY2hlX3RhYmxlIHsKICAgIHVuc2lnbmVkIGNoYXIgY2FjaGVfZGVzYzsK ICAgIENwdTo6Q2FjaGUgY2FjaGVfbGV2ZWw7CiAgICB1bnNpZ25lZCBzaG9ydCBjYWNoZV9zaXpl OwogIH07CgogIHN0YXRpYyB1bnNpZ25lZCBjcHVfc3lzZW50ZXJfc3RhY2sgYXNtICgiQ1BVX1NZ U0VOVEVSX1NUQUNLIik7CiAgc3RhdGljIHVuc2lnbmVkIGNwdV92ZXJzaW9uOwogIHN0YXRpYyB1 bnNpZ25lZCBjcHVfYXBpYzsKICBzdGF0aWMgdW5zaWduZWQgY3B1X2ZlYXR1cmVzOwogIHN0YXRp YyB1bnNpZ25lZCBzaG9ydCBjcHVfbDFfY2FjaGU7CiAgc3RhdGljIHVuc2lnbmVkIHNob3J0IGNw dV9sMl9jYWNoZTsKICBzdGF0aWMgVmVuZG9yIGNwdV92ZW5kb3I7CiAgc3RhdGljIGNoYXIgY3B1 X3ZlbmRvcl9zdHJbMTNdOwogIHN0YXRpYyBjb25zdCBjaGFyICogY3B1X21vZGVsX3N0cjsKCiAg c3RhdGljIFZlbmRvcl90YWJsZSBpbnRlbF90YWJsZVtdOwogIHN0YXRpYyBWZW5kb3JfdGFibGUg YW1kX3RhYmxlW107CiAgc3RhdGljIFZlbmRvcl90YWJsZSBjeXJpeF90YWJsZVtdOwogIHN0YXRp YyBWZW5kb3JfdGFibGUgaWR0X3RhYmxlW107CiAgc3RhdGljIENhY2hlX3RhYmxlIGludGVsX2Nh Y2hlX3RhYmxlW107CgogIHN0YXRpYyBjb25zdCBjaGFyICogbG9va3VwX21vZGVsX3N0ciAoY29u c3QgQ3B1OjpWZW5kb3IgdmVuZG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjb25zdCB1bnNpZ25lZCB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBsMl9jYWNoZSk7CgogIHN0YXRp YyB2b2lkIGNhY2hlX3NpemVfaW50ZWwoKTsKICBzdGF0aWMgdm9pZCBjYWNoZV9zaXplX2FtZF9s MSgpOwogIHN0YXRpYyB2b2lkIGNhY2hlX3NpemVfYW1kX2wyKCk7CiAgc3RhdGljIHZvaWQgd3Jt c3IgKHVuc2lnbmVkIGVjeCwgdW5zaWduZWQgZWF4LCB1bnNpZ25lZCBlZHgpOwogIHN0YXRpYyB2 b2lkIGNwdWlkICh1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCAqZWF4LCB1bnNpZ25lZCAqZWJ4LAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmVj eCwgdW5zaWduZWQgKmVkeCk7CnByaXZhdGU6CgpwdWJsaWM6CiAgZW51bSBMYnIKICAgIHsKICAg ICAgTEJSX1VOSU5JVElBTElaRUQgPSAwLAogICAgICBMQlJfTk9ORSwKICAgICAgTEJSX1A2LAog ICAgICBMQlJfUDQsCiAgICB9OwoKcHJpdmF0ZToKICBzdGF0aWMgTGJyIGNwdV9sYnI7CgpwdWJs aWM6CiAgc3RhdGljIGNvbnN0IENwdTo6TGJyIGhhc19sYnIoKTsKCiAgc3RhdGljIHZvaWQgaW5p dCh2b2lkKTsKCnByaXZhdGU6CiAgc3RhdGljIHZvaWQgYm9jaHNfdHdlYWtzKCk7Cn07CiMgMTMw ICJhdXRvL2NwdS5oIgppbmxpbmUgdm9pZApDcHU6OndybXNyKHVuc2lnbmVkIGVjeCwgdW5zaWdu ZWQgZWF4LCB1bnNpZ25lZCBlZHgpCnsKICBhc20gdm9sYXRpbGUgKCJ3cm1zciIgOiA6ICJjIihl Y3gpLCAiYSIoZWF4KSwgImQiKGVkeCkpOwp9CgoKCmlubGluZSB2b2lkCkNwdTo6Y3B1aWQodW5z aWduZWQgbW9kZSwKICAgICAgICAgICAgdW5zaWduZWQgKmVheCwgdW5zaWduZWQgKmVieCwgdW5z aWduZWQgKmVjeCwgdW5zaWduZWQgKmVkeCkKewogIGFzbSB2b2xhdGlsZSAoImNwdWlkIiA6ICI9 YSIoKmVheCksICI9YiIoKmVieCksICI9YyIoKmVjeCksICI9ZCIoKmVkeCkKICAgICAgICAgICAg ICAgICAgICAgICAgOiAiYSIobW9kZSkpOwp9CgoKCmlubGluZSB2b2lkCkNwdTo6c2V0X3N5c2Vu dGVyX3N0YWNrKHVuc2lnbmVkIHN0YWNrcHRyKQp7CiAgY3B1X3N5c2VudGVyX3N0YWNrID0gc3Rh Y2twdHI7Cn0KCgoKaW5saW5lIGNvbnN0IGNoYXIgKgpDcHU6OnZlbmRvcl9zdHIoKQp7CiAgcmV0 dXJuIGNwdV92ZW5kb3Jfc3RyOwp9CgoKCmlubGluZSBjb25zdCBjaGFyICoKQ3B1Ojptb2RlbF9z dHIoKQp7CiAgcmV0dXJuIGNwdV9tb2RlbF9zdHI7Cn0KCgoKaW5saW5lIGNvbnN0IENwdTo6VmVu ZG9yCkNwdTo6dmVuZG9yKCkKewogIHJldHVybiBjcHVfdmVuZG9yOwp9CgoKCmlubGluZSBjb25z dCB1bnNpZ25lZCBpbnQKQ3B1OjpmYW1pbHkoKQp7CiAgdW5zaWduZWQgaW50IHZhbCA9IChjcHVf dmVyc2lvbiA+PiA4KSAmIDB4RjsKCiAgaWYgKHZhbCA9PSAweEYpCiAgICB2YWwgKz0gKGNwdV92 ZXJzaW9uID4+IDIwKSAmIDB4RkY7CgogIHJldHVybiB2YWw7Cn0KCgoKaW5saW5lIGNvbnN0IHVu c2lnbmVkIGludApDcHU6Om1vZGVsKCkKewogIHVuc2lnbmVkIGludCB2YWwgPSAoY3B1X3ZlcnNp b24gPj4gNCkgJiAweEY7CgogIGlmICh2YWwgPT0gMHhGKQogICAgdmFsICs9IChjcHVfdmVyc2lv biA+PiAxMikgJiAweEYwOwoKICByZXR1cm4gdmFsOwp9CgoKCmlubGluZSBjb25zdCB1bnNpZ25l ZCBpbnQKQ3B1OjpzdGVwcGluZygpCnsKICByZXR1cm4gY3B1X3ZlcnNpb24gJiAweEY7Cn0KCgoK aW5saW5lIGNvbnN0IHVuc2lnbmVkIGludApDcHU6OmFwaWMoKQp7CiAgcmV0dXJuIChjcHVfYXBp YyA+PiAyNCkgJiAweEZGOwp9CgoKCmlubGluZSBjb25zdCB1bnNpZ25lZCBpbnQKQ3B1OjpmZWF0 dXJlcygpCnsKICByZXR1cm4gY3B1X2ZlYXR1cmVzOwp9CgoKCmlubGluZSBjb25zdCB1bnNpZ25l ZCBzaG9ydApDcHU6OmwxX2NhY2hlKCkKewogIHJldHVybiBjcHVfbDFfY2FjaGU7Cn0KCgoKaW5s aW5lIGNvbnN0IHVuc2lnbmVkIHNob3J0CkNwdTo6bDJfY2FjaGUoKQp7CiAgcmV0dXJuIGNwdV9s Ml9jYWNoZTsKfQojIDEwOCAiYXV0by9mcHUuaCIgMgojIDEgIi4uL3NyYy9rZXJuL2lhMzIvcmVn ZGVmcy5oIiAxCiMgMTA5ICJhdXRvL2ZwdS5oIiAyCiMgMTE3ICJhdXRvL2ZwdS5oIgppbmxpbmUg RnB1X3N0YXRlOjpGcHVfc3RhdGUoKSA6IF9zdGF0ZV9idWZmZXIoMCkKe30KCgoKaW5saW5lIEZw dV9zdGF0ZTo6fkZwdV9zdGF0ZSgpCnsKICBmcmVlX3N0YXRlKCk7Cn0KCgoKaW5saW5lIHZvaWQg KkZwdV9zdGF0ZTo6c3RhdGVfYnVmZmVyKCkKewogIHJldHVybiBfc3RhdGVfYnVmZmVyOwp9CgoK CmlubGluZSB2b2lkIEZwdV9zdGF0ZTo6c2F2ZV9zdGF0ZSgpCnsKICBGcHU6OnNhdmVfc3RhdGUo dGhpcyk7Cn0KCgoKaW5saW5lIHZvaWQgRnB1X3N0YXRlOjpyZXN0b3JlX3N0YXRlKCkKewogIEZw dTo6cmVzdG9yZV9zdGF0ZSh0aGlzKTsKfQoKCgppbmxpbmUgQ29udGV4dCAqIEZwdTo6b3duZXIo KQp7CiAgcmV0dXJuIF9vd25lcjsKfQoKCgppbmxpbmUgdm9pZCBGcHU6OnNldF9vd25lcihDb250 ZXh0ICpvd25lcikKewogIF9vd25lciA9IG93bmVyOwp9CgoKCmlubGluZSBib29sIEZwdTo6aXNf b3duZXIoQ29udGV4dCAqb3duZXIpCnsKICByZXR1cm4gX293bmVyID09IG93bmVyOwp9CiMgMTc2 ICJhdXRvL2ZwdS5oIgppbmxpbmUgdm9pZCBGcHU6OmluaXRfc3RhdGUoIEZwdV9zdGF0ZSAqcyAp CnsKICBpZiAoKENwdTo6ZmVhdHVyZXMoKSAmIDB4MDEwMDAwMDApKSB7CgogICAgc3NlX3JlZ3Mg KnNzZSA9IG5vbnVsbF9zdGF0aWNfY2FzdDxzc2VfcmVncyAqPihzLT5zdGF0ZV9idWZmZXIoKSk7 CgogICAgbWVtc2V0IChzc2UsIDAsIHNpemVvZiAoKnNzZSkpOwogICAgc3NlLT5jd2QgPSAweDM3 ZjsKCiAgICBpZiAoKENwdTo6ZmVhdHVyZXMoKSAmIDB4MDIwMDAwMDApICYmIChDcHU6OmZlYXR1 cmVzKCkgJiAweDA0MDAwMDAwKSkKICAgICAgc3NlLT5teGNzciA9IDB4MWY4MDsKCiAgfSBlbHNl IHsKCiAgICBmcHVfcmVncyAqZnB1ID0gbm9udWxsX3N0YXRpY19jYXN0PGZwdV9yZWdzICo+KHMt PnN0YXRlX2J1ZmZlcigpKTsKCiAgICBtZW1zZXQgKGZwdSwgMCwgc2l6ZW9mICgqZnB1KSk7CiAg ICBmcHUtPmN3ZCA9IDB4ZmZmZjAzN2Y7CiAgICBmcHUtPnN3ZCA9IDB4ZmZmZjAwMDA7CiAgICBm cHUtPnR3ZCA9IDB4ZmZmZmZmZmY7CiAgICBmcHUtPmZvcyA9IDB4ZmZmZjAwMDA7CiAgfQp9CgoK CgoKCgppbmxpbmUgdW5zaWduZWQgY29uc3QgRnB1OjpzdGF0ZV9zaXplKCkKewogIHJldHVybiAo Q3B1OjpmZWF0dXJlcygpICYgMHgwMTAwMDAwMCkgPyBzaXplb2YgKHNzZV9yZWdzKSA6CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChmcHVfcmVncyk7Cn0K CgoKCgoKCmlubGluZSB1bnNpZ25lZCBjb25zdCBGcHU6OnN0YXRlX2FsaWduKCkKewogIHJldHVy biAoQ3B1OjpmZWF0dXJlcygpICYgMHgwMTAwMDAwMCkgPyAxNiA6IDQ7Cn0KCgoKCgoKaW5saW5l IHZvaWQgRnB1OjpzYXZlX3N0YXRlKCBGcHVfc3RhdGUgKnMgKQp7CiAgKCh2b2lkKSAoKHMtPnN0 YXRlX2J1ZmZlcigpKSA/IDAgOiAoX19hc3NlcnRfZmFpbCAoInMtPnN0YXRlX2J1ZmZlcigpIiwg ImF1dG8vZnB1LmgiLCAyMzAsICgoY29uc3QgY2hhciAqKSAwKSksIDApKSk7CgogIGlmICgoQ3B1 OjpmZWF0dXJlcygpICYgMHgwMTAwMDAwMCkpCiAgICBhc20gdm9sYXRpbGUgKCJmeHNhdmUgKCUw KSIgOiA6ICJyIiAocy0+c3RhdGVfYnVmZmVyKCkpIDogIm1lbW9yeSIpOwogIGVsc2UKICAgIGFz bSB2b2xhdGlsZSAoImZuc2F2ZSAoJTApIiA6IDogInIiIChzLT5zdGF0ZV9idWZmZXIoKSkgOiAi bWVtb3J5Iik7Cn0KCgoKCgoKaW5saW5lIHZvaWQgRnB1OjpyZXN0b3JlX3N0YXRlKCBGcHVfc3Rh dGUgKnMgKQp7CiAgKCh2b2lkKSAoKHMtPnN0YXRlX2J1ZmZlcigpKSA/IDAgOiAoX19hc3NlcnRf ZmFpbCAoInMtPnN0YXRlX2J1ZmZlcigpIiwgImF1dG8vZnB1LmgiLCAyNDUsICgoY29uc3QgY2hh ciAqKSAwKSksIDApKSk7CgogIGlmICgoQ3B1OjpmZWF0dXJlcygpICYgMHgwMTAwMDAwMCkpCiAg ICBhc20gdm9sYXRpbGUgKCJmeHJzdG9yICglMCkiIDogOiAiciIgKHMtPnN0YXRlX2J1ZmZlcigp KSk7CiAgZWxzZQogICAgYXNtIHZvbGF0aWxlICgiZnJzdG9yICAoJTApIiA6IDogInIiIChzLT5z dGF0ZV9idWZmZXIoKSkpOwp9CgoKCgoKCgppbmxpbmUgdm9pZCBGcHU6OnN5bmNocm9uaXplKCkK ewogIGFzbSB2b2xhdGlsZSAoImZ3YWl0Iik7Cn0KCgoKCgoKaW5saW5lIHZvaWQgRnB1OjpkaXNh YmxlKCkKewogIFVuc2lnbmVkMzIgZHVtbXk7CgogIGFzbSB2b2xhdGlsZSAoIm1vdmwgJSVjcjAs ICUwOyBvcmwgJTEsICUwOyBtb3ZsICUwLCAlJWNyMCIKICAgICAgICAgICAgICAgIDogIj1yIiAo ZHVtbXkpCiAgICAgICAgICAgICAgICA6ICJpIiAoMHgwMDAwMDAwOCkpOwp9CgoKCgoKCmlubGlu ZSB2b2lkIEZwdTo6ZW5hYmxlKCkKewogIGFzbSB2b2xhdGlsZSAoImNsdHMiKTsKfQojIDEzICJh dXRvL2NvbnRleHQuaCIgMgoKCgoKCgpjbGFzcyBTcGFjZV9jb250ZXh0OwpjbGFzcyBUaHJlYWRf bG9jazsKY2xhc3MgUmV0dXJuX2ZyYW1lOwoKCgoKCmNsYXNzIENvbnRleHQKewpwdWJsaWM6CiAg c3RhdGljIGNvbnN0IHZtX3NpemVfdCBzaXplID0gQ29uZmlnOjp0aHJlYWRfYmxvY2tfc2l6ZTsK CnByaXZhdGU6CgogIHZvaWQgc3dpdGNoaW5fY29udGV4dCgpIGFzbSgiY2FsbF9zd2l0Y2hpbl9j b250ZXh0Iik7CgogIGZyaWVuZCBjbGFzcyBqZGI7CiAgZnJpZW5kIGNsYXNzIGpkYl90YnVmOwoK CgoKICAgICAgICAgICAgIHVuc2lnbmVkIF9zdGF0ZTsKCgpwcm90ZWN0ZWQ6CiAgICAgICAgICAg ICBDb250ZXh0ICpyZWFkeV9uZXh0OwogICAgICAgICAgICAgQ29udGV4dCAqcmVhZHlfcHJldjsK ICAgICAgICAgICAgIE13b3JkICprZXJuZWxfc3A7Cgpwcml2YXRlOgogICAgICAgICAgICAgU3Bh Y2VfY29udGV4dCogX3NwYWNlX2NvbnRleHQ7CgogIENvbnRleHQqIF9zdGFja19saW5rOwoKICBD b250ZXh0KiBfZG9uYXRlZTsKCgoKCgogIGludCBfbG9ja19jbnQ7CiAgVGhyZWFkX2xvY2sqIGNv bnN0IF90aHJlYWRfbG9jazsKCgoKCiAgc2NoZWRfdCBfc2NoZWQ7CgoKICBGcHVfc3RhdGUgX2Zw dV9zdGF0ZTsKCgpwcm90ZWN0ZWQ6CiAgc3RhdGljIENvbnRleHQgKnByaW9fZmlyc3RbMjU2XSBh c20gKCJDT05URVhUX1BSSU9fRklSU1QiKTsKICBzdGF0aWMgQ29udGV4dCAqcHJpb19uZXh0WzI1 Nl0gYXNtICgiQ09OVEVYVF9QUklPX05FWFQiKTsKICBzdGF0aWMgdW5zaWduZWQgcHJpb19oaWdo ZXN0IGFzbSAoIkNPTlRFWFRfUFJJT19ISUdIRVNUIik7CiAgc3RhdGljIGludCB0aW1lc2xpY2Vf dGlja3NfbGVmdDsKICBzdGF0aWMgQ29udGV4dCAqdGltZXNsaWNlX293bmVyOwoKcHVibGljOgoj IDg5ICJhdXRvL2NvbnRleHQuaCIKICBDb250ZXh0KFRocmVhZF9sb2NrICp0aHJlYWRfbG9jaywg U3BhY2VfY29udGV4dCogc3BhY2VfY29udGV4dCk7CgoKCiAgdmlydHVhbCB+Q29udGV4dCgpOwoK CgoKICB1bnNpZ25lZCBzdGF0ZSgpIGNvbnN0OwoKCgoKICBib29sIGV4aXN0cygpIGNvbnN0OwoK CgoKCiAgYm9vbCBzdGF0ZV9hZGQodW5zaWduZWQgYml0cyk7CgoKCgoKICBib29sIHN0YXRlX2Rl bCh1bnNpZ25lZCBiaXRzKTsKCgoKCgoKCiAgYm9vbCBzdGF0ZV9jaGFuZ2UodW5zaWduZWQgbWFz aywgdW5zaWduZWQgYml0cyk7CiMgMTM2ICJhdXRvL2NvbnRleHQuaCIKICBib29sIHN0YXRlX2No YW5nZV9zYWZlbHkodW5zaWduZWQgbWFzaywgdW5zaWduZWQgYml0cyk7CgoKCgoKCgogIHZvaWQg c3RhdGVfY2hhbmdlX2RpcnR5KHVuc2lnbmVkIG1hc2ssIHVuc2lnbmVkIGJpdHMpOwoKCgoKCiAg U3BhY2VfY29udGV4dCAqIHNwYWNlX2NvbnRleHQoKSBjb25zdDsKCgoKCiAgVGhyZWFkX2xvY2sg KiB0aHJlYWRfbG9jaygpOwoKCgoKICBzY2hlZF90ICogc2NoZWQoKTsKCgoKCiAgUmV0dXJuX2Zy YW1lICpyZWdzKCkgY29uc3Q7CgoKCiAgdm9pZCBpbmNfbG9ja19jbnQoKTsKCgoKCiAgdm9pZCBk ZWNfbG9ja19jbnQoKTsKCgoKCiAgaW50IGxvY2tfY250KCk7CgoKCgoKCiAgdm9pZCBzY2hlZHVs ZSgpOwoKCiAgc3RhdGljIHZvaWQgdGltZXJfdGljaygpOwoKCgoKICBib29sIGluX3JlYWR5X2xp c3QoKTsKCgoKICB2b2lkIHJlYWR5X2VucXVldWUoKTsKCgoKICB2b2lkIHJlYWR5X2RlcXVldWUo KTsKCgoKCgoKCiAgQ29udGV4dCAqIGdldF9uZXh0KCk7CgoKCgogIHZvaWQgc2V0X25leHQoQ29u dGV4dCAqbmV4dCk7CgoKCgoKCiAgQ29udGV4dCogZG9uYXRlZSgpOwoKICB2b2lkIHNldF9kb25h dGVlKENvbnRleHQqIGRvbmF0ZWUpOwoKICB2b2lkIHNldF9rZXJuZWxfc3AoTXdvcmQgKmVzcCk7 CgogIEZwdV9zdGF0ZSAqY29uc3QgZnB1X3N0YXRlKCk7CiMgMjM3ICJhdXRvL2NvbnRleHQuaCIK ICBib29sIHN3aXRjaF90byhDb250ZXh0ICp0KTsKCgoKCiAgdm9pZCBoYW5kbGVfZnB1X3RyYXAo KTsKfTsKCgoKCgpleHRlcm4gIkMiIHZvaWQgdGhyZWFkX2hhbmRsZV9mcHV0cmFwKCk7CiMgMjYy ICJhdXRvL2NvbnRleHQuaCIKIyAxICJhdXRvL2VudHJ5X2ZyYW1lLmgiIDEKIyAyMSAiYXV0by9l bnRyeV9mcmFtZS5oIgpjbGFzcyBTeXNjYWxsX2ZyYW1lCnsKcHJpdmF0ZToKCnB1YmxpYzoKCiAg VW5zaWduZWQzMiBlY3g7CiAgVW5zaWduZWQzMiBlZHg7CiAgVW5zaWduZWQzMiBlc2k7CiAgVW5z aWduZWQzMiBlZGk7CiAgVW5zaWduZWQzMiBlYng7CiAgVW5zaWduZWQzMiBlYnA7CiAgVW5zaWdu ZWQzMiBlYXg7Cn07CgpjbGFzcyBSZXR1cm5fZnJhbWUKewpwcml2YXRlOgoKcHVibGljOgogIFVu c2lnbmVkMzIgZWlwOwogIFVuc2lnbmVkMTYgY3MsIF9fY3N1OwogIFVuc2lnbmVkMzIgZWZsYWdz OwogIFVuc2lnbmVkMzIgZXNwOwogIFVuc2lnbmVkMTYgc3MsIF9fc3N1OwoKfTsKCgoKCgoKCmNs YXNzIEVudHJ5X2ZyYW1lIDogcHVibGljIFN5c2NhbGxfZnJhbWUsIHB1YmxpYyBSZXR1cm5fZnJh bWUKewp9OwoKCgoKY2xhc3MgU3lzX2lwY19mcmFtZSA6IHB1YmxpYyBTeXNjYWxsX2ZyYW1lCnsK cHVibGljOgoKICB2b2lkIHJjdl9zb3VyY2UoIEw0X3VpZCBpZCApOwoKCiAgTDRfdWlkIHJjdl9z b3VyY2UoKTsKCgogIEw0X3VpZCBzbmRfZGVzdCgpIGNvbnN0OwoKCiAgTXdvcmQgaGFzX3NuZF9k ZXN0KCkgY29uc3Q7CgoKICBNd29yZCBpcnEoKSBjb25zdDsKCgogIHZvaWQgc25kX2Rlc2MoIE13 b3JkIHcgKTsKCgogIEw0X3NuZF9kZXNjIHNuZF9kZXNjKCkgY29uc3Q7CgoKICB2b2lkIHJjdl9k ZXNjKCBMNF9yY3ZfZGVzYyBkICk7CgoKICBMNF9yY3ZfZGVzYyByY3ZfZGVzYygpIGNvbnN0OwoK CiAgTDRfdGltZW91dCB0aW1lb3V0KCkgY29uc3Q7CgoKICBNd29yZCBtc2dfd29yZCggdW5zaWdu ZWQgaW5kZXggKSBjb25zdDsKCgogIHZvaWQgc2V0X21zZ193b3JkKCB1bnNpZ25lZCBpbmRleCwg TXdvcmQgdmFsdWUgKTsKCgogIHZvaWQgY29weV9tc2coIFN5c19pcGNfZnJhbWUgKnRvICkgY29u c3QgOwoKCiAgTDRfbXNnZG9wZSBtc2dfZG9wZSgpIGNvbnN0OwoKCiAgdm9pZCBtc2dfZG9wZV9z ZXRfZXJyb3IoIE13b3JkICk7CgoKICB2b2lkIG1zZ19kb3BlKCBMNF9tc2dkb3BlIGQgKTsKCgog IHZvaWQgbXNnX2RvcGVfY29tYmluZSggTDRfbXNnZG9wZSBkICk7CgoKICBzdGF0aWMgdW5zaWdu ZWQgY29uc3QgbnVtX3JlZ193b3JkcygpOwp9OwoKCgoKY2xhc3MgU3lzX2lkX25lYXJlc3RfZnJh bWUgOiBwdWJsaWMgU3lzY2FsbF9mcmFtZQp7CnB1YmxpYzoKCgogIEw0X3VpZCBkZXN0KCkgY29u c3Q7CgoKICB2b2lkIG5lYXJlc3QoIEw0X3VpZCBpZCApIDsKfTsKCgoKCmNsYXNzIFN5c19leF9y ZWdzX2ZyYW1lIDogcHVibGljIFN5c2NhbGxfZnJhbWUKewpwdWJsaWM6CgoKICBNd29yZCBsdGhy ZWFkKCkgY29uc3Q7CgoKICBNd29yZCBzcCgpIGNvbnN0OwoKCiAgTXdvcmQgaXAoKSBjb25zdDsK CgogIEw0X3VpZCBwcmVlbXB0ZXIoKSBjb25zdDsKCgogIEw0X3VpZCBwYWdlcigpIGNvbnN0OwoK CiAgdm9pZCBvbGRfZWZsYWdzKCBNd29yZCBvZWZsICk7CgoKICB2b2lkIG9sZF9zcCggTXdvcmQg b3NwICk7CgoKICB2b2lkIG9sZF9pcCggTXdvcmQgb2lwICk7CgoKICB2b2lkIG9sZF9wcmVlbXB0 ZXIoIEw0X3VpZCBpZCApOwoKCiAgdm9pZCBvbGRfcGFnZXIoIEw0X3VpZCBpZCApOwp9OwoKCgoK Y2xhc3MgU3lzX3RocmVhZF9zd2l0Y2hfZnJhbWUgOiBwdWJsaWMgU3lzY2FsbF9mcmFtZQp7CnB1 YmxpYzoKCgogIEw0X3VpZCBkZXN0KCkgY29uc3Q7CgoKICBNd29yZCBoYXNfZGVzdCgpIGNvbnN0 OwoKfTsKCgoKCmNsYXNzIFN5c190aHJlYWRfc2NoZWR1bGVfZnJhbWUgOiBwdWJsaWMgU3lzY2Fs bF9mcmFtZQp7CnB1YmxpYzoKCgogIEw0X3NjaGVkX3BhcmFtIHBhcmFtKCkgY29uc3Q7CgoKICBM NF91aWQgcHJlZW1wdGVyKCkgY29uc3Q7CgoKICBMNF91aWQgZGVzdCgpIGNvbnN0OwoKCiAgdm9p ZCBvbGRfcGFyYW0oIEw0X3NjaGVkX3BhcmFtIG9wICk7CgoKICB2b2lkIHRpbWUoIFVuc2lnbmVk NjQgdCApOwoKCiAgdm9pZCBvbGRfcHJlZW1wdGVyKCBMNF91aWQgaWQgKTsKCgogIHZvaWQgcGFy dG5lciggTDRfdWlkIGlkICk7Cn07CgoKCgpjbGFzcyBTeXNfdW5tYXBfZnJhbWUgOiBwdWJsaWMg U3lzY2FsbF9mcmFtZQp7CnB1YmxpYzoKCgogIEw0X2ZwYWdlIGZwYWdlKCkgY29uc3Q7CgoKICBN d29yZCBtYXBfbWFzaygpIGNvbnN0OwoKCiAgYm9vbCBkb3duZ3JhZGUoKSBjb25zdDsKCgogIGJv b2wgc2VsZl91bm1hcCgpIGNvbnN0Owp9OwoKCgoKY2xhc3MgU3lzX3Rhc2tfbmV3X2ZyYW1lIDog cHVibGljIFN5c2NhbGxfZnJhbWUKewpwdWJsaWM6CgoKICBNd29yZCBtY3AoKSBjb25zdDsKCgog IEw0X3VpZCBuZXdfY2hpZWYoKSBjb25zdDsKCgogIE13b3JkIHNwKCkgY29uc3Q7CgoKICBNd29y ZCBpcCgpIGNvbnN0OwoKCiAgTXdvcmQgaGFzX3BhZ2VyKCkgY29uc3Q7CgoKICBMNF91aWQgcGFn ZXIoKSBjb25zdDsKCgogIEw0X3VpZCBkZXN0KCkgY29uc3Q7CgoKICB2b2lkIG5ld190YXNraWQo IEw0X3VpZCBpZCApOwoKfTsKIyAyODEgImF1dG8vZW50cnlfZnJhbWUuaCIKaW5saW5lIHZvaWQg U3lzX2lwY19mcmFtZTo6cmN2X3NvdXJjZSggTDRfdWlkIGlkICkKewogIGVzaSA9IGlkLnJhdygp OyBlZGkgPSAoaWQucmF3KCkgPj4gMzIpOwp9CgoKCmlubGluZSBMNF91aWQgU3lzX2lwY19mcmFt ZTo6cmN2X3NvdXJjZSgpCnsKICByZXR1cm4gTDRfdWlkKCgoVW5zaWduZWQ2NCllZGkgPDwgMzIp IHwgKFVuc2lnbmVkNjQpZXNpKTsKfQoKCgppbmxpbmUgTDRfdWlkIFN5c19pcGNfZnJhbWU6OnNu ZF9kZXN0KCkgY29uc3QKewogIHJldHVybiBMNF91aWQoIChVbnNpZ25lZDY0KWVzaSB8ICgoVW5z aWduZWQ2NCllZGkgPDwgMzIpICk7Cn0KCgoKaW5saW5lIE13b3JkIFN5c19pcGNfZnJhbWU6Omhh c19zbmRfZGVzdCgpIGNvbnN0CnsKICByZXR1cm4gZXNpOwp9CgoKCmlubGluZSBNd29yZCBTeXNf aXBjX2ZyYW1lOjppcnEoKSBjb25zdAp7CiAgcmV0dXJuIGVzaSAtMTsKfQoKCgppbmxpbmUgdm9p ZCBTeXNfaXBjX2ZyYW1lOjpzbmRfZGVzYyggTXdvcmQgdyApCnsKICBlYXggPXc7Cn0KCgoKaW5s aW5lIEw0X3NuZF9kZXNjIFN5c19pcGNfZnJhbWU6OnNuZF9kZXNjKCkgY29uc3QKewogIHJldHVy biBlYXg7Cn0KCgoKaW5saW5lIEw0X3RpbWVvdXQgU3lzX2lwY19mcmFtZTo6dGltZW91dCgpIGNv bnN0CnsKICByZXR1cm4gTDRfdGltZW91dCggZWN4ICk7Cn0KCgoKaW5saW5lIE13b3JkIFN5c19p cGNfZnJhbWU6Om1zZ193b3JkKCB1bnNpZ25lZCBpbmRleCApIGNvbnN0CnsKICBzd2l0Y2goaW5k ZXgpCiAgICB7CiAgICBjYXNlIDA6CiAgICAgIHJldHVybiBlZHg7CiAgICBjYXNlIDE6CiAgICAg IHJldHVybiBlYng7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gMDsKICAgIH0KfQoKCgppbmxp bmUgdm9pZCBTeXNfaXBjX2ZyYW1lOjpzZXRfbXNnX3dvcmQoIHVuc2lnbmVkIGluZGV4LCBNd29y ZCB2YWx1ZSApCnsKICBzd2l0Y2goaW5kZXgpCiAgICB7CiAgICBjYXNlIDA6CiAgICAgIGVkeCA9 IHZhbHVlOwogICAgICBicmVhazsKICAgIGNhc2UgMToKICAgICAgZWJ4ID0gdmFsdWU7CiAgICAg IGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgYnJlYWs7CiAgICB9Cn0KCgoKaW5saW5lIEw0X3Jj dl9kZXNjIFN5c19pcGNfZnJhbWU6OnJjdl9kZXNjKCkgY29uc3QKewogIHJldHVybiBlYnA7Cn0K CgoKaW5saW5lIHZvaWQgU3lzX2lwY19mcmFtZTo6cmN2X2Rlc2MoIEw0X3Jjdl9kZXNjIGQgKQp7 CiAgZWJwID0gZC5yYXcoKTsKfQoKCgppbmxpbmUgTDRfbXNnZG9wZSBTeXNfaXBjX2ZyYW1lOjpt c2dfZG9wZSgpIGNvbnN0CnsKICByZXR1cm4gTDRfbXNnZG9wZShlYXgpOwp9CgoKCmlubGluZSB2 b2lkIFN5c19pcGNfZnJhbWU6Om1zZ19kb3BlX3NldF9lcnJvciggTXdvcmQgZSApCnsKICByZWlu dGVycHJldF9jYXN0PEw0X21zZ2RvcGUqPigmZWF4KS0+ZXJyb3IoZSk7Cn0KCgoKaW5saW5lIHVu c2lnbmVkIGNvbnN0IFN5c19pcGNfZnJhbWU6Om51bV9yZWdfd29yZHMoKQp7CiAgcmV0dXJuIDI7 Cn0KCgoKaW5saW5lIHZvaWQgU3lzX2lwY19mcmFtZTo6bXNnX2RvcGUoIEw0X21zZ2RvcGUgZCAp CnsKICBlYXggPSBkLnJhdygpOwp9CgoKCmlubGluZSB2b2lkIFN5c19pcGNfZnJhbWU6Om1zZ19k b3BlX2NvbWJpbmUoIEw0X21zZ2RvcGUgZCApCnsKICBMNF9tc2dkb3BlIG0oZWF4KTsKICBtLmNv bWJpbmUoZCk7CiAgZWF4ID0gbS5yYXcoKTsKfQoKCgppbmxpbmUgdm9pZCBTeXNfaXBjX2ZyYW1l Ojpjb3B5X21zZyggU3lzX2lwY19mcmFtZSAqdG8gKSBjb25zdAp7CgogIFVuc2lnbmVkMzIgdG1w X2VkeCA9IGVkeCwgdG1wX2VieCA9IGVieDsKICB0by0+ZWR4ID0gdG1wX2VkeDsKICB0by0+ZWJ4 ID0gdG1wX2VieDsKfQoKCgoKCmlubGluZSBMNF91aWQgU3lzX2lkX25lYXJlc3RfZnJhbWU6OmRl c3QoKSBjb25zdAp7CiAgcmV0dXJuIEw0X3VpZCggKFVuc2lnbmVkNjQpZXNpIHwgKChVbnNpZ25l ZDY0KWVkaSA8PCAzMikgKTsKfQoKCgppbmxpbmUgdm9pZCBTeXNfaWRfbmVhcmVzdF9mcmFtZTo6 bmVhcmVzdCggTDRfdWlkIGlkICkKewogIGVzaSA9IGlkLnJhdygpOyBlZGkgPSAoaWQucmF3KCkg Pj4gMzIpOwp9CgoKCgoKaW5saW5lIE13b3JkIFN5c19leF9yZWdzX2ZyYW1lOjpsdGhyZWFkKCkg Y29uc3QKewogIHJldHVybiBlYXg7Cn0KCgoKaW5saW5lIE13b3JkIFN5c19leF9yZWdzX2ZyYW1l OjpzcCgpIGNvbnN0CnsKICByZXR1cm4gZWN4Owp9CgoKCmlubGluZSBNd29yZCBTeXNfZXhfcmVn c19mcmFtZTo6aXAoKSBjb25zdAp7CiAgcmV0dXJuIGVkeDsKfQoKCgppbmxpbmUgTDRfdWlkIFN5 c19leF9yZWdzX2ZyYW1lOjpwcmVlbXB0ZXIoKSBjb25zdAp7CiAgcmV0dXJuIEw0X3VpZCggKFVu c2lnbmVkNjQpZWJ4IHwgKChVbnNpZ25lZDY0KWVicCA8PCAzMikgKTsKfQoKCgppbmxpbmUgTDRf dWlkIFN5c19leF9yZWdzX2ZyYW1lOjpwYWdlcigpIGNvbnN0CnsKICByZXR1cm4gTDRfdWlkKCAo VW5zaWduZWQ2NCllc2kgfCAoKFVuc2lnbmVkNjQpZWRpIDw8IDMyKSApOwp9CgoKCmlubGluZSB2 b2lkIFN5c19leF9yZWdzX2ZyYW1lOjpvbGRfZWZsYWdzKCBNd29yZCBvZWZsICkKewogIGVheCA9 IG9lZmw7Cn0KCgoKaW5saW5lIHZvaWQgU3lzX2V4X3JlZ3NfZnJhbWU6Om9sZF9zcCggTXdvcmQg b3NwICkKewogIGVjeCA9IG9zcDsKfQoKCgppbmxpbmUgdm9pZCBTeXNfZXhfcmVnc19mcmFtZTo6 b2xkX2lwKCBNd29yZCBvaXAgKQp7CiAgZWR4ID0gb2lwOwp9CgoKCmlubGluZSB2b2lkIFN5c19l eF9yZWdzX2ZyYW1lOjpvbGRfcHJlZW1wdGVyKCBMNF91aWQgaWQgKQp7CiAgZWJ4ID0gaWQucmF3 KCk7IGVicCA9IGlkLnJhdygpID4+IDMyOwp9CgoKCmlubGluZSB2b2lkIFN5c19leF9yZWdzX2Zy YW1lOjpvbGRfcGFnZXIoIEw0X3VpZCBpZCApCnsKICBlc2kgPSBpZC5yYXcoKTsgZWRpID0gaWQu cmF3KCkgPj4gMzI7Cn0KCgoKCgppbmxpbmUgTDRfdWlkIFN5c190aHJlYWRfc3dpdGNoX2ZyYW1l OjpkZXN0KCkgY29uc3QKewoKICByZXR1cm4gTDRfdWlkKCAoVW5zaWduZWQ2NCllc2kgfCAoKFVu c2lnbmVkNjQpZWRpIDw8IDMyKSApOwp9CgoKCmlubGluZSBNd29yZCBTeXNfdGhyZWFkX3N3aXRj aF9mcmFtZTo6aGFzX2Rlc3QoKSBjb25zdAp7CiAgcmV0dXJuIGVzaTsKfQoKCgoKCmlubGluZSBM NF9zY2hlZF9wYXJhbSBTeXNfdGhyZWFkX3NjaGVkdWxlX2ZyYW1lOjpwYXJhbSgpIGNvbnN0CnsK ICByZXR1cm4gTDRfc2NoZWRfcGFyYW0oZWF4KTsKfQoKCgppbmxpbmUgTDRfdWlkIFN5c190aHJl YWRfc2NoZWR1bGVfZnJhbWU6OnByZWVtcHRlcigpIGNvbnN0CnsKICByZXR1cm4gTDRfdWlkKCAo VW5zaWduZWQ2NCllYnggfCAoKFVuc2lnbmVkNjQpZWJwIDw8IDMyKSApOwp9CgoKCmlubGluZSBM NF91aWQgU3lzX3RocmVhZF9zY2hlZHVsZV9mcmFtZTo6ZGVzdCgpIGNvbnN0CnsKICByZXR1cm4g TDRfdWlkKCAoVW5zaWduZWQ2NCllc2kgfCAoKFVuc2lnbmVkNjQpZWRpIDw8IDMyKSApOwp9CgoK CmlubGluZSB2b2lkIFN5c190aHJlYWRfc2NoZWR1bGVfZnJhbWU6Om9sZF9wYXJhbSggTDRfc2No ZWRfcGFyYW0gb3AgKQp7CiAgZWF4ID0gb3AucmF3KCk7Cn0KCgoKaW5saW5lIHZvaWQgU3lzX3Ro cmVhZF9zY2hlZHVsZV9mcmFtZTo6dGltZSggVW5zaWduZWQ2NCB0ICkKewogIGVjeCA9IHQ7IGVk eCA9IHQgPj4gMzI7Cn0KCgoKaW5saW5lIHZvaWQgU3lzX3RocmVhZF9zY2hlZHVsZV9mcmFtZTo6 b2xkX3ByZWVtcHRlciggTDRfdWlkIGlkICkKewogIGVieCA9IGlkLnJhdygpOyBlYnAgPSBpZC5y YXcoKSA+PiAzMjsKfQoKCgppbmxpbmUgdm9pZCBTeXNfdGhyZWFkX3NjaGVkdWxlX2ZyYW1lOjpw YXJ0bmVyKCBMNF91aWQgaWQgKQp7CiAgZXNpID0gaWQucmF3KCk7IGVkaSA9IGlkLnJhdygpID4+ IDMyOwp9CgoKCgoKaW5saW5lIEw0X2ZwYWdlIFN5c191bm1hcF9mcmFtZTo6ZnBhZ2UoKSBjb25z dAp7CiAgcmV0dXJuIEw0X2ZwYWdlKCBlYXggKSA7Cn0KCgoKaW5saW5lIE13b3JkIFN5c191bm1h cF9mcmFtZTo6bWFwX21hc2soKSBjb25zdAp7CiAgcmV0dXJuIGVjeDsKfQoKCgppbmxpbmUgYm9v bCBTeXNfdW5tYXBfZnJhbWU6OmRvd25ncmFkZSgpIGNvbnN0CnsKICByZXR1cm4gIShlY3ggJiAy KTsKfQoKCgppbmxpbmUgYm9vbCBTeXNfdW5tYXBfZnJhbWU6OnNlbGZfdW5tYXAoKSBjb25zdAp7 CiAgcmV0dXJuIGVjeCAmIDB4ODAwMDAwMDA7Cn0KCgoKCgppbmxpbmUgTXdvcmQgU3lzX3Rhc2tf bmV3X2ZyYW1lOjptY3AoKSBjb25zdAp7CiAgcmV0dXJuIGVheDsKfQoKCgppbmxpbmUgTDRfdWlk IFN5c190YXNrX25ld19mcmFtZTo6bmV3X2NoaWVmKCkgY29uc3QKewogIHJldHVybiBMNF91aWQo IChVbnNpZ25lZDY0KWVheCApOwp9CgoKCmlubGluZSBNd29yZCBTeXNfdGFza19uZXdfZnJhbWU6 OnNwKCkgY29uc3QKewogIHJldHVybiBlY3g7Cn0KCgoKaW5saW5lIE13b3JkIFN5c190YXNrX25l d19mcmFtZTo6aXAoKSBjb25zdAp7CiAgcmV0dXJuIGVkeDsKfQoKCgppbmxpbmUgTXdvcmQgU3lz X3Rhc2tfbmV3X2ZyYW1lOjpoYXNfcGFnZXIoKSBjb25zdAp7CiAgcmV0dXJuIGVieDsKfQoKCgpp bmxpbmUgTDRfdWlkIFN5c190YXNrX25ld19mcmFtZTo6cGFnZXIoKSBjb25zdAp7CiAgcmV0dXJu IEw0X3VpZCggKFVuc2lnbmVkNjQpZWJ4IHwgKChVbnNpZ25lZDY0KWVicCA8PCAzMikgKTsKfQoK CgppbmxpbmUgTDRfdWlkIFN5c190YXNrX25ld19mcmFtZTo6ZGVzdCgpIGNvbnN0CnsKICByZXR1 cm4gTDRfdWlkKCAoVW5zaWduZWQ2NCllc2kgfCAoKFVuc2lnbmVkNjQpZWRpIDw8IDMyKSApOwp9 CgoKCmlubGluZSB2b2lkIFN5c190YXNrX25ld19mcmFtZTo6bmV3X3Rhc2tpZCggTDRfdWlkIGlk ICkKewogIGVzaSA9IGlkLnJhdygpOyBlZGkgPSBpZC5yYXcoKSA+PiAzMjsKfQojIDI2MyAiYXV0 by9jb250ZXh0LmgiIDIKIyAxICJhdXRvL3RocmVhZF9zdGF0ZS5oIiAxCiMgMTIgImF1dG8vdGhy ZWFkX3N0YXRlLmgiCmVudW0KewogIFRocmVhZF9pbnZhbGlkID0gMCwKICBUaHJlYWRfcnVubmlu ZyA9IDB4MSwKICBUaHJlYWRfd2FpdGluZyA9IDB4MiwKICBUaHJlYWRfcmVjZWl2aW5nID0gMHg0 LAogIFRocmVhZF9wb2xsaW5nID0gMHg4LAogIFRocmVhZF9pcGNfaW5fcHJvZ3Jlc3MgPSAweDEw LAogIFRocmVhZF9zZW5kX2luX3Byb2dyZXNzID0gMHgyMCwKICBUaHJlYWRfYnVzeSA9IDB4NDAs CiAgVGhyZWFkX2NhbmNlbCA9IDB4MTAwLAogIFRocmVhZF9kZWFkID0gMHgyMDAsCiAgVGhyZWFk X3BvbGxpbmdfbG9uZyA9IDB4NDAwLAogIFRocmVhZF9idXN5X2xvbmcgPSAweDgwMCwKICBUaHJl YWRfcmN2bG9uZ19pbl9wcm9ncmVzcyA9IDB4NDAwMCwKICBUaHJlYWRfZnB1X293bmVyID0gMHgx MDAwMCwKCgogIFRocmVhZF9pcGNfc2VuZGluZ19tYXNrID0gVGhyZWFkX3NlbmRfaW5fcHJvZ3Jl c3MKICAgIHwgVGhyZWFkX3BvbGxpbmcgfCBUaHJlYWRfcG9sbGluZ19sb25nLAogIFRocmVhZF9p cGNfcmVjZWl2aW5nX21hc2sgPSBUaHJlYWRfd2FpdGluZyB8IFRocmVhZF9yZWNlaXZpbmcKICAg IHwgVGhyZWFkX2J1c3kgfCBUaHJlYWRfcmN2bG9uZ19pbl9wcm9ncmVzcyB8IFRocmVhZF9idXN5 X2xvbmcsCiAgVGhyZWFkX2lwY19tYXNrID0gVGhyZWFkX2lwY19pbl9wcm9ncmVzcwogICAgfCBU aHJlYWRfaXBjX3NlbmRpbmdfbWFzayB8IFRocmVhZF9pcGNfcmVjZWl2aW5nX21hc2ssCgp9Owoj IDI2NCAiYXV0by9jb250ZXh0LmgiIDIKIyAyODAgImF1dG8vY29udGV4dC5oIgppbmxpbmUgQ29u dGV4dDo6Q29udGV4dChUaHJlYWRfbG9jayAqdGhyZWFkX2xvY2ssCiAgICAgICAgICAgICAgICAg IFNwYWNlX2NvbnRleHQqIHNwYWNlX2NvbnRleHQpCiAgOiBfc3BhY2VfY29udGV4dCAoc3BhY2Vf Y29udGV4dCksCiAgICBfdGhyZWFkX2xvY2sgKHRocmVhZF9sb2NrKQp7CgoKCgoKCgogIE13b3Jk ICppbml0X3NwID0gcmVpbnRlcnByZXRfY2FzdDxNd29yZCo+CiAgICAocmVpbnRlcnByZXRfY2Fz dDxNd29yZD4odGhpcykgKyBzaXplIC0gc2l6ZW9mKEVudHJ5X2ZyYW1lKSk7CgoKCgogIHNtcF9j YXMoJmtlcm5lbF9zcCwgKE13b3JkKikwLCBpbml0X3NwKTsKfQoKCgoKCgppbmxpbmUgdW5zaWdu ZWQgQ29udGV4dDo6c3RhdGUoKSBjb25zdAp7IHJldHVybiBfc3RhdGU7IH0KCgoKCgoKaW5saW5l IGJvb2wgQ29udGV4dDo6ZXhpc3RzKCkgY29uc3QKeyByZXR1cm4gX3N0YXRlICE9IFRocmVhZF9p bnZhbGlkOyB9CgoKCgoKCgppbmxpbmUgYm9vbApDb250ZXh0OjpzdGF0ZV9hZGQodW5zaWduZWQg Yml0cykKewogIGJvb2wgcmV0OwogIHVuc2lnbmVkIG9sZDsKICBkbwogICAgewogICAgICBvbGQg PSBfc3RhdGU7CiAgICAgIHJldCA9IChfc3RhdGUgJiBiaXRzKSA9PSAwOwogICAgfQogIHdoaWxl ICghIHNtcF9jYXMoJl9zdGF0ZSwgb2xkLCBvbGQgfCBiaXRzKSk7CgogIHJldHVybiByZXQ7Cn0K CgoKCgoKCmlubGluZSBib29sCkNvbnRleHQ6OnN0YXRlX2RlbCh1bnNpZ25lZCBiaXRzKQp7CiAg Ym9vbCByZXQ7CiAgdW5zaWduZWQgb2xkOwogIGRvCiAgICB7CiAgICAgIG9sZCA9IF9zdGF0ZTsK ICAgICAgcmV0ID0gKF9zdGF0ZSAmIGJpdHMpID09IGJpdHM7CiAgICB9CiAgd2hpbGUgKCEgc21w X2NhcygmX3N0YXRlLCBvbGQsIG9sZCAmIH5iaXRzKSk7CgogIHJldHVybiByZXQ7Cn0KIyAzNjcg ImF1dG8vY29udGV4dC5oIgppbmxpbmUgYm9vbApDb250ZXh0OjpzdGF0ZV9jaGFuZ2UodW5zaWdu ZWQgbWFzaywgdW5zaWduZWQgYml0cykKewogIGJvb2wgcmV0OwogIHVuc2lnbmVkIG9sZDsKICBk bwogICAgewogICAgICBvbGQgPSBfc3RhdGU7CiAgICAgIHJldCA9ICgob2xkICYgYml0cyAmIG1h c2spID09IDApICYmICgob2xkICYgfm1hc2spID09IH5tYXNrKTsKICAgIH0KICB3aGlsZSAoISBz bXBfY2FzKCZfc3RhdGUsIG9sZCwgKG9sZCAmIG1hc2spIHwgYml0cykpOwoKICByZXR1cm4gcmV0 Owp9CiMgMzk1ICJhdXRvL2NvbnRleHQuaCIKaW5saW5lIGJvb2wKQ29udGV4dDo6c3RhdGVfY2hh bmdlX3NhZmVseSh1bnNpZ25lZCBtYXNrLCB1bnNpZ25lZCBiaXRzKQp7CiAgYm9vbCByZXQ7CiAg dW5zaWduZWQgb2xkOwogIGRvCiAgICB7CiAgICAgIG9sZCA9IF9zdGF0ZTsKICAgICAgcmV0ID0g KChvbGQgJiBiaXRzICYgbWFzaykgPT0gMCkgJiYgKChvbGQgJiB+bWFzaykgPT0gfm1hc2spOwog ICAgICBpZiAoISByZXQpCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIHdoaWxlICghIHNt cF9jYXMoJl9zdGF0ZSwgb2xkLCAob2xkICYgbWFzaykgfCBiaXRzKSk7CgogIHJldHVybiB0cnVl Owp9CiMgNDIxICJhdXRvL2NvbnRleHQuaCIKaW5saW5lIHZvaWQKQ29udGV4dDo6c3RhdGVfY2hh bmdlX2RpcnR5KHVuc2lnbmVkIG1hc2ssIHVuc2lnbmVkIGJpdHMpCnsKICBfc3RhdGUgJj0gbWFz azsKICBfc3RhdGUgfD0gYml0czsKfQoKCgoKCgoKaW5saW5lIFNwYWNlX2NvbnRleHQgKgpDb250 ZXh0OjpzcGFjZV9jb250ZXh0KCkgY29uc3QKewogIHJldHVybiBfc3BhY2VfY29udGV4dDsKfQoK CgoKCgppbmxpbmUgVGhyZWFkX2xvY2sgKgpDb250ZXh0Ojp0aHJlYWRfbG9jaygpCnsKICByZXR1 cm4gX3RocmVhZF9sb2NrOwp9CgoKCgoKCmlubGluZSBzY2hlZF90ICoKQ29udGV4dDo6c2NoZWQo KQp7CiAgcmV0dXJuICZfc2NoZWQ7Cn0KCgoKCgoKaW5saW5lIFJldHVybl9mcmFtZSAqQ29udGV4 dDo6cmVncygpIGNvbnN0CnsKICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXR1cm5fZnJhbWUg Kj4KICAgIChyZWludGVycHJldF9jYXN0PE13b3JkPih0aGlzKSArIHNpemUgLSBzaXplb2YoUmV0 dXJuX2ZyYW1lKSk7Cn0KCgoKCgppbmxpbmUgdm9pZApDb250ZXh0OjppbmNfbG9ja19jbnQoKQp7 CiAgX2xvY2tfY250ICsrOwp9CgoKCgoKCmlubGluZSB2b2lkCkNvbnRleHQ6OmRlY19sb2NrX2Nu dCgpCnsKICBfbG9ja19jbnQtLTsKfQoKCgoKCgppbmxpbmUgaW50CkNvbnRleHQ6OmxvY2tfY250 KCkKewogIHJldHVybiBfbG9ja19jbnQ7Cn0KCgoKCmlubGluZSB2b2lkCkNvbnRleHQ6OnRpbWVy X3RpY2soKQp7CiAgaWYgKCFDb25maWc6OmZpbmVfZ3JhaW5lZF9jcHV0aW1lKQogICAgY3VycmVu dCgpLT5zY2hlZCgpLT51cGRhdGVfY3B1dGltZSgpOwoKICBpZiAoLS10aW1lc2xpY2VfdGlja3Nf bGVmdCA8PSAwKQogICAgY3VycmVudCgpLT5zY2hlZHVsZSgpOwp9CgoKCgoKCmlubGluZSBib29s CkNvbnRleHQ6OmluX3JlYWR5X2xpc3QoKQp7CiAgcmV0dXJuIHJlYWR5X25leHQ7Cn0KCgoKCgpp bmxpbmUgdm9pZApDb250ZXh0OjpyZWFkeV9lbnF1ZXVlKCkKewogIExvY2tfZ3VhcmQgPENwdV9s b2NrPiBndWFyZCAoJmNwdV9sb2NrKTsKCiAgQ29udGV4dCAqc2libGluZyA9IDA7CiAgdW5zaWdu ZWQgaTsKCiAgaWYgKCEgaW5fcmVhZHlfbGlzdCgpKQogICAgewogICAgICBpZiAoISBwcmlvX2Zp cnN0W3NjaGVkKCktPnByaW8oKV0pCiAgICAgICAgcHJpb19maXJzdFtzY2hlZCgpLT5wcmlvKCld ID0gdGhpczsKICAgICAgaWYgKCEgcHJpb19uZXh0W3NjaGVkKCktPnByaW8oKV0pCiAgICAgICAg cHJpb19uZXh0W3NjaGVkKCktPnByaW8oKV0gPSB0aGlzOwoKICAgICAgaWYgKHNjaGVkKCktPnBy aW8oKSA+IHByaW9faGlnaGVzdCkKICAgICAgICBwcmlvX2hpZ2hlc3QgPSBzY2hlZCgpLT5wcmlv KCk7CgoKCiAgICAgIGkgPSBzY2hlZCgpLT5wcmlvKCk7CiAgICAgIGRvCiAgICAgICAgewogICAg ICAgICAgaWYgKCsraSA9PSAyNTYpIGkgPSAwOwogICAgICAgICAgc2libGluZyA9IHByaW9fZmly c3RbaV07CiAgICAgICAgfQogICAgICB3aGlsZSAoISBzaWJsaW5nKTsKCiAgICAgICgodm9pZCkg KCghIGluX3JlYWR5X2xpc3QoKSkgPyAwIDogKF9fYXNzZXJ0X2ZhaWwgKCIhIGluX3JlYWR5X2xp c3QoKSIsICJhdXRvL2NvbnRleHQuaCIsIDU2MSwgKChjb25zdCBjaGFyICopIDApKSwgMCkpKTsK CiAgICAgIHJlYWR5X25leHQgPSBzaWJsaW5nOwogICAgICByZWFkeV9wcmV2ID0gc2libGluZy0+ cmVhZHlfcHJldjsKICAgICAgc2libGluZy0+cmVhZHlfcHJldiA9IHRoaXM7CiAgICAgIHJlYWR5 X3ByZXYtPnJlYWR5X25leHQgPSB0aGlzOwoKICAgICAgKCh2b2lkKSAoKHJlYWR5X3ByZXYtPnNj aGVkKCktPnByaW8oKSA8PSBzY2hlZCgpLT5wcmlvKCkgfHwgc2NoZWQoKS0+cHJpbygpID09IDAp ID8gMCA6IChfX2Fzc2VydF9mYWlsICgicmVhZHlfcHJldi0+c2NoZWQoKS0+cHJpbygpIDw9IHNj aGVkKCktPnByaW8oKSB8fCBzY2hlZCgpLT5wcmlvKCkgPT0gMCIsICJhdXRvL2NvbnRleHQuaCIs IDU2OSwgKChjb25zdCBjaGFyICopIDApKSwgMCkpKTsKCiAgICB9Cgp9CgoKCgoKaW5saW5lIHZv aWQKQ29udGV4dDo6cmVhZHlfZGVxdWV1ZSgpCnsKICBMb2NrX2d1YXJkIDxDcHVfbG9jaz4gZ3Vh cmQgKCZjcHVfbG9jayk7CgogIGlmIChpbl9yZWFkeV9saXN0KCkpCiAgICB7CiAgICAgIGlmIChw cmlvX2ZpcnN0W3NjaGVkKCktPnByaW8oKV0gPT0gdGhpcykKICAgICAgICBwcmlvX2ZpcnN0W3Nj aGVkKCktPnByaW8oKV0gPSByZWFkeV9uZXh0LT5zY2hlZCgpLT5wcmlvKCkgPT0gc2NoZWQoKS0+ cHJpbygpID8gcmVhZHlfbmV4dCA6IDA7CiAgICAgIGlmIChwcmlvX25leHRbc2NoZWQoKS0+cHJp bygpXSA9PSB0aGlzKQogICAgICAgIHByaW9fbmV4dFtzY2hlZCgpLT5wcmlvKCldID0gcmVhZHlf bmV4dC0+c2NoZWQoKS0+cHJpbygpID09IHNjaGVkKCktPnByaW8oKSA/CiAgICAgICAgICByZWFk eV9uZXh0IDogcHJpb19maXJzdFtzY2hlZCgpLT5wcmlvKCldOwoKICAgICAgaWYgKHByaW9fZmly c3Rbc2NoZWQoKS0+cHJpbygpXSA9PSAwICYmIHNjaGVkKCktPnByaW8oKSA9PSBwcmlvX2hpZ2hl c3QpCiAgICAgICAgewogICAgICAgICAgKCh2b2lkKSAoKHJlYWR5X25leHQtPnNjaGVkKCktPnBy aW8oKSA8IHNjaGVkKCktPnByaW8oKSkgPyAwIDogKF9fYXNzZXJ0X2ZhaWwgKCJyZWFkeV9uZXh0 LT5zY2hlZCgpLT5wcmlvKCkgPCBzY2hlZCgpLT5wcmlvKCkiLCAiYXV0by9jb250ZXh0LmgiLCA1 OTMsICgoY29uc3QgY2hhciAqKSAwKSksIDApKSk7CiAgICAgICAgICBwcmlvX2hpZ2hlc3QgPSBy ZWFkeV9wcmV2LT5zY2hlZCgpLT5wcmlvKCk7CiAgICAgICAgfQogICAgICByZWFkeV9wcmV2LT5y ZWFkeV9uZXh0ID0gcmVhZHlfbmV4dDsKICAgICAgcmVhZHlfbmV4dC0+cmVhZHlfcHJldiA9IHJl YWR5X3ByZXY7CiAgICAgIHJlYWR5X25leHQgPSAwOwoKICAgIH0KCn0KIyA2MTIgImF1dG8vY29u dGV4dC5oIgppbmxpbmUgQ29udGV4dCAqCkNvbnRleHQ6OmdldF9uZXh0KCkKewogIHJldHVybiBf c3RhY2tfbGluazsKfQoKCgoKCgppbmxpbmUgdm9pZApDb250ZXh0OjpzZXRfbmV4dChDb250ZXh0 ICpuZXh0KQp7CiAgX3N0YWNrX2xpbmsgPSBuZXh0Owp9CiMgNjM2ICJhdXRvL2NvbnRleHQuaCIK aW5saW5lIENvbnRleHQqCkNvbnRleHQ6OmRvbmF0ZWUoKQp7CiAgcmV0dXJuIF9kb25hdGVlOwp9 CgoKCmlubGluZSB2b2lkCkNvbnRleHQ6OnNldF9kb25hdGVlKENvbnRleHQqIGRvbmF0ZWUpCnsK ICBfZG9uYXRlZSA9IGRvbmF0ZWU7Cn0KCgoKaW5saW5lIHZvaWQKQ29udGV4dDo6c2V0X2tlcm5l bF9zcChNd29yZCAqZXNwKQp7CiAga2VybmVsX3NwID0gZXNwOwp9CgoKCmlubGluZSBGcHVfc3Rh dGUgKmNvbnN0IENvbnRleHQ6OmZwdV9zdGF0ZSgpCnsKICByZXR1cm4gJl9mcHVfc3RhdGU7Cn0K CgoKCgoKaW5saW5lIHZvaWQgQ29udGV4dDo6aGFuZGxlX2ZwdV90cmFwKCkKewoKICBGcHU6OmVu YWJsZSgpOwoKCiAgaWYgKEZwdTo6b3duZXIoKSkgewogICAgRnB1Ojpvd25lcigpLT5zdGF0ZV9j aGFuZ2VfZGlydHkgKH5UaHJlYWRfZnB1X293bmVyLCAwKTsKICAgIEZwdTo6b3duZXIoKS0+ZnB1 X3N0YXRlKCktPnNhdmVfc3RhdGUoKTsKICB9CgoKICBpZiAoIWZwdV9zdGF0ZSgpLT5zdGF0ZV9i dWZmZXIoKSkKICAgIGZwdV9zdGF0ZSgpLT5hbGxvY19zdGF0ZSgpOwoKCiAgc3RhdGVfY2hhbmdl X2RpcnR5ICh+MCwgVGhyZWFkX2ZwdV9vd25lcik7CiAgZnB1X3N0YXRlKCktPnJlc3RvcmVfc3Rh dGUoKTsKCiAgRnB1OjpzZXRfb3duZXIodGhpcyk7Cn0KIyA3ICJhdXRvL3JlY2VpdmVyLmgiIDIK IyAxICJhdXRvL3RpbWVyLmgiIDEKIyAxMSAiYXV0by90aW1lci5oIgpjbGFzcyBDb250ZXh0OwoK Y2xhc3MgVGltZXIKewpwdWJsaWM6CgoKCgoKCiAgc3RhdGljIHZvaWQgaW5pdCgpOwoKCgoKICBz dGF0aWMgYm9vbCBpbml0X2RvbmU7CgoKCgoKCiAgc3RhdGljIHZvaWQgYWNrbm93bGVkZ2UoKTsK CgoKCgoKICBzdGF0aWMgdm9pZCBlbmFibGUoKTsKCgoKCiAgc3RhdGljIHZvaWQgZGlzYWJsZSgp Owp9OwoKY2xhc3MgdGltZW91dF90CnsKICBmcmllbmQgY2xhc3MgdGltZXI7CgogIHRpbWVvdXRf dChjb25zdCB0aW1lb3V0X3QmKTsKCgogIHVuc2lnbmVkIGxvbmcgbG9uZyBfd2FrZXVwOwogIHRp bWVvdXRfdCAqX25leHQsICpfcHJldjsKCiAgdW5pb24gewogICAgc3RydWN0IHsKICAgICAgYm9v bCBzZXQgOiAxOwogICAgICBib29sIGhpdCA6IDE7CiAgICB9IF9mbGFnczsKICAgIHVuc2lnbmVk IHNob3J0IF9mbGFnd29yZDsKICB9OwoKcHVibGljOgoKCgogIHRpbWVvdXRfdCgpOwoKICBib29s IGlzX3NldCgpOwoKICBib29sIGhhc19oaXQoKTsKCiAgQ29udGV4dCAqIG93bmVyKCk7CgogIHZv aWQgc2V0KHVuc2lnbmVkIGxvbmcgbG9uZyBhYnNfbWljcm9zZWMpOwoKICB2b2lkIHNldF9hZ2Fp bigpOwoKICB2b2lkIHJlc2V0KCk7CgogIGxvbmcgbG9uZyBnZXRfdGltZW91dCgpOwoKcHJpdmF0 ZToKICB2b2lkIGVucXVldWUoKTsKCiAgYm9vbCBjaGVja19oaXQoKTsKfTsKCmNsYXNzIHRpbWVy CnsKICBmcmllbmQgY2xhc3MgdGltZW91dF90OwoKCiAgdGltZXIoKTsKICB0aW1lcihjb25zdCB0 aW1lciYpOwoKCiAgc3RhdGljIHRpbWVvdXRfdCAqZmlyc3RfdGltZW91dDsKCnB1YmxpYzoKICBz dGF0aWMgdm9pZCB1cGRhdGVfc3lzdGVtX2Nsb2NrKCk7Cgpwcml2YXRlOgogIHN0YXRpYyB2b2lk IGRvX3RpbWVvdXRzKCk7Cn07CiMgMTM0ICJhdXRvL3RpbWVyLmgiCmlubGluZSB2b2lkIFRpbWVy OjphY2tub3dsZWRnZSgpCnsKICBQaWM6OmRpc2FibGVfbG9ja2VkKDApOwogIFBpYzo6YWNrbm93 bGVkZ2VfbG9ja2VkKDApOwogIFBpYzo6ZW5hYmxlX2xvY2tlZCgwKTsKfQoKCgppbmxpbmUgdm9p ZCBUaW1lcjo6ZW5hYmxlKCkKewogIFBpYzo6ZW5hYmxlKDApOwp9CgoKCmlubGluZSB2b2lkIFRp bWVyOjpkaXNhYmxlKCkKewogIFBpYzo6ZGlzYWJsZSgwKTsKfQoKCgoKCgppbmxpbmUgdGltZW91 dF90Ojp0aW1lb3V0X3QoKQp7CiAgX2ZsYWd3b3JkID0gMDsKfQoKCgppbmxpbmUgYm9vbAp0aW1l b3V0X3Q6OmlzX3NldCgpCnsKICByZXR1cm4gX2ZsYWdzLnNldDsKfQoKCgppbmxpbmUgYm9vbAp0 aW1lb3V0X3Q6Omhhc19oaXQoKQp7CiAgcmV0dXJuIF9mbGFncy5oaXQ7Cn0KCgoKaW5saW5lIENv bnRleHQgKgp0aW1lb3V0X3Q6Om93bmVyKCkKewogIHJldHVybiBjb250ZXh0X29mICh0aGlzKTsK fQoKCgppbmxpbmUgdm9pZAp0aW1lb3V0X3Q6OmVucXVldWUoKQp7CiAgX2ZsYWdzLnNldCA9IDE7 CiAgaWYgKCF0aW1lcjo6Zmlyc3RfdGltZW91dCkKICAgIHsKICAgICAgdGltZXI6OmZpcnN0X3Rp bWVvdXQgPSB0aGlzOwogICAgICBfcHJldiA9IF9uZXh0ID0gMDsKICAgIH0KICBlbHNlCiAgICB7 CiAgICAgIHRpbWVvdXRfdCAqdGkgPSB0aW1lcjo6Zmlyc3RfdGltZW91dDsKCiAgICAgIGZvciAo OzspCiAgICAgICAgewogICAgICAgICAgaWYgKHRpLT5fd2FrZXVwID49IF93YWtldXApCiAgICAg ICAgICAgIHsKCiAgICAgICAgICAgICAgX25leHQgPSB0aTsKICAgICAgICAgICAgICBfcHJldiA9 IHRpLT5fcHJldjsKICAgICAgICAgICAgICB0aS0+X3ByZXYgPSB0aGlzOwogICAgICAgICAgICAg IGlmIChfcHJldikKICAgICAgICAgICAgICAgIF9wcmV2LT5fbmV4dCA9IHRoaXM7CiAgICAgICAg ICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGltZXI6OmZpcnN0X3RpbWVvdXQgPSB0aGlzOwoK ICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoISB0aS0+ X25leHQpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIHRpID0gdGktPl9uZXh0OwogICAg ICAgIH0KCgogICAgICB0aS0+X25leHQgPSB0aGlzOwogICAgICBfcHJldiA9IHRpOwogICAgICBf bmV4dCA9IDA7CiAgICB9Cn0KCgoKaW5saW5lIHZvaWQKdGltZW91dF90OjpzZXQodW5zaWduZWQg bG9uZyBsb25nIGFic19taWNyb3NlYykKewoKICBMb2NrX2d1YXJkPENwdV9sb2NrPiBndWFyZCAo JmNwdV9sb2NrKTsKCiAgKCh2b2lkKSAoKCEgaXNfc2V0KCkpID8gMCA6IChfX2Fzc2VydF9mYWls ICgiISBpc19zZXQoKSIsICJhdXRvL3RpbWVyLmgiLCAyNDEsICgoY29uc3QgY2hhciAqKSAwKSks IDApKSk7CiAgX3dha2V1cCA9IGFic19taWNyb3NlYzsKICBlbnF1ZXVlKCk7Cn0KCgoKaW5saW5l IHZvaWQKdGltZW91dF90OjpzZXRfYWdhaW4oKQp7CgogIExvY2tfZ3VhcmQ8Q3B1X2xvY2s+IGd1 YXJkICgmY3B1X2xvY2spOwoKICAoKHZvaWQpICgoISBpc19zZXQoKSkgPyAwIDogKF9fYXNzZXJ0 X2ZhaWwgKCIhIGlzX3NldCgpIiwgImF1dG8vdGltZXIuaCIsIDI1NCwgKChjb25zdCBjaGFyICop IDApKSwgMCkpKTsKICBpZiAoISBoYXNfaGl0KCkpCiAgICB7CiAgICAgIGVucXVldWUoKTsKICAg IH0KfQoKCgppbmxpbmUgdm9pZAp0aW1lb3V0X3Q6OnJlc2V0KCkKewoKCiAgaWYgKCEgaXNfc2V0 KCkpCiAgICByZXR1cm47CgogIHsKICAgIExvY2tfZ3VhcmQ8Q3B1X2xvY2s+IGd1YXJkICgmY3B1 X2xvY2spOwoKICAgIGlmIChpc19zZXQoKSkKICAgICAgewogICAgICAgIGlmIChfcHJldikKICAg ICAgICBfcHJldi0+X25leHQgPSBfbmV4dDsKICAgICAgICBlbHNlCiAgICAgICAgdGltZXI6OmZp cnN0X3RpbWVvdXQgPSBfbmV4dDsKICAgICAgICBpZiAoX25leHQpCiAgICAgICAgX25leHQtPl9w cmV2ID0gX3ByZXY7CiAgICAgIH0KCiAgICBfZmxhZ3Muc2V0ID0gMDsKCiAgfQp9CgoKCmlubGlu ZSBsb25nIGxvbmcKdGltZW91dF90OjpnZXRfdGltZW91dCgpCnsKICByZXR1cm4gX3dha2V1cCAt IGttZW06OmluZm8oKS0+Y2xvY2s7Cn0KCgoKaW5saW5lIGJvb2wKdGltZW91dF90OjpjaGVja19o aXQoKQp7CgoKICBpZiAoa21lbTo6aW5mbygpLT5jbG9jayA8IF93YWtldXApCiAgICByZXR1cm4g ZmFsc2U7CgogIHRpbWVyOjpmaXJzdF90aW1lb3V0ID0gX25leHQ7CiAgaWYgKF9uZXh0KSBfbmV4 dC0+X3ByZXYgPSAwOwogIF9mbGFncy5oaXQgPSAxOwogIF9mbGFncy5zZXQgPSAwOwogIG93bmVy KCktPnN0YXRlX2NoYW5nZSh+VGhyZWFkX2lwY19pbl9wcm9ncmVzcywKICAgICAgICAgICAgICAg ICAgICAgICAgVGhyZWFkX3J1bm5pbmcpOwoKCgoKICBvd25lcigpLT5yZWFkeV9lbnF1ZXVlKCk7 CgogIHJldHVybiB0cnVlOwp9CgoKCmlubGluZSB2b2lkCnRpbWVyOjpkb190aW1lb3V0cygpCnsK ICB3aGlsZSAoZmlyc3RfdGltZW91dCkKICAgIHsKICAgICAgaWYgKCEgZmlyc3RfdGltZW91dC0+ Y2hlY2tfaGl0KCkpCiAgICAgICAgYnJlYWs7CiAgICB9Cn0KCgoKaW5saW5lIHZvaWQKdGltZXI6 OnVwZGF0ZV9zeXN0ZW1fY2xvY2soKQp7CiAga21lbTo6aW5mbygpLT5jbG9jayArPSBDb25maWc6 Om1pY3Jvc2VjX3Blcl90aWNrOwoKICBkb190aW1lb3V0cygpOwp9CiMgOCAiYXV0by9yZWNlaXZl ci5oIiAyCgoKCgoKCmNsYXNzIFN5c19pcGNfZnJhbWU7CmNsYXNzIFNlbmRlcjsKY2xhc3MgVGhy ZWFkOwojIDI2ICJhdXRvL3JlY2VpdmVyLmgiCmNsYXNzIFJlY2VpdmVyIDogcHVibGljIENvbnRl eHQKewoKICBTZW5kZXIqIF9wYXJ0bmVyOwogIFN5c19pcGNfZnJhbWUgKl9yZWNlaXZlX3JlZ3M7 CiAgdm1fb2Zmc2V0X3QgX3BhZ2Vpbl9yZXF1ZXN0OwogIFRocmVhZCogX3BhZ2Vpbl9hcHBsaWNh bnQ7CiAgU2VuZGVyKiBfc2VuZGVyX2ZpcnN0OwoKcHJvdGVjdGVkOgoKCgoKCiAgdGltZW91dF90 KiBfdGltZW91dDsKCnB1YmxpYzoKIyA1MiAiYXV0by9yZWNlaXZlci5oIgogIFN5c19pcGNfZnJh bWUqIHJlY2VpdmVfcmVncygpIGNvbnN0OwojIDYzICJhdXRvL3JlY2VpdmVyLmgiCiAgdm9pZCBz ZXRfcGFnZWluX3JlcXVlc3Qodm1fb2Zmc2V0X3QgYWRkcmVzcywgVGhyZWFkICpub3RpZnkpOwoK CgoKCgoKICBib29sIHNlbmRlcl9vayhTZW5kZXIqIHNlbmRlcikgY29uc3Q7CgoKCgoKCiAgYm9v bCBpbl9sb25nX2lwYyhTZW5kZXIqIHNlbmRlcikgY29uc3Q7CiMgODggImF1dG8vcmVjZWl2ZXIu aCIKICBpbnQgaXBjX3RyeV9sb2NrKFNlbmRlciogc2VuZGVyKTsKCgogIHZvaWQgaXBjX3VubG9j aygpOwoKCgoKICBTZW5kZXIqKiBzZW5kZXJfbGlzdCgpOwoKICB2b2lkIHJlc2V0X3JlY2VpdmVf dGltZW91dCgpOwoKcHJvdGVjdGVkOgojIDEwOSAiYXV0by9yZWNlaXZlci5oIgogIFJlY2VpdmVy KFRocmVhZF9sb2NrICp0aHJlYWRfbG9jaywgU3BhY2VfY29udGV4dCogc3BhY2VfY29udGV4dCk7 CgoKCgogIFNlbmRlciogcGFydG5lcigpIGNvbnN0OwoKCgoKCiAgdm9pZCByZXN0b3JlX3JlY2Vp dmVyX3N0YXRlKFNlbmRlciogcGFydG5lciwgU3lzX2lwY19mcmFtZSogcmVncyk7CgoKCgoKICB2 b2lkIHNhdmVfcmVjZWl2ZXJfc3RhdGUoU2VuZGVyKiogb3V0X3BhcnRuZXIsIFN5c19pcGNfZnJh bWUqKiBvdXRfcmVncyk7CgoKCiAgdm9pZCBjbGVhcl9wYWdlaW5fcmVxdWVzdCgpOwoKCgogIHZt X29mZnNldF90IHBhZ2Vpbl9yZXF1ZXN0KCkgY29uc3Q7CgoKCgogIFRocmVhZCogcGFnZWluX2Fw cGxpY2FudCgpOwojIDE0OSAiYXV0by9yZWNlaXZlci5oIgogIHVuc2lnbmVkIHNldHVwX3JlY2Vp dmVyX3N0YXRlKFNlbmRlciogc2VuZGVyLCBTeXNfaXBjX2ZyYW1lKiByZWdzKTsKIyAxNjAgImF1 dG8vcmVjZWl2ZXIuaCIKICB2b2lkIHNldHVwX3JlY2VpdmVyKFNlbmRlciogc2VuZGVyLCBTeXNf aXBjX2ZyYW1lKiByZWdzKTsKCiAgdm9pZCBzZXRfcmVjZWl2ZV90aW1lb3V0KHRpbWVvdXRfdCAq dCk7Cgpwcml2YXRlOgoKICB2b2lkIHNldF9yZWNlaXZlX3JlZ3MoU3lzX2lwY19mcmFtZSogcmVn cyk7CgogIHZvaWQgc2V0X3BhcnRuZXIoU2VuZGVyKiBwYXJ0bmVyKTsKfTsKIyAxODEgImF1dG8v cmVjZWl2ZXIuaCIKIyAxICJhdXRvL3RocmVhZF9sb2NrLmgiIDEKCgoKCgoKCiMgMSAiLi4vc3Jj L2xpYi9taW5pbGliYy9pbmNsdWRlL3BhbmljLmgiIDEKCgoKCgpleHRlcm4gIkMiIHsKCnZvaWQg cGFuaWMgKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVy bl9fKSk7Cgp9CiMgOSAiYXV0by90aHJlYWRfbG9jay5oIiAyCgoKCgoKCmVudW0gU3dpdGNoX2hp bnQKewogIFNXSVRDSF9ET05UX0NBUkUgPSAwLAogIFNXSVRDSF9BQ1RJVkFURV9SRUNFSVZFUiwK ICBTV0lUQ0hfQUNUSVZBVEVfU0VOREVSCn07CiMgMzEgImF1dG8vdGhyZWFkX2xvY2suaCIKY2xh c3MgVGhyZWFkX2xvY2sKewpwcml2YXRlOgogIFN3aXRjaF9sb2NrIF9zd2l0Y2hfbG9jazsKICBT d2l0Y2hfaGludCBfc3dpdGNoX2hpbnQ7CgpwdWJsaWM6CgoKCiAgdm9pZCBzZXRfc3dpdGNoX2hp bnQoU3dpdGNoX2hpbnQgaGludCk7CgoKCgogIGJvb2wgdGVzdF9hbmRfc2V0KCk7CgoKCgoKICB2 b2lkIGxvY2soKTsKCgoKCgoKCiAgdm9pZCBjbGVhcigpOwoKCgoKICBDb250ZXh0ICogbG9ja19v d25lcigpIGNvbnN0OwoKCgoKICBib29sIHRlc3QoKTsKCnByaXZhdGU6CgoKCiAgQ29udGV4dCog Y29udGV4dCgpIGNvbnN0Owp9OwojIDk2ICJhdXRvL3RocmVhZF9sb2NrLmgiCmlubGluZSB2b2lk ClRocmVhZF9sb2NrOjpzZXRfc3dpdGNoX2hpbnQoU3dpdGNoX2hpbnQgaGludCkKewogIF9zd2l0 Y2hfaGludCA9IGhpbnQ7Cn0KCgoKCgoKCmlubGluZSB2b2lkClRocmVhZF9sb2NrOjpsb2NrKCkK ewogICgodm9pZCkgKCh0ZXN0X2FuZF9zZXQgKCkgPT0gZmFsc2UpID8gMCA6IChfX2Fzc2VydF9m YWlsICgidGVzdF9hbmRfc2V0ICgpID09IGZhbHNlIiwgImF1dG8vdGhyZWFkX2xvY2suaCIsIDEx MSwgKChjb25zdCBjaGFyICopIDApKSwgMCkpKTsKfQoKCgoKCgppbmxpbmUgQ29udGV4dCAqClRo cmVhZF9sb2NrOjpsb2NrX293bmVyKCkgY29uc3QKewogIHJldHVybiBfc3dpdGNoX2xvY2subG9j a19vd25lcigpOwp9CgoKCgoKCmlubGluZSBib29sClRocmVhZF9sb2NrOjp0ZXN0KCkKewogIHJl dHVybiBfc3dpdGNoX2xvY2sudGVzdCgpOwp9CiMgMTgyICJhdXRvL3JlY2VpdmVyLmgiIDIKIyAy MDEgImF1dG8vcmVjZWl2ZXIuaCIKaW5saW5lIFN5c19pcGNfZnJhbWUqClJlY2VpdmVyOjpyZWNl aXZlX3JlZ3MoKSBjb25zdAp7CiAgKCh2b2lkKSAoKHN0YXRlICgpICYgVGhyZWFkX2lwY19yZWNl aXZpbmdfbWFzaykgPyAwIDogKF9fYXNzZXJ0X2ZhaWwgKCJzdGF0ZSAoKSAmIFRocmVhZF9pcGNf cmVjZWl2aW5nX21hc2siLCAiYXV0by9yZWNlaXZlci5oIiwgMjA0LCAoKGNvbnN0IGNoYXIgKikg MCkpLCAwKSkpOwoKICByZXR1cm4gX3JlY2VpdmVfcmVnczsKfQojIDIyMCAiYXV0by9yZWNlaXZl ci5oIgppbmxpbmUgdm9pZApSZWNlaXZlcjo6c2V0X3BhZ2Vpbl9yZXF1ZXN0KHZtX29mZnNldF90 IGFkZHJlc3MsIFRocmVhZCAqbm90aWZ5KQp7CiAgKCh2b2lkKSAoKGFkZHJlc3MgIT0gMHhmZmZm ZmZmZikgPyAwIDogKF9fYXNzZXJ0X2ZhaWwgKCJhZGRyZXNzICE9IDB4ZmZmZmZmZmYiLCAiYXV0 by9yZWNlaXZlci5oIiwgMjIzLCAoKGNvbnN0IGNoYXIgKikgMCkpLCAwKSkpOwoKICBfcGFnZWlu X3JlcXVlc3QgPSBhZGRyZXNzOwogIF9wYWdlaW5fYXBwbGljYW50ID0gbm90aWZ5OwoKICBzdGF0 ZV9jaGFuZ2UgKH5UaHJlYWRfYnVzeV9sb25nLCBUaHJlYWRfcnVubmluZyk7Cn0KCgoKCgoKaW5s aW5lIFNlbmRlcioKUmVjZWl2ZXI6OnBhcnRuZXIoKSBjb25zdAp7CiAgcmV0dXJuIF9wYXJ0bmVy Owp9CiMgMjUwICJhdXRvL3JlY2VpdmVyLmgiCmlubGluZSBib29sClJlY2VpdmVyOjpzZW5kZXJf b2soU2VuZGVyKiBzZW5kZXIpIGNvbnN0CnsKICB1bnNpZ25lZCBpcGNfc3RhdGUgPSBzdGF0ZSgp ICYgKFRocmVhZF9yZWNlaXZpbmd8VGhyZWFkX3dhaXRpbmcKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgVGhyZWFkX3NlbmRfaW5fcHJvZ3Jlc3MKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgVGhyZWFkX2lwY19pbl9wcm9ncmVzcyk7CgoKICBpZiAoIChfX2J1 aWx0aW5fZXhwZWN0KChpcGNfc3RhdGUgPT0gKFRocmVhZF93YWl0aW5nIHxUaHJlYWRfaXBjX2lu X3Byb2dyZXNzKSksdHJ1ZSkpCiAgICAgIHx8IChfX2J1aWx0aW5fZXhwZWN0KCgoaXBjX3N0YXRl ID09IChUaHJlYWRfcmVjZWl2aW5nfFRocmVhZF9pcGNfaW5fcHJvZ3Jlc3MpKSAmJiBwYXJ0bmVy KCkgPT0gc2VuZGVyKSx0cnVlKSkKCiAgICAgICkKICAgIHsKICAgICAgcmV0dXJuIHRydWU7CiAg ICB9CgogIHJldHVybiBmYWxzZTsKfQojIDI3NiAiYXV0by9yZWNlaXZlci5oIgppbmxpbmUgYm9v bApSZWNlaXZlcjo6aW5fbG9uZ19pcGMoU2VuZGVyKiBzZW5kZXIpIGNvbnN0CnsKICBpZiAoKChz dGF0ZSgpICYgKFRocmVhZF9yY3Zsb25nX2luX3Byb2dyZXNzfFRocmVhZF9pcGNfaW5fcHJvZ3Jl c3MpKQogICAgICAgIT0gKFRocmVhZF9yY3Zsb25nX2luX3Byb2dyZXNzfFRocmVhZF9pcGNfaW5f cHJvZ3Jlc3MpKQogICAgICB8fCBwYXJ0bmVyKCkgIT0gc2VuZGVyKQogICAgcmV0dXJuIGZhbHNl OwoKICByZXR1cm4gdHJ1ZTsKfQoKCgppbmxpbmUgdm9pZApSZWNlaXZlcjo6c2V0X3BhcnRuZXIo U2VuZGVyKiBwYXJ0bmVyKQp7CiAgX3BhcnRuZXIgPSBwYXJ0bmVyOwp9CgoKCgoKaW5saW5lIHZv aWQKUmVjZWl2ZXI6OmNsZWFyX3BhZ2Vpbl9yZXF1ZXN0KCkKewogIF9wYWdlaW5fcmVxdWVzdCA9 IDB4ZmZmZmZmZmY7Cn0KIyAzMTYgImF1dG8vcmVjZWl2ZXIuaCIKaW5saW5lIGludApSZWNlaXZl cjo6aXBjX3RyeV9sb2NrKFNlbmRlciogc2VuZGVyKQp7CiAgaWYgKF9fYnVpbHRpbl9leHBlY3Qo KHN0YXRlICgpID09IFRocmVhZF9pbnZhbGlkKSxmYWxzZSkgKQogICAgcmV0dXJuIEw0X21zZ2Rv cGU6OkVOT1RfRVhJU1RFTlQ7CgogIHRocmVhZF9sb2NrKCktPmxvY2soKTsKCiAgaWYgKF9fYnVp bHRpbl9leHBlY3QoKCEgc2VuZGVyX29rIChzZW5kZXIpKSxmYWxzZSkgKQogICAgewogICAgICB0 aHJlYWRfbG9jaygpLT5jbGVhcigpOwogICAgICByZXR1cm4gLTE7CiAgICB9CgogIHNldF9wYXJ0 bmVyIChzZW5kZXIpOwogIHJlY2VpdmVfcmVncygpLT5yY3Zfc291cmNlKCBzZW5kZXItPmlkKCkg KTsKICBjbGVhcl9wYWdlaW5fcmVxdWVzdCAoKTsKCiAgcmV0dXJuIDA7Cn0KCgoKCmlubGluZSB2 b2lkClJlY2VpdmVyOjppcGNfdW5sb2NrKCkKewogICgodm9pZCkgKCh0aHJlYWRfbG9jaygpLT5s b2NrX293bmVyKCkgPT0gY3VycmVudCgpKSA/IDAgOiAoX19hc3NlcnRfZmFpbCAoInRocmVhZF9s b2NrKCktPmxvY2tfb3duZXIoKSA9PSBjdXJyZW50KCkiLCAiYXV0by9yZWNlaXZlci5oIiwgMzQz LCAoKGNvbnN0IGNoYXIgKikgMCkpLCAwKSkpOwoKICB0aHJlYWRfbG9jaygpLT5jbGVhcigpOwp9 CgoKCgoKCmlubGluZSBTZW5kZXIqKgpSZWNlaXZlcjo6c2VuZGVyX2xpc3QoKQp7CiAgcmV0dXJu ICZfc2VuZGVyX2ZpcnN0Owp9CgoKCmlubGluZSB2b2lkClJlY2VpdmVyOjpyZXNldF9yZWNlaXZl X3RpbWVvdXQoKQp7CiAgaWYgKF90aW1lb3V0KQogICAgewogICAgICBfdGltZW91dC0+cmVzZXQo KTsKICAgICAgX3RpbWVvdXQgPSAwOwogICAgfQp9CiMgMzgxICJhdXRvL3JlY2VpdmVyLmgiCmlu bGluZSBSZWNlaXZlcjo6UmVjZWl2ZXIoVGhyZWFkX2xvY2sgKnRocmVhZF9sb2NrLAogICAgICAg ICAgICAgICAgICAgU3BhY2VfY29udGV4dCogc3BhY2VfY29udGV4dCkKICA6IENvbnRleHQgKHRo cmVhZF9sb2NrLCBzcGFjZV9jb250ZXh0KQp7fQoKCgoKaW5saW5lIHZvaWQKUmVjZWl2ZXI6OnNl dF9yZWNlaXZlX3JlZ3MoU3lzX2lwY19mcmFtZSogcmVncykKewogIF9yZWNlaXZlX3JlZ3MgPSBy ZWdzOwp9CgoKCgoKCgppbmxpbmUgdm9pZApSZWNlaXZlcjo6cmVzdG9yZV9yZWNlaXZlcl9zdGF0 ZShTZW5kZXIqIHBhcnRuZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXNf aXBjX2ZyYW1lKiByZWdzKQp7CiAgc2V0X3BhcnRuZXIgKHBhcnRuZXIpOwogIHNldF9yZWNlaXZl X3JlZ3MgKHJlZ3MpOwp9CgoKCgoKCgppbmxpbmUgdm9pZApSZWNlaXZlcjo6c2F2ZV9yZWNlaXZl cl9zdGF0ZShTZW5kZXIqKiBvdXRfcGFydG5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFN5c19pcGNfZnJhbWUqKiBvdXRfcmVncykKewogICpvdXRfcGFydG5lciA9IF9wYXJ0bmVy OwogICpvdXRfcmVncyA9IF9yZWNlaXZlX3JlZ3M7Cn0KCgoKCgppbmxpbmUgdm1fb2Zmc2V0X3QK UmVjZWl2ZXI6OnBhZ2Vpbl9yZXF1ZXN0KCkgY29uc3QKewogIHJldHVybiBfcGFnZWluX3JlcXVl c3Q7Cn0KCgoKCgoKaW5saW5lIFRocmVhZCoKUmVjZWl2ZXI6OnBhZ2Vpbl9hcHBsaWNhbnQoKQp7 CiAgcmV0dXJuIF9wYWdlaW5fYXBwbGljYW50Owp9CiMgNDU0ICJhdXRvL3JlY2VpdmVyLmgiCmlu bGluZSB1bnNpZ25lZApSZWNlaXZlcjo6c2V0dXBfcmVjZWl2ZXJfc3RhdGUoU2VuZGVyKiBzZW5k ZXIsIFN5c19pcGNfZnJhbWUqIHJlZ3MpCnsKICBzZXRfcmVjZWl2ZV9yZWdzIChyZWdzKTsKCiAg aWYgKHNlbmRlcikKICAgIHsKICAgICAgc2V0X3BhcnRuZXIgKHNlbmRlcik7CiAgICAgIHJldHVy biBUaHJlYWRfcmVjZWl2aW5nOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgcmV0dXJuIFRocmVh ZF93YWl0aW5nOwogICAgfQp9CiMgNDgxICJhdXRvL3JlY2VpdmVyLmgiCmlubGluZSB2b2lkClJl Y2VpdmVyOjpzZXR1cF9yZWNlaXZlcihTZW5kZXIqIHNlbmRlciwgU3lzX2lwY19mcmFtZSogcmVn cykKewogIHN0YXRlX2FkZCAoc2V0dXBfcmVjZWl2ZXJfc3RhdGUoc2VuZGVyLCByZWdzKSk7Cn0K CgoKaW5saW5lIHZvaWQKUmVjZWl2ZXI6OnNldF9yZWNlaXZlX3RpbWVvdXQodGltZW91dF90ICp0 KQp7CiAgX3RpbWVvdXQgPSB0Owp9CiMgMTUgImF1dG8vdGhyZWFkLmgiIDIKCgoKCgoKCmNsYXNz IHRpbWVvdXRfdDsKY2xhc3MgaXJxX3Q7CmNsYXNzIFJldHVybl9mcmFtZTsKY2xhc3MgU3lzY2Fs bF9mcmFtZTsKY2xhc3MgRW50cnlfZnJhbWU7CmNsYXNzIFN5c19pcGNfZnJhbWU7CgpjbGFzcyB0 cmFwX3N0YXRlOwoKCgpjbGFzcyBUaHJlYWQgOiBwdWJsaWMgUmVjZWl2ZXIsIHB1YmxpYyBTZW5k ZXIKewpwcml2YXRlOgogIFRocmVhZChjb25zdCBUaHJlYWQmKTsKICB2b2lkICpvcGVyYXRvciBu ZXcoc2l6ZV90KTsKCnByb3RlY3RlZDoKCgoKCgogICAgICAgICAgICAgU3BhY2UqIF9zcGFjZTsK ICAgICAgICAgICAgIFRocmVhZF9sb2NrIF90aHJlYWRfbG9jazsKCgogIFRocmVhZCAqX3BhZ2Vy LCAqX3ByZWVtcHRlciwgKl9leHRfcHJlZW1wdGVyOwoKICBUaHJlYWQgKnByZXNlbnRfbmV4dCwg KnByZXNlbnRfcHJldjsKICBpcnFfdCAqX2lycTsKCiAgeDg2X2dhdGUgKl9pZHQ7CiAgdW5zaWdu ZWQgc2hvcnQgX2lkdF9saW1pdDsKCgogIEw0X3Jjdl9kZXNjIF90YXJnZXRfZGVzYzsKICB1bnNp Z25lZCBfcGFnZWluX2Vycm9yX2NvZGU7CgogIHZtX29mZnNldF90IF92bV93aW5kb3cwLCBfdm1f d2luZG93MTsKCiAgam1wX2J1ZiAqX3JlY292ZXJfam1wYnVmOwogIEw0X3RpbWVvdXQgX3BmX3Rp bWVvdXQ7CgoKICB2bV9vZmZzZXRfdCBfbGFzdF9wZl9hZGRyZXNzOwogIHVuc2lnbmVkIF9sYXN0 X3BmX2Vycm9yX2NvZGU7CgogIHVuc2lnbmVkIF9tYWdpYzsKICBzdGF0aWMgY29uc3QgdW5zaWdu ZWQgbWFnaWMgPSAweGYwMDFjMDAxOwoKICBzdGF0aWMgaW50ICgqbmVzdGVkX3RyYXBfaGFuZGxl cikodHJhcF9zdGF0ZSAqc3RhdGUpOwoKCiAgVGhyZWFkIChTcGFjZSogc3BhY2UsIEw0X3VpZCBp ZCk7CgpwdWJsaWM6CgoKICBUaHJlYWQgKFNwYWNlKiBzcGFjZSwgTDRfdWlkIGlkLAogICAgICAg ICAgaW50IGluaXRfcHJpbywgdW5zaWduZWQgc2hvcnQgbWNwKTsKCiAgTXdvcmQgc3lzX2lwYyAo U3lzY2FsbF9mcmFtZSAqcmVncyk7CiAgTXdvcmQgc3lzX2lkX25lYXJlc3QgKFN5c2NhbGxfZnJh bWUgKnJlZ3MpOwogIE13b3JkIHN5c19mcGFnZV91bm1hcCAoU3lzY2FsbF9mcmFtZSAqcmVncyk7 CiAgTXdvcmQgc3lzX3RocmVhZF9zd2l0Y2ggKFN5c2NhbGxfZnJhbWUgKnJlZ3MpOwogIE13b3Jk IHN5c190aHJlYWRfc2NoZWR1bGUgKFN5c2NhbGxfZnJhbWUgKnJlZ3MpOwogIE13b3JkIHN5c190 aHJlYWRfZXhfcmVncyAoU3lzY2FsbF9mcmFtZSAqcmVncyk7CiAgTXdvcmQgc3lzX3Rhc2tfbmV3 IChTeXNjYWxsX2ZyYW1lICpyZWdzKTsKcHJpdmF0ZToKCnByaXZhdGU6CiAgYm9vbCBpcGNfc2hv cnRfY3V0KCBTeXNfaXBjX2ZyYW1lKikgYXNtICgiY2FsbF9pcGNfc2hvcnRfY3V0Iik7CnByaXZh dGU6Cgpwcm90ZWN0ZWQ6CiAgZnJpZW5kIGNsYXNzIGpkYjsKICBmcmllbmQgY2xhc3MgamRiX3Ro cmVhZF9saXN0OwoKcHVibGljOgoKCgoKCgogIHZvaWQgKiBvcGVyYXRvciBuZXcoc2l6ZV90LCB0 aHJlYWRpZF90IGlkKTsKCgoKCiAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqKTsKIyAxMjIg ImF1dG8vdGhyZWFkLmgiCiAgdmlydHVhbCB+VGhyZWFkKCk7CgoKCgoKICBzdGF0aWMgVGhyZWFk KiBsb29rdXAoQ29udGV4dCogYyk7CiMgMTM4ICJhdXRvL3RocmVhZC5oIgogIFNwYWNlX2luZGV4 IHNwYWNlX2luZGV4KCkgY29uc3Q7CgoKCgoKICBTcGFjZV9pbmRleCBjaGllZl9pbmRleCgpIGNv bnN0OwoKCgoKICBTcGFjZSAqIHNwYWNlKCkgY29uc3Q7CgoKCgoKCiAgVGhyZWFkX2xvY2sgKiB0 aHJlYWRfbG9jaygpOwojIDE3MyAiYXV0by90aHJlYWQuaCIKICBib29sIGluaXRpYWxpemUodm1f b2Zmc2V0X3QgZWlwLCB2bV9vZmZzZXRfdCBlc3AsIFRocmVhZCogcGFnZXIsIFRocmVhZCogcHJl ZW1wdGVyLCB2bV9vZmZzZXRfdCAqb19laXAgPSAwLCB2bV9vZmZzZXRfdCAqb19lc3AgPSAwLCBU aHJlYWQqICpvX3BhZ2VyID0gMCwgVGhyZWFkKiAqb19wcmVlbXB0ZXIgPSAwLCB2bV9vZmZzZXRf dCAqb19lZmxhZ3MgPSAwKTsKIyAxODcgImF1dG8vdGhyZWFkLmgiCiAgYm9vbCBzZXRfc2NoZWRf cGFyYW0oTDRfc2NoZWRfcGFyYW0gcGFyYW0sIFRocmVhZCogZXh0X3ByZWVtcHRlciwgTDRfc2No ZWRfcGFyYW0gKm9fcGFyYW0sIFVuc2lnbmVkNjQgKnRpbWUsIFRocmVhZCAqKm9fZXh0X3ByZWVt cHRlciwgU2VuZGVyICoqaXBjcGFydG5lcik7CiMgMTk4ICJhdXRvL3RocmVhZC5oIgogIGJvb2wg cmFpc2VfZXhjZXB0aW9uKHRyYXBfc3RhdGUgKnRzLCB2bV9vZmZzZXRfdCBoYW5kbGVyKTsKIyAy MDggImF1dG8vdGhyZWFkLmgiCiAgYm9vbCBraWxsX3Rhc2soU3BhY2VfaW5kZXggc3VidGFzayk7 CgoKCgogIHVuc2lnbmVkIG5lc3QoKSBjb25zdDsKIyAyMjMgImF1dG8vdGhyZWFkLmgiCiAgdmly dHVhbCB2b2lkIGlwY19yZWNlaXZlcl9yZWFkeSgpOwojIDIzMyAiYXV0by90aHJlYWQuaCIKICBM NF9tc2dkb3BlIGlwY19jb250aW51ZShMNF9tc2dkb3BlIGlwY19jb2RlKTsKCiAgYm9vbCBoYW5k bGVfc2xvd190cmFwKHRyYXBfc3RhdGUgKnRzKTsKIyAyNTAgImF1dG8vdGhyZWFkLmgiCiAgYm9v bCBoYW5kbGVfcGFnZV9mYXVsdCh2bV9vZmZzZXRfdCBwZmEsIHVuc2lnbmVkIGVycm9yX2NvZGUs IHVuc2lnbmVkIGVpcCk7CgogIHZvaWQgc3lzY2FsbF9sb2coU3lzY2FsbF9mcmFtZSAqICwgdW5z aWduZWQgbnVtYmVyLAogIGJvb2wgZW50ZXIsIHVuc2lnbmVkIHJldHZhbCk7CgoKCgoKCiAgTXdv cmQgc3lzX2lwY19sb2coU3lzY2FsbF9mcmFtZSAqaV9yZWdzKTsKCgoKCiAgdW5zaWduZWQgc3lz X2lwY190cmFjZShTeXNjYWxsX2ZyYW1lICppX3JlZ3MpOwoKCiAgdW5zaWduZWQgc3lzX2ZwYWdl X3VubWFwX2xvZyhTeXNjYWxsX2ZyYW1lICpyZWdzKTsKCnByb3RlY3RlZDoKIyAyODIgImF1dG8v dGhyZWFkLmgiCiAgdm9pZCBzZXR1cF9pcGNfd2luZG93KHVuc2lnbmVkIHdpbiwgdm1fb2Zmc2V0 X3QgYWRkcmVzcyk7CgoKCgogIGJvb2wgaW5fcHJlc2VudF9saXN0KCk7CgoKCgoKICB2b2lkIHBy ZXNlbnRfZW5xdWV1ZShUaHJlYWQgKnNpYmxpbmcpOwoKCgoKICB2b2lkIHByZXNlbnRfZGVxdWV1 ZSgpOwoKCgoKICBzdGF0aWMgdm9pZCB1c2VyX2ludm9rZSgpOwoKcHJpdmF0ZToKCgoKCgoKICBi b29sIGtpbGwoKTsKIyAzMjMgImF1dG8vdGhyZWFkLmgiCiAgTXdvcmQgaXBjX3NlbmRfcmVncyhU aHJlYWQqIHJlY2VpdmVyLCBTeXNfaXBjX2ZyYW1lIGNvbnN0ICpzZW5kZXJfcmVncyk7CiMgMzMy ICJhdXRvL3RocmVhZC5oIgogIEw0X21zZ2RvcGUgZG9fc2VuZChUaHJlYWQgKnBhcnRuZXIsIEw0 X3RpbWVvdXQgdCwgU3lzX2lwY19mcmFtZSAqcmVncyk7CiMgMzQxICJhdXRvL3RocmVhZC5oIgog IHZvaWQgcHJlcGFyZV9yZWNlaXZlKFNlbmRlciAqcGFydG5lciwgU3lzX2lwY19mcmFtZSAqcmVn cyk7CiMgMzUzICJhdXRvL3RocmVhZC5oIgogIEw0X21zZ2RvcGUgZG9fcmVjZWl2ZShTZW5kZXIg KnNlbmRlciwgTDRfdGltZW91dCB0LCBTeXNfaXBjX2ZyYW1lICpyZWdzKTsKCgoKCgoKCiAgTDRf bXNnZG9wZSBoYW5kbGVfcGFnZV9mYXVsdF9wYWdlcih2bV9vZmZzZXRfdCBwZmEsIHVuc2lnbmVk IGVycm9yX2NvZGUpOwojIDM3MCAiYXV0by90aHJlYWQuaCIKICBMNF9tc2dkb3BlIGhhbmRsZV9p cGNfcGFnZV9mYXVsdCh2bV9vZmZzZXRfdCBwZmEpOwojIDM4MiAiYXV0by90aHJlYWQuaCIKICBM NF9tc2dkb3BlIGlwY19zZW5kX2ZwYWdlKFRocmVhZCogcmVjZWl2ZXIsIEw0X2ZwYWdlIGZyb21f ZnBhZ2UsIEw0X2ZwYWdlIHRvX2ZwYWdlLCB2bV9vZmZzZXRfdCBvZmZzZXQsIGJvb2wgZmluaXNo KTsKCgoKCgoKICBMNF9tc2dkb3BlIGlwY19maW5pc2goVGhyZWFkKiByZWNlaXZlciwgTDRfbXNn ZG9wZSBuZXdfc3RhdGUpOwojIDM5OSAiYXV0by90aHJlYWQuaCIKICBMNF9tc2dkb3BlIGlwY19w YWdlaW5fcmVxdWVzdChSZWNlaXZlciogcmVjZWl2ZXIsIHZtX29mZnNldF90IGFkZHJlc3MpOwoj IDQxNCAiYXV0by90aHJlYWQuaCIKICBib29sIGdldF9pb3BvcnQodm1fb2Zmc2V0X3QgZWlwLCB0 cmFwX3N0YXRlICogdHMsIHVuc2lnbmVkICogcG9ydCwgdW5zaWduZWQgKiBzaXplKTsKIyA0Mjkg ImF1dG8vdGhyZWFkLmgiCiAgTDRfbXNnZG9wZSBkb19zZW5kX2xvbmcoVGhyZWFkICpwYXJ0bmVy LAogIFN5c19pcGNfZnJhbWUgKmlfcmVncyk7CgogIHN0YXRpYyB2b2lkIGhvb2tfaXBjX3ZlY3Rv cigpOwoKICBzdGF0aWMgdm9pZCByZXN0b3JlX2lwY192ZWN0b3IoKTsKCgoKCiAgdm9pZCBwYWdl X2ZhdWx0X2xvZyh2bV9vZmZzZXRfdCBwZmEsIHVuc2lnbmVkIGVycm9yX2NvZGUsIHVuc2lnbmVk IGVpcCk7CgogIHN0YXRpYyB2b2lkIGhvb2tfdW5tYXBfdmVjdG9yKCk7CgogIHN0YXRpYyB2b2lk IHJlc3RvcmVfdW5tYXBfdmVjdG9yKCk7Cn07CgpleHRlcm4gdW5zaWduZWQgKFRocmVhZDo6KnN5 c2NhbGxfdGFibGVbXSkoU3lzY2FsbF9mcmFtZSAqcmVncyk7CgpleHRlcm4gYm9vbCBsb2dfaXBj OwpleHRlcm4gYm9vbCBsb2dfaXBjX3RvX2J1ZjsKZXh0ZXJuIGJvb2wgbG9nX2lwY19yZXN1bHQ7 CmV4dGVybiBib29sIGxvZ19wYWdlX2ZhdWx0OwpleHRlcm4gYm9vbCBsb2dfcGZfdG9fYnVmOwpl eHRlcm4gYm9vbCBsb2dfdW5tYXA7CmV4dGVybiBib29sIGxvZ191bm1hcF90b19idWY7CmV4dGVy biBib29sIHRyYWNlX2lwYzsKZXh0ZXJuIGJvb2wgc2xvd19pcGM7CgoKCgpUaHJlYWQqIGN1cnJl bnRfdGhyZWFkKCk7CiMgNDcwICJhdXRvL3RocmVhZC5oIgpleHRlcm4gIkMiIGludCB0aHJlYWRf aGFuZGxlX3RyYXAodHJhcF9zdGF0ZSAqc3RhdGUpOwoKZXh0ZXJuICJDIiB2b2lkIHRocmVhZF90 aW1lcl9pbnRlcnJ1cHQodm9pZCk7CgoKCgpleHRlcm4gIkMiIE13b3JkIGRpc3BhdGNoX3N5c2Nh bGwoVGhyZWFkICp0LCBFbnRyeV9mcmFtZSAqcmVncywgdW5zaWduZWQgaW50IG51bWJlcik7Cgp2 b2lkIHRocmVhZF90aW1lcl9pbnRlcnJ1cHRfYXJjaCh2b2lkKTsKCgoKZXh0ZXJuICJDIiB2b2lk IHRocmVhZF90aW1lcl9pbnRlcnJ1cHRfc3RvcCh2b2lkKTsKCgoKCgpleHRlcm4gIkMiIHZvaWQg dGhyZWFkX3RpbWVyX2ludGVycnVwdF9zbG93KHZvaWQpOwojIDUwMCAiYXV0by90aHJlYWQuaCIK ZXh0ZXJuICJDIiBpbnQgdGhyZWFkX3BhZ2VfZmF1bHQoY29uc3Qgdm1fb2Zmc2V0X3QgcGZhLCBj b25zdCB1bnNpZ25lZCBlcnJvcl9jb2RlLCBjb25zdCB1bnNpZ25lZCAsCmNvbnN0IHVuc2lnbmVk ICwKY29uc3QgdW5zaWduZWQgLApjb25zdCB1bnNpZ25lZCAsCmNvbnN0IHVuc2lnbmVkIGVpcCwg Y29uc3QgdW5zaWduZWQgLApjb25zdCB1bnNpZ25lZCBlZmxhZ3MpOwoKZXh0ZXJuICJDIiB2b2lk IHRocmVhZF9zeXNjYWxsX2xvZ19iZWdpbihUaHJlYWQgKnQsIFN5c2NhbGxfZnJhbWUgKnJlZ3Ms IHVuc2lnbmVkIG51bWJlcik7CgpleHRlcm4gIkMiIHZvaWQgdGhyZWFkX3N5c2NhbGxfbG9nX2Vu ZCh1bnNpZ25lZCByZXR2YWwsIFRocmVhZCAqdCwgU3lzY2FsbF9mcmFtZSAqcmVncywgdW5zaWdu ZWQgbnVtYmVyKTsKIyA1MTggImF1dG8vdGhyZWFkLmgiCiMgMSAiLi4vc3JjL2tlcm4vaWEzMi9s b2dkZWZzLmgiIDEKCgoKCgojIDEgImF1dG8vamRiX3RidWYuaCIgMQoKCgoKCgojIDEgImF1dG8v amRiX2t0cmFjZS5oIiAxCiMgMTUgImF1dG8vamRiX2t0cmFjZS5oIgplbnVtIHsKICBMT0dfRVZF TlRfTUFYX0VWRU5UUyA9IDE2LAp9OwoKc3RydWN0IGw0X3RyYWNlYnVmZmVyX3N0YXR1c190CnsK ICBVbnNpZ25lZDMyIHRyYWNlYnVmZmVyMDsKICBVbnNpZ25lZDMyIHNpemUwOwogIFVuc2lnbmVk MzIgdmVyc2lvbjA7CiAgVW5zaWduZWQzMiB0cmFjZWJ1ZmZlcjE7CiAgVW5zaWduZWQzMiBzaXpl MTsKICBVbnNpZ25lZDMyIHZlcnNpb24xOwogIFVuc2lnbmVkMzIgbG9nZXZlbnRzW0xPR19FVkVO VF9NQVhfRVZFTlRTXTsKfTsKCmVudW0gewogIExPR19FVkVOVF9DT05URVhUX1NXSVRDSCA9IDAs CiAgTE9HX0VWRU5UX0lQQ19TSE9SVENVVCA9IDEsCiAgTE9HX0VWRU5UX0lSUV9SQUlTRUQgPSAy LAogIExPR19FVkVOVF9USU1FUl9JUlEgPSAzLAogIExPR19FVkVOVF9USFJFQURfRVhfUkVHUyA9 IDQsCn07CiMgOCAiYXV0by9qZGJfdGJ1Zi5oIiAyCgoKCgoKCmNsYXNzIExvZ19ldmVudDsKY2xh c3MgQ29udGV4dDsKIyAzMyAiYXV0by9qZGJfdGJ1Zi5oIgpjbGFzcyBqZGJfdGJ1Zgp7CnB1Ymxp YzoKICB0eXBlZGVmIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQogICAgewogICAgICB1 bnNpZ25lZCBudW1iZXI7CiAgICAgIHVuc2lnbmVkIGVpcDsKICAgICAgQ29udGV4dCAqY3VycmVu dDsKICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHRzYzsKICAgICAgdW5zaWduZWQgbG9uZyBsb25n IHBtYzsKICAgICAgdW5pb24gX19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAgICAgICB7CiAgICAg ICAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAgICAgICAgICAgewoKICAgICAg ICAgICAgICB1bnNpZ25lZCBlYXgsIGVkeCwgZWJ4LCBlYnA7CiAgICAgICAgICAgICAgVW5zaWdu ZWQ2NCBkZXN0OwogICAgICAgICAgICB9IGlwYzsKICAgICAgICAgIHN0cnVjdCBfX2F0dHJpYnV0 ZV9fKChwYWNrZWQpKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgIHVuc2lnbmVkIGVheCwg ZWR4LCBlYng7CiAgICAgICAgICAgICAgdW5zaWduZWQgb3JpZ19lYnA7CiAgICAgICAgICAgICAg VW5zaWduZWQ2NCBzcmM7CiAgICAgICAgICAgICAgdW5zaWduZWQgcmVmX2V2ZW50OwogICAgICAg ICAgICAgIGNoYXIgaGF2ZV9zZW5kOwogICAgICAgICAgICB9IGlwY19yZXM7CiAgICAgICAgICBz dHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAgICAgICAgICAgewoKICAgICAgICAgICAg ICB1bnNpZ25lZCBsb25nIGxvbmcgc2VuZF90c2M7CiAgICAgICAgICAgICAgVW5zaWduZWQ2NCBz ZW5kX2VzaV9lZGk7CiAgICAgICAgICAgICAgVW5zaWduZWQ2NCByZWN2X2VzaV9lZGk7CiAgICAg ICAgICAgICAgTXdvcmQgZG9wZTsKICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHNlbmRfZGVz YywgcmVjdl9kZXNjOwogICAgICAgICAgICB9IGlwY190cmFjZTsKICAgICAgICAgIHN0cnVjdCBf X2F0dHJpYnV0ZV9fKChwYWNrZWQpKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgIHVuc2ln bmVkIHBmYTsKICAgICAgICAgICAgICB1bnNpZ25lZCBlcnI7CiAgICAgICAgICAgIH0gcGY7CiAg ICAgICAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAgICAgICAgICAgewoKICAg ICAgICAgICAgICBjaGFyIG1zZ1szNV07CiAgICAgICAgICAgIH0ga2U7CiAgICAgICAgICBzdHJ1 Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICB1 bnNpZ25lZCBlYXgsIGVkeCwgZWN4OwogICAgICAgICAgICAgIGNoYXIgbXNnWzIzXTsKICAgICAg ICAgICAgfSBrZV9yZWc7CiAgICAgICAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkK ICAgICAgICAgICAgewoKICAgICAgICAgICAgICBNd29yZCBmcGFnZTsKICAgICAgICAgICAgICB1 bnNpZ25lZCBtYXNrOwogICAgICAgICAgICAgIGJvb2wgcmVzdWx0OwogICAgICAgICAgICB9IHVu bWFwOwogICAgICAgICAgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCiAgICAgICAgICAg IHsKCiAgICAgICAgICAgICAgdW5zaWduZWQgbHRocmVhZDsKICAgICAgICAgICAgICB1bnNpZ25l ZCBvbGRfZXNwOwogICAgICAgICAgICAgIHVuc2lnbmVkIG5ld19lc3A7CiAgICAgICAgICAgICAg dW5zaWduZWQgb2xkX2VpcDsKICAgICAgICAgICAgICB1bnNpZ25lZCBuZXdfZWlwOwogICAgICAg ICAgICB9IGV4X3JlZ3M7CiAgICAgICAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkK ICAgICAgICAgICAgewoKICAgICAgICAgICAgICB1bnNpZ25lZCBhZGRyOwogICAgICAgICAgICAg IHVuc2lnbmVkIGxlbjsKICAgICAgICAgICAgICB1bnNpZ25lZCB2YWx1ZTsKICAgICAgICAgICAg ICB1bnNpZ25lZCBjaGFyIG1vZGU7CiAgICAgICAgICAgIH0gYnA7CiAgICAgICAgICBzdHJ1Y3Qg X19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICB1bnNp Z25lZCBlYXgsIGVicCwgZWN4OwogICAgICAgICAgICAgIFVuc2lnbmVkNjQgZGVzdDsKICAgICAg ICAgICAgICBjaGFyIGlzX2lycSwgc25kX2xzdCwgZHN0X29rLCBkc3RfbGNrOwogICAgICAgICAg ICB9IGlwY19zZmw7CiAgICAgICAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKICAg ICAgICAgICAgewoKICAgICAgICAgICAgICBDb250ZXh0ICpkZXN0OwogICAgICAgICAgICAgIHVu c2lnbmVkIGtlcm5lbF9laXA7CiAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqa2VybmVsX3Nw OwogICAgICAgICAgICB9IGN0eF9zdzsKICAgICAgICB9IG07CiAgICAgIGNoYXIgdHlwZTsKICAg IH0gVGJfZW50cnk7CgoKICBzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChyZWdwYXJtKDMpKSkg KCppbml0X3BtYykodW5zaWduZWQgZXZlbnQsIGludCB1c2VyLCBpbnQga2VybmVsKTsKCiAgc3Rh dGljIHZvaWQgX19hdHRyaWJ1dGVfXygocmVncGFybSgzKSkpICgqcmVhZF9wbWMpKFRiX2VudHJ5 ICp0YmUpOwoKICBzdGF0aWMgTG9nX2V2ZW50ICogY29uc3QgbG9nX2V2ZW50c1tdOwoKcHJpdmF0 ZToKICBzdGF0aWMgVGJfZW50cnkgKnRidWY7CiAgc3RhdGljIFRiX2VudHJ5ICp0YnVmX2FjdDsK ICBzdGF0aWMgbDRfdHJhY2VidWZmZXJfc3RhdHVzX3QgKnN0YXR1czsKICBzdGF0aWMgdW5zaWdu ZWQgZW50cmllczsKICBzdGF0aWMgdW5zaWduZWQgbnVtYmVyOwoKICBzdGF0aWMgaW50IHBlcmZf dXNlcjsKICBzdGF0aWMgaW50IHBlcmZfa2VybmVsOwogIHN0YXRpYyB1bnNpZ25lZCBwZXJmX2V2 ZW50OwoKICBzdGF0aWMgY29uc3QgY2hhciAqcGVyZl90eXBlOwogIHN0YXRpYyBpbnQgaGF2ZV90 c2M7CgpwdWJsaWM6CgogIHN0YXRpYyB2b2lkIGluaXQodm9pZCk7CgogIHN0YXRpYyBpbnQgZ2V0 X2hhdmVfdHNjKCk7CgogIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRfcGVyZl90eXBlKCk7CgoKICBz dGF0aWMgaW50IGdldF9wZXJmX21vZGUoY29uc3QgY2hhciAqKnR5cGUsIGNvbnN0IGNoYXIgKipt b2RlLCB1bnNpZ25lZCAqZXZlbnQsIGludCAqdXNlciwgaW50ICprZXJuZWwpOwoKCiAgc3RhdGlj IHZvaWQgaW5pdF9wZXJmKHVuc2lnbmVkIGV2ZW50LCBpbnQgdXNlciwgaW50IGtlcm5lbCk7CgoK ICBzdGF0aWMgdm9pZCBjbGVhcl90YnVmKCk7CgoKICBzdGF0aWMgamRiX3RidWY6OlRiX2VudHJ5 KiBuZXdfZW50cnkoKTsKCgogIHN0YXRpYyB2b2lkIGNvbW1pdF9lbnRyeSgpOwoKCiAgc3RhdGlj IGludCBnZXRfZW50cmllcygpOwoKCiAgc3RhdGljIGludCBnZXRfdGhyZWFkX2VpcChpbnQgZV9u ciwgTDRfdWlkICp0aWQsIHVuc2lnbmVkICplaXApOwoKICBzdGF0aWMgaW50IGdldF9ldmVudChp bnQgZV9uciwgdW5zaWduZWQgKm51bWJlciwgdW5zaWduZWQgbG9uZyBsb25nICp0c2MsIHVuc2ln bmVkIGxvbmcgbG9uZyAqcG1jKTsKCiAgc3RhdGljIHVuc2lnbmVkIGdldF9yZWZfZXZlbnQoaW50 IGVfbnIsIGNoYXIgKnR5cGUpOwoKICBzdGF0aWMgaW50IGdldF9kaWZmX3RzYyhpbnQgZV9uciwg dW5zaWduZWQgbG9uZyBsb25nICpkZWx0YSk7CgogIHN0YXRpYyBpbnQgZ2V0X2RpZmZfcG1jKGlu dCBlX25yLCB1bnNpZ25lZCBsb25nIGxvbmcgKmRlbHRhKTsKCiAgc3RhdGljIHZvaWQgcHJpbnRf ZW50cnkoaW50IGVfbnIsIGNoYXIgKmJ1ZiwgaW50IG1heGxlbik7CgogIHN0YXRpYyB2b2lkIHBy aW50X2VudHJ5KFRiX2VudHJ5ICplLCBjaGFyICpidWYsIGludCBtYXhsZW4pOwoKcHJpdmF0ZToK ICBzdGF0aWMgaW50IGV2ZW50X3ZhbGlkKHVuc2lnbmVkIGVfbnIpOwoKICBzdGF0aWMgamRiX3Ri dWY6OlRiX2VudHJ5KiBsb29rdXAoaW50IGVfbnIpOwoKICBzdGF0aWMgdm9pZCBteV9zbnByaW50 ZihjaGFyICoqYnVmLCBpbnQgKm1heGxlbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOwp9OwoK Y2xhc3MgbG9nX3BhdGNoX3QKewpwdWJsaWM6CiAgbG9nX3BhdGNoX3QgKm5leHQ7Cgpwcml2YXRl OgogIHR5cGVkZWYgdW5zaWduZWQgY2hhciBsb2dfcGF0Y2hfY29kZV90WzVdOwogIGxvZ19wYXRj aF9jb2RlX3QgKm9yaWdfY29kZTsKICBsb2dfcGF0Y2hfY29kZV90IHNhdmVfY29kZTsKCnB1Ymxp YzoKICBleHBsaWNpdCBsb2dfcGF0Y2hfdCh2b2lkICpjb2RlKTsKCiAgdm9pZCBlbmFibGUoYm9v bCBlbmFibGUpOwoKICBib29sIGVuYWJsZWQodm9pZCk7Cn07CgpjbGFzcyBMb2dfZXZlbnQKewog IGNvbnN0IGNoYXIgKmV2ZW50X25hbWU7CiAgbG9nX3BhdGNoX3QgKnBhdGNoOwogIGludCBldmVu dF90eXBlOwoKcHVibGljOgogIGV4cGxpY2l0IExvZ19ldmVudChjb25zdCBjaGFyICpuYW1lLCBp bnQgdHlwZSwgaW50IGNvdW50LCBsb2dfcGF0Y2hfdCAqbHAsIC4uLik7CgoKICB2b2lkIGVuYWJs ZShib29sIGVuYWJsZSk7CgoKICBib29sIGVuYWJsZWQodm9pZCk7CgoKICBjb25zdCBjaGFyKiBn ZXRfbmFtZSh2b2lkKTsKCgogIGludCBnZXRfdHlwZSh2b2lkKTsKfTsKIyAyOTAgImF1dG8vamRi X3RidWYuaCIKaW5saW5lIGludApqZGJfdGJ1Zjo6Z2V0X2hhdmVfdHNjKCkKewogIHJldHVybiBo YXZlX3RzYzsKfQoKCgppbmxpbmUgY29uc3QgY2hhcioKamRiX3RidWY6OmdldF9wZXJmX3R5cGUo KQp7CiAgcmV0dXJuIHBlcmZfdHlwZTsKfQoKCgoKaW5saW5lIGludApqZGJfdGJ1Zjo6Z2V0X2Vu dHJpZXMoKQp7CiAgcmV0dXJuIGVudHJpZXM7Cn0KCgoKCmlubGluZSBjb25zdCBjaGFyKgpMb2df ZXZlbnQ6OmdldF9uYW1lKHZvaWQpCnsKICByZXR1cm4gZXZlbnRfbmFtZTsKfQoKCgoKaW5saW5l IGludApMb2dfZXZlbnQ6OmdldF90eXBlKHZvaWQpCnsKICByZXR1cm4gZXZlbnRfdHlwZTsKfQoj IDcgIi4uL3NyYy9rZXJuL2lhMzIvbG9nZGVmcy5oIiAyCiMgNTE5ICJhdXRvL3RocmVhZC5oIiAy CiMgNTM0ICJhdXRvL3RocmVhZC5oIgppbmxpbmUgdm9pZCAqClRocmVhZDo6b3BlcmF0b3IgbmV3 KHNpemVfdCwgdGhyZWFkaWRfdCBpZCkKewoKCgogIHJldHVybiBzdGF0aWNfY2FzdDx2b2lkKj4o aWQubG9va3VwKCkpOwp9CgoKCgoKCgppbmxpbmUgVGhyZWFkKgpUaHJlYWQ6Omxvb2t1cChDb250 ZXh0KiBjKQp7CiAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VGhyZWFkKj4oYyk7Cn0KIyA1NjQg ImF1dG8vdGhyZWFkLmgiCmlubGluZSBTcGFjZV9pbmRleCBUaHJlYWQ6OnNwYWNlX2luZGV4KCkg Y29uc3QKeyByZXR1cm4gU3BhY2VfaW5kZXgoaWQoKS50YXNrKCkpOyB9CgoKCgoKCmlubGluZSBT cGFjZV9pbmRleCBUaHJlYWQ6OmNoaWVmX2luZGV4KCkgY29uc3QKeyByZXR1cm4gU3BhY2VfaW5k ZXgoaWQoKS5jaGllZigpKTsgfQoKCgoKCgoKaW5saW5lIFNwYWNlICoKVGhyZWFkOjpzcGFjZSgp IGNvbnN0CnsKICByZXR1cm4gX3NwYWNlOwp9CiMgNTk0ICJhdXRvL3RocmVhZC5oIgppbmxpbmUg VGhyZWFkX2xvY2sgKgpUaHJlYWQ6OnRocmVhZF9sb2NrKCkKewogIHJldHVybiAmX3RocmVhZF9s b2NrOwp9CgoKCgoKCmlubGluZSB1bnNpZ25lZCBUaHJlYWQ6Om5lc3QoKSBjb25zdAp7IHJldHVy biBpZCgpLm5lc3QoKTsgfQojIDYyMSAiYXV0by90aHJlYWQuaCIKaW5saW5lIHZvaWQKVGhyZWFk OjpzZXR1cF9pcGNfd2luZG93KHVuc2lnbmVkIHdpbiwgdm1fb2Zmc2V0X3QgYWRkcmVzcykKewog IGlmICh3aW4gPT0gMCkKICAgIHsKICAgICAgaWYgKF92bV93aW5kb3cwICE9IGFkZHJlc3MpCiAg ICAgICAgewogICAgICAgICAgX3ZtX3dpbmRvdzAgPSBhZGRyZXNzOwogICAgICAgICAga21lbTo6 dGxiX2ZsdXNoKCk7CiAgICAgICAgfQogICAgfQogIGVsc2UKICAgIHsKICAgICAgaWYgKF92bV93 aW5kb3cxICE9IGFkZHJlc3MpCiAgICAgICAgewogICAgICAgICAgX3ZtX3dpbmRvdzEgPSBhZGRy ZXNzOwogICAgICAgICAga21lbTo6dGxiX2ZsdXNoKCk7CiAgICAgICAgfQogICAgfQp9CgoKCgoK CmlubGluZSBib29sClRocmVhZDo6aW5fcHJlc2VudF9saXN0KCkKewogIHJldHVybiBwcmVzZW50 X25leHQ7Cn0KCgoKCgoKCmlubGluZSB2b2lkClRocmVhZDo6cHJlc2VudF9lbnF1ZXVlKFRocmVh ZCAqc2libGluZykKewogIExvY2tfZ3VhcmQ8Q3B1X2xvY2s+IGd1YXJkICgmY3B1X2xvY2spOwoK ICBpZiAoISBpbl9wcmVzZW50X2xpc3QoKSkKICAgIHsKICAgICAgcHJlc2VudF9uZXh0ID0gc2li bGluZy0+cHJlc2VudF9uZXh0OwogICAgICBwcmVzZW50X3ByZXYgPSBzaWJsaW5nOwogICAgICBz aWJsaW5nLT5wcmVzZW50X25leHQgPSB0aGlzOwogICAgICBwcmVzZW50X25leHQtPnByZXNlbnRf cHJldiA9IHRoaXM7CiAgICB9Cn0KCgoKCgoKaW5saW5lIHZvaWQKVGhyZWFkOjpwcmVzZW50X2Rl cXVldWUoKQp7CiAgTG9ja19ndWFyZDxDcHVfbG9jaz4gZ3VhcmQgKCZjcHVfbG9jayk7CgogIGlm IChpbl9wcmVzZW50X2xpc3QoKSkKICAgIHsKICAgICAgcHJlc2VudF9wcmV2LT5wcmVzZW50X25l eHQgPSBwcmVzZW50X25leHQ7CiAgICAgIHByZXNlbnRfbmV4dC0+cHJlc2VudF9wcmV2ID0gcHJl c2VudF9wcmV2OwogICAgICBwcmVzZW50X25leHQgPSAwOwogICAgfQp9CgoKCgoKCmlubGluZSBU aHJlYWQqCmN1cnJlbnRfdGhyZWFkKCkKewogIHJldHVybiBUaHJlYWQ6Omxvb2t1cChjdXJyZW50 ICgpKTsKfQoKCgppbmxpbmUgdm9pZCB0aHJlYWRfdGltZXJfaW50ZXJydXB0X2FyY2godm9pZCkK ewoKCgogIGlmIChDb25maWc6OnNjaGVkdWxpbmdfdXNpbmdfcGl0KQogICAgICBkbyB7IGFzbSB2 b2xhdGlsZSAoIi5nbG9ibCAgIiJsb2dfdGltZXJfaXJxIiIJCQlcblx0IiAiLmdsb2JsICBwYXRj aF8iImxvZ190aW1lcl9pcnEiIgkJXG5cdCIgInBhdGNoXyIibG9nX3RpbWVyX2lycSIiOgkJCVxu XHQiICJqbXAgICAgICIibG9nX3RpbWVyX2lycSIiCQkJXG5cdCIgIjE6CQkJCQlcblx0IiAiLnRl eHQgICAxCQkJCVxuXHQiICIiImxvZ190aW1lcl9pcnEiIjoJCQkJXG5cdCIpOyB7IGpkYl90YnVm OjpUYl9lbnRyeSAqdGJlID0gamRiX3RidWY6Om5ld19lbnRyeSgpOyB0YmUtPnR5cGUgPSAyOyB0 YmUtPmN1cnJlbnQgPSBjdXJyZW50KCk7IHRiZS0+ZWlwID0gdGJlLT5jdXJyZW50LT5yZWdzKCkt PmVpcDsgdGJlLT5tLmlwYy5lYXggPSB0YmUtPm0uaXBjLmVicCA9IDA7IHRiZS0+bS5pcGMuZGVz dCA9IDAgKyAxOyBqZGJfdGJ1Zjo6Y29tbWl0X2VudHJ5KCk7IH0gYXNtIHZvbGF0aWxlICgiam1w ICAgICAxYgkJCQlcblx0IiAiLnByZXZpb3VzCQkJCVxuXHQiIDogOiA6ICJlYXgiLCJlYngiLCJl Y3giLCJlZHgiLCJlc2kiLCAiZWRpIiwibWVtb3J5Iik7IH0gd2hpbGUgKDApOwogIGVsc2UKICAg ICAgZG8geyBhc20gdm9sYXRpbGUgKCIuZ2xvYmwgICIibG9nX3RpbWVyX2lycSIiCQkJXG5cdCIg Ii5nbG9ibCAgcGF0Y2hfIiJsb2dfdGltZXJfaXJxIiIJCVxuXHQiICJwYXRjaF8iImxvZ190aW1l cl9pcnEiIjoJCQlcblx0IiAiam1wICAgICAiImxvZ190aW1lcl9pcnEiIgkJCVxuXHQiICIxOgkJ CQkJXG5cdCIgIi50ZXh0ICAgMQkJCQlcblx0IiAiIiJsb2dfdGltZXJfaXJxIiI6CQkJCVxuXHQi KTsgeyBqZGJfdGJ1Zjo6VGJfZW50cnkgKnRiZSA9IGpkYl90YnVmOjpuZXdfZW50cnkoKTsgdGJl LT50eXBlID0gMjsgdGJlLT5jdXJyZW50ID0gY3VycmVudCgpOyB0YmUtPmVpcCA9IHRiZS0+Y3Vy cmVudC0+cmVncygpLT5laXA7IHRiZS0+bS5pcGMuZWF4ID0gdGJlLT5tLmlwYy5lYnAgPSAwOyB0 YmUtPm0uaXBjLmRlc3QgPSA4ICsgMTsgamRiX3RidWY6OmNvbW1pdF9lbnRyeSgpOyB9IGFzbSB2 b2xhdGlsZSAoImptcCAgICAgMWIJCQkJXG5cdCIgIi5wcmV2aW91cwkJCQlcblx0IiA6IDogOiAi ZWF4IiwiZWJ4IiwiZWN4IiwiZWR4IiwiZXNpIiwgImVkaSIsIm1lbW9yeSIpOyB9IHdoaWxlICgw KTsKCiAgVGltZXI6OmFja25vd2xlZGdlKCk7CgoKCgp9CiMgMTggImF1dG8vcHJvZmlsZV9pLmgi IDIKCiMgMSAiYXV0by9waXQuaCIgMQojIDEwICJhdXRvL3BpdC5oIgpjbGFzcyBQaXQKewpwdWJs aWM6CiAgc3RhdGljIHZvaWQgaW5pdCggdW5zaWduZWQgcmF0ZSApOwogIHN0YXRpYyB2b2lkIGRv bmUoKTsKICBzdGF0aWMgdm9pZCBzZXRfZnJlcV9zbG93KCk7CiAgICBzdGF0aWMgdm9pZCBzZXRf ZnJlcV9ub3JtYWwoKTsKfTsKIyAzNiAiYXV0by9waXQuaCIKaW5saW5lIHZvaWQgUGl0Ojppbml0 KCB1bnNpZ25lZCByYXRlICkKewoKICBJbzo6b3V0OF9wKDB4MzQsIDB4NDMpOwoKCiAgdW5zaWdu ZWQgdCA9IDExOTMxODAgLyByYXRlOwogIElvOjpvdXQ4X3AodCAmIDB4ZmYsMHg0MCk7CiAgSW86 Om91dDhfcCgodCA+PiA4KSAmIDB4ZmYsMHg0MCk7CgoKICBQaWM6OmVuYWJsZSgwKTsKCn0KCgoK aW5saW5lIHZvaWQgUGl0OjpzZXRfZnJlcV9zbG93KCkKewoKICBJbzo6b3V0OF9wKDB4MzQsIDB4 NDMpOwoKCiAgdW5zaWduZWQgdCA9IDU5NjU5OwogIElvOjpvdXQ4X3AodCAmIDB4ZmYsMHg0MCk7 CiAgSW86Om91dDhfcCgodCA+PiA4KSAmIDB4ZmYsMHg0MCk7Cn0KCgoKaW5saW5lIHZvaWQgUGl0 OjpzZXRfZnJlcV9ub3JtYWwoKQp7CgogIElvOjpvdXQ4X3AoMHgzNCwweDQzKTsKCgogIHVuc2ln bmVkIHQgPSAxMTkzMTgwIC8gMTAwMDsKICBJbzo6b3V0OF9wKHQgJiAweGZmLDB4NDApOwogIElv OjpvdXQ4X3AoKHQgPj4gOCkgJiAweGZmLDB4NDApOwp9CiMgMjAgImF1dG8vcHJvZmlsZV9pLmgi IDIKIyA1ICJhdXRvL3Byb2ZpbGUuY2MiIDIKIyAzMyAiLi4vc3JjL2tlcm4vaWEzMi9wcm9maWxl LmNwcCIKc3RhdGljIHZvaWQKZHVtcF9pZl9hY3RpdmUoKTsKIyAyNyAiLi4vc3JjL2tlcm4vaWEz Mi9wcm9maWxlLmNwcCIKCnVuc2lnbmVkIGxvbmcgcHJvZmlsZTo6dGlja3MgPSAwOwojIDI5ICIu Li9zcmMva2Vybi9pYTMyL3Byb2ZpbGUuY3BwIgpib29sIHByb2ZpbGU6OmV4aXQgPSBmYWxzZTsK IyAzMCAiLi4vc3JjL2tlcm4vaWEzMi9wcm9maWxlLmNwcCIKCnN0YXRpYyBib29sIHByb2ZpbGVf YWN0aXZlID0gZmFsc2U7CiMgMzIgIi4uL3NyYy9rZXJuL2lhMzIvcHJvZmlsZS5jcHAiCgpzdGF0 aWMgdm9pZApkdW1wX2lmX2FjdGl2ZSgpCnsKICBpZiAocHJvZmlsZV9hY3RpdmUpCiAgICBfbWNs ZWFudXAoKTsKfQojIDM5ICIuLi9zcmMva2Vybi9pYTMyL3Byb2ZpbGUuY3BwIgoKCgoKCgp2b2lk CnByb2ZpbGU6OmluaXQoKQp7CiAgYXRleGl0KGR1bXBfaWZfYWN0aXZlKTsKCgoKCgoKfQojIDU2 ICIuLi9zcmMva2Vybi9pYTMyL3Byb2ZpbGUuY3BwIgoKCnZvaWQKcHJvZmlsZTo6c3RhcnQoKQp7 CiAgaWYgKCEgcHJvZmlsZV9hY3RpdmUpCiAgICB7CiAgICAgIG1vbnN0YXJ0dXAoJl9zdGFydCwg Jl9lbmQsIENvbmZpZzo6cHJvZmlsaW5nX3JhdGUpOwogICAgICBwcm9maWxlX2FjdGl2ZSA9IHRy dWU7CgogICAgICBQaXQ6OmluaXQoQ29uZmlnOjpwcm9maWxpbmdfcmF0ZSk7CiAgICAgIFBpYzo6 ZW5hYmxlKENvbmZpZzo6cHJvZmlsZV9pcnEpOwogICAgfQp9CiMgNzAgIi4uL3NyYy9rZXJuL2lh MzIvcHJvZmlsZS5jcHAiCgoKdm9pZApwcm9maWxlOjpzdG9wKCkKewogIGlmIChwcm9maWxlX2Fj dGl2ZSkKICAgIHsKICAgICAgUGljOjpkaXNhYmxlKENvbmZpZzo6cHJvZmlsZV9pcnEpOwoKICAg ICAgbW9uY29udHJvbCgwKTsKICAgICAgcHJvZmlsZV9hY3RpdmUgPSBmYWxzZTsKICAgIH0KfQoj IDgzICIuLi9zcmMva2Vybi9pYTMyL3Byb2ZpbGUuY3BwIgoKCnZvaWQKcHJvZmlsZTo6c3RvcF9h bmRfZHVtcCgpCnsKICBpZiAocHJvZmlsZV9hY3RpdmUpCiAgICB7CiAgICAgIFBpYzo6ZGlzYWJs ZShDb25maWc6OnByb2ZpbGVfaXJxKTsKCiAgICAgIF9tY2xlYW51cCgpOwogICAgICBwcm9maWxl X2FjdGl2ZSA9IGZhbHNlOwogICAgfQp9CiMgOTYgIi4uL3NyYy9rZXJuL2lhMzIvcHJvZmlsZS5j cHAiCiMgMTA3ICIuLi9zcmMva2Vybi9pYTMyL3Byb2ZpbGUuY3BwIgoKCgppbmxpbmUgdm9pZApw cm9maWxlOjpoYW5kbGVfcHJvZmlsZV9pbnRlcnJ1cHQodm1fb2Zmc2V0X3QgcGMpCnsKCgogIFBp Yzo6ZGlzYWJsZV9sb2NrZWQoQ29uZmlnOjpwcm9maWxlX2lycSk7CiAgUGljOjphY2tub3dsZWRn ZV9sb2NrZWQoQ29uZmlnOjpwcm9maWxlX2lycSk7CiAgUGljOjplbmFibGVfbG9ja2VkKENvbmZp Zzo6cHJvZmlsZV9pcnEpOwoKICB0aWNrcysrOwoKICB2bV9zaXplX3QgaTsKCiAgaWYgKCEgcHJf c2NhbGUpCiAgICByZXR1cm47CgogIGlmIChwYyA8IHByX29mZgogICAgICB8fCAoaSA9ICgodm1f b2Zmc2V0X3QpKCgodW5zaWduZWQgbG9uZyBsb25nKSgocGMpIC0gKHByX29mZikpICogKHVuc2ln bmVkIGxvbmcgbG9uZykoKHByX3NjYWxlKSkpID4+IDE2KSAmIH4xKSkgPj0gcHJfc2l6ZSkKICAg IHJldHVybjsKCiAgKnJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihwcl9iYXNlICsg aSkgKz0gMTsKCiAgaWYgKGV4aXQpCiAgICA6OmV4aXQoMCk7Cn0KIyAxMzUgIi4uL3NyYy9rZXJu L2lhMzIvcHJvZmlsZS5jcHAiCgpleHRlcm4gIkMiIHZvaWQKcHJvZmlsZV9pbnRlcnJ1cHQodm1f b2Zmc2V0X3QgcGMpCnsKICBwcm9maWxlOjpoYW5kbGVfcHJvZmlsZV9pbnRlcnJ1cHQocGMpOwp9 CiMgMTQxICIuLi9zcmMva2Vybi9pYTMyL3Byb2ZpbGUuY3BwIgoKZXh0ZXJuICJDIgp2b2lkIHBy b2ZpbGVfbWNvdW50X3dyYXAodW5zaWduZWQgc2hvcnQgKmZyb21wY2luZGV4LCBjaGFyICpzZWxm cGMgKQp7CgoKICBzdGF0aWMgYm9vbCBvdmVycnVuID0gZmFsc2U7CiAgaWYgKCEgb3ZlcnJ1bikK ICAgIHsKICAgICAgdm1fb2Zmc2V0X3Qgc3A7CiAgICAgIGFzbSgibW92bCAlJWVzcCwgJTAiIDog Ij1yIiAoc3ApKTsKICAgICAgaWYgKChzcCAmIDB4ZjgwMDAwMDApID09IGttZW06Om1lbV90Y2Jz CiAgICAgICAgICAmJiAoKHZtX29mZnNldF90KWN1cnJlbnQoKSkgKyBzaXplb2YoVGhyZWFkKSAr IDB4MjAgPiBzcCkKICAgICAgICB7CiAgICAgICAgICBvdmVycnVuID0gdHJ1ZTsKICAgICAgICAg IHBhbmljKCJzdGFjayBvdmVycnVuOiBjdXJyZW50PTB4JXgsIGVzcD0weCV4IiwKICAgICAgICAg ICAgICAgICh2bV9vZmZzZXRfdCljdXJyZW50KCksIHNwKTsKICAgICAgICB9CiAgICB9CgogIF9f bWNvdW50X2ludGVybmFsIChmcm9tcGNpbmRleCwgc2VsZnBjKTsKfQojIDE2MyAiLi4vc3JjL2tl cm4vaWEzMi9wcm9maWxlLmNwcCIKIyAxNzQgIi4uL3NyYy9rZXJuL2lhMzIvcHJvZmlsZS5jcHAi CiMgMTc1ICIuLi9zcmMva2Vybi9pYTMyL3Byb2ZpbGUuY3BwIgoKYXNtKCIucDJhbGlnbiAiICIy IiAiOyAuZ2xvYmwgbWNvdW50OyBtY291bnQ6IgogICAgInB1c2hsICVlYXgJCQlcblx0IgogICAg InB1c2hsICVlY3gJCQlcblx0IgogICAgInB1c2hsICVlZHgJCQlcblx0IgoKICAgICJtb3ZsIDEy KCVlc3ApLCAlZWF4CVxuXHQiCiAgICAibW92bCA0KCVlYnApLCAlZWN4CQlcblx0IgogICAgInB1 c2hsICVlYXgJCQlcblx0IgogICAgInB1c2hsICVlY3gJCQlcblx0IgoKICAgICJjYWxsICIgInBy b2ZpbGVfbWNvdW50X3dyYXAiICJcblx0IgogICAgImFkZGwgJDgsJWVzcAkJXG5cdCIKCiAgICAi cG9wbCAlZWR4CQkJXG5cdCIKICAgICJwb3BsICVlY3gJCQlcblx0IgogICAgInBvcGwgJWVheAkJ CVxuXHQiCiAgICAicmV0Iik7Cg==
reply other threads:[~2003-02-04 13:46 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20030204134531.16954.qmail@sources.redhat.com \ --to=adam@os.inf.tu-dresden.de \ --cc=gcc-gnats@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).