LyoKICogICRJZDogbmZzcm9vdC5jLHYgMS40NSAxOTk4LzAzLzA3IDEwOjQ0OjQ2IG1qIEV4cCAkCiAqCiAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgIEdlcm8gS3VobG1hbm4gPGdlcm9AZ2ttaW5peC5oYW4uZGU+CiAqCiAqICBBbGxvdyBhbiBORlMgZmlsZXN5c3RlbSB0byBiZSBtb3VudGVkIGFzIHJvb3QuIFRoZSB3YXkgdGhpcyB3b3JrcyBpczoKICogICAgICgxKSBVc2UgdGhlIElQIGF1dG9jb25maWcgbWVjaGFuaXNtIHRvIHNldCBsb2NhbCBJUCBhZGRyZXNzZXMgYW5kIHJvdXRlcy4KICogICAgICgyKSBIYW5kbGUgUlBDIG5lZ290aWF0aW9uIHdpdGggdGhlIHN5c3RlbSB3aGljaCByZXBsaWVkIHRvIFJBUlAgb3IKICogICAgICAgICB3YXMgcmVwb3J0ZWQgYXMgYSBib290IHNlcnZlciBieSBCT09UUCBvciBtYW51YWxseS4KICogICAgICgzKSBUaGUgYWN0dWFsIG1vdW50aW5nIGlzIGRvbmUgbGF0ZXIsIHdoZW4gaW5pdCgpIGlzIHJ1bm5pbmcuCiAqCiAqCiAqCUNoYW5nZXM6CiAqCiAqCUFsYW4gQ294CToJUmVtb3ZlZCBnZXRfYWRkcmVzcyBuYW1lIGNsYXNoIHdpdGggRlBVLgogKglBbGFuIENveAk6CVJlZm9ybWF0dGVkIGEgYml0LgogKglHZXJvIEt1aGxtYW5uCToJQ29kZSBjbGVhbnVwCiAqCU1pY2hhZWwgUmF1c2NoICA6CUZpeGVkIHJlY29nbml0aW9uIG9mIGFuIGluY29taW5nIFJBUlAgYW5zd2VyLgogKglNYXJ0aW4gTWFyZXMJOiAoMi4wKQlBdXRvLWNvbmZpZ3VyYXRpb24gdmlhIEJPT1RQIHN1cHBvcnRlZC4KICoJTWFydGluIE1hcmVzCToJTWFudWFsIHNlbGVjdGlvbiBvZiBpbnRlcmZhY2UgJiBCT09UUC9SQVJQLgogKglNYXJ0aW4gTWFyZXMJOglVc2luZyBuZXR3b3JrIHJvdXRlcyBpbnN0ZWFkIG9mIGhvc3Qgcm91dGVzLAogKgkJCQlhbGxvd2luZyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQKICoJCQkJZm9yIG5vcm1hbCBvcGVyYXRpb24gb2YgdGhlIGhvc3QuCiAqCU1hcnRpbiBNYXJlcwk6CVJhbmRvbWl6ZWQgdGltZXIgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmCiAqCQkJCWluc3RhbGxlZCB0byBtaW5pbWl6ZSBuZXR3b3JrIGNvbmdlc3Rpb24uCiAqCU1hcnRpbiBNYXJlcwk6CUNvZGUgY2xlYW51cC4KICoJTWFydGluIE1hcmVzCTogKDIuMSkJQk9PVFAgYW5kIFJBUlAgbWFkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCiAqCU1hcnRpbiBNYXJlcwk6CVNlcnZlciBob3N0bmFtZSBnZW5lcmF0aW9uIGZpeGVkLgogKglHZXJkIEtub3JyCToJRml4ZWQgd2lyZWQgaW5vZGUgaGFuZGxpbmcKICoJTWFydGluIE1hcmVzCTogKDIuMikJIjAuMC4wLjAiIGFkZHJlc3NlcyBmcm9tIGNvbW1hbmQgbGluZSBpZ25vcmVkLgogKglNYXJ0aW4gTWFyZXMJOglSQVJQIHJlcGxpZXMgbm90IHRlc3RlZCBmb3Igc2VydmVyIGFkZHJlc3MuCiAqCUdlcm8gS3VobG1hbm4JOiAoMi4zKSBTb21lIGJ1ZyBmaXhlcyBhbmQgY29kZSBjbGVhbnVwIGFnYWluIChwbGVhc2UKICoJCQkJc2VuZCBtZSB5b3VyIG5ldyBwYXRjaGVzIF9iZWZvcmVfIGJvdGhlcmluZwogKgkJCQlMaW51cyBzbyB0aGF0IEkgZG9uJyBhbHdheXMgaGF2ZSB0byBjbGVhbnVwCiAqCQkJCV9hZnRlcndhcmRzXyAtIHRoYW5rcykKICoJR2VybyBLdWhsbWFubgk6CUxhc3QgY2hhbmdlcyBvZiBNYXJ0aW4gTWFyZXMgdW5kb25lLgogKglHZXJvIEt1aGxtYW5uCTogCVJBUlAgcmVwbGllcyBhcmUgdGVzdGVkIGZvciBzcGVjaWZpZWQgc2VydmVyCiAqCQkJCWFnYWluLiBIb3dldmVyLCBpdCdzIG5vdyBwb3NzaWJsZSB0byBoYXZlCiAqCQkJCWRpZmZlcmVudCBSQVJQIGFuZCBORlMgc2VydmVycy4KICoJR2VybyBLdWhsbWFubgk6CSIwLjAuMC4wIiBhZGRyZXNzZXMgZnJvbSBjb21tYW5kIGxpbmUgYXJlCiAqCQkJCW5vdyBtYXBwZWQgdG8gSU5BRERSX05PTkUuCiAqCUdlcm8gS3VobG1hbm4JOglGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgQk9PVFAgcGF0aCBuYW1lCiAqCQkJCWZyb20gYmVpbmcgdXNlZCAodGhhbmtzIHRvIExlbyBTcGlla21hbikKICoJQW5keSBXYWxrZXIJOglBbGxvdyB0byBzcGVjaWZ5IHRoZSBORlMgc2VydmVyIGluIG5mc19yb290CiAqCQkJCXdpdGhvdXQgZ2l2aW5nIGEgcGF0aCBuYW1lCiAqCVN3ZW4gVGj8bW1sZXIJOglBbGxvdyB0byBzcGVjaWZ5IHRoZSBORlMgb3B0aW9ucyBpbiBuZnNfcm9vdAogKgkJCQl3aXRob3V0IGdpdmluZyBhIHBhdGggbmFtZS4gRml4IEJPT1RQIHJlcXVlc3QKICoJCQkJZm9yIGRvbWFpbm5hbWUgKGRvbWFpbm5hbWUgaXMgTklTIGRvbWFpbiwgbm90CiAqCQkJCUROUyBkb21haW4hKS4gU2tpcCBkdW1teSBkZXZpY2VzIGZvciBCT09UUC4KICoJSmFjZWsgWmFwYWxhCToJRml4ZWQgYSBidWcgd2hpY2ggcHJldmVudGVkIHNlcnZlci1pcCBhZGRyZXNzCiAqCQkJCWZyb20gbmZzcm9vdCBwYXJhbWV0ZXIgZnJvbSBiZWluZyB1c2VkLgogKglPbGFmIEtpcmNoCToJQWRhcHRlZCB0byBuZXcgTkZTIGNvZGUuCiAqCUpha3ViIEplbGluZWsJOglGcmVlIHVzZWQgY29kZSBzZWdtZW50LgogKglNYXJrbyBLb2h0YWxhCToJRml4ZWQgc29tZSBidWdzLgogKglNYXJ0aW4gTWFyZXMJOglEZWJ1ZyBtZXNzYWdlIGNsZWFudXAKICoJTWFydGluIE1hcmVzCToJQ2hhbmdlZCB0byB1c2UgdGhlIG5ldyBnZW5lcmljIElQIGxheWVyIGF1dG9jb25maWcKICoJCQkJY29kZS4gQk9PVFAgYW5kIFJBUlAgbW92ZWQgdGhlcmUuCiAqCU1hcnRpbiBNYXJlcwk6CURlZmF1bHQgcGF0aCBub3cgY29udGFpbnMgaG9zdCBuYW1lIGluc3RlYWQgb2YKICoJCQkJaG9zdCBJUCBhZGRyZXNzIChidXQgaG9zdCBuYW1lIGRlZmF1bHRzIHRvIElQCiAqCQkJCWFkZHJlc3MgYW55d2F5KS4KICoJTWFydGluIE1hcmVzCToJVXNlIHJvb3Rfc2VydmVyX2FkZHIgYXBwcm9wcmlhdGVseSBkdXJpbmcgc2V0dXAuCiAqCU1hcnRpbiBNYXJlcwk6CVJld3JvdGUgcGFyYW1ldGVyIHBhcnNpbmcsIG5vdyBob3BlZnVsbHkgZ2l2aW5nCiAqCQkJCWNvcnJlY3Qgb3ZlcnJpZGluZy4KICoJVHJvbmQgTXlrbGVidXN0IDoJQWRkIGluIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIE5GU3YzIGFuZCBUQ1AuCiAqCQkJCUZpeCBidWcgaW4gcm9vdF9uZnNfYWRkcigpLiBuZnNfZGF0YS5uYW1sZW4KICoJCQkJaXMgTk9UIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBob3N0bmFtZS4KICoJSHVhIFFpbgkJOglTdXBwb3J0IGZvciBtb3VudGluZyByb290IGZpbGUgc3lzdGVtIHZpYQogKgkJCQlORlMgb3ZlciBUQ1AuCiAqCUZhYmlhbiBGcmVkZXJpY2s6CU9wdGlvbiBwYXJzZXIgcmVidWlsdCAodXNpbmcgcGFyc2VyIGxpYikKKi8KCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgojaW5jbHVkZSA8bGludXgvbmZzLmg+CiNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgojaW5jbHVkZSA8bGludXgvaW4uaD4KI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgojaW5jbHVkZSA8bmV0L2lwY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KCi8qIERlZmluZSB0aGlzIHRvIGFsbG93IGRlYnVnZ2luZyBvdXRwdXQgKi8KI3VuZGVmIE5GU1JPT1RfREVCVUcKI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgTkZTREJHX1JPT1QKCi8qIERlZmF1bHQgcGF0aCB3ZSB0cnkgdG8gbW91bnQuICIlcyIgZ2V0cyByZXBsYWNlZCBieSBvdXIgSVAgYWRkcmVzcyAqLwojZGVmaW5lIE5GU19ST09UCQkiL3RmdHBib290LyVzIgoKLyogUGFyYW1ldGVycyBwYXNzZWQgZnJvbSB0aGUga2VybmVsIGNvbW1hbmQgbGluZSAqLwpzdGF0aWMgY2hhciBuZnNfcm9vdF9uYW1lWzI1Nl0gX19pbml0ZGF0YSA9ICIiOwoKLyogQWRkcmVzcyBvZiBORlMgc2VydmVyICovCnN0YXRpYyBfX3UzMiBzZXJ2YWRkciBfX2luaXRkYXRhID0gMDsKCi8qIE5hbWUgb2YgZGlyZWN0b3J5IHRvIG1vdW50ICovCnN0YXRpYyBjaGFyIG5mc19wYXRoW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhID0geyAwLCB9OwoKLyogTkZTLXJlbGF0ZWQgZGF0YSAqLwpzdGF0aWMgc3RydWN0IG5mc19tb3VudF9kYXRhIG5mc19kYXRhIF9faW5pdGRhdGEgPSB7IDAsIH07LyogTkZTIG1vdW50IGluZm8gKi8Kc3RhdGljIGludCBuZnNfcG9ydCBfX2luaXRkYXRhID0gMDsJCS8qIFBvcnQgdG8gY29ubmVjdCB0byBmb3IgTkZTICovCnN0YXRpYyBpbnQgbW91bnRfcG9ydCBfX2luaXRkYXRhID0gMDsJCS8qIE1vdW50IGRhZW1vbiBwb3J0IG51bWJlciAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgkJCSAgICAgUGFyc2luZyBvZiBvcHRpb25zCgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKZW51bSB7CgkvKiBPcHRpb25zIHRoYXQgdGFrZSBpbnRlZ2VyIGFyZ3VtZW50cyAqLwoJT3B0X3BvcnQsIE9wdF9yc2l6ZSwgT3B0X3dzaXplLCBPcHRfdGltZW8sIE9wdF9yZXRyYW5zLCBPcHRfYWNyZWdtaW4sCglPcHRfYWNyZWdtYXgsIE9wdF9hY2Rpcm1pbiwgT3B0X2FjZGlybWF4LAoJLyogT3B0aW9ucyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzICovCglPcHRfc29mdCwgT3B0X2hhcmQsIE9wdF9pbnRyLAoJT3B0X25vaW50ciwgT3B0X3Bvc2l4LCBPcHRfbm9wb3NpeCwgT3B0X2N0bywgT3B0X25vY3RvLCBPcHRfYWMsIAoJT3B0X25vYWMsIE9wdF9sb2NrLCBPcHRfbm9sb2NrLCBPcHRfdjIsIE9wdF92MywgT3B0X3VkcCwgT3B0X3RjcCwKCU9wdF9hY2wsIE9wdF9ub2FjbCwKCS8qIEVycm9yIHRva2VuICovCglPcHRfZXJyCn07CgpzdGF0aWMgbWF0Y2hfdGFibGVfdCBfX2luaXRkYXRhIHRva2VucyA9IHsKCXtPcHRfcG9ydCwgInBvcnQ9JXUifSwKCXtPcHRfcnNpemUsICJyc2l6ZT0ldSJ9LAoJe09wdF93c2l6ZSwgIndzaXplPSV1In0sCgl7T3B0X3RpbWVvLCAidGltZW89JXUifSwKCXtPcHRfcmV0cmFucywgInJldHJhbnM9JXUifSwKCXtPcHRfYWNyZWdtaW4sICJhY3JlZ21pbj0ldSJ9LAoJe09wdF9hY3JlZ21heCwgImFjcmVnbWF4PSV1In0sCgl7T3B0X2FjZGlybWluLCAiYWNkaXJtaW49JXUifSwKCXtPcHRfYWNkaXJtYXgsICJhY2Rpcm1heD0ldSJ9LAoJe09wdF9zb2Z0LCAic29mdCJ9LAoJe09wdF9oYXJkLCAiaGFyZCJ9LAoJe09wdF9pbnRyLCAiaW50ciJ9LAoJe09wdF9ub2ludHIsICJub2ludHIifSwKCXtPcHRfcG9zaXgsICJwb3NpeCJ9LAoJe09wdF9ub3Bvc2l4LCAibm9wb3NpeCJ9LAoJe09wdF9jdG8sICJjdG8ifSwKCXtPcHRfbm9jdG8sICJub2N0byJ9LAoJe09wdF9hYywgImFjIn0sCgl7T3B0X25vYWMsICJub2FjIn0sCgl7T3B0X2xvY2ssICJsb2NrIn0sCgl7T3B0X25vbG9jaywgIm5vbG9jayJ9LAoJe09wdF92MiwgIm5mc3ZlcnM9MiJ9LAoJe09wdF92MiwgInYyIn0sCgl7T3B0X3YzLCAibmZzdmVycz0zIn0sCgl7T3B0X3YzLCAidjMifSwKCXtPcHRfdWRwLCAicHJvdG89dWRwIn0sCgl7T3B0X3VkcCwgInVkcCJ9LAoJe09wdF90Y3AsICJwcm90bz10Y3AifSwKCXtPcHRfdGNwLCAidGNwIn0sCgl7T3B0X2FjbCwgImFjbCJ9LAoJe09wdF9ub2FjbCwgIm5vYWNsIn0sCgl7T3B0X2VyciwgTlVMTH0KCQp9OwoKLyoKICogIFBhcnNlIG9wdGlvbiBzdHJpbmcuCiAqLwoKc3RhdGljIGludCBfX2luaXQgcm9vdF9uZnNfcGFyc2UoY2hhciAqbmFtZSwgY2hhciAqYnVmKQp7CgoJY2hhciAqcDsKCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKCWludCBvcHRpb247CgoJaWYgKCFuYW1lKQoJCXJldHVybiAxOwoKCS8qIFNldCB0aGUgTkZTIHJlbW90ZSBwYXRoICovCglwID0gc3Ryc2VwKCZuYW1lLCAiLCIpOwoJaWYgKHBbMF0gIT0gJ1wwJyAmJiBzdHJjbXAocCwgImRlZmF1bHQiKSAhPSAwKQoJCXN0cmxjcHkoYnVmLCBwLCBORlNfTUFYUEFUSExFTik7CgoJd2hpbGUgKChwID0gc3Ryc2VwICgmbmFtZSwgIiwiKSkgIT0gTlVMTCkgewoJCWludCB0b2tlbjsgCgkJaWYgKCEqcCkKCQkJY29udGludWU7CgkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOwoKCQkvKiAldSB0b2tlbnMgb25seS4gQmV3YXJlIGlmIHlvdSBhZGQgbmV3IHRva2VucyEgKi8KCQlpZiAodG9rZW4gPCBPcHRfc29mdCAmJiBtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQoJCQlyZXR1cm4gMDsKCQlzd2l0Y2ggKHRva2VuKSB7CgkJCWNhc2UgT3B0X3BvcnQ6CgkJCQluZnNfcG9ydCA9IG9wdGlvbjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9yc2l6ZToKCQkJCW5mc19kYXRhLnJzaXplID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X3dzaXplOgoJCQkJbmZzX2RhdGEud3NpemUgPSBvcHRpb247CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfdGltZW86CgkJCQluZnNfZGF0YS50aW1lbyA9IG9wdGlvbjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9yZXRyYW5zOgoJCQkJbmZzX2RhdGEucmV0cmFucyA9IG9wdGlvbjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9hY3JlZ21pbjoKCQkJCW5mc19kYXRhLmFjcmVnbWluID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2FjcmVnbWF4OgoJCQkJbmZzX2RhdGEuYWNyZWdtYXggPSBvcHRpb247CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfYWNkaXJtaW46CgkJCQluZnNfZGF0YS5hY2Rpcm1pbiA9IG9wdGlvbjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9hY2Rpcm1heDoKCQkJCW5mc19kYXRhLmFjZGlybWF4ID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X3NvZnQ6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfU09GVDsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9oYXJkOgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9TT0ZUOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2ludHI6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfSU5UUjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9ub2ludHI6CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX0lOVFI7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfcG9zaXg6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfUE9TSVg7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfbm9wb3NpeDoKCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfUE9TSVg7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfY3RvOgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0NUTzsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9ub2N0bzoKCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9OT0NUTzsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9hYzoKCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQzsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9ub2FjOgoJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQUM7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfbG9jazoKCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9OTE07CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfbm9sb2NrOgoJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PTkxNOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X3YyOgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9WRVIzOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X3YzOgoJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1ZFUjM7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfdWRwOgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9UQ1A7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfdGNwOgoJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9hY2w6CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX05PQUNMOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X25vYWNsOgoJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQUNMOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSb290LU5GUzogdW5rbm93biAiCgkJCQkJIm9wdGlvbjogJXNcbiIsIHApOwoJCQkJcmV0dXJuIDA7CgkJfQoJfQoKCXJldHVybiAxOwp9CgovKgogKiAgUHJlcGFyZSB0aGUgTkZTIGRhdGEgc3RydWN0dXJlIGFuZCBwYXJzZSBhbGwgb3B0aW9ucy4KICovCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX25hbWUoY2hhciAqbmFtZSkKewoJc3RhdGljIGNoYXIgYnVmW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhOwoJY2hhciAqY3A7CgoJLyogU2V0IHNvbWUgZGVmYXVsdCB2YWx1ZXMgKi8KCW1lbXNldCgmbmZzX2RhdGEsIDAsIHNpemVvZihuZnNfZGF0YSkpOwoJbmZzX3BvcnQgICAgICAgICAgPSAtMTsKCW5mc19kYXRhLnZlcnNpb24gID0gTkZTX01PVU5UX1ZFUlNJT047CgluZnNfZGF0YS5mbGFncyAgICA9IE5GU19NT1VOVF9OT05MTTsJLyogTm8gbG9ja2QgaW4gbmZzIHJvb3QgeWV0ICovCgluZnNfZGF0YS5yc2l6ZSAgICA9IE5GU19ERUZfRklMRV9JT19TSVpFOwoJbmZzX2RhdGEud3NpemUgICAgPSBORlNfREVGX0ZJTEVfSU9fU0laRTsKCW5mc19kYXRhLmFjcmVnbWluID0gMzsKCW5mc19kYXRhLmFjcmVnbWF4ID0gNjA7CgluZnNfZGF0YS5hY2Rpcm1pbiA9IDMwOwoJbmZzX2RhdGEuYWNkaXJtYXggPSA2MDsKCXN0cmNweShidWYsIE5GU19ST09UKTsKCgkvKiBQcm9jZXNzIG9wdGlvbnMgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciAqLwoJcm9vdF9uZnNfcGFyc2Uocm9vdF9zZXJ2ZXJfcGF0aCwgYnVmKTsKCgkvKiBPdmVycmlkZSB0aGVtIGJ5IG9wdGlvbnMgc2V0IG9uIGtlcm5lbCBjb21tYW5kLWxpbmUgKi8KCXJvb3RfbmZzX3BhcnNlKG5hbWUsIGJ1Zik7CgoJY3AgPSB1dHNuYW1lKCktPm5vZGVuYW1lOwoJaWYgKHN0cmxlbihidWYpICsgc3RybGVuKGNwKSA+IE5GU19NQVhQQVRITEVOKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogUGF0aG5hbWUgZm9yIHJlbW90ZSBkaXJlY3RvcnkgdG9vIGxvbmcuXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CglzcHJpbnRmKG5mc19wYXRoLCBidWYsIGNwKTsKCglyZXR1cm4gMTsKfQoKCi8qCiAqICBHZXQgTkZTIHNlcnZlciBhZGRyZXNzLgogKi8Kc3RhdGljIGludCBfX2luaXQgcm9vdF9uZnNfYWRkcih2b2lkKQp7CglpZiAoKHNlcnZhZGRyID0gcm9vdF9zZXJ2ZXJfYWRkcikgPT0gSU5BRERSX05PTkUpIHsKCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBObyBORlMgc2VydmVyIGF2YWlsYWJsZSwgZ2l2aW5nIHVwLlxuIik7CgkJcmV0dXJuIC0xOwoJfQoKCXNucHJpbnRmKG5mc19kYXRhLmhvc3RuYW1lLCBzaXplb2YobmZzX2RhdGEuaG9zdG5hbWUpLAoJCSAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKHNlcnZhZGRyKSk7CglyZXR1cm4gMDsKfQoKLyoKICogIFRlbGwgdGhlIHVzZXIgd2hhdCdzIGdvaW5nIG9uLgogKi8KI2lmZGVmIE5GU1JPT1RfREVCVUcKc3RhdGljIHZvaWQgX19pbml0IHJvb3RfbmZzX3ByaW50KHZvaWQpCnsKCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6IE1vdW50aW5nICVzIG9uIHNlcnZlciAlcyBhcyByb290XG4iLAoJCW5mc19wYXRoLCBuZnNfZGF0YS5ob3N0bmFtZSk7CglwcmludGsoS0VSTl9OT1RJQ0UgIlJvb3QtTkZTOiAgICAgcnNpemUgPSAlZCwgd3NpemUgPSAlZCwgdGltZW8gPSAlZCwgcmV0cmFucyA9ICVkXG4iLAoJCW5mc19kYXRhLnJzaXplLCBuZnNfZGF0YS53c2l6ZSwgbmZzX2RhdGEudGltZW8sIG5mc19kYXRhLnJldHJhbnMpOwoJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIGFjcmVnIChtaW4sbWF4KSA9ICglZCwlZCksIGFjZGlyIChtaW4sbWF4KSA9ICglZCwlZClcbiIsCgkJbmZzX2RhdGEuYWNyZWdtaW4sIG5mc19kYXRhLmFjcmVnbWF4LAoJCW5mc19kYXRhLmFjZGlybWluLCBuZnNfZGF0YS5hY2Rpcm1heCk7CglwcmludGsoS0VSTl9OT1RJQ0UgIlJvb3QtTkZTOiAgICAgbmZzZCBwb3J0ID0gJWQsIG1vdW50ZCBwb3J0ID0gJWQsIGZsYWdzID0gJTA4eFxuIiwKCQluZnNfcG9ydCwgbW91bnRfcG9ydCwgbmZzX2RhdGEuZmxhZ3MpOwp9CiNlbmRpZgoKCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2luaXQodm9pZCkKewojaWZkZWYgTkZTUk9PVF9ERUJVRwoJbmZzX2RlYnVnIHw9IE5GU0RCR19ST09UOwojZW5kaWYKCgkvKgoJICogRGVjb2RlIHRoZSByb290IGRpcmVjdG9yeSBwYXRoIG5hbWUgYW5kIE5GUyBvcHRpb25zIGZyb20KCSAqIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBUaGlzIGhhcyB0byBnbyBoZXJlIGluIG9yZGVyIHRvCgkgKiBiZSBhYmxlIHRvIHVzZSB0aGUgY2xpZW50IElQIGFkZHJlc3MgZm9yIHRoZSByZW1vdGUgcm9vdAoJICogZGlyZWN0b3J5IChuZWNlc3NhcnkgZm9yIHB1cmUgUkFSUCBib290aW5nKS4KCSAqLwoJaWYgKHJvb3RfbmZzX25hbWUobmZzX3Jvb3RfbmFtZSkgPCAwIHx8CgkgICAgcm9vdF9uZnNfYWRkcigpIDwgMCkKCQlyZXR1cm4gLTE7CgojaWZkZWYgTkZTUk9PVF9ERUJVRwoJcm9vdF9uZnNfcHJpbnQoKTsKI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCgovKgogKiAgUGFyc2UgTkZTIHNlcnZlciBhbmQgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHBhc3NlZCBvbiB0aGUga2VybmVsCiAqICBjb21tYW5kIGxpbmUuCiAqLwpzdGF0aWMgaW50IF9faW5pdCBuZnNfcm9vdF9zZXR1cChjaGFyICpsaW5lKQp7CglST09UX0RFViA9IFJvb3RfTkZTOwoJaWYgKGxpbmVbMF0gPT0gJy8nIHx8IGxpbmVbMF0gPT0gJywnIHx8IChsaW5lWzBdID49ICcwJyAmJiBsaW5lWzBdIDw9ICc5JykpIHsKCQlzdHJsY3B5KG5mc19yb290X25hbWUsIGxpbmUsIHNpemVvZihuZnNfcm9vdF9uYW1lKSk7Cgl9IGVsc2UgewoJCWludCBuID0gc3RybGVuKGxpbmUpICsgc2l6ZW9mKE5GU19ST09UKSAtIDE7CgkJaWYgKG4gPj0gc2l6ZW9mKG5mc19yb290X25hbWUpKQoJCQlsaW5lW3NpemVvZihuZnNfcm9vdF9uYW1lKSAtIHNpemVvZihORlNfUk9PVCkgLSAyXSA9ICdcMCc7CgkJc3ByaW50ZihuZnNfcm9vdF9uYW1lLCBORlNfUk9PVCwgbGluZSk7Cgl9Cglyb290X3NlcnZlcl9hZGRyID0gcm9vdF9uZnNfcGFyc2VfYWRkcihuZnNfcm9vdF9uYW1lKTsKCXJldHVybiAxOwp9CgpfX3NldHVwKCJuZnNyb290PSIsIG5mc19yb290X3NldHVwKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgkgICAgICAgUm91dGluZXMgdG8gYWN0dWFsbHkgbW91bnQgdGhlIHJvb3QgZGlyZWN0b3J5CgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogIENvbnN0cnVjdCBzb2NrYWRkcl9pbiBmcm9tIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyLgogKi8Kc3RhdGljIGlubGluZSB2b2lkCnNldF9zb2NrYWRkcihzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwgX191MzIgYWRkciwgX191MTYgcG9ydCkKewoJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKCXNpbi0+c2luX2FkZHIuc19hZGRyID0gYWRkcjsKCXNpbi0+c2luX3BvcnQgPSBwb3J0Owp9CgovKgogKiAgUXVlcnkgc2VydmVyIHBvcnRtYXBwZXIgZm9yIHRoZSBwb3J0IG9mIGEgZGFlbW9uIHByb2dyYW0uCiAqLwpzdGF0aWMgaW50IF9faW5pdCByb290X25mc19nZXRwb3J0KGludCBwcm9ncmFtLCBpbnQgdmVyc2lvbiwgaW50IHByb3RvKQp7CglzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwoKCXByaW50ayhLRVJOX05PVElDRSAiTG9va2luZyB1cCBwb3J0IG9mIFJQQyAlZC8lZCBvbiAldS4ldS4ldS4ldVxuIiwKCQlwcm9ncmFtLCB2ZXJzaW9uLCBOSVBRVUFEKHNlcnZhZGRyKSk7CglzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIDApOwoJcmV0dXJuIHJwY19nZXRwb3J0X2V4dGVybmFsKCZzaW4sIHByb2dyYW0sIHZlcnNpb24sIHByb3RvKTsKfQoKCi8qCiAqICBVc2UgcG9ydG1hcHBlciB0byBmaW5kIG1vdW50ZCBhbmQgbmZzZCBwb3J0IG51bWJlcnMgaWYgbm90IG92ZXJyaWRlbgogKiAgYnkgdGhlIHVzZXIuIFVzZSBkZWZhdWx0cyBpZiBwb3J0bWFwcGVyIGlzIG5vdCBhdmFpbGFibGUuCiAqICBYWFg6IElzIHRoZXJlIGFueSBuZnMgc2VydmVyIHdpdGggbm8gcG9ydG1hcHBlcj8KICovCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX3BvcnRzKHZvaWQpCnsKCWludCBwb3J0OwoJaW50IG5mc2RfdmVyLCBtb3VudGRfdmVyOwoJaW50IG5mc2RfcG9ydCwgbW91bnRkX3BvcnQ7CglpbnQgcHJvdG87CgoJaWYgKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKCQluZnNkX3ZlciA9IE5GUzNfVkVSU0lPTjsKCQltb3VudGRfdmVyID0gTkZTX01OVDNfVkVSU0lPTjsKCQluZnNkX3BvcnQgPSBORlNfUE9SVDsKCQltb3VudGRfcG9ydCA9IE5GU19NTlRfUE9SVDsKCX0gZWxzZSB7CgkJbmZzZF92ZXIgPSBORlMyX1ZFUlNJT047CgkJbW91bnRkX3ZlciA9IE5GU19NTlRfVkVSU0lPTjsKCQluZnNkX3BvcnQgPSBORlNfUE9SVDsKCQltb3VudGRfcG9ydCA9IE5GU19NTlRfUE9SVDsKCX0KCglwcm90byA9IChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9UQ1ApID8gSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUDsKCglpZiAobmZzX3BvcnQgPCAwKSB7CgkJaWYgKChwb3J0ID0gcm9vdF9uZnNfZ2V0cG9ydChORlNfUFJPR1JBTSwgbmZzZF92ZXIsIHByb3RvKSkgPCAwKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IFVuYWJsZSB0byBnZXQgbmZzZCBwb3J0ICIKCQkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKCQkJcG9ydCA9IG5mc2RfcG9ydDsKCQl9CgkJbmZzX3BvcnQgPSBwb3J0OwoJCWRwcmludGsoIlJvb3QtTkZTOiBQb3J0bWFwcGVyIG9uIHNlcnZlciByZXR1cm5lZCAlZCAiCgkJCSJhcyBuZnNkIHBvcnRcbiIsIHBvcnQpOwoJfQoJbmZzX3BvcnQgPSBodG9ucyhuZnNfcG9ydCk7CgoJaWYgKChwb3J0ID0gcm9vdF9uZnNfZ2V0cG9ydChORlNfTU5UX1BST0dSQU0sIG1vdW50ZF92ZXIsIHByb3RvKSkgPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogVW5hYmxlIHRvIGdldCBtb3VudGQgcG9ydCAiCgkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKCQlwb3J0ID0gbW91bnRkX3BvcnQ7Cgl9Cgltb3VudF9wb3J0ID0gaHRvbnMocG9ydCk7CglkcHJpbnRrKCJSb290LU5GUzogbW91bnRkIHBvcnQgaXMgJWRcbiIsIHBvcnQpOwoKCXJldHVybiAwOwp9CgoKLyoKICogIEdldCBhIGZpbGUgaGFuZGxlIGZyb20gdGhlIHNlcnZlciBmb3IgdGhlIGRpcmVjdG9yeSB3aGljaCBpcyB0byBiZQogKiAgbW91bnRlZC4KICovCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2dldF9oYW5kbGUodm9pZCkKewoJc3RydWN0IG5mc19maCBmaDsKCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CglpbnQgc3RhdHVzOwoJaW50IHByb3RvY29sID0gKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPwoJCQkJCUlQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CglpbnQgdmVyc2lvbiA9IChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSA/CgkJCQkJTkZTX01OVDNfVkVSU0lPTiA6IE5GU19NTlRfVkVSU0lPTjsKCglzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIG1vdW50X3BvcnQpOwoJc3RhdHVzID0gbmZzcm9vdF9tb3VudCgmc2luLCBuZnNfcGF0aCwgJmZoLCB2ZXJzaW9uLCBwcm90b2NvbCk7CglpZiAoc3RhdHVzIDwgMCkKCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBTZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgJWQgIgoJCQkJIndoaWxlIG1vdW50aW5nICVzXG4iLCBzdGF0dXMsIG5mc19wYXRoKTsKCWVsc2UgewoJCW5mc19kYXRhLnJvb3Quc2l6ZSA9IGZoLnNpemU7CgkJbWVtY3B5KG5mc19kYXRhLnJvb3QuZGF0YSwgZmguZGF0YSwgZmguc2l6ZSk7Cgl9CgoJcmV0dXJuIHN0YXR1czsKfQoKLyoKICogIEdldCB0aGUgTkZTIHBvcnQgbnVtYmVycyBhbmQgZmlsZSBoYW5kbGUsIGFuZCByZXR1cm4gdGhlIHByZXBhcmVkICdkYXRhJwogKiAgYXJndW1lbnQgZm9yIG1vdW50KCkgaWYgZXZlcnl0aGluZyB3ZW50IE9LLiBSZXR1cm4gTlVMTCBvdGhlcndpc2UuCiAqLwp2b2lkICogX19pbml0IG5mc19yb290X2RhdGEodm9pZCkKewoJaWYgKHJvb3RfbmZzX2luaXQoKSA8IDAKCSB8fCByb290X25mc19wb3J0cygpIDwgMAoJIHx8IHJvb3RfbmZzX2dldF9oYW5kbGUoKSA8IDApCgkJcmV0dXJuIE5VTEw7CglzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmbmZzX2RhdGEuYWRkciwgc2VydmFkZHIsIG5mc19wb3J0KTsKCXJldHVybiAodm9pZCopJm5mc19kYXRhOwp9Cg==