Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBSQVcgY2FtZXJhIGltYWdlIGxvYWRlcgovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5IAovLyAtIEhlcnbpIERyb2xvbiAoZHJvbG9uQGluZm9uaWUuZnIpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgIi4uL0xpYlJhd0xpdGUvbGlicmF3L2xpYnJhdy5oIgoKI2luY2x1ZGUgIkZyZWVJbWFnZS5oIgojaW5jbHVkZSAiVXRpbGl0aWVzLmgiCiNpbmNsdWRlICIuLi9NZXRhZGF0YS9GcmVlSW1hZ2VUYWcuaCIKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gUGx1Z2luIEludGVyZmFjZQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGF0aWMgaW50IHNfZm9ybWF0X2lkOwoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBJbnRlcm5hbCBmdW5jdGlvbnMKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgIEZyZWVJbWFnZSBkYXRhc3RyZWFtIHdyYXBwZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgTGliUmF3X2ZyZWVpbWFnZV9kYXRhc3RyZWFtIDogcHVibGljIExpYlJhd19hYnN0cmFjdF9kYXRhc3RyZWFtIHsKcHJpdmF0ZTogCglGcmVlSW1hZ2VJTyAqX2lvOwoJZmlfaGFuZGxlIF9oYW5kbGU7Cglsb25nIF9lb2Y7CglJTlQ2NCBfZnNpemU7CgpwdWJsaWM6CglMaWJSYXdfZnJlZWltYWdlX2RhdGFzdHJlYW0oRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSA6IF9pbyhpbyksIF9oYW5kbGUoaGFuZGxlKSB7CgkJbG9uZyBzdGFydF9wb3MgPSBpby0+dGVsbF9wcm9jKGhhbmRsZSk7CgkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIDAsIFNFRUtfRU5EKTsKCQlfZW9mID0gaW8tPnRlbGxfcHJvYyhoYW5kbGUpOwoJCV9mc2l6ZSA9IF9lb2YgLSBzdGFydF9wb3M7CgkJaW8tPnNlZWtfcHJvYyhoYW5kbGUsIHN0YXJ0X3BvcywgU0VFS19TRVQpOwoJfQoKCX5MaWJSYXdfZnJlZWltYWdlX2RhdGFzdHJlYW0oKSB7Cgl9CgogICAgaW50IHZhbGlkKCkgeyAKCQlyZXR1cm4gKF9pbyAmJiBfaGFuZGxlKTsKCX0KCiAgICBpbnQgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBzaXplX3QgY291bnQpIHsgCgkJaWYoc3Vic3RyZWFtKSByZXR1cm4gc3Vic3RyZWFtLT5yZWFkKGJ1ZmZlciwgc2l6ZSwgY291bnQpOwoJCXJldHVybiBfaW8tPnJlYWRfcHJvYyhidWZmZXIsICh1bnNpZ25lZClzaXplLCAodW5zaWduZWQpY291bnQsIF9oYW5kbGUpOwoJfQoKICAgIGludCBzZWVrKElOVDY0IG9mZnNldCwgaW50IG9yaWdpbikgeyAKICAgICAgICBpZihzdWJzdHJlYW0pIHJldHVybiBzdWJzdHJlYW0tPnNlZWsob2Zmc2V0LCBvcmlnaW4pOwoJCXJldHVybiBfaW8tPnNlZWtfcHJvYyhfaGFuZGxlLCAobG9uZylvZmZzZXQsIG9yaWdpbik7Cgl9CgogICAgSU5UNjQgdGVsbCgpIHsgCgkJaWYoc3Vic3RyZWFtKSByZXR1cm4gc3Vic3RyZWFtLT50ZWxsKCk7CiAgICAgICAgcmV0dXJuIF9pby0+dGVsbF9wcm9jKF9oYW5kbGUpOwogICAgfQoJCglJTlQ2NCBzaXplKCkgewoJCXJldHVybiBfZnNpemU7Cgl9CgogICAgaW50IGdldF9jaGFyKCkgeyAKCQlpbnQgYyA9IDA7CgkJaWYoc3Vic3RyZWFtKSByZXR1cm4gc3Vic3RyZWFtLT5nZXRfY2hhcigpOwoJCWlmKCFfaW8tPnJlYWRfcHJvYygmYywgMSwgMSwgX2hhbmRsZSkpIHJldHVybiAtMTsKCQlyZXR1cm4gYzsKICAgfQoJCgljaGFyKiBnZXRzKGNoYXIgKmJ1ZmZlciwgaW50IGxlbmd0aCkgeyAKCQlpZiAoc3Vic3RyZWFtKSByZXR1cm4gc3Vic3RyZWFtLT5nZXRzKGJ1ZmZlciwgbGVuZ3RoKTsKCQltZW1zZXQoYnVmZmVyLCAwLCBsZW5ndGgpOwoJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCQlpZighX2lvLT5yZWFkX3Byb2MoJmJ1ZmZlcltpXSwgMSwgMSwgX2hhbmRsZSkpCgkJCQlyZXR1cm4gTlVMTDsKCQkJaWYoYnVmZmVyW2ldID09IDB4MEEpCgkJCQlicmVhazsKCQl9CgkJcmV0dXJuIGJ1ZmZlcjsKCX0KCglpbnQgc2NhbmZfb25lKGNvbnN0IGNoYXIgKmZtdCwgdm9pZCogdmFsKSB7CgkJc3RkOjpzdHJpbmcgYnVmZmVyOwoJCWNoYXIgZWxlbWVudCA9IDA7CgkJYm9vbCBiRG9uZSA9IGZhbHNlOwoJCWlmKHN1YnN0cmVhbSkgcmV0dXJuIHN1YnN0cmVhbS0+c2NhbmZfb25lKGZtdCx2YWwpOwkJCQkKCQlkbyB7CgkJCWlmKF9pby0+cmVhZF9wcm9jKCZlbGVtZW50LCAxLCAxLCBfaGFuZGxlKSA9PSAxKSB7CgkJCQlzd2l0Y2goZWxlbWVudCkgewoJCQkJCWNhc2UgJzAnOgoJCQkJCWNhc2UgJ1xuJzoKCQkJCQljYXNlICcgJzoKCQkJCQljYXNlICdcdCc6CgkJCQkJCWJEb25lID0gdHJ1ZTsKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJYnJlYWs7CgkJCQl9CgkJCQlidWZmZXIuYXBwZW5kKCZlbGVtZW50LCAxKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiAwOwoJCQl9CgkJfSB3aGlsZSghYkRvbmUpOwoKCQlyZXR1cm4gc3NjYW5mKGJ1ZmZlci5jX3N0cigpLCBmbXQsIHZhbCk7Cgl9CgoJaW50IGVvZigpIHsgCgkJaWYoc3Vic3RyZWFtKSByZXR1cm4gc3Vic3RyZWFtLT5lb2YoKTsKICAgICAgICByZXR1cm4gKF9pby0+dGVsbF9wcm9jKF9oYW5kbGUpID49IF9lb2YpOwogICAgfQoKCXZvaWQgKiBtYWtlX2phc19zdHJlYW0oKSB7CgkJcmV0dXJuIE5VTEw7Cgl9Cn07CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovKioKQ29udmVydCBhIHByb2Nlc3NlZCByYXcgZGF0YSBhcnJheSB0byBhIEZJQklUTUFQCkBwYXJhbSBSYXdQcm9jZXNzb3IgTGliUmF3IGhhbmRsZSBjb250YWluaW5nIHRoZSBwcm9jZXNzZWQgcmF3IGltYWdlCkByZXR1cm4gUmV0dXJucyB0aGUgY29udmVydGVkIGRpYiBpZiBzdWNjZXNzZnVsbCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQoqLwpzdGF0aWMgRklCSVRNQVAgKiAKbGlicmF3X0NvbnZlcnRQcm9jZXNzZWRSYXdUb0RpYihMaWJSYXcgKlJhd1Byb2Nlc3NvcikgewoJRklCSVRNQVAgKmRpYiA9IE5VTEw7CiAgICBpbnQgd2lkdGgsIGhlaWdodCwgY29sb3JzLCBicHA7CgoJdHJ5IHsKCQlpbnQgYmdyID0gMDsJLy8gcGl4ZWwgY29weSBvcmRlcjogUkdCIGlmIChiZ3IgPT0gMCkgYW5kIEJHUiBvdGhlcndpc2UKCgkJLy8gZ2V0IGltYWdlIGluZm8KCQlSYXdQcm9jZXNzb3ItPmdldF9tZW1faW1hZ2VfZm9ybWF0KCZ3aWR0aCwgJmhlaWdodCwgJmNvbG9ycywgJmJwcCk7CgoJCS8vIG9ubHkgMy1jb2xvciBpbWFnZXMgc3VwcG9ydGVkLi4uCgkJaWYoY29sb3JzICE9IDMpIHsKCQkJdGhyb3cgIkxpYlJhdyA6IG9ubHkgMy1jb2xvciBpbWFnZXMgc3VwcG9ydGVkIjsKCQl9CgoJCWlmKGJwcCA9PSAxNikgewoJCQkvLyBhbGxvY2F0ZSBvdXRwdXQgZGliCgkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX1JHQjE2LCB3aWR0aCwgaGVpZ2h0KTsKCQkJaWYoIWRpYikgewoJCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CgkJCX0KCgkJfSBlbHNlIGlmKGJwcCA9PSA4KSB7CiNpZiBGUkVFSU1BR0VfQ09MT1JPUkRFUiA9PSBGUkVFSU1BR0VfQ09MT1JPUkRFUl9CR1IKCQkJYmdyID0gMTsJLy8gb25seSB1c2VmdWwgZm9yIEZJVF9CSVRNQVAgdHlwZXMKI2VuZGlmCgoJCQkvLyBhbGxvY2F0ZSBvdXRwdXQgZGliCgkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX0JJVE1BUCwgd2lkdGgsIGhlaWdodCwgMjQpOwoJCQlpZighZGliKSB7CgkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKCQkJfQoJCX0KCgkJLy8gY29weSBwb3N0LXByb2Nlc3NlZCBiaXRtYXAgZGF0YSBpbnRvIEZJQklUTUFQIGJ1ZmZlcgoJCWlmKFJhd1Byb2Nlc3Nvci0+Y29weV9tZW1faW1hZ2UoRnJlZUltYWdlX0dldEJpdHMoZGliKSwgRnJlZUltYWdlX0dldFBpdGNoKGRpYiksIGJncikgIT0gTElCUkFXX1NVQ0NFU1MpIHsKCQkJdGhyb3cgIkxpYlJhdyA6IGZhaWxlZCB0byBjb3B5IGRhdGEgaW50byBkaWIiOwoJCX0KCgkJLy8gZmxpcCB2ZXJ0aWNhbGx5CgkJRnJlZUltYWdlX0ZsaXBWZXJ0aWNhbChkaWIpOwoKCQlyZXR1cm4gZGliOwoKCX0gY2F0Y2goY29uc3QgY2hhciAqdGV4dCkgewoJCUZyZWVJbWFnZV9VbmxvYWQoZGliKTsKCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOwoJCXJldHVybiBOVUxMOwoJfQp9CgoKLyoqCkNvbnZlcnQgYSBwcm9jZXNzZWQgcmF3IGltYWdlIHRvIGEgRklCSVRNQVAKQHBhcmFtIGltYWdlIFByb2Nlc3NlZCByYXcgaW1hZ2UKQHJldHVybiBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgZGliIGlmIHN1Y2Nlc3NmdWxsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCkBzZWUgbGlicmF3X0xvYWRFbWJlZGRlZFByZXZpZXcKKi8Kc3RhdGljIEZJQklUTUFQICogCmxpYnJhd19Db252ZXJ0UHJvY2Vzc2VkSW1hZ2VUb0RpYihsaWJyYXdfcHJvY2Vzc2VkX2ltYWdlX3QgKmltYWdlKSB7CglGSUJJVE1BUCAqZGliID0gTlVMTDsKCgl0cnkgewoJCXVuc2lnbmVkIHdpZHRoID0gaW1hZ2UtPndpZHRoOwoJCXVuc2lnbmVkIGhlaWdodCA9IGltYWdlLT5oZWlnaHQ7CgkJdW5zaWduZWQgYnBwID0gaW1hZ2UtPmJpdHM7CgkJaWYoYnBwID09IDE2KSB7CgkJCS8vIGFsbG9jYXRlIG91dHB1dCBkaWIKCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfUkdCMTYsIHdpZHRoLCBoZWlnaHQpOwoJCQlpZighZGliKSB7CgkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKCQkJfQoJCQkvLyB3cml0ZSBkYXRhCgkJCVdPUkQgKnJhd19kYXRhID0gKFdPUkQqKWltYWdlLT5kYXRhOwoJCQlmb3IodW5zaWduZWQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQkJRklSR0IxNiAqb3V0cHV0ID0gKEZJUkdCMTYqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKCQkJCQlvdXRwdXRbeF0ucmVkICAgPSByYXdfZGF0YVswXTsKCQkJCQlvdXRwdXRbeF0uZ3JlZW4gPSByYXdfZGF0YVsxXTsKCQkJCQlvdXRwdXRbeF0uYmx1ZSAgPSByYXdfZGF0YVsyXTsKCQkJCQlyYXdfZGF0YSArPSAzOwoJCQkJfQoJCQl9CgkJfSBlbHNlIGlmKGJwcCA9PSA4KSB7CgkJCS8vIGFsbG9jYXRlIG91dHB1dCBkaWIKCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlVChGSVRfQklUTUFQLCB3aWR0aCwgaGVpZ2h0LCAyNCk7CgkJCWlmKCFkaWIpIHsKCQkJCXRocm93IEZJX01TR19FUlJPUl9ESUJfTUVNT1JZOwoJCQl9CgkJCS8vIHdyaXRlIGRhdGEKCQkJQllURSAqcmF3X2RhdGEgPSAoQllURSopaW1hZ2UtPmRhdGE7CgkJCWZvcih1bnNpZ25lZCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CgkJCQlSR0JUUklQTEUgKm91dHB1dCA9IChSR0JUUklQTEUqKUZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKCQkJCWZvcih1bnNpZ25lZCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKCQkJCQlvdXRwdXRbeF0ucmdidFJlZCAgID0gcmF3X2RhdGFbMF07CgkJCQkJb3V0cHV0W3hdLnJnYnRHcmVlbiA9IHJhd19kYXRhWzFdOwoJCQkJCW91dHB1dFt4XS5yZ2J0Qmx1ZSAgPSByYXdfZGF0YVsyXTsKCQkJCQlyYXdfZGF0YSArPSAzOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXJldHVybiBkaWI7CgoJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CgkJRnJlZUltYWdlX1VubG9hZChkaWIpOwoJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CgkJcmV0dXJuIE5VTEw7Cgl9Cn0KCi8qKiAKR2V0IHRoZSBlbWJlZGRlZCBKUEVHIHByZXZpZXcgaW1hZ2UgZnJvbSBSQVcgcGljdHVyZSB3aXRoIGluY2x1ZGVkIEV4aWYgRGF0YS4gCkBwYXJhbSBSYXdQcm9jZXNzb3IgTGlicmF3IGhhbmRsZQpAcGFyYW0gZmxhZ3MgSlBFRyBsb2FkIGZsYWdzCkByZXR1cm4gUmV0dXJucyB0aGUgbG9hZGVkIGRpYiBpZiBzdWNjZXNzZnVsbCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQoqLwpzdGF0aWMgRklCSVRNQVAgKiAKbGlicmF3X0xvYWRFbWJlZGRlZFByZXZpZXcoTGliUmF3ICpSYXdQcm9jZXNzb3IsIGludCBmbGFncykgewoJRklCSVRNQVAgKmRpYiA9IE5VTEw7CglsaWJyYXdfcHJvY2Vzc2VkX2ltYWdlX3QgKnRodW1iX2ltYWdlID0gTlVMTDsKCQoJdHJ5IHsKCQkvLyB1bnBhY2sgZGF0YQoJCWlmKFJhd1Byb2Nlc3Nvci0+dW5wYWNrX3RodW1iKCkgIT0gTElCUkFXX1NVQ0NFU1MpIHsKCQkJLy8gcnVuIHNpbGVudGx5ICJMaWJSYXcgOiBmYWlsZWQgdG8gcnVuIHVucGFja190aHVtYiIKCQkJcmV0dXJuIE5VTEw7CgkJfQoKCQkvLyByZXRyaWV2ZSB0aHVtYiBpbWFnZQoJCWludCBlcnJvcl9jb2RlID0gMDsKCQl0aHVtYl9pbWFnZSA9IFJhd1Byb2Nlc3Nvci0+ZGNyYXdfbWFrZV9tZW1fdGh1bWIoJmVycm9yX2NvZGUpOwoJCWlmKHRodW1iX2ltYWdlKSB7CgkJCWlmKHRodW1iX2ltYWdlLT50eXBlICE9IExJQlJBV19JTUFHRV9CSVRNQVApIHsKCQkJCS8vIGF0dGFjaCB0aGUgYmluYXJ5IGRhdGEgdG8gYSBtZW1vcnkgc3RyZWFtCgkJCQlGSU1FTU9SWSAqaG1lbSA9IEZyZWVJbWFnZV9PcGVuTWVtb3J5KChCWVRFKil0aHVtYl9pbWFnZS0+ZGF0YSwgKERXT1JEKXRodW1iX2ltYWdlLT5kYXRhX3NpemUpOwoJCQkJLy8gZ2V0IHRoZSBmaWxlIHR5cGUKCQkJCUZSRUVfSU1BR0VfRk9STUFUIGZpZiA9IEZyZWVJbWFnZV9HZXRGaWxlVHlwZUZyb21NZW1vcnkoaG1lbSwgMCk7CgkJCQlpZihmaWYgPT0gRklGX0pQRUcpIHsKCQkJCQkvLyByb3RhdGUgYWNjb3JkaW5nIHRvIEV4aWYgb3JpZW50YXRpb24KCQkJCQlmbGFncyB8PSBKUEVHX0VYSUZST1RBVEU7CgkJCQl9CgkJCQkvLyBsb2FkIGFuIGltYWdlIGZyb20gdGhlIG1lbW9yeSBzdHJlYW0KCQkJCWRpYiA9IEZyZWVJbWFnZV9Mb2FkRnJvbU1lbW9yeShmaWYsIGhtZW0sIGZsYWdzKTsKCQkJCS8vIGNsb3NlIHRoZSBzdHJlYW0KCQkJCUZyZWVJbWFnZV9DbG9zZU1lbW9yeShobWVtKTsKCQkJfSBlbHNlIGlmKChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSAhPSBGSUZfTE9BRF9OT1BJWEVMUykgewoJCQkJLy8gY29udmVydCBwcm9jZXNzZWQgZGF0YSB0byBvdXRwdXQgZGliCgkJCQlkaWIgPSBsaWJyYXdfQ29udmVydFByb2Nlc3NlZEltYWdlVG9EaWIodGh1bWJfaW1hZ2UpOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhyb3cgIkxpYlJhdyA6IGZhaWxlZCB0byBydW4gZGNyYXdfbWFrZV9tZW1fdGh1bWIiOwoJCX0KCgkJLy8gY2xlYW4tdXAgYW5kIHJldHVybgoJCVJhd1Byb2Nlc3Nvci0+ZGNyYXdfY2xlYXJfbWVtKHRodW1iX2ltYWdlKTsKCgkJcmV0dXJuIGRpYjsKCgl9IGNhdGNoKGNvbnN0IGNoYXIgKnRleHQpIHsKCQkvLyBjbGVhbi11cCBhbmQgcmV0dXJuCgkJaWYodGh1bWJfaW1hZ2UpIHsKCQkJUmF3UHJvY2Vzc29yLT5kY3Jhd19jbGVhcl9tZW0odGh1bWJfaW1hZ2UpOwoJCX0KCQlpZih0ZXh0ICE9IE5VTEwpIHsKCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKCQl9Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KLyoqCkxvYWQgcmF3IGRhdGEgYW5kIGNvbnZlcnQgdG8gRklCSVRNQVAKQHBhcmFtIFJhd1Byb2Nlc3NvciBMaWJyYXcgaGFuZGxlCkBwYXJhbSBiaXRzcGVyc2FtcGxlIE91dHB1dCBiaXRkZXB0aCAoOC0gb3IgMTYtYml0KQpAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRlZCBkaWIgaWYgc3VjY2Vzc2Z1bGwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKi8Kc3RhdGljIEZJQklUTUFQICogCmxpYnJhd19Mb2FkUmF3RGF0YShMaWJSYXcgKlJhd1Byb2Nlc3NvciwgaW50IGJpdHNwZXJzYW1wbGUpIHsKCUZJQklUTUFQICpkaWIgPSBOVUxMOwoKCXRyeSB7CgkJLy8gc2V0IGRlY29kaW5nIHBhcmFtZXRlcnMKCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQoJCS8vICgtNikgMTYtYml0IG9yIDgtYml0CgkJUmF3UHJvY2Vzc29yLT5pbWdkYXRhLnBhcmFtcy5vdXRwdXRfYnBzID0gYml0c3BlcnNhbXBsZTsKCQkvLyAoLWcgcG93ZXIgdG9lX3Nsb3BlKQoJCWlmKGJpdHNwZXJzYW1wbGUgPT0gMTYpIHsKCQkJLy8gc2V0IC1nIDEgMSBmb3IgbGluZWFyIGN1cnZlCgkJCVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5wYXJhbXMuZ2FtbVswXSA9IDE7CgkJCVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5wYXJhbXMuZ2FtbVsxXSA9IDE7CgkJfSBlbHNlIGlmKGJpdHNwZXJzYW1wbGUgPT0gOCkgewoJCQkvLyBieSBkZWZhdWx0IHNldHRpbmdzIGZvciByZWMuIEJULjcwOSBhcmUgdXNlZDogcG93ZXIgMi4yMjIgKGkuZS4gZ2FtbVswXT0xLzIuMjIyKSBhbmQgc2xvcGUgNC41CgkJCVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5wYXJhbXMuZ2FtbVswXSA9IDEvMi4yMjI7CgkJCVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5wYXJhbXMuZ2FtbVsxXSA9IDQuNTsKCQl9CgkJLy8gKC1XKSBEb24ndCB1c2UgYXV0b21hdGljIGluY3JlYXNlIG9mIGJyaWdodG5lc3MgYnkgaGlzdG9ncmFtCgkJUmF3UHJvY2Vzc29yLT5pbWdkYXRhLnBhcmFtcy5ub19hdXRvX2JyaWdodCA9IDE7CgkJLy8gKC1hKSBVc2UgYXV0b21hdGljIHdoaXRlIGJhbGFuY2Ugb2J0YWluZWQgYWZ0ZXIgYXZlcmFnaW5nIG92ZXIgdGhlIGVudGlyZSBpbWFnZQoJCVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5wYXJhbXMudXNlX2F1dG9fd2IgPSAxOwoJCS8vICgtcSAzKSBBZGFwdGl2ZSBob21vZ2VuZWl0eS1kaXJlY3RlZCBkZW1vc2FpY2luZyBhbGdvcml0aG0gKEFIRCkKCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLnVzZXJfcXVhbCA9IDM7CgoJCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJCS8vIHVucGFjayBkYXRhCgkJaWYoUmF3UHJvY2Vzc29yLT51bnBhY2soKSAhPSBMSUJSQVdfU1VDQ0VTUykgewoJCQl0aHJvdyAiTGliUmF3IDogZmFpbGVkIHRvIHVucGFjayBkYXRhIjsKCQl9CgoJCS8vIHByb2Nlc3MgZGF0YSAoLi4uIG1vc3QgY29uc3VtaW5nIHRhc2sgLi4uKQoJCWlmKFJhd1Byb2Nlc3Nvci0+ZGNyYXdfcHJvY2VzcygpICE9IExJQlJBV19TVUNDRVNTKSB7CgkJCXRocm93ICJMaWJSYXcgOiBmYWlsZWQgdG8gcHJvY2VzcyBkYXRhIjsKCQl9CgoJCS8vIHJldHJpZXZlIHByb2Nlc3NlZCBpbWFnZQoJCWRpYiA9IGxpYnJhd19Db252ZXJ0UHJvY2Vzc2VkUmF3VG9EaWIoUmF3UHJvY2Vzc29yKTsKCQoJCXJldHVybiBkaWI7CgoJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CgkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKHNfZm9ybWF0X2lkLCB0ZXh0KTsKCQlyZXR1cm4gTlVMTDsKCX0KfQoKLyoqCkxvYWQgdGhlIEJheWVyIG1hdHJpeCAodW5wcm9jZXNzZWQgcmF3IGRhdGEpIGFzIGEgRklUX1VJTlQxNiBpbWFnZS4gCk5vdGUgdGhhdCBzb21lIGZvcm1hdHMgZG9uJ3QgaGF2ZSBhIEJheWVyIG1hdHJpeCAoZS5nLiBGb3Zlb24sIENhbm9uIHNSQVcsIGRlbW9zYWljZWQgRE5HIGZpbGVzKS4gCkBwYXJhbSBSYXdQcm9jZXNzb3IgTGlicmF3IGhhbmRsZQpAcmV0dXJuIFJldHVybnMgdGhlIGxvYWRlZCBkaWIgaWYgc3VjY2Vzc2Z1bGwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKKi8Kc3RhdGljIEZJQklUTUFQICogCmxpYnJhd19Mb2FkVW5wcm9jZXNzZWREYXRhKExpYlJhdyAqUmF3UHJvY2Vzc29yKSB7CglGSUJJVE1BUCAqZGliID0gTlVMTDsKCgl0cnkgewoJCS8vIHVucGFjayBkYXRhCgkJaWYoUmF3UHJvY2Vzc29yLT51bnBhY2soKSAhPSBMSUJSQVdfU1VDQ0VTUykgewoJCQl0aHJvdyAiTGliUmF3IDogZmFpbGVkIHRvIHVucGFjayBkYXRhIjsKCQl9CgoJCS8vIGNoZWNrIGZvciBhIHN1cHBvcnRlZCBCYXllciBmb3JtYXQKCQlpZighKFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5pZGF0YS5maWx0ZXJzIHx8IFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5pZGF0YS5jb2xvcnMgPT0gMSkpIHsKCQkJdGhyb3cgIkxpYlJhdyA6IG9ubHkgQmF5ZXItcGF0dGVybiBSQVcgZmlsZXMgYXJlIHN1cHBvcnRlZCI7CgkJfQoKCQkvLyBhbGxvY2F0ZSBvdXRwdXQgZGliCgkJY29uc3QgdW5zaWduZWQgd2lkdGggPSBSYXdQcm9jZXNzb3ItPmltZ2RhdGEuc2l6ZXMucmF3X3dpZHRoOwoJCWNvbnN0IHVuc2lnbmVkIGhlaWdodCA9IFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5zaXplcy5yYXdfaGVpZ2h0OwoJCWNvbnN0IHNpemVfdCBsaW5lX3NpemUgPSB3aWR0aCAqIHNpemVvZihXT1JEKTsKCQljb25zdCBXT1JEICpzcmNfYml0cyA9IChXT1JEKilSYXdQcm9jZXNzb3ItPmltZ2RhdGEucmF3ZGF0YS5yYXdfaW1hZ2U7CgoJCWlmKHNyY19iaXRzKSB7CgkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZVQoRklUX1VJTlQxNiwgd2lkdGgsIGhlaWdodCk7CgkJfQoJCWlmKCFkaWIpIHsKCQkJdGhyb3cgRklfTVNHX0VSUk9SX0RJQl9NRU1PUlk7CgkJfQoKCQkvLyByZXRyaWV2ZSB0aGUgcmF3IGltYWdlCgkJZm9yKHVuc2lnbmVkIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKCQkJV09SRCAqZHN0X2JpdHMgPSAoV09SRCopRnJlZUltYWdlX0dldFNjYW5MaW5lKGRpYiwgaGVpZ2h0IC0gMSAtIHkpOwoJCQltZW1jcHkoZHN0X2JpdHMsIHNyY19iaXRzLCBsaW5lX3NpemUpOwoJCQlzcmNfYml0cyArPSB3aWR0aDsKCQl9CgoJCS8vIHN0b3JlIG1ldGFkYXRhIG5lZWRlZCBmb3IgcG9zdC1wcm9jZXNzaW5nCgkJewoJCQljaGFyIHZhbHVlWzUxMl07CgoJCQljb25zdCBsaWJyYXdfaW1hZ2Vfc2l6ZXNfdCAqc2l6ZXMgPSAmUmF3UHJvY2Vzc29yLT5pbWdkYXRhLnNpemVzOwoKCQkJLy8gaW1hZ2Ugb3V0cHV0IHdpZHRoICYgaGVpZ2h0CgkJCXsKCQkJCXNwcmludGYodmFsdWUsICIlZCIsIHNpemVzLT5pd2lkdGgpOwoJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3Lk91dHB1dC5XaWR0aCIsIHZhbHVlKTsKCQkJCQoJCQkJc3ByaW50Zih2YWx1ZSwgIiVkIiwgc2l6ZXMtPmloZWlnaHQpOwoJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3Lk91dHB1dC5IZWlnaHQiLCB2YWx1ZSk7CgkJCX0KCgkJCS8vIGltYWdlIG91dHB1dCBmcmFtZQoJCQl7CgkJCQljb25zdCB1bnNpZ25lZCBmX2xlZnQgPSBzaXplcy0+bGVmdF9tYXJnaW47CgkJCQljb25zdCB1bnNpZ25lZCBmX3RvcCA9IHNpemVzLT50b3BfbWFyZ2luOwoJCQkJY29uc3QgdW5zaWduZWQgZl93aWR0aCA9IHNpemVzLT53aWR0aDsKCQkJCWNvbnN0IHVuc2lnbmVkIGZfaGVpZ2h0ID0gc2l6ZXMtPmhlaWdodDsKCQkJCQoJCQkJc3ByaW50Zih2YWx1ZSwgIiVkIiwgZl9sZWZ0KTsKCQkJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YUtleVZhbHVlKEZJTURfQ09NTUVOVFMsIGRpYiwgIlJhdy5GcmFtZS5MZWZ0IiwgdmFsdWUpOwoKCQkJCXNwcmludGYodmFsdWUsICIlZCIsIGZfdG9wKTsKCQkJCUZyZWVJbWFnZV9TZXRNZXRhZGF0YUtleVZhbHVlKEZJTURfQ09NTUVOVFMsIGRpYiwgIlJhdy5GcmFtZS5Ub3AiLCB2YWx1ZSk7CgoJCQkJc3ByaW50Zih2YWx1ZSwgIiVkIiwgZl93aWR0aCk7CgkJCQlGcmVlSW1hZ2VfU2V0TWV0YWRhdGFLZXlWYWx1ZShGSU1EX0NPTU1FTlRTLCBkaWIsICJSYXcuRnJhbWUuV2lkdGgiLCB2YWx1ZSk7CgoJCQkJc3ByaW50Zih2YWx1ZSwgIiVkIiwgZl9oZWlnaHQpOwoJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3LkZyYW1lLkhlaWdodCIsIHZhbHVlKTsKCQkJfQoKCQkJLy8gQmF5ZXIgcGF0dGVybgoJCQkvLyBNYXNrIGRlc2NyaWJpbmcgdGhlIG9yZGVyIG9mIGNvbG9yIHBpeGVscyBpbiB0aGUgbWF0cml4LiAKCQkJLy8gVGhpcyBmaWVsZCBkZXNjcmliZSAxNiBwaXhlbHMgKDggcm93cyB3aXRoIHR3byBwaXhlbHMgaW4gZWFjaCwgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBmcm9tIHRvcCB0byBib3R0b20pLiAKCgkJCWlmKFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5pZGF0YS5maWx0ZXJzKSB7CgkJCQkvLyBkZXNjcmlwdGlvbiBvZiBjb2xvcnMgbnVtYmVyZWQgZnJvbSAwIHRvIDMgKFJHQkcsUkdCRSxHTUNZLCBvciBHQlRHKQoJCQkJY2hhciAqY2Rlc2MgPSBSYXdQcm9jZXNzb3ItPmltZ2RhdGEuaWRhdGEuY2Rlc2M7CgkJCQlpZighY2Rlc2NbM10pIHsKCQkJCQljZGVzY1szXSA9ICdHJzsKCQkJCX0KCQkJCWNoYXIgKnBhdHRlcm4gPSAmdmFsdWVbMF07CgkJCQlmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewoJCQkJCXBhdHRlcm5baV0gPSBjZGVzY1sgUmF3UHJvY2Vzc29yLT5mY29sKGkgPj4gMSwgaSAmIDEpIF07CgkJCQl9CgkJCQlwYXR0ZXJuWzE2XSA9IDA7CgoJCQkJRnJlZUltYWdlX1NldE1ldGFkYXRhS2V5VmFsdWUoRklNRF9DT01NRU5UUywgZGliLCAiUmF3LkJheWVyUGF0dGVybiIsIHZhbHVlKTsKCQkJfQoJCX0KCQoJCXJldHVybiBkaWI7CgoJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CgkJRnJlZUltYWdlX1VubG9hZChkaWIpOwoJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CgkJcmV0dXJuIE5VTEw7Cgl9Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gUGx1Z2luIEltcGxlbWVudGF0aW9uCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCkZvcm1hdCgpIHsKCXJldHVybiAiUkFXIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRGVzY3JpcHRpb24oKSB7CglyZXR1cm4gIlJBVyBjYW1lcmEgaW1hZ2UiOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpFeHRlbnNpb24oKSB7CgkvKioKCUJlbG93IGFyZSBrbm93biBSQVcgZmlsZSBleHRlbnNpb25zIHRoYXQgeW91IGNhbiBjaGVjayB1c2luZyBGcmVlSW1hZ2VfR2V0RklGRnJvbUZvcm1hdC4gCglJZiBhIGZpbGUgZXh0ZW5zaW9uIGlzIG5vdCBsaXN0ZWQsIHRoYXQgZG9lc24ndCBtZWFuIHRoYXQgeW91IGNhbm5vdCBsb2FkIGl0LiAKCVVzaW5nIEZyZWVJbWFnZV9HZXRGaWxlVHlwZSBpcyB0aGUgYmVzdCB3YXkgdG8ga25vdyBpZiBhIFJBVyBmaWxlIGZvcm1hdCBpcyBzdXBwb3J0ZWQuIAoJKi8KCXN0YXRpYyBjb25zdCBjaGFyICpyYXdfZXh0ZW5zaW9ucyA9IAoJCSIzZnIsIiAgIC8vIEhhc3NlbGJsYWQgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkiYXJ3LCIgICAvLyBTb255IERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQgZm9yIEFscGhhIGRldmljZXMuCgkJImJheSwiICAgLy8gQ2FzaW8gRGlnaXRhbCBDYW1lcmEgUmF3IEZpbGUgRm9ybWF0LgoJCSJibXEsIiAgIC8vIE51Q29yZSBSYXcgSW1hZ2UgRmlsZS4KCQkiY2FwLCIgICAvLyBQaGFzZSBPbmUgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkiY2luZSwiICAvLyBQaGFudG9tIFNvZnR3YXJlIFJhdyBJbWFnZSBGaWxlLgoJCSJjcjIsIiAgIC8vIENhbm9uIERpZ2l0YWwgQ2FtZXJhIFJBVyBJbWFnZSBGb3JtYXQgdmVyc2lvbiAyLjAuIFRoZXNlIGltYWdlcyBhcmUgYmFzZWQgb24gdGhlIFRJRkYgaW1hZ2Ugc3RhbmRhcmQuCgkJImNydywiICAgLy8gQ2Fub24gRGlnaXRhbCBDYW1lcmEgUkFXIEltYWdlIEZvcm1hdCB2ZXJzaW9uIDEuMC4gCgkJImNzMSwiICAgLy8gU2luYXIgQ2FwdHVyZSBTaG9wIFJhdyBJbWFnZSBGaWxlLgoJCSJkYzIsIiAgIC8vIEtvZGFrIERDMjUgRGlnaXRhbCBDYW1lcmEgRmlsZS4KCQkiZGNyLCIgICAvLyBLb2RhayBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0IGZvciB0aGVzZSBtb2RlbHM6IEtvZGFrIERTQyBQcm8gU0xSL2MsIEtvZGFrIERTQyBQcm8gU0xSL24sIEtvZGFrIERTQyBQcm8gMTROLCBLb2RhayBEU0MgUFJPIDE0bnguCgkJImRyZiwiICAgLy8gS29kYWsgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkiZHNjLCIgICAvLyBLb2RhayBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJkbmcsIiAgIC8vIEFkb2JlIERpZ2l0YWwgTmVnYXRpdmU6IERORyBpcyBwdWJsaWNseSBhdmFpbGFibGUgYXJjaGl2YWwgZm9ybWF0IGZvciB0aGUgcmF3IGZpbGVzIGdlbmVyYXRlZCBieSBkaWdpdGFsIGNhbWVyYXMuIEJ5IGFkZHJlc3NpbmcgdGhlIGxhY2sgb2YgYW4gb3BlbiBzdGFuZGFyZCBmb3IgdGhlIHJhdyBmaWxlcyBjcmVhdGVkIGJ5IGluZGl2aWR1YWwgY2FtZXJhIG1vZGVscywgRE5HIGhlbHBzIGVuc3VyZSB0aGF0IHBob3RvZ3JhcGhlcnMgd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGVpciBmaWxlcyBpbiB0aGUgZnV0dXJlLiAKCQkiZXJmLCIgICAvLyBFcHNvbiBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJmZmYsIiAgIC8vIEltYWNvbiBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJpYSwiICAgIC8vIFNpbmFyIFJhdyBJbWFnZSBGaWxlLgoJCSJpaXEsIiAgIC8vIFBoYXNlIE9uZSBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJrMjUsIiAgIC8vIEtvZGFrIERDMjUgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkia2MyLCIgICAvLyBLb2RhayBEQ1MyMDAgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkia2RjLCIgICAvLyBLb2RhayBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJtZGMsIiAgIC8vIE1pbm9sdGEgUkQxNzUgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkibWVmLCIgICAvLyBNYW1peWEgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkibW9zLCIgICAvLyBMZWFmIFJhdyBJbWFnZSBGaWxlLgoJCSJtcncsIiAgIC8vIE1pbm9sdGEgRGltYWdlIERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCgkJIm5lZiwiICAgLy8gTmlrb24gRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkibnJ3LCIgICAvLyBOaWtvbiBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJvcmYsIiAgIC8vIE9seW1wdXMgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkicGVmLCIgICAvLyBQZW50YXggRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkicHR4LCIgICAvLyBQZW50YXggRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkicHhuLCIgICAvLyBMb2dpdGVjaCBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJxdGssIiAgIC8vIEFwcGxlIFF1aWNrdGFrZSAxMDAvMTUwIERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQuCgkJInJhZiwiICAgLy8gRnVqaSBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJyYXcsIiAgIC8vIFBhbmFzb25pYyBEaWdpdGFsIENhbWVyYSBJbWFnZSBGb3JtYXQuCgkJInJkYywiICAgLy8gRGlnaXRhbCBGb3RvIE1ha2VyIFJhdyBJbWFnZSBGaWxlLgoJCSJydzIsIiAgIC8vIFBhbmFzb25pYyBMWDMgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkicndsLCIJIC8vIExlaWNhIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJyd3osIiAgIC8vIFJhd3pvciBEaWdpdGFsIENhbWVyYSBSYXcgSW1hZ2UgRm9ybWF0LgoJCSJzcjIsIiAgIC8vIFNvbnkgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdC4KCQkic3JmLCIgICAvLyBTb255IERpZ2l0YWwgQ2FtZXJhIFJhdyBJbWFnZSBGb3JtYXQgZm9yIERTQy1GODI4IDggbWVnYXBpeGVsIGRpZ2l0YWwgY2FtZXJhIG9yIFNvbnkgRFNDLVIxLgoJCSJzcncsIiAgIC8vIFNhbXN1bmcgUmF3IEltYWdlIEZvcm1hdC4KCQkic3RpLCIgICAvLyBTaW5hciBDYXB0dXJlIFNob3AgUmF3IEltYWdlIEZpbGUuCgkJIngzZiI7ICAgLy8gU2lnbWEgRGlnaXRhbCBDYW1lcmEgUmF3IEltYWdlIEZvcm1hdCBmb3IgZGV2aWNlcyBiYXNlZCBvbiBGb3Zlb24gWDMgZGlyZWN0IGltYWdlIHNlbnNvci4KCXJldHVybiByYXdfZXh0ZW5zaW9uczsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKUmVnRXhwcigpIHsKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpNaW1lVHlwZSgpIHsKCXJldHVybiAiaW1hZ2UveC1kY3JhdyI7Cn0KCnN0YXRpYyBCT09MIApIYXNNYWdpY0hlYWRlcihGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKCWNvbnN0IHVuc2lnbmVkIHNpZ25hdHVyZV9zaXplID0gMzI7CglCWVRFIHNpZ25hdHVyZVtzaWduYXR1cmVfc2l6ZV0gPSB7IDAgfTsKCS8qCglub3RlOiBjbGFzc2ljIFRJRkYgc2lnbmF0dXJlIGlzCgl7IDB4NDksIDB4NDksIDB4MkEsIDB4MDAgfSBDbGFzc2ljIFRJRkYsIGxpdHRsZS1lbmRpYW4KCXsgMHg0RCwgMHg0RCwgMHgwMCwgMHgyQSB9IENsYXNzaWMgVElGRiwgYmlnLWVuZGlhbgoJKi8KCS8vIENhbm9uIChDUjIpLCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIKCWNvbnN0IEJZVEUgQ1IyX0lJW10gPSB7IDB4NDksIDB4NDksIDB4MkEsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDMsIDB4NTIsIDB4MDIsIDB4MDAgfTsKCS8vIENhbm9uIChDUlcpLCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIKCWNvbnN0IEJZVEUgQ1JXX0lJW10gPSB7IDB4NDksIDB4NDksIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDgsIDB4NDUsIDB4NDEsIDB4NTAsIDB4NDMsIDB4NDMsIDB4NDQsIDB4NTIsIDB4MDIsIDB4MDAgfTsKCS8vIE1pbm9sdGEgKE1SVykKCWNvbnN0IEJZVEUgTVJXW10gPSB7IDB4MDAsIDB4NEQsIDB4NTIsIDB4NEQsIDB4MDAgfTsKCS8vIE9seW1wdXMgKE9SRiksIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlcgoJY29uc3QgQllURSBPUkZfSUlSU1tdID0geyAweDQ5LCAweDQ5LCAweDUyLCAweDUzLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH07IAoJY29uc3QgQllURSBPUkZfSUlST1tdID0geyAweDQ5LCAweDQ5LCAweDUyLCAweDRGLCAweDA4LCAweDAwLCAweDAwLCAweDAwIH07IAoJLy8gT2x5bXB1cyAoT1JGKSwgYmlnLWVuZGlhbiBieXRlIG9yZGVyCgljb25zdCBCWVRFIE9SRl9NTU9SW10gPSB7IDB4NEQsIDB4NEQsIDB4NEYsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDggfTsgCgkvLyBGdWppZmlsbSAoUkFGKQoJY29uc3QgQllURSBSQUZbXSA9IHsgMHg0NiwgMHg1NSwgMHg0QSwgMHg0OSwgMHg0NiwgMHg0OSwgMHg0QywgMHg0RCwgMHg0MywgMHg0MywgMHg0NCwgMHgyRCwgMHg1MiwgMHg0MSwgMHg1NywgMHgyMCB9OwoJLy8gUGFuYXNvbmljIChSVzIpIG9yIExlaWNhIChSV0wpLCBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIKCWNvbnN0IEJZVEUgUld4X0lJW10gPSB7IDB4NDksIDB4NDksIDB4NTUsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4RTcsIDB4NzQsIDB4RDgsIDB4RjgsIDB4MjUsIDB4MUQsIDB4NEQsIDB4OTQsIDB4N0EsIDB4NkUsIDB4NzcsIDB4ODIsIDB4MkIsIDB4NUQsIDB4NkEgfTsKCS8vIFBhbmFzb25pYyAoUkFXKSBvciBMZWljYSAoUkFXKSwgbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyCgljb25zdCBCWVRFIFJBV19JSVtdID0geyAweDQ5LCAweDQ5LCAweDU1LCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwIH07CgkvLyBGb3Zlb24gKFgzRikKCWNvbnN0IEJZVEUgWDNGW10gPSB7IDB4NDYsIDB4NEYsIDB4NTYsIDB4NjIgfTsKCglpZihpby0+cmVhZF9wcm9jKHNpZ25hdHVyZSwgMSwgc2lnbmF0dXJlX3NpemUsIGhhbmRsZSkgIT0gc2lnbmF0dXJlX3NpemUpIHsKCQlyZXR1cm4gRkFMU0U7Cgl9CglpZihtZW1jbXAoQ1IyX0lJLCBzaWduYXR1cmUsIDEyKSA9PSAwKQoJCXJldHVybiBUUlVFOwoJaWYobWVtY21wKENSV19JSSwgc2lnbmF0dXJlLCAxNikgPT0gMCkKCQlyZXR1cm4gVFJVRTsKCWlmKG1lbWNtcChNUlcsIHNpZ25hdHVyZSwgNSkgPT0gMCkKCQlyZXR1cm4gVFJVRTsKCWlmKG1lbWNtcChPUkZfSUlSUywgc2lnbmF0dXJlLCA4KSA9PSAwKQoJCXJldHVybiBUUlVFOwoJaWYobWVtY21wKE9SRl9JSVJPLCBzaWduYXR1cmUsIDgpID09IDApCgkJcmV0dXJuIFRSVUU7CglpZihtZW1jbXAoT1JGX01NT1IsIHNpZ25hdHVyZSwgOCkgPT0gMCkKCQlyZXR1cm4gVFJVRTsKCWlmKG1lbWNtcChSQUYsIHNpZ25hdHVyZSwgMTYpID09IDApCgkJcmV0dXJuIFRSVUU7CglpZihtZW1jbXAoUld4X0lJLCBzaWduYXR1cmUsIDI0KSA9PSAwKQoJCXJldHVybiBUUlVFOwoJaWYobWVtY21wKFJBV19JSSwgc2lnbmF0dXJlLCAxOCkgPT0gMCkKCQlyZXR1cm4gVFJVRTsKCWlmKG1lbWNtcChYM0YsIHNpZ25hdHVyZSwgNCkgPT0gMCkKCQlyZXR1cm4gVFJVRTsKCglyZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKCS8vIHNvbWUgUkFXIGZpbGVzIGhhdmUgYSBtYWdpYyBzaWduYXR1cmUgKG1vc3Qgb2YgdGhlbSBoYXZlIGEgVElGRiBzaWduYXR1cmUpCgkvLyB0cnkgdG8gY2hlY2sgdGhpcyBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGUgZmlsZSBpZGVudGlmaWNhdGlvbgoJewoJCWxvbmcgdGVsbCA9IGlvLT50ZWxsX3Byb2MoaGFuZGxlKTsKCQlpZiggSGFzTWFnaWNIZWFkZXIoaW8sIGhhbmRsZSkgKSB7CgkJCXJldHVybiBUUlVFOwoJCX0gZWxzZSB7CgkJCWlvLT5zZWVrX3Byb2MoaGFuZGxlLCB0ZWxsLCBTRUVLX1NFVCk7CgkJfQoJfQoKCS8vIG5vIG1hZ2ljIHNpZ25hdHVyZSA6IHdlIG5lZWQgdG8gb3BlbiB0aGUgZmlsZSAoaXQgd2lsbCB0YWtlIG1vcmUgdGltZSB0byBpZGVudGlmeSBpdCkKCS8vIGRvIG5vdCBkZWNsYXJlIFJhd1Byb2Nlc3NvciBvbiB0aGUgc3RhY2sgYXMgaXQgbWF5IGJlIGh1Z2UgKDMwMCBLQikKCXsKCQlMaWJSYXcgKlJhd1Byb2Nlc3NvciA9IG5ldyhzdGQ6Om5vdGhyb3cpIExpYlJhdzsKCgkJaWYoUmF3UHJvY2Vzc29yKSB7CgkJCUJPT0wgYlN1Y2Nlc3MgPSBUUlVFOwoKCQkJLy8gd3JhcCB0aGUgaW5wdXQgZGF0YXN0cmVhbQoJCQlMaWJSYXdfZnJlZWltYWdlX2RhdGFzdHJlYW0gZGF0YXN0cmVhbShpbywgaGFuZGxlKTsKCgkJCS8vIG9wZW4gdGhlIGRhdGFzdHJlYW0KCQkJaWYoUmF3UHJvY2Vzc29yLT5vcGVuX2RhdGFzdHJlYW0oJmRhdGFzdHJlYW0pICE9IExJQlJBV19TVUNDRVNTKSB7CgkJCQliU3VjY2VzcyA9IEZBTFNFOwkvLyBMaWJSYXcgOiBmYWlsZWQgdG8gb3BlbiBpbnB1dCBzdHJlYW0gKHVua25vd24gZm9ybWF0KQoJCQl9CgoJCQkvLyBjbGVhbi11cCBpbnRlcm5hbCBtZW1vcnkgYWxsb2NhdGlvbnMKCQkJUmF3UHJvY2Vzc29yLT5yZWN5Y2xlKCk7CgkJCWRlbGV0ZSBSYXdQcm9jZXNzb3I7CgoJCQlyZXR1cm4gYlN1Y2Nlc3M7CgkJfQoJfQoKCXJldHVybiBGQUxTRTsKfQoKc3RhdGljIEJPT0wgRExMX0NBTExDT05WClN1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CglyZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CglyZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpTdXBwb3J0c0lDQ1Byb2ZpbGVzKCkgewoJcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpTdXBwb3J0c05vUGl4ZWxzKCkgewoJcmV0dXJuIFRSVUU7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgpMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgewoJRklCSVRNQVAgKmRpYiA9IE5VTEw7CglMaWJSYXcgKlJhd1Byb2Nlc3NvciA9IE5VTEw7CgoJQk9PTCBoZWFkZXJfb25seSA9IChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKCgl0cnkgewoJCS8vIGRvIG5vdCBkZWNsYXJlIFJhd1Byb2Nlc3NvciBvbiB0aGUgc3RhY2sgYXMgaXQgbWF5IGJlIGh1Z2UgKDMwMCBLQikKCQlSYXdQcm9jZXNzb3IgPSBuZXcoc3RkOjpub3Rocm93KSBMaWJSYXc7CgkJaWYoIVJhd1Byb2Nlc3NvcikgewoJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUVNT1JZOwoJCX0KCgkJLy8gd3JhcCB0aGUgaW5wdXQgZGF0YXN0cmVhbQoJCUxpYlJhd19mcmVlaW1hZ2VfZGF0YXN0cmVhbSBkYXRhc3RyZWFtKGlvLCBoYW5kbGUpOwoKCQkvLyBzZXQgZGVjb2RpbmcgcGFyYW1ldGVycwoJCS8vIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhZmZlY3QgZGF0YSByZWFkaW5nCgkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJLy8gKC1zIFswLi5OLTFdKSBTZWxlY3Qgb25lIHJhdyBpbWFnZSBmcm9tIGlucHV0IGZpbGUKCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLnNob3Rfc2VsZWN0ID0gMDsKCQkvLyAoLXcpIFVzZSBjYW1lcmEgd2hpdGUgYmFsYW5jZSwgaWYgcG9zc2libGUgKG90aGVyd2lzZSwgZmFsbGJhY2sgdG8gYXV0b193YikKCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLnVzZV9jYW1lcmFfd2IgPSAxOwoJCS8vICgtTSkgVXNlIGFueSBjb2xvciBtYXRyaXggZnJvbSB0aGUgY2FtZXJhIG1ldGFkYXRhLiBUaGlzIG9wdGlvbiBvbmx5IGFmZmVjdHMgT2x5bXB1cywgTGVhZiwgYW5kIFBoYXNlIE9uZSBjYW1lcmFzLgoJCVJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5wYXJhbXMudXNlX2NhbWVyYV9tYXRyaXggPSAxOwoJCS8vICgtaCkgb3V0cHV0cyB0aGUgaW1hZ2UgaW4gNTAlIHNpemUKCQlSYXdQcm9jZXNzb3ItPmltZ2RhdGEucGFyYW1zLmhhbGZfc2l6ZSA9ICgoZmxhZ3MgJiBSQVdfSEFMRlNJWkUpID09IFJBV19IQUxGU0laRSkgPyAxIDogMDsKCgkJLy8gb3BlbiB0aGUgZGF0YXN0cmVhbQoJCWlmKFJhd1Byb2Nlc3Nvci0+b3Blbl9kYXRhc3RyZWFtKCZkYXRhc3RyZWFtKSAhPSBMSUJSQVdfU1VDQ0VTUykgewoJCQl0aHJvdyAiTGliUmF3IDogZmFpbGVkIHRvIG9wZW4gaW5wdXQgc3RyZWFtICh1bmtub3duIGZvcm1hdCkiOwoJCX0KCgkJaWYoaGVhZGVyX29ubHkpIHsKCQkJLy8gaGVhZGVyIG9ubHkgbW9kZQoJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXJUKGhlYWRlcl9vbmx5LCBGSVRfUkdCMTYsIFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5zaXplcy53aWR0aCwgUmF3UHJvY2Vzc29yLT5pbWdkYXRhLnNpemVzLmhlaWdodCk7CgkJfQoJCWVsc2UgaWYoKGZsYWdzICYgUkFXX1VOUFJPQ0VTU0VEKSA9PSBSQVdfVU5QUk9DRVNTRUQpIHsKCQkJLy8gbG9hZCByYXcgZGF0YSB3aXRob3V0IHBvc3QtcHJvY2Vzc2luZyAoaS5lLiBhcyBhIEJheWVyIG1hdHJpeCkKCQkJZGliID0gbGlicmF3X0xvYWRVbnByb2Nlc3NlZERhdGEoUmF3UHJvY2Vzc29yKTsKCQl9CgkJZWxzZSBpZigoZmxhZ3MgJiBSQVdfUFJFVklFVykgPT0gUkFXX1BSRVZJRVcpIHsKCQkJLy8gdHJ5IHRvIGdldCB0aGUgZW1iZWRkZWQgSlBFRwoJCQlkaWIgPSBsaWJyYXdfTG9hZEVtYmVkZGVkUHJldmlldyhSYXdQcm9jZXNzb3IsIDApOwoJCQlpZighZGliKSB7CgkJCQkvLyBubyBKUEVHIHByZXZpZXc6IHRyeSB0byBsb2FkIGFzIDgtYml0L3NhbXBsZSAoaS5lLiBSR0IgMjQtYml0KQoJCQkJZGliID0gbGlicmF3X0xvYWRSYXdEYXRhKFJhd1Byb2Nlc3NvciwgOCk7CgkJCX0KCQl9IAoJCWVsc2UgaWYoKGZsYWdzICYgUkFXX0RJU1BMQVkpID09IFJBV19ESVNQTEFZKSB7CgkJCS8vIGxvYWQgcmF3IGRhdGEgYXMgOC1iaXQvc2FtcGxlIChpLmUuIFJHQiAyNC1iaXQpCgkJCWRpYiA9IGxpYnJhd19Mb2FkUmF3RGF0YShSYXdQcm9jZXNzb3IsIDgpOwoJCX0gCgkJZWxzZSB7CgkJCS8vIGRlZmF1bHQ6IGxvYWQgcmF3IGRhdGEgYXMgbGluZWFyIDE2LWJpdC9zYW1wbGUgKGkuZS4gUkdCIDQ4LWJpdCkKCQkJZGliID0gbGlicmF3X0xvYWRSYXdEYXRhKFJhd1Byb2Nlc3NvciwgMTYpOwoJCX0KCgkJLy8gc2F2ZSBJQ0MgcHJvZmlsZSBpZiBwcmVzZW50CgkJaWYoZGliICYmIChOVUxMICE9IFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5jb2xvci5wcm9maWxlKSkgewoJCQlGcmVlSW1hZ2VfQ3JlYXRlSUNDUHJvZmlsZShkaWIsIFJhd1Byb2Nlc3Nvci0+aW1nZGF0YS5jb2xvci5wcm9maWxlLCBSYXdQcm9jZXNzb3ItPmltZ2RhdGEuY29sb3IucHJvZmlsZV9sZW5ndGgpOwoJCX0KCgkJLy8gdHJ5IHRvIGdldCBKUEVHIGVtYmVkZGVkIEV4aWYgbWV0YWRhdGEKCQlpZihkaWIgJiYgISgoZmxhZ3MgJiBSQVdfUFJFVklFVykgPT0gUkFXX1BSRVZJRVcpKSB7CgkJCUZJQklUTUFQICptZXRhZGF0YV9kaWIgPSBsaWJyYXdfTG9hZEVtYmVkZGVkUHJldmlldyhSYXdQcm9jZXNzb3IsIEZJRl9MT0FEX05PUElYRUxTKTsKCQkJaWYobWV0YWRhdGFfZGliKSB7CgkJCQlGcmVlSW1hZ2VfQ2xvbmVNZXRhZGF0YShkaWIsIG1ldGFkYXRhX2RpYik7CgkJCQlGcmVlSW1hZ2VfVW5sb2FkKG1ldGFkYXRhX2RpYik7CgkJCX0KCQl9CgoJCS8vIGNsZWFuLXVwIGludGVybmFsIG1lbW9yeSBhbGxvY2F0aW9ucwoJCVJhd1Byb2Nlc3Nvci0+cmVjeWNsZSgpOwoJCWRlbGV0ZSBSYXdQcm9jZXNzb3I7CgoJCXJldHVybiBkaWI7CgoJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSB7CgkJaWYoUmF3UHJvY2Vzc29yKSB7CgkJCVJhd1Byb2Nlc3Nvci0+cmVjeWNsZSgpOwoJCQlkZWxldGUgUmF3UHJvY2Vzc29yOwoJCX0KCQlpZihkaWIpIHsKCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOwoJCX0KCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOwoJfQoKCXJldHVybiBOVUxMOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vICAgSW5pdAovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp2b2lkIERMTF9DQUxMQ09OVgpJbml0UkFXKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CglzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKCglwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OwoJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CglwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOwoJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOwoJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOwoJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBTdXBwb3J0c0lDQ1Byb2ZpbGVzOwoJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cn0K