LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhc19vYmplY3QuYwogKiBWZXJzaW9uOiAgICAgICAwLjMKICogRGVzY3JpcHRpb246ICAgSUFTIG9iamVjdCBkYXRhYmFzZSBhbmQgZnVuY3Rpb25zCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBUaHUgT2N0ICAxIDIyOjUwOjA0IDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgV2VkIERlYyAxNSAxMToyMzoxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICoKICogICAgIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IERhZyBCcmF0dGxpLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CgpoYXNoYmluX3QgKmlyaWFzX29iamVjdHM7CgovKgogKiAgVXNlZCB3aGVuIGEgbWlzc2luZyB2YWx1ZSBuZWVkcyB0byBiZSByZXR1cm5lZAogKi8Kc3RydWN0IGlhc192YWx1ZSBpcmlhc19taXNzaW5nID0geyBJQVNfTUlTU0lORywgMCwgMCwgMCwgezB9fTsKCi8qCiAqIEZ1bmN0aW9uIHN0cm5kdXAgKHN0ciwgbWF4KQogKgogKiAgICBNeSBvd24ga2VybmVsIHZlcnNpb24gb2Ygc3RybmR1cCEKICoKICogRmFzdGVyLCBjaGVjayBib3VuZGFyeS4uLiBKZWFuIElJCiAqLwpzdGF0aWMgY2hhciAqc3RybmR1cChjaGFyICpzdHIsIGludCBtYXgpCnsKCWNoYXIgKm5ld19zdHI7CglpbnQgbGVuOwoKCS8qIENoZWNrIHN0cmluZyAqLwoJaWYgKHN0ciA9PSBOVUxMKQoJCXJldHVybiBOVUxMOwoJLyogQ2hlY2sgbGVuZ3RoLCB0cnVuY2F0ZSAqLwoJbGVuID0gc3RybGVuKHN0cik7CglpZihsZW4gPiBtYXgpCgkJbGVuID0gbWF4OwoKCS8qIEFsbG9jYXRlIG5ldyBzdHJpbmcgKi8KICAgICAgICBuZXdfc3RyID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfQVRPTUlDKTsKICAgICAgICBpZiAobmV3X3N0ciA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qIENvcHkgYW5kIHRydW5jYXRlICovCgltZW1jcHkobmV3X3N0ciwgc3RyLCBsZW4pOwoJbmV3X3N0cltsZW5dID0gJ1wwJzsKCglyZXR1cm4gbmV3X3N0cjsKfQoKLyoKICogRnVuY3Rpb24gaWFzX25ld19vYmplY3QgKG5hbWUsIGlkKQogKgogKiAgICBDcmVhdGUgYSBuZXcgSUFTIG9iamVjdAogKgogKi8Kc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX25ld19vYmplY3QoIGNoYXIgKm5hbWUsIGludCBpZCkKewogICAgICAgIHN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CgoJSVJEQV9ERUJVRyggNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJb2JqID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc19vYmplY3QpLCBHRlBfQVRPTUlDKTsKCWlmIChvYmogPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXMoKSwgVW5hYmxlIHRvIGFsbG9jYXRlIG9iamVjdCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCW1lbXNldChvYmosIDAsIHNpemVvZiggc3RydWN0IGlhc19vYmplY3QpKTsKCglvYmotPm1hZ2ljID0gSUFTX09CSkVDVF9NQUdJQzsKCW9iai0+bmFtZSA9IHN0cm5kdXAobmFtZSwgSUFTX01BWF9DTEFTU05BTUUpOwoJb2JqLT5pZCA9IGlkOwoKCS8qIExvY2tpbmcgbm90ZXMgOiB0aGUgYXR0cmliIHNwaW5sb2NrIGhhcyBsb3dlciBwcmVjZW5kZW5jZQoJICogdGhhbiB0aGUgb2JqZWN0cyBzcGlubG9jay4gTmV2ZXIgZ3JhcCB0aGUgb2JqZWN0cyBzcGlubG9jawoJICogd2hpbGUgaG9sZGluZyBhbnkgYXR0cmliIHNwaW5sb2NrIChyaXNrIG9mIGRlYWRsb2NrKS4gSmVhbiBJSSAqLwoJb2JqLT5hdHRyaWJzID0gaGFzaGJpbl9uZXcoSEJfTE9DSyk7CgoJaWYgKG9iai0+YXR0cmlicyA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlcygpLCBVbmFibGUgdG8gYWxsb2NhdGUgYXR0cmlicyFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlrZnJlZShvYmopOwoJCXJldHVybiBOVUxMOwoJfQoKCXJldHVybiBvYmo7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9hdHRyaWIgKGF0dHJpYikKICoKICogICAgRGVsZXRlIGdpdmVuIGF0dHJpYnV0ZSBhbmQgZGVhbGxvY2F0ZSBhbGwgaXRzIG1lbW9yeQogKgogKi8Kc3RhdGljIHZvaWQgX19pcmlhc19kZWxldGVfYXR0cmliKHN0cnVjdCBpYXNfYXR0cmliICphdHRyaWIpCnsKCUlSREFfQVNTRVJUKGF0dHJpYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywgcmV0dXJuOyk7CgoJa2ZyZWUoYXR0cmliLT5uYW1lKTsKCglpcmlhc19kZWxldGVfdmFsdWUoYXR0cmliLT52YWx1ZSk7CglhdHRyaWItPm1hZ2ljID0gfklBU19BVFRSSUJfTUFHSUM7CgoJa2ZyZWUoYXR0cmliKTsKfQoKdm9pZCBfX2lyaWFzX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglrZnJlZShvYmotPm5hbWUpOwoKCWhhc2hiaW5fZGVsZXRlKG9iai0+YXR0cmlicywgKEZSRUVfRlVOQykgX19pcmlhc19kZWxldGVfYXR0cmliKTsKCglvYmotPm1hZ2ljID0gfklBU19PQkpFQ1RfTUFHSUM7CgoJa2ZyZWUob2JqKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfZGVsZXRlX29iamVjdCAob2JqKQogKgogKiAgICBSZW1vdmUgb2JqZWN0IGZyb20gaGFzaGJpbiBhbmQgZGVhbGxvY2F0ZSBhbGwgYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGgKICogICAgd2l0aCB0aGlzIG9iamVjdCBhbmQgdGhlIG9iamVjdCBpdHNlbGYKICoKICovCmludCBpcmlhc19kZWxldGVfb2JqZWN0KHN0cnVjdCBpYXNfb2JqZWN0ICpvYmopCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpub2RlOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC0xOyk7CgoJLyogUmVtb3ZlIGZyb20gbGlzdCAqLwoJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMoaXJpYXNfb2JqZWN0cywgKGlyZGFfcXVldWVfdCAqKSBvYmopOwoJaWYgKCFub2RlKQoJCUlSREFfREVCVUcoIDAsICIlcygpLCBvYmplY3QgYWxyZWFkeSByZW1vdmVkIVxuIiwKCQkJICAgIF9fRlVOQ1RJT05fXyk7CgoJLyogRGVzdHJveSAqLwoJX19pcmlhc19kZWxldGVfb2JqZWN0KG9iaik7CgoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19kZWxldGVfb2JqZWN0KTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2RlbGV0ZV9hdHRyaWIgKG9iaikKICoKICogICAgUmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIGhhc2hiaW4gYW5kLCBpZiBpdCB3YXMgdGhlIGxhc3QgYXR0cmlidXRlIG9mCiAqICAgIHRoZSBvYmplY3QsIHJlbW92ZSB0aGUgb2JqZWN0IGFzIHdlbGwuCiAqCiAqLwppbnQgaXJpYXNfZGVsZXRlX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliLAoJCQlpbnQgY2xlYW5vYmplY3QpCnsKCXN0cnVjdCBpYXNfYXR0cmliICpub2RlOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgoJLyogUmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIG9iamVjdCAqLwoJbm9kZSA9IGhhc2hiaW5fcmVtb3ZlX3RoaXMob2JqLT5hdHRyaWJzLCAoaXJkYV9xdWV1ZV90ICopIGF0dHJpYik7CglpZiAoIW5vZGUpCgkJcmV0dXJuIDA7IC8qIEFscmVhZHkgcmVtb3ZlZCBvciBub24tZXhpc3RlbnQgKi8KCgkvKiBEZWFsbG9jYXRlIGF0dHJpYnV0ZSAqLwoJX19pcmlhc19kZWxldGVfYXR0cmliKG5vZGUpOwoKCS8qIENoZWNrIGlmIG9iamVjdCBoYXMgc3RpbGwgc29tZSBhdHRyaWJ1dGVzLCBkZXN0cm95IGl0IGlmIG5vbmUuCgkgKiBBdCBmaXJzdCBnbGFuY2UsIHRoaXMgbG9vayBkYW5nZXJvdXMsIGFzIHRoZSBrZXJuZWwgcmVmZXJlbmNlCgkgKiB2YXJpb3VzIElBUyBvYmplY3RzLiBIb3dldmVyLCB3ZSBvbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIG9uCgkgKiB1c2VyIGF0dHJpYnV0ZXMsIG5vdCBrZXJuZWwgYXR0cmlidXRlcywgc28gdGhlcmUgaXMgbm8gcmlzawoJICogb2YgZGVsZXRpbmcgYSBrZXJuZWwgb2JqZWN0IHRoaXMgd2F5LiBKZWFuIElJICovCglub2RlID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X2ZpcnN0KG9iai0+YXR0cmlicyk7CglpZiAoY2xlYW5vYmplY3QgJiYgIW5vZGUpCgkJaXJpYXNfZGVsZXRlX29iamVjdChvYmopOwoKCXJldHVybiAwOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19pbnNlcnRfb2JqZWN0IChvYmopCiAqCiAqICAgIEluc2VydCBhbiBvYmplY3QgaW50byB0aGUgTE0tSUFTIGRhdGFiYXNlCiAqCiAqLwp2b2lkIGlyaWFzX2luc2VydF9vYmplY3Qoc3RydWN0IGlhc19vYmplY3QgKm9iaikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCgloYXNoYmluX2luc2VydChpcmlhc19vYmplY3RzLCAoaXJkYV9xdWV1ZV90ICopIG9iaiwgMCwgb2JqLT5uYW1lKTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2luc2VydF9vYmplY3QpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfZmluZF9vYmplY3QgKG5hbWUpCiAqCiAqICAgIEZpbmQgb2JqZWN0IHdpdGggZ2l2ZW4gbmFtZQogKgogKi8Kc3RydWN0IGlhc19vYmplY3QgKmlyaWFzX2ZpbmRfb2JqZWN0KGNoYXIgKm5hbWUpCnsKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCgkvKiBVbnNhZmUgKGxvY2tpbmcpLCBvYmplY3QgbWlnaHQgY2hhbmdlICovCglyZXR1cm4gaGFzaGJpbl9sb2NrX2ZpbmQoaXJpYXNfb2JqZWN0cywgMCwgbmFtZSk7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19maW5kX29iamVjdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19maW5kX2F0dHJpYiAob2JqLCBuYW1lKQogKgogKiAgICBGaW5kIG5hbWVkIGF0dHJpYnV0ZSBpbiBvYmplY3QKICoKICovCnN0cnVjdCBpYXNfYXR0cmliICppcmlhc19maW5kX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBjaGFyICpuYW1lKQp7CglzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCUlSREFfQVNTRVJUKG9iaiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQobmFtZSAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoKCWF0dHJpYiA9IGhhc2hiaW5fbG9ja19maW5kKG9iai0+YXR0cmlicywgMCwgbmFtZSk7CglpZiAoYXR0cmliID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJLyogVW5zYWZlIChsb2NraW5nKSwgYXR0cmliIG1pZ2h0IGNoYW5nZSAqLwoJcmV0dXJuIGF0dHJpYjsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX2ZpbmRfYXR0cmliKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX2FkZF9hdHRyaWJ1dGUgKG9iaiwgYXR0cmliKQogKgogKiAgICBBZGQgYXR0cmlidXRlIHRvIG9iamVjdAogKgogKi8Kc3RhdGljIHZvaWQgaXJpYXNfYWRkX2F0dHJpYihzdHJ1Y3QgaWFzX29iamVjdCAqb2JqLCBzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliLAoJCQkgICAgIGludCBvd25lcikKewoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCglJUkRBX0FTU0VSVChhdHRyaWIgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChhdHRyaWItPm1hZ2ljID09IElBU19BVFRSSUJfTUFHSUMsIHJldHVybjspOwoKCS8qIFNldCBpZiBhdHRyaWIgaXMgb3duZWQgYnkga2VybmVsIG9yIHVzZXIgc3BhY2UgKi8KCWF0dHJpYi0+dmFsdWUtPm93bmVyID0gb3duZXI7CgoJaGFzaGJpbl9pbnNlcnQob2JqLT5hdHRyaWJzLCAoaXJkYV9xdWV1ZV90ICopIGF0dHJpYiwgMCwgYXR0cmliLT5uYW1lKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUgKG9ial9uYW1lLCBhdHRyaWJfbmFtZSwgbmV3X3ZhbHVlKQogKgogKiAgICBDaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIG9iamVjdHMgYXR0cmlidXRlLgogKgogKi8KaW50IGlyaWFzX29iamVjdF9jaGFuZ2VfYXR0cmlidXRlKGNoYXIgKm9ial9uYW1lLCBjaGFyICphdHRyaWJfbmFtZSwKCQkJCSAgc3RydWN0IGlhc192YWx1ZSAqbmV3X3ZhbHVlKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOwoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJLyogRmluZCBvYmplY3QgKi8KCW9iaiA9IGhhc2hiaW5fbG9ja19maW5kKGlyaWFzX29iamVjdHMsIDAsIG9ial9uYW1lKTsKCWlmIChvYmogPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBmaW5kIG9iamVjdDogJXNcbiIsIF9fRlVOQ1RJT05fXywKCQkJICAgICBvYmpfbmFtZSk7CgkJcmV0dXJuIC0xOwoJfQoKCS8qIFNsaWdodGx5IHVuc2FmZSAob2JqIG1pZ2h0IGdldCByZW1vdmVkIHVuZGVyIHVzKSAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCgkvKiBGaW5kIGF0dHJpYnV0ZSAqLwoJYXR0cmliID0gaGFzaGJpbl9maW5kKG9iai0+YXR0cmlicywgMCwgYXR0cmliX25hbWUpOwoJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGZpbmQgYXR0cmlidXRlOiAlc1xuIiwKCQkJICAgICBfX0ZVTkNUSU9OX18sIGF0dHJpYl9uYW1lKTsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrLCBmbGFncyk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmICggYXR0cmliLT52YWx1ZS0+dHlwZSAhPSBuZXdfdmFsdWUtPnR5cGUpIHsKCQlJUkRBX0RFQlVHKCAwLCAiJXMoKSwgY2hhbmdpbmcgdmFsdWUgdHlwZSBub3QgYWxsb3dlZCFcbiIsCgkJCSAgICBfX0ZVTkNUSU9OX18pOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogRGVsZXRlIG9sZCB2YWx1ZSAqLwoJaXJpYXNfZGVsZXRlX3ZhbHVlKGF0dHJpYi0+dmFsdWUpOwoKCS8qIEluc2VydCBuZXcgdmFsdWUgKi8KCWF0dHJpYi0+dmFsdWUgPSBuZXdfdmFsdWU7CgoJLyogU3VjY2VzcyAqLwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19vYmplY3RfY2hhbmdlX2F0dHJpYnV0ZSk7CgovKgogKiBGdW5jdGlvbiBpcmlhc19vYmplY3RfYWRkX2ludGVnZXJfYXR0cmliIChvYmosIG5hbWUsIHZhbHVlKQogKgogKiAgICBBZGQgYW4gaW50ZWdlciBhdHRyaWJ1dGUgdG8gYW4gTE0tSUFTIG9iamVjdAogKgogKi8Kdm9pZCBpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSwgaW50IHZhbHVlLAoJCQkgICAgICBpbnQgb3duZXIpCnsKCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CgoJSVJEQV9BU1NFUlQob2JqICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQob2JqLT5tYWdpYyA9PSBJQVNfT0JKRUNUX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CgoJYXR0cmliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc19hdHRyaWIpLCBHRlBfQVRPTUlDKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJbWVtc2V0KGF0dHJpYiwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYikpOwoKCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOwoJYXR0cmliLT5uYW1lID0gc3RybmR1cChuYW1lLCBJQVNfTUFYX0FUVFJJQk5BTUUpOwoKCS8qIEluc2VydCB2YWx1ZSAqLwoJYXR0cmliLT52YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHZhbHVlKTsKCglpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIpOwoKIC8qCiAqIEZ1bmN0aW9uIGlyaWFzX2FkZF9vY3RzZXFfYXR0cmliIChvYmosIG5hbWUsIG9jdGV0X3NlcSwgbGVuKQogKgogKiAgICBBZGQgYSBvY3RldCBzZXF1ZW5jZSBhdHRyaWJ1dGUgdG8gYW4gTE0tSUFTIG9iamVjdAogKgogKi8KCnZvaWQgaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIoc3RydWN0IGlhc19vYmplY3QgKm9iaiwgY2hhciAqbmFtZSwgX191OCAqb2N0ZXRzLAoJCQkgICAgIGludCBsZW4sIGludCBvd25lcikKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvY3RldHMgIT0gTlVMTCwgcmV0dXJuOyk7CgoJYXR0cmliID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc19hdHRyaWIpLCBHRlBfQVRPTUlDKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJbWVtc2V0KGF0dHJpYiwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYikpOwoKCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOwoJYXR0cmliLT5uYW1lID0gc3RybmR1cChuYW1lLCBJQVNfTUFYX0FUVFJJQk5BTUUpOwoKCWF0dHJpYi0+dmFsdWUgPSBpcmlhc19uZXdfb2N0c2VxX3ZhbHVlKCBvY3RldHMsIGxlbik7CgoJaXJpYXNfYWRkX2F0dHJpYihvYmosIGF0dHJpYiwgb3duZXIpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfYWRkX29jdHNlcV9hdHRyaWIpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfb2JqZWN0X2FkZF9zdHJpbmdfYXR0cmliIChvYmosIHN0cmluZykKICoKICogICAgQWRkIGEgc3RyaW5nIGF0dHJpYnV0ZSB0byBhbiBMTS1JQVMgb2JqZWN0CiAqCiAqLwp2b2lkIGlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKHN0cnVjdCBpYXNfb2JqZWN0ICpvYmosIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLAoJCQkgICAgIGludCBvd25lcikKewoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCglJUkRBX0FTU0VSVChvYmogIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybjspOwoKCUlSREFfQVNTRVJUKG5hbWUgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCglhdHRyaWIgPSBrbWFsbG9jKHNpemVvZiggc3RydWN0IGlhc19hdHRyaWIpLCBHRlBfQVRPTUlDKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBhdHRyaWJ1dGUhXG4iLAoJCQkgICAgIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJbWVtc2V0KGF0dHJpYiwgMCwgc2l6ZW9mKCBzdHJ1Y3QgaWFzX2F0dHJpYikpOwoKCWF0dHJpYi0+bWFnaWMgPSBJQVNfQVRUUklCX01BR0lDOwoJYXR0cmliLT5uYW1lID0gc3RybmR1cChuYW1lLCBJQVNfTUFYX0FUVFJJQk5BTUUpOwoKCWF0dHJpYi0+dmFsdWUgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKHZhbHVlKTsKCglpcmlhc19hZGRfYXR0cmliKG9iaiwgYXR0cmliLCBvd25lcik7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19hZGRfc3RyaW5nX2F0dHJpYik7CgovKgogKiBGdW5jdGlvbiBpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSAoaW50ZWdlcikKICoKICogICAgQ3JlYXRlIG5ldyBJQVMgaW50ZWdlciB2YWx1ZQogKgogKi8Kc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUoaW50IGludGVnZXIpCnsKCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOwoKCXZhbHVlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOwoJaWYgKHZhbHVlID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1zZXQodmFsdWUsIDAsIHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSk7CgoJdmFsdWUtPnR5cGUgPSBJQVNfSU5URUdFUjsKCXZhbHVlLT5sZW4gPSA0OwoJdmFsdWUtPnQuaW50ZWdlciA9IGludGVnZXI7CgoJcmV0dXJuIHZhbHVlOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUpOwoKLyoKICogRnVuY3Rpb24gaXJpYXNfbmV3X3N0cmluZ192YWx1ZSAoc3RyaW5nKQogKgogKiAgICBDcmVhdGUgbmV3IElBUyBzdHJpbmcgdmFsdWUKICoKICogUGVyIElyTE1QIDEuMSwgNC4zLjMuMiwgc3RyaW5ncyBhcmUgdXAgdG8gMjU2IGNoYXJzIC0gSmVhbiBJSQogKi8Kc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X3N0cmluZ192YWx1ZShjaGFyICpzdHJpbmcpCnsKCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOwoKCXZhbHVlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlhc192YWx1ZSksIEdGUF9BVE9NSUMpOwoJaWYgKHZhbHVlID09IE5VTEwpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiBVbmFibGUgdG8ga21hbGxvYyFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1zZXQoIHZhbHVlLCAwLCBzaXplb2YoIHN0cnVjdCBpYXNfdmFsdWUpKTsKCgl2YWx1ZS0+dHlwZSA9IElBU19TVFJJTkc7Cgl2YWx1ZS0+Y2hhcnNldCA9IENTX0FTQ0lJOwoJdmFsdWUtPnQuc3RyaW5nID0gc3RybmR1cChzdHJpbmcsIElBU19NQVhfU1RSSU5HKTsKCXZhbHVlLT5sZW4gPSBzdHJsZW4odmFsdWUtPnQuc3RyaW5nKTsKCglyZXR1cm4gdmFsdWU7Cn0KRVhQT1JUX1NZTUJPTChpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKTsKCi8qCiAqIEZ1bmN0aW9uIGlyaWFzX25ld19vY3RzZXFfdmFsdWUgKG9jdGV0cywgbGVuKQogKgogKiAgICBDcmVhdGUgbmV3IElBUyBvY3RldC1zZXF1ZW5jZSB2YWx1ZQogKgogKiBQZXIgSXJMTVAgMS4xLCA0LjMuMy4yLCBvY3RldC1zZXF1ZW5jZSBhcmUgdXAgdG8gMTAyNCBieXRlcyAtIEplYW4gSUkKICovCnN0cnVjdCBpYXNfdmFsdWUgKmlyaWFzX25ld19vY3RzZXFfdmFsdWUoX191OCAqb2N0c2VxICwgaW50IGxlbikKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCW1lbXNldCh2YWx1ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpKTsKCgl2YWx1ZS0+dHlwZSA9IElBU19PQ1RfU0VROwoJLyogQ2hlY2sgbGVuZ3RoICovCglpZihsZW4gPiBJQVNfTUFYX09DVEVUX1NUUklORykKCQlsZW4gPSBJQVNfTUFYX09DVEVUX1NUUklORzsKCXZhbHVlLT5sZW4gPSBsZW47CgoJdmFsdWUtPnQub2N0X3NlcSA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKCWlmICh2YWx1ZS0+dC5vY3Rfc2VxID09IE5VTEwpewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlrZnJlZSh2YWx1ZSk7CgkJcmV0dXJuIE5VTEw7Cgl9CgltZW1jcHkodmFsdWUtPnQub2N0X3NlcSwgb2N0c2VxICwgbGVuKTsKCXJldHVybiB2YWx1ZTsKfQpFWFBPUlRfU1lNQk9MKGlyaWFzX25ld19vY3RzZXFfdmFsdWUpOwoKc3RydWN0IGlhc192YWx1ZSAqaXJpYXNfbmV3X21pc3NpbmdfdmFsdWUodm9pZCkKewoJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CgoJdmFsdWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWFzX3ZhbHVlKSwgR0ZQX0FUT01JQyk7CglpZiAodmFsdWUgPT0gTlVMTCkgewoJCUlSREFfV0FSTklORygiJXM6IFVuYWJsZSB0byBrbWFsbG9jIVxuIiwgX19GVU5DVElPTl9fKTsKCQlyZXR1cm4gTlVMTDsKCX0KCW1lbXNldCh2YWx1ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpYXNfdmFsdWUpKTsKCgl2YWx1ZS0+dHlwZSA9IElBU19NSVNTSU5HOwoJdmFsdWUtPmxlbiA9IDA7CgoJcmV0dXJuIHZhbHVlOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhc19kZWxldGVfdmFsdWUgKHZhbHVlKQogKgogKiAgICBEZWxldGUgSUFTIHZhbHVlCiAqCiAqLwp2b2lkIGlyaWFzX2RlbGV0ZV92YWx1ZShzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSkKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCglzd2l0Y2ggKHZhbHVlLT50eXBlKSB7CgljYXNlIElBU19JTlRFR0VSOiAvKiBGYWxsdGhyb3VnaCAqLwoJY2FzZSBJQVNfTUlTU0lORzoKCQkvKiBObyBuZWVkIHRvIGRlYWxsb2NhdGUgKi8KCQlicmVhazsKCWNhc2UgSUFTX1NUUklORzoKCQkvKiBEZWFsbG9jYXRlIHN0cmluZyAqLwoJCWtmcmVlKHZhbHVlLT50LnN0cmluZyk7CgkJYnJlYWs7CgljYXNlIElBU19PQ1RfU0VROgoJCS8qIERlYWxsb2NhdGUgYnl0ZSBzdHJlYW0gKi8KCQkga2ZyZWUodmFsdWUtPnQub2N0X3NlcSk7CgkJIGJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBVbmtub3duIHZhbHVlIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWJyZWFrOwoJfQoJa2ZyZWUodmFsdWUpOwp9CkVYUE9SVF9TWU1CT0woaXJpYXNfZGVsZXRlX3ZhbHVlKTsK