LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcmlhcC5jCiAqIFZlcnNpb246ICAgICAgIDAuOAogKiBEZXNjcmlwdGlvbjogICBJbmZvcm1hdGlvbiBBY2Nlc3MgUHJvdG9jb2wgKElBUCkKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFRodSBBdWcgMjEgMDA6MDI6MDcgMTk5NwogKiBNb2RpZmllZCBhdDogICBTYXQgRGVjIDI1IDE2OjQyOjQyIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPiwKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgTmVpdGhlciBEYWcgQnJhdHRsaSBub3IgVW5pdmVyc2l0eSBvZiBUcm9tc/ggYWRtaXQgbGlhYmlsaXR5IG5vcgogKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CgojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgojaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lyZGEuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lydHRwLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXNfb2JqZWN0Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcF9ldmVudC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KCiNpZmRlZiBDT05GSUdfSVJEQV9ERUJVRwovKiBGSVhNRTogVGhpcyBvbmUgc2hvdWxkIGdvIGluIGlybG1wLmMgKi8Kc3RhdGljIGNvbnN0IGNoYXIgKmlhc19jaGFyc2V0X3R5cGVzW10gPSB7CgkiQ1NfQVNDSUkiLAoJIkNTX0lTT184ODU5XzEiLAoJIkNTX0lTT184ODU5XzIiLAoJIkNTX0lTT184ODU5XzMiLAoJIkNTX0lTT184ODU5XzQiLAoJIkNTX0lTT184ODU5XzUiLAoJIkNTX0lTT184ODU5XzYiLAoJIkNTX0lTT184ODU5XzciLAoJIkNTX0lTT184ODU5XzgiLAoJIkNTX0lTT184ODU5XzkiLAoJIkNTX1VOSUNPREUiCn07CiNlbmRpZgkvKiBDT05GSUdfSVJEQV9ERUJVRyAqLwoKc3RhdGljIGhhc2hiaW5fdCAqaXJpYXAgPSBOVUxMOwpzdGF0aWMgdm9pZCAqc2VydmljZV9oYW5kbGU7CgpzdGF0aWMgdm9pZCBfX2lyaWFwX2Nsb3NlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZik7CnN0YXRpYyBpbnQgaXJpYXBfcmVnaXN0ZXJfbHNhcChzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIF9fdTggc2xzYXBfc2VsLCBpbnQgbW9kZSk7CnN0YXRpYyB2b2lkIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJCUxNX1JFQVNPTiByZWFzb24sIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJCSAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsCgkJCQkgIF9fdTMyIG1heF9zZHVfc2l6ZSwgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOwpzdGF0aWMgaW50IGlyaWFwX2RhdGFfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJIHN0cnVjdCBza19idWZmICpza2IpOwoKc3RhdGljIHZvaWQgaXJpYXBfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCh2b2lkICpkYXRhKTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBpcmlhcF9zdGFydF93YXRjaGRvZ190aW1lcihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIAoJCQkJCSAgICAgIGludCB0aW1lb3V0KSAKewoJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIsIHRpbWVvdXQsIHNlbGYsIAoJCQkgaXJpYXBfd2F0Y2hkb2dfdGltZXJfZXhwaXJlZCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2luaXQgKHZvaWQpCiAqCiAqICAgIEluaXRpYWxpemVzIHRoZSBJcklBUCBsYXllciwgY2FsbGVkIGJ5IHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gY29kZQogKiAgICBpbiBpcm1vZC5jCiAqLwppbnQgX19pbml0IGlyaWFwX2luaXQodm9pZCkKewoJc3RydWN0IGlhc19vYmplY3QgKm9iajsKCXN0cnVjdCBpcmlhcF9jYiAqc2VydmVyOwoJX191OCBvY3Rfc2VxWzZdOwoJX191MTYgaGludHM7CgoJLyogQWxsb2NhdGUgbWFzdGVyIGFycmF5ICovCglpcmlhcCA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOwoJaWYgKCFpcmlhcCkKCQlyZXR1cm4gLUVOT01FTTsKCgkvKiBPYmplY3QgcmVwb3NpdG9yeSAtIGRlZmluZWQgaW4gaXJpYXNfb2JqZWN0LmMgKi8KCWlyaWFzX29iamVjdHMgPSBoYXNoYmluX25ldyhIQl9MT0NLKTsKCWlmICghaXJpYXNfb2JqZWN0cykgewoJCUlSREFfV0FSTklORygiJXM6IENhbid0IGFsbG9jYXRlIGlyaWFzX29iamVjdHMgaGFzaGJpbiFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQloYXNoYmluX2RlbGV0ZShpcmlhcCwgTlVMTCk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJLyoKCSAqICBSZWdpc3RlciBzb21lIGRlZmF1bHQgc2VydmljZXMgZm9yIElyTE1QCgkgKi8KCWhpbnRzICA9IGlybG1wX3NlcnZpY2VfdG9faGludChTX0NPTVBVVEVSKTsKCXNlcnZpY2VfaGFuZGxlID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CgoJLyogUmVnaXN0ZXIgdGhlIERldmljZSBvYmplY3Qgd2l0aCBMTS1JQVMgKi8KCW9iaiA9IGlyaWFzX25ld19vYmplY3QoIkRldmljZSIsIElBU19ERVZJQ0VfSUQpOwoJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiRGV2aWNlTmFtZSIsICJMaW51eCIsIElBU19LRVJORUxfQVRUUik7CgoJb2N0X3NlcVswXSA9IDB4MDE7ICAvKiBWZXJzaW9uIDEgKi8KCW9jdF9zZXFbMV0gPSAweDAwOyAgLyogSUFTIHN1cHBvcnQgYml0cyAqLwoJb2N0X3NlcVsyXSA9IDB4MDA7ICAvKiBMTS1NVVggc3VwcG9ydCBiaXRzICovCiNpZmRlZiBDT05GSUdfSVJEQV9VTFRSQQoJb2N0X3NlcVsyXSB8PSAweDA0OyAvKiBDb25uZWN0aW9ubGVzcyBEYXRhIHN1cHBvcnQgKi8KI2VuZGlmCglpcmlhc19hZGRfb2N0c2VxX2F0dHJpYihvYmosICJJckxNUFN1cHBvcnQiLCBvY3Rfc2VxLCAzLAoJCQkJSUFTX0tFUk5FTF9BVFRSKTsKCWlyaWFzX2luc2VydF9vYmplY3Qob2JqKTsKCgkvKgoJICogIFJlZ2lzdGVyIHNlcnZlciBzdXBwb3J0IHdpdGggSXJMTVAgc28gd2UgY2FuIGFjY2VwdCBpbmNvbWluZwoJICogIGNvbm5lY3Rpb25zCgkgKi8KCXNlcnZlciA9IGlyaWFwX29wZW4oTFNBUF9JQVMsIElBU19TRVJWRVIsIE5VTEwsIE5VTEwpOwoJaWYgKCFzZXJ2ZXIpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8gb3BlbiBzZXJ2ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuIC0xOwoJfQoJaXJpYXBfcmVnaXN0ZXJfbHNhcChzZXJ2ZXIsIExTQVBfSUFTLCBJQVNfU0VSVkVSKTsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY2xlYW51cCAodm9pZCkKICoKICogICAgSW5pdGlhbGl6ZXMgdGhlIElySUFQIGxheWVyLCBjYWxsZWQgYnkgdGhlIG1vZHVsZSBjbGVhbnVwIGNvZGUgaW4KICogICAgaXJtb2QuYwogKi8Kdm9pZCBfX2V4aXQgaXJpYXBfY2xlYW51cCh2b2lkKQp7CglpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2Uoc2VydmljZV9oYW5kbGUpOwoKCWhhc2hiaW5fZGVsZXRlKGlyaWFwLCAoRlJFRV9GVU5DKSBfX2lyaWFwX2Nsb3NlKTsKCWhhc2hiaW5fZGVsZXRlKGlyaWFzX29iamVjdHMsIChGUkVFX0ZVTkMpIF9faXJpYXNfZGVsZXRlX29iamVjdCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX29wZW4gKHZvaWQpCiAqCiAqICAgIE9wZW5zIGFuIGluc3RhbmNlIG9mIHRoZSBJcklBUCBsYXllciwgYW5kIHJlZ2lzdGVycyB3aXRoIElyTE1QCiAqLwpzdHJ1Y3QgaXJpYXBfY2IgKmlyaWFwX29wZW4oX191OCBzbHNhcF9zZWwsIGludCBtb2RlLCB2b2lkICpwcml2LAoJCQkgICAgQ09ORklSTV9DQUxMQkFDSyBjYWxsYmFjaykKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJc2VsZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcmlhcF9jYiksIEdGUF9BVE9NSUMpOwoJaWYgKCFzZWxmKSB7CgkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiBOVUxMOwoJfQoKCS8qCgkgKiAgSW5pdGlhbGl6ZSBpbnN0YW5jZQoJICovCgltZW1zZXQoc2VsZiwgMCwgc2l6ZW9mKHN0cnVjdCBpcmlhcF9jYikpOwoKCXNlbGYtPm1hZ2ljID0gSUFTX01BR0lDOwoJc2VsZi0+bW9kZSA9IG1vZGU7CglpZiAobW9kZSA9PSBJQVNfQ0xJRU5UKQoJCWlyaWFwX3JlZ2lzdGVyX2xzYXAoc2VsZiwgc2xzYXBfc2VsLCBtb2RlKTsKCglzZWxmLT5jb25maXJtID0gY2FsbGJhY2s7CglzZWxmLT5wcml2ID0gcHJpdjsKCgkvKiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdCgpIHdpbGwgY29uc3RydWN0IHBhY2tldHMgYmVmb3JlCgkgKiB3ZSBjb25uZWN0LCBzbyB0aGlzIG11c3QgaGF2ZSBhIHNhbmUgdmFsdWUuLi4gSmVhbiBJSSAqLwoJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gTE1QX01BWF9IRUFERVI7CgoJaW5pdF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoKCWhhc2hiaW5faW5zZXJ0KGlyaWFwLCAoaXJkYV9xdWV1ZV90ICopIHNlbGYsIChsb25nKSBzZWxmLCBOVUxMKTsKCgkvKiBJbml0aWFsaXplIHN0YXRlIG1hY2hpbmVzICovCglpcmlhcF9uZXh0X2NsaWVudF9zdGF0ZShzZWxmLCBTX0RJU0NPTk5FQ1QpOwoJaXJpYXBfbmV4dF9jYWxsX3N0YXRlKHNlbGYsIFNfTUFLRV9DQUxMKTsKCWlyaWFwX25leHRfc2VydmVyX3N0YXRlKHNlbGYsIFJfRElTQ09OTkVDVCk7CglpcmlhcF9uZXh0X3JfY29ubmVjdF9zdGF0ZShzZWxmLCBSX1dBSVRJTkcpOwoKCXJldHVybiBzZWxmOwp9CkVYUE9SVF9TWU1CT0woaXJpYXBfb3Blbik7CgovKgogKiBGdW5jdGlvbiBfX2lyaWFwX2Nsb3NlIChzZWxmKQogKgogKiAgICBSZW1vdmVzIChkZWFsbG9jYXRlcykgdGhlIElySUFQIGluc3RhbmNlCiAqCiAqLwpzdGF0aWMgdm9pZCBfX2lyaWFwX2Nsb3NlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCglpZiAoc2VsZi0+cmVxdWVzdF9za2IpCgkJZGV2X2tmcmVlX3NrYihzZWxmLT5yZXF1ZXN0X3NrYik7CgoJc2VsZi0+bWFnaWMgPSAwOwoKCWtmcmVlKHNlbGYpOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9jbG9zZSAodm9pZCkKICoKICogICAgQ2xvc2VzIElySUFQIGFuZCBkZXJlZ2lzdGVycyB3aXRoIElyTE1QCiAqLwp2b2lkIGlyaWFwX2Nsb3NlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKewoJc3RydWN0IGlyaWFwX2NiICplbnRyeTsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCWlmIChzZWxmLT5sc2FwKSB7CgkJaXJsbXBfY2xvc2VfbHNhcChzZWxmLT5sc2FwKTsKCQlzZWxmLT5sc2FwID0gTlVMTDsKCX0KCgllbnRyeSA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaGFzaGJpbl9yZW1vdmUoaXJpYXAsIChsb25nKSBzZWxmLCBOVUxMKTsKCUlSREFfQVNTRVJUKGVudHJ5ID09IHNlbGYsIHJldHVybjspOwoKCV9faXJpYXBfY2xvc2Uoc2VsZik7Cn0KRVhQT1JUX1NZTUJPTChpcmlhcF9jbG9zZSk7CgpzdGF0aWMgaW50IGlyaWFwX3JlZ2lzdGVyX2xzYXAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBfX3U4IHNsc2FwX3NlbCwgaW50IG1vZGUpCnsKCW5vdGlmeV90IG5vdGlmeTsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7Cglub3RpZnkuY29ubmVjdF9jb25maXJtICAgICAgID0gaXJpYXBfY29ubmVjdF9jb25maXJtOwoJbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiAgICA9IGlyaWFwX2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb247Cglub3RpZnkuZGF0YV9pbmRpY2F0aW9uICAgICAgID0gaXJpYXBfZGF0YV9pbmRpY2F0aW9uOwoJbm90aWZ5Lmluc3RhbmNlID0gc2VsZjsKCWlmIChtb2RlID09IElBU19DTElFTlQpCgkJc3RyY3B5KG5vdGlmeS5uYW1lLCAiSXJJQVMgY2xpIik7CgllbHNlCgkJc3RyY3B5KG5vdGlmeS5uYW1lLCAiSXJJQVMgc3J2Iik7CgoJc2VsZi0+bHNhcCA9IGlybG1wX29wZW5fbHNhcChzbHNhcF9zZWwsICZub3RpZnksIDApOwoJaWYgKHNlbGYtPmxzYXAgPT0gTlVMTCkgewoJCUlSREFfRVJST1IoIiVzOiBVbmFibGUgdG8gYWxsb2NhdGVkIExTQVAhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAtMTsKCX0KCXNlbGYtPnNsc2FwX3NlbCA9IHNlbGYtPmxzYXAtPnNsc2FwX3NlbDsKCglyZXR1cm4gMDsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uIChoYW5kbGUsIHJlYXNvbikKICoKICogICAgR290IGRpc2Nvbm5lY3QsIHNvIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbgogKgogKi8Kc3RhdGljIHZvaWQgaXJpYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkJTE1fUkVBU09OIHJlYXNvbiwKCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaXJpYXBfY2IgKnNlbGY7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcmVhc29uPSVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybG1wX3JlYXNvbnNbcmVhc29uXSk7CgoJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJSVJEQV9BU1NFUlQoaXJpYXAgIT0gTlVMTCwgcmV0dXJuOyk7CgoJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJLyogTm90IG5lZWRlZCAqLwoJaWYgKHNrYikKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgoJaWYgKHNlbGYtPm1vZGUgPT0gSUFTX0NMSUVOVCkgewoJCUlSREFfREVCVUcoNCwgIiVzKCksIGRpc2Nvbm5lY3QgYXMgY2xpZW50XG4iLCBfX0ZVTkNUSU9OX18pOwoKCgkJaXJpYXBfZG9fY2xpZW50X2V2ZW50KHNlbGYsIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT04sCgkJCQkgICAgICBOVUxMKTsKCQkvKgoJCSAqIEluZm9ybSBzZXJ2aWNlIHVzZXIgdGhhdCB0aGUgcmVxdWVzdCBmYWlsZWQgYnkgc2VuZGluZwoJCSAqIGl0IGEgTlVMTCB2YWx1ZS4gV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28KCQkgKiByZW1lbWJlciBubyB0byB1c2Ugc2VsZiBhbnltb3JlIGFmdGVyIGNhbGxpbmcgY29uZmlybQoJCSAqLwoJCWlmIChzZWxmLT5jb25maXJtKQoJCQlzZWxmLT5jb25maXJtKElBU19ESVNDT05ORUNULCAwLCBOVUxMLCBzZWxmLT5wcml2KTsKCX0gZWxzZSB7CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgZGlzY29ubmVjdCBhcyBzZXJ2ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CgkJaXJpYXBfZG9fc2VydmVyX2V2ZW50KHNlbGYsIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT04sCgkJCQkgICAgICBOVUxMKTsKCQlpcmlhcF9jbG9zZShzZWxmKTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0IChoYW5kbGUpCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CglpZiAodHhfc2tiID09IE5VTEwpIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBDb3VsZCBub3QgYWxsb2NhdGUgYW4gc2tfYnVmZiBvZiBsZW5ndGggJWRcbiIsIAoJCQlfX0ZVTkNUSU9OX18sIDY0KTsKCQlyZXR1cm47Cgl9CgoJLyoKCSAqICBSZXNlcnZlIHNwYWNlIGZvciBNVVggY29udHJvbCBhbmQgTEFQIGhlYWRlcgoJICovCglza2JfcmVzZXJ2ZSh0eF9za2IsIExNUF9NQVhfSEVBREVSKTsKCglpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZ2V0dmFsdWVieWNsYXNzIChhZGRyLCBuYW1lLCBhdHRyKQogKgogKiAgICBSZXRyZWl2ZSBhbGwgdmFsdWVzIGZyb20gYXR0cmlidXRlIGluIGFsbCBvYmplY3RzIHdpdGggZ2l2ZW4gY2xhc3MKICogICAgbmFtZQogKi8KaW50IGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKCQkJCSAgX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyLAoJCQkJICBjaGFyICpuYW1lLCBjaGFyICphdHRyKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOwoJaW50IG5hbWVfbGVuLCBhdHRyX2xlbiwgc2tiX2xlbjsKCV9fdTggKmZyYW1lOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybiAtMTspOwoKCS8qIENsaWVudCBtdXN0IHN1cHBseSB0aGUgZGVzdGluYXRpb24gZGV2aWNlIGFkZHJlc3MgKi8KCWlmICghZGFkZHIpCgkJcmV0dXJuIC0xOwoKCXNlbGYtPmRhZGRyID0gZGFkZHI7CglzZWxmLT5zYWRkciA9IHNhZGRyOwoKCS8qCgkgKiAgU2F2ZSBvcGVyYXRpb24sIHNvIHdlIGtub3cgd2hhdCB0aGUgbGF0ZXIgaW5kaWNhdGlvbiBpcyBhYm91dAoJICovCglzZWxmLT5vcGVyYXRpb24gPSBHRVRfVkFMVUVfQllfQ0xBU1M7CgoJLyogR2l2ZSBvdXJzZWx2ZXMgMTAgc2VjcyB0byBmaW5pc2ggdGhpcyBvcGVyYXRpb24gKi8KCWlyaWFwX3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDEwKkhaKTsKCgluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsJLyogVXAgdG8gSUFTX01BWF9DTEFTU05BTUUgPSA2MCAqLwoJYXR0cl9sZW4gPSBzdHJsZW4oYXR0cik7CS8qIFVwIHRvIElBU19NQVhfQVRUUklCTkFNRSA9IDYwICovCgoJc2tiX2xlbiA9IHNlbGYtPm1heF9oZWFkZXJfc2l6ZSsyK25hbWVfbGVuKzErYXR0cl9sZW4rNDsKCXR4X3NrYiA9IGRldl9hbGxvY19za2Ioc2tiX2xlbik7CglpZiAoIXR4X3NrYikKCQlyZXR1cm4gLUVOT01FTTsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBNVVggYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQodHhfc2tiLCAzK25hbWVfbGVuK2F0dHJfbGVuKTsKCWZyYW1lID0gdHhfc2tiLT5kYXRhOwoKCS8qIEJ1aWxkIGZyYW1lICovCglmcmFtZVswXSA9IElBUF9MU1QgfCBHRVRfVkFMVUVfQllfQ0xBU1M7CglmcmFtZVsxXSA9IG5hbWVfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zZXJ0IGxlbmd0aCBvZiBuYW1lICovCgltZW1jcHkoZnJhbWUrMiwgbmFtZSwgbmFtZV9sZW4pOyAgICAgICAgICAgLyogSW5zZXJ0IG5hbWUgKi8KCWZyYW1lWzIrbmFtZV9sZW5dID0gYXR0cl9sZW47ICAgICAgICAgICAgICAvKiBJbnNlcnQgbGVuZ3RoIG9mIGF0dHIgKi8KCW1lbWNweShmcmFtZSszK25hbWVfbGVuLCBhdHRyLCBhdHRyX2xlbik7ICAvKiBJbnNlcnQgYXR0ciAqLwoKCWlyaWFwX2RvX2NsaWVudF9ldmVudChzZWxmLCBJQVBfQ0FMTF9SRVFVRVNUX0dWQkMsIHR4X3NrYik7CgoJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfc19kaXNjb25uZWN0KCkuICovCglkZXZfa2ZyZWVfc2tiKHR4X3NrYik7CgoJcmV0dXJuIDA7Cn0KRVhQT1JUX1NZTUJPTChpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVxdWVzdCk7CgovKgogKiBGdW5jdGlvbiBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfY29uZmlybSAoc2VsZiwgc2tiKQogKgogKiAgICBHb3QgcmVzdWx0IGZyb20gR2V0VmFsdWVCeUNsYXNzIGNvbW1hbmQuIFBhcnNlIGl0IGFuZCByZXR1cm4gcmVzdWx0CiAqICAgIHRvIHNlcnZpY2UgdXNlci4KICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2dldHZhbHVlYnljbGFzc19jb25maXJtKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpYXNfdmFsdWUgKnZhbHVlOwoJaW50IGNoYXJzZXQ7CglfX3UzMiB2YWx1ZV9sZW47CglfX3UzMiB0bXBfY3B1MzI7CglfX3UxNiBvYmpfaWQ7CglfX3UxNiBsZW47CglfX3U4ICB0eXBlOwoJX191OCAqZnA7CglpbnQgbjsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCgkvKiBJbml0aWFsaXplIHZhcmlhYmxlcyAqLwoJZnAgPSBza2ItPmRhdGE7CgluID0gMjsKCgkvKiBHZXQgbGVuZ3RoLCBNU0IgZmlyc3QgKi8KCWxlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7IG4gKz0gMjsKCglJUkRBX0RFQlVHKDQsICIlcygpLCBsZW49JWRcbiIsIF9fRlVOQ1RJT05fXywgbGVuKTsKCgkvKiBHZXQgb2JqZWN0IElELCBNU0IgZmlyc3QgKi8KCW9ial9pZCA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7IG4gKz0gMjsKCgl0eXBlID0gZnBbbisrXTsKCUlSREFfREVCVUcoNCwgIiVzKCksIFZhbHVlIHR5cGUgPSAlZFxuIiwgX19GVU5DVElPTl9fLCB0eXBlKTsKCglzd2l0Y2ggKHR5cGUpIHsKCWNhc2UgSUFTX0lOVEVHRVI6CgkJbWVtY3B5KCZ0bXBfY3B1MzIsIGZwK24sIDQpOyBuICs9IDQ7CgkJYmUzMl90b19jcHVzKCZ0bXBfY3B1MzIpOwoJCXZhbHVlID0gaXJpYXNfbmV3X2ludGVnZXJfdmFsdWUodG1wX2NwdTMyKTsKCgkJLyogIExlZ2FsIHZhbHVlcyByZXN0cmljdGVkIHRvIDB4MDEtMHg2ZiwgcGFnZSAxNSBpcnR0cCAqLwoJCUlSREFfREVCVUcoNCwgIiVzKCksIGxzYXA9JWRcbiIsIF9fRlVOQ1RJT05fXywgdmFsdWUtPnQuaW50ZWdlcik7CgkJYnJlYWs7CgljYXNlIElBU19TVFJJTkc6CgkJY2hhcnNldCA9IGZwW24rK107CgoJCXN3aXRjaCAoY2hhcnNldCkgewoJCWNhc2UgQ1NfQVNDSUk6CgkJCWJyZWFrOwovKgkJY2FzZSBDU19JU09fODg1OV8xOiAqLwovKgkJY2FzZSBDU19JU09fODg1OV8yOiAqLwovKgkJY2FzZSBDU19JU09fODg1OV8zOiAqLwovKgkJY2FzZSBDU19JU09fODg1OV80OiAqLwovKgkJY2FzZSBDU19JU09fODg1OV81OiAqLwovKgkJY2FzZSBDU19JU09fODg1OV82OiAqLwovKgkJY2FzZSBDU19JU09fODg1OV83OiAqLwovKgkJY2FzZSBDU19JU09fODg1OV84OiAqLwovKgkJY2FzZSBDU19JU09fODg1OV85OiAqLwovKgkJY2FzZSBDU19VTklDT0RFOiAqLwoJCWRlZmF1bHQ6CgkJCUlSREFfREVCVUcoMCwgIiVzKCksIGNoYXJzZXQgJXMsIG5vdCBzdXBwb3J0ZWRcbiIsCgkJCQkgICBfX0ZVTkNUSU9OX18sIGlhc19jaGFyc2V0X3R5cGVzW2NoYXJzZXRdKTsKCgkJCS8qIEFib3J0aW5nLCBjbG9zZSBjb25uZWN0aW9uISAqLwoJCQlpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CgkJCXJldHVybjsKCQkJLyogYnJlYWs7ICovCgkJfQoJCXZhbHVlX2xlbiA9IGZwW24rK107CgkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3RybGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlX2xlbik7CgoJCS8qIE1ha2Ugc3VyZSB0aGUgc3RyaW5nIGlzIG51bGwtdGVybWluYXRlZCAqLwoJCWZwW24rdmFsdWVfbGVuXSA9IDB4MDA7CgkJSVJEQV9ERUJVRyg0LCAiR290IHN0cmluZyAlc1xuIiwgZnArbik7CgoJCS8qIFdpbGwgdHJ1bmNhdGUgdG8gSUFTX01BWF9TVFJJTkcgYnl0ZXMgKi8KCQl2YWx1ZSA9IGlyaWFzX25ld19zdHJpbmdfdmFsdWUoZnArbik7CgkJYnJlYWs7CgljYXNlIElBU19PQ1RfU0VROgoJCXZhbHVlX2xlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7CgkJbiArPSAyOwoKCQkvKiBXaWxsIHRydW5jYXRlIHRvIElBU19NQVhfT0NURVRfU1RSSU5HIGJ5dGVzICovCgkJdmFsdWUgPSBpcmlhc19uZXdfb2N0c2VxX3ZhbHVlKGZwK24sIHZhbHVlX2xlbik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXZhbHVlID0gaXJpYXNfbmV3X21pc3NpbmdfdmFsdWUoKTsKCQlicmVhazsKCX0KCgkvKiBGaW5pc2hlZCwgY2xvc2UgY29ubmVjdGlvbiEgKi8KCWlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmKTsKCgkvKiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbyByZW1lbWJlciBubyB0byB1c2Ugc2VsZgoJICogYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KCSAqLwoJaWYgKHNlbGYtPmNvbmZpcm0pCgkJc2VsZi0+Y29uZmlybShJQVNfU1VDQ0VTUywgb2JqX2lkLCB2YWx1ZSwgc2VsZi0+cHJpdik7CgllbHNlIHsKCQlJUkRBX0RFQlVHKDAsICIlcygpLCBtaXNzaW5nIGhhbmRsZXIhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWlyaWFzX2RlbGV0ZV92YWx1ZSh2YWx1ZSk7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZSAoKQogKgogKiAgICBTZW5kIGFuc3dlciBiYWNrIHRvIHJlbW90ZSBMTS1JQVMKICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCgkJCQkJICAgX191MTYgb2JqX2lkLAoJCQkJCSAgIF9fdTggcmV0X2NvZGUsCgkJCQkJICAgc3RydWN0IGlhc192YWx1ZSAqdmFsdWUpCnsKCXN0cnVjdCBza19idWZmICp0eF9za2I7CglpbnQgbjsKCV9fdTMyIHRtcF9iZTMyLCB0bXBfYmUxNjsKCV9fdTggKmZwOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh2YWx1ZSAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHZhbHVlLT5sZW4gPD0gMTAyNCwgcmV0dXJuOyk7CgoJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KCW4gPSAwOwoKCS8qCgkgKiAgV2UgbXVzdCBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGFmdGVyIHRoZSBsZW5ndGggb2YgdGhlCgkgKiAgdmFsdWUuIFdlIGFkZCAzMiBieXRlcyBiZWNhdXNlIG9mIHRoZSA2IGJ5dGVzIGZvciB0aGUgZnJhbWUgYW5kCgkgKiAgbWF4IDUgYnl0ZXMgZm9yIHRoZSB2YWx1ZSBjb2RpbmcuCgkgKi8KCXR4X3NrYiA9IGRldl9hbGxvY19za2IodmFsdWUtPmxlbiArIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSArIDMyKTsKCWlmICghdHhfc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBNVVggYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQodHhfc2tiLCA2KTsKCglmcCA9IHR4X3NrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnBbbisrXSA9IEdFVF9WQUxVRV9CWV9DTEFTUyB8IElBUF9MU1Q7CglmcFtuKytdID0gcmV0X2NvZGU7CgoJLyogSW5zZXJ0IGxpc3QgbGVuZ3RoIChNU0IgZmlyc3QpICovCgl0bXBfYmUxNiA9IF9fY29uc3RhbnRfaHRvbnMoMHgwMDAxKTsKCW1lbWNweShmcCtuLCAmdG1wX2JlMTYsIDIpOyAgbiArPSAyOwoKCS8qIEluc2VydCBvYmplY3QgaWRlbnRpZmllciAoIE1TQiBmaXJzdCkgKi8KCXRtcF9iZTE2ID0gY3B1X3RvX2JlMTYob2JqX2lkKTsKCW1lbWNweShmcCtuLCAmdG1wX2JlMTYsIDIpOyBuICs9IDI7CgoJc3dpdGNoICh2YWx1ZS0+dHlwZSkgewoJY2FzZSBJQVNfU1RSSU5HOgoJCXNrYl9wdXQodHhfc2tiLCAzICsgdmFsdWUtPmxlbik7CgkJZnBbbisrXSA9IHZhbHVlLT50eXBlOwoJCWZwW24rK10gPSAwOyAvKiBBU0NJSSAqLwoJCWZwW24rK10gPSAoX191OCkgdmFsdWUtPmxlbjsKCQltZW1jcHkoZnArbiwgdmFsdWUtPnQuc3RyaW5nLCB2YWx1ZS0+bGVuKTsgbis9dmFsdWUtPmxlbjsKCQlicmVhazsKCWNhc2UgSUFTX0lOVEVHRVI6CgkJc2tiX3B1dCh0eF9za2IsIDUpOwoJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKCgkJdG1wX2JlMzIgPSBjcHVfdG9fYmUzMih2YWx1ZS0+dC5pbnRlZ2VyKTsKCQltZW1jcHkoZnArbiwgJnRtcF9iZTMyLCA0KTsgbiArPSA0OwoJCWJyZWFrOwoJY2FzZSBJQVNfT0NUX1NFUToKCQlza2JfcHV0KHR4X3NrYiwgMyArIHZhbHVlLT5sZW4pOwoJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKCgkJdG1wX2JlMTYgPSBjcHVfdG9fYmUxNih2YWx1ZS0+bGVuKTsKCQltZW1jcHkoZnArbiwgJnRtcF9iZTE2LCAyKTsgbiArPSAyOwoJCW1lbWNweShmcCtuLCB2YWx1ZS0+dC5vY3Rfc2VxLCB2YWx1ZS0+bGVuKTsgbis9dmFsdWUtPmxlbjsKCQlicmVhazsKCWNhc2UgSUFTX01JU1NJTkc6CgkJSVJEQV9ERUJVRyggMywgIiVzOiBzZW5kaW5nIElBU19NSVNTSU5HXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXNrYl9wdXQodHhfc2tiLCAxKTsKCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIHR5cGUgbm90IGltcGxlbWVudGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCQlicmVhazsKCX0KCWlyaWFwX2RvX3JfY29ubmVjdF9ldmVudChzZWxmLCBJQVBfQ0FMTF9SRVNQT05TRSwgdHhfc2tiKTsKCgkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9yX2V4ZWN1dGUoKS4gKi8KCWRldl9rZnJlZV9za2IodHhfc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2luZGljYXRpb24gKHNlbGYsIHNrYikKICoKICogICAgZ2V0dmFsdWVieWNsYXNzIGlzIHJlcXVlc3RlZCBmcm9tIHBlZXIgTE0tSUFTCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfaW5kaWNhdGlvbihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCgkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOwoJc3RydWN0IGlhc19hdHRyaWIgKmF0dHJpYjsKCWludCBuYW1lX2xlbjsKCWludCBhdHRyX2xlbjsKCWNoYXIgbmFtZVtJQVNfTUFYX0NMQVNTTkFNRSArIDFdOwkvKiA2MCBieXRlcyAqLwoJY2hhciBhdHRyW0lBU19NQVhfQVRUUklCTkFNRSArIDFdOwkvKiA2MCBieXRlcyAqLwoJX191OCAqZnA7CglpbnQgbjsKCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCWZwID0gc2tiLT5kYXRhOwoJbiA9IDE7CgoJbmFtZV9sZW4gPSBmcFtuKytdOwoJbWVtY3B5KG5hbWUsIGZwK24sIG5hbWVfbGVuKTsgbis9bmFtZV9sZW47CgluYW1lW25hbWVfbGVuXSA9ICdcMCc7CgoJYXR0cl9sZW4gPSBmcFtuKytdOwoJbWVtY3B5KGF0dHIsIGZwK24sIGF0dHJfbGVuKTsgbis9YXR0cl9sZW47CglhdHRyW2F0dHJfbGVuXSA9ICdcMCc7CgoJSVJEQV9ERUJVRyg0LCAiTE0tSUFTOiBMb29raW5nIHVwICVzOiAlc1xuIiwgbmFtZSwgYXR0cik7CglvYmogPSBpcmlhc19maW5kX29iamVjdChuYW1lKTsKCglpZiAob2JqID09IE5VTEwpIHsKCQlJUkRBX0RFQlVHKDIsICJMTS1JQVM6IE9iamVjdCAlcyBub3QgZm91bmRcbiIsIG5hbWUpOwoJCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzZWxmLCAweDEyMzUsIElBU19DTEFTU19VTktOT1dOLAoJCQkJCSAgICAgICAmaXJpYXNfbWlzc2luZyk7CgkJcmV0dXJuOwoJfQoJSVJEQV9ERUJVRyg0LCAiTE0tSUFTOiBmb3VuZCAlcywgaWQ9JWRcbiIsIG9iai0+bmFtZSwgb2JqLT5pZCk7CgoJYXR0cmliID0gaXJpYXNfZmluZF9hdHRyaWIob2JqLCBhdHRyKTsKCWlmIChhdHRyaWIgPT0gTlVMTCkgewoJCUlSREFfREVCVUcoMiwgIkxNLUlBUzogQXR0cmlidXRlICVzIG5vdCBmb3VuZFxuIiwgYXR0cik7CgkJaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlKHNlbGYsIG9iai0+aWQsCgkJCQkJICAgICAgIElBU19BVFRSSUJfVU5LTk9XTiwgCgkJCQkJICAgICAgICZpcmlhc19taXNzaW5nKTsKCQlyZXR1cm47Cgl9CgoJLyogV2UgaGF2ZSBhIG1hdGNoOyBzZW5kIHRoZSB2YWx1ZS4gICovCglpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgb2JqLT5pZCwgSUFTX1NVQ0NFU1MsCgkJCQkgICAgICAgYXR0cmliLT52YWx1ZSk7CgoJcmV0dXJuOwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF9zZW5kX2FjayAodm9pZCkKICoKICogICAgQ3VycmVudGx5IG5vdCB1c2VkCiAqCiAqLwp2b2lkIGlyaWFwX3NlbmRfYWNrKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKCV9fdTggKmZyYW1lOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CgoJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CglpZiAoIXR4X3NrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZSh0eF9za2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHR4X3NrYiwgMSk7CglmcmFtZSA9IHR4X3NrYi0+ZGF0YTsKCgkvKiBCdWlsZCBmcmFtZSAqLwoJZnJhbWVbMF0gPSBJQVBfTFNUIHwgSUFQX0FDSyB8IHNlbGYtPm9wZXJhdGlvbjsKCglpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKfQoKdm9pZCBpcmlhcF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmKQp7CglpbnQgcmV0OwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCXJldCA9IGlybG1wX2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5sc2FwLCBMU0FQX0lBUywKCQkJCSAgICBzZWxmLT5zYWRkciwgc2VsZi0+ZGFkZHIsCgkJCQkgICAgTlVMTCwgTlVMTCk7CglpZiAocmV0IDwgMCkgewoJCUlSREFfREVCVUcoMCwgIiVzKCksIGNvbm5lY3QgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCQlzZWxmLT5jb25maXJtKElBU19ESVNDT05ORUNULCAwLCBOVUxMLCBzZWxmLT5wcml2KTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY29ubmVjdF9jb25maXJtIChoYW5kbGUsIHNrYikKICoKICogICAgTFNBUCBjb25uZWN0aW9uIGNvbmZpcm1lZCEKICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NlZ19zaXplLAoJCQkJICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOwoKCXNlbGYtPm1heF9kYXRhX3NpemUgPSBtYXhfc2VnX3NpemU7CglzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJaXJpYXBfZG9fY2xpZW50X2V2ZW50KHNlbGYsIElBUF9MTV9DT05ORUNUX0NPTkZJUk0sIHNrYik7CgoJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfc19tYWtlX2NhbGwoKS4gKi8KCWRldl9rZnJlZV9za2Ioc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uICggaGFuZGxlLCBza2IpCiAqCiAqICAgIFJlbW90ZSBMTS1JQVMgaXMgcmVxdWVzdGluZyBjb25uZWN0aW9uCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZWdfc2l6ZSwKCQkJCSAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgKm5ldzsKCglJUkRBX0RFQlVHKDEsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCXNlbGYgPSAoc3RydWN0IGlyaWFwX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgZ290byBvdXQ7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgZ290byBvdXQ7KTsKCgkvKiBTdGFydCBuZXcgc2VydmVyICovCgluZXcgPSBpcmlhcF9vcGVuKExTQVBfSUFTLCBJQVNfU0VSVkVSLCBOVUxMLCBOVUxMKTsKCWlmICghbmV3KSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgb3BlbiBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CgkJZ290byBvdXQ7Cgl9CgoJLyogTm93IGF0dGFjaCB1cCB0aGUgbmV3ICJzb2NrZXQiICovCgluZXctPmxzYXAgPSBpcmxtcF9kdXAoc2VsZi0+bHNhcCwgbmV3KTsKCWlmICghbmV3LT5sc2FwKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSwgZHVwIGZhaWxlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJZ290byBvdXQ7Cgl9CgoJbmV3LT5tYXhfZGF0YV9zaXplID0gbWF4X3NlZ19zaXplOwoJbmV3LT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJLyogQ2xlYW4gdXAgdGhlIG9yaWdpbmFsIG9uZSB0byBrZWVwIGl0IGluIGxpc3RlbiBzdGF0ZSAqLwoJaXJsbXBfbGlzdGVuKHNlbGYtPmxzYXApOwoKCWlyaWFwX2RvX3NlcnZlcl9ldmVudChuZXcsIElBUF9MTV9DT05ORUNUX0lORElDQVRJT04sIHNrYik7CgpvdXQ6CgkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9yX2Rpc2Nvbm5lY3QoKS4gKi8KCWRldl9rZnJlZV9za2Ioc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJpYXBfZGF0YV9pbmRpY2F0aW9uIChoYW5kbGUsIHNrYikKICoKICogICAgUmVjZWl2ZXMgZGF0YSBmcm9tIGNvbm5lY3Rpb24gaWRlbnRpZmllZCBieSBoYW5kbGUgZnJvbSBJckxNUAogKgogKi8Kc3RhdGljIGludCBpcmlhcF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQp7CglzdHJ1Y3QgaXJpYXBfY2IgKnNlbGY7CglfX3U4ICAqZnJhbWU7CglfX3U4ICBvcGNvZGU7CgoJSVJEQV9ERUJVRygzLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIDA7KTsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgZ290byBvdXQ7KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgZ290byBvdXQ7KTsKCglmcmFtZSA9IHNrYi0+ZGF0YTsKCglpZiAoc2VsZi0+bW9kZSA9PSBJQVNfU0VSVkVSKSB7CgkJLyogQ2FsbCBzZXJ2ZXIgKi8KCQlJUkRBX0RFQlVHKDQsICIlcygpLCBDYWxsaW5nIHNlcnZlciFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJaXJpYXBfZG9fcl9jb25uZWN0X2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBza2IpOwoJCWdvdG8gb3V0OwoJfQoJb3Bjb2RlID0gZnJhbWVbMF07CglpZiAofm9wY29kZSAmIElBUF9MU1QpIHsKCQlJUkRBX1dBUk5JTkcoIiVzOiwgSXJJQVMgbXVsdGlmcmFtZSBjb21tYW5kcyBvciAiCgkJCSAgICAgInJlc3VsdHMgaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlnb3RvIG91dDsKCX0KCgkvKiBDaGVjayBmb3IgYWNrIGZyYW1lcyBzaW5jZSB0aGV5IGRvbid0IGNvbnRhaW4gYW55IGRhdGEgKi8KCWlmIChvcGNvZGUgJiBJQVBfQUNLKSB7CgkJSVJEQV9ERUJVRygwLCAiJXMoKSBHb3QgYWNrIGZyYW1lIVxuIiwgX19GVU5DVElPTl9fKTsKCQlnb3RvIG91dDsKCX0KCglvcGNvZGUgJj0gfklBUF9MU1Q7IC8qIE1hc2sgYXdheSBMU1QgYml0ICovCgoJc3dpdGNoIChvcGNvZGUpIHsKCWNhc2UgR0VUX0lORk9fQkFTRToKCQlJUkRBX0RFQlVHKDAsICJJckxNUCBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIVxuIik7CgkJYnJlYWs7CgljYXNlIEdFVF9WQUxVRV9CWV9DTEFTUzoKCQlpcmlhcF9kb19jYWxsX2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBOVUxMKTsKCgkJc3dpdGNoIChmcmFtZVsxXSkgewoJCWNhc2UgSUFTX1NVQ0NFU1M6CgkJCWlyaWFwX2dldHZhbHVlYnljbGFzc19jb25maXJtKHNlbGYsIHNrYik7CgkJCWJyZWFrOwoJCWNhc2UgSUFTX0NMQVNTX1VOS05PV046CgkJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vIHN1Y2ggY2xhc3MhXG4iLCBfX0ZVTkNUSU9OX18pOwoJCQkvKiBGaW5pc2hlZCwgY2xvc2UgY29ubmVjdGlvbiEgKi8KCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOwoKCQkJLyoKCQkJICogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIKCQkJICogbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KCQkJICovCgkJCWlmIChzZWxmLT5jb25maXJtKQoJCQkJc2VsZi0+Y29uZmlybShJQVNfQ0xBU1NfVU5LTk9XTiwgMCwgTlVMTCwKCQkJCQkgICAgICBzZWxmLT5wcml2KTsKCQkJYnJlYWs7CgkJY2FzZSBJQVNfQVRUUklCX1VOS05PV046CgkJCUlSREFfREVCVUcoMSwgIiVzKCksIE5vIHN1Y2ggYXR0cmlidXRlIVxuIiwgX19GVU5DVElPTl9fKTsKCQkJLyogRmluaXNoZWQsIGNsb3NlIGNvbm5lY3Rpb24hICovCgkJCWlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmKTsKCgkJCS8qCgkJCSAqIFdhcm5pbmcsIHRoZSBjbGllbnQgbWlnaHQgY2xvc2UgdXMsIHNvIHJlbWVtYmVyCgkJCSAqIG5vIHRvIHVzZSBzZWxmIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCgkJCSAqLwoJCQlpZiAoc2VsZi0+Y29uZmlybSkKCQkJCXNlbGYtPmNvbmZpcm0oSUFTX0FUVFJJQl9VTktOT1dOLCAwLCBOVUxMLAoJCQkJCSAgICAgIHNlbGYtPnByaXYpOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMCwgIiVzKCksIFVua25vd24gb3AtY29kZTogJTAyeFxuIiwgX19GVU5DVElPTl9fLAoJCQkgICBvcGNvZGUpOwoJCWJyZWFrOwoJfQoKb3V0OgoJLyogQ2xlYW51cCAtIHN1Yi1jYWxscyB3aWxsIGhhdmUgZG9uZSBza2JfZ2V0KCkgYXMgbmVlZGVkLiAqLwoJZGV2X2tmcmVlX3NrYihza2IpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlyaWFwX2NhbGxfaW5kaWNhdGlvbiAoc2VsZiwgc2tiKQogKgogKiAgICBSZWNlaXZlZCBjYWxsIHRvIHNlcnZlciBmcm9tIHBlZXIgTE0tSUFTCiAqCiAqLwp2b2lkIGlyaWFwX2NhbGxfaW5kaWNhdGlvbihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCV9fdTggKmZwOwoJX191OCBvcGNvZGU7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKCglmcCA9IHNrYi0+ZGF0YTsKCglvcGNvZGUgPSBmcFswXTsKCWlmICh+b3Bjb2RlICYgMHg4MCkgewoJCUlSREFfV0FSTklORygiJXM6IElySUFTIG11bHRpZnJhbWUgY29tbWFuZHMgb3IgcmVzdWx0cyIKCQkJICAgICAiaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuOwoJfQoJb3Bjb2RlICY9IDB4N2Y7IC8qIE1hc2sgYXdheSBMU1QgYml0ICovCgoJc3dpdGNoIChvcGNvZGUpIHsKCWNhc2UgR0VUX0lORk9fQkFTRToKCQlJUkRBX1dBUk5JTkcoIiVzOiBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCgkJCSAgICAgX19GVU5DVElPTl9fKTsKCQlicmVhazsKCWNhc2UgR0VUX1ZBTFVFX0JZX0NMQVNTOgoJCWlyaWFwX2dldHZhbHVlYnljbGFzc19pbmRpY2F0aW9uKHNlbGYsIHNrYik7CgkJYnJlYWs7Cgl9CgkvKiBza2Igd2lsbCBiZSBjbGVhbmVkIHVwIGluIGlyaWFwX2RhdGFfaW5kaWNhdGlvbiAqLwp9CgovKgogKiBGdW5jdGlvbiBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkIChkYXRhKQogKgogKiAgICBRdWVyeSBoYXMgdGFrZW4gdG9vIGxvbmcgdGltZSwgc28gYWJvcnQKICoKICovCnN0YXRpYyB2b2lkIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSkKewoJc3RydWN0IGlyaWFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBkYXRhOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOwoKCS8qIGlyaWFwX2Nsb3NlKHNlbGYpOyAqLwp9CgojaWZkZWYgQ09ORklHX1BST0NfRlMKCnN0YXRpYyBjb25zdCBjaGFyICppYXNfdmFsdWVfdHlwZXNbXSA9IHsKCSJJQVNfTUlTU0lORyIsCgkiSUFTX0lOVEVHRVIiLAoJIklBU19PQ1RfU0VRIiwKCSJJQVNfU1RSSU5HIgp9OwoKc3RhdGljIGlubGluZSBzdHJ1Y3QgaWFzX29iamVjdCAqaXJpYXNfc2VxX2lkeChsb2ZmX3QgcG9zKSAKewoJc3RydWN0IGlhc19vYmplY3QgKm9iajsKCglmb3IgKG9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBoYXNoYmluX2dldF9maXJzdChpcmlhc19vYmplY3RzKTsKCSAgICAgb2JqOyBvYmogPSAoc3RydWN0IGlhc19vYmplY3QgKikgaGFzaGJpbl9nZXRfbmV4dChpcmlhc19vYmplY3RzKSkgewoJCWlmIChwb3MtLSA9PSAwKQoJCQlicmVhazsKCX0KCQkKCXJldHVybiBvYmo7Cn0KCnN0YXRpYyB2b2lkICppcmlhc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQp7CglzcGluX2xvY2tfaXJxKCZpcmlhc19vYmplY3RzLT5oYl9zcGlubG9jayk7CgoJcmV0dXJuICpwb3MgPyBpcmlhc19zZXFfaWR4KCpwb3MgLSAxKSA6IFNFUV9TVEFSVF9UT0tFTjsKfQoKc3RhdGljIHZvaWQgKmlyaWFzX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKewoJKysqcG9zOwoKCXJldHVybiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIAoJCT8gKHZvaWQgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJpYXNfb2JqZWN0cykKCQk6ICh2b2lkICopIGhhc2hiaW5fZ2V0X25leHQoaXJpYXNfb2JqZWN0cyk7Cn0KCnN0YXRpYyB2b2lkIGlyaWFzX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglzcGluX3VubG9ja19pcnEoJmlyaWFzX29iamVjdHMtPmhiX3NwaW5sb2NrKTsKfQoKc3RhdGljIGludCBpcmlhc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKewoJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQoJCXNlcV9wdXRzKHNlcSwgIkxNLUlBUyBPYmplY3RzOlxuIik7CgllbHNlIHsKCQlzdHJ1Y3QgaWFzX29iamVjdCAqb2JqID0gdjsKCQlzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOwoKCQlJUkRBX0FTU0VSVChvYmotPm1hZ2ljID09IElBU19PQkpFQ1RfTUFHSUMsIHJldHVybiAtRUlOVkFMOyk7CgoJCXNlcV9wcmludGYoc2VxLCAibmFtZTogJXMsIGlkPSVkXG4iLAoJCQkgICBvYmotPm5hbWUsIG9iai0+aWQpOwoKCQkvKiBDYXJlZnVsIGZvciBwcmlvcml0eSBpbnZlcnNpb25zIGhlcmUgIQoJCSAqIEFsbCBvdGhlciB1c2VzIG9mIGF0dHJpYiBzcGlubG9jayBhcmUgaW5kZXBlbmRlbnQgb2YKCQkgKiB0aGUgb2JqZWN0IHNwaW5sb2NrLCBzbyB3ZSBhcmUgc2FmZS4gSmVhbiBJSSAqLwoJCXNwaW5fbG9jaygmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jayk7CgoJCS8qIExpc3QgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgb2JqZWN0ICovCgkJZm9yIChhdHRyaWIgPSAoc3RydWN0IGlhc19hdHRyaWIgKikgaGFzaGJpbl9nZXRfZmlyc3Qob2JqLT5hdHRyaWJzKTsKCQkgICAgIGF0dHJpYiAhPSBOVUxMOwoJCSAgICAgYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X25leHQob2JqLT5hdHRyaWJzKSkgewoJCSAgICAgCgkJCUlSREFfQVNTRVJUKGF0dHJpYi0+bWFnaWMgPT0gSUFTX0FUVFJJQl9NQUdJQywKCQkJCSAgICBnb3RvIG91dGxvb3A7ICk7CgoJCQlzZXFfcHJpbnRmKHNlcSwgIiAtIEF0dHJpYnV0ZSBuYW1lOiBcIiVzXCIsICIsCgkJCQkgICBhdHRyaWItPm5hbWUpOwoJCQlzZXFfcHJpbnRmKHNlcSwgInZhbHVlWyVzXTogIiwKCQkJCSAgIGlhc192YWx1ZV90eXBlc1thdHRyaWItPnZhbHVlLT50eXBlXSk7CgoJCQlzd2l0Y2ggKGF0dHJpYi0+dmFsdWUtPnR5cGUpIHsKCQkJY2FzZSBJQVNfSU5URUdFUjoKCQkJCXNlcV9wcmludGYoc2VxLCAiJWRcbiIsCgkJCQkJICAgYXR0cmliLT52YWx1ZS0+dC5pbnRlZ2VyKTsKCQkJCWJyZWFrOwoJCQljYXNlIElBU19TVFJJTkc6CgkJCQlzZXFfcHJpbnRmKHNlcSwgIlwiJXNcIlxuIiwKCQkJCQkgICBhdHRyaWItPnZhbHVlLT50LnN0cmluZyk7CgkJCQlicmVhazsKCQkJY2FzZSBJQVNfT0NUX1NFUToKCQkJCXNlcV9wcmludGYoc2VxLCAib2N0ZXQgc2VxdWVuY2UgKCVkIGJ5dGVzKVxuIiwgCgkJCQkJICAgYXR0cmliLT52YWx1ZS0+bGVuKTsKCQkJCWJyZWFrOwoJCQljYXNlIElBU19NSVNTSU5HOgoJCQkJc2VxX3B1dHMoc2VxLCAibWlzc2luZ1xuIik7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXNlcV9wcmludGYoc2VxLCAidHlwZSAlZD9cbiIsIAoJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPnR5cGUpOwoJCQl9CgkJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CgoJCX0KCUlSREFfQVNTRVJUX0xBQkVMKG91dGxvb3A6KQoJCXNwaW5fdW5sb2NrKCZvYmotPmF0dHJpYnMtPmhiX3NwaW5sb2NrKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcmlhc19zZXFfb3BzID0gewoJLnN0YXJ0ICA9IGlyaWFzX3NlcV9zdGFydCwKCS5uZXh0ICAgPSBpcmlhc19zZXFfbmV4dCwKCS5zdG9wICAgPSBpcmlhc19zZXFfc3RvcCwKCS5zaG93ICAgPSBpcmlhc19zZXFfc2hvdywKfTsKCnN0YXRpYyBpbnQgaXJpYXNfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCUlSREFfQVNTRVJUKCBpcmlhc19vYmplY3RzICE9IE5VTEwsIHJldHVybiAtRUlOVkFMOyk7CgoJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpcmlhc19zZXFfb3BzKTsKfQoKc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmlhc19zZXFfZm9wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5vcGVuICAgICAgICAgICA9IGlyaWFzX3NlcV9vcGVuLAoJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCgkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCgkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAp9OwoKI2VuZGlmIC8qIFBST0NfRlMgKi8K