This is the mail archive of the gcc-prs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

optimization/9752: gcc generates bad code when -fgcse or -frerun-cse-after-loop used


>Number:         9752
>Category:       optimization
>Synopsis:       gcc generates bad code when -fgcse or -frerun-cse-after-loop used
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          ice-on-legal-code
>Submitter-Id:   net
>Arrival-Date:   Wed Feb 19 04:16:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:     Aaron Williams
>Release:        g++ 3.2.2
>Organization:
>Environment:
Sparc Sun Solaris 2.7, 32-bit environment
>Description:
When I compile ui.cpp with -O2 as part of KDE in kdeaddons-3.1/noatun-plugins/tippercanoe/ I get link errors:

ld: warning: relocation error: R_SPARC_32: file ui.o: symbol .LLC23:
        external symbolic relocation against non-allocatable section .stab;
        cannot be processed at runtime: relocation ignored
ld: warning: relocation error: R_SPARC_32: file ui.o: symbol .LLC86:
        external symbolic relocation against non-allocatable section .stab;
        cannot be processed at runtime: relocation ignored
Undefined                       first referenced
 symbol                             in file
.LLC86                              ui.o
.LLC23                              ui.o
ld: fatal: Symbol referencing errors. No output written to noatuntippecanoe.bin
collect2: ld returned 1 exit status
*** Error code 1

According to the .s file, the following parameters were used for compiling:

! GNU C++ version 3.2.2 (sparc-sun-solaris2.7)
!	compiled by GNU C version 2.95.3 20010315 (release).
! options passed:  -I. -I. -I../.. -I/tools/kde/3.1gcc/include
! -I/tools/qt/qt-3.1.1gcc/include -I/tools/qt/share/include
! -I/tools/qt/share/include -I/tools/qt/share/include/SDL
! -I/tools/qt/share/include -iprefix -D__GNUC__=3 -D__GNUC_MINOR__=2
! -D__GNUC_PATCHLEVEL__=2 -D__GXX_ABI_VERSION=102 -Dsparc -Dsun -Dunix
! -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME -D__sparc__ -D__sun__
! -D__unix__ -D__svr4__ -D__SVR4 -D__PRAGMA_REDEFINE_EXTNAME -D__sparc
! -D__sun -D__unix -Asystem=unix -Asystem=svr4 -D__OPTIMIZE__
! -D__STDC_HOSTED__=1 -D_XOPEN_SOURCE=500 -D_LARGEFILE_SOURCE=1
! -D_LARGEFILE64_SOURCE=1 -D__EXTENSIONS__ -D__SIZE_TYPE__=unsigned int
! -D__PTRDIFF_TYPE__=int -D__WCHAR_TYPE__=long int -D__WINT_TYPE__=long int
! -D__GCC_NEW_VARARGS__ -Acpu=sparc -Amachine=sparc -DHAVE_CONFIG_H
! -D_REENTRANT -DQT_THREAD_SUPPORT -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS
! -DUSE_SOLARIS -DSVR4 -DNDEBUG -DNO_DEBUG -DQT_CLEAN_NAMESPACE
! -DQT_NO_COMPAT -DQT_NO_ASCII_CAST -D__GNUG__=3 -D__DEPRECATED -g -O2
! -Wnon-virtual-dtor -Wno-long-long -Wundef -Wall -W -Wpointer-arith
! -Wmissing-prototypes -Wwrite-strings -pedantic -fno-exceptions
! -fno-check-new -fverbose-asm
! options enabled:  -fdefer-pop -fomit-frame-pointer
! -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
! -fexpensive-optimizations -fthread-jumps -fstrength-reduce -fpeephole
! -fforce-mem -ffunction-cse -fkeep-static-consts -fcaller-saves
! -fpcc-struct-return -fdelayed-branch -fgcse -fgcse-lm -fgcse-sm
! -frerun-cse-after-loop -frerun-loop-opt -fdelete-null-pointer-checks
! -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec
! -fbranch-count-reg -freorder-blocks -fcprop-registers -fcommon
! -fverbose-asm -fgnu-linker -fregmove -foptimize-register-move
! -fargument-alias -fstrict-aliasing -fmerge-constants -fident -fpeephole2
! -fguess-branch-probability -fmath-errno -ftrapping-math

If instead of -O2 I use -O1 and all of the aboce -fxxx options except -fgcse and -frerun-cse-after-loop then everything links fine.

Looking at the assembly code, I see:


.LLC11:
	.asciz	"mode"
	.align 8
.LLC12:
	.asciz	"diamonds"
	.align 8
.LLC13:
	.asciz	"brightness"
	.align 8
.LLC15:
	.asciz	"starsize"
	.align 8
.LLC17:
	.asciz	"FGRed"
	.align 8
.LLC19:
	.asciz	"FGgreen"
	.align 8
.LLC21:
	.asciz	"BGRed"
	.align 8
.LLC22:
	.asciz	"BGGreen"
	.align 8
.LLC18:
	.long	0
	.long	0
	.align 8
.LLC20:
	.long	1072693248
	.long	0
	.align 8
.LLC24:
	.long	1073086464
	.long	0
	.align 8
.LLC25:
	.long	1068708659
	.long	858993459
	.align 8

Searching for .LLC23 I see the following:
...
        .stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC23
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB24-_ZN9InterfaceC2Ev
	.stabn	224,0,0,.LLBE24-_ZN9InterfaceC2Ev
	.stabs	"_am:r(0,1)",64,0,177,16
	.stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC23
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB27-_ZN9InterfaceC2Ev
	.stabn	224,0,0,.LLBE27-_ZN9InterfaceC2Ev
	.stabs	"_am:r(0,1)",64,0,177,16
	.stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC23
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB29-_ZN9InterfaceC2Ev
	.stabn	224,0,0,.LLBE29-_ZN9InterfaceC2Ev
	.stabs	"_am:r(0,1)",64,0,177,16
	.stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC23
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB32-_ZN9InterfaceC2Ev
	.stabn	224,0,0,.LLBE32-_ZN9InterfaceC2Ev
	.stabs	"_am:r(0,1)",64,0,177,16
	.stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC23
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB34-_ZN9InterfaceC2Ev
...
and .LLC86 I see:

	.stabs	"_x:V(0,15)",38,0,177,.LLC86
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB201-_ZN9InterfaceC1Ev
	.stabn	224,0,0,.LLBE201-_ZN9InterfaceC1Ev
	.stabs	"_am:r(0,1)",64,0,177,16
	.stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC86
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB204-_ZN9InterfaceC1Ev
	.stabn	224,0,0,.LLBE204-_ZN9InterfaceC1Ev
	.stabs	"_am:r(0,1)",64,0,177,16
	.stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC86
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB206-_ZN9InterfaceC1Ev
	.stabn	224,0,0,.LLBE206-_ZN9InterfaceC1Ev
	.stabs	"_am:r(0,1)",64,0,177,16
	.stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC86
	.stabs	"_width:r(0,15)",64,0,177,34
	.stabn	192,0,0,.LLBB209-_ZN9InterfaceC1Ev
	.stabn	224,0,0,.LLBE209-_ZN9InterfaceC1Ev
	.stabs	"_am:r(0,1)",64,0,177,16
	.stabs	"_vm:r(0,1)",64,0,177,10
	.stabs	"_x:V(0,15)",38,0,177,.LLC86

The section of the .S file where I guess .LLC86 should be looks like:

.LLC84:
	.long	0
	.long	0
	.align 8
.LLC85:
	.long	1072693248
	.long	0
	.align 8
.LLC87:
	.long	1073086464
	.long	0
	.align 8
.LLC88:
	.long	1068708659
	.long	858993459
	.align 8
.LLC89:
	.long	1068079513
	.long	-1717986918
	.align 8

Let me know if more information is needed.
All of the files were taken from KDE 3.1 kdeaddons.
>How-To-Repeat:
Compile kdeaddons-3.1/noatun-plugins/tippercanoe/ui.cpp and attempt to link.
>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: text/x-c++src; name="ui.cpp"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="ui.cpp"

I2luY2x1ZGUgImZvbnQuaCIKI2luY2x1ZGUgImljb25zLmgiCiNpbmNsdWRlICJzeW5hLmgiCiNp
bmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGtjb25maWcuaD4K
CiNkZWZpbmUgb3V0cHV0IGNvcmUtPm91dHB1dCgpCgpzdGF0aWMgdm9pZCBwdXRDaGFyKHVuc2ln
bmVkIGNoYXIgY2hhcmFjdGVyLGludCB4LGludCB5LGludCByZWQsaW50IGJsdWUpCnsKCXVuc2ln
bmVkIHNob3J0ICpwdHIgPSAoKHVuc2lnbmVkIHNob3J0ICopb3V0cHV0KSArIHggKyB5KmNvcmUt
Pm91dFdpZHRoOwoJdW5zaWduZWQgc2hvcnQgIHB1dCA9IChibHVlPDw4KStyZWQ7CglpbnQgaSxq
OwoJZm9yKGk9MDtpPDg7aSsrLHB0ciArPSBjb3JlLT5vdXRXaWR0aC04KQoJCWZvcihqPTA7ajw4
O2orKyxwdHIrKykKCQkJaWYgKGZvbnRbY2hhcmFjdGVyKjgraV0gJiAoMTI4Pj5qKSkKCQkJCSpw
dHIgPSBwdXQ7Cn0KCnZvaWQgSW50ZXJmYWNlOjpwdXRTdHJpbmcoY2hhciAqc3RyaW5nLGludCB4
LGludCB5LGludCByZWQsaW50IGJsdWUpCnsKCWlmICh4IDwgMCB8fCB5IDwgMCB8fCB5ID49IGNv
cmUtPm91dEhlaWdodC04KQoJCXJldHVybjsKCWZvcig7KnN0cmluZyAmJiB4IDw9IGNvcmUtPm91
dFdpZHRoLTg7c3RyaW5nKysseCs9OCkKCQlwdXRDaGFyKCh1bnNpZ25lZCBjaGFyKSgqc3RyaW5n
KSx4LHkscmVkLGJsdWUpOwp9Cgp2b2lkIFVJT2JqZWN0OjpjaGFuZ2VkKCkKewp9CgpzdHJ1Y3Qg
QnV0dG9uIDogcHVibGljIFVJT2JqZWN0CnsKCWludCBpY29uOwoJY2hhciBob3RLZXk7CgoJYm9v
bCBwYXNzaXZlLCBicmlnaHQ7CgoJQnV0dG9uKGludCBfYW0saW50IF92bSxkb3VibGUgX3gsZG91
YmxlIF95LAoJCQlkb3VibGUgX3NpemUsaW50IF9pY29uLGNoYXIgX2tleSA9IDAsIAoJCQlib29s
IF9wYXNzaXZlID0gZmFsc2UsIGJvb2wgX2JyaWdodCA9IGZhbHNlKQoJewoJCWFjdGl2ZU1hc2sg
PSBfYW07IHZpc2libGVNYXNrID0gX3ZtOwoJCXggPSBfeDsgeSA9IF95OyB3aWR0aCA9IGhlaWdo
dCA9IF9zaXplOwoJCWljb24gPSBfaWNvbjsgaG90S2V5ID0gX2tleTsgcGFzc2l2ZSA9IF9wYXNz
aXZlOyBicmlnaHQgPSBfYnJpZ2h0OwoJfQoKCWludCBnbyhib29sIG1vdXNlRG93bixib29sIG1v
dXNlQ2xpY2ssYm9vbCBtb3VzZU92ZXIsCgkJCWRvdWJsZSBfeCwgZG91YmxlIF95LCBkb3VibGUg
c2NhbGUsIGNoYXIgJl9ob3RLZXksIGludCAmYWN0aW9uKQoJewoJCSh2b2lkKW1vdXNlRG93bjsK
CQkodm9pZClfeDsKCQkodm9pZClfeTsKCQljb3JlLT5wb2x5Z29uRW5naW5lLmljb24oCgkJCQlJ
Y29uc1tpY29uXSwKCQkJCShicmlnaHQgPyAweDAyMDIgOiAweDAxMDApLAoJCQkJeCpzY2FsZSx5
KnNjYWxlLHdpZHRoKnNjYWxlLGhlaWdodCpzY2FsZSk7CgoJCWlmIChtb3VzZU92ZXIgJiYgIXBh
c3NpdmUpCgkJCWNvcmUtPnBvbHlnb25FbmdpbmUuaWNvbigKCQkJCQlJY29uc1tpY29uXSwKCQkJ
CQkweDAwMDIsCgkJCQkJKHgtSWNvbldpZHRoc1tpY29uXSp3aWR0aC8yKSpzY2FsZSwKCQkJCQko
eS1oZWlnaHQvMikqc2NhbGUsd2lkdGgqc2NhbGUqMixoZWlnaHQqc2NhbGUqMik7CgoJCWlmICht
b3VzZU92ZXIgJiYgbW91c2VDbGljayAmJiAhcGFzc2l2ZSkKCQkJYWN0aW9uID0gaWNvbjsKCgkJ
aWYgKG1vdXNlT3ZlciAmJiAhcGFzc2l2ZSAmJiBob3RLZXkpCgkJCV9ob3RLZXkgPSBob3RLZXk7
CgoJCXJldHVybiAwOwoJfQoKCXZvaWQgaGFuZGxlS2V5KGNoYXIga2V5LCBpbnQgJmFjdGlvbikK
CXsKCQlpZiAoa2V5ID09IGhvdEtleSAmJiAhcGFzc2l2ZSkKCQkJYWN0aW9uID0gaWNvbjsKCX0K
fTsKI2RlZmluZSBCYXJXaWR0aCAwLjEKc3RydWN0IFNsaWRlckJhciA6IHB1YmxpYyBVSU9iamVj
dAp7Cglkb3VibGUgKnZhbHVlOwoJY2hhciBsZWZ0S2V5LCByaWdodEtleTsKCgl0eXBlZGVmIHZv
aWQgKENvcmU6OipDYWxsYmFjaykoZG91YmxlIHYpOwoJQ2FsbGJhY2sgY2FsbGJhY2s7CgoJU2xp
ZGVyQmFyKGludCBfYW0saW50IF92bSxkb3VibGUgX3gsZG91YmxlIF95LAoJCQlkb3VibGUgX3dp
ZHRoLGRvdWJsZSBfaGVpZ2h0LCBkb3VibGUgKl92YWx1ZSwKCQkJQ2FsbGJhY2sgX2NhbGxiYWNr
LCBjaGFyIF9sZWZ0S2V5LCBjaGFyIF9yaWdodEtleSkKCXsKCQlhY3RpdmVNYXNrID0gX2FtOyB2
aXNpYmxlTWFzayA9IF92bTsKCQl4ID0gX3g7IHkgPSBfeTsgd2lkdGggPSBfd2lkdGg7IGhlaWdo
dCA9IF9oZWlnaHQ7CgkJdmFsdWUgPSBfdmFsdWU7IGNhbGxiYWNrID0gX2NhbGxiYWNrOwoJCWxl
ZnRLZXkgPSBfbGVmdEtleTsgcmlnaHRLZXkgPSBfcmlnaHRLZXk7Cgl9CgoJaW50IGdvKGJvb2wg
bW91c2VEb3duLGJvb2wgbW91c2VDbGljayxib29sIG1vdXNlT3ZlciwKCQkJZG91YmxlIF94LCBk
b3VibGUgX3ksIGRvdWJsZSBzY2FsZSwgY2hhciAmX2hvdEtleSwgaW50ICZhY3Rpb24pCgl7CgkJ
KHZvaWQpbW91c2VDbGljazsKCQkodm9pZClfeTsKCQkodm9pZClhY3Rpb247CgkJY29yZS0+cG9s
eWdvbkVuZ2luZS5pY29uKAoJCQlJY29uc1tCYXJdLAoJCQkweDAxMDAsCgkJCXgqc2NhbGUseSpz
Y2FsZSx3aWR0aCpzY2FsZSxoZWlnaHQqc2NhbGUpOwoJCWNvcmUtPnBvbHlnb25FbmdpbmUuaWNv
bigKCQkJSWNvbnNbU2xpZGVyXSwKCQkJMHgwMjAwLAoJCQkoeCsqdmFsdWUqd2lkdGgtSWNvbldp
ZHRoc1tTbGlkZXJdKmhlaWdodC8yKSpzY2FsZSwKCQkJeSpzY2FsZSxoZWlnaHQqc2NhbGUsaGVp
Z2h0KnNjYWxlKTsKCgkJaWYgKG1vdXNlT3ZlcikKCQl7CgkJCWRvdWJsZSBuZXdWYWx1ZSA9IChf
eCkvKHdpZHRoKTsKCQkJaWYgKG5ld1ZhbHVlIDwgMC4wKSBuZXdWYWx1ZSA9IDAuMDsKCQkJaWYg
KG5ld1ZhbHVlID4gMS4wKSBuZXdWYWx1ZSA9IDEuMDsKCgkJCWNvcmUtPnBvbHlnb25FbmdpbmUu
aWNvbigKCQkJCQlJY29uc1tTZWxlY3Rvcl0sCgkJCQkJMHgwMDAyLAoJCQkJCSh4K25ld1ZhbHVl
KndpZHRoLUljb25XaWR0aHNbU2VsZWN0b3JdKmhlaWdodC8yKSpzY2FsZSwKCQkJCQl5KnNjYWxl
LGhlaWdodCpzY2FsZSxoZWlnaHQqc2NhbGUpOwoKCQkJaWYgKG1vdXNlRG93bikKCQkJewoJCQkJ
KnZhbHVlID0gbmV3VmFsdWU7CgoJCQkJaWYgKGNhbGxiYWNrKQoJCQkJCShjb3JlLT4qY2FsbGJh
Y2spKCp2YWx1ZSk7CgkJCQljaGFuZ2VkKCk7CgkJCX0KCgkJCWlmIChtb3VzZU92ZXIpCgkJCQlf
aG90S2V5ID0gKG5ld1ZhbHVlIDwgKnZhbHVlID8gbGVmdEtleSA6IHJpZ2h0S2V5KTsKCQl9CgoJ
CXJldHVybiAwOwoJfQoJdm9pZCBoYW5kbGVLZXkoY2hhciBrZXksIGludCAmYWN0aW9uKQoJewoJ
CSh2b2lkKWFjdGlvbjsKCQlpZiAoa2V5ID09IGxlZnRLZXkgfHwga2V5ID09IHJpZ2h0S2V5KQoJ
CXsKCQkJaWYgKGtleSA9PSBsZWZ0S2V5KQoJCQl7CgkJCQlpZiAoKnZhbHVlID09IDAuMCkgcmV0
dXJuOwoJCQkJKnZhbHVlIC09IDAuMDU7CgkJCQlpZiAoKnZhbHVlIDwgMC4wKSAqdmFsdWUgPSAw
LjA7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpZiAoKnZhbHVlID09IDEuMCkgcmV0dXJuOwoJCQkJ
KnZhbHVlICs9IDAuMDU7CgkJCQlpZiAoKnZhbHVlID4gMS4wKSAqdmFsdWUgPSAxLjA7CgkJCX0K
CgkJCWlmIChjYWxsYmFjaykKCQkJCShjb3JlLT4qY2FsbGJhY2spKCp2YWx1ZSk7CgkJCWNoYW5n
ZWQoKTsKCQl9Cgl9Cn07CiN1bmRlZiBCYXJXaWR0aAoKCnN0cnVjdCBQb3BwZXJVcHBlciA6IHB1
YmxpYyBVSU9iamVjdAp7CglpbnQgbWFza0FkZDsKCglQb3BwZXJVcHBlcihpbnQgX2FtLGludCBf
dm0sZG91YmxlIF94LGRvdWJsZSBfeSwKCQkJZG91YmxlIF93aWR0aCxkb3VibGUgX2hlaWdodCwg
aW50IF9tYXNrQWRkKQoJewoJCWFjdGl2ZU1hc2sgPSBfYW07IHZpc2libGVNYXNrID0gX3ZtOyAK
CQl4ID0gX3g7IHkgPSBfeTsgd2lkdGggPSBfd2lkdGg7IGhlaWdodCA9IF9oZWlnaHQ7CgkJbWFz
a0FkZCA9IF9tYXNrQWRkOwoJfQoKCWludCBnbyhib29sIG1vdXNlRG93bixib29sIG1vdXNlQ2xp
Y2ssIGJvb2wgbW91c2VPdmVyLAoJCQlkb3VibGUgX3gsIGRvdWJsZSBfeSwgZG91YmxlIHNjYWxl
LCBjaGFyICZfaG90S2V5LCBpbnQgJmFjdGlvbikKCXsKCQkodm9pZCltb3VzZURvd247CgkJKHZv
aWQpbW91c2VDbGljazsKCQkodm9pZClfeDsKCQkodm9pZClfeTsKCQkodm9pZClfaG90S2V5OwoJ
CSh2b2lkKWFjdGlvbjsKCQkKCQljb3JlLT5wb2x5Z29uRW5naW5lLmljb24oCgkJCQlJY29uc1tC
b3hdLAoJCQkJMHgwMjAwLAoJCQkJeCpzY2FsZSx5KnNjYWxlLHdpZHRoKnNjYWxlLGhlaWdodCpz
Y2FsZSk7CgoJCXJldHVybiBtb3VzZU92ZXIgPyBtYXNrQWRkIDogMDsKCX0KCgl2b2lkIGhhbmRs
ZUtleShjaGFyIGtleSwgaW50ICZhY3Rpb24pCgl7CgkJKHZvaWQpa2V5OwoJCSh2b2lkKWFjdGlv
bjsKCX0KfTsKCnZvaWQgSW50ZXJmYWNlOjpzZXR1cFBhbGV0dGUoKQp7CiNkZWZpbmUgQk9VTkQo
eCkgKCh4KSA+IDI1NSA/IDI1NSA6ICh4KSkKI2RlZmluZSBQRUFLSUZZKHgpIGludChCT1VORCgo
eCkgLSAoeCkqKDI1NS0oeCkpLzI1NS8yKSkKI2RlZmluZSBNQVgoeCx5KSAoKHgpID4gKHkpID8g
KHgpIDogKHkpKQoJaW50IGk7Cgl1bnNpZ25lZCBjaGFyIHBhbGV0dGVbNzY4XTsKCglkb3VibGUg
c2NhbGUsIGZnUmVkLCBmZ0dyZWVuLCBmZ0JsdWUsIGJnUmVkLCBiZ0dyZWVuLCBiZ0JsdWU7Cglm
Z1JlZCA9IGNvcmUtPmZnUmVkU2xpZGVyOwoJZmdHcmVlbiA9IGNvcmUtPmZnR3JlZW5TbGlkZXI7
CglmZ0JsdWUgPSAxLjAgLSBNQVgoY29yZS0+ZmdSZWRTbGlkZXIsY29yZS0+ZmdHcmVlblNsaWRl
cik7CglzY2FsZSA9IE1BWChNQVgoZmdSZWQsZmdHcmVlbiksZmdCbHVlKTsKCWZnUmVkIC89IHNj
YWxlOwoJZmdHcmVlbiAvPSBzY2FsZTsKCWZnQmx1ZSAvPSBzY2FsZTsKCgliZ1JlZCA9IGNvcmUt
PmJnUmVkU2xpZGVyOwoJYmdHcmVlbiA9IGNvcmUtPmJnR3JlZW5TbGlkZXI7CgliZ0JsdWUgPSAx
LjAgLSBNQVgoY29yZS0+YmdSZWRTbGlkZXIsIGNvcmUtPmJnR3JlZW5TbGlkZXIpOwoJc2NhbGUg
PSBNQVgoTUFYKGJnUmVkLCBiZ0dyZWVuKSwgYmdCbHVlKTsKCWJnUmVkIC89IHNjYWxlOwoJYmdH
cmVlbiAvPSBzY2FsZTsKCWJnQmx1ZSAvPSBzY2FsZTsKCglmb3IoaT0wO2k8MjU2O2krKykKCXsK
CQlpbnQgZiA9IGkmMTUsIGIgPSBpLzE2OwoJCXBhbGV0dGVbaSozKzBdID0gUEVBS0lGWShiKmJn
UmVkKjE2K2YqZmdSZWQqMTYpOwoJCXBhbGV0dGVbaSozKzFdID0gUEVBS0lGWShiKmJnR3JlZW4q
MTYrZipmZ0dyZWVuKjE2KTsKCQlwYWxldHRlW2kqMysyXSA9IFBFQUtJRlkoYipiZ0JsdWUqMTYr
ZipmZ0JsdWUqMTYpOwoJfQoJY29yZS0+c2NyZWVuLT5zZXRQYWxldHRlKHBhbGV0dGUpOwojdW5k
ZWYgQk9VTkQKI3VuZGVmIFBFQUtJRlkKI3VuZGVmIE1BWAp9CgovL1Zpc2libGUgbWFzawojZGVm
aW5lIEFMTCAxCiNkZWZpbmUgQlVUVE9OQkFSIDIKI2RlZmluZSBUUkFDS0JBUiA0CiNkZWZpbmUg
RElBTEJBUiA4CiNkZWZpbmUgVk9MVU1FQkFSIDE2CgovL0FjdGl2ZSBtYXNrCi8vI2RlZmluZSBB
TEwgMQojZGVmaW5lIFBMQVlJTkcgMgojZGVmaW5lIFBBVVNFRCA0CiNkZWZpbmUgU1RPUFBFRCA4
CiNkZWZpbmUgTk9DRCAzMiAKI2RlZmluZSBPUEVOIDY0IAoKCi8vIFRPRE8gTGF5IHRoaW5ncyBv
dXQgd2l0aCBwYXJlbnRzIGFuZCBhIHN0YWNrLCBsaWtlIFFUCkludGVyZmFjZTo6SW50ZXJmYWNl
KCkKewoJc3RhdGljIGNvbnN0IGZsb2F0IEljb25TaXplPTAuMjsKCXN0YXRpYyBjb25zdCBmbG9h
dCBTbGlkZXJTaXplPTAuMTI1OwoKCXsKCQlLQ29uZmlnIGNvbmZpZygibm9hdHVuL3N5bmFlc2Nv
cGUiLCBmYWxzZSwgZmFsc2UsICJkYXRhIik7CgkJY29yZS0+ZmFkZU1vZGU9KFN5bWJvbElEKWNv
bmZpZy5yZWFkTnVtRW50cnkoIm1vZGUiLCAoaW50KVN0YXJzKTsKCQljb3JlLT5wb2ludHNBcmVE
aWFtb25kcz1jb25maWcucmVhZEJvb2xFbnRyeSgiZGlhbW9uZHMiLCBmYWxzZSk7CgkJY29yZS0+
YnJpZ2h0bmVzc1R3aWRkbGVyPWNvbmZpZy5yZWFkRG91YmxlTnVtRW50cnkoImJyaWdodG5lc3Mi
LCAuNCk7CgkJY29yZS0+c3RhclNpemU9Y29uZmlnLnJlYWREb3VibGVOdW1FbnRyeSgic3RhcnNp
emUiLCAuMSk7CgkJY29yZS0+ZmdSZWRTbGlkZXI9Y29uZmlnLnJlYWREb3VibGVOdW1FbnRyeSgi
RkdSZWQiLCAwLjApOwoJCWNvcmUtPmZnR3JlZW5TbGlkZXI9Y29uZmlnLnJlYWREb3VibGVOdW1F
bnRyeSgiRkdncmVlbiIsIDEuMCk7CgkJY29yZS0+YmdSZWRTbGlkZXI9Y29uZmlnLnJlYWREb3Vi
bGVOdW1FbnRyeSgiQkdSZWQiLCAwLjApOwoJCWNvcmUtPmJnR3JlZW5TbGlkZXI9Y29uZmlnLnJl
YWREb3VibGVOdW1FbnRyeSgiQkdHcmVlbiIsIDAuMCk7Cgl9CgkKCXVpT2JqZWN0cy5zZXRBdXRv
RGVsZXRlKHRydWUpOwoKCWRvdWJsZSB4LHk7CgkKCS8vYWRkVUkobmV3IEJ1dHRvbihBTEwsMC4w
MjUsMC41MjUsSWNvblNpemUsIDAsICd4JykpOwovLwlhZGRVSShuZXcgUG9wcGVyVXBwZXIoQUxM
LEFMTCwwLDAsMC4yNSwwLjI1LCBCVVRUT05CQVIpKTsKLy8JYWRkVUkoc3RhdGVCdXR0b24gPSBu
ZXcgQnV0dG9uKEFMTCxBTEwsMC4wNSwwLjAyNSxJY29uU2l6ZSwgMCwgMCwgdHJ1ZSwgZmFsc2Up
KTsKCglhZGRVSShuZXcgUG9wcGVyVXBwZXIoQUxMLEJVVFRPTkJBUix4PTAuMjUseT0wLDEuMzc1
LDAuMjUsIEJVVFRPTkJBUikpOwovLwl4ICs9IDAuMTsgeSArPSAwLjAyNTsKCi8vCWFkZFVJKG5l
dyBQb3BwZXJVcHBlcihQTEFZSU5HfFBBVVNFRHxTVE9QUEVELCBBTEwsMCwwLjI1LDAuMjUsMC4y
NSwgVFJBQ0tCQVIpKTsKLy8JYWRkVUkobmV3IFBvcHBlclVwcGVyKFBMQVlJTkd8UEFVU0VEfFNU
T1BQRUQsIFRSQUNLQkFSLHg9MC4yNSx5PTAuMjUsMS4wLDAuNjI1LCBUUkFDS0JBUikpOwovLwl4
ICs9IDAuMTsgeSArPSAwLjE7CgoJYWRkVUkobmV3IFBvcHBlclVwcGVyKEFMTCxBTEwsMCwwLjAs
MC4yNSwwLjI1LCBESUFMQkFSKSk7CglhZGRVSShuZXcgQnV0dG9uKEFMTCxBTEwsMC4wNzUsMC4w
NSxJY29uU2l6ZSwgQnVsYiwgMCwgdHJ1ZSwgZmFsc2UpKTsKCglhZGRVSShuZXcgUG9wcGVyVXBw
ZXIoQUxMLERJQUxCQVIseD0wLjI1LHk9MC4wLDEuMjUsMS4wLCBESUFMQkFSKSk7Cgl4ICs9IDAu
MDU7IHkgKz0gMC4wMjU7CgoJYWRkVUkoc3RhcnNCdXR0b24gPSBuZXcgQnV0dG9uKEFMTCxESUFM
QkFSLHgseSxJY29uU2l6ZSwgU3RhcnMsICdkJykpOwoJYWRkVUkod2F2ZUJ1dHRvbiA9IG5ldyBC
dXR0b24oQUxMLERJQUxCQVIseCtJY29uU2l6ZSx5LEljb25TaXplLCBXYXZlLCAnZicpKTsKCWFk
ZFVJKGZsYW1lQnV0dG9uID0gbmV3IEJ1dHRvbihBTEwsRElBTEJBUix4K0ljb25TaXplKjIuNSx5
LEljb25TaXplLCBGbGFtZSwgJ2cnKSk7CgoJYWRkVUkoc3RhckJ1dHRvbiA9IG5ldyBCdXR0b24o
QUxMLERJQUxCQVIseCtJY29uU2l6ZSozLjUseSxJY29uU2l6ZSwgU3RhciwgJ2gnKSk7CglhZGRV
SShkaWFtb25kQnV0dG9uID0gbmV3IEJ1dHRvbihBTEwsRElBTEJBUix4K0ljb25TaXplKjQuNSx5
LEljb25TaXplLCBEaWFtb25kLCAnaicpKTsKCgl5ICs9IEljb25TaXplKjEuMzsKCglhZGRVSShu
ZXcgQnV0dG9uKEFMTCxESUFMQkFSLHgseS0wLjA1LEljb25TaXplLCBCdWxiLCAwLCB0cnVlKSk7
CglhZGRVSShuZXcgU2xpZGVyQmFyKEFMTCxESUFMQkFSLAoJCXgrSWNvblNpemUseSwgMC43NSwg
U2xpZGVyU2l6ZSwgJmNvcmUtPmJyaWdodG5lc3NUd2lkZGxlciwgLyomQ29yZTo6c2V0QnJpZ2h0
bmVzcywqLzAsICd6JywgJ3gnKSk7CgoJYWRkVUkobmV3IEJ1dHRvbihBTEwsRElBTEJBUix4LHkr
U2xpZGVyU2l6ZSoxLEljb25TaXplLCBTaXplLCAneCcsIHRydWUpKTsKCWFkZFVJKG5ldyBTbGlk
ZXJCYXIoQUxMLERJQUxCQVIsCgkJeCtJY29uU2l6ZSx5K1NsaWRlclNpemUsIDAuNzUsIFNsaWRl
clNpemUsICZjb3JlLT5zdGFyU2l6ZSwgJkNvcmU6OnNldFN0YXJTaXplLCAnYycsJ3YnKSk7CgoJ
YWRkVUkobmV3IEJ1dHRvbihBTEwsRElBTEJBUix4KzAuNSx5K1NsaWRlclNpemUqMi0wLjAyNSxJ
Y29uU2l6ZSwgRmdDb2xvciwgMCwgdHJ1ZSkpOwoJYWRkVUkobmV3IFNsaWRlckJhcihBTEwsRElB
TEJBUiwKCQl4LHkrU2xpZGVyU2l6ZSoyLCAwLjQ1LCBTbGlkZXJTaXplLCAmKGNvcmUtPmZnUmVk
U2xpZGVyKSwgJkNvcmU6OnNldHVwUGFsZXR0ZSwgJ2InLCduJykpOwoJYWRkVUkobmV3IFNsaWRl
ckJhcihBTEwsRElBTEJBUiwKCQkJCXgrMC41K1NsaWRlclNpemUseStTbGlkZXJTaXplKjIsIDAu
NDUsIFNsaWRlclNpemUsICZjb3JlLT5mZ0dyZWVuU2xpZGVyLCAmQ29yZTo6c2V0dXBQYWxldHRl
LCAnbScsJywnKSk7CgoJYWRkVUkobmV3IEJ1dHRvbihBTEwsRElBTEJBUix4KzAuNSx5K1NsaWRl
clNpemUqMyxJY29uU2l6ZSwgQmdDb2xvciwgMCwgdHJ1ZSkpOwoJYWRkVUkobmV3IFNsaWRlckJh
cihBTEwsRElBTEJBUiwKCQkJCXgseStTbGlkZXJTaXplKjMsIDAuNDUsIFNsaWRlclNpemUsICZj
b3JlLT5iZ1JlZFNsaWRlciwgJkNvcmU6OnNldHVwUGFsZXR0ZSwgJ0InLCdOJykpOwoJYWRkVUko
bmV3IFNsaWRlckJhcihBTEwsRElBTEJBUiwKCQkJCXgrMC41K1NsaWRlclNpemUseStTbGlkZXJT
aXplKjMsIDAuNDUsIFNsaWRlclNpemUsICZjb3JlLT5iZ0dyZWVuU2xpZGVyLCAmQ29yZTo6c2V0
dXBQYWxldHRlLCAnTScsJzwnKSk7CgoJeCArPSAwLjE7Ly8geSArPSAwLjA2MjU7CgkvL3N0YXRp
YyBkb3VibGUgdmFsdWUgPSAwLjU7CgkvL2FkZFVJKG5ldyBTbGlkZXJCYXIoQUxMLDAsMC43NSwx
LjAsMC4yNSwmdmFsdWUpKTsgCgoJLy9hZGRVSShuZXcgQnV0dG9uKEJVVFRPTkJBUix4LHksSWNv
blNpemUsIDEsICd4JykpOwoJLy9hZGRVSShuZXcgQnV0dG9uKEJVVFRPTkJBUix4ICs9IEljb25T
aXplLHksSWNvblNpemUsIDIsICd4JykpOwoJLy9hZGRVSShuZXcgQnV0dG9uKEJVVFRPTkJBUix4
ICs9IEljb25TaXplLHksSWNvblNpemUsIDMsICd4JykpOwoKCXZpc2libGVNYXNrID0gQUxMOwoJ
bW91c2VYID0gLTE7Cgltb3VzZVkgPSAtMTsKCWxhc3RZID0gLTE7CglsYXN0WSA9IC0xOwoJY291
bnREb3duID0gMDsKCW1vdXNlQnV0dG9ucyA9IDA7CgoJc3luY1RvU3RhdGUoKTsKCQp9CgpJbnRl
cmZhY2U6On5JbnRlcmZhY2UoKQp7CglLQ29uZmlnIGNvbmZpZygibm9hdHVuL3N5bmFlc2NvcGUi
LCBmYWxzZSwgZmFsc2UsICJkYXRhIik7Cgljb25maWcud3JpdGVFbnRyeSgibW9kZSIsY29yZS0+
ZmFkZU1vZGUpOwoJY29uZmlnLndyaXRlRW50cnkoImRpYW1vbmRzIiwgY29yZS0+cG9pbnRzQXJl
RGlhbW9uZHMpOwoJY29uZmlnLndyaXRlRW50cnkoImJyaWdodG5lc3MiLCBjb3JlLT5icmlnaHRu
ZXNzVHdpZGRsZXIpOwoJY29uZmlnLndyaXRlRW50cnkoInN0YXJzaXplIiwgY29yZS0+c3RhclNp
emUpOwoJY29uZmlnLndyaXRlRW50cnkoIkZHUmVkIiwgY29yZS0+ZmdSZWRTbGlkZXIpOwoJY29u
ZmlnLndyaXRlRW50cnkoIkZHZ3JlZW4iLCBjb3JlLT5mZ0dyZWVuU2xpZGVyKTsKCWNvbmZpZy53
cml0ZUVudHJ5KCJCR1JlZCIsIGNvcmUtPmJnUmVkU2xpZGVyKTsKCWNvbmZpZy53cml0ZUVudHJ5
KCJCR0dyZWVuIiwgY29yZS0+YmdHcmVlblNsaWRlcik7Cn0KCnZvaWQgSW50ZXJmYWNlOjphZGRV
SShVSU9iamVjdCAqb2JqKQp7Cgl1aU9iamVjdHMuYXBwZW5kKG9iaik7Cn0KCnZvaWQgSW50ZXJm
YWNlOjpzeW5jVG9TdGF0ZSgpCnsKCXN0YXJzQnV0dG9uLT5icmlnaHQgPSAoY29yZS0+ZmFkZU1v
ZGUgPT0gU3RhcnMpOyAKCWZsYW1lQnV0dG9uLT5icmlnaHQgPSAoY29yZS0+ZmFkZU1vZGUgPT0g
RmxhbWUpOyAKCXdhdmVCdXR0b24tPmJyaWdodCA9IChjb3JlLT5mYWRlTW9kZSA9PSBXYXZlKTsK
CglzdGFyQnV0dG9uLT5icmlnaHQgPSAhY29yZS0+cG9pbnRzQXJlRGlhbW9uZHM7CglkaWFtb25k
QnV0dG9uLT5icmlnaHQgPSBjb3JlLT5wb2ludHNBcmVEaWFtb25kczsKCglzZXR1cFBhbGV0dGUo
KTsKfQoKdm9pZCBJbnRlcmZhY2U6OmNoYW5nZVN0YXRlKGludCB0cmFuc2l0aW9uU3ltYm9sKQp7
CglpZiAodHJhbnNpdGlvblN5bWJvbCA8IDApCgl7CgkJcmV0dXJuIDsKCX0KCglpbnQgcmV0VmFs
ID0gMDsKCXN3aXRjaCh0cmFuc2l0aW9uU3ltYm9sKQoJewoJCWNhc2UgRmxhbWUgOgoJCQlzdGFy
c0J1dHRvbi0+YnJpZ2h0ID0gZmFsc2U7CgkJCWZsYW1lQnV0dG9uLT5icmlnaHQgPSB0cnVlOwoJ
CQl3YXZlQnV0dG9uLT5icmlnaHQgPSBmYWxzZTsKCQkJY29yZS0+ZmFkZU1vZGUgPSBGbGFtZTsK
CQkJY29yZS0+c2V0U3RhclNpemUoY29yZS0+c3RhclNpemUpOwoJCQlicmVhazsKCQljYXNlIFdh
dmUgOgoJCQlzdGFyc0J1dHRvbi0+YnJpZ2h0ID0gZmFsc2U7CgkJCWZsYW1lQnV0dG9uLT5icmln
aHQgPSBmYWxzZTsKCQkJd2F2ZUJ1dHRvbi0+YnJpZ2h0ID0gdHJ1ZTsKCQkJY29yZS0+ZmFkZU1v
ZGUgPSBXYXZlOwoJCQljb3JlLT5zZXRTdGFyU2l6ZShjb3JlLT5zdGFyU2l6ZSk7CgkJCWJyZWFr
OwoJCWNhc2UgU3RhcnMgOgoJCQlzdGFyc0J1dHRvbi0+YnJpZ2h0ID0gdHJ1ZTsKCQkJZmxhbWVC
dXR0b24tPmJyaWdodCA9IGZhbHNlOwoJCQl3YXZlQnV0dG9uLT5icmlnaHQgPSBmYWxzZTsKCQkJ
Y29yZS0+ZmFkZU1vZGUgPSBTdGFyczsKCQkJY29yZS0+c2V0U3RhclNpemUoY29yZS0+c3RhclNp
emUpOwoJCQlicmVhazsKCgkJY2FzZSBTdGFyIDoKCQkJY29yZS0+cG9pbnRzQXJlRGlhbW9uZHMg
PSBmYWxzZTsKCQkJc3RhckJ1dHRvbi0+YnJpZ2h0ID0gdHJ1ZTsKCQkJZGlhbW9uZEJ1dHRvbi0+
YnJpZ2h0ID0gZmFsc2U7CgkJCWJyZWFrOwoJCWNhc2UgRGlhbW9uZCA6CgkJCWNvcmUtPnBvaW50
c0FyZURpYW1vbmRzID0gdHJ1ZTsKCQkJc3RhckJ1dHRvbi0+YnJpZ2h0ID0gZmFsc2U7CgkJCWRp
YW1vbmRCdXR0b24tPmJyaWdodCA9IHRydWU7CgkJCWJyZWFrOwoKCQljYXNlIEV4aXQgIDogCgkJ
CXJldFZhbCA9IDE7IGJyZWFrOwoJfQovLwlyZXR1cm4gcmV0VmFsOwp9Cgpib29sIEludGVyZmFj
ZTo6Z28oKQp7CglpbnQgbmV3VmlzaWJsZU1hc2sgPSBBTEw7CgljaGFyIGtleUhpdDsKCWludCBh
Y3Rpb24gPSBOb3RBU3ltYm9sOwoJaW50IG9sZEJ1dHRvbnMgPSBtb3VzZUJ1dHRvbnM7CgoJY29y
ZS0+c2NyZWVuLT5zaXplVXBkYXRlKCk7CglpZiAoIWNvcmUtPnNjcmVlbi0+aW5wdXRVcGRhdGUo
bW91c2VYLG1vdXNlWSxtb3VzZUJ1dHRvbnMsa2V5SGl0KSkKCQlyZXR1cm4gZmFsc2U7CgoJYm9v
bCBtb3VzZUNsaWNrID0gKG1vdXNlQnV0dG9ucyAmJiAhb2xkQnV0dG9ucyk7CgoJaWYgKChtb3Vz
ZVggIT0gbGFzdFggfHwgbW91c2VZICE9IGxhc3RZKSAmJiAKCQkJbGFzdFggPiAwICYmIGxhc3RZ
ID4gMCAmJiAKCQkJbGFzdFggPCBjb3JlLT5vdXRXaWR0aCAmJiBsYXN0WSA8IGNvcmUtPm91dEhl
aWdodCkKCQljb3VudERvd24gPSA0MDsKCglpbnQgYWN0aXZlTWFzayA9IEFMTDsKCglpZiAoY291
bnREb3duKQoJewoJCWNvdW50RG93bi0tOwoKCQlkb3VibGUgc2NhbGUgPSAKCQkJKGNvcmUtPm91
dFdpZHRoKjAuNjI1IDwgY29yZS0+b3V0SGVpZ2h0ID8gY29yZS0+b3V0V2lkdGgqMC42MjUgOiBj
b3JlLT5vdXRIZWlnaHQpOwoJCWRvdWJsZSBzY2FsZWRYID0gbW91c2VYIC8gc2NhbGU7CgkJZG91
YmxlIHNjYWxlZFkgPSBtb3VzZVkgLyBzY2FsZTsKCgkJY2hhciBob3RLZXkgPSAwOwoKCQljb3Jl
LT5wb2x5Z29uRW5naW5lLmNsZWFyKCk7CgovLwkJc3RhdGVCdXR0b24tPmljb24gPSBjb3JlLT5z
dGF0ZTsKCgoJCWZvciAoVUlPYmplY3QgKmk9dWlPYmplY3RzLmZpcnN0KCk7IGkhPTA7IGkgPSB1
aU9iamVjdHMubmV4dCgpKQoJCXsKCQkJaWYgKChpLT52aXNpYmxlTWFzayAmIHZpc2libGVNYXNr
KSAmJiAoaS0+YWN0aXZlTWFzayAmIGFjdGl2ZU1hc2spKQoJCQkJbmV3VmlzaWJsZU1hc2sgfD0g
aS0+Z28obW91c2VCdXR0b25zLG1vdXNlQ2xpY2ssCgkJCQkJCShzY2FsZWRYID49IGktPnggJiYK
CQkJCQkJIHNjYWxlZFkgPj0gaS0+eSAmJgoJCQkJCQkgc2NhbGVkWCA8IGktPngraS0+d2lkdGgg
JiYKCQkJCQkJIHNjYWxlZFkgPCBpLT55K2ktPmhlaWdodCksCgkJCQkJCXNjYWxlZFggLSBpLT54
LAoJCQkJCQlzY2FsZWRZIC0gaS0+eSwKCQkJCQkJc2NhbGUsCgkJCQkJCWhvdEtleSwKCQkJCQkJ
YWN0aW9uKTsKCQl9CgoJCXZpc2libGVNYXNrID0gbmV3VmlzaWJsZU1hc2s7ICAKCQlpZiAodmlz
aWJsZU1hc2sgIT0gMSkKCQkJY291bnREb3duID0gMjA7CgoJCWNvcmUtPnBvbHlnb25FbmdpbmUu
aWNvbihJY29uc1tQb2ludGVyXSwweDAzMDMsbW91c2VYLG1vdXNlWSw1MCw1MCk7CgoJCWNvcmUt
PnBvbHlnb25FbmdpbmUuYXBwbHkoY29yZS0+b3V0cHV0Qm1wLmRhdGEpOwoKCQljaGFyIGhpbnRb
Ml0gPSAiICI7CgkJaGludFswXSA9IGhvdEtleTsKCQlwdXRTdHJpbmcoaGludCxtb3VzZVgrNixt
b3VzZVkrNywwLDApOwoJfQoKCWlmIChrZXlIaXQpCgkJZm9yKFVJT2JqZWN0ICppPXVpT2JqZWN0
cy5maXJzdCgpOyBpIT0wOyBpID0gdWlPYmplY3RzLm5leHQoKSkgCgkJCWlmIChpLT5hY3RpdmVN
YXNrICYgYWN0aXZlTWFzaykKCQkJCWktPmhhbmRsZUtleShrZXlIaXQsYWN0aW9uKTsKCgoJbGFz
dFggPSBtb3VzZVg7CglsYXN0WSA9IG1vdXNlWTsKCgljaGFuZ2VTdGF0ZShhY3Rpb24pOwoKCXJl
dHVybiB0cnVlOwp9CgojdW5kZWYgb3V0cHV0Cg==


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]