LyoKICogICRJZDogbmZzcm9vdC5jLHYgMS40NSAxOTk4LzAzLzA3IDEwOjQ0OjQ2IG1qIEV4cCAkCiAqCiAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgIEdlcm8gS3VobG1hbm4gPGdlcm9AZ2ttaW5peC5oYW4uZGU+CiAqCiAqICBBbGxvdyBhbiBORlMgZmlsZXN5c3RlbSB0byBiZSBtb3VudGVkIGFzIHJvb3QuIFRoZSB3YXkgdGhpcyB3b3JrcyBpczoKICogICAgICgxKSBVc2UgdGhlIElQIGF1dG9jb25maWcgbWVjaGFuaXNtIHRvIHNldCBsb2NhbCBJUCBhZGRyZXNzZXMgYW5kIHJvdXRlcy4KICogICAgICgyKSBIYW5kbGUgUlBDIG5lZ290aWF0aW9uIHdpdGggdGhlIHN5c3RlbSB3aGljaCByZXBsaWVkIHRvIFJBUlAgb3IKICogICAgICAgICB3YXMgcmVwb3J0ZWQgYXMgYSBib290IHNlcnZlciBieSBCT09UUCBvciBtYW51YWxseS4KICogICAgICgzKSBUaGUgYWN0dWFsIG1vdW50aW5nIGlzIGRvbmUgbGF0ZXIsIHdoZW4gaW5pdCgpIGlzIHJ1bm5pbmcuCiAqCiAqCiAqCUNoYW5nZXM6CiAqCiAqCUFsYW4gQ294CToJUmVtb3ZlZCBnZXRfYWRkcmVzcyBuYW1lIGNsYXNoIHdpdGggRlBVLgogKglBbGFuIENveAk6CVJlZm9ybWF0dGVkIGEgYml0LgogKglHZXJvIEt1aGxtYW5uCToJQ29kZSBjbGVhbnVwCiAqCU1pY2hhZWwgUmF1c2NoICA6CUZpeGVkIHJlY29nbml0aW9uIG9mIGFuIGluY29taW5nIFJBUlAgYW5zd2VyLgogKglNYXJ0aW4gTWFyZXMJOiAoMi4wKQlBdXRvLWNvbmZpZ3VyYXRpb24gdmlhIEJPT1RQIHN1cHBvcnRlZC4KICoJTWFydGluIE1hcmVzCToJTWFudWFsIHNlbGVjdGlvbiBvZiBpbnRlcmZhY2UgJiBCT09UUC9SQVJQLgogKglNYXJ0aW4gTWFyZXMJOglVc2luZyBuZXR3b3JrIHJvdXRlcyBpbnN0ZWFkIG9mIGhvc3Qgcm91dGVzLAogKgkJCQlhbGxvd2luZyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQKICoJCQkJZm9yIG5vcm1hbCBvcGVyYXRpb24gb2YgdGhlIGhvc3QuCiAqCU1hcnRpbiBNYXJlcwk6CVJhbmRvbWl6ZWQgdGltZXIgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmCiAqCQkJCWluc3RhbGxlZCB0byBtaW5pbWl6ZSBuZXR3b3JrIGNvbmdlc3Rpb24uCiAqCU1hcnRpbiBNYXJlcwk6CUNvZGUgY2xlYW51cC4KICoJTWFydGluIE1hcmVzCTogKDIuMSkJQk9PVFAgYW5kIFJBUlAgbWFkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCiAqCU1hcnRpbiBNYXJlcwk6CVNlcnZlciBob3N0bmFtZSBnZW5lcmF0aW9uIGZpeGVkLgogKglHZXJkIEtub3JyCToJRml4ZWQgd2lyZWQgaW5vZGUgaGFuZGxpbmcKICoJTWFydGluIE1hcmVzCTogKDIuMikJIjAuMC4wLjAiIGFkZHJlc3NlcyBmcm9tIGNvbW1hbmQgbGluZSBpZ25vcmVkLgogKglNYXJ0aW4gTWFyZXMJOglSQVJQIHJlcGxpZXMgbm90IHRlc3RlZCBmb3Igc2VydmVyIGFkZHJlc3MuCiAqCUdlcm8gS3VobG1hbm4JOiAoMi4zKSBTb21lIGJ1ZyBmaXhlcyBhbmQgY29kZSBjbGVhbnVwIGFnYWluIChwbGVhc2UKICoJCQkJc2VuZCBtZSB5b3VyIG5ldyBwYXRjaGVzIF9iZWZvcmVfIGJvdGhlcmluZwogKgkJCQlMaW51cyBzbyB0aGF0IEkgZG9uJyBhbHdheXMgaGF2ZSB0byBjbGVhbnVwCiAqCQkJCV9hZnRlcndhcmRzXyAtIHRoYW5rcykKICoJR2VybyBLdWhsbWFubgk6CUxhc3QgY2hhbmdlcyBvZiBNYXJ0aW4gTWFyZXMgdW5kb25lLgogKglHZXJvIEt1aGxtYW5uCTogCVJBUlAgcmVwbGllcyBhcmUgdGVzdGVkIGZvciBzcGVjaWZpZWQgc2VydmVyCiAqCQkJCWFnYWluLiBIb3dldmVyLCBpdCdzIG5vdyBwb3NzaWJsZSB0byBoYXZlCiAqCQkJCWRpZmZlcmVudCBSQVJQIGFuZCBORlMgc2VydmVycy4KICoJR2VybyBLdWhsbWFubgk6CSIwLjAuMC4wIiBhZGRyZXNzZXMgZnJvbSBjb21tYW5kIGxpbmUgYXJlCiAqCQkJCW5vdyBtYXBwZWQgdG8gSU5BRERSX05PTkUuCiAqCUdlcm8gS3VobG1hbm4JOglGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgQk9PVFAgcGF0aCBuYW1lCiAqCQkJCWZyb20gYmVpbmcgdXNlZCAodGhhbmtzIHRvIExlbyBTcGlla21hbikKICoJQW5keSBXYWxrZXIJOglBbGxvdyB0byBzcGVjaWZ5IHRoZSBORlMgc2VydmVyIGluIG5mc19yb290CiAqCQkJCXdpdGhvdXQgZ2l2aW5nIGEgcGF0aCBuYW1lCiAqCVN3ZW4gVGj8bW1sZXIJOglBbGxvdyB0byBzcGVjaWZ5IHRoZSBORlMgb3B0aW9ucyBpbiBuZnNfcm9vdAogKgkJCQl3aXRob3V0IGdpdmluZyBhIHBhdGggbmFtZS4gRml4IEJPT1RQIHJlcXVlc3QKICoJCQkJZm9yIGRvbWFpbm5hbWUgKGRvbWFpbm5hbWUgaXMgTklTIGRvbWFpbiwgbm90CiAqCQkJCUROUyBkb21haW4hKS4gU2tpcCBkdW1teSBkZXZpY2VzIGZvciBCT09UUC4KICoJSmFjZWsgWmFwYWxhCToJRml4ZWQgYSBidWcgd2hpY2ggcHJldmVudGVkIHNlcnZlci1pcCBhZGRyZXNzCiAqCQkJCWZyb20gbmZzcm9vdCBwYXJhbWV0ZXIgZnJvbSBiZWluZyB1c2VkLgogKglPbGFmIEtpcmNoCToJQWRhcHRlZCB0byBuZXcgTkZTIGNvZGUuCiAqCUpha3ViIEplbGluZWsJOglGcmVlIHVzZWQgY29kZSBzZWdtZW50LgogKglNYXJrbyBLb2h0YWxhCToJRml4ZWQgc29tZSBidWdzLgogKglNYXJ0aW4gTWFyZXMJOglEZWJ1ZyBtZXNzYWdlIGNsZWFudXAKICoJTWFydGluIE1hcmVzCToJQ2hhbmdlZCB0byB1c2UgdGhlIG5ldyBnZW5lcmljIElQIGxheWVyIGF1dG9jb25maWcKICoJCQkJY29kZS4gQk9PVFAgYW5kIFJBUlAgbW92ZWQgdGhlcmUuCiAqCU1hcnRpbiBNYXJlcwk6CURlZmF1bHQgcGF0aCBub3cgY29udGFpbnMgaG9zdCBuYW1lIGluc3RlYWQgb2YKICoJCQkJaG9zdCBJUCBhZGRyZXNzIChidXQgaG9zdCBuYW1lIGRlZmF1bHRzIHRvIElQCiAqCQkJCWFkZHJlc3MgYW55d2F5KS4KICoJTWFydGluIE1hcmVzCToJVXNlIHJvb3Rfc2VydmVyX2FkZHIgYXBwcm9wcmlhdGVseSBkdXJpbmcgc2V0dXAuCiAqCU1hcnRpbiBNYXJlcwk6CVJld3JvdGUgcGFyYW1ldGVyIHBhcnNpbmcsIG5vdyBob3BlZnVsbHkgZ2l2aW5nCiAqCQkJCWNvcnJlY3Qgb3ZlcnJpZGluZy4KICoJVHJvbmQgTXlrbGVidXN0IDoJQWRkIGluIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIE5GU3YzIGFuZCBUQ1AuCiAqCQkJCUZpeCBidWcgaW4gcm9vdF9uZnNfYWRkcigpLiBuZnNfZGF0YS5uYW1sZW4KICoJCQkJaXMgTk9UIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBob3N0bmFtZS4KICoJSHVhIFFpbgkJOglTdXBwb3J0IGZvciBtb3VudGluZyByb290IGZpbGUgc3lzdGVtIHZpYQogKgkJCQlORlMgb3ZlciBUQ1AuCiAqCUZhYmlhbiBGcmVkZXJpY2s6CU9wdGlvbiBwYXJzZXIgcmVidWlsdCAodXNpbmcgcGFyc2VyIGxpYikKKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvdGltZS5oPgojaW5jbHVkZSA8bGludXgvZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiNpbmNsdWRlIDxsaW51eC9uZnMuaD4KI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgojaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CiNpbmNsdWRlIDxsaW51eC9pbi5oPgojaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiNpbmNsdWRlIDxuZXQvaXBjb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgoKLyogRGVmaW5lIHRoaXMgdG8gYWxsb3cgZGVidWdnaW5nIG91dHB1dCAqLwojdW5kZWYgTkZTUk9PVF9ERUJVRwojZGVmaW5lIE5GU0RCR19GQUNJTElUWSBORlNEQkdfUk9PVAoKLyogRGVmYXVsdCBwYXRoIHdlIHRyeSB0byBtb3VudC4gIiVzIiBnZXRzIHJlcGxhY2VkIGJ5IG91ciBJUCBhZGRyZXNzICovCiNkZWZpbmUgTkZTX1JPT1QJCSIvdGZ0cGJvb3QvJXMiCgovKiBQYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lICovCnN0YXRpYyBjaGFyIG5mc19yb290X25hbWVbMjU2XSBfX2luaXRkYXRhID0gIiI7CgovKiBBZGRyZXNzIG9mIE5GUyBzZXJ2ZXIgKi8Kc3RhdGljIF9fdTMyIHNlcnZhZGRyIF9faW5pdGRhdGEgPSAwOwoKLyogTmFtZSBvZiBkaXJlY3RvcnkgdG8gbW91bnQgKi8Kc3RhdGljIGNoYXIgbmZzX3BhdGhbTkZTX01BWFBBVEhMRU5dIF9faW5pdGRhdGEgPSB7IDAsIH07CgovKiBORlMtcmVsYXRlZCBkYXRhICovCnN0YXRpYyBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgbmZzX2RhdGEgX19pbml0ZGF0YSA9IHsgMCwgfTsvKiBORlMgbW91bnQgaW5mbyAqLwpzdGF0aWMgaW50IG5mc19wb3J0IF9faW5pdGRhdGEgPSAwOwkJLyogUG9ydCB0byBjb25uZWN0IHRvIGZvciBORlMgKi8Kc3RhdGljIGludCBtb3VudF9wb3J0IF9faW5pdGRhdGEgPSAwOwkJLyogTW91bnQgZGFlbW9uIHBvcnQgbnVtYmVyICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCQkJICAgICBQYXJzaW5nIG9mIG9wdGlvbnMKCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgplbnVtIHsKCS8qIE9wdGlvbnMgdGhhdCB0YWtlIGludGVnZXIgYXJndW1lbnRzICovCglPcHRfcG9ydCwgT3B0X3JzaXplLCBPcHRfd3NpemUsIE9wdF90aW1lbywgT3B0X3JldHJhbnMsIE9wdF9hY3JlZ21pbiwKCU9wdF9hY3JlZ21heCwgT3B0X2FjZGlybWluLCBPcHRfYWNkaXJtYXgsCgkvKiBPcHRpb25zIHRoYXQgdGFrZSBubyBhcmd1bWVudHMgKi8KCU9wdF9zb2Z0LCBPcHRfaGFyZCwgT3B0X2ludHIsCglPcHRfbm9pbnRyLCBPcHRfcG9zaXgsIE9wdF9ub3Bvc2l4LCBPcHRfY3RvLCBPcHRfbm9jdG8sIE9wdF9hYywgCglPcHRfbm9hYywgT3B0X2xvY2ssIE9wdF9ub2xvY2ssIE9wdF92MiwgT3B0X3YzLCBPcHRfdWRwLCBPcHRfdGNwLAoJT3B0X2FjbCwgT3B0X25vYWNsLAoJLyogRXJyb3IgdG9rZW4gKi8KCU9wdF9lcnIKfTsKCnN0YXRpYyBtYXRjaF90YWJsZV90IF9faW5pdGRhdGEgdG9rZW5zID0gewoJe09wdF9wb3J0LCAicG9ydD0ldSJ9LAoJe09wdF9yc2l6ZSwgInJzaXplPSV1In0sCgl7T3B0X3dzaXplLCAid3NpemU9JXUifSwKCXtPcHRfdGltZW8sICJ0aW1lbz0ldSJ9LAoJe09wdF9yZXRyYW5zLCAicmV0cmFucz0ldSJ9LAoJe09wdF9hY3JlZ21pbiwgImFjcmVnbWluPSV1In0sCgl7T3B0X2FjcmVnbWF4LCAiYWNyZWdtYXg9JXUifSwKCXtPcHRfYWNkaXJtaW4sICJhY2Rpcm1pbj0ldSJ9LAoJe09wdF9hY2Rpcm1heCwgImFjZGlybWF4PSV1In0sCgl7T3B0X3NvZnQsICJzb2Z0In0sCgl7T3B0X2hhcmQsICJoYXJkIn0sCgl7T3B0X2ludHIsICJpbnRyIn0sCgl7T3B0X25vaW50ciwgIm5vaW50ciJ9LAoJe09wdF9wb3NpeCwgInBvc2l4In0sCgl7T3B0X25vcG9zaXgsICJub3Bvc2l4In0sCgl7T3B0X2N0bywgImN0byJ9LAoJe09wdF9ub2N0bywgIm5vY3RvIn0sCgl7T3B0X2FjLCAiYWMifSwKCXtPcHRfbm9hYywgIm5vYWMifSwKCXtPcHRfbG9jaywgImxvY2sifSwKCXtPcHRfbm9sb2NrLCAibm9sb2NrIn0sCgl7T3B0X3YyLCAibmZzdmVycz0yIn0sCgl7T3B0X3YyLCAidjIifSwKCXtPcHRfdjMsICJuZnN2ZXJzPTMifSwKCXtPcHRfdjMsICJ2MyJ9LAoJe09wdF91ZHAsICJwcm90bz11ZHAifSwKCXtPcHRfdWRwLCAidWRwIn0sCgl7T3B0X3RjcCwgInByb3RvPXRjcCJ9LAoJe09wdF90Y3AsICJ0Y3AifSwKCXtPcHRfYWNsLCAiYWNsIn0sCgl7T3B0X25vYWNsLCAibm9hY2wifSwKCXtPcHRfZXJyLCBOVUxMfQoJCn07CgovKgogKiAgUGFyc2Ugb3B0aW9uIHN0cmluZy4KICovCgpzdGF0aWMgaW50IF9faW5pdCByb290X25mc19wYXJzZShjaGFyICpuYW1lLCBjaGFyICpidWYpCnsKCgljaGFyICpwOwoJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwoJaW50IG9wdGlvbjsKCglpZiAoIW5hbWUpCgkJcmV0dXJuIDE7CgoJLyogU2V0IHRoZSBORlMgcmVtb3RlIHBhdGggKi8KCXAgPSBzdHJzZXAoJm5hbWUsICIsIik7CglpZiAocFswXSAhPSAnXDAnICYmIHN0cmNtcChwLCAiZGVmYXVsdCIpICE9IDApCgkJc3RybGNweShidWYsIHAsIE5GU19NQVhQQVRITEVOKTsKCgl3aGlsZSAoKHAgPSBzdHJzZXAgKCZuYW1lLCAiLCIpKSAhPSBOVUxMKSB7CgkJaW50IHRva2VuOyAKCQlpZiAoISpwKQoJCQljb250aW51ZTsKCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CgoJCS8qICV1IHRva2VucyBvbmx5LiBCZXdhcmUgaWYgeW91IGFkZCBuZXcgdG9rZW5zISAqLwoJCWlmICh0b2tlbiA8IE9wdF9zb2Z0ICYmIG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCgkJCXJldHVybiAwOwoJCXN3aXRjaCAodG9rZW4pIHsKCQkJY2FzZSBPcHRfcG9ydDoKCQkJCW5mc19wb3J0ID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X3JzaXplOgoJCQkJbmZzX2RhdGEucnNpemUgPSBvcHRpb247CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfd3NpemU6CgkJCQluZnNfZGF0YS53c2l6ZSA9IG9wdGlvbjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF90aW1lbzoKCQkJCW5mc19kYXRhLnRpbWVvID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X3JldHJhbnM6CgkJCQluZnNfZGF0YS5yZXRyYW5zID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2FjcmVnbWluOgoJCQkJbmZzX2RhdGEuYWNyZWdtaW4gPSBvcHRpb247CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfYWNyZWdtYXg6CgkJCQluZnNfZGF0YS5hY3JlZ21heCA9IG9wdGlvbjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9hY2Rpcm1pbjoKCQkJCW5mc19kYXRhLmFjZGlybWluID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2FjZGlybWF4OgoJCQkJbmZzX2RhdGEuYWNkaXJtYXggPSBvcHRpb247CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfc29mdDoKCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9TT0ZUOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2hhcmQ6CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX1NPRlQ7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfaW50cjoKCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9JTlRSOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X25vaW50cjoKCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfSU5UUjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9wb3NpeDoKCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9QT1NJWDsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9ub3Bvc2l4OgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9QT1NJWDsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9jdG86CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX05PQ1RPOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X25vY3RvOgoJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQ1RPOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2FjOgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0FDOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X25vYWM6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfTk9BQzsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9sb2NrOgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9OT05MTTsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9ub2xvY2s6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfTk9OTE07CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfdjI6CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX1ZFUjM7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfdjM6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVkVSMzsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF91ZHA6CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF90Y3A6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVENQOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2FjbDoKCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQ0w7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfbm9hY2w6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfTk9BQ0w7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJvb3QtTkZTOiB1bmtub3duICIKCQkJCQkib3B0aW9uOiAlc1xuIiwgcCk7CgkJCQlyZXR1cm4gMDsKCQl9Cgl9CgoJcmV0dXJuIDE7Cn0KCi8qCiAqICBQcmVwYXJlIHRoZSBORlMgZGF0YSBzdHJ1Y3R1cmUgYW5kIHBhcnNlIGFsbCBvcHRpb25zLgogKi8Kc3RhdGljIGludCBfX2luaXQgcm9vdF9uZnNfbmFtZShjaGFyICpuYW1lKQp7CglzdGF0aWMgY2hhciBidWZbTkZTX01BWFBBVEhMRU5dIF9faW5pdGRhdGE7CgljaGFyICpjcDsKCgkvKiBTZXQgc29tZSBkZWZhdWx0IHZhbHVlcyAqLwoJbWVtc2V0KCZuZnNfZGF0YSwgMCwgc2l6ZW9mKG5mc19kYXRhKSk7CgluZnNfcG9ydCAgICAgICAgICA9IC0xOwoJbmZzX2RhdGEudmVyc2lvbiAgPSBORlNfTU9VTlRfVkVSU0lPTjsKCW5mc19kYXRhLmZsYWdzICAgID0gTkZTX01PVU5UX05PTkxNOwkvKiBObyBsb2NrZCBpbiBuZnMgcm9vdCB5ZXQgKi8KCW5mc19kYXRhLnJzaXplICAgID0gTkZTX0RFRl9GSUxFX0lPX1NJWkU7CgluZnNfZGF0YS53c2l6ZSAgICA9IE5GU19ERUZfRklMRV9JT19TSVpFOwoJbmZzX2RhdGEuYWNyZWdtaW4gPSAzOwoJbmZzX2RhdGEuYWNyZWdtYXggPSA2MDsKCW5mc19kYXRhLmFjZGlybWluID0gMzA7CgluZnNfZGF0YS5hY2Rpcm1heCA9IDYwOwoJc3RyY3B5KGJ1ZiwgTkZTX1JPT1QpOwoKCS8qIFByb2Nlc3Mgb3B0aW9ucyByZWNlaXZlZCBmcm9tIHRoZSByZW1vdGUgc2VydmVyICovCglyb290X25mc19wYXJzZShyb290X3NlcnZlcl9wYXRoLCBidWYpOwoKCS8qIE92ZXJyaWRlIHRoZW0gYnkgb3B0aW9ucyBzZXQgb24ga2VybmVsIGNvbW1hbmQtbGluZSAqLwoJcm9vdF9uZnNfcGFyc2UobmFtZSwgYnVmKTsKCgljcCA9IHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lOwoJaWYgKHN0cmxlbihidWYpICsgc3RybGVuKGNwKSA+IE5GU19NQVhQQVRITEVOKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogUGF0aG5hbWUgZm9yIHJlbW90ZSBkaXJlY3RvcnkgdG9vIGxvbmcuXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CglzcHJpbnRmKG5mc19wYXRoLCBidWYsIGNwKTsKCglyZXR1cm4gMTsKfQoKCi8qCiAqICBHZXQgTkZTIHNlcnZlciBhZGRyZXNzLgogKi8Kc3RhdGljIGludCBfX2luaXQgcm9vdF9uZnNfYWRkcih2b2lkKQp7CglpZiAoKHNlcnZhZGRyID0gcm9vdF9zZXJ2ZXJfYWRkcikgPT0gSU5BRERSX05PTkUpIHsKCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBObyBORlMgc2VydmVyIGF2YWlsYWJsZSwgZ2l2aW5nIHVwLlxuIik7CgkJcmV0dXJuIC0xOwoJfQoKCXNucHJpbnRmKG5mc19kYXRhLmhvc3RuYW1lLCBzaXplb2YobmZzX2RhdGEuaG9zdG5hbWUpLAoJCSAiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKHNlcnZhZGRyKSk7CglyZXR1cm4gMDsKfQoKLyoKICogIFRlbGwgdGhlIHVzZXIgd2hhdCdzIGdvaW5nIG9uLgogKi8KI2lmZGVmIE5GU1JPT1RfREVCVUcKc3RhdGljIHZvaWQgX19pbml0IHJvb3RfbmZzX3ByaW50KHZvaWQpCnsKCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6IE1vdW50aW5nICVzIG9uIHNlcnZlciAlcyBhcyByb290XG4iLAoJCW5mc19wYXRoLCBuZnNfZGF0YS5ob3N0bmFtZSk7CglwcmludGsoS0VSTl9OT1RJQ0UgIlJvb3QtTkZTOiAgICAgcnNpemUgPSAlZCwgd3NpemUgPSAlZCwgdGltZW8gPSAlZCwgcmV0cmFucyA9ICVkXG4iLAoJCW5mc19kYXRhLnJzaXplLCBuZnNfZGF0YS53c2l6ZSwgbmZzX2RhdGEudGltZW8sIG5mc19kYXRhLnJldHJhbnMpOwoJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIGFjcmVnIChtaW4sbWF4KSA9ICglZCwlZCksIGFjZGlyIChtaW4sbWF4KSA9ICglZCwlZClcbiIsCgkJbmZzX2RhdGEuYWNyZWdtaW4sIG5mc19kYXRhLmFjcmVnbWF4LAoJCW5mc19kYXRhLmFjZGlybWluLCBuZnNfZGF0YS5hY2Rpcm1heCk7CglwcmludGsoS0VSTl9OT1RJQ0UgIlJvb3QtTkZTOiAgICAgbmZzZCBwb3J0ID0gJWQsIG1vdW50ZCBwb3J0ID0gJWQsIGZsYWdzID0gJTA4eFxuIiwKCQluZnNfcG9ydCwgbW91bnRfcG9ydCwgbmZzX2RhdGEuZmxhZ3MpOwp9CiNlbmRpZgoKCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2luaXQodm9pZCkKewojaWZkZWYgTkZTUk9PVF9ERUJVRwoJbmZzX2RlYnVnIHw9IE5GU0RCR19ST09UOwojZW5kaWYKCgkvKgoJICogRGVjb2RlIHRoZSByb290IGRpcmVjdG9yeSBwYXRoIG5hbWUgYW5kIE5GUyBvcHRpb25zIGZyb20KCSAqIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLiBUaGlzIGhhcyB0byBnbyBoZXJlIGluIG9yZGVyIHRvCgkgKiBiZSBhYmxlIHRvIHVzZSB0aGUgY2xpZW50IElQIGFkZHJlc3MgZm9yIHRoZSByZW1vdGUgcm9vdAoJICogZGlyZWN0b3J5IChuZWNlc3NhcnkgZm9yIHB1cmUgUkFSUCBib290aW5nKS4KCSAqLwoJaWYgKHJvb3RfbmZzX25hbWUobmZzX3Jvb3RfbmFtZSkgPCAwIHx8CgkgICAgcm9vdF9uZnNfYWRkcigpIDwgMCkKCQlyZXR1cm4gLTE7CgojaWZkZWYgTkZTUk9PVF9ERUJVRwoJcm9vdF9uZnNfcHJpbnQoKTsKI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCgovKgogKiAgUGFyc2UgTkZTIHNlcnZlciBhbmQgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHBhc3NlZCBvbiB0aGUga2VybmVsCiAqICBjb21tYW5kIGxpbmUuCiAqLwpzdGF0aWMgaW50IF9faW5pdCBuZnNfcm9vdF9zZXR1cChjaGFyICpsaW5lKQp7CglST09UX0RFViA9IFJvb3RfTkZTOwoJaWYgKGxpbmVbMF0gPT0gJy8nIHx8IGxpbmVbMF0gPT0gJywnIHx8IChsaW5lWzBdID49ICcwJyAmJiBsaW5lWzBdIDw9ICc5JykpIHsKCQlzdHJsY3B5KG5mc19yb290X25hbWUsIGxpbmUsIHNpemVvZihuZnNfcm9vdF9uYW1lKSk7Cgl9IGVsc2UgewoJCWludCBuID0gc3RybGVuKGxpbmUpICsgc2l6ZW9mKE5GU19ST09UKSAtIDE7CgkJaWYgKG4gPj0gc2l6ZW9mKG5mc19yb290X25hbWUpKQoJCQlsaW5lW3NpemVvZihuZnNfcm9vdF9uYW1lKSAtIHNpemVvZihORlNfUk9PVCkgLSAyXSA9ICdcMCc7CgkJc3ByaW50ZihuZnNfcm9vdF9uYW1lLCBORlNfUk9PVCwgbGluZSk7Cgl9Cglyb290X3NlcnZlcl9hZGRyID0gcm9vdF9uZnNfcGFyc2VfYWRkcihuZnNfcm9vdF9uYW1lKTsKCXJldHVybiAxOwp9CgpfX3NldHVwKCJuZnNyb290PSIsIG5mc19yb290X3NldHVwKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgkgICAgICAgUm91dGluZXMgdG8gYWN0dWFsbHkgbW91bnQgdGhlIHJvb3QgZGlyZWN0b3J5CgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogIENvbnN0cnVjdCBzb2NrYWRkcl9pbiBmcm9tIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyLgogKi8Kc3RhdGljIGlubGluZSB2b2lkCnNldF9zb2NrYWRkcihzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwgX191MzIgYWRkciwgX191MTYgcG9ydCkKewoJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKCXNpbi0+c2luX2FkZHIuc19hZGRyID0gYWRkcjsKCXNpbi0+c2luX3BvcnQgPSBwb3J0Owp9CgovKgogKiAgUXVlcnkgc2VydmVyIHBvcnRtYXBwZXIgZm9yIHRoZSBwb3J0IG9mIGEgZGFlbW9uIHByb2dyYW0uCiAqLwpzdGF0aWMgaW50IF9faW5pdCByb290X25mc19nZXRwb3J0KGludCBwcm9ncmFtLCBpbnQgdmVyc2lvbiwgaW50IHByb3RvKQp7CglzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwoKCXByaW50ayhLRVJOX05PVElDRSAiTG9va2luZyB1cCBwb3J0IG9mIFJQQyAlZC8lZCBvbiAldS4ldS4ldS4ldVxuIiwKCQlwcm9ncmFtLCB2ZXJzaW9uLCBOSVBRVUFEKHNlcnZhZGRyKSk7CglzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIDApOwoJcmV0dXJuIHJwY19nZXRwb3J0X2V4dGVybmFsKCZzaW4sIHByb2dyYW0sIHZlcnNpb24sIHByb3RvKTsKfQoKCi8qCiAqICBVc2UgcG9ydG1hcHBlciB0byBmaW5kIG1vdW50ZCBhbmQgbmZzZCBwb3J0IG51bWJlcnMgaWYgbm90IG92ZXJyaWRlbgogKiAgYnkgdGhlIHVzZXIuIFVzZSBkZWZhdWx0cyBpZiBwb3J0bWFwcGVyIGlzIG5vdCBhdmFpbGFibGUuCiAqICBYWFg6IElzIHRoZXJlIGFueSBuZnMgc2VydmVyIHdpdGggbm8gcG9ydG1hcHBlcj8KICovCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX3BvcnRzKHZvaWQpCnsKCWludCBwb3J0OwoJaW50IG5mc2RfdmVyLCBtb3VudGRfdmVyOwoJaW50IG5mc2RfcG9ydCwgbW91bnRkX3BvcnQ7CglpbnQgcHJvdG87CgoJaWYgKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKCQluZnNkX3ZlciA9IE5GUzNfVkVSU0lPTjsKCQltb3VudGRfdmVyID0gTkZTX01OVDNfVkVSU0lPTjsKCQluZnNkX3BvcnQgPSBORlNfUE9SVDsKCQltb3VudGRfcG9ydCA9IE5GU19NTlRfUE9SVDsKCX0gZWxzZSB7CgkJbmZzZF92ZXIgPSBORlMyX1ZFUlNJT047CgkJbW91bnRkX3ZlciA9IE5GU19NTlRfVkVSU0lPTjsKCQluZnNkX3BvcnQgPSBORlNfUE9SVDsKCQltb3VudGRfcG9ydCA9IE5GU19NTlRfUE9SVDsKCX0KCglwcm90byA9IChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9UQ1ApID8gSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUDsKCglpZiAobmZzX3BvcnQgPCAwKSB7CgkJaWYgKChwb3J0ID0gcm9vdF9uZnNfZ2V0cG9ydChORlNfUFJPR1JBTSwgbmZzZF92ZXIsIHByb3RvKSkgPCAwKSB7CgkJCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IFVuYWJsZSB0byBnZXQgbmZzZCBwb3J0ICIKCQkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKCQkJcG9ydCA9IG5mc2RfcG9ydDsKCQl9CgkJbmZzX3BvcnQgPSBwb3J0OwoJCWRwcmludGsoIlJvb3QtTkZTOiBQb3J0bWFwcGVyIG9uIHNlcnZlciByZXR1cm5lZCAlZCAiCgkJCSJhcyBuZnNkIHBvcnRcbiIsIHBvcnQpOwoJfQoJbmZzX3BvcnQgPSBodG9ucyhuZnNfcG9ydCk7CgoJaWYgKChwb3J0ID0gcm9vdF9uZnNfZ2V0cG9ydChORlNfTU5UX1BST0dSQU0sIG1vdW50ZF92ZXIsIHByb3RvKSkgPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogVW5hYmxlIHRvIGdldCBtb3VudGQgcG9ydCAiCgkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKCQlwb3J0ID0gbW91bnRkX3BvcnQ7Cgl9Cgltb3VudF9wb3J0ID0gaHRvbnMocG9ydCk7CglkcHJpbnRrKCJSb290LU5GUzogbW91bnRkIHBvcnQgaXMgJWRcbiIsIHBvcnQpOwoKCXJldHVybiAwOwp9CgoKLyoKICogIEdldCBhIGZpbGUgaGFuZGxlIGZyb20gdGhlIHNlcnZlciBmb3IgdGhlIGRpcmVjdG9yeSB3aGljaCBpcyB0byBiZQogKiAgbW91bnRlZC4KICovCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2dldF9oYW5kbGUodm9pZCkKewoJc3RydWN0IG5mc19maCBmaDsKCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CglpbnQgc3RhdHVzOwoJaW50IHByb3RvY29sID0gKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPwoJCQkJCUlQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CglpbnQgdmVyc2lvbiA9IChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSA/CgkJCQkJTkZTX01OVDNfVkVSU0lPTiA6IE5GU19NTlRfVkVSU0lPTjsKCglzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIG1vdW50X3BvcnQpOwoJc3RhdHVzID0gbmZzcm9vdF9tb3VudCgmc2luLCBuZnNfcGF0aCwgJmZoLCB2ZXJzaW9uLCBwcm90b2NvbCk7CglpZiAoc3RhdHVzIDwgMCkKCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBTZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgJWQgIgoJCQkJIndoaWxlIG1vdW50aW5nICVzXG4iLCBzdGF0dXMsIG5mc19wYXRoKTsKCWVsc2UgewoJCW5mc19kYXRhLnJvb3Quc2l6ZSA9IGZoLnNpemU7CgkJbWVtY3B5KG5mc19kYXRhLnJvb3QuZGF0YSwgZmguZGF0YSwgZmguc2l6ZSk7Cgl9CgoJcmV0dXJuIHN0YXR1czsKfQoKLyoKICogIEdldCB0aGUgTkZTIHBvcnQgbnVtYmVycyBhbmQgZmlsZSBoYW5kbGUsIGFuZCByZXR1cm4gdGhlIHByZXBhcmVkICdkYXRhJwogKiAgYXJndW1lbnQgZm9yIG1vdW50KCkgaWYgZXZlcnl0aGluZyB3ZW50IE9LLiBSZXR1cm4gTlVMTCBvdGhlcndpc2UuCiAqLwp2b2lkICogX19pbml0IG5mc19yb290X2RhdGEodm9pZCkKewoJaWYgKHJvb3RfbmZzX2luaXQoKSA8IDAKCSB8fCByb290X25mc19wb3J0cygpIDwgMAoJIHx8IHJvb3RfbmZzX2dldF9oYW5kbGUoKSA8IDApCgkJcmV0dXJuIE5VTEw7CglzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmbmZzX2RhdGEuYWRkciwgc2VydmFkZHIsIG5mc19wb3J0KTsKCXJldHVybiAodm9pZCopJm5mc19kYXRhOwp9Cg==