LyogcHJvY29iamVjdHRyZWUuYwogKgogKiBDb3B5cmlnaHQgqSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CiAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgogKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQogKiBkZXRhaWxzLgogKi8KCiNpbmNsdWRlICJwcm9jb2JqZWN0dHJlZS5oIgoKI2RlZmluZSBNWURSVk5BTUUgInByb2NvYmplY3R0cmVlIgoKCgovKiogVGhpcyBpcyBjb250ZXh0IGluZm8gdGhhdCB3ZSBzdGFzaCBpbiBlYWNoIC9wcm9jIGZpbGUgZW50cnksIHdoaWNoIHdlCiAqICBuZWVkIGluIG9yZGVyIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgc3VwcGxpZXMgdGhlIC9wcm9jIHJlYWQKICogIGluZm8gZm9yIHRoYXQgZmlsZS4KICovCnR5cGVkZWYgc3RydWN0IHsKCXZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqLCBpbnQpOwoJTVlQUk9DT0JKRUNUICpwcm9jT2JqZWN0OwoJaW50IHByb3BlcnR5SW5kZXg7Cgp9IFBST0NESVJFTlRSWUNPTlRFWFQ7CgovKiogVGhpcyBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSB0cmVlIHJvb3RlZCBhdAogKiAgPHByb2NEaXJSb290Pi88bmFtZVswXT4vPG5hbWVbMV0+Ly4uLgogKiAgUHJvcGVydGllcyBmb3IgZWFjaCBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpbGwgYmUgbG9jYXRlZCB1bmRlcgogKiAgPHByb2NEaXJSb290Pi88bmFtZVswXT4vPG5hbWVbMV0+Ly4uLi88b2JqZWN0TmFtZT4vPHByb3BlcnR5TmFtZT4uCiAqLwpzdHJ1Y3QgTVlQUk9DVFlQRV9UYWcgewoJY29uc3QgY2hhciAqKm5hbWU7ICAvKio8IG5vZGUgbmFtZXMgZm9yIHRoaXMgdHlwZSwgZW5kaW5nIHdpdGggTlVMTCAqLwoJaW50IG5OYW1lczsgICAgICAgICAvKio8IG51bSBvZiBub2RlIG5hbWVzIGluIDxuYW1lPiAqLwoKCS8qKiByb290IGRpciBmb3IgdGhpcyB0eXBlIHRyZWUgaW4gL3Byb2MgKi8KCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpclJvb3Q7CgoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpcnM7ICAvKio8IGZvciBlYWNoIG5vZGUgaW4gPG5hbWU+ICovCgoJLyoqIGJvdHRvbSBkaXIgd2hlcmUgb2JqZWN0cyB3aWxsIGJlIHJvb3RlZDsgaS5lLiwgdGhpcyBpcwoJICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4vLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUKCSAqICBsYXN0IGVudHJ5IGluIHRoZSA8cHJvY0RpcnM+IGFycmF5LiAqLwoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jRGlyOwoKCS8qKiBuYW1lIGZvciBlYWNoIHByb3BlcnR5IHRoYXQgb2JqZWN0cyBvZiB0aGlzIHR5cGUgY2FuIGhhdmUgKi8KCWNvbnN0IGNoYXIgKipwcm9wZXJ0eU5hbWVzOwoKCWludCBuUHJvcGVydGllczsgICAgICAgLyoqPCBudW0gb2YgbmFtZXMgaW4gPHByb3BlcnR5TmFtZXM+ICovCgoJLyoqIENhbGwgdGhpcywgcGFzc2luZyBNWVBST0NPQkpFQ1QuY29udGV4dCBhbmQgdGhlIHByb3BlcnR5IGluZGV4CgkgKiAgd2hlbmV2ZXIgc29tZW9uZSByZWFkcyB0aGUgcHJvYyBlbnRyeSAqLwoJdm9pZCAoKnNob3dfcHJvcGVydHkpKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICosIGludCk7Cn07CgoKCnN0cnVjdCBNWVBST0NPQkpFQ1RfVGFnIHsKCU1ZUFJPQ1RZUEUgKnR5cGU7CgoJLyoqIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGRpciBub2RlIGluIC9wcm9jIHVuZGVyIHdoaWNoIHRoZQoJICogIHByb3BlcnRpZXMgb2YgdGhpcyBvYmplY3Qgd2lsbCBhcHBlYXIgYXMgZmlsZXMuICovCgljaGFyICpuYW1lOwoKCWludCBuYW1lc2l6ZTsgICAvKio8IG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgZm9yIG5hbWUgKi8KCXZvaWQgKmNvbnRleHQ7ICAvKio8IHBhc3NlZCB0byBNWVBST0NUWVBFLnNob3dfcHJvcGVydHkgKi8KCgkvKiogPHR5cGUucHJvY0RpclJvb3Q+Lzx0eXBlLm5hbWVbMF0+Lzx0eXBlLm5hbWVbMV0+Ly4uLi88bmFtZT4gKi8KCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpcjsKCgkvKiogYSBwcm9jIGRpciBlbnRyeSBmb3IgZWFjaCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0OwoJICogIHByb3BlcnRpZXMgYXJlIGlkZW50aWZpZWQgaW4gTVlQUk9DVFlQRS5wcm9wZXJ0eU5hbWVzLCBzbyBlYWNoIG9mCgkgKiAgdGhlIDxwcm9jRGlyUHJvcGVydGllcz4gZGVzY3JpYmVzIGEgc2luZ2xlIGZpbGUgbGlrZQoJICogIDx0eXBlLnByb2NEaXJSb290Pi88dHlwZS5uYW1lWzBdPi88dHlwZS5uYW1lWzFdPi8uLi4KCSAqICAgICAgICAgICAvPG5hbWU+Lzxwcm9wZXJ0eU5hbWU+CgkgKi8KCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnByb2NEaXJQcm9wZXJ0aWVzOwoKCS8qKiB0aGlzIGlzIGEgaG9sZGluZyBhcmVhIGZvciB0aGUgY29udGV4dCBpbmZvcm1hdGlvbiB0aGF0IGlzIG5lZWRlZAoJICogIHRvIHJ1biB0aGUgL3Byb2MgY2FsbGJhY2sgZnVuY3Rpb24gKi8KCVBST0NESVJFTlRSWUNPTlRFWFQgKnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzOwp9OwoKCgpzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKY3JlYXRlUHJvY0Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkKewoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gcHJvY19ta2Rpcl9tb2RlKG5hbWUsIFNfSUZESVIsIHBhcmVudCk7CglpZiAocCA9PSBOVUxMKQoJCUVSUkRSVigiZmFpbGVkIHRvIGNyZWF0ZSAvcHJvYyBkaXJlY3RvcnkgJXMiLCBuYW1lKTsKCXJldHVybiBwOwp9CgpzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKY3JlYXRlUHJvY0ZpbGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQsCgkgICAgICAgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywgdm9pZCAqZGF0YSkKewoJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLCAwLCBwYXJlbnQsCgkJCQkJCSAgICBmb3BzLCBkYXRhKTsKCWlmIChwID09IE5VTEwpCgkJRVJSRFJWKCJmYWlsZWQgdG8gY3JlYXRlIC9wcm9jIGZpbGUgJXMiLCBuYW1lKTsKCXJldHVybiBwOwp9CgpzdGF0aWMgaW50IHNlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwpzdGF0aWMgaW50IHByb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNlcV9zaG93LCBQREVfREFUQShpbm9kZSkpOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZvcHMgPSB7Cgkub3BlbiA9IHByb2Nfb3BlbiwKCS5yZWFkID0gc2VxX3JlYWQsCgkubGxzZWVrID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKfTsKCgoKTVlQUk9DVFlQRSAqdmlzb3JfcHJvY19DcmVhdGVUeXBlKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpclJvb3QsCgkJCQkgIGNvbnN0IGNoYXIgKipuYW1lLAoJCQkJICBjb25zdCBjaGFyICoqcHJvcGVydHlOYW1lcywKCQkJCSAgdm9pZCAoKnNob3dfcHJvcGVydHkpKHN0cnVjdCBzZXFfZmlsZSAqLAoJCQkJCQkJdm9pZCAqLCBpbnQpKQp7CglpbnQgaSA9IDA7CglNWVBST0NUWVBFICpyYyA9IE5VTEwsICp0eXBlID0gTlVMTDsKCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50ID0gTlVMTDsKCglpZiAocHJvY0RpclJvb3QgPT0gTlVMTCkgewoJCUVSUkRSVigicHJvY0RpclJvb3QgY2Fubm90IGJlIE5VTEwhXG4iKTsKCQlnb3RvIEF3YXk7Cgl9CglpZiAobmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gPT0gTlVMTCkgewoJCUVSUkRSVigibmFtZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBub2RlIG5hbWUhXG4iKTsKCQlnb3RvIEF3YXk7Cgl9Cgl0eXBlID0ga3phbGxvYyhzaXplb2YoTVlQUk9DVFlQRSksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKCWlmICh0eXBlID09IE5VTEwpIHsKCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwoJCWdvdG8gQXdheTsKCX0KCXR5cGUtPm5hbWUgPSBuYW1lOwoJdHlwZS0+cHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7Cgl0eXBlLT5uUHJvcGVydGllcyA9IDA7Cgl0eXBlLT5uTmFtZXMgPSAwOwoJdHlwZS0+c2hvd19wcm9wZXJ0eSA9IHNob3dfcHJvcGVydHk7Cgl0eXBlLT5wcm9jRGlyUm9vdCA9IHByb2NEaXJSb290OwoJaWYgKHR5cGUtPnByb3BlcnR5TmFtZXMgIT0gTlVMTCkKCQl3aGlsZSAodHlwZS0+cHJvcGVydHlOYW1lc1t0eXBlLT5uUHJvcGVydGllc10gIT0gTlVMTCkKCQkJdHlwZS0+blByb3BlcnRpZXMrKzsKCXdoaWxlICh0eXBlLT5uYW1lW3R5cGUtPm5OYW1lc10gIT0gTlVMTCkKCQl0eXBlLT5uTmFtZXMrKzsKCXR5cGUtPnByb2NEaXJzID0ga3phbGxvYygodHlwZS0+bk5hbWVzICsgMSkgKgoJCQkJIHNpemVvZihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiksCgkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwoJaWYgKHR5cGUtPnByb2NEaXJzID09IE5VTEwpIHsKCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwoJCWdvdG8gQXdheTsKCX0KCXBhcmVudCA9IHByb2NEaXJSb290OwoJZm9yIChpID0gMDsgaSA8IHR5cGUtPm5OYW1lczsgaSsrKSB7CgkJdHlwZS0+cHJvY0RpcnNbaV0gPSBjcmVhdGVQcm9jRGlyKHR5cGUtPm5hbWVbaV0sIHBhcmVudCk7CgkJaWYgKHR5cGUtPnByb2NEaXJzW2ldID09IE5VTEwpIHsKCQkJcmMgPSBOVUxMOwoJCQlnb3RvIEF3YXk7CgkJfQoJCXBhcmVudCA9IHR5cGUtPnByb2NEaXJzW2ldOwoJfQoJdHlwZS0+cHJvY0RpciA9IHR5cGUtPnByb2NEaXJzW3R5cGUtPm5OYW1lcy0xXTsKCXJjID0gdHlwZTsKQXdheToKCWlmIChyYyA9PSBOVUxMKSB7CgkJaWYgKHR5cGUgIT0gTlVMTCkgewoJCQl2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKHR5cGUpOwoJCQl0eXBlID0gTlVMTDsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcHJvY19DcmVhdGVUeXBlKTsKCgoKdm9pZCB2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKE1ZUFJPQ1RZUEUgKnR5cGUpCnsKCWlmICh0eXBlID09IE5VTEwpCgkJcmV0dXJuOwoJaWYgKHR5cGUtPnByb2NEaXJzICE9IE5VTEwpIHsKCQlpbnQgaSA9IHR5cGUtPm5OYW1lcy0xOwoJCXdoaWxlIChpID49IDApIHsKCQkJaWYgKHR5cGUtPnByb2NEaXJzW2ldICE9IE5VTEwpIHsKCQkJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50ID0gTlVMTDsKCQkJCWlmIChpID09IDApCgkJCQkJcGFyZW50ID0gdHlwZS0+cHJvY0RpclJvb3Q7CgkJCQllbHNlCgkJCQkJcGFyZW50ID0gdHlwZS0+cHJvY0RpcnNbaS0xXTsKCQkJCXJlbW92ZV9wcm9jX2VudHJ5KHR5cGUtPm5hbWVbaV0sIHBhcmVudCk7CgkJCX0KCQkJaS0tOwoJCX0KCQlrZnJlZSh0eXBlLT5wcm9jRGlycyk7CgkJdHlwZS0+cHJvY0RpcnMgPSBOVUxMOwoJfQoJa2ZyZWUodHlwZSk7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcHJvY19EZXN0cm95VHlwZSk7CgoKCk1ZUFJPQ09CSkVDVCAqdmlzb3JfcHJvY19DcmVhdGVPYmplY3QoTVlQUk9DVFlQRSAqdHlwZSwKCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmNvbnRleHQpCnsKCU1ZUFJPQ09CSkVDVCAqb2JqID0gTlVMTCwgKnJjID0gTlVMTDsKCWludCBpID0gMDsKCglpZiAodHlwZSA9PSBOVUxMKSB7CgkJRVJSRFJWKCJ0eXBlIGNhbm5vdCBiZSBOVUxMXG4iKTsKCQlnb3RvIEF3YXk7Cgl9CglvYmogPSBremFsbG9jKHNpemVvZihNWVBST0NPQkpFQ1QpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CglpZiAob2JqID09IE5VTEwpIHsKCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwoJCWdvdG8gQXdheTsKCX0KCW9iai0+dHlwZSA9IHR5cGU7CglvYmotPmNvbnRleHQgPSBjb250ZXh0OwoJaWYgKG5hbWUgPT0gTlVMTCkgewoJCW9iai0+bmFtZSA9IE5VTEw7CgkJb2JqLT5wcm9jRGlyID0gdHlwZS0+cHJvY0RpcjsKCX0gZWxzZSB7CgkJb2JqLT5uYW1lc2l6ZSA9IHN0cmxlbihuYW1lKSsxOwoJCW9iai0+bmFtZSA9IGttYWxsb2Mob2JqLT5uYW1lc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwoJCWlmIChvYmotPm5hbWUgPT0gTlVMTCkgewoJCQlvYmotPm5hbWVzaXplID0gMDsKCQkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKCQkJZ290byBBd2F5OwoJCX0KCQlzdHJjcHkob2JqLT5uYW1lLCBuYW1lKTsKCQlvYmotPnByb2NEaXIgPSBjcmVhdGVQcm9jRGlyKG9iai0+bmFtZSwgdHlwZS0+cHJvY0Rpcik7CgkJaWYgKG9iai0+cHJvY0RpciA9PSBOVUxMKSB7CgkJCWdvdG8gQXdheTsKCQl9Cgl9CglvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID0KCQlremFsbG9jKCh0eXBlLT5uUHJvcGVydGllcyArIDEpICogc2l6ZW9mKFBST0NESVJFTlRSWUNPTlRFWFQpLAoJCQlHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7CglpZiAob2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0cyA9PSBOVUxMKSB7CgkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKCQlnb3RvIEF3YXk7Cgl9CglvYmotPnByb2NEaXJQcm9wZXJ0aWVzID0KCQlremFsbG9jKCh0eXBlLT5uUHJvcGVydGllcyArIDEpICogc2l6ZW9mKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKSwKCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwoJaWYgKG9iai0+cHJvY0RpclByb3BlcnRpZXMgPT0gTlVMTCkgewoJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7CgkJZ290byBBd2F5OwoJfQoJZm9yIChpID0gMDsgaSA8IHR5cGUtPm5Qcm9wZXJ0aWVzOyBpKyspIHsKCQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldLnByb2NPYmplY3QgPSBvYmo7CgkJb2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0c1tpXS5wcm9wZXJ0eUluZGV4ID0gaTsKCQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldLnNob3dfcHJvcGVydHkgPQoJCQl0eXBlLT5zaG93X3Byb3BlcnR5OwoJCWlmICh0eXBlLT5wcm9wZXJ0eU5hbWVzW2ldWzBdICE9ICdcMCcpIHsKCQkJLyogb25seSBjcmVhdGUgcHJvcGVydGllcyB0aGF0IGhhdmUgbmFtZXMgKi8KCQkJb2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9CgkJCQljcmVhdGVQcm9jRmlsZSh0eXBlLT5wcm9wZXJ0eU5hbWVzW2ldLAoJCQkJCSAgICAgICBvYmotPnByb2NEaXIsICZwcm9jX2ZvcHMsCgkJCQkJICAgICAgICZvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldKTsKCQkJaWYgKG9iai0+cHJvY0RpclByb3BlcnRpZXNbaV0gPT0gTlVMTCkgewoJCQkJcmMgPSBOVUxMOwoJCQkJZ290byBBd2F5OwoJCQl9CgkJfQoJfQoJcmMgPSBvYmo7CkF3YXk6CglpZiAocmMgPT0gTlVMTCkgewoJCWlmIChvYmogIT0gTlVMTCkgewoJCQl2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3Qob2JqKTsKCQkJb2JqID0gTlVMTDsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0KRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcHJvY19DcmVhdGVPYmplY3QpOwoKCgp2b2lkIHZpc29yX3Byb2NfRGVzdHJveU9iamVjdChNWVBST0NPQkpFQ1QgKm9iaikKewoJTVlQUk9DVFlQRSAqdHlwZSA9IE5VTEw7CglpZiAob2JqID09IE5VTEwpCgkJcmV0dXJuOwoJdHlwZSA9IG9iai0+dHlwZTsKCWlmICh0eXBlID09IE5VTEwpCgkJcmV0dXJuOwoJaWYgKG9iai0+cHJvY0RpclByb3BlcnRpZXMgIT0gTlVMTCkgewoJCWludCBpID0gMDsKCQlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+blByb3BlcnRpZXM7IGkrKykgewoJCQlpZiAob2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSAhPSBOVUxMKSB7CgkJCQlyZW1vdmVfcHJvY19lbnRyeSh0eXBlLT5wcm9wZXJ0eU5hbWVzW2ldLAoJCQkJCQkgIG9iai0+cHJvY0Rpcik7CgkJCQlvYmotPnByb2NEaXJQcm9wZXJ0aWVzW2ldID0gTlVMTDsKCQkJfQoJCX0KCQlrZnJlZShvYmotPnByb2NEaXJQcm9wZXJ0aWVzKTsKCQlvYmotPnByb2NEaXJQcm9wZXJ0aWVzID0gTlVMTDsKCX0KCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzICE9IE5VTEwpIHsKCQlrZnJlZShvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzKTsKCQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID0gTlVMTDsKCX0KCWlmIChvYmotPnByb2NEaXIgIT0gTlVMTCkgewoJCWlmIChvYmotPm5hbWUgIT0gTlVMTCkKCQkJcmVtb3ZlX3Byb2NfZW50cnkob2JqLT5uYW1lLCB0eXBlLT5wcm9jRGlyKTsKCQlvYmotPnByb2NEaXIgPSBOVUxMOwoJfQoJaWYgKG9iai0+bmFtZSAhPSBOVUxMKSB7CgkJa2ZyZWUob2JqLT5uYW1lKTsKCQlvYmotPm5hbWUgPSBOVUxMOwoJfQoJa2ZyZWUob2JqKTsKfQpFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3QpOwoKCgpzdGF0aWMgaW50IHNlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCnsKCVBST0NESVJFTlRSWUNPTlRFWFQgKmN0eCA9IChQUk9DRElSRU5UUllDT05URVhUICopKHNlcS0+cHJpdmF0ZSk7CglpZiAoY3R4ID09IE5VTEwpIHsKCQlFUlJEUlYoIkkgZG9uJ3QgaGF2ZSBhIGZyZWFraW4nIGNsdWUuLi4iKTsKCQlyZXR1cm4gMDsKCX0KCSgqY3R4LT5zaG93X3Byb3BlcnR5KShzZXEsIGN0eC0+cHJvY09iamVjdC0+Y29udGV4dCwKCQkJICAgICAgY3R4LT5wcm9wZXJ0eUluZGV4KTsKCXJldHVybiAwOwp9Cg==