Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBGcmVlSW1hZ2UgaW1wbGVtZW50YXRpb24KLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieQovLyAtIEZsb3JpcyB2YW4gZGVuIEJlcmcgKGZsdmRiZXJnQHd4cy5ubCkKLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQovLyAtIEthcmwtSGVpbnogQnVzc2lhbiAoa2hidXNzaWFuQG1vc3MuZGUpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCiNpZmRlZiBfV0lOMzIKI2luY2x1ZGUgPHdpbmRvd3MuaD4KI2VuZGlmCgojaW5jbHVkZSAiRnJlZUltYWdlLmgiCiNpbmNsdWRlICJVdGlsaXRpZXMuaCIKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIGNvbnN0IGNoYXIgKnNfY29weXJpZ2h0ID0gIlRoaXMgcHJvZ3JhbSB1c2VzIEZyZWVJbWFnZSwgYSBmcmVlLCBvcGVuIHNvdXJjZSBpbWFnZSBsaWJyYXJ5IHN1cHBvcnRpbmcgYWxsIGNvbW1vbiBiaXRtYXAgZm9ybWF0cy4gU2VlIGh0dHA6Ly9mcmVlaW1hZ2Uuc291cmNlZm9yZ2UubmV0IGZvciBkZXRhaWxzIjsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKI2lmbmRlZiBGUkVFSU1BR0VfTElCCgpCT09MIEFQSUVOVFJZCkRsbE1haW4oSEFORExFIGhNb2R1bGUsIERXT1JEIHVsX3JlYXNvbl9mb3JfY2FsbCwgTFBWT0lEIGxwUmVzZXJ2ZWQpIHsKCXN3aXRjaCAodWxfcmVhc29uX2Zvcl9jYWxsKSB7CgkJY2FzZSBETExfUFJPQ0VTU19BVFRBQ0ggOgoJCQlGcmVlSW1hZ2VfSW5pdGlhbGlzZShGQUxTRSk7CgkJCWJyZWFrOwoKCQljYXNlIERMTF9QUk9DRVNTX0RFVEFDSCA6CgkJCUZyZWVJbWFnZV9EZUluaXRpYWxpc2UoKTsKCQkJYnJlYWs7CgoJCWNhc2UgRExMX1RIUkVBRF9BVFRBQ0ggOgoJCWNhc2UgRExMX1RIUkVBRF9ERVRBQ0ggOgoJCQlicmVhazsKICAgIH0KCiAgICByZXR1cm4gVFJVRTsKfQoKI2VuZGlmIC8vIEZSRUVJTUFHRV9MSUIKCiNlbHNlIC8vICFfV0lOMzIgCiNpZm5kZWYgRlJFRUlNQUdFX0xJQgoKdm9pZCBGcmVlSW1hZ2VfU09fSW5pdGlhbGlzZSgpIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSk7CnZvaWQgRnJlZUltYWdlX1NPX0RlSW5pdGlhbGlzZSgpIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKTsKCnZvaWQgRnJlZUltYWdlX1NPX0luaXRpYWxpc2UoKSB7CiAgRnJlZUltYWdlX0luaXRpYWxpc2UoRkFMU0UpOwp9Cgp2b2lkIEZyZWVJbWFnZV9TT19EZUluaXRpYWxpc2UoKSB7CiAgRnJlZUltYWdlX0RlSW5pdGlhbGlzZSgpOwp9CiNlbmRpZiAvLyBGUkVFSU1BR0VfTElCCgojZW5kaWYgLy8gX1dJTjMyCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRnJlZUltYWdlX0dldFZlcnNpb24oKSB7CglzdGF0aWMgY2hhciBzX3ZlcnNpb25bMTZdOwoJc3ByaW50ZihzX3ZlcnNpb24sICIlZC4lZC4lZCIsIEZSRUVJTUFHRV9NQUpPUl9WRVJTSU9OLCBGUkVFSU1BR0VfTUlOT1JfVkVSU0lPTiwgRlJFRUlNQUdFX1JFTEVBU0VfU0VSSUFMKTsKCXJldHVybiBzX3ZlcnNpb247Cn0KCmNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRnJlZUltYWdlX0dldENvcHlyaWdodE1lc3NhZ2UoKSB7CglyZXR1cm4gc19jb3B5cmlnaHQ7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQk9PTCBETExfQ0FMTENPTlYKRnJlZUltYWdlX0lzTGl0dGxlRW5kaWFuKCkgewoJdW5pb24gewoJCURXT1JEIGk7CgkJQllURSBjWzRdOwoJfSB1OwoJdS5pID0gMTsKCXJldHVybiAodS5jWzBdICE9IDApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyBGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZUZ1bmN0aW9uIGZyZWVpbWFnZV9vdXRwdXRtZXNzYWdlX3Byb2MgPSBOVUxMOwpzdGF0aWMgRnJlZUltYWdlX091dHB1dE1lc3NhZ2VGdW5jdGlvblN0ZENhbGwgZnJlZWltYWdlX291dHB1dG1lc3NhZ2VzdGRjYWxsX3Byb2MgPSBOVUxMOyAKCnZvaWQgRExMX0NBTExDT05WCkZyZWVJbWFnZV9TZXRPdXRwdXRNZXNzYWdlKEZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlRnVuY3Rpb24gb21mKSB7CglmcmVlaW1hZ2Vfb3V0cHV0bWVzc2FnZV9wcm9jID0gb21mOwp9Cgp2b2lkIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfU2V0T3V0cHV0TWVzc2FnZVN0ZENhbGwoRnJlZUltYWdlX091dHB1dE1lc3NhZ2VGdW5jdGlvblN0ZENhbGwgb21mKSB7CglmcmVlaW1hZ2Vfb3V0cHV0bWVzc2FnZXN0ZGNhbGxfcHJvYyA9IG9tZjsKfQoKdm9pZCBETExfQ0FMTENPTlYKRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKGludCBmaWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7Cgljb25zdCBpbnQgTVNHX1NJWkUgPSA1MTI7IC8vIDUxMiBieXRlcyBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaCBmb3IgYSBzaG9ydCBtZXNzYWdlCgoJaWYgKChmbXQgIT0gTlVMTCkgJiYgKChmcmVlaW1hZ2Vfb3V0cHV0bWVzc2FnZV9wcm9jICE9IE5VTEwpIHx8IChmcmVlaW1hZ2Vfb3V0cHV0bWVzc2FnZXN0ZGNhbGxfcHJvYyAhPSBOVUxMKSkpIHsKCQljaGFyIG1lc3NhZ2VbTVNHX1NJWkVdOwoJCW1lbXNldChtZXNzYWdlLCAwLCBNU0dfU0laRSk7CgoJCS8vIGluaXRpYWxpemUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBsaXN0CgoJCXZhX2xpc3QgYXJnOwoJCXZhX3N0YXJ0KGFyZywgZm10KTsKCgkJLy8gY2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgZm9ybWF0IHN0cmluZwoKCQlpbnQgc3RyX2xlbmd0aCA9IChpbnQpKCAoc3RybGVuKGZtdCkgPiBNU0dfU0laRSkgPyBNU0dfU0laRSA6IHN0cmxlbihmbXQpICk7CgoJCS8vIHBhcnNlIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiAnbWVzc2FnZScKCgkJZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpIDwgc3RyX2xlbmd0aDsgKytpKSB7CgkJCWlmIChmbXRbaV0gPT0gJyUnKSB7CgkJCQlpZiAoaSArIDEgPCBzdHJfbGVuZ3RoKSB7CgkJCQkJc3dpdGNoKHRvbG93ZXIoZm10W2kgKyAxXSkpIHsKCQkJCQkJY2FzZSAnJScgOgoJCQkJCQkJbWVzc2FnZVtqKytdID0gJyUnOwoJCQkJCQkJYnJlYWs7CgoJCQkJCQljYXNlICdvJyA6IC8vIG9jdGFsIG51bWJlcnMKCQkJCQkJewoJCQkJCQkJY2hhciB0bXBbMTZdOwoKCQkJCQkJCV9pdG9hKHZhX2FyZyhhcmcsIGludCksIHRtcCwgOCk7CgoJCQkJCQkJc3RyY2F0KG1lc3NhZ2UsIHRtcCk7CgoJCQkJCQkJaiArPSAoaW50KXN0cmxlbih0bXApOwoKCQkJCQkJCSsraTsKCgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQkJY2FzZSAnaScgOiAvLyBkZWNpbWFsIG51bWJlcnMKCQkJCQkJY2FzZSAnZCcgOgoJCQkJCQl7CgkJCQkJCQljaGFyIHRtcFsxNl07CgoJCQkJCQkJX2l0b2EodmFfYXJnKGFyZywgaW50KSwgdG1wLCAxMCk7CgoJCQkJCQkJc3RyY2F0KG1lc3NhZ2UsIHRtcCk7CgoJCQkJCQkJaiArPSAoaW50KXN0cmxlbih0bXApOwoKCQkJCQkJCSsraTsKCgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQkJY2FzZSAneCcgOiAvLyBoZXhhZGVjaW1hbCBudW1iZXJzCgkJCQkJCXsKCQkJCQkJCWNoYXIgdG1wWzE2XTsKCgkJCQkJCQlfaXRvYSh2YV9hcmcoYXJnLCBpbnQpLCB0bXAsIDE2KTsKCgkJCQkJCQlzdHJjYXQobWVzc2FnZSwgdG1wKTsKCgkJCQkJCQlqICs9IChpbnQpc3RybGVuKHRtcCk7CgoJCQkJCQkJKytpOwoKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgoJCQkJCQljYXNlICdzJyA6IC8vIHN0cmluZ3MKCQkJCQkJewoJCQkJCQkJY2hhciAqdG1wID0gdmFfYXJnKGFyZywgY2hhciopOwoKCQkJCQkJCXN0cmNhdChtZXNzYWdlLCB0bXApOwoKCQkJCQkJCWogKz0gKGludClzdHJsZW4odG1wKTsKCgkJCQkJCQkrK2k7CgoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9OwoJCQkJfSBlbHNlIHsKCQkJCQltZXNzYWdlW2orK10gPSBmbXRbaV07CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQltZXNzYWdlW2orK10gPSBmbXRbaV07CgkJCX07CgkJfQoKCQkvLyBkZWluaXRpYWxpemUgdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBsaXN0CgoJCXZhX2VuZChhcmcpOwoKCQkvLyBvdXRwdXQgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgcHJvZ3JhbQoKCQlpZiAoZnJlZWltYWdlX291dHB1dG1lc3NhZ2VfcHJvYyAhPSBOVUxMKQoJCQlmcmVlaW1hZ2Vfb3V0cHV0bWVzc2FnZV9wcm9jKChGUkVFX0lNQUdFX0ZPUk1BVClmaWYsIG1lc3NhZ2UpOwoKCQlpZiAoZnJlZWltYWdlX291dHB1dG1lc3NhZ2VzdGRjYWxsX3Byb2MgIT0gTlVMTCkKCQkJZnJlZWltYWdlX291dHB1dG1lc3NhZ2VzdGRjYWxsX3Byb2MoKEZSRUVfSU1BR0VfRk9STUFUKWZpZiwgbWVzc2FnZSk7IAoJfQp9Cg==