LyoKICogV1BBIFN1cHBsaWNhbnQgLSBkcml2ZXIgaW50ZXJhY3Rpb24gd2l0aCBUSSBzdGF0aW9uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgQlNECiAqIGxpY2Vuc2UuCiAqCiAqLwoKLyogQ29weXJpZ2h0IKkgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIChPY3QgMjAwNSkKICogVEhJUyBDT0RFL1BST0dSQU0gSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKICogRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVERUQgQlVUIE5PVCBMSU1JVEVEIFRPICwgVEhFIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAKICogVGhpcyBwcm9ncmFtIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaXRzIG9yaWdpbmFsIG9wZXJhdGlvbiBieSBUZXhhcyAKICogSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkLiBUaGVzZSBjaGFuZ2VzIGFyZSBjb3ZlcmVkIHVuZGVyIHZlcnNpb24gMiAKICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBkYXRlZCBKdW5lIDE5OTEuCiAqCiAqIENvcHlyaWdodCCpIEdvb2dsZSBJbmMgKEZlYiAyMDA4KQoqLwovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAiaW5jbHVkZXMuaCIKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNpbmNsdWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgImNvbW1vbi5oIgojaW5jbHVkZSAiZHJpdmVyLmgiCiNpbmNsdWRlICJlbG9vcC5oIgojaW5jbHVkZSAid3BhLmgiCiNpbmNsdWRlICJ3cGFfc3VwcGxpY2FudC5oIgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3cGFfc3VwcGxpY2FudF9pLmgiCiNpbmNsdWRlICJ3cGFfaS5oIgojaW5jbHVkZSAibDJfcGFja2V0LmgiCiNpbmNsdWRlICJ3cGFfY3RybC5oIgovKi0tLS0tIFNUQV9ESyBmaWxlcyAtLS0tLSovCiNpbmNsdWRlICJ3c3BWZXIuaCIKI2luY2x1ZGUgImRyaXZlcl90aS5oIgojaW5jbHVkZSAic2Nhbm1lcmdlLmgiCiNpbmNsdWRlICJzY2FuTW5nclR5cGVzLmgiCiNpZmRlZiBBTkRST0lECiNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgojZW5kaWYKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2RlZmluZSBUSV9EUklWRVJfTVNHX1BPUlQgICAgICAgOTAwMAojZGVmaW5lIFJYX1NFTEZfRklMVEVSICAgICAgICAgICAwCiNkZWZpbmUgUlhfQlJPQURDQVNUX0ZJTFRFUiAgICAgIDEKI2RlZmluZSBSWF9JUFY0X01VTFRJQ0FTVF9GSUxURVIgMgojZGVmaW5lIFJYX0lQVjZfTVVMVElDQVNUX0ZJTFRFUiAzCiNkZWZpbmUgVEkyV1BBX1NUQVRVUyhzKSAgICAgICAgICgoKHMpICE9IE9LKSA/IC0xIDogMCkKI2RlZmluZSBUSV9DSEVDS19EUklWRVIoZixyKSAgICAgXAogICAgaWYoICEoZikgKSB7IFwKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiVEk6IERyaXZlciBub3QgaW5pdGlhbGl6ZWQgeWV0Li4uYWJvcnRpbmcuLi4iKTsgXAogICAgICAgIHJldHVybiggciApOyBcCiAgICB9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIExvY2sgZmlsZSBwb2ludGVyIC0gdXNlZCB0byBhY2Nlc3MgcGlkLWxvY2stZmlsZSB0byBwcmV2ZW50IHR3byBpbnN0YW5jZXMgb2Ygd3BhX3N1cHBsaWNhbnQgKi8KI2lmZGVmIENPTkZJR19USV9MT0NLRklMRQpzdGF0aWMgaW50IGxmcDsKI2VuZGlmCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogY2hlY2tfYW5kX2dldF9idWlsZF9jaGFubmVscwpSb3V0aW5lIERlc2NyaXB0aW9uOiBnZXQgbnVtYmVyIG9mIGFsbG93ZWQgY2hhbm5lbHMgYWNjb3JkaW5nIHRvIGEgYnVpbGQgdmFyLgpBcmd1bWVudHM6IE5vbmUKUmV0dXJuIFZhbHVlOiBOdW1iZXIgb2YgY2hhbm5lbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IGNoZWNrX2FuZF9nZXRfYnVpbGRfY2hhbm5lbHMoIHZvaWQgKQp7CiNpZmRlZiBBTkRST0lECiAgICBjaGFyIHByb3Bfc3RhdHVzW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICBjaGFyICpwcm9wX25hbWUgPSAicm8ud2lmaS5jaGFubmVscyI7CiAgICBpbnQgaSwgZGVmYXVsdF9jaGFubmVscyA9IE5VTUJFUl9TQ0FOX0NIQU5ORUxTX0VUU0k7CgogICAgaWYoIHByb3BlcnR5X2dldChwcm9wX25hbWUsIHByb3Bfc3RhdHVzLCBOVUxMKSApIHsKICAgICAgICBpID0gYXRvaShwcm9wX3N0YXR1cyk7CiAgICAgICAgaWYoIGkgIT0gMCApCiAgICAgICAgICAgIGRlZmF1bHRfY2hhbm5lbHMgPSBpOwogICAgfQogICAgcmV0dXJuKCBkZWZhdWx0X2NoYW5uZWxzICk7CiNlbHNlCiAgICByZXR1cm4oIE5VTUJFUl9TQ0FOX0NIQU5ORUxTX0ZDQyApOwojZW5kaWYKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZXZlbnRfcmVjZWl2ZQpSb3V0aW5lIERlc2NyaXB0aW9uOiBkcml2ZXIgZXZlbnRzIGNhbGxiYWNrLCBjYWxsZWQgZnJvbSBkcml2ZXIgSVBDCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBwRGF0YSAtIHBvaW50ZXIgdG8gZXZlbnQgaW5mb3JtYXRpb24KUmV0dXJuIFZhbHVlOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgd3BhX2RyaXZlcl90aXN0YV9ldmVudF9yZWNlaXZlKCBJUENfRVZfREFUQSAqcERhdGEgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteVN1cHBsOwogICAgc3RydWN0IHNvY2thZGRyX2luIGVjaG9zZXJ2ZXI7CiAgICBpbnQgcmVzLCBtc2dfc2l6ZTsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9ldmVudF9yZWNlaXZlIGNhbGxlZDogJWQiLAogICAgICAgICAgICAgICBwRGF0YS0+dUJ1ZmZlclNpemUpOwoKICAgIG15U3VwcGwgPSBwRGF0YS0+RXZQYXJhbXMuaFVzZXJQYXJhbTsKICAgIG1zZ19zaXplID0gKGludCkocERhdGEtPnVCdWZmZXJTaXplICsgb2Zmc2V0b2YoSVBDX0VWX0RBVEEsIHVCdWZmZXIpKTsKCiAgICBvc19tZW1zZXQoICZlY2hvc2VydmVyLCAwLCBzaXplb2YoZWNob3NlcnZlcikgKTsgICAgIC8qIENsZWFyIHN0cnVjdCAqLwogICAgZWNob3NlcnZlci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5ldC9JUCAqLwogICAgZWNob3NlcnZlci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoIjEyNy4wLjAuMSIpOyAvKiBJUCBhZGRyZXNzICovCiAgICBlY2hvc2VydmVyLnNpbl9wb3J0ID0gaHRvbnMoVElfRFJJVkVSX01TR19QT1JUKTsgICAgIC8qIHNlcnZlciBwb3J0ICovCgogICAgcmVzID0gc2VuZHRvKG15U3VwcGwtPmRyaXZlckV2ZW50c1NvY2tldCwgcERhdGEsIG1zZ19zaXplLCAwLCAoc3RydWN0IHNvY2thZGRyICopJmVjaG9zZXJ2ZXIsIHNpemVvZihlY2hvc2VydmVyKSk7CiAgICBlY2hvc2VydmVyLnNpbl9wb3J0ID0gaHRvbnMoVElfRFJJVkVSX01TR19QT1JUICsgMSk7CiAgICByZXMgPSBzZW5kdG8obXlTdXBwbC0+ZHJpdmVyRXZlbnRzU29ja2V0LCBwRGF0YSwgbXNnX3NpemUsIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmZWNob3NlcnZlciwgc2l6ZW9mKGVjaG9zZXJ2ZXIpKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfcmVnaXN0ZXJfZXZlbnRzClJvdXRpbmUgRGVzY3JpcHRpb246IHJlZ2lzdGVyIHRvIGRyaXZlciBldmVudHMKQXJndW1lbnRzOgogICBjdHggLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKUmV0dXJuIFZhbHVlOiBOb25lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFfZHJpdmVyX3Rpc3RhX3JlZ2lzdGVyX2V2ZW50cyggdm9pZCAqY3R4ICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKWN0eDsKICAgIElQQ19FVkVOVF9QQVJBTVMgcEV2ZW50OwogICAgaW50IGk7CgogICAgb3NfbWVtc2V0KCBteURydi0+aEV2ZW50cywgMCwgc2l6ZW9mKFVMT05HKSAqIElQQ19FVkVOVF9NQVggKTsKICAgIGZvcihpPUlQQ19FVkVOVF9BU1NPQ0lBVEVEOyggaSA8IElQQ19FVkVOVF9NQVggKTtpKyspIHsKICAgICAgICAvKiBSZWdpc3RlciB0byByZWNlaXZlIGRyaXZlciBldmVudHMgKi8KICAgICAgICBwRXZlbnQudUV2ZW50VHlwZSAgICAgICA9IGk7CiAgICAgICAgcEV2ZW50LnVEZWxpdmVyeVR5cGUgICAgPSBERUxJVkVSWV9QVVNIOwogICAgICAgIHBFdmVudC5oVXNlclBhcmFtICAgICAgID0gKFRJX0hBTkRMRSlteURydjsKICAgICAgICBwRXZlbnQucGZFdmVudENhbGxiYWNrICA9IChUSV9FVkVOVF9DQUxMQkFDSyl3cGFfZHJpdmVyX3Rpc3RhX2V2ZW50X3JlY2VpdmU7CiAgICAgICAgVElfUmVnaXN0ZXJFdmVudCggbXlEcnYtPmhEcml2ZXIsICZwRXZlbnQgKTsKICAgICAgICBteURydi0+aEV2ZW50c1tpXSA9IHBFdmVudC51RXZlbnRJRDsKICAgIH0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfdW5yZWdpc3Rlcl9ldmVudHMKUm91dGluZSBEZXNjcmlwdGlvbjogdW5yZWdpc3RlciBkcml2ZXIgZXZlbnRzCkFyZ3VtZW50czoKICAgY3R4IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlClJldHVybiBWYWx1ZTogTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgd3BhX2RyaXZlcl90aXN0YV91bnJlZ2lzdGVyX2V2ZW50cyggdm9pZCAqY3R4ICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKWN0eDsKICAgIElQQ19FVkVOVF9QQVJBTVMgcEV2ZW50OwogICAgaW50IGlkeDsKCiAgICBmb3IoaWR4PTA7KCBpZHggPCBJUENfRVZFTlRfTUFYICk7aWR4KyspIHsKICAgICAgICBpZiggbXlEcnYtPmhFdmVudHNbaWR4XSApIHsKICAgICAgICAgICAgcEV2ZW50LnVFdmVudFR5cGUgPSBpZHg7CiAgICAgICAgICAgIHBFdmVudC51RXZlbnRJRCA9IG15RHJ2LT5oRXZlbnRzW2lkeF07CiAgICAgICAgICAgIFRJX1VuUmVnaXN0ZXJFdmVudCggbXlEcnYtPmhEcml2ZXIsICZwRXZlbnQgKTsKICAgICAgICB9CiAgICB9Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2dldF9ic3NpZApSb3V0aW5lIERlc2NyaXB0aW9uOiBnZXQgY3VycmVudCBCU1NJRCBmcm9tIGRyaXZlcgpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgYnNzaWQgLSBwb2ludGVyIHRvIGhvbGQgYnNzaWQKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkKCB2b2lkICpwcml2LCB1OCAqYnNzaWQgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIE9TXzgwMl8xMV9NQUNfQUREUkVTUyB0aUFQTWFjQWRkcjsKICAgIFRJX1NUQVRVUyByZXRWYWx1ZTsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIndwYV9kcml2ZXJfdGlzdGFfZ2V0X2Jzc2lkIGNhbGxlZCIpOwoKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgLyogR2V0IE1BQyBhZGRyZXNzIG9mIGN1cnJlbnQgQVAgKi8KICAgIGlmKCBUSV9HZXRCU1NJRCggbXlEcnYtPmhEcml2ZXIsICZ0aUFQTWFjQWRkciApICE9IFRJX1JFU1VMVF9PSyApCiAgICAgICAgcmV0dXJuKCAtMSApOwoKICAgIC8qIENvcHkgQlNTSUQgaW50byBjYWxsZXIgcG9pbnRlciBwcm92aWRlZCBpbiByb3V0aW5lIHBhcmFtZXRlcnMgKi8KICAgIG9zX21lbWNweSggKHZvaWQgKilic3NpZCwgKHZvaWQgKikmdGlBUE1hY0FkZHIsIE1BQ19BRERSX0xFTiApOwogICAgd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiZ2V0X2Jzc2lkOiIsIGJzc2lkLCBNQUNfQUREUl9MRU4pOwogICAgcmV0dXJuKCAwICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zc2lkClJvdXRpbmUgRGVzY3JpcHRpb246IGdldCBjdXJyZW50IFNTSUQKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHNzaWQgLSBwb2ludGVyIHRvIGhvbGQgY3VycmVudCBic3NpZApSZXR1cm4gVmFsdWU6IExlbmd0aCBvZiBTU0lEIHN0cmluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9nZXRfc3NpZCggdm9pZCAqcHJpdiwgdTggKnNzaWQgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIE9TXzgwMl8xMV9TU0lEIG15c3NpZDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9nZXRfc3NpZCBjYWxsZWQiKTsKCiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIC8qIEdldCBjdXJyZW50IFNTSUQgZnJvbSBkcml2ZXIgKi8KICAgIGlmKCBUSV9HZXRDdXJyZW50U1NJRChteURydi0+aERyaXZlciwgJm15c3NpZCkgIT0gVElfUkVTVUxUX09LICkKICAgICAgICByZXR1cm4oIC0xICk7CgogICAgLyogQ29weSB0byB1c2VyIHN1cHBsaWVkIHBvaW50ZXIgKi8KICAgIG9zX21lbWNweSggKHZvaWQgKilzc2lkLCAodm9pZCAqKSZteXNzaWQuU3NpZCwgbXlzc2lkLlNzaWRMZW5ndGggKTsKCiAgICAvKiBSZXR1cm4gbGVuZ3RoIG9mIFNTSUQgKi8KICAgIHJldHVybiggbXlzc2lkLlNzaWRMZW5ndGggKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3NzaWQKUm91dGluZSBEZXNjcmlwdGlvbjogc2V0cyBjdXJyZW50IFNTSUQgKEFzc29jaWF0ZXMpCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBzc2lkIC0gcG9pbnRlciB0byBzc2lkCiAgIHNzaWRfbGVuIC0gbGVuZ3RoIG9mIHNzaWQKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3NzaWQoIHZvaWQgKnByaXYsIGNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4gKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIGNoYXIgc3NpZEJ1ZltNQVhfU1NJRF9MRU5dOwogICAgaW50IHJldDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zZXRfc3NpZCBjYWxsZWQ6ICVzIiwgc3NpZCk7CgogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICAvKiBDb3B5IHVzZXIgc3VwcGxpZWQgU1NJRCBpbnRvIGxvY2FsIGJ1ZmZlciAqLwogICAgb3NfbWVtc2V0KCBzc2lkQnVmLCAwLCBNQVhfU1NJRF9MRU4gKTsKICAgIG9zX21lbWNweSggc3NpZEJ1Ziwgc3NpZCwgc3NpZF9sZW4gKTsKCiAgICAvKiBTZXQgbG9jYWwgU1NJRCBidWZmZXIgdG8gZHJpdmVyIC0gdHJpZ2dlcmluZyBjb25uZWN0aW9uIHByb2Nlc3MgaW4gZHJpdmVyICovCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiQXNzb2NpYXRlOiBTU0lEID0gJXMiLCBzc2lkQnVmKTsgLyogRG06ICovCiNpZmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICByZXQgPSAoaW50KVRJX1NldFNTSUQoIG15RHJ2LT5oRHJpdmVyLCAoY2hhciAqKXNzaWRCdWYgKTsKI2Vsc2UKICAgIHJldCA9IChpbnQpVElfU2V0U1NJRCggbXlEcnYtPmhEcml2ZXIsICh1OCAqKXNzaWRCdWYgKTsKI2VuZGlmCiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfd3BhClJvdXRpbmUgRGVzY3JpcHRpb246IGVuYWJsZS9kaXNhYmxlIFdQQSBzdXBwb3J0IGluIGRyaXZlciAtIG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBub3Qgc3VwcG9ydGVkIGluIGRyaXZlci4gYWxzbyBvYnNlbGV0ZSBmb3Igd3BhLXN1cHBsIGNvcmUKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGVuYWJsZWQgLSBlbmFibGUvZGlzYWJsZSBmbGFnClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGEodm9pZCAqcHJpdiwgaW50IGVuYWJsZWQpCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGEgY2FsbGVkOiAlZCIsZW5hYmxlZCk7CiAgICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3Byb3RvClJvdXRpbmUgRGVzY3JpcHRpb246IHNldCBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCAoV1BBL1dQQTIoUlNOKSkKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHByb3RvIC0gYXV0aGVudGljYXRpb24gc3VpdGUKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3Byb3RvKCB2b2lkICpwcml2LCBpbnQgcHJvdG8gKQp7CiAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwoKICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X3Byb3RvIGNhbGxlZDogJWQiLCBwcm90byk7CiAgIG15RHJ2LT5wcm90byA9IHByb3RvOwoKICAgcmV0dXJuKCAwICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGFfb3B0aW9ucwpSb3V0aW5lIERlc2NyaXB0aW9uOiBzZXQgd3BhX29wdGlvbnMKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHdwYV9vcHRpb25zIC0gV1BBIG9wdGlvbnMgKDAgLSBkaXNhYmxlLCAzIC0gZW5hYmxlKQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfd3BhX29wdGlvbnMoIHZvaWQgKnByaXYsIGludCBrZXlfbWdtdF9zdWl0ZSApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgVUlOVDMyIHdwYV9vcHQgPSBXUEFfT1BUSU9OU19ESVNBQkxFOwogICAgaW50IHJldDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zZXRfd3BhX29wdGlvbnMgY2FsbGVkOiAlZCIsIGtleV9tZ210X3N1aXRlKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgbXlEcnYtPmtleV9tZ210ID0ga2V5X21nbXRfc3VpdGU7CgogICAgc3dpdGNoKCBrZXlfbWdtdF9zdWl0ZSApIHsKICAgICAgICBjYXNlIEtFWV9NR01UXzgwMl8xWDogICAgICAgICAgLyogRG06IEVBUCAqLwogICAgICAgICAgICB3cGFfb3B0ID0gV1BBX09QVElPTlNfRU5BQkxFOyAvKiB3cGFfYXV0aCA9IDE7ICovCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEtFWV9NR01UX1BTSzogICAgICAgICAgICAgLyogRG06IFBTSyAqLwogICAgICAgICAgICB3cGFfb3B0ID0gV1BBX09QVElPTlNfRU5BQkxFOyAvKiB3cGFfYXV0aCA9IDI7ICovCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIEtFWV9NR01UXzgwMl8xWF9OT19XUEE6ICAgLyogRG06ID8/PyAqLwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBLRVlfTUdNVF9XUEFfTk9ORTogICAgICAgIC8qIERtOiA/Pz8gKi8KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgS0VZX01HTVRfTk9ORToKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3cGFfb3B0ID0gV1BBX09QVElPTlNfRElTQUJMRTsgLyogd3BhX2F1dGggPSAyNTU7ICovCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIC8qIFNldCBXUEEgT3B0aW9ucyAqLwogICAgcmV0ID0gVElfU2V0V3BhT3B0aW9ucyggbXlEcnYtPmhEcml2ZXIsIHdwYV9vcHQgKTsKICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3NldF9lbmNyeXB0aW9uClJvdXRpbmUgRGVzY3JpcHRpb246IHNldCBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCAoV1BBL1dQQTIoUlNOKSkKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHByb3RvIC0gYXV0aGVudGljYXRpb24gc3VpdGUKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2VuY3J5cHRpb24oIHZvaWQgKnByaXYsIGludCBlbmNyeXB0aW9uICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBpbnQgcmV0ID0gLTE7CiAgICBPU184MDJfMTFfRU5DUllQVElPTl9UWVBFUyB3cGFfY2lwaGVyID0gT1NfRU5DUllQVElPTl9UWVBFX05PTkU7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X2VuY3J5cHRpb24gY2FsbGVkOiAlZCIsZW5jcnlwdGlvbik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIG15RHJ2LT5lbmNyeXB0aW9uID0gZW5jcnlwdGlvbjsKICAgIHN3aXRjaCggZW5jcnlwdGlvbiApIHsKICAgICAgICBjYXNlIENJUEhFUl9XRVA0MDoKICAgICAgICBjYXNlIENJUEhFUl9XRVAxMDQ6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiZW5jcnlwdGlvbjogT1NfRU5DUllQVElPTl9UWVBFX1dFUCIpOwogICAgICAgICAgICB3cGFfY2lwaGVyID0gT1NfRU5DUllQVElPTl9UWVBFX1dFUDsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQ0lQSEVSX1RLSVA6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiZW5jcnlwdGlvbjogT1NfRU5DUllQVElPTl9UWVBFX1RLSVAiKTsKICAgICAgICAgICAgd3BhX2NpcGhlciA9IE9TX0VOQ1JZUFRJT05fVFlQRV9US0lQOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBDSVBIRVJfQ0NNUDoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJlbmNyeXB0aW9uOiBPU19FTkNSWVBUSU9OX1RZUEVfQUVTIik7CiAgICAgICAgICAgIHdwYV9jaXBoZXIgPSBPU19FTkNSWVBUSU9OX1RZUEVfQUVTOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBDSVBIRVJfTk9ORToKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgImVuY3J5cHRpb246IE9TX0VOQ1JZUFRJT05fVFlQRV9OT05FIik7CiAgICAgICAgICAgIHdwYV9jaXBoZXIgPSBPU19FTkNSWVBUSU9OX1RZUEVfTk9ORTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXQgPSBUSV9TZXRFbmNyeXB0aW9uVHlwZSggbXlEcnYtPmhEcml2ZXIsIHdwYV9jaXBoZXIgKTsKICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCB3cGFfZHJpdmVyX3Rpc3RhX3ByaW50X2F1dGhfbW9kZSggT1NfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgbXlBdXRoICkKewogICAgY2hhciAqbW9kZV9uYW1lID0gTlVMTDsKCiAgICBzd2l0Y2goIG15QXV0aCApIHsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVPcGVuOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZU9wZW4iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVTaGFyZWQ6CiAgICAgICAgICAgIG1vZGVfbmFtZSA9ICJvczgwMl8xMUF1dGhNb2RlU2hhcmVkIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBvczgwMl8xMUF1dGhNb2RlQXV0b1N3aXRjaDoKICAgICAgICAgICAgbW9kZV9uYW1lID0gIm9zODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBvczgwMl8xMUF1dGhNb2RlV1BBOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZVdQQSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2Ugb3M4MDJfMTFBdXRoTW9kZVdQQVBTSzoKICAgICAgICAgICAgbW9kZV9uYW1lID0gIm9zODAyXzExQXV0aE1vZGVXUEFQU0siOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVXUEFOb25lOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZVdQQU5vbmUiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVXUEEyOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZVdQQTIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVXUEEyUFNLOgogICAgICAgICAgICBtb2RlX25hbWUgPSAib3M4MDJfMTFBdXRoTW9kZVdQQTJQU0siOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIG9zODAyXzExQXV0aE1vZGVNYXg6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgbW9kZV9uYW1lID0gIlVua25vd24iOwogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiU2VsZWN0ZWQgQXV0aE1vZGU6ICVzIiwgbW9kZV9uYW1lKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2F1dGhfbW9kZQpSb3V0aW5lIERlc2NyaXB0aW9uOgpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2F1dGhfbW9kZSggdm9pZCAqcHJpdiApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgT1NfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZUF1dG9Td2l0Y2g7CiAgICBpbnQgcmV0OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NldF9hdXRoX21vZGUgY2FsbGVkIik7CgogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICB3cGFfZHJpdmVyX3Rpc3RhX3NldF9wcm90byggcHJpdiwgKChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKilteURydi0+aFdwYVN1cHBsaWNhbnQpLT53cGEtPnByb3RvICk7CiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgInByb3RvOiAlZCIsIG15RHJ2LT5wcm90byk7IC8qIHNob3VsZCBiZSBzZXQgQkVGT1JFICovCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgImF1dGhfYWxnOiAlZCIsbXlEcnYtPmF1dGhfYWxnKTsKCiAgICBpZiggKG15RHJ2LT5hdXRoX2FsZyA9PSBBVVRIX0FMR19PUEVOX1NZU1RFTSkgfHwKICAgICAgICAobXlEcnYtPmF1dGhfYWxnID09IEFVVEhfQUxHX0xFQVApICkgewogICAgICAgIHN3aXRjaCggbXlEcnYtPmtleV9tZ210ICkgewogICAgICAgICAgICBjYXNlIEtFWV9NR01UXzgwMl8xWDoKICAgICAgICAgICAgICAgIGlmKCBteURydi0+cHJvdG8gJiBXUEFfUFJPVE9fV1BBICkgewogICAgICAgICAgICAgICAgICAgIG15QXV0aCA9IG9zODAyXzExQXV0aE1vZGVXUEE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmKCBteURydi0+cHJvdG8gJiBXUEFfUFJPVE9fUlNOICkgewogICAgICAgICAgICAgICAgICAgIG15QXV0aCA9IG9zODAyXzExQXV0aE1vZGVXUEEyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgS0VZX01HTVRfUFNLOgogICAgICAgICAgICAgICAgaWYoIG15RHJ2LT5wcm90byAmIFdQQV9QUk9UT19XUEEgKSB7CiAgICAgICAgICAgICAgICAgICAgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZVdQQVBTSzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYoIG15RHJ2LT5wcm90byAmIFdQQV9QUk9UT19SU04gKSB7CiAgICAgICAgICAgICAgICAgICAgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZVdQQTJQU0s7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBLRVlfTUdNVF84MDJfMVhfTk9fV1BBOgogICAgICAgICAgICBjYXNlIEtFWV9NR01UX1dQQV9OT05FOgogICAgICAgICAgICAgICAgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZVdQQU5vbmU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBLRVlfTUdNVF9OT05FOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgbXlBdXRoID0gb3M4MDJfMTFBdXRoTW9kZU9wZW47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBteURydi0+YXV0aF9hbGcgPT0gQVVUSF9BTEdfU0hBUkVEX0tFWSApIHsKICAgICAgICBteUF1dGggPSBvczgwMl8xMUF1dGhNb2RlU2hhcmVkOwogICAgfQogICAgaWYoIG15RHJ2LT5hdXRoX2FsZyA9PSBBVVRIX0FMR19MRUFQICkgewogICAgICAgIFRJX1NldEVBUFR5cGUoIG15RHJ2LT5oRHJpdmVyLCBPU19FQVBfVFlQRV9MRUFQICk7CiAgICAgICAgVElfU2V0RUFQVHlwZURyaXZlciggbXlEcnYtPmhEcml2ZXIsIE9TX0VBUF9UWVBFX0xFQVAgKTsKICAgIH0KICAgIHdwYV9kcml2ZXJfdGlzdGFfcHJpbnRfYXV0aF9tb2RlKCBteUF1dGggKTsKICAgIHJldCA9IFRJX1NldEF1dGhlbnRpY2F0aW9uTW9kZSggbXlEcnYtPmhEcml2ZXIsIG15QXV0aCApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZGVsX2tleQpSb3V0aW5lIERlc2NyaXB0aW9uOiByZW1vdmUga2V5IGZyb20gZHJpdmVyCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBrZXlfaWR4IC0ga2V5IGluZGV4CiAgIGFkZHIgLSBrZXkgYWRkcmVzcyAodW5pY2FzdC9icm9hZGNhc3QpClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX2RlbF9rZXkodm9pZCAqcHJpdiwgaW50IGtleV9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBPU184MDJfMTFfUkVNT1ZFX0tFWSBteUtleTsKICAgIGludCByZXQ7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfZGVsX2tleSBjYWxsZWQiKTsKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJrZXlfaWR4ID0gJWQsIGFkZHIgPSAiIFRJTUFDU1RSLCBrZXlfaWR4LCBNQUMyU1RSKGFkZHIpKTsKCiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIC8qIGNvcHkgcGFyYW1ldGVycyAoTUFDIG9mIGtleSB0byByZW1vdmUsIGV0YykgdG8gbG9jYWwgc3RydWN0dXJlICovCiAgICBteUtleS5MZW5ndGggPSBzaXplb2YoT1NfODAyXzExX1JFTU9WRV9LRVkpOwogICAgb3NfbWVtY3B5KCZteUtleS5CU1NJRCxhZGRyLE1BQ19BRERSX0xFTik7CiAgICBteUtleS5LZXlJbmRleCA9IGtleV9pZHg7CgogICAgLyogQ2FsbCBVdGlsaXR5IGFkYXB0ZXIgdG8gcmVtb3ZlIHRoZSBrZXkgKi8KICAgIHJldCA9IFRJX1JlbW92ZUtleSggbXlEcnYtPmhEcml2ZXIsICZteUtleSApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2tleQpSb3V0aW5lIERlc2NyaXB0aW9uOiBzZXQga2V5IGluIGRyaXZlcgpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgYWxnIC0gdHlwZSBvZiBrZXkKICAgYWRkciAtIGtleSBhZGRyZXNzICh1bmljYXN0L2Jyb2FkY2FzdCkKICAga2V5X2lkeCAtIGtleSBpbmRleAogICBzZXRfdHggLSB1c2Uga2V5IGZvciBpbW1pZGlhdGUgdHgKICAgc2VxIC0gc2VxdWVuY2UgY291bnRlciAoZm9yIHJlcGxheSBkZXRlY3Rpb24pCiAgIHNlcV9sZW4gLSBzZXF1ZW5jZSBjb3VudGVyIGJ1ZmZlciBsZW4KICAga2V5IC0ga2V5IGNvbnRlbnQKICAga2V5X2xlbiAtIGxlbmd0aCBvZiBrZXkgKDMyIGZvciBUS0lQLCAxNiBmb3IgQUVTKQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfa2V5KHZvaWQgKnByaXYsIHdwYV9hbGcgYWxnLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBrZXlfaWR4LCBpbnQgc2V0X3R4LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzZXEsIHNpemVfdCBzZXFfbGVuLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHNpemVfdCBrZXlfbGVuKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIE9TXzgwMl8xMV9LRVkgbXlLZXk7CiAgICBPU184MDJfMTFfV0VQIG15V2VwS2V5OwogICAgVUlOVDggdGVtcFtUS0lQX0tFWV9MRU5HVEhdOwogICAgaW50IHJldCA9IC0xOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NldF9rZXkgY2FsbGVkIik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiYWRkX2tleSAoYWRkcik6ICIgTUFDU1RSLCBNQUMyU1RSKGFkZHIpKTsKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiYWRkX2tleSAoa2V5X2lkeCk6ICVkIiwga2V5X2lkeCk7CiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgImFkZF9rZXkgKGFsZyk6ICVkIiwgYWxnKTsKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiYWRkX2tleSAoc2V0X3R4KTogJWQiLCBzZXRfdHgpOwogICAgd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiYWRkX2tleSAoc2VxKToiLCBzZXEsIHNlcV9sZW4pOwogICAgd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiYWRkX2tleSAoa2V5KToiLCBrZXksIGtleV9sZW4pOwoKICAgIHN3aXRjaCgga2V5X2xlbiApIHsKICAgICAgICBjYXNlIFRLSVBfS0VZX0xFTkdUSDogICAgICAgICAgLyogMzIgKi8KICAgICAgICBjYXNlIEFFU19LRVlfTEVOR1RIOiAgICAgICAgICAgLyogMTYgKi8KICAgICAgICAgICAgLyogU2V0IGtleSBpbmRleCAqLwogICAgICAgICAgICBteUtleS5LZXlJbmRleCA9IGtleV9pZHg7CiAgICAgICAgICAgIC8qIFNldCBrZXkgbGVuZ3RoIGFuZCBjb250ZW50ICovCiAgICAgICAgICAgIG15S2V5LktleUxlbmd0aCA9IGtleV9sZW47CiAgICAgICAgICAgIC8qIFNldCBzdHJ1Y3R1cmUgc2l6ZSAqLwogICAgICAgICAgICBteUtleS5MZW5ndGggPSBzaXplb2YoT1NfODAyXzExX0tFWSk7CiAgICAgICAgICAgIC8qIHNldCBrZXkgTUFDIGFkZHJlc3MgLSBGRjpGRjpGRjpGRjpGRjpGRiBmb3IgYnJvYWRjYXN0LCBvdGhlciBmb3IgdW5pY2FzdCAqLwogICAgICAgICAgICBvc19tZW1jcHkoICZteUtleS5CU1NJRCwgYWRkciwgTUFDX0FERFJfTEVOICk7CgogICAgICAgICAgICBpZiggc2VxX2xlbiApIHsKICAgICAgICAgICAgICAgIC8qIFNldCBrZXkgUlNDICovCiAgICAgICAgICAgICAgICBvc19tZW1jcHkoICZteUtleS5LZXlSU0MsIHNlcSwgc2VxX2xlbiApOwogICAgICAgICAgICAgICAgbXlLZXkuS2V5SW5kZXggfD0gVElXTEFOX0tFWV9GTEFHU19TRVRfS0VZX1JTQzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoIHNldF90eCApIHsKICAgICAgICAgICAgICAgIG15S2V5LktleUluZGV4IHw9IFRJV0xBTl9LRVlfRkxBR1NfVFJBTlNNSVQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKCBteUtleS5CU1NJRFswXSAhPSAweEZGICkgewogICAgICAgICAgICAgICAgbXlLZXkuS2V5SW5kZXggfD0gVElXTEFOX0tFWV9GTEFHU19QQUlSV0lTRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgb3NfbWVtY3B5KCAmdGVtcCwga2V5LCBBRVNfS0VZX0xFTkdUSCApOwogICAgICAgICAgICBpZigga2V5X2xlbiA9PSBUS0lQX0tFWV9MRU5HVEggKSB7CiAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIHN3aXRjaCBSWCBhbmQgVFggTUlDIHNldCB3aXRoIGtleSAodG8gbWF0Y2ggZHJpdmVyIEFQSSkgKi8KICAgICAgICAgICAgICAgIG9zX21lbWNweSggKFVJTlQ4KikoKChVSU5UOCopJnRlbXApKzI0KSwgKFVJTlQ4KikoKChVSU5UOCopa2V5KSsxNiksIDggKTsKICAgICAgICAgICAgICAgIG9zX21lbWNweSggKFVJTlQ4KikoKChVSU5UOCopJnRlbXApKzE2KSwgKFVJTlQ4KikoKChVSU5UOCopa2V5KSsyNCksIDggKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvc19tZW1jcHkoICZteUtleS5LZXlNYXRlcmlhbCwgJnRlbXAsIGtleV9sZW4gKTsKICAgICAgICAgICAgcmV0ID0gVElfQWRkS2V5KCBteURydi0+aERyaXZlciwgJm15S2V5ICk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFdFUF9LRVlfTEVOR1RIXzQwOiAgICAgICAgLyogNSAqLwogICAgICAgIGNhc2UgV0VQX0tFWV9MRU5HVEhfMTA0OiAgICAgICAvKiAxMyAqLwogICAgICAgICAgICBpZigga2V5X2xlbiAhPSAwICkgewogICAgICAgICAgICAgICAgLyogU2V0IGtleSBpbmRleCAqLwogICAgICAgICAgICAgICAgbXlXZXBLZXkuS2V5SW5kZXggPSBrZXlfaWR4OwogICAgICAgICAgICAgICAgLyogU2V0IGtleSBsZW5ndGggYW5kIGNvbnRlbnQgKi8KICAgICAgICAgICAgICAgIG15V2VwS2V5LktleUxlbmd0aCA9IGtleV9sZW47CiAgICAgICAgICAgICAgICAvKiBTZXQgc3RydWN0dXJlIHNpemUgKi8KICAgICAgICAgICAgICAgIG15V2VwS2V5Lkxlbmd0aCA9IHNpemVvZihPU184MDJfMTFfV0VQKTsKCiAgICAgICAgICAgICAgICBpZiggc2V0X3R4ICkgewogICAgICAgICAgICAgICAgICAgIG15V2VwS2V5LktleUluZGV4IHw9IFRJV0xBTl9LRVlfRkxBR1NfVFJBTlNNSVQ7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsICJzZXR0aW5nIHRoaXMga2V5IHRvIGJlIHRoZSBpbmRleDogMHgleCIsIG15V2VwS2V5LktleUluZGV4KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBvc19tZW1jcHkoICZteVdlcEtleS5LZXlNYXRlcmlhbCwga2V5LCBrZXlfbGVuICk7CiAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIkFkZGluZyBXRVAga2V5IGluZGV4OiAweCV4Iiwga2V5X2lkeCk7CiAgICAgICAgICAgICAgICByZXQgPSBUSV9BZGRXRVBLZXkoIG15RHJ2LT5oRHJpdmVyLCAmbXlXZXBLZXkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCAiUmVtb3ZpbmcgV0VQIGtleSBpbmRleDogMHgleCIsIGtleV9pZHgpOwogICAgICAgICAgICAgICAgcmV0ID0gVElfUmVtb3ZlV0VQS2V5KCBteURydi0+aERyaXZlciwga2V5X2lkeCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiU2V0X2tleTogV3JvbmcgS2V5XG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4oIFRJMldQQV9TVEFUVVMocmV0KSApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9zZXRfY291bnRlcm1lYXN1cmVzClJvdXRpbmUgRGVzY3JpcHRpb246IHN0YXJ0L3N0b3AgY291bnRlcm1lYXN1cmVzIChkcm9wIHBhY2tldHMgZHVlIHRvIHJlcGxheSBhdHRhY2sgZGV0ZWN0aW9uKQpBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgZW5hYmxlZCAtIGVuYWJsZS9kaXNhYmxlIGZsYWcKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2NvdW50ZXJtZWFzdXJlcyh2b2lkICpwcml2LCBpbnQgZW5hYmxlZCkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfc2V0X2NvdW50ZXJtZWFzdXJlcyBjYWxsZWQ6ICVkIiwgZW5hYmxlZCk7CiAgICByZXR1cm4oIDAgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2Ryb3BfdW5lbmNyeXB0ZWQKUm91dGluZSBEZXNjcmlwdGlvbjogZW5hYmxlL2Rpc2FibGUgRUFQT0wtb25seSB0eCBieSBkcml2ZXIKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGVuYWJsZWQgLSBlbmFibGUvZGlzYWJsZSBmbGFnClJldHVybiBWYWx1ZTogMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX3NldF9kcm9wX3VuZW5jcnlwdGVkKHZvaWQgKnByaXYsIGludCBlbmFibGVkKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2Ryb3BfdW5lbmNyeXB0ZWQgY2FsbGVkOiAlZCAtIG5vdCBpbXBsZW1lbnRlZCIsIGVuYWJsZWQpOwogICAgcmV0dXJuKCAwICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2RlYXV0aGVudGljYXRlClJvdXRpbmUgRGVzY3JpcHRpb246IHNlbmQgZGVhdXRoZW50aWNhdGlvbiBwYWNrZXQKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGFkZHIgLSBhZGRyZXNzIHRvIHNlbmQgZGVhdXRoIHBhY2tldCB0bwogICByZWFzb25fY29kZSAtIHJlYXNvbiBjb2RlIHN1cHBsaWVkIGluIGRlYXV0aCBwYWNrZXQKUmV0dXJuIFZhbHVlOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfZGVhdXRoZW50aWNhdGUodm9pZCAqcHJpdiwgY29uc3QgVUlOVDggKmFkZHIsIGludCByZWFzb25fY29kZSkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBpbnQgcmV0OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX2RlYXV0aGVudGljYXRlIGNhbGxlZCIpOwogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICAvKiBCbG9jayBhbnkgcGVuZGluZyBkaXNhc3NvYyBldmVudCB1bnRpbCBzdWNjZXNzZnVsbHkgY29ubmVjdGVkICovCiAgICBpZiggbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9PSBOT19CTE9DSyApCiAgICAgICAgbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9IE5PX0JMT0NLX0RJU0FTU09DX0lOX1BST0dSRVNTOwoKICAgIHJldCA9IFRJX0Rpc2Fzc29jaWF0ZSggbXlEcnYtPmhEcml2ZXIgKTsKICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2Rpc2Fzc29jaWF0ZQpSb3V0aW5lIERlc2NyaXB0aW9uOiBkaXNhc3NvY2lhdGUgZnJvbSBBUApBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgYWRkciAtIGFkZHJlc3MgdG8gc2VuZCBkZWF1dGggcGFja2V0IHRvCiAgIHJlYXNvbl9jb2RlIC0gcmVhc29uIGNvZGUgc3VwcGxpZWQgaW4gZGVhdXRoIHBhY2tldApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9kaXNhc3NvY2lhdGUodm9pZCAqcHJpdiwgY29uc3QgVUlOVDggKmFkZHIsIGludCByZWFzb25fY29kZSkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBpbnQgcmV0OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSTogd3BhX2RyaXZlcl90aXN0YV9kaXNhc3NvY2lhdGUgY2FsbGVkIik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIC8qIEJsb2NrIGFueSBwZW5kaW5nIGRpc2Fzc29jIGV2ZW50IHVudGlsIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgKi8KICAgIGlmKCBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID09IE5PX0JMT0NLICkKICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gTk9fQkxPQ0tfRElTQVNTT0NfSU5fUFJPR1JFU1M7CgogICAgcmV0ID0gVElfRGlzYXNzb2NpYXRlKCBteURydi0+aERyaXZlciApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfYXNzb2NpYXRlClJvdXRpbmUgRGVzY3JpcHRpb246IGFzc29jaWF0ZSB3aXRoIEFQCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBwYXJhbXMgLSBzdHJ1Y3Qgd3BhX2RyaXZlcl9hc3NvY2lhdGVfcGFyYW1zIChzc2lkLCBic3NpZCwgZXRjKQpSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9hc3NvY2lhdGUodm9pZCAqcHJpdiwgc3RydWN0IHdwYV9kcml2ZXJfYXNzb2NpYXRlX3BhcmFtcyAqcGFyYW1zKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKICAgIE9TXzgwMl8xMV9NQUNfQUREUkVTUyBic3NpZCA9IHsgMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYgfTsKICAgIGludCB3cGFfb3B0LCB3cGFfY2lwaGVyLCByZXQ7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlRJOiB3cGFfZHJpdmVyX3Rpc3RhX2Fzc29jaWF0ZSBjYWxsZWQiKTsKICAgIC8qIElmIGRyaXZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IC0gd2UgY2Fubm90IGFjY2VzcyBpdCBzbyByZXR1cm4gKi8KICAgIFRJX0NIRUNLX0RSSVZFUiggbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQsIC0xICk7CgogICAgaWYoIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPT0gTk9fQkxPQ0tfRElTQVNTT0NfSU5fUFJPR1JFU1MgKQogICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBCTE9DS19ESVNBU1NPQzsKCiAgICBpZiggcGFyYW1zLT5ic3NpZCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIlRJOiBCU1NJRD0iIE1BQ1NUUiwgTUFDMlNUUihwYXJhbXMtPmJzc2lkKSk7CiAgICAgICAgLyogaWYgdGhlcmUgaXMgYnNzaWQgLT4gc2V0IGl0ICovCiAgICAgICAgaWYoIG9zX21lbWNtcCggcGFyYW1zLT5ic3NpZCwgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIsIEVUSF9BTEVOICkgIT0gMCApIHsKICAgICAgICAgICAgb3NfbWVtY3B5KCAmYnNzaWQsIHBhcmFtcy0+YnNzaWQsIEVUSF9BTEVOICk7CiAgICAgICAgICAgIFRJX1NldEJTU0lEKCBteURydi0+aERyaXZlciwgJmJzc2lkICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgLyogZWxzZSBzZXQgaXQgdG8gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9ICovCiAgICAgICAgVElfU2V0QlNTSUQoIG15RHJ2LT5oRHJpdmVyLCAmYnNzaWQgKTsKICAgIH0KCiAgICAvKiBTZXQgZHJpdmVyIG5ldHdvcmsgbW9kZSAoQWRob2MvSW5mcmFzdHJ1Y3R1cmUpIGFjY29yZGluZyB0byBzdXBwbGllZCBwYXJhbWV0ZXJzICovCiAgICBpZiggcGFyYW1zLT5tb2RlID09IElFRUU4MDIxMV9NT0RFX0lORlJBICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSTogc2V0dGluZyBvczgwMl8xMUluZnJhc3RydWN0dXJlIG1vZGUuLi4iKTsKICAgICAgICBUSV9TZXRCU1NUeXBlKCBteURydi0+aERyaXZlciwgb3M4MDJfMTFJbmZyYXN0cnVjdHVyZSApOwogICAgfQogICAgZWxzZSBpZiggcGFyYW1zLT5tb2RlID09IElFRUU4MDIxMV9NT0RFX0lCU1MgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlRJOiBzZXR0aW5nIG9zODAyXzExSUJTUyBtb2RlLi4uIik7CiAgICAgICAgVElfU2V0QlNTVHlwZSggbXlEcnYtPmhEcml2ZXIsIG9zODAyXzExSUJTUyApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIlRJOiBBc3NvY2lhdGU6IGludmFsaWQgbW9kZSBzcGVjaWZpZWQuLi4iKTsKICAgIH0KCiAgICB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGFfb3B0aW9ucyggcHJpdiwgcGFyYW1zLT5rZXlfbWdtdF9zdWl0ZSApOwogICAgd3BhX2RyaXZlcl90aXN0YV9zZXRfYXV0aF9tb2RlKCBwcml2ICk7CiAgICB3cGFfZHJpdmVyX3Rpc3RhX3NldF9lbmNyeXB0aW9uKCBwcml2LCBwYXJhbXMtPnBhaXJ3aXNlX3N1aXRlICk7CgogICAgLyogQW5kIHRyaWdnZXIgY29ubmVjdGlvbi9hc3NvY2lhdGlvbiBwcm9jZXNzIGluIGRyaXZlciBieSBzZXR0aW5nIFNTSUQgKi8KICAgIHJldCA9IHdwYV9kcml2ZXJfdGlzdGFfc2V0X3NzaWQoIHByaXYsIHBhcmFtcy0+c3NpZCwgcGFyYW1zLT5zc2lkX2xlbik7CiAgICByZXR1cm4oIHJldCApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogdGlfaW5pdF9zY2FuX3BhcmFtcwpSb3V0aW5lIERlc2NyaXB0aW9uOiBpbnQgc2NhbiBwYXJhbWV0ZXJzIGJlZm9yZSBzY2FuIGNvbW1hbmQKQXJndW1lbnRzOgogICBwU2NhblBhcmFtcyAtIHBvaW50ZXIgdG8gc2NhbiBwYXJhbXRlcnMgc3RydWN0dXJlCiAgIHBTY2FuUG9saWN5IC0gcG9pbnRlciB0byBzY2FuIHBvbGljeSBzdHJ1Y3R1cmUKICAgc2NhblR5cGUgICAgLSBzY2FuIHR5cGUKICAgbm9PZkNoYW4gICAgLSBudW1iZXIgb2YgYWxsb3dlZCBjaGFubmVscwpSZXR1cm4gVmFsdWU6IE5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgdm9pZCB0aV9pbml0X3NjYW5fcGFyYW1zKCBzY2FuX1BhcmFtc190ICpwU2NhblBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9Qb2xpY3lfdCAqcFNjYW5Qb2xpY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY2FuX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ICkKewogICAgVUlOVDMyIHNjYW5NYXhEd2VsbFRpbWUgPSBTTUVfU0NBTl9CR19NQVhfRFdFTExfVElNRV9ERUY7CiAgICBVSU5UMzIgc2Nhbk1pbkR3ZWxsVGltZSA9IFNNRV9TQ0FOX0JHX01JTl9EV0VMTF9USU1FX0RFRjsKICAgIFVJTlQzMiBjaGFuTWF4RHdlbGxUaW1lID0gU01FX1NDQU5fQkdfTUlOX0RXRUxMX1RJTUVfREVGOwogICAgVUlOVDMyIGNoYW5NaW5Ed2VsbFRpbWUgPSBTTUVfU0NBTl9CR19NSU5fRFdFTExfVElNRV9ERUYgLyAyOwogICAgaW50IHNjYW5UeXBlID0gc2Nhbl90eXBlOwogICAgaW50IG5vT2ZDaGFuID0gbXlEcnYtPnNjYW5fY2hhbm5lbHM7CiAgICBpbnQgYnRDb2V4U2NhbiA9IG15RHJ2LT5idGNvZXhfc2NhbjsKICAgIGludCBpLCBqOwogICAgVUlOVDggdGlkID0gMCwgcHJvYmVOdW0gPSAzOwoKICAgIGlmKCBub09mQ2hhbiA+IE1BWF9OVU1CRVJfT0ZfQ0hBTk5FTFNfUEVSX1NDQU4gKQogICAgICAgIG5vT2ZDaGFuID0gTUFYX05VTUJFUl9PRl9DSEFOTkVMU19QRVJfU0NBTjsKICAgIC8qIGluaXQgYXBwbGljYXRpb24gc2NhbiBkZWZhdWx0IHBhcmFtcyAqLwogICAgcFNjYW5QYXJhbXMtPmRlc2lyZWRTc2lkLmxlbiA9IDA7CiAgICBwU2NhblBhcmFtcy0+YmFuZCA9IFJBRElPX0JBTkRfMl80X0dIWjsKICAgIGlmKCBidENvZXhTY2FuICkgeyAvKiBDaGFuZ2luZyBzY2FuIHBhcmFtZXRlcmVzIHRvIGNvZXhpc3Qgd2l0aCBCVCBBMkRQICovCiAgICAgICAgaWYoIHNjYW5UeXBlID09IFNDQU5fVFlQRV9OT1JNQUxfUEFTU0lWRSApCiAgICAgICAgICAgIHNjYW5UeXBlID0gU0NBTl9UWVBFX1RSSUdHRVJFRF9QQVNTSVZFOwogICAgICAgIGVsc2UgaWYoIHNjYW5UeXBlID09IFNDQU5fVFlQRV9OT1JNQUxfQUNUSVZFICkKICAgICAgICAgICAgc2NhblR5cGUgPSBTQ0FOX1RZUEVfVFJJR0dFUkVEX0FDVElWRTsKICAgICAgICBwcm9iZU51bSA9IDE7CiAgICAgICAgdGlkID0gMHhGRjsKICAgICAgICBzY2FuTWF4RHdlbGxUaW1lIC89IDY7CiAgICAgICAgc2Nhbk1pbkR3ZWxsVGltZSAvPSA2OwogICAgICAgIGNoYW5NYXhEd2VsbFRpbWUgLz0gNjsKICAgICAgICBjaGFuTWluRHdlbGxUaW1lIC89IDY7CiAgICB9CiAgICBwU2NhblBhcmFtcy0+c2NhblR5cGUgPSBzY2FuVHlwZTsKICAgIHBTY2FuUGFyYW1zLT5wcm9iZVJlcU51bWJlciA9IHByb2JlTnVtOwogICAgcFNjYW5QYXJhbXMtPlRpZCA9IHRpZDsKICAgIHBTY2FuUGFyYW1zLT5wcm9iZVJlcXVlc3RSYXRlID0gRFJWX1JBVEVfTUFTS18yX0JBUktFUjsKICAgIHBTY2FuUGFyYW1zLT5udW1PZkNoYW5uZWxzID0gKFVJTlQ4KW5vT2ZDaGFuOwogICAgZm9yKGk9MDsoIGkgPCBub09mQ2hhbiApO2krKykgewogICAgICAgIGZvcihqPTA7KCBqIDwgTUFDX0FERFJfTEVOICk7aisrKSB7CiAgICAgICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkuYnNzSWQuYWRkclsgaiBdID0gMHhmZjsKICAgICAgICB9CiAgICAgICAgcFNjYW5QYXJhbXMtPmNoYW5uZWxFbnRyeVsgaSBdLm5vcm1hbENoYW5uZWxFbnRyeS5lYXJseVRlcm1pbmF0aW9uRXZlbnQgPSBTQ0FOX0VUX0NPTkRfRElTQUJMRTsKICAgICAgICBwU2NhblBhcmFtcy0+Y2hhbm5lbEVudHJ5WyBpIF0ubm9ybWFsQ2hhbm5lbEVudHJ5LkVUTWF4TnVtT2ZBUGZyYW1lcyA9IDA7CiAgICAgICAgcFNjYW5QYXJhbXMtPmNoYW5uZWxFbnRyeVsgaSBdLm5vcm1hbENoYW5uZWxFbnRyeS5tYXhDaGFubmVsRHdlbGxUaW1lID0gc2Nhbk1heER3ZWxsVGltZTsKICAgICAgICBwU2NhblBhcmFtcy0+Y2hhbm5lbEVudHJ5WyBpIF0ubm9ybWFsQ2hhbm5lbEVudHJ5Lm1pbkNoYW5uZWxEd2VsbFRpbWUgPSBzY2FuTWluRHdlbGxUaW1lOwojaWZkZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkudHhQb3dlckxldmVsID0gMTsKI2Vsc2UKICAgICAgICBwU2NhblBhcmFtcy0+Y2hhbm5lbEVudHJ5WyBpIF0ubm9ybWFsQ2hhbm5lbEVudHJ5LnR4UG93ZXJEYm0gPSBNQVhfVFhfUE9XRVI7CiNlbmRpZgogICAgICAgIHBTY2FuUGFyYW1zLT5jaGFubmVsRW50cnlbIGkgXS5ub3JtYWxDaGFubmVsRW50cnkuY2hhbm5lbCA9IGkgKyAxOwogICAgfQoKICAgIC8qIGluaXQgZGVmYXVsdCBzY2FuIHBvbGljeSAqLwogICAgcFNjYW5Qb2xpY3ktPm5vcm1hbFNjYW5JbnRlcnZhbCA9IDEwMDAwOwogICAgcFNjYW5Qb2xpY3ktPmRldGVyaW9yYXRpbmdTY2FuSW50ZXJ2YWwgPSA1MDAwOwogICAgcFNjYW5Qb2xpY3ktPm1heFRyYWNrRmFpbHVyZXMgPSAzOwogICAgcFNjYW5Qb2xpY3ktPkJTU0xpc3RTaXplID0gNDsKICAgIHBTY2FuUG9saWN5LT5CU1NOdW1iZXJUb1N0YXJ0RGlzY292ZXJ5ID0gMTsKICAgIHBTY2FuUG9saWN5LT5udW1PZkJhbmRzID0gMTsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmJhbmQgPSBSQURJT19CQU5EXzJfNF9HSFo7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5yeFJTU0lUaHJlc2hvbGQgPSAtODA7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5udW1PZkNoYW5ubGVzID0gKFVJTlQ4KW5vT2ZDaGFuOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0ubnVtT2ZDaGFubmxlc0ZvckRpc2NvdmVyeSA9IDM7CiAgICBmb3IoaT0wOyggaSA8IG5vT2ZDaGFuICk7aSsrKSB7CiAgICAgICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uY2hhbm5lbExpc3RbIGkgXSA9IGkgKyAxOwogICAgfQogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2Quc2NhblR5cGUgPSBTQ0FOX1RZUEVfTk9fU0NBTjsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLnRyYWNraW5nTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5lYXJseVRlcm1pbmF0aW9uRXZlbnQgPSBTQ0FOX0VUX0NPTkRfRElTQUJMRTsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLnRyYWNraW5nTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5FVE1heE51bWJlck9mQXBGcmFtZXMgPSAwOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLm1heENoYW5uZWxEd2VsbFRpbWUgPSBjaGFuTWF4RHdlbGxUaW1lOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLm1pbkNoYW5uZWxEd2VsbFRpbWUgPSBjaGFuTWluRHdlbGxUaW1lOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMuYml0cmF0ZSA9IERSVl9SQVRFX01BU0tfMV9CQVJLRVI7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS50cmFja2luZ01ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy5udW1PZlByb2JlUmVxcyA9IHBTY2FuUGFyYW1zLT5wcm9iZVJlcU51bWJlcjsKI2lmZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLnRyYWNraW5nTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLnR4TGV2ZWwgPSAxOwojZWxzZQogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0udHJhY2tpbmdNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMudHhQb3dlckRibSA9IE1BWF9UWF9QT1dFUjsKI2VuZGlmCiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5kaXNjb3ZlcnlNZXRob2Quc2NhblR5cGUgPSBTQ0FOX1RZUEVfTk9fU0NBTjsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMuZWFybHlUZXJtaW5hdGlvbkV2ZW50ID0gU0NBTl9FVF9DT05EX0RJU0FCTEU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5kaXNjb3ZlcnlNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLkVUTWF4TnVtYmVyT2ZBcEZyYW1lcyA9IDA7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5kaXNjb3ZlcnlNZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLm1heENoYW5uZWxEd2VsbFRpbWUgPSBjaGFuTWF4RHdlbGxUaW1lOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uZGlzY292ZXJ5TWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5taW5DaGFubmVsRHdlbGxUaW1lID0gY2hhbk1pbkR3ZWxsVGltZTsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy5iaXRyYXRlID0gRFJWX1JBVEVfTUFTS18yX0JBUktFUjsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy5udW1PZlByb2JlUmVxcyA9IHBTY2FuUGFyYW1zLT5wcm9iZVJlcU51bWJlcjsKI2lmZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy50eExldmVsID0gMTsKI2Vsc2UKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmRpc2NvdmVyeU1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy50eFBvd2VyRGJtID0gTUFYX1RYX1BPV0VSOwojZW5kaWYKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmltbWVkaWF0ZVNjYW5NZXRob2Quc2NhblR5cGUgPSBidENvZXhTY2FuID8gU0NBTl9UWVBFX1RSSUdHRVJFRF9BQ1RJVkUgOiBTQ0FOX1RZUEVfTk9STUFMX0FDVElWRTsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmltbWVkaWF0ZVNjYW5NZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLmVhcmx5VGVybWluYXRpb25FdmVudCA9IFNDQU5fRVRfQ09ORF9ESVNBQkxFOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMuRVRNYXhOdW1iZXJPZkFwRnJhbWVzID0gMDsKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmltbWVkaWF0ZVNjYW5NZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLm1heENoYW5uZWxEd2VsbFRpbWUgPSBjaGFuTWF4RHdlbGxUaW1lOwogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMubWluQ2hhbm5lbER3ZWxsVGltZSA9IGNoYW5NaW5Ed2VsbFRpbWU7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5pbW1lZGlhdGVTY2FuTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLmJpdHJhdGUgPSBEUlZfUkFURV9NQVNLXzVfNV9DQ0s7CiAgICBwU2NhblBvbGljeS0+YmFuZFNjYW5Qb2xpY3lbIDAgXS5pbW1lZGlhdGVTY2FuTWV0aG9kLm1ldGhvZC5iYXNpY01ldGhvZFBhcmFtcy5wcm9iUmVxUGFyYW1zLm51bU9mUHJvYmVSZXFzID0gcFNjYW5QYXJhbXMtPnByb2JlUmVxTnVtYmVyOwojaWZkZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgcFNjYW5Qb2xpY3ktPmJhbmRTY2FuUG9saWN5WyAwIF0uaW1tZWRpYXRlU2Nhbk1ldGhvZC5tZXRob2QuYmFzaWNNZXRob2RQYXJhbXMucHJvYlJlcVBhcmFtcy50eExldmVsID0gMTsKI2Vsc2UKICAgIHBTY2FuUG9saWN5LT5iYW5kU2NhblBvbGljeVsgMCBdLmltbWVkaWF0ZVNjYW5NZXRob2QubWV0aG9kLmJhc2ljTWV0aG9kUGFyYW1zLnByb2JSZXFQYXJhbXMudHhQb3dlckRibSA9IE1BWF9UWF9QT1dFUjsKI2VuZGlmCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX3NjYW4KUm91dGluZSBEZXNjcmlwdGlvbjogcmVxdWVzdCBzY2FuIGZyb20gZHJpdmVyCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBzc2lkIC0gc3NpZCBidWZmZXIKICAgc3NpZF9sZW4gLSBsZW5ndGggb2Ygc3NpZApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zY2FuKCB2b2lkICpwcml2LCBjb25zdCBVSU5UOCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zID0gKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqKShteURydi0+aFdwYVN1cHBsaWNhbnQpOwogICAgc3RydWN0IHdwYV9zc2lkICppc3NpZDsKICAgIHNjYW5fUGFyYW1zX3Qgc2NhblBhcmFtczsKICAgIHNjYW5fUG9saWN5X3Qgc2NhblBvbGljeTsKICAgIGludCBzY2FuX3R5cGUsIHJldCwgc2Nhbl9wcm9iZV9mbGFnID0gMDsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9zY2FuIGNhbGxlZCIpOwogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKCiAgICBzY2FuX3R5cGUgPSBteURydi0+c2Nhbl90eXBlOwogICAgaWYgKHdwYV9zLT5wcmV2X3NjYW5fc3NpZCAhPSBCUk9BRENBU1RfU1NJRF9TQ0FOKSB7CiAgICAgICAgaWYgKHdwYV9zLT5wcmV2X3NjYW5fc3NpZC0+c2Nhbl9zc2lkKSB7CiAgICAgICAgICAgIHNjYW5fdHlwZSA9IFNDQU5fVFlQRV9OT1JNQUxfQUNUSVZFOwogICAgICAgICAgICBzY2FuX3Byb2JlX2ZsYWcgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICB0aV9pbml0X3NjYW5fcGFyYW1zKCAmc2NhblBhcmFtcywgJnNjYW5Qb2xpY3ksIHNjYW5fdHlwZSwgbXlEcnYgKTsKCiAgICBteURydi0+Zm9yY2VfbWVyZ2VfZmxhZyA9IDA7IC8qIFNldCBtZXJnZSBmbGFnICovCgogICAgaWYgKChzY2FuX3Byb2JlX2ZsYWcgJiYgc3NpZCkgJiYKICAgICAgICAoc3NpZF9sZW4gPiAwICYmIHNzaWRfbGVuIDw9IHNpemVvZihzY2FuUGFyYW1zLmRlc2lyZWRTc2lkLnNzaWRTdHJpbmcpKSkgewogICAgICAgIG9zX21lbWNweShzY2FuUGFyYW1zLmRlc2lyZWRTc2lkLnNzaWRTdHJpbmcsIHNzaWQsIHNzaWRfbGVuKTsKCWlmIChzc2lkX2xlbiA8IHNpemVvZihzY2FuUGFyYW1zLmRlc2lyZWRTc2lkLnNzaWRTdHJpbmcpKQogICAgICAgICAgICBzY2FuUGFyYW1zLmRlc2lyZWRTc2lkLnNzaWRTdHJpbmdbc3NpZF9sZW5dID0gJ1wwJzsKICAgICAgICBzY2FuUGFyYW1zLmRlc2lyZWRTc2lkLmxlbiA9IHNzaWRfbGVuOwogICAgICAgIG15RHJ2LT5mb3JjZV9tZXJnZV9mbGFnID0gMTsKICAgIH0KICAgIFRJX1NldFNjYW5Qb2xpY3koIG15RHJ2LT5oRHJpdmVyLCAoVUlOVDggKikmc2NhblBvbGljeSwgc2l6ZW9mKHNjYW5fUG9saWN5X3QpICk7CiAgICBteURydi0+bGFzdF9zY2FuID0gc2Nhbl90eXBlOyAvKiBSZW1lbWJlciBzY2FuIHR5cGUgZm9yIGxhc3Qgc2NhbiAqLwogICAgcmV0ID0gVElfU3RhcnRTY2FuKCBteURydi0+aERyaXZlciwgKHNjYW5fUGFyYW1zX3QgKikmc2NhblBhcmFtcyApOwogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2F1dGhfYWxnClJvdXRpbmUgRGVzY3JpcHRpb246IHNldCBhdXRoZW50aWNhdGlvbiBpbiBkcml2ZXIKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIGF1dGhfYWxnIC0gT3Blbi9TaGFyZWQvTEVBUApSZXR1cm4gVmFsdWU6IDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgd3BhX2RyaXZlcl90aXN0YV9zZXRfYXV0aF9hbGcoIHZvaWQgKnByaXYsIGludCBhdXRoX2FsZyApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX3NldF9hdXRoX2FsZyBjYWxsZWQ6ICVkIiwgYXV0aF9hbGcpOwogICAgLyogSWYgZHJpdmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgLSB3ZSBjYW5ub3QgYWNjZXNzIGl0IHNvIHJldHVybiAqLwogICAgVElfQ0hFQ0tfRFJJVkVSKCBteURydi0+ZHJpdmVyX2lzX2xvYWRlZCwgLTEgKTsKICAgIG15RHJ2LT5hdXRoX2FsZyA9IGF1dGhfYWxnOwogICAgcmV0dXJuKCAwICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2dldF9ic3NpZF9pbmZvClJvdXRpbmUgRGVzY3JpcHRpb246IHJldHJpZXZlIGJzc2lkIGZ1bGwgaW5mbwpBcmd1bWVudHM6CiAgIGhEcml2ZXIgLSBwb2ludGVyIHRvIGRyaXZlciBzdHJ1Y3R1cmUKUmV0dXJuIFZhbHVlOiBwb2ludGVyIHRvIEJTU0lEIHN0cnVjdHVyZSBvciBOVUxMCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIE9TXzgwMl8xMV9CU1NJRF9FWCAqd3BhX2RyaXZlcl90aXN0YV9nZXRfYnNzaWRfaW5mbyggVElfSEFORExFIGhEcml2ZXIgKQp7CiAgICBPU184MDJfMTFfQlNTSURfTElTVF9FWCAqYnNzaWRfbGlzdDsKICAgIE9TXzgwMl8xMV9CU1NJRF9FWCAqcEJzc2lkLCAqbkJzc2lkID0gTlVMTDsKICAgIGludCBpLCBudW1iZXJfaXRlbXMsIHJlczsKICAgIE9TXzgwMl8xMV9NQUNfQUREUkVTUyBic3NpZDsKICAgIE9TXzgwMl8xMV9TU0lEIHNzaWQ7CgogICAgaWYoIFRJX0dldEJTU0lETGlzdCggaERyaXZlciwgJmJzc2lkX2xpc3QgKSB8fCAhYnNzaWRfbGlzdCApCiAgICAgICAgcmV0dXJuKCBuQnNzaWQgKTsKCiAgICBpZiggVElfR2V0QlNTSUQoIGhEcml2ZXIsICZic3NpZCApICE9IFRJX1JFU1VMVF9PSyApCiAgICAgICAgcmV0dXJuKCBuQnNzaWQgKTsKCiAgICBpZiggVElfR2V0Q3VycmVudFNTSUQoIGhEcml2ZXIsICZzc2lkICkgIT0gVElfUkVTVUxUX09LICkKICAgICAgICByZXR1cm4oIG5Cc3NpZCApOwoKICAgIHBCc3NpZCA9ICZic3NpZF9saXN0LT5Cc3NpZFswXTsKICAgIG51bWJlcl9pdGVtcyA9IChpbnQpKGJzc2lkX2xpc3QtPk51bWJlck9mSXRlbXMpOwogICAgZm9yKGk9MDsoIGkgPCBudW1iZXJfaXRlbXMgKTtpKyspIHsKICAgICAgICBpZiggIW9zX21lbWNtcCgodm9pZCAqKSZic3NpZCwgcEJzc2lkLT5NYWNBZGRyZXNzLCBNQUNfQUREUl9MRU4pICYmCiAgICAgICAgICAgICFvc19tZW1jbXAoc3NpZC5Tc2lkLCBwQnNzaWQtPlNzaWQuU3NpZCwgcEJzc2lkLT5Tc2lkLlNzaWRMZW5ndGgpICkgewogICAgICAgICAgICBuQnNzaWQgPSAoT1NfODAyXzExX0JTU0lEX0VYICopb3NfbWFsbG9jKCBwQnNzaWQtPkxlbmd0aCApOwogICAgICAgICAgICBpZiggbkJzc2lkICE9IE5VTEwgKQogICAgICAgICAgICAgICAgb3NfbWVtY3B5KCBuQnNzaWQsIHBCc3NpZCwgcEJzc2lkLT5MZW5ndGggKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHBCc3NpZCA9IChPU184MDJfMTFfQlNTSURfRVggKikoKChjaGFyICopcEJzc2lkKSArIHBCc3NpZC0+TGVuZ3RoKTsKICAgIH0KICAgIG9zX2ZyZWUoIGJzc2lkX2xpc3QgKTsKICAgIHJldHVybiggbkJzc2lkICk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQ29tcGFyZSBmdW5jdGlvbiBmb3Igc29ydGluZyBzY2FuIHJlc3VsdHMuIFJldHVybiA+MCBpZiBAYiBpcyBjb25zaWRlcmVkIGJldHRlci4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHdwYV9kcml2ZXJfdGlzdGFfc2Nhbl9yZXN1bHRfY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQp7CiAgICBjb25zdCBzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0ICp3YSA9IGE7CiAgICBjb25zdCBzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0ICp3YiA9IGI7CgogICAgcmV0dXJuKCB3Yi0+bGV2ZWwgLSB3YS0+bGV2ZWwgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X3NjYW5fcmVzdWx0cwpSb3V0aW5lIERlc2NyaXB0aW9uOiByZXRyaWV2ZSBkcml2ZXIgc2NhbiByZXN1bHRzCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICByZXN1bHRzIC0gcG9pbnRlciB0byBidWZmZXIKICAgbWF4X3NpemUgLSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0cyBidWZmZXIKUmV0dXJuIFZhbHVlOiBudW1iZXIgb2YgU1NJRCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zY2FuX3Jlc3VsdHMoIHZvaWQgKnByaXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0ICpyZXN1bHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG1heF9zaXplICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICBPU184MDJfMTFfQlNTSURfTElTVF9FWCAqYnNzaWRfbGlzdDsKICAgIE9TXzgwMl8xMV9CU1NJRF9FWCAqcEJzc2lkOwogICAgT1NfODAyXzExX0ZJWEVEX0lFcyAqcEZpeGVkSWVzOwogICAgT1NfODAyXzExX1ZBUklBQkxFX0lFcyAqcFZhckllczsKICAgIHVuc2lnbmVkIGludCBudW1iZXJfaXRlbXMsIGksIGluZGV4OwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfZHJpdmVyX3Rpc3RhX2dldF9zY2FuX3Jlc3VsdHMgY2FsbGVkIik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIGlmKCBUSV9HZXRCU1NJRExpc3QobXlEcnYtPmhEcml2ZXIsICZic3NpZF9saXN0KSB8fCAhYnNzaWRfbGlzdCApCiAgICAgICAgcmV0dXJuKCAtMSApOwoKICAgIHBCc3NpZCA9ICZic3NpZF9saXN0LT5Cc3NpZFswXTsKICAgIG51bWJlcl9pdGVtcyA9IChpbnQpKGJzc2lkX2xpc3QtPk51bWJlck9mSXRlbXMpOwoKICAgIHdwYV9wcmludGYoTVNHX01TR0RVTVAsICJSZWNlaXZlZCAlZCBieXRlcyBvZiBzY2FuIHJlc3VsdHMgKCVkIEJTU2VzKSIsCiAgICAgICAgICAgbnVtYmVyX2l0ZW1zICogc2l6ZW9mKE9TXzgwMl8xMV9CU1NJRF9FWCksIG51bWJlcl9pdGVtcyk7CgogICAgb3NfbWVtc2V0KCByZXN1bHRzLCAwLCBtYXhfc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0KSApOwogICAgbnVtYmVyX2l0ZW1zID0gTUlOKCBudW1iZXJfaXRlbXMsIG1heF9zaXplICk7CgogICAgZm9yKGluZGV4PTA7IGluZGV4IDwgbnVtYmVyX2l0ZW1zOyBpbmRleCsrKSB7CiAgICAgICAgb3NfbWVtY3B5KCByZXN1bHRzW2luZGV4XS5ic3NpZCwgJnBCc3NpZC0+TWFjQWRkcmVzcywgRVRIX0FMRU4gKTsKICAgICAgICBvc19tZW1jcHkoIHJlc3VsdHNbaW5kZXhdLnNzaWQsIHBCc3NpZC0+U3NpZC5Tc2lkLCBwQnNzaWQtPlNzaWQuU3NpZExlbmd0aCApOwogICAgICAgIHJlc3VsdHNbaW5kZXhdLnNzaWRfbGVuID0gcEJzc2lkLT5Tc2lkLlNzaWRMZW5ndGg7CiNpZmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICAgICAgcmVzdWx0c1tpbmRleF0uZnJlcSA9IHBCc3NpZC0+Q29uZmlndXJhdGlvbi5jaGFubmVsIC8gMTAwMDsKICAgICAgICByZXN1bHRzW2luZGV4XS5jYXBzID0gcEJzc2lkLT5DYXBhYmlsaXRpZXM7CiNlbHNlCiAgICAgICAgcmVzdWx0c1tpbmRleF0uZnJlcSA9IHBCc3NpZC0+Q29uZmlndXJhdGlvbi5Vbmlvbi5jaGFubmVsIC8gMTAwMDsKICAgICAgICByZXN1bHRzW2luZGV4XS5jYXBzID0gcEJzc2lkLT5Vbmlvbi5DYXBhYmlsaXRpZXM7CiNlbmRpZgogICAgICAgIHJlc3VsdHNbaW5kZXhdLmxldmVsID0gcEJzc2lkLT5Sc3NpOwogICAgICAgIHJlc3VsdHNbaW5kZXhdLm1heHJhdGUgPSAwOyAvKiBJbiB1bml0cyBvZiAwLjUgTWIvcyAqLwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YocEJzc2lkLT5TdXBwb3J0ZWRSYXRlcyk7IGkrKykgewogICAgICAgICAgICBpZiAocEJzc2lkLT5TdXBwb3J0ZWRSYXRlc1tpXSA+ICh1bnNpZ25lZClyZXN1bHRzW2luZGV4XS5tYXhyYXRlKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzW2luZGV4XS5tYXhyYXRlID0gcEJzc2lkLT5TdXBwb3J0ZWRSYXRlc1tpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IE5ldDogJXMgQ2FwOiAweCUwNHggUHJpdjogMHgleCBOZXRUeXBlOiAweCV4IEluZnJhTW9kZTogMHgleCBJRUxlbjogJWQiLAojaWZkZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgICAgICAgICAgICAgICAgcEJzc2lkLT5Tc2lkLlNzaWQsIHBCc3NpZC0+Q2FwYWJpbGl0aWVzLCBwQnNzaWQtPlByaXZhY3ksIHBCc3NpZC0+TmV0d29ya1R5cGVJblVzZSwKI2Vsc2UKICAgICAgICAgICAgICAgICAgIHBCc3NpZC0+U3NpZC5Tc2lkLCBwQnNzaWQtPlVuaW9uLkNhcGFiaWxpdGllcywgcEJzc2lkLT5Qcml2YWN5LCBwQnNzaWQtPk5ldHdvcmtUeXBlSW5Vc2UsCiNlbmRpZgogICAgICAgICAgICAgICAgICAgcEJzc2lkLT5JbmZyYXN0cnVjdHVyZU1vZGUsIHBCc3NpZC0+SUVMZW5ndGggKTsKCiAgICAgICAgLyogRml4ZWQgSUVzIGZyb20gc2l0ZSBlbnRyeSAtIHNhbWUgQ2FwYWJpbGl0aWVzICovCiAgICAgICAgcEZpeGVkSWVzID0gKE9TXzgwMl8xMV9GSVhFRF9JRXMgKikmcEJzc2lkLT5JRXNbMF07CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlRJOiBGaXhlZCBJRXM6IEJlYWNvbjogMHgleCBDYXA6IDB4JXgiLCBwRml4ZWRJZXMtPkJlYWNvbkludGVydmFsLCBwRml4ZWRJZXMtPkNhcGFiaWxpdGllcyk7CiAgICAgICAgZm9yKGk9c2l6ZW9mKE9TXzgwMl8xMV9GSVhFRF9JRXMpOyBpIDwgcEJzc2lkLT5JRUxlbmd0aDspIHsKICAgICAgICAgICAgcFZhckllcyA9IChPU184MDJfMTFfVkFSSUFCTEVfSUVzICopJnBCc3NpZC0+SUVzW2ldOwogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVEk6IFZhcmlhYmxlIElFczogSUQ6IDB4JXggTGVuOiAlZCIsIHBWYXJJZXMtPkVsZW1lbnRJRCwgcFZhckllcy0+TGVuZ3RoKTsKICAgICAgICAgICAgd3BhX2hleGR1bXAoTVNHX0RFQlVHLCJUSTogb3VpOiIsIHBWYXJJZXMtPmRhdGEsIHBWYXJJZXMtPkxlbmd0aCk7CiAgICAgICAgICAgIHN3aXRjaCggcFZhckllcy0+RWxlbWVudElEICkgewogICAgICAgICAgICAgICAgY2FzZSBHRU5FUklDX0lORk9fRUxFTTogLyogMHhkZCAqLwogICAgICAgICAgICAgICAgICAgIGlmKCAocFZhckllcy0+TGVuZ3RoID4gMykgJiYgKG9zX21lbWNtcChwVmFySWVzLT5kYXRhLCBXUEFfT1VJLCA0KSA9PSAwKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0ud3BhX2llX2xlbiA9IE1JTigocFZhckllcy0+TGVuZ3RoICsgMiksIFNTSURfTUFYX1dQQV9JRV9MRU4pOwogICAgICAgICAgICAgICAgICAgICAgICBvc19tZW1jcHkoIHJlc3VsdHNbaW5kZXhdLndwYV9pZSwgcFZhckllcywgcmVzdWx0c1tpbmRleF0ud3BhX2llX2xlbiApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFJTTl9JTkZPX0VMRU06ICAgICAvKiAweDMwICovCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpbmRleF0ucnNuX2llX2xlbiA9IE1JTigocFZhckllcy0+TGVuZ3RoICsgMiksIFNTSURfTUFYX1dQQV9JRV9MRU4pOwogICAgICAgICAgICAgICAgICAgIG9zX21lbWNweSggcmVzdWx0c1tpbmRleF0ucnNuX2llLCBwVmFySWVzLCByZXN1bHRzW2luZGV4XS5yc25faWVfbGVuICk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSArPSAocFZhckllcy0+TGVuZ3RoICsgKDIgKiBzaXplb2YodGlVSU5UOCkpKTsKICAgICAgICB9CiAgICAgICAgcEJzc2lkID0gKE9TXzgwMl8xMV9CU1NJRF9FWCAqKSgoKHU4ICopcEJzc2lkKSArIHBCc3NpZC0+TGVuZ3RoKTsKICAgIH0KICAgIC8qIE1lcmdlIG5ldyByZXN1bHRzIHdpdGggcHJldmlvdXMgKi8KICAgIG51bWJlcl9pdGVtcyA9IHNjYW5fbWVyZ2UoIG15RHJ2LCByZXN1bHRzLCBteURydi0+Zm9yY2VfbWVyZ2VfZmxhZywgbnVtYmVyX2l0ZW1zLCBtYXhfc2l6ZSApOwoKICAgIHFzb3J0KCByZXN1bHRzLCBudW1iZXJfaXRlbXMsIHNpemVvZihzdHJ1Y3Qgd3BhX3NjYW5fcmVzdWx0KSwKICAgICAgICAgICB3cGFfZHJpdmVyX3Rpc3RhX3NjYW5fcmVzdWx0X2NvbXBhcmUgKTsKCiAgICBvc19mcmVlKCBic3NpZF9saXN0ICk7CiAgICByZXR1cm4oIG51bWJlcl9pdGVtcyApOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogd3BhX2RyaXZlcl90aXN0YV9nZXRfc2Nhbl9yZXN1bHRzClJvdXRpbmUgRGVzY3JpcHRpb246IHJldHJpZXZlIGRyaXZlciBzY2FuIHJlc3VsdHMKQXJndW1lbnRzOgogICBzb2NrIC0gc29ja2V0CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgc29ja19jdHggLSBwb2ludGVyIHRvIG90aGVyIHByaXZhdGUgZGF0YQpSZXR1cm4gVmFsdWU6IE5vbmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgdm9pZCB3cGFfZHJpdmVyX3Rpc3RhX3JlY2VpdmVfZHJpdmVyX2V2ZW50KCBpbnQgc29jaywgdm9pZCAqcHJpdiwgdm9pZCAqc29ja19jdHggKQp7CiAgICBJUENfRVZfREFUQSBteUJ1ZjsKICAgIFVJTlQ4ICpidWY7CiAgICBVSU5UMzIgKmJ1Zkxvbmc7CiAgICB1bmlvbiB3cGFfZXZlbnRfZGF0YSBteUV2ZW50RGF0YTsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15U3VwcGw7CiAgICBPU184MDJfMTFfQVNTT0NJQVRJT05fSU5GT1JNQVRJT04gKnBJbmZvID0gTlVMTDsKICAgIE9TXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICpwTWVkaWFTcGVjaWZpY0J1ZjsKICAgIE9TXzgwMl8xMV9CU1NJRF9FWCAqcFNlbGVjdGVkQnNzaWRJbmZvID0gTlVMTDsKICAgIE9TXzgwMl8xMV9ORVRXT1JLX01PREUgbXlCc3NUeXBlOwogICAgSVBDX0VWX0RBVEEgKnBEYXRhID0gJm15QnVmOwogICAgaW50IHJlczsKI2lmbmRlZiBTVEFfREtfVkVSXzVfMF8wXzk0CiAgICBidENvZXhTdGF0dXNfdCAqYnRDb2V4U3RhdHVzOwojZW5kaWYKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9yZWNlaXZlX2RyaXZlcl9ldmVudC4uLiIpOwoKICAgIHJlcyA9IHJlY3YoIHNvY2ssICZteUJ1Ziwgc2l6ZW9mKG15QnVmKSwgMCApOwogICAgaWYoIHJlcyA8IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsImwyX3BhY2tldF9yZWNlaXZlIC0gcmVjdmZyb20iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXlTdXBwbCA9IHBEYXRhLT5FdlBhcmFtcy5oVXNlclBhcmFtOwoKICAgIHN3aXRjaCggKChJUENfRVZFTlRfUEFSQU1TKilwRGF0YSktPnVFdmVudFR5cGUgKSB7CiAgICAgICAgY2FzZSBJUENfRVZFTlRfQVNTT0NJQVRFRDoKICAgICAgICAgICAgLyogQXNzb2NpYXRlZCBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgc3VjY2Vzc2Z1bGwgQVNTT0NfUlNQIHBhY2tldCBpcyByZWNlaXZlZCAqLwogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBBc3NvY2lhdGVkIik7CgogICAgICAgICAgICBUSV9HZXRCU1NUeXBlKCBteVN1cHBsLT5oRHJpdmVyLCAmbXlCc3NUeXBlICk7CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJteUJzc1R5cGUgPSAlZCIsbXlCc3NUeXBlKTsKCiAgICAgICAgICAgIGlmKCBteUJzc1R5cGUgPT0gb3M4MDJfMTFJbmZyYXN0cnVjdHVyZSApIHsKICAgICAgICAgICAgICAgIC8qIEdldCBBU1NPQ19SRVEgYW5kIEFTU09DX1JTUCBJRSAqLwogICAgICAgICAgICAgICAgcmVzID0gVElfR2V0QXNzb2NpYXRpb25JbmZvKCBteVN1cHBsLT5oRHJpdmVyLCAmcEluZm8gKTsKICAgICAgICAgICAgICAgIGJ1ZiA9IChVSU5UOCAqKXBJbmZvOwoKICAgICAgICAgICAgICAgIGlmKCBidWYgIT0gTlVMTCApIHsKICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlcV9pZXMgPSBidWYgKyBwSW5mby0+T2Zmc2V0UmVxdWVzdElFczsKICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlcV9pZXNfbGVuID0gcEluZm8tPlJlcXVlc3RJRUxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzID0gYnVmICsgcEluZm8tPk9mZnNldFJlc3BvbnNlSUVzOwogICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXNfbGVuID0gcEluZm8tPlJlc3BvbnNlSUVMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXNfbGVuID0gMDsKCiAgICAgICAgICAgICAgICAgICAgLyogR2V0IEFQIEJlYWNvbiBJRXMgLSBlc3BlY2lhbGx5IFdQQS9SU04gSUUgKi8KICAgICAgICAgICAgICAgICAgICBwU2VsZWN0ZWRCc3NpZEluZm8gPSB3cGFfZHJpdmVyX3Rpc3RhX2dldF9ic3NpZF9pbmZvKCBteVN1cHBsLT5oRHJpdmVyICk7CiAgICAgICAgICAgICAgICAgICAgaWYoIHBTZWxlY3RlZEJzc2lkSW5mbyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBTZWxlY3RlZEJzc2lkSW5mby0+SUVMZW5ndGggJiYgcFNlbGVjdGVkQnNzaWRJbmZvLT5JRXMgKSB7IC8qIERtOiBGaXhlZCBJRXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llcyA9IChVSU5UOCAqKXBTZWxlY3RlZEJzc2lkSW5mby0+SUVzICsgc2l6ZW9mKE9TXzgwMl8xMV9GSVhFRF9JRXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzX2xlbiA9IHBTZWxlY3RlZEJzc2lkSW5mby0+SUVMZW5ndGggLSBzaXplb2YoT1NfODAyXzExX0ZJWEVEX0lFcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llcyA9IDB4JXgiLCh1bnNpZ25lZClteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlcV9pZXMpOwogICAgICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlcV9pZXNfbGVuID0gJWQiLG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llc19sZW4pOwogICAgICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzID0gMHgleCIsKHVuc2lnbmVkKW15RXZlbnREYXRhLmFzc29jX2luZm8ucmVzcF9pZXMpOwogICAgICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzX2xlbiA9ICVkIixteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzX2xlbik7CiAgICAgICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIm15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llcyA9IDB4JXgiLCh1bnNpZ25lZClteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXMpOwogICAgICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXNfbGVuID0gJWQiLG15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llc19sZW4pOwogICAgICAgICAgICAgICAgICAgIHdwYV9oZXhkdW1wKE1TR19ERUJVRywgIldQQTogYmVhY29uX2llcyIsIG15RXZlbnREYXRhLmFzc29jX2luZm8uYmVhY29uX2llcywgbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzX2xlbik7CgogICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IHdlIG5vdGlmeSB3cGFfc3VwcGxpY2FudCBhbmQgZ2l2ZSBpdCBhbGwgdGhlIGFib3ZlIElFcyAqLwogICAgICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfQVNTT0NJTkZPLCAmbXlFdmVudERhdGEgKTsKCiAgICAgICAgICAgICAgICAgICAgLyogU2luY2UgYm90aCBBU1NPQ19SRVEvUlNQIGFuZCBiZWFjb24gSUVzIGFyZSBhbGxvY2F0ZWQgZHluYW1pY2FsbHkgYnkgdGhlIFV0aWxpdHkgQWRhcHRlciAtIHdlIG5lZWQgdG8gZnJlZSB0aGUgYnVmZmVycyAqLwogICAgICAgICAgICAgICAgICAgIG9zX2ZyZWUoIHBJbmZvICk7CiAgICAgICAgICAgICAgICAgICAgaWYoIHBTZWxlY3RlZEJzc2lkSW5mbyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3NfZnJlZSggcFNlbGVjdGVkQnNzaWRJbmZvICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXFfaWVzID0gTlVMTDsKICAgICAgICAgICAgICAgIG15RXZlbnREYXRhLmFzc29jX2luZm8ucmVxX2llc19sZW4gPSAwOwogICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5yZXNwX2llcyA9IE5VTEw7CiAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLnJlc3BfaWVzX2xlbiA9IDA7CiAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5hc3NvY19pbmZvLmJlYWNvbl9pZXMgPSBOVUxMOwogICAgICAgICAgICAgICAgbXlFdmVudERhdGEuYXNzb2NfaW5mby5iZWFjb25faWVzX2xlbiA9IDA7CiAgICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9ldmVudCggbXlTdXBwbC0+aFdwYVN1cHBsaWNhbnQsIEVWRU5UX0FTU09DSU5GTywgJm15RXZlbnREYXRhICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogV2Ugbm93IGNhbiBub3RpZnkgd3BhX3N1cHBsaWNhbnQgb2YgdGhlIGFzc29jaWF0aW9uIGV2ZW50IHNvIGl0IGNvdWxkIHN0YXJ0IGtleSBuZWdvdGlhdGlvbiAoaWYgbmVlZGVkKSAqLwogICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9ldmVudCggbXlTdXBwbC0+aFdwYVN1cHBsaWNhbnQsIEVWRU5UX0FTU09DLCBOVUxMICk7CiAgICAgICAgICAgIC8qIEFsbG93IERpc2Fzc29jaWF0aW9uICovCiAgICAgICAgICAgIG15U3VwcGwtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9IE5PX0JMT0NLOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJUENfRVZFTlRfRElTQVNTT0NJQVRFRDoKICAgICAgICAgICAgaWYoIG15U3VwcGwtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyAhPSBCTE9DS19ESVNBU1NPQyApIHsKICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gRGlzYXNzb2NpYXRlZCIpOwogICAgICAgICAgICAgICB3cGFfc3VwcGxpY2FudF9ldmVudCggbXlTdXBwbC0+aFdwYVN1cHBsaWNhbnQsIEVWRU5UX0RJU0FTU09DLCBOVUxMICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0lORk8sIndwYV9zdXBwbGljYW50IC0gRGlzYXNzb2NpYXRlZCAoYmxvY2tlZCkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJUENfRVZFTlRfU0NBTl9DT01QTEVURToKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gSVBDX0VWRU5UX1NDQU5fQ09NUExFVEUiKTsKICAgICAgICAgICAgd3BhX3N1cHBsaWNhbnRfZXZlbnQoIG15U3VwcGwtPmhXcGFTdXBwbGljYW50LCBFVkVOVF9TQ0FOX1JFU1VMVFMsIE5VTEwgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgSVBDX0VWRU5UX0FVVEhfU1VDQzoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfSU5GTywid3BhX3N1cHBsaWNhbnQgLSBJUENfRVZFTlRfQVVUSF9TVUNDIik7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9FQVBPTDoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gRUFQT0wiKTsKICAgICAgICAgICAgYnVmID0gcERhdGEtPnVCdWZmZXI7CiAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X3J4X2VhcG9sKCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgKFVJTlQ4ICopKGJ1ZiArIE1BQ19BRERSX0xFTiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVDggKikoYnVmICsgRVRIRVJORVRfSERSX0xFTiksIChwRGF0YS0+dUJ1ZmZlclNpemUgLSBFVEhFUk5FVF9IRFJfTEVOKSApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJUENfRVZFTlRfTUVESUFfU1BFQ0lGSUM6CiAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIE1lZGlhX1NwZWNpZmljIik7CiAgICAgICAgICAgIGJ1ZkxvbmcgPSAoVUlOVDMyICopcERhdGEtPnVCdWZmZXI7CiAgICAgICAgICAgIC8qIENoZWNrIGZvciBBdXRoZW50aWNhdGlvbiB0eXBlIG1lc3NhZ2VzIGZyb20gZHJpdmVyICovCiAgICAgICAgICAgIGlmKCAoKmJ1ZkxvbmcpID09IG9zODAyXzExU3RhdHVzVHlwZV9BdXRoZW50aWNhdGlvbiApIHsKICAgICAgICAgICAgICAgIHBNZWRpYVNwZWNpZmljQnVmID0gKE9TXzgwMl8xMV9BVVRIRU5USUNBVElPTl9SRVFVRVNUICopKGJ1ZkxvbmcgKyAxKTsKICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIE1lZGlhX1NwZWNpZmljIC0gQXV0aGVudGljYXRpb24gbWVzc2FnZSBkZXRlY3RlZDogJXUiLCBwTWVkaWFTcGVjaWZpY0J1Zi0+RmxhZ3MpOwogICAgICAgICAgICAgICAgLyogQ2hlY2sgZm9yIE1JQyBmYWlsdXJlIGV2ZW50ICovCiAgICAgICAgICAgICAgICBpZiggKHBNZWRpYVNwZWNpZmljQnVmLT5GbGFncyA9PSBPU184MDJfMTFfUkVRVUVTVF9QQUlSV0lTRV9FUlJPUikgfHwgKHBNZWRpYVNwZWNpZmljQnVmLT5GbGFncyA9PSBPU184MDJfMTFfUkVRVUVTVF9HUk9VUF9FUlJPUikpIHsKICAgICAgICAgICAgICAgICAgICAvKiBOb3RpZnkgd3BhX3N1cHBsaWNhbnQgb2YgTUlDIGZhaWx1cmUgKi8KICAgICAgICAgICAgICAgICAgICBteUV2ZW50RGF0YS5taWNoYWVsX21pY19mYWlsdXJlLnVuaWNhc3QgPSAxOwogICAgICAgICAgICAgICAgICAgIHdwYV9zdXBwbGljYW50X2V2ZW50KCBteVN1cHBsLT5oV3BhU3VwcGxpY2FudCwgRVZFTlRfTUlDSEFFTF9NSUNfRkFJTFVSRSwgJm15RXZlbnREYXRhICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBPU184MDJfMTFfUkVRVUVTVF9SRUFVVEggLSBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgKi8KICAgICAgICAgICAgICAgIC8qIE9TXzgwMl8xMV9SRVFVRVNUX0tFWVVQREFURSAtIG5vIGV2ZW50IG9mIHRoaXMgdHlwZSAqLwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElQQ19FVkVOVF9MSU5LX1NQRUVEOgogICAgICAgICAgICBidWZMb25nID0gKFVJTlQzMiAqKXBEYXRhLT51QnVmZmVyOwogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBMaW5rIFNwZWVkID0gJXUgTUIvcyIsICgoKmJ1ZkxvbmcpIC8gMikpOwogICAgICAgICAgICAvKiB3cGFfbXNnKG15U3VwcGwtPmhXcGFTdXBwbGljYW50LCBNU0dfSU5GTywgV1BBX0VWRU5UX0xJTktfU1BFRUQgIiV1IE1CL3MiLCAoKCpidWZMb25nKSAvIDIpKTsgKi8KICAgICAgICAgICAgbXlTdXBwbC0+bGlua19zcGVlZCA9ICh1bnNpZ25lZCkoKCpidWZMb25nKSAvIDIpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJUENfRVZFTlRfV1BBMl9QUkVBVVRIRU5USUNBVElPTjoKICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9zdXBwbGljYW50IC0gV1BBMl9QUkVBVVRIRU5USUNBVElPTiIpOwogICAgICAgICAgICBidWZMb25nID0gKFVJTlQzMiAqKXBEYXRhLT51QnVmZmVyOwogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiUHJlYXV0aCBTdGF0dXMgQ29kZSA9ICV1IiwqYnVmTG9uZyk7CiAgICAgICAgICAgIC8qIERtOiB3cGFfc3VwcGxpY2FudF9ldmVudCggbXlTdXBwbC0+aFdwYVN1cHBsaWNhbnQsIEVWRU5UX1BNS0lEX0NBTkRJREFURSwgJmRhdGEpOyAqLwogICAgICAgICAgICBicmVhazsKCiNpZm5kZWYgU1RBX0RLX1ZFUl81XzBfMF85NAogICAgICAgIGNhc2UgSVBDX0VWRU5UX0JUX0NPRVhfTU9ERToKICAgICAgICAgICAgYnRDb2V4U3RhdHVzID0gKGJ0Q29leFN0YXR1c190ICopcERhdGEtPnVCdWZmZXI7CiAgICAgICAgICAgIGlmKCAoYnRDb2V4U3RhdHVzICE9IE5VTEwpICYmIGJ0Q29leFN0YXR1cy0+c3RhdGUgKSB7CiAgICAgICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX3N1cHBsaWNhbnQgLSBCVF9DT0VYX01PREUgKFNHIGlzIE9OLCBtaW5UeFJhdGUgPSAlZClcbiIsIGJ0Q29leFN0YXR1cy0+bWluVHhSYXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJ3cGFfc3VwcGxpY2FudCAtIEJUX0NPRVhfTU9ERSAoU0cgaXMgT0ZGKVxuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgICAgIGNhc2UgSVBDX0VWRU5UX0xPV19TTlI6CiAgICAgICAgY2FzZSBJUENfRVZFTlRfTE9XX1JTU0k6CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwid3BhX3N1cHBsaWNhbnQgLSBVbmhhbmRsZWQgZHJpdmVyIGV2ZW50OiAlZCIsICgoSVBDX0VWRU5UX1BBUkFNUyopcERhdGEpLT51RXZlbnRUeXBlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2luaXQKUm91dGluZSBEZXNjcmlwdGlvbjogaW5pdCBkcml2ZXIgaW50ZXJmYWNlCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBpZm5hbWUgLSByZXR1cm4gaW50ZXJmYWNlIG5hbWUKUmV0dXJuIFZhbHVlOiBwb2ludGVyIHRvIGRyaXZlciBzdHJ1Y3R1cmUgKHRvIGJlIHN1cHBsaWVkIGxhdGVyIGJ5IHN1cHBsaWNhbnQgdG8gd3JhcHBlcnMpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIHZvaWQgKndwYV9kcml2ZXJfdGlzdGFfaW5pdCggdm9pZCAqcHJpdiwgY29uc3QgY2hhciAqaWZuYW1lICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnY7CiAgICBpbnQgc3RhdHVzOwogICAgVUlOVDMyIGRyaXZlclN0YXR1cyxyZXM7CiAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZWNob3NlcnZlcjsKICAgIE9TXzgwMl8xMV9NQUNfQUREUkVTUyBteU1hYzsKI2lmZGVmIENPTkZJR19USV9MT0NLRklMRQogICAgY2hhciBzdHJbMTBdOwojZW5kaWYKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiSW5pdGlhbGl6aW5nIFNUQS1ESyAlcyBpbnRlcmZhY2UuLi4iLFNXX1ZFUlNJT05fU1RSKTsKI2lmZGVmIENPTkZJR19USV9MT0NLRklMRQogICAgLyogVHJ5IHRvIG9wZW4gdGhlIGxvY2sgZmlsZSAqLwogICAgbGZwID0gb3BlbigiLi8ud3BhX3N1cHBsaWNhbnRfbG9ja2ZpbGUucGlkIiwgKE9fUkRXUiB8IE9fQ1JFQVQgfCBPX0VYQ0wpLCAwNjQwKTsKICAgIGlmKCBsZnAgPCAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJDYW5ub3Qgb3BlbiBwaWQtZmlsZS4uLkFib3J0aW5nLi4uXG4iKTsKICAgICAgICByZXR1cm4oIE5VTEwgKTsKICAgIH0KICAgIC8qIFRyeSB0byBnZXQgYSBmaWxlIGxvY2sgb24gdGhlIHBpZC1maWxlLiBJZiBhbm90aGVyIGluc3RhbmNlIGlzIHJ1bm5pbmcgYW5kIGFscmVhZHkgaGFzIGEgbG9jayAtIHdlIHdpbGwgZmFpbCAqLwojaWZuZGVmIEFORFJPSUQgLyogRG06ICEhISBsb2NrZiBpcyBub3QgaW1wbGVtZW50ZWQgaW4gQW5kcm9pZCAqLwogICAgaWYoIGxvY2tmKGxmcCxGX1RMT0NLLDApIDwgMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiQW5vdGhlciBpbnN0YW5jZSBvZiB3cGFfc3VwcGxpY2FudCBpcyBydW5uaW5nLi4uQWJvcnRpbmcuLi5cbiIpOwogICAgICAgIHJldHVybiggTlVMTCApOwogICAgfQojZW5kaWYKICAgIC8qIElmIHdlIGdvdCBoZXJlIC0gaXQgbWVhbnMgdGhhdCBubyBvdGhlciBpbnN0YW5jZSBpcyBydW5uaW5nIC0gd3JpdGUgcHJvY2VzcyBpZCB0byBwaWRfZmlsZSAqLwogICAgc3ByaW50ZihzdHIsICIlZFxuIiwgZ2V0cGlkKCkpOwogICAgd3JpdGUobGZwLHN0cixvc19zdHJsZW4oc3RyKSk7IC8qIHJlY29yZCBwaWQgdG8gbG9ja2ZpbGUgKi8KI2VuZGlmCgogICAgLyogQWxsb2NhdGUgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdG8gbWFuYWdlIGRyaXZlciAqLwogICAgbXlEcnYgPSBvc19tYWxsb2MoIHNpemVvZihzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhKSApOwoKICAgIC8qIElmIGZhaWxlZCB0byBhbGxvY2F0ZSAqLwogICAgaWYoIG15RHJ2ID09IE5VTEwgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRyb2wgc3RydWN0dXJlLi4uQWJvcnRpbmcuLi4iKTsKICAgICAgICBnb3RvIGxhYmVsX2luaXRfZXJyb3JfZmlsZTsKICAgIH0KCiAgICAvKiBaZXJvIG1lbW9yeSAqLwogICAgb3NfbWVtc2V0KCBteURydiwgMCwgc2l6ZW9mKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEpICk7CgogICAgLyogSW5pdGlhbGl6ZSBVdGlsaXR5IEFkYXB0ZXIgbW9kdWxlICovCiAgICBteURydi0+aERyaXZlciA9IFRJX0FkYXB0ZXJJbml0KCBUSVdMQU5fRFJWX05BTUUgKTsKCiAgICAvKiBJZiBjb3VsZG4ndCBpbml0aWFsaXplIC0gcmV0dXJuIE5VTEwgdG8gaW5kaWNhdGUgZXJyb3IgKi8KICAgIGlmKCBteURydi0+aERyaXZlciA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJFcnJvcjogZmFpbGVkIHRvIGluaXRpYWxpemUgVXRpbGl0eSBBZGFwdGVyIGludGVyZmFjZS4uLiIpOwogICAgICAgIGdvdG8gbGFiZWxfaW5pdF9lcnJvcl9mcmVlOwogICAgfQoKICAgIC8qIEdldCBXTEFOIGludGVyZmFjZSBtYWMgYWRkcmVzcyB0aHJvdWdoIFV0aWxpdHkgQWRhcHRlciAqLwogICAgcmVzID0gVElfR2V0Q3VycmVudEFkZHJlc3MoIG15RHJ2LT5oRHJpdmVyLCAmbXlNYWMgKTsKCiAgICBpZiggcmVzID09IChVSU5UMzIpLTEgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIkVycm9yOiBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBVdGlsaXR5IEFkYXB0ZXIgaW50ZXJmYWNlLi4uIik7CiAgICAgICAgZ290byBsYWJlbF9pbml0X2Vycm9yX2ZyZWU7CiAgICB9CgogICAgb3NfbWVtY3B5KCAmbXlEcnYtPm93bl9hZGRyLCAmbXlNYWMsIE1BQ19BRERSX0xFTiApOwoKICAgIHdwYV9kcml2ZXJfdGlzdGFfcmVnaXN0ZXJfZXZlbnRzKCBteURydiApOwoKICAgIC8qIEJsb2NrIGRpc2Fzc29jIGV2ZW50cyB1bnRpbCBjb25uZWN0ZWQgKi8KICAgIGlmKCBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID09IE5PX0JMT0NLICkKICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gTk9fQkxPQ0tfRElTQVNTT0NfSU5fUFJPR1JFU1M7CgogICAgLyogU3RvcmUgd3BhX3N1cHBsaWNhbnQgY29udGV4dCAqLwogICAgbXlEcnYtPmhXcGFTdXBwbGljYW50ID0gcHJpdjsKCiAgICBteURydi0+ZHJpdmVyRXZlbnRzU29ja2V0ID0gc29ja2V0KCBQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCApOwoKICAgIGlmKCBteURydi0+ZHJpdmVyRXZlbnRzU29ja2V0IDwgMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwiRXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgZHJpdmVyIGV2ZW50cyBzb2NrZXQuLi4gKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZ290byBsYWJlbF9pbml0X2Vycm9yX2ZyZWU7CiAgICB9CgogICAgb3NfbWVtc2V0KCAmZWNob3NlcnZlciwgMCwgc2l6ZW9mKGVjaG9zZXJ2ZXIpICk7ICAvKiBDbGVhciBzdHJ1Y3QgKi8KICAgIGVjaG9zZXJ2ZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7ICAgICAgICAgICAgICAgICAgLyogSW50ZXJuZXQvSVAgKi8KICAgIGVjaG9zZXJ2ZXIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7ICAgLyogSVAgYWRkcmVzcyAqLwogICAgZWNob3NlcnZlci5zaW5fcG9ydCA9IGh0b25zKFRJX0RSSVZFUl9NU0dfUE9SVCk7ICAvKiBzZXJ2ZXIgcG9ydCAqLwoKICAgIGlmKCBiaW5kKG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmVjaG9zZXJ2ZXIsIHNpemVvZihlY2hvc2VydmVyKSkgPCAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJFcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBkcml2ZXIgZXZlbnRzIHNvY2tldC4uLiAoJXMpIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBjbG9zZShteURydi0+ZHJpdmVyRXZlbnRzU29ja2V0KTsKICAgICAgICBnb3RvIGxhYmVsX2luaXRfZXJyb3JfZnJlZTsKICAgIH0KCiAgICBzdGF0dXMgPSBlbG9vcF9yZWdpc3Rlcl9yZWFkX3NvY2soIG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQsIHdwYV9kcml2ZXJfdGlzdGFfcmVjZWl2ZV9kcml2ZXJfZXZlbnQsIHByaXYsIG15RHJ2ICk7CgogICAgaWYoIHN0YXR1cyAhPSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0VSUk9SLCJFcnJvcjogZmFpbGVkIHRvIHJlZ2lzdGVyIHNvY2tldCBoYW5kbGVyLi4uIik7CiAgICB9CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsImRyaXZlciBldmVudHMgc29ja2V0IGlzIDB4JXguLi4iLG15RHJ2LT5kcml2ZXJFdmVudHNTb2NrZXQpOwoKICAgIC8qIFNpZ25hbCB0aGF0IGRyaXZlciBpcyBub3Qgc3RvcHBlZCAqLwogICAgbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQgPSBUUlVFOwoKICAgIC8qIFNldCBkZWZhdWx0IHNjYW4gdHlwZSAqLwogICAgbXlEcnYtPnNjYW5fdHlwZSA9IFNDQU5fVFlQRV9OT1JNQUxfQUNUSVZFOwogICAgbXlEcnYtPmZvcmNlX21lcmdlX2ZsYWcgPSAwOwogICAgc2Nhbl9pbml0KCBteURydiApOwoKICAgIC8qIFNldCBkZWZhdWx0IGFtb3VudCBvZiBjaGFubmVscyAqLwogICAgbXlEcnYtPnNjYW5fY2hhbm5lbHMgPSBjaGVja19hbmRfZ2V0X2J1aWxkX2NoYW5uZWxzKCk7CgogICAgLyogTGluayBTcGVlZCB3aWxsIGJlIHNldCBieSB0aGUgbWVzc2FnZSBmcm9tIHRoZSBkcml2ZXIgKi8KICAgIG15RHJ2LT5saW5rX3NwZWVkID0gMDsKCiAgICAvKiBCdENvZXggbW9kZSBpcyByZWFkIGZyb20gdGl3bGFuLmluaSBmaWxlICovCiAgICBteURydi0+YnRjb2V4X21vZGUgPSAxOyAvKiBTR19ESVNBQkxFICovCiAgICBteURydi0+YnRjb2V4X3NjYW4gPSBGQUxTRTsKCiAgICAvKiBSVFMgVGhyZXNob2xkIGlzIHJlYWQgZnJvbSB0aXdsYW4uaW5pIGZpbGUgKi8KICAgIG15RHJ2LT5ydHNfdGhyZXNob2xkID0gSEFMX0NUUkxfUlRTX1RIUkVTSE9MRF9NQVg7CgogICAgLyogUmV0dXJuIHBvaW50ZXIgdG8gb3VyIGRyaXZlciBzdHJ1Y3R1cmUgKi8KICAgIHJldHVybiggbXlEcnYgKTsKCmxhYmVsX2luaXRfZXJyb3JfZnJlZToKICAgIG9zX2ZyZWUoIG15RHJ2ICk7CmxhYmVsX2luaXRfZXJyb3JfZmlsZToKI2lmZGVmIENPTkZJR19USV9MT0NLRklMRQogICAgLyogQ2xvc2UgYW5kIGRlbGV0ZSB0aGUgcGlkLWxvY2stZmlsZSAqLwogICAgY2xvc2UobGZwKTsKICAgIHVubGluaygiLi93cGFfc3VwcGxpY2FudF9sb2NrZmlsZS5waWQiKTsKI2VuZGlmCiAgICByZXR1cm4oIE5VTEwgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfdW5sb2FkClJvdXRpbmUgRGVzY3JpcHRpb246IHVubG9hZCBkcml2ZXIKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlClJldHVybiBWYWx1ZTogTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyB2b2lkIHdwYV9kcml2ZXJfdGlzdGFfdW5sb2FkKCB2b2lkICpwcml2ICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CgogICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIndwYV9kcml2ZXJfdGlzdGFfdW5sb2FkIGNhbGxlZCIpOwogICAgLyogVW5yZWdpc3RlciBkcml2ZXIgZXZlbnRzICovCiAgICB3cGFfZHJpdmVyX3Rpc3RhX3VucmVnaXN0ZXJfZXZlbnRzKCBwcml2ICk7CiAgICAvKiBDbG9zZSBjb25uZWN0aW9uIHNvY2tldCAqLwogICAgY2xvc2UobXlEcnYtPmRyaXZlckV2ZW50c1NvY2tldCk7CiAgICAvKiBVbmxvYWQgVXRpbGl0eSBBZGFwdGVyICovCiAgICBUSV9BZGFwdGVyRGVpbml0KCBteURydi0+aERyaXZlciApOwogICAgLyogRnJlZSBhbGwgYWxsb2NhdGVkIG1lbW9yeSAqLwogICAgc2Nhbl9leGl0KCBteURydiApOwogICAgb3NfZnJlZSggbXlEcnYgKTsKI2lmZGVmIENPTkZJR19USV9MT0NLRklMRQogICAgLyogQ2xvc2UgYW5kIGRlbGV0ZSB0aGUgcGlkLWxvY2stZmlsZSAqLwogICAgY2xvc2UobGZwKTsKICAgIHVubGluaygiLi93cGFfc3VwcGxpY2FudF9sb2NrZmlsZS5waWQiKTsKI2VuZGlmCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiU1RBLURLICVzIGludGVyZmFjZSBEZWluaXRpYWxpemVkLi4uYnllISIsIFNXX1ZFUlNJT05fU1RSKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X21hY19hZGRyClJvdXRpbmUgRGVzY3JpcHRpb246IHJldHVybiBXTEFOIE1BQyBhZGRyZXNzCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQpSZXR1cm4gVmFsdWU6IHBvaW50ZXIgdG8gQlNTSUQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpjb25zdCB1OCAqd3BhX2RyaXZlcl90aXN0YV9nZXRfbWFjX2FkZHIoIHZvaWQgKnByaXYgKQp7CiAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICpteURydiA9IChzdHJ1Y3Qgd3BhX2RyaXZlcl90aV9kYXRhICopcHJpdjsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywid3BhX2RyaXZlcl90aXN0YV9nZXRfbWFjX2FkZHIgY2FsbGVkIik7CiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCBOVUxMICk7CiAgICByZXR1cm4oIChjb25zdCB1OCAqKSZteURydi0+b3duX2FkZHIgKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpSb3V0aW5lIE5hbWU6IHdwYV9kcml2ZXJfdGlzdGFfc2VuZF9lYXBvbApSb3V0aW5lIERlc2NyaXB0aW9uOiB0cmFuc21pdCBFQVBPTApBcmd1bWVudHM6CiAgIHByaXYgLSBwb2ludGVyIHRvIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKICAgZGF0YSAtIHBvaW50ZXIgdG8gRUFQT0wgZGF0YQogICBkYXRhX2xlbiAtIGxlbmd0aCBvZiBFQVBPTCBkYXRhClJldHVybiBWYWx1ZTogTm9uZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBpbnQgdGlfc2VuZF9lYXBvbCggdm9pZCAqcHJpdiwgY29uc3QgdTggKmRlc3QsIHUxNiBwcm90bywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqZGF0YSwgc2l6ZV90IGRhdGFfbGVuICkKewogICAgc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqbXlEcnYgPSAoc3RydWN0IHdwYV9kcml2ZXJfdGlfZGF0YSAqKXByaXY7CiAgICB1OCogRGF0YVdpdGhIZWFkZXIgPSBOVUxMOwogICAgdTE2IHByb3RvTmV0d29yazsKICAgIGludCByZXQgPSAwOwoKICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJUSSBzZW5kX2VhcG9sIGNhbGxlZCIpOwojaWZkZWYgSUVFRTgwMjFYX0VBUE9MCiAgICBEYXRhV2l0aEhlYWRlciA9IG9zX21hbGxvYyhkYXRhX2xlbiArIEVUSEVSTkVUX0hEUl9MRU4pOyAvKiAxNCBieXRlcyAqLwogICAgaWYoIERhdGFXaXRoSGVhZGVyID09IE5VTEwgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfRVJST1IsIlRJIHNlbmRfZWFwb2wgZmFpbGVkIHRvIGFsbG9jIGZ1bGwgYnVmZmVyIik7CiAgICAgICAgcmV0dXJuKCAtMSApOwogICAgfQoKICAgIG9zX21lbWNweShEYXRhV2l0aEhlYWRlciwgZGVzdCwgTUFDX0FERFJfTEVOKTsgLyogNiBieXRlcyAqLwogICAgb3NfbWVtY3B5KERhdGFXaXRoSGVhZGVyK01BQ19BRERSX0xFTiwgbXlEcnYtPm93bl9hZGRyLCBNQUNfQUREUl9MRU4pOwogICAgcHJvdG9OZXR3b3JrID0gaHRvbnMocHJvdG8pOwogICAgb3NfbWVtY3B5KERhdGFXaXRoSGVhZGVyKyhNQUNfQUREUl9MRU48PDEpLCAmcHJvdG9OZXR3b3JrLCBzaXplb2YodTE2KSk7IC8qIDIgYnl0ZXMgKi8KCiAgICBvc19tZW1jcHkoRGF0YVdpdGhIZWFkZXIrRVRIRVJORVRfSERSX0xFTiwgZGF0YSwgZGF0YV9sZW4pOwogICAgZGF0YV9sZW4gKz0gRVRIRVJORVRfSERSX0xFTjsKCiAgICB3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJXUEE6IEZVTEwgVFggRUFQT0wtS2V5IiwgRGF0YVdpdGhIZWFkZXIsIGRhdGFfbGVuKTsKCiAgICAvKiBUcmFuc21pdCBFQVBPTCBwYWNrZXQgKi8KICAgIHJldCA9IFRJX1NlbmRfRUFQT0xfUGFja2V0KCBteURydi0+aERyaXZlciwgKHZvaWQgKilEYXRhV2l0aEhlYWRlciwgZGF0YV9sZW4gKTsKICAgIG9zX2ZyZWUoRGF0YVdpdGhIZWFkZXIpOwojZW5kaWYKICAgIHJldHVybiggVEkyV1BBX1NUQVRVUyhyZXQpICk7Cn0KCiNpZm5kZWYgU1RBX0RLX1ZFUl81XzBfMF85NAovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClJvdXRpbmUgTmFtZTogcHJlcGFyZV9maWx0ZXJfc3RydWN0ClJvdXRpbmUgRGVzY3JpcHRpb246IGZpbGxzIHJ4IGRhdGEgZmlsdGVyIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVyIHR5cGUKQXJndW1lbnRzOgogICBwcml2IC0gcG9pbnRlciB0byBwcml2YXRlIGRhdGEgc3RydWN0dXJlCiAgIHR5cGUgLSB0eXBlIG9mIG1hYyBhZGRyZXNzCiAgIGRmcmVxX3B0ciAtIHBvaW50ZXIgdG8gVElXTEFOX0RBVEFfRklMVEVSX1JFUVVFU1Qgc3RydWN0dXJlClJldHVybiBWYWx1ZTogMCAtIHN1Y2Nlc3MsIC0xIC0gZXJyb3IKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgaW50IHByZXBhcmVfZmlsdGVyX3N0cnVjdCggdm9pZCAqcHJpdiwgaW50IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVdMQU5fREFUQV9GSUxURVJfUkVRVUVTVCAqZGZyZXFfcHRyICkKewogICAgdTggKm1hY2FkZHIgPSBOVUxMOwogICAgc2l6ZV90IGxlbiA9IDA7CiAgICB1OCBtYXNrID0gMDsKICAgIGludCByZXQgPSAtMTsKCiAgICB3cGFfcHJpbnRmKE1TR19FUlJPUiwgIiVzOiB0eXBlPSVkIiwgX19mdW5jX18sIHR5cGUpOwogICAgc3dpdGNoICh0eXBlICkgewogICAgICBjYXNlIFJYX1NFTEZfRklMVEVSOgogICAgICAgIG1hY2FkZHIgPSAodTggKil3cGFfZHJpdmVyX3Rpc3RhX2dldF9tYWNfYWRkcihwcml2KTsKICAgICAgICBsZW4gPSBNQUNfQUREUl9MRU47CiAgICAgICAgbWFzayA9IDB4M0Y7IC8qIDYgYnl0ZXMgKi8KICAgICAgICBicmVhazsKICAgICAgY2FzZSBSWF9CUk9BRENBU1RfRklMVEVSOgogICAgICAgIG1hY2FkZHIgPSAodTggKikiXHhGRlx4RkZceEZGXHhGRlx4RkZceEZGIjsKICAgICAgICBsZW4gPSBNQUNfQUREUl9MRU47CiAgICAgICAgbWFzayA9IDB4M0Y7IC8qIDYgYnl0ZXMgKi8KICAgICAgICBicmVhazsKICAgICAgY2FzZSBSWF9JUFY0X01VTFRJQ0FTVF9GSUxURVI6CiAgICAgICAgbWFjYWRkciA9ICh1OCAqKSJceDAxXHgwMFx4NUUiOwogICAgICAgIGxlbiA9IDM7CiAgICAgICAgbWFzayA9IDB4NzsgLyogMyBieXRlcyAqLwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIFJYX0lQVjZfTVVMVElDQVNUX0ZJTFRFUjoKICAgICAgICBtYWNhZGRyID0gKHU4ICopIlx4MzNceDMzIjsKICAgICAgICBsZW4gPSAyOwogICAgICAgIG1hc2sgPSAweDM7IC8qIDIgYnl0ZXMgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChsZW4gJiYgbWFjYWRkcikgewogICAgICAgIGRmcmVxX3B0ci0+T2Zmc2V0ID0gMDsKICAgICAgICBkZnJlcV9wdHItPk1hc2tMZW5ndGggPSAxOwogICAgICAgIGRmcmVxX3B0ci0+TWFza1swXSA9IG1hc2s7CiAgICAgICAgZGZyZXFfcHRyLT5QYXR0ZXJuTGVuZ3RoID0gbGVuOwogICAgICAgIG9zX21lbWNweSggZGZyZXFfcHRyLT5QYXR0ZXJuLCBtYWNhZGRyLCBsZW4gKTsKICAgICAgICByZXQgPSAwOwogICAgfQogICAgcmV0dXJuKCByZXQgKTsKfQojZW5kaWYKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KUm91dGluZSBOYW1lOiB3cGFfZHJpdmVyX3Rpc3RhX2RyaXZlcl9jbWQKUm91dGluZSBEZXNjcmlwdGlvbjogZXhlY3V0ZXMgZHJpdmVyLXNwZWNpZmljIGNvbW1hbmRzCkFyZ3VtZW50czoKICAgcHJpdiAtIHBvaW50ZXIgdG8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICBjbWQgLSBjb21tYW5kCiAgIGJ1ZiAtIHJldHVybiBidWZmZXIKICAgYnVmX2xlbiAtIGJ1ZmZlciBsZW5ndGgKUmV0dXJuIFZhbHVlOiBhY3R1YWwgYnVmZmVyIGxlbmd0aCAtIHN1Y2Nlc3MsIC0xIC0gZmFpbHVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmludCB3cGFfZHJpdmVyX3Rpc3RhX2RyaXZlcl9jbWQoIHZvaWQgKnByaXYsIGNoYXIgKmNtZCwgY2hhciAqYnVmLCBzaXplX3QgYnVmX2xlbiApCnsKICAgIHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKm15RHJ2ID0gKHN0cnVjdCB3cGFfZHJpdmVyX3RpX2RhdGEgKilwcml2OwogICAgaW50IHJldCA9IC0xLCBwcmV2X2V2ZW50czsKCiAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIiVzICVzIiwgX19mdW5jX18sIGNtZCk7CgogICAgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAic3RhcnQiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTdGFydCBjb21tYW5kIik7CiAgICAgICAgcHJldl9ldmVudHMgPSBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzOwogICAgICAgIG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHMgPSBteURydi0+YmxvY2tfZGlzYXNzb2NfcHJldjsKICAgICAgICByZXQgPSBUSV9TdGFydCggbXlEcnYtPmhEcml2ZXIgKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICAvKiBTaWduYWwgdGhhdCBkcml2ZXIgaXMgbm90IGxvYWRlZCB5ZXQgKi8KICAgICAgICAgICAgbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQgPSBUUlVFOwogICAgICAgICAgICB3cGFfbXNnKG15RHJ2LT5oV3BhU3VwcGxpY2FudCwgTVNHX0lORk8sIFdQQV9FVkVOVF9EUklWRVJfU1RBVEUgIlNUQVJURUQiKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfZXZlbnRzID0gcHJldl9ldmVudHM7CiAgICAgICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKICAgIH0KCiAgICAvKiBJZiBkcml2ZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCAtIHdlIGNhbm5vdCBhY2Nlc3MgaXQgc28gcmV0dXJuICovCiAgICBUSV9DSEVDS19EUklWRVIoIG15RHJ2LT5kcml2ZXJfaXNfbG9hZGVkLCAtMSApOwoKICAgIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInN0b3AiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTdG9wIGNvbW1hbmQiKTsKICAgICAgICBteURydi0+YmxvY2tfZGlzYXNzb2NfcHJldiA9IG15RHJ2LT5ibG9ja19kaXNhc3NvY19ldmVudHM7CiAgICAgICAgbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9IEJMT0NLX0RJU0FTU09DOyAvKiBCbG9jayBtZXNzYWdlICovCiAgICAgICAgcmV0ID0gVElfU3RvcCggbXlEcnYtPmhEcml2ZXIgKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICAvKiBTaWduYWwgdGhhdCBkcml2ZXIgaXMgbm90IGxvYWRlZCB5ZXQgKi8KICAgICAgICAgICAgbXlEcnYtPmRyaXZlcl9pc19sb2FkZWQgPSBGQUxTRTsKICAgICAgICAgICAgd3BhX21zZyhteURydi0+aFdwYVN1cHBsaWNhbnQsIE1TR19JTkZPLCBXUEFfRVZFTlRfRFJJVkVSX1NUQVRFICJTVE9QUEVEIik7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgbXlEcnYtPmJsb2NrX2Rpc2Fzc29jX2V2ZW50cyA9IG15RHJ2LT5ibG9ja19kaXNhc3NvY19wcmV2OwogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJtYWNhZGRyIikgPT0gMCApIHsKICAgICAgICB1OCAqbWFjYWRkciA9ICh1OCAqKXdwYV9kcml2ZXJfdGlzdGFfZ2V0X21hY19hZGRyKHByaXYpOwogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJNYWNhZGRyIGNvbW1hbmQiKTsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywgIiAgIE1hY2FkZHIgPSAiIE1BQ1NUUiwgTUFDMlNUUihtYWNhZGRyKSk7CiAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAiTWFjYWRkciA9ICIgTUFDU1RSICJcbiIsIE1BQzJTVFIobWFjYWRkcikpOwogICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInNjYW4tcGFzc2l2ZSIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlNjYW4gUGFzc2l2ZSBjb21tYW5kIik7CiAgICAgICAgbXlEcnYtPnNjYW5fdHlwZSA9IFNDQU5fVFlQRV9OT1JNQUxfUEFTU0lWRTsKICAgICAgICByZXQgPSAwOwogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJzY2FuLWFjdGl2ZSIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlNjYW4gQWN0aXZlIGNvbW1hbmQiKTsKICAgICAgICBteURydi0+c2Nhbl90eXBlID0gU0NBTl9UWVBFX05PUk1BTF9BQ1RJVkU7CiAgICAgICAgcmV0ID0gMDsKICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAic2Nhbi1tb2RlIikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiU2NhbiBNb2RlIGNvbW1hbmQiKTsKICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJTY2FuTW9kZSA9ICV1XG4iLCBteURydi0+c2Nhbl90eXBlKTsKICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJsaW5rc3BlZWQiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJMaW5rIFNwZWVkIGNvbW1hbmQiKTsKICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJMaW5rU3BlZWQgJXVcbiIsIG15RHJ2LT5saW5rX3NwZWVkKTsKICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RybmNhc2VjbXAoY21kLCAic2Nhbi1jaGFubmVscyIsIDEzKSA9PSAwICkgewogICAgICAgIGludCBub09mQ2hhbjsKICAgICAgICBjaGFyICpjcCA9IGNtZCArIDEzOwogICAgICAgIGNoYXIgKmVuZHA7CgogICAgICAgIGlmICgqY3AgIT0gJ1wwJykgewogICAgICAgICAgICBub09mQ2hhbiA9IHN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlNjYW4gQ2hhbm5lbHMgY29tbWFuZCA9ICVkIiwgbm9PZkNoYW4pOwogICAgICAgICAgICAgICAgaWYoIChub09mQ2hhbiA+IDApICYmIChub09mQ2hhbiA8PSBNQVhfTlVNQkVSX09GX0NIQU5ORUxTX1BFUl9TQ0FOKSApIHsKICAgICAgICAgICAgICAgICAgICBteURydi0+c2Nhbl9jaGFubmVscyA9IG5vT2ZDaGFuOwogICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJTY2FuLUNoYW5uZWxzID0gJWRcbiIsIG15RHJ2LT5zY2FuX2NoYW5uZWxzKTsKICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAicnNzaS1hcHByb3giKSA9PSAwICkgewogICAgICAgIHN0cnVjdCB3cGFfc2Nhbl9yZXN1bHQgKmN1cl9yZXM7CiAgICAgICAgc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcyA9IChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKikobXlEcnYtPmhXcGFTdXBwbGljYW50KTsKICAgICAgICBpbnQgcnNzaSwgbGVuOwoKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywicnNzaS1hcHByb3ggY29tbWFuZCIpOwoKICAgICAgICBpZiggIXdwYV9zICkKICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICBjdXJfcmVzID0gc2Nhbl9nZXRfYnlfYnNzaWQoIG15RHJ2LCB3cGFfcy0+YnNzaWQgKTsKICAgICAgICBpZiggY3VyX3JlcyApIHsKICAgICAgICAgICAgbGVuID0gKGludCkoY3VyX3Jlcy0+c3NpZF9sZW4pOwogICAgICAgICAgICByc3NpID0gY3VyX3Jlcy0+bGV2ZWw7CiAgICAgICAgICAgIGlmKCAobGVuID4gMCkgJiYgKGxlbiA8PSBNQVhfU1NJRF9MRU4pICYmIChsZW4gPCAoaW50KWJ1Zl9sZW4pKSB7CiAgICAgICAgICAgICAgICBvc19tZW1jcHkoICh2b2lkICopYnVmLCAodm9pZCAqKShjdXJfcmVzLT5zc2lkKSwgbGVuICk7CiAgICAgICAgICAgICAgICByZXQgPSBsZW47CiAgICAgICAgICAgICAgICByZXQgKz0gc25wcmludGYoJmJ1ZltyZXRdLCBidWZfbGVuLWxlbiwgIiByc3NpICVkXG4iLCByc3NpKTsKICAgICAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJyc3NpIikgPT0gMCApIHsKI2lmIDEKICAgICAgICB1OCBzc2lkW01BWF9TU0lEX0xFTl07CiAgICAgICAgaW50IHJzc2ksIGxlbjsKCiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsInJzc2kgY29tbWFuZCIpOwoKICAgICAgICByZXQgPSBUSV9HZXRSU1NJKCBteURydi0+aERyaXZlciwgJnJzc2kgKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICBsZW4gPSB3cGFfZHJpdmVyX3Rpc3RhX2dldF9zc2lkKCBwcml2LCAodTggKilzc2lkICk7CiAgICAgICAgICAgIGlmKCAobGVuID4gMCkgJiYgKGxlbiA8PSBNQVhfU1NJRF9MRU4pICYmIChsZW4gPCAoaW50KWJ1Zl9sZW4pKSB7CiAgICAgICAgICAgICAgICBvc19tZW1jcHkoICh2b2lkICopYnVmLCAodm9pZCAqKXNzaWQsIGxlbiApOwogICAgICAgICAgICAgICAgcmV0ID0gbGVuOwogICAgICAgICAgICAgICAgcmV0ICs9IHNucHJpbnRmKCZidWZbcmV0XSwgYnVmX2xlbi1sZW4sICIgcnNzaSAlZFxuIiwgcnNzaSk7CiAgICAgICAgICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KI2Vsc2UKICAgICAgICBPU184MDJfMTFfQlNTSURfRVggYnNzaWRJbmZvOwoKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywicnNzaSBjb21tYW5kIik7CgogICAgICAgIHJldCA9IFRJX0dldFNlbGVjdGVkQlNTSURJbmZvKCBteURydi0+aERyaXZlciwgKE9TXzgwMl8xMV9CU1NJRF9FWCAqKSZic3NpZEluZm8gKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICBpZiggYnNzaWRJbmZvLlNzaWQuU3NpZExlbmd0aCAhPSAwICYmIGJzc2lkSW5mby5Tc2lkLlNzaWRMZW5ndGggPCBidWZfbGVuKSB7CiAgICAgICAgICAgICAgICBvc19tZW1jcHkoICh2b2lkICopYnVmLCAodm9pZCAqKShic3NpZEluZm8uU3NpZC5Tc2lkKSwgYnNzaWRJbmZvLlNzaWQuU3NpZExlbmd0aCApOwogICAgICAgICAgICAgICAgcmV0ID0gYnNzaWRJbmZvLlNzaWQuU3NpZExlbmd0aDsKICAgICAgICAgICAgICAgIHJldCArPSBzbnByaW50ZigmYnVmW3JldF0sIGJ1Zl9sZW4tcmV0LCAiIHJzc2kgJWRcbiIsIGJzc2lkSW5mby5Sc3NpKTsKICAgICAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCA9IC0xOwogICAgICAgIH0KI2VuZGlmCiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJwb3dlcm1vZGUiLCA5KSA9PSAwICkgewogICAgICAgIHUzMiBydHNUaHJlc2hvbGQgPSBteURydi0+cnRzX3RocmVzaG9sZDsKICAgICAgICB1MzIgbW9kZTsKICAgICAgICBjaGFyICpjcCA9IGNtZCArIDk7CiAgICAgICAgY2hhciAqZW5kcDsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIG1vZGUgPSAodTMyKXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlBvd2VyIE1vZGUgY29tbWFuZCA9ICV1IiwgbW9kZSk7CiAgICAgICAgICAgICAgICBpZiggbW9kZSA8PSBPU19QT1dFUl9NT0RFX0xPTkdfRE9aRSApCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gVElfQ29uZmlnUG93ZXJNYW5hZ2VtZW50KCBteURydi0+aERyaXZlciwgbW9kZSApOwogICAgICAgICAgICAgICAgaWYoIG1vZGUgPT0gT1NfUE9XRVJfTU9ERV9BQ1RJVkUgKQogICAgICAgICAgICAgICAgICAgIHJ0c1RocmVzaG9sZCA9IDA7CiAgICAgICAgICAgICAgICBpZiggVElfU2V0UlRTVGhyZXNob2xkKCBteURydi0+aERyaXZlciwgcnRzVGhyZXNob2xkICkgIT0gT0sgKQogICAgICAgICAgICAgICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJTZXQgUlRTIHRocmVzaG9sZCA9ICV1IGZhaWxlZCIsIHJ0c1RocmVzaG9sZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJnZXRwb3dlciIsIDgpID09IDAgKSB7CiAgICAgICAgdTMyIG1vZGU7CgogICAgICAgIHJldCA9IFRJX0dldFBvd2VyTW9kZSggbXlEcnYtPmhEcml2ZXIsIChPU184MDJfMTFfUE9XRVJfUFJPRklMRSAqKSZtb2RlKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJwb3dlcm1vZGUgPSAldVxuIiwgbW9kZSk7CiAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJnZXQtcnRzLXRocmVzaG9sZCIsIDE3KSA9PSAwICkgewogICAgICAgIHRpVUlOVDMyIHJ0c1RocmVzaG9sZCA9IDA7CgogICAgICAgIHJldCA9IFRJX0dldFJUU1RocmVzaG9sZCggbXlEcnYtPmhEcml2ZXIsICZydHNUaHJlc2hvbGQgKTsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiR2V0IFJUUyBUaHJlc2hvbGQgY29tbWFuZCA9ICVkIiwgcnRzVGhyZXNob2xkKTsKICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIGJ1Zl9sZW4sICJydHMtdGhyZXNob2xkID0gJXVcbiIsIHJ0c1RocmVzaG9sZCk7CiAgICAgICAgICAgIGlmIChyZXQgPCAoaW50KWJ1Zl9sZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiggcmV0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJzZXQtcnRzLXRocmVzaG9sZCIsIDE3KSA9PSAwICkgewogICAgICAgIHRpVUlOVDMyIHJ0c1RocmVzaG9sZCA9IDA7CiAgICAgICAgY2hhciAqY3AgPSBjbWQgKyAxNzsKICAgICAgICBjaGFyICplbmRwOwoKICAgICAgICBpZiAoKmNwICE9ICdcMCcpIHsKICAgICAgICAgICAgcnRzVGhyZXNob2xkID0gKHRpVUlOVDMyKXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJUUyBUaHJlc2hvbGQgY29tbWFuZCA9ICVkIiwgcnRzVGhyZXNob2xkKTsKICAgICAgICAgICAgICAgIGlmKCBydHNUaHJlc2hvbGQgPD0gSEFMX0NUUkxfUlRTX1RIUkVTSE9MRF9NQVggKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gVElfU2V0UlRTVGhyZXNob2xkKCBteURydi0+aERyaXZlciwgcnRzVGhyZXNob2xkICk7CiAgICAgICAgICAgICAgICAgICAgaWYoIHJldCA9PSBPSyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXlEcnYtPnJ0c190aHJlc2hvbGQgPSBydHNUaHJlc2hvbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RyY2FzZWNtcChjbWQsICJidGNvZXhzY2FuLXN0YXJ0IikgPT0gMCApIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiQlQgQ29leCBTY2FuIFN0YXJ0IGNvbW1hbmQiKTsKICAgICAgICBteURydi0+YnRjb2V4X3NjYW4gPSBUUlVFOwogICAgICAgIHJldCA9IDA7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgImJ0Y29leHNjYW4tc3RvcCIpID09IDAgKSB7CiAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIkJUIENvZXggU2NhbiBTdG9wIGNvbW1hbmQiKTsKICAgICAgICBteURydi0+YnRjb2V4X3NjYW4gPSBGQUxTRTsKICAgICAgICByZXQgPSAwOwogICAgfQojaWZuZGVmIFNUQV9ES19WRVJfNV8wXzBfOTQKICAgIGVsc2UgaWYoIG9zX3N0cmNhc2VjbXAoY21kLCAicnhmaWx0ZXItc3RhcnQiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJSeCBEYXRhIEZpbHRlciBTdGFydCBjb21tYW5kIik7CiAgICAgICAgcmV0ID0gVElfRW5hYmxlRGlzYWJsZVJ4RGF0YUZpbHRlcnMoIG15RHJ2LT5oRHJpdmVyLCBUUlVFICk7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInJ4ZmlsdGVyLXN0b3AiKSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJSeCBEYXRhIEZpbHRlciBTdG9wIGNvbW1hbmQiKTsKICAgICAgICByZXQgPSBUSV9FbmFibGVEaXNhYmxlUnhEYXRhRmlsdGVycyggbXlEcnYtPmhEcml2ZXIsIEZBTFNFICk7CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInJ4ZmlsdGVyLXN0YXRpc3RpY3MiKSA9PSAwICkgewogICAgICAgIFRJV0xBTl9EQVRBX0ZJTFRFUl9TVEFUSVNUSUNTIHN0YXRzOwogICAgICAgIGludCBsZW4sIGk7CgogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJSeCBEYXRhIEZpbHRlciBTdGF0aXN0aWNzIGNvbW1hbmQiKTsKICAgICAgICByZXQgPSBUSV9HZXRSeERhdGFGaWx0ZXJzU3RhdGlzdGljcyggbXlEcnYtPmhEcml2ZXIsICZzdGF0cyApOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgIlJ4RmlsdGVyU3RhdDogJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5Vbm1hdGNoZWRQYWNrZXRzQ291bnQpOwogICAgICAgICAgICBmb3IoaT0wOyggaSA8IE1BWF9OVU1fREFUQV9GSUxURVJTICk7aSsrKSB7CiAgICAgICAgICAgICAgICByZXQgKz0gc25wcmludGYoJmJ1ZltyZXRdLCBidWZfbGVuLXJldCwgIiAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLk1hdGNoZWRQYWNrZXRzQ291bnRbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldCArPSBzbnByaW50ZigmYnVmW3JldF0sIGJ1Zl9sZW4tcmV0LCAiXG4iKTsKICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoIG9zX3N0cm5jYXNlY21wKGNtZCwgInJ4ZmlsdGVyLWFkZCIsIDEyKSA9PSAwICkgewogICAgICAgIFRJV0xBTl9EQVRBX0ZJTFRFUl9SRVFVRVNUIGRmcmVxOwogICAgICAgIGNoYXIgKmNwID0gY21kICsgMTI7CiAgICAgICAgY2hhciAqZW5kcDsKICAgICAgICBpbnQgdHlwZTsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIHR5cGUgPSAoaW50KXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJ4IERhdGEgRmlsdGVyIEFkZCBbJWRdIGNvbW1hbmQiLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldCA9IHByZXBhcmVfZmlsdGVyX3N0cnVjdCggcHJpdiwgdHlwZSwgJmRmcmVxICk7CiAgICAgICAgICAgICAgICBpZiggcmV0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gVElfQWRkUnhEYXRhRmlsdGVyKCBteURydi0+aERyaXZlciwgJmRmcmVxICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJuY2FzZWNtcChjbWQsICJyeGZpbHRlci1yZW1vdmUiLDE1KSA9PSAwICkgewogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJSeCBEYXRhIEZpbHRlciBSZW1vdmUgY29tbWFuZCIpOwogICAgICAgIFRJV0xBTl9EQVRBX0ZJTFRFUl9SRVFVRVNUIGRmcmVxOwogICAgICAgIGNoYXIgKmNwID0gY21kICsgMTU7CiAgICAgICAgY2hhciAqZW5kcDsKICAgICAgICBpbnQgdHlwZTsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIHR5cGUgPSAoaW50KXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIlJ4IERhdGEgRmlsdGVyIFJlbW92ZSBbJWRdIGNvbW1hbmQiLCB0eXBlKTsKICAgICAgICAgICAgICAgIHJldCA9IHByZXBhcmVfZmlsdGVyX3N0cnVjdCggcHJpdiwgdHlwZSwgJmRmcmVxICk7CiAgICAgICAgICAgICAgICBpZiggcmV0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gVElfUmVtb3ZlUnhEYXRhRmlsdGVyKCBteURydi0+aERyaXZlciwgJmRmcmVxICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgInNuciIpID09IDAgKSB7CiAgICAgICAgdTMyIHNucjsKCiAgICAgICAgcmV0ID0gVElfR2V0U05SKCBteURydi0+aERyaXZlciwgJnNuciApOwogICAgICAgIGlmKCByZXQgPT0gT0sgKSB7CiAgICAgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1ZiwgYnVmX2xlbiwgInNuciA9ICV1XG4iLCBzbnIpOwogICAgICAgICAgICBpZiAocmV0IDwgKGludClidWZfbGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4oIHJldCApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiggb3Nfc3RybmNhc2VjbXAoY21kLCAiYnRjb2V4bW9kZSIsIDEwKSA9PSAwICkgewogICAgICAgIHUzMiBtb2RlOwogICAgICAgIGNoYXIgKmNwID0gY21kICsgMTA7CiAgICAgICAgY2hhciAqZW5kcDsKCiAgICAgICAgaWYgKCpjcCAhPSAnXDAnKSB7CiAgICAgICAgICAgIG1vZGUgPSAodTMyKXN0cnRvbChjcCwgJmVuZHAsIDApOwogICAgICAgICAgICBpZiAoZW5kcCAhPSBjcCkgewogICAgICAgICAgICAgICAgd3BhX3ByaW50ZihNU0dfREVCVUcsIkJ0Q29leCBNb2RlIGNvbW1hbmQgPSAldSIsIG1vZGUpOwogICAgICAgICAgICAgICAgcmV0ID0gVElfU2V0QnRDb2VFbmFibGUoIG15RHJ2LT5oRHJpdmVyLCBtb2RlICk7CiAgICAgICAgICAgICAgICBpZiggcmV0ID09IE9LICkgewogICAgICAgICAgICAgICAgICAgIG15RHJ2LT5idGNvZXhfbW9kZSA9IG1vZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmKCBvc19zdHJjYXNlY21wKGNtZCwgImJ0Y29leHN0YXQiKSA9PSAwICkgewogICAgICAgIHUzMiBzdGF0dXMgPSBteURydi0+YnRjb2V4X21vZGU7CgogICAgICAgIHdwYV9wcmludGYoTVNHX0RFQlVHLCJCdENvZXggU3RhdHVzIik7CiAgICAgICAgcmV0ID0gVElfU2V0QnRDb2VHZXRTdGF0dXMoIG15RHJ2LT5oRHJpdmVyLCAodGlVSU5UMzIgKikmc3RhdHVzICk7CiAgICAgICAgaWYoIHJldCA9PSBPSyApIHsKICAgICAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBidWZfbGVuLCAiYnRjb2V4c3RhdHVzID0gMHgleFxuIiwgc3RhdHVzKTsKICAgICAgICAgICAgaWYgKHJldCA8IChpbnQpYnVmX2xlbikgewogICAgICAgICAgICAgICAgcmV0dXJuKCByZXQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KI2VuZGlmCiAgICBlbHNlIHsKICAgICAgICB3cGFfcHJpbnRmKE1TR19ERUJVRywiVW5zdXBwb3J0ZWQgY29tbWFuZCIpOwogICAgfQogICAgcmV0dXJuKCBUSTJXUEFfU1RBVFVTKHJldCkgKTsKfQoKLyogRmlsbCBkcml2ZXJfb3BzIHN0cnVjdHVyZSB0byBwcm92aWRlIHdwYV9zdXBwbGljYW50IGNvcmUgd2l0aCB3cmFwcGVyIHJvdXRpbmVzICovCnN0cnVjdCB3cGFfZHJpdmVyX29wcyB3cGFfZHJpdmVyX2N1c3RvbV9vcHMgPSB7CiAgICAubmFtZSAgICAgICAgICAgPSBUSVdMQU5fRFJWX05BTUUsCiAgICAuZGVzYyAgICAgICAgICAgPSAiVEkgU3RhdGlvbiBEcml2ZXIiLAogICAgLmluaXQgICAgICAgICAgID0gd3BhX2RyaXZlcl90aXN0YV9pbml0LAogICAgLmRlaW5pdCAgICAgICAgID0gd3BhX2RyaXZlcl90aXN0YV91bmxvYWQsCiAgICAuZ2V0X2Jzc2lkICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX2dldF9ic3NpZCwKICAgIC5nZXRfc3NpZCAgICAgICA9IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X3NzaWQsCiAgICAuc2V0X3dwYSAgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF93cGEsCiAgICAuc2V0X2tleSAgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF9rZXksCiAgICAuc2V0X3BhcmFtICAgICAgPSBOVUxMLAogICAgLnNldF9jb3VudGVybWVhc3VyZXMgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF9jb3VudGVybWVhc3VyZXMsCiAgICAuc2V0X2Ryb3BfdW5lbmNyeXB0ZWQgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2V0X2Ryb3BfdW5lbmNyeXB0ZWQsCiAgICAuc2NhbiAgICAgICAgICAgICAgICAgICA9IHdwYV9kcml2ZXJfdGlzdGFfc2NhbiwKICAgIC5nZXRfc2Nhbl9yZXN1bHRzICAgICAgID0gd3BhX2RyaXZlcl90aXN0YV9nZXRfc2Nhbl9yZXN1bHRzLAogICAgLmRlYXV0aGVudGljYXRlID0gd3BhX2RyaXZlcl90aXN0YV9kZWF1dGhlbnRpY2F0ZSwKICAgIC5kaXNhc3NvY2lhdGUgICA9IHdwYV9kcml2ZXJfdGlzdGFfZGlzYXNzb2NpYXRlLAogICAgLmFzc29jaWF0ZSAgICAgID0gd3BhX2RyaXZlcl90aXN0YV9hc3NvY2lhdGUsCiAgICAuc2V0X2F1dGhfYWxnICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF9hdXRoX2FsZywKICAgIC5nZXRfbWFjX2FkZHIgICA9IHdwYV9kcml2ZXJfdGlzdGFfZ2V0X21hY19hZGRyLAogICAgLnNlbmRfZWFwb2wgICAgID0gdGlfc2VuZF9lYXBvbCwKICAgIC5hZGRfcG1raWQgICAgICA9IE5VTEwsCiAgICAucmVtb3ZlX3Bta2lkICAgPSBOVUxMLAogICAgLmZsdXNoX3Bta2lkICAgID0gTlVMTCwKICAgIC5nZXRfY2FwYSAgICAgICA9IE5VTEwsCiAgICAucG9sbCAgICAgICAgICAgPSBOVUxMLAogICAgLmdldF9pZm5hbWUgICAgID0gTlVMTCwgLyogTm90IG5lc2Vzc2FyeSAqLwogICAgLnNldF9vcGVyc3RhdGUgID0gTlVMTCwKI2lmZGVmIENPTkZJR19DTElFTlRfTUxNRQogICAgLmdldF9od19tb2RlcyAgID0gTlVMTCwKICAgIC5zZXRfY2hhbm5lbCAgICA9IE5VTEwsCiAgICAuc2V0X3NzaWQgICAgICAgPSB3cGFfZHJpdmVyX3Rpc3RhX3NldF9zc2lkLAogICAgLnNldF9ic3NpZCAgICAgID0gTlVMTCwKICAgIC5zZW5kX21sbWUgICAgICA9IE5VTEwsCiAgICAubWxtZV9hZGRfc3RhICAgPSBOVUxMLAogICAgLm1sbWVfcmVtb3ZlX3N0YSAgICA9IE5VTEwsCiAgICAubWxtZV9zZXRwcm90ZWN0aW9uID0gTlVMTCwKI2VuZGlmIC8qIENPTkZJR19DTElFTlRfTUxNRSAqLwogICAgLmRyaXZlcl9jbWQgICAgID0gd3BhX2RyaXZlcl90aXN0YV9kcml2ZXJfY21kCn07Cg==