LyoKICogaXBjcy5jIC0tIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGFsbG9jYXRlZCBpcGMgcmVzb3VyY2VzLgogKgogKiAwMSBTZXB0IDIwMDQgLSBSb2RuZXkgUmFkZm9yZCA8cnJhZGZvcmRAbWluZHNwcmluZy5jb20+CiAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggZnJvbSB1dGlsLWxpbnV4LTIuMTJhLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQogKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqIC0tLSBQcmUtYnVzeWJveCBoaXN0b3J5IGZyb20gdXRpbC1saW51eC0yLjEyYSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWn/a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogUGF0Y2hlZCB0byBkaXNwbGF5IHRoZSBrZXkgZmllbGQgLS0gaHlAcGlja3N5cy5jb20gMTIvMTgvOTYKICoKICogUGF0Y2ggZnJvbSBhcm5vbGRzQGlmbnMuZGUgKEhlaW56LUFkbyBBcm5vbGRzKSBhcHBsaWVkIE1vbiBKdWwgMQogKiAxOTozMDo0MSAxOTk2IGJ5IGphbmxAbWF0aC51aW8ubm8gdG8gYWRkIGNvZGUgbWlzc2luZyBpbiBjYXNlIFBJRDoKICogY2xhdXNlcy4KICoKICogUGF0Y2hlcyBmcm9tIE1pa2UgSmFnZGlzIChqYWdneUBwdXJwbGV0LmRlbW9uLmNvLnVrKSBhcHBsaWVkIAogKiBXZWQgRmViIDggMTI6MTI6MjEgMTk5NSBieSBmYWl0aEBjcy51bmMuZWR1IHRvIHByaW50IG51bWVyaWMgdWlkcyAKICogaWYgbm8gcGFzc3dkIGZpbGUgZW50cnkuCiAqCiAqIE1vZGlmaWVkIFNhdCBPY3QgIDkgMTA6NTU6MjggMTk5MyBmb3IgMC45OS4xMwogKiBPcmlnaW5hbCBhdXRob3IgdW5rbm93biwgbWF5IGJlICJrcmlzaG5hIGJhbGFzdWJAY2lzLm9oaW8tc3RhdGUuZWR1IiAKICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Z2V0b3B0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8cHdkLmg+CiNpbmNsdWRlIDxncnAuaD4KCi8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLHNlbX0uaD4gZm9yIHNlbWN0bCgpICovCi8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLG1zZ30uaD4gZm9yIG1zZ2N0bCgpICovCi8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLHNobX0uaD4gZm9yIHNobWN0bCgpICovCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9pcGMuaD4KI2luY2x1ZGUgPHN5cy9zZW0uaD4KI2luY2x1ZGUgPHN5cy9tc2cuaD4KI2luY2x1ZGUgPHN5cy9zaG0uaD4KCiNpbmNsdWRlICJidXN5Ym94LmgiCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBTSE1fREVTVCBhbmQgU0hNX0xPQ0tFRCBhcmUgZGVmaW5lZCBpbiBrZXJuZWwgaGVhZGVycywKICAgYnV0IGluc2lkZSAjaWZkZWYgX19LRVJORUxfXyAuLi4gI2VuZGlmICovCiNpZm5kZWYgU0hNX0RFU1QKLyogc2htX21vZGUgdXBwZXIgYnl0ZSBmbGFncyAqLwojZGVmaW5lIFNITV9ERVNUICAgICAgICAwMTAwMCAgIC8qIHNlZ21lbnQgd2lsbCBiZSBkZXN0cm95ZWQgb24gbGFzdCBkZXRhY2ggKi8KI2RlZmluZSBTSE1fTE9DS0VEICAgICAgMDIwMDAgICAvKiBzZWdtZW50IHdpbGwgbm90IGJlIHN3YXBwZWQgKi8KI2VuZGlmCgovKiBGb3Igb2xkZXIga2VybmVscyB0aGUgc2FtZSBob2xkcyBmb3IgdGhlIGRlZmluZXMgYmVsb3cgKi8KI2lmbmRlZiBNU0dfU1RBVAojZGVmaW5lIE1TR19TVEFUCTExCiNkZWZpbmUgTVNHX0lORk8JMTIKI2VuZGlmCgojaWZuZGVmIFNITV9TVEFUCiNkZWZpbmUgU0hNX1NUQVQgICAgICAgIDEzCiNkZWZpbmUgU0hNX0lORk8gICAgICAgIDE0CnN0cnVjdCBzaG1faW5mbyB7CgkgaW50ICAgdXNlZF9pZHM7CgkgdWxvbmcgc2htX3RvdDsgLyogdG90YWwgYWxsb2NhdGVkIHNobSAqLwoJIHVsb25nIHNobV9yc3M7IC8qIHRvdGFsIHJlc2lkZW50IHNobSAqLwoJIHVsb25nIHNobV9zd3A7IC8qIHRvdGFsIHN3YXBwZWQgc2htICovCgkgdWxvbmcgc3dhcF9hdHRlbXB0czsKCSB1bG9uZyBzd2FwX3N1Y2Nlc3NlczsKfTsKI2VuZGlmCgojaWZuZGVmIFNFTV9TVEFUCiNkZWZpbmUgU0VNX1NUQVQJMTgKI2RlZmluZSBTRU1fSU5GTwkxOQojZW5kaWYKCi8qIFNvbWUgdmVyc2lvbnMgb2YgbGliYyBvbmx5IGRlZmluZSBJUENfSU5GTyB3aGVuIF9fVVNFX0dOVSBpcyBkZWZpbmVkLiAqLwojaWZuZGVmIElQQ19JTkZPCiNkZWZpbmUgSVBDX0lORk8gICAgICAgIDMKI2VuZGlmCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBUaGUgbGFzdCBhcmcgb2Ygc2VtY3RsIGlzIGEgdW5pb24gc2VtdW4sIGJ1dCB3aGVyZSBpcyBpdCBkZWZpbmVkPwogICBYL09QRU4gdGVsbHMgdXMgdG8gZGVmaW5lIGl0IG91cnNlbHZlcywgYnV0IHVudGlsIHJlY2VudGx5CiAgIExpbnV4IGluY2x1ZGUgZmlsZXMgd291bGQgYWxzbyBkZWZpbmUgaXQuICovCiNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pICYmICFkZWZpbmVkKF9TRU1fU0VNVU5fVU5ERUZJTkVEKQovKiB1bmlvbiBzZW11biBpcyBkZWZpbmVkIGJ5IGluY2x1ZGluZyA8c3lzL3NlbS5oPiAqLwojZWxzZQovKiBhY2NvcmRpbmcgdG8gWC9PUEVOIHdlIGhhdmUgdG8gZGVmaW5lIGl0IG91cnNlbHZlcyAqLwp1bmlvbiBzZW11biB7CglpbnQgdmFsOwoJc3RydWN0IHNlbWlkX2RzICpidWY7Cgl1bnNpZ25lZCBzaG9ydCBpbnQgKmFycmF5OwoJc3RydWN0IHNlbWluZm8gKl9fYnVmOwp9OwojZW5kaWYKCi8qIFgvT1BFTiAoSmFuIDE5ODcpIGRvZXMgbm90IGRlZmluZSBmaWVsZHMga2V5LCBzZXEgaW4gc3RydWN0IGlwY19wZXJtOwogICBsaWJjIDQvNSBkb2VzIG5vdCBtZW50aW9uIHN0cnVjdCBpcGNfdGVybSBhdCBhbGwsIGJ1dCBpbmNsdWRlcwogICA8bGludXgvaXBjLmg+LCB3aGljaCBkZWZpbmVzIGEgc3RydWN0IGlwY19wZXJtIHdpdGggc3VjaCBmaWVsZHMuCiAgIGdsaWJjLTEuMDkgaGFzIG5vIHN1cHBvcnQgZm9yIHN5c3YgaXBjLgogICBnbGliYyAyIHVzZXMgX19rZXksIF9fc2VxICovCiNpZiBkZWZpbmVkIChfX0dOVV9MSUJSQVJZX18pICYmIF9fR05VX0xJQlJBUllfXyA+IDEKI2RlZmluZSBLRVkgX19rZXkKI2Vsc2UKI2RlZmluZSBLRVkga2V5CiNlbmRpZgoKI2RlZmluZSBMSU1JVFMgMQojZGVmaW5lIFNUQVRVUyAyCiNkZWZpbmUgQ1JFQVRPUiAzCiNkZWZpbmUgVElNRSA0CiNkZWZpbmUgUElEIDUKCnZvaWQgZG9fc2htIChjaGFyIGZvcm1hdCk7CnZvaWQgZG9fc2VtIChjaGFyIGZvcm1hdCk7CnZvaWQgZG9fbXNnIChjaGFyIGZvcm1hdCk7CnZvaWQgcHJpbnRfc2htIChpbnQgaWQpOwp2b2lkIHByaW50X21zZyAoaW50IGlkKTsKdm9pZCBwcmludF9zZW0gKGludCBpZCk7CgppbnQgaXBjc19tYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCWludCBvcHQsIG1zZyA9IDAsIHNlbSA9IDAsIHNobSA9IDAsIGlkPTAsIHByaW50PTA7IAoJY2hhciBmb3JtYXQgPSAwOwoJY2hhciBvcHRpb25zW10gPSAiYXRjbHVwc21xaTppaD8iOwoKCXdoaWxlICgob3B0ID0gZ2V0b3B0IChhcmdjLCBhcmd2LCBvcHRpb25zKSkgIT0gLTEpIHsKCQlzd2l0Y2ggKG9wdCkgewoJCWNhc2UgJ2knOgoJCQlpZCA9IGF0b2kgKG9wdGFyZyk7CgkJCXByaW50ID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAnYSc6CgkJCW1zZyA9IHNobSA9IHNlbSA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ3EnOgoJCQltc2cgPSAxOwoJCQlicmVhazsKCQljYXNlICdzJzoKCQkJc2VtID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAnbSc6CgkJCXNobSA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ3QnOgoJCQlmb3JtYXQgPSBUSU1FOwoJCQlicmVhazsKCQljYXNlICdjJzoKCQkJZm9ybWF0ID0gQ1JFQVRPUjsKCQkJYnJlYWs7CgkJY2FzZSAncCc6CgkJCWZvcm1hdCA9IFBJRDsKCQkJYnJlYWs7CgkJY2FzZSAnbCc6CgkJCWZvcm1hdCA9IExJTUlUUzsKCQkJYnJlYWs7CgkJY2FzZSAndSc6CgkJCWZvcm1hdCA9IFNUQVRVUzsKCQkJYnJlYWs7CgkJY2FzZSAnaCc6IAoJCWNhc2UgJz8nOgoJCQliYl9zaG93X3VzYWdlKCk7CgkJCWJiX2ZmbHVzaF9zdGRvdXRfYW5kX2V4aXQgKDApOwoJCX0KCX0KCglpZiAgKHByaW50KSB7CgkJaWYgKHNobSkgeyAKCQkJcHJpbnRfc2htIChpZCk7CgkJCWJiX2ZmbHVzaF9zdGRvdXRfYW5kX2V4aXQgKDApOwoJCX0KCQlpZiAoc2VtKSB7IAoJCQlwcmludF9zZW0gKGlkKTsKCQkJYmJfZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCAoMCk7CgkJfQoJCWlmIChtc2cpIHsKCQkJcHJpbnRfbXNnIChpZCk7CgkJCWJiX2ZmbHVzaF9zdGRvdXRfYW5kX2V4aXQgKDApOwoJCX0KCQliYl9zaG93X3VzYWdlKCk7CgkJYmJfZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCAoMCk7Cgl9CgoJaWYgKCAhc2htICYmICFtc2cgJiYgIXNlbSkKCQltc2cgPSBzZW0gPSBzaG0gPSAxOwoJYmJfcHJpbnRmICgiXG4iKTsKCglpZiAoc2htKSB7CQoJCWRvX3NobSAoZm9ybWF0KTsKCQliYl9wcmludGYgKCJcbiIpOwoJfQoJaWYgKHNlbSkgewkKCQlkb19zZW0gKGZvcm1hdCk7CgkJYmJfcHJpbnRmICgiXG4iKTsKCX0KCWlmIChtc2cpIHsJCgkJZG9fbXNnIChmb3JtYXQpOwoJCWJiX3ByaW50ZiAoIlxuIik7Cgl9CglyZXR1cm4gMDsKfQoKCnN0YXRpYyB2b2lkCnByaW50X3Blcm1zIChpbnQgaWQsIHN0cnVjdCBpcGNfcGVybSAqaXBjcCkgewoJc3RydWN0IHBhc3N3ZCAqcHc7CglzdHJ1Y3QgZ3JvdXAgKmdyOwoKCWJiX3ByaW50ZiAoIiUtMTBkICUtMTBvIiwgaWQsIGlwY3AtPm1vZGUgJiAwNzc3KTsKCglpZiAoKHB3ID0gZ2V0cHd1aWQoaXBjcC0+Y3VpZCkpKQoJCWJiX3ByaW50ZigiICUtMTBzIiwgcHctPnB3X25hbWUpOwoJZWxzZQoJCWJiX3ByaW50ZigiICUtMTBkIiwgaXBjcC0+Y3VpZCk7CglpZiAoKGdyID0gZ2V0Z3JnaWQoaXBjcC0+Y2dpZCkpKQoJCWJiX3ByaW50ZigiICUtMTBzIiwgZ3ItPmdyX25hbWUpOwoJZWxzZQoJCWJiX3ByaW50ZigiICUtMTBkIiwgaXBjcC0+Y2dpZCk7CgoJaWYgKChwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCkpKQoJCWJiX3ByaW50ZigiICUtMTBzIiwgcHctPnB3X25hbWUpOwoJZWxzZQoJCWJiX3ByaW50ZigiICUtMTBkIiwgaXBjcC0+dWlkKTsKCWlmICgoZ3IgPSBnZXRncmdpZChpcGNwLT5naWQpKSkKCQliYl9wcmludGYoIiAlLTEwc1xuIiwgZ3ItPmdyX25hbWUpOwoJZWxzZQoJCWJiX3ByaW50ZigiICUtMTBkXG4iLCBpcGNwLT5naWQpOwp9CgoKdm9pZCBkb19zaG0gKGNoYXIgZm9ybWF0KQp7CglpbnQgbWF4aWQsIHNobWlkLCBpZDsKCXN0cnVjdCBzaG1pZF9kcyBzaG1zZWc7CglzdHJ1Y3Qgc2htX2luZm8gc2htX2luZm87CglzdHJ1Y3Qgc2htaW5mbyBzaG1pbmZvOwoJc3RydWN0IGlwY19wZXJtICppcGNwID0gJnNobXNlZy5zaG1fcGVybTsKCXN0cnVjdCBwYXNzd2QgKnB3OwoKCW1heGlkID0gc2htY3RsICgwLCBTSE1fSU5GTywgKHN0cnVjdCBzaG1pZF9kcyAqKSAodm9pZCAqKSAmc2htX2luZm8pOwoJaWYgKG1heGlkIDwgMCkgewoJCWJiX3ByaW50ZiAoImtlcm5lbCBub3QgY29uZmlndXJlZCBmb3Igc2hhcmVkIG1lbW9yeVxuIik7CgkJcmV0dXJuOwoJfQoJCglzd2l0Y2ggKGZvcm1hdCkgewoJY2FzZSBMSU1JVFM6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgTGltaXRzIC0tLS0tLS0tXG4iKTsKCQlpZiAoKHNobWN0bCAoMCwgSVBDX0lORk8sIChzdHJ1Y3Qgc2htaWRfZHMgKikgKHZvaWQgKikgJnNobWluZm8pKSA8IDAgKQoJCQlyZXR1cm47CgkJLyogZ2xpYmMgMi4xLjMgYW5kIGFsbCBlYXJsaWVyIGxpYmMncyBoYXZlIGludHMgYXMgZmllbGRzCgkJICAgb2Ygc3RydWN0IHNobWluZm87IGdsaWJjIDIuMS45MSBoYXMgdW5zaWduZWQgbG9uZzsgYWNoICovCgkJYmJfcHJpbnRmICgibWF4IG51bWJlciBvZiBzZWdtZW50cyA9ICVsdVxuIiwKCQkJKHVuc2lnbmVkIGxvbmcpIHNobWluZm8uc2htbW5pKTsKCQliYl9wcmludGYgKCJtYXggc2VnIHNpemUgKGtieXRlcykgPSAlbHVcbiIsCgkJCSh1bnNpZ25lZCBsb25nKSAoc2htaW5mby5zaG1tYXggPj4gMTApKTsKCQliYl9wcmludGYgKCJtYXggdG90YWwgc2hhcmVkIG1lbW9yeSAocGFnZXMpID0gJWx1XG4iLAoJCQkodW5zaWduZWQgbG9uZykgc2htaW5mby5zaG1hbGwpOwoJCWJiX3ByaW50ZiAoIm1pbiBzZWcgc2l6ZSAoYnl0ZXMpID0gJWx1XG4iLAoJCQkodW5zaWduZWQgbG9uZykgc2htaW5mby5zaG1taW4pOwoJCXJldHVybjsKCgljYXNlIFNUQVRVUzoKCQliYl9wcmludGYgKCItLS0tLS0gU2hhcmVkIE1lbW9yeSBTdGF0dXMgLS0tLS0tLS1cbiIpOwoJCWJiX3ByaW50ZiAoInNlZ21lbnRzIGFsbG9jYXRlZCAlZFxuIiwgc2htX2luZm8udXNlZF9pZHMpOwoJCWJiX3ByaW50ZiAoInBhZ2VzIGFsbG9jYXRlZCAlbGRcbiIsIHNobV9pbmZvLnNobV90b3QpOwoJCWJiX3ByaW50ZiAoInBhZ2VzIHJlc2lkZW50ICAlbGRcbiIsIHNobV9pbmZvLnNobV9yc3MpOwoJCWJiX3ByaW50ZiAoInBhZ2VzIHN3YXBwZWQgICAlbGRcbiIsIHNobV9pbmZvLnNobV9zd3ApOwoJCWJiX3ByaW50ZiAoIlN3YXAgcGVyZm9ybWFuY2U6ICVsZCBhdHRlbXB0c1x0ICVsZCBzdWNjZXNzZXNcbiIsIAoJCQlzaG1faW5mby5zd2FwX2F0dGVtcHRzLCBzaG1faW5mby5zd2FwX3N1Y2Nlc3Nlcyk7CgkJcmV0dXJuOwoKCWNhc2UgQ1JFQVRPUjoKCQliYl9wcmludGYgKCItLS0tLS0gU2hhcmVkIE1lbW9yeSBTZWdtZW50IENyZWF0b3JzL093bmVycyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCgkJICJzaG1pZCIsInBlcm1zIiwiY3VpZCIsImNnaWQiLCJ1aWQiLCJnaWQiKTsKCQlicmVhazsKCgljYXNlIFRJTUU6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgQXR0YWNoL0RldGFjaC9DaGFuZ2UgVGltZXMgLS0tLS0tLS1cbiIpOwoJCWJiX3ByaW50ZiAoIiUtMTBzICUtMTBzICUtMjBzICUtMjBzICUtMjBzXG4iLAoJCQkic2htaWQiLCJvd25lciIsImF0dGFjaGVkIiwiZGV0YWNoZWQiLCJjaGFuZ2VkIik7CgkJYnJlYWs7CgoJY2FzZSBQSUQ6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgQ3JlYXRvci9MYXN0LW9wIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkJInNobWlkIiwib3duZXIiLCJjcGlkIiwibHBpZCIpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgU2VnbWVudHMgLS0tLS0tLS1cbiIpOwoJCWJiX3ByaW50ZiAoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTJzXG4iLAoJCQkia2V5Iiwic2htaWQiLCJvd25lciIsInBlcm1zIiwiYnl0ZXMiLCJuYXR0Y2giLCJzdGF0dXMiKTsKCQlicmVhazsKCX0KCglmb3IgKGlkID0gMDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKCQlzaG1pZCA9IHNobWN0bCAoaWQsIFNITV9TVEFULCAmc2htc2VnKTsKCQlpZiAoc2htaWQgPCAwKSAKCQkJY29udGludWU7CgkJaWYgKGZvcm1hdCA9PSBDUkVBVE9SKSAgewoJCQlwcmludF9wZXJtcyAoc2htaWQsIGlwY3ApOwoJCQljb250aW51ZTsKCQl9CgkJcHcgPSBnZXRwd3VpZChpcGNwLT51aWQpOwoJCXN3aXRjaCAoZm9ybWF0KSB7CgkJY2FzZSBUSU1FOiAKCQkJaWYgKHB3KQoJCQkJYmJfcHJpbnRmICgiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQliYl9wcmludGYgKCIlLTEwZCAlLTEwZCIsIHNobWlkLCBpcGNwLT51aWQpOwoJCQkvKiBjdGltZSB1c2VzIHN0YXRpYyBidWZmZXI6IHVzZSBzZXBhcmF0ZSBjYWxscyAqLwoJCQliYl9wcmludGYoIiAgJS0yMC4xNnMiLCBzaG1zZWcuc2htX2F0aW1lCgkJCQkgICA/IGN0aW1lKCZzaG1zZWcuc2htX2F0aW1lKSArIDQgOiAiTm90IHNldCIpOwoJCQliYl9wcmludGYoIiAlLTIwLjE2cyIsIHNobXNlZy5zaG1fZHRpbWUKCQkJCSAgID8gY3RpbWUoJnNobXNlZy5zaG1fZHRpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CgkJCWJiX3ByaW50ZigiICUtMjAuMTZzXG4iLCBzaG1zZWcuc2htX2N0aW1lCgkJCQkgICA/IGN0aW1lKCZzaG1zZWcuc2htX2N0aW1lKSArIDQgOiAiTm90IHNldCIpOwoJCQlicmVhazsKCQljYXNlIFBJRDoKCQkJaWYgKHB3KQoJCQkJYmJfcHJpbnRmICgiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQliYl9wcmludGYgKCIlLTEwZCAlLTEwZCIsIHNobWlkLCBpcGNwLT51aWQpOwoJCQliYl9wcmludGYgKCIgJS0xMGQgJS0xMGRcbiIsCgkJCQlzaG1zZWcuc2htX2NwaWQsIHNobXNlZy5zaG1fbHBpZCk7CgkJCWJyZWFrOwoJCQkKCQlkZWZhdWx0OgoJCQkJYmJfcHJpbnRmKCIweCUwOHggIixpcGNwLT5LRVkgKTsKCQkJaWYgKHB3KQoJCQkJYmJfcHJpbnRmICgiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQliYl9wcmludGYgKCIlLTEwZCAlLTEwZCIsIHNobWlkLCBpcGNwLT51aWQpOwoJCQliYl9wcmludGYgKCIlLTEwbyAlLTEwbHUgJS0xMGxkICUtNnMgJS02c1xuIiwgCgkJCQlpcGNwLT5tb2RlICYgMDc3NywKCQkJCS8qCgkJCQkgKiBlYXJsaWVyOiBpbnQsIEF1c3RpbiBoYXMgc2l6ZV90CgkJCQkgKi8KCQkJCSh1bnNpZ25lZCBsb25nKSBzaG1zZWcuc2htX3NlZ3N6LAoJCQkJLyoKCQkJCSAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKCQkJCSAqIEF1c3RpbiBoYXMgc2htYXR0X3QKCQkJCSAqLwoJCQkJKGxvbmcpIHNobXNlZy5zaG1fbmF0dGNoLAoJCQkJaXBjcC0+bW9kZSAmIFNITV9ERVNUID8gImRlc3QiIDogIiAiLAoJCQkJaXBjcC0+bW9kZSAmIFNITV9MT0NLRUQgPyAibG9ja2VkIiA6ICIgIik7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybjsKfQoKCnZvaWQgZG9fc2VtIChjaGFyIGZvcm1hdCkKewoJaW50IG1heGlkLCBzZW1pZCwgaWQ7CglzdHJ1Y3Qgc2VtaWRfZHMgc2VtYXJ5OwoJc3RydWN0IHNlbWluZm8gc2VtaW5mbzsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzZW1hcnkuc2VtX3Blcm07CglzdHJ1Y3QgcGFzc3dkICpwdzsKCXVuaW9uIHNlbXVuIGFyZzsKCglhcmcuYXJyYXkgPSAodXNob3J0ICopICAodm9pZCAqKSAmc2VtaW5mbzsKCW1heGlkID0gc2VtY3RsICgwLCAwLCBTRU1fSU5GTywgYXJnKTsKCWlmIChtYXhpZCA8IDApIHsKCQliYl9wcmludGYgKCJrZXJuZWwgbm90IGNvbmZpZ3VyZWQgZm9yIHNlbWFwaG9yZXNcbiIpOwoJCXJldHVybjsKCX0KCQoJc3dpdGNoIChmb3JtYXQpIHsKCWNhc2UgTElNSVRTOgoJCWJiX3ByaW50ZiAoIi0tLS0tLSBTZW1hcGhvcmUgTGltaXRzIC0tLS0tLS0tXG4iKTsKCQlhcmcuYXJyYXkgPSAodXNob3J0ICopICh2b2lkICopICZzZW1pbmZvOyAvKiBkYW1uIHVuaW9uICovCgkJaWYgKChzZW1jdGwgKDAsIDAsIElQQ19JTkZPLCBhcmcpKSA8IDAgKQoJCQlyZXR1cm47CgkJYmJfcHJpbnRmICgibWF4IG51bWJlciBvZiBhcnJheXMgPSAlZFxuIiwgc2VtaW5mby5zZW1tbmkpOwoJCWJiX3ByaW50ZiAoIm1heCBzZW1hcGhvcmVzIHBlciBhcnJheSA9ICVkXG4iLCBzZW1pbmZvLnNlbW1zbCk7CgkJYmJfcHJpbnRmICgibWF4IHNlbWFwaG9yZXMgc3lzdGVtIHdpZGUgPSAlZFxuIiwgc2VtaW5mby5zZW1tbnMpOwoJCWJiX3ByaW50ZiAoIm1heCBvcHMgcGVyIHNlbW9wIGNhbGwgPSAlZFxuIiwgc2VtaW5mby5zZW1vcG0pOwoJCWJiX3ByaW50ZiAoInNlbWFwaG9yZSBtYXggdmFsdWUgPSAlZFxuIiwgc2VtaW5mby5zZW12bXgpOwoJCXJldHVybjsKCgljYXNlIFNUQVRVUzoKCQliYl9wcmludGYgKCItLS0tLS0gU2VtYXBob3JlIFN0YXR1cyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgidXNlZCBhcnJheXMgPSAlZFxuIiwgc2VtaW5mby5zZW11c3opOwoJCWJiX3ByaW50ZiAoImFsbG9jYXRlZCBzZW1hcGhvcmVzID0gJWRcbiIsIHNlbWluZm8uc2VtYWVtKTsKCQlyZXR1cm47CgoJY2FzZSBDUkVBVE9SOgoJCWJiX3ByaW50ZiAoIi0tLS0tLSBTZW1hcGhvcmUgQXJyYXlzIENyZWF0b3JzL093bmVycyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCgkJICJzZW1pZCIsInBlcm1zIiwiY3VpZCIsImNnaWQiLCJ1aWQiLCJnaWQiKTsKCQlicmVhazsKCgljYXNlIFRJTUU6CgkJYmJfcHJpbnRmICgiLS0tLS0tIFNoYXJlZCBNZW1vcnkgT3BlcmF0aW9uL0NoYW5nZSBUaW1lcyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiJS04cyAlLTEwcyAlLTI2LjI0cyAlLTI2LjI0c1xuIiwKCQkJInNobWlkIiwib3duZXIiLCJsYXN0LW9wIiwibGFzdC1jaGFuZ2VkIik7CgkJYnJlYWs7CgoJY2FzZSBQSUQ6CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQliYl9wcmludGYgKCItLS0tLS0gU2VtYXBob3JlIEFycmF5cyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsIAoJCQkia2V5Iiwic2VtaWQiLCJvd25lciIsInBlcm1zIiwibnNlbXMiKTsKCQlicmVhazsKCX0KCglmb3IgKGlkID0gMDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKCQlhcmcuYnVmID0gKHN0cnVjdCBzZW1pZF9kcyAqKSAmc2VtYXJ5OwoJCXNlbWlkID0gc2VtY3RsIChpZCwgMCwgU0VNX1NUQVQsIGFyZyk7CgkJaWYgKHNlbWlkIDwgMCkKCQkJY29udGludWU7CgkJaWYgKGZvcm1hdCA9PSBDUkVBVE9SKSAgewoJCQlwcmludF9wZXJtcyAoc2VtaWQsIGlwY3ApOwoJCQljb250aW51ZTsKCQl9CgkJcHcgPSBnZXRwd3VpZChpcGNwLT51aWQpOwoJCXN3aXRjaCAoZm9ybWF0KSB7CgkJY2FzZSBUSU1FOiAKCQkJaWYgKHB3KQoJCQkJYmJfcHJpbnRmICgiJS04ZCAlLTEwLjEwcyIsIHNlbWlkLCBwdy0+cHdfbmFtZSk7CgkJCWVsc2UKCQkJCWJiX3ByaW50ZiAoIiUtOGQgJS0xMGQiLCBzZW1pZCwgaXBjcC0+dWlkKTsKCQkJYmJfcHJpbnRmICgiICAlLTI2LjI0cyIsIHNlbWFyeS5zZW1fb3RpbWUKCQkJCT8gY3RpbWUoJnNlbWFyeS5zZW1fb3RpbWUpIDogIk5vdCBzZXQiKTsKCQkJYmJfcHJpbnRmICgiICUtMjYuMjRzXG4iLCBzZW1hcnkuc2VtX2N0aW1lCgkJCQk/IGN0aW1lKCZzZW1hcnkuc2VtX2N0aW1lKSA6ICJOb3Qgc2V0Iik7CgkJCWJyZWFrOwoJCWNhc2UgUElEOgoJCQlicmVhazsKCQkJCgkJZGVmYXVsdDoKCQkJCWJiX3ByaW50ZigiMHglMDh4ICIsIGlwY3AtPktFWSk7CgkJCWlmIChwdykKCQkJCWJiX3ByaW50ZiAoIiUtMTBkICUtMTAuOXMiLCBzZW1pZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQliYl9wcmludGYgKCIlLTEwZCAlLTlkIiwgc2VtaWQsIGlwY3AtPnVpZCk7CgkJCQkJYmJfcHJpbnRmICgiJS0xMG8gJS0xMGxkXG4iLAoJCQkJaXBjcC0+bW9kZSAmIDA3NzcsCgkJCQkvKgoJCQkJICogZ2xpYmMtMi4xLjMgYW5kIGVhcmxpZXIgaGFzIHVuc2lnbmVkIHNob3J0OwoJCQkJICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgoJCQkJICogdW5zaWduZWQgc2hvcnQgYW5kIHVuc2lnbmVkIGxvbmcKCQkJCSAqIEF1c3RpbiBwcmVzY3JpYmVzIHVuc2lnbmVkIHNob3J0LgoJCQkJICovCgkJCQkobG9uZykgc2VtYXJ5LnNlbV9uc2Vtcyk7CgkJCWJyZWFrOwoJCX0KCX0KfQoKCnZvaWQgZG9fbXNnIChjaGFyIGZvcm1hdCkKewoJaW50IG1heGlkLCBtc3FpZCwgaWQ7CglzdHJ1Y3QgbXNxaWRfZHMgbXNncXVlOwoJc3RydWN0IG1zZ2luZm8gbXNnaW5mbzsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZtc2dxdWUubXNnX3Blcm07CglzdHJ1Y3QgcGFzc3dkICpwdzsKCgltYXhpZCA9IG1zZ2N0bCAoMCwgTVNHX0lORk8sIChzdHJ1Y3QgbXNxaWRfZHMgKikgKHZvaWQgKikgJm1zZ2luZm8pOwoJaWYgKG1heGlkIDwgMCkgewoJCWJiX3ByaW50ZiAoImtlcm5lbCBub3QgY29uZmlndXJlZCBmb3IgbWVzc2FnZSBxdWV1ZXNcbiIpOwoJCXJldHVybjsKCX0KCQoJc3dpdGNoIChmb3JtYXQpIHsKCWNhc2UgTElNSVRTOgoJCWlmICgobXNnY3RsICgwLCBJUENfSU5GTywgKHN0cnVjdCBtc3FpZF9kcyAqKSAodm9pZCAqKSAmbXNnaW5mbykpIDwgMCApCgkJCXJldHVybjsKCQliYl9wcmludGYgKCItLS0tLS0gTWVzc2FnZXM6IExpbWl0cyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgibWF4IHF1ZXVlcyBzeXN0ZW0gd2lkZSA9ICVkXG4iLCBtc2dpbmZvLm1zZ21uaSk7CgkJYmJfcHJpbnRmICgibWF4IHNpemUgb2YgbWVzc2FnZSAoYnl0ZXMpID0gJWRcbiIsIG1zZ2luZm8ubXNnbWF4KTsKCQliYl9wcmludGYgKCJkZWZhdWx0IG1heCBzaXplIG9mIHF1ZXVlIChieXRlcykgPSAlZFxuIiwgbXNnaW5mby5tc2dtbmIpOwoJCXJldHVybjsKCgljYXNlIFNUQVRVUzoKCQliYl9wcmludGYgKCItLS0tLS0gTWVzc2FnZXM6IFN0YXR1cyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiYWxsb2NhdGVkIHF1ZXVlcyA9ICVkXG4iLCBtc2dpbmZvLm1zZ3Bvb2wpOwoJCWJiX3ByaW50ZiAoInVzZWQgaGVhZGVycyA9ICVkXG4iLCBtc2dpbmZvLm1zZ21hcCk7CgkJYmJfcHJpbnRmICgidXNlZCBzcGFjZSA9ICVkIGJ5dGVzXG4iLCBtc2dpbmZvLm1zZ3RxbCk7CgkJcmV0dXJuOwoKCWNhc2UgQ1JFQVRPUjoKCQliYl9wcmludGYgKCItLS0tLS0gTWVzc2FnZSBRdWV1ZXM6IENyZWF0b3JzL093bmVycyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCgkJICJtc3FpZCIsInBlcm1zIiwiY3VpZCIsImNnaWQiLCJ1aWQiLCJnaWQiKTsKCQlicmVhazsKCgljYXNlIFRJTUU6CgkJYmJfcHJpbnRmICgiLS0tLS0tIE1lc3NhZ2UgUXVldWVzIFNlbmQvUmVjdi9DaGFuZ2UgVGltZXMgLS0tLS0tLS1cbiIpOwoJCWJiX3ByaW50ZiAoIiUtOHMgJS0xMHMgJS0yMHMgJS0yMHMgJS0yMHNcbiIsCgkJCSJtc3FpZCIsIm93bmVyIiwic2VuZCIsInJlY3YiLCJjaGFuZ2UiKTsKCQlicmVhazsKCgljYXNlIFBJRDoKCQliYl9wcmludGYgKCItLS0tLS0gTWVzc2FnZSBRdWV1ZXMgUElEcyAtLS0tLS0tLVxuIik7CgkJYmJfcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCgkJCSJtc3FpZCIsIm93bmVyIiwibHNwaWQiLCJscnBpZCIpOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYmJfcHJpbnRmICgiLS0tLS0tIE1lc3NhZ2UgUXVldWVzIC0tLS0tLS0tXG4iKTsKCQliYl9wcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEycyAlLTEyc1xuIiwKCQkJImtleSIsICJtc3FpZCIsICJvd25lciIsICJwZXJtcyIsInVzZWQtYnl0ZXMiLCAibWVzc2FnZXMiKTsKCQlicmVhazsKCX0KCglmb3IgKGlkID0gMDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKCQltc3FpZCA9IG1zZ2N0bCAoaWQsIE1TR19TVEFULCAmbXNncXVlKTsKCQlpZiAobXNxaWQgPCAwKQoJCQljb250aW51ZTsKCQlpZiAoZm9ybWF0ID09IENSRUFUT1IpICB7CgkJCXByaW50X3Blcm1zIChtc3FpZCwgaXBjcCk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CgkJc3dpdGNoIChmb3JtYXQpIHsKCQljYXNlIFRJTUU6CgkJCWlmIChwdykKCQkJCWJiX3ByaW50ZiAoIiUtOGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQliYl9wcmludGYgKCIlLThkICUtMTBkIiwgbXNxaWQsIGlwY3AtPnVpZCk7CgkJCWJiX3ByaW50ZiAoIiAlLTIwLjE2cyIsIG1zZ3F1ZS5tc2dfc3RpbWUKCQkJCT8gY3RpbWUoJm1zZ3F1ZS5tc2dfc3RpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CgkJCWJiX3ByaW50ZiAoIiAlLTIwLjE2cyIsIG1zZ3F1ZS5tc2dfcnRpbWUKCQkJCT8gY3RpbWUoJm1zZ3F1ZS5tc2dfcnRpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CgkJCWJiX3ByaW50ZiAoIiAlLTIwLjE2c1xuIiwgbXNncXVlLm1zZ19jdGltZQoJCQkJPyBjdGltZSgmbXNncXVlLm1zZ19jdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKCQkJYnJlYWs7CgkJY2FzZSBQSUQ6CgkJCWlmIChwdykKCQkJCWJiX3ByaW50ZiAoIiUtOGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQliYl9wcmludGYgKCIlLThkICUtMTBkIiwgbXNxaWQsIGlwY3AtPnVpZCk7CgkJCWJiX3ByaW50ZiAoIiAgJTVkICAgICAlNWRcbiIsCgkJCQltc2dxdWUubXNnX2xzcGlkLCBtc2dxdWUubXNnX2xycGlkKTsKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCQliYl9wcmludGYoICIweCUwOHggIixpcGNwLT5LRVkgKTsKCQkJaWYgKHB3KQoJCQkJYmJfcHJpbnRmICgiJS0xMGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQliYl9wcmludGYgKCIlLTEwZCAlLTEwZCIsIG1zcWlkLCBpcGNwLT51aWQpOwoJCQkJCWJiX3ByaW50ZiAoIiAlLTEwbyAlLTEybGQgJS0xMmxkXG4iLAoJCQkJaXBjcC0+bW9kZSAmIDA3NzcsCgkJCQkvKgoJCQkJICogZ2xpYmMtMi4xLjMgYW5kIGVhcmxpZXIgaGFzIHVuc2lnbmVkIHNob3J0OwoJCQkJICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgoJCQkJICogdW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIGxvbmcKCQkJCSAqIEF1c3RpbiBoYXMgbXNncW51bV90CgkJCQkgKi8KCQkJCShsb25nKSBtc2dxdWUubXNnX2NieXRlcywKCQkJCShsb25nKSBtc2dxdWUubXNnX3FudW0pOwoJCQlicmVhazsKCQl9Cgl9CglyZXR1cm47Cn0KCgp2b2lkIHByaW50X3NobSAoaW50IHNobWlkKQp7CglzdHJ1Y3Qgc2htaWRfZHMgc2htZHM7CglzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmc2htZHMuc2htX3Blcm07CgoJaWYgKHNobWN0bCAoc2htaWQsIElQQ19TVEFULCAmc2htZHMpID09IC0xKSB7CgkJcGVycm9yICgic2htY3RsICIpOwoJCXJldHVybjsKCX0KCgliYl9wcmludGYgKCJcblNoYXJlZCBtZW1vcnkgU2VnbWVudCBzaG1pZD0lZFxuIiwgc2htaWQpOwoJYmJfcHJpbnRmICgidWlkPSVkXHRnaWQ9JWRcdGN1aWQ9JWRcdGNnaWQ9JWRcbiIsCgkJaXBjcC0+dWlkLCBpcGNwLT5naWQsIGlwY3AtPmN1aWQsIGlwY3AtPmNnaWQpOwoJYmJfcHJpbnRmICgibW9kZT0lI29cdGFjY2Vzc19wZXJtcz0lI29cbiIsCgkJaXBjcC0+bW9kZSwgaXBjcC0+bW9kZSAmIDA3NzcpOwoJYmJfcHJpbnRmICgiYnl0ZXM9JWxkXHRscGlkPSVkXHRjcGlkPSVkXHRuYXR0Y2g9JWxkXG4iLAoJCShsb25nKSBzaG1kcy5zaG1fc2Vnc3osIHNobWRzLnNobV9scGlkLCBzaG1kcy5zaG1fY3BpZCwKCQkobG9uZykgc2htZHMuc2htX25hdHRjaCk7CgliYl9wcmludGYgKCJhdHRfdGltZT0lLTI2LjI0c1xuIiwKCQlzaG1kcy5zaG1fYXRpbWUgPyBjdGltZSAoJnNobWRzLnNobV9hdGltZSkgOiAiTm90IHNldCIpOwoJYmJfcHJpbnRmICgiZGV0X3RpbWU9JS0yNi4yNHNcbiIsCgkJc2htZHMuc2htX2R0aW1lID8gY3RpbWUgKCZzaG1kcy5zaG1fZHRpbWUpIDogIk5vdCBzZXQiKTsKCWJiX3ByaW50ZiAoImNoYW5nZV90aW1lPSUtMjYuMjRzXG4iLCBjdGltZSAoJnNobWRzLnNobV9jdGltZSkpOwoJYmJfcHJpbnRmICgiXG4iKTsKCXJldHVybjsKfQoKCnZvaWQgcHJpbnRfbXNnIChpbnQgbXNxaWQpCnsKCXN0cnVjdCBtc3FpZF9kcyBidWY7CglzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmYnVmLm1zZ19wZXJtOwoKCWlmIChtc2djdGwgKG1zcWlkLCBJUENfU1RBVCwgJmJ1ZikgPT0gLTEpIHsKCQlwZXJyb3IgKCJtc2djdGwgIik7CgkJcmV0dXJuOwoJfQoKCWJiX3ByaW50ZiAoIlxuTWVzc2FnZSBRdWV1ZSBtc3FpZD0lZFxuIiwgbXNxaWQpOwoJYmJfcHJpbnRmICgidWlkPSVkXHRnaWQ9JWRcdGN1aWQ9JWRcdGNnaWQ9JWRcdG1vZGU9JSNvXG4iLAoJCWlwY3AtPnVpZCwgaXBjcC0+Z2lkLCBpcGNwLT5jdWlkLCBpcGNwLT5jZ2lkLCBpcGNwLT5tb2RlKTsKCWJiX3ByaW50ZiAoImNieXRlcz0lbGRcdHFieXRlcz0lbGRcdHFudW09JWxkXHRsc3BpZD0lZFx0bHJwaWQ9JWRcbiIsCgkJLyoKCQkgKiBnbGliYy0yLjEuMyBhbmQgZWFybGllciBoYXMgdW5zaWduZWQgc2hvcnQ7CgkJICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgoJCSAqIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nCgkJICogQXVzdGluIGhhcyBtc2dxbnVtX3QgKGZvciBtc2dfcWJ5dGVzKQoJCSAqLwoJCShsb25nKSBidWYubXNnX2NieXRlcywgKGxvbmcpIGJ1Zi5tc2dfcWJ5dGVzLAoJCShsb25nKSBidWYubXNnX3FudW0sIGJ1Zi5tc2dfbHNwaWQsIGJ1Zi5tc2dfbHJwaWQpOwoJYmJfcHJpbnRmICgic2VuZF90aW1lPSUtMjYuMjRzXG4iLAoJCWJ1Zi5tc2dfc3RpbWUgPyBjdGltZSAoJmJ1Zi5tc2dfc3RpbWUpIDogIk5vdCBzZXQiKTsKCWJiX3ByaW50ZiAoInJjdl90aW1lPSUtMjYuMjRzXG4iLAoJCWJ1Zi5tc2dfcnRpbWUgPyBjdGltZSAoJmJ1Zi5tc2dfcnRpbWUpIDogIk5vdCBzZXQiKTsKCWJiX3ByaW50ZiAoImNoYW5nZV90aW1lPSUtMjYuMjRzXG4iLAoJCWJ1Zi5tc2dfY3RpbWUgPyBjdGltZSAoJmJ1Zi5tc2dfY3RpbWUpIDogIk5vdCBzZXQiKTsKCWJiX3ByaW50ZiAoIlxuIik7CglyZXR1cm47Cn0KCnZvaWQgcHJpbnRfc2VtIChpbnQgc2VtaWQpCnsKCXN0cnVjdCBzZW1pZF9kcyBzZW1kczsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzZW1kcy5zZW1fcGVybTsKCXVuaW9uIHNlbXVuIGFyZzsKCWludCBpOwoKCWFyZy5idWYgPSAmc2VtZHM7CglpZiAoc2VtY3RsIChzZW1pZCwgMCwgSVBDX1NUQVQsIGFyZykgPCAwKSB7CgkJcGVycm9yICgic2VtY3RsICIpOwoJCXJldHVybjsKCX0KCgliYl9wcmludGYgKCJcblNlbWFwaG9yZSBBcnJheSBzZW1pZD0lZFxuIiwgc2VtaWQpOwoJYmJfcHJpbnRmICgidWlkPSVkXHQgZ2lkPSVkXHQgY3VpZD0lZFx0IGNnaWQ9JWRcbiIsCgkJaXBjcC0+dWlkLCBpcGNwLT5naWQsIGlwY3AtPmN1aWQsIGlwY3AtPmNnaWQpOwoJYmJfcHJpbnRmICgibW9kZT0lI28sIGFjY2Vzc19wZXJtcz0lI29cbiIsCgkJaXBjcC0+bW9kZSwgaXBjcC0+bW9kZSAmIDA3NzcpOwoJYmJfcHJpbnRmICgibnNlbXMgPSAlbGRcbiIsIChsb25nKSBzZW1kcy5zZW1fbnNlbXMpOwoJYmJfcHJpbnRmICgib3RpbWUgPSAlLTI2LjI0c1xuIiwKCQlzZW1kcy5zZW1fb3RpbWUgPyBjdGltZSAoJnNlbWRzLnNlbV9vdGltZSkgOiAiTm90IHNldCIpOwoJYmJfcHJpbnRmICgiY3RpbWUgPSAlLTI2LjI0c1xuIiwgY3RpbWUgKCZzZW1kcy5zZW1fY3RpbWUpKTsJCgoJYmJfcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCgkJInNlbW51bSIsInZhbHVlIiwibmNvdW50IiwiemNvdW50IiwicGlkIik7CgoJYXJnLnZhbCA9IDA7Cglmb3IgKGk9MDsgaTwgc2VtZHMuc2VtX25zZW1zOyBpKyspIHsKCQlpbnQgdmFsLCBuY250LCB6Y250LCBwaWQ7CgkJdmFsID0gc2VtY3RsIChzZW1pZCwgaSwgR0VUVkFMLCBhcmcpOwoJCW5jbnQgPSBzZW1jdGwgKHNlbWlkLCBpLCBHRVROQ05ULCBhcmcpOwoJCXpjbnQgPSBzZW1jdGwgKHNlbWlkLCBpLCBHRVRaQ05ULCBhcmcpOwoJCXBpZCA9IHNlbWN0bCAoc2VtaWQsIGksIEdFVFBJRCwgYXJnKTsKCQlpZiAodmFsIDwgMCB8fCBuY250IDwgMCB8fCB6Y250IDwgMCB8fCBwaWQgPCAwKSB7CgkJCXBlcnJvciAoInNlbWN0bCAiKTsKCQkJYmJfZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCAoMSk7CgkJfQoJCWJiX3ByaW50ZiAoIiUtMTBkICUtMTBkICUtMTBkICUtMTBkICUtMTBkXG4iLAoJCQlpLCB2YWwsIG5jbnQsIHpjbnQsIHBpZCk7Cgl9CgliYl9wcmludGYgKCJcbiIpOwoJcmV0dXJuOwp9Cg==