Name: series-workflowfltv8 Phase: Succeeded StartedAt: 2026-08-05 22:49:55 +0000 UTC FinishedAt: 2026-08-06 02:39:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[0] Phase: Succeeded StartedAt: 2026-08-05 22:49:55 +0000 UTC FinishedAt: 2026-08-05 22:53:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[0].run-triage Phase: Succeeded StartedAt: 2026-08-05 22:49:55 +0000 UTC FinishedAt: 2026-08-05 22:53:19 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "cfce77b63375dac81d53f2f85593c548415206b7", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "cfce77b63375dac81d53f2f85593c548415206b7", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "9cd4e75e-affc-4a83-9042-f2c0004066a5" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "htab_map_alloc", "htab_map_update_elem", "htab_lru_map_update_elem", "htab_map_lookup_elem", "htab_map_delete_elem", "bpf_map_meta_alloc" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aHRhYl9tYXBfYWxsb2MmIzM0OywKICAgICYjMzQ7aHRhYl9tYXBfdXBkYXRlX2VsZW0mIzM0OywKICAgICYjMzQ7aHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtJiMzNDssCiAgICAmIzM0O2h0YWJfbWFwX2xvb2t1cF9lbGVtJiMzNDssCiAgICAmIzM0O2h0YWJfbWFwX2RlbGV0ZV9lbGVtJiMzNDssCiAgICAmIzM0O2JwZl9tYXBfbWV0YV9hbGxvYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvcHRpbWl6ZXMgdGhlIG1lbW9yeSBsYXlvdXQgb2YgQlBGIGhhc2ggbWFwIGVsZW1lbnRzIGJ5IGNvbmRpdGlvbmFsbHkgb21pdHRpbmcgdGhlIGhhc2ggdmFsdWUgYW5kIGFkanVzdGluZyB0aGUga2V5IG9mZnNldC4gVGhpcyBhZmZlY3RzIGNvcmUgQlBGIGhhc2ggbWFwIG9wZXJhdGlvbnMgbGlrZSBhbGxvY2F0aW9uLCBsb29rdXAsIHVwZGF0ZSwgYW5kIGRlbGV0aW9uLiBGdXp6aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlc2Ugb3BlcmF0aW9ucyBzdGlsbCB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBuZXcgbWVtb3J5IGxheW91dCBhbmQgdGhhdCBubyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBvY2N1ci4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDY0NTRhMTFjMDNkZmFlZGI0YjA5Zjg1NzVhZjhkMDM2MzlmYjUyNzNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyA1IDIyOjUyOjIyIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGFzaHRhYi5jIGIva2VybmVsL2JwZi9oYXNodGFiLmNcbmluZGV4IDlmMzk0ZTFhYTJlODUuLjk5NjcyNjhkNDUzZDAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2hhc2h0YWIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9oYXNodGFiLmNcbkBAIC0xMDAsMTMgJiM0MzsxMDAsMTYgQEAgc3RydWN0IGJwZl9odGFiIHtcbiBcdHN0cnVjdCBwZXJjcHVfY291bnRlciBwY291bnQ7XG4gXHRhdG9taWNfdCBjb3VudDtcbiBcdGJvb2wgdXNlX3BlcmNwdV9jb3VudGVyO1xuJiM0MztcdGJvb2wgaGFzX2hhc2g7XG4gXHR1MzIgbl9idWNrZXRzO1x0LyogbnVtYmVyIG9mIGhhc2ggYnVja2V0cyAqL1xuIFx0dTMyIGVsZW1fc2l6ZTtcdC8qIHNpemUgb2YgZWFjaCBlbGVtZW50IGluIGJ5dGVzICovXG4mIzQzO1x0dTMyIGtleV9vZmZzZXQ7XHQvKiBvZmZzZXQgb2Yga2V5IGluIGJ5dGVzICovXG4gXHR1MzIgaGFzaHJuZDtcbiB9O1xuIFxuIC8qIGVhY2ggaHRhYiBlbGVtZW50IGlzIHN0cnVjdCBodGFiX2VsZW0gJiM0Mzsga2V5ICYjNDM7IHZhbHVlICovXG4tc3RydWN0IGh0YWJfZWxlbSB7XG4mIzQzO3N0cnVjdCBodGFiX2VsZW07XG4mIzQzO3N0cnVjdCBodGFiX25vZGUge1xuIFx0dW5pb24ge1xuIFx0XHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSBoYXNoX25vZGU7XG4gXHRcdHN0cnVjdCB7XG5AQCAtMTE3LDE4ICYjNDM7MTIwLDMyIEBAIHN0cnVjdCBodGFiX2VsZW0ge1xuIFx0XHRcdH07XG4gXHRcdH07XG4gXHR9O1xuLVx0dW5pb24ge1xuLVx0XHQvKiBwb2ludGVyIHRvIHBlci1jcHUgcG9pbnRlciAqL1xuLVx0XHR2b2lkICpwdHJfdG9fcHB0cjtcbi1cdFx0c3RydWN0IGJwZl9scnVfbm9kZSBscnVfbm9kZTtcbi1cdH07XG4tXHR1MzIgaGFzaDtcbi1cdGNoYXIga2V5W10gX19hbGlnbmVkKDgpO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGh0YWJfZWxlbSB7XG4mIzQzO1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuJiM0MztcdHU4IGRhdGFbXSBfX2FsaWduZWQoOCk7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgaHRhYl9lbGVtX2xydSB7XG4mIzQzO1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuJiM0MztcdHN0cnVjdCBicGZfbHJ1X25vZGUgbHJ1X25vZGU7XG4mIzQzO1x0dTggZGF0YVtdIF9fYWxpZ25lZCg4KTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIE9ubHkgZm9yIG5vbi1wcmVhbGxvY2F0ZWQgUENQVSBtYXBzLiBQcmVhbGxvY2F0ZWQgUENQVSBtYXBzIGRvbiYjMzk7dCBuZWVkXG4mIzQzOyAqIHB0cl90b19wcHRyLCBhbmQgdXNlIGh0YWJfZWxlbS5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBodGFiX2VsZW1fcGNwdSB7XG4mIzQzO1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuJiM0MztcdHZvaWQgKnB0cl90b19wcHRyO1xuJiM0MztcdHU4IGRhdGFbXSBfX2FsaWduZWQoOCk7XG4gfTtcbiBcbiBzdHJ1Y3QgaHRhYl9idGZfcmVjb3JkIHtcbiBcdHN0cnVjdCBidGZfcmVjb3JkICpyZWNvcmQ7XG4gXHR1MzIga2V5X3NpemU7XG4mIzQzO1x0dTMyIGtleV9vZmZzZXQ7XG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9pc19wcmVhbGxvYyhjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG5AQCAtMTM2LDYgJiM0MzsxNTMsMjEgQEAgc3RhdGljIGlubGluZSBib29sIGh0YWJfaXNfcHJlYWxsb2MoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0cmV0dXJuICEoaHRhYi1cdTAwM2VtYXAubWFwX2ZsYWdzIFx1MDAyNiBCUEZfRl9OT19QUkVBTExPQyk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfbHJ1X25vZGUgKmh0YWJfZWxlbV9scnVfbm9kZShzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIFx1MDAyNigoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS1cdTAwM2VscnVfbm9kZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fZ2V0X3B0cl90b19wcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VwdHJfdG9fcHB0cjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyX3RvX3BwdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdm9pZCAqcHRyKVxuJiM0Mzt7XG4mIzQzO1x0KChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VwdHJfdG9fcHB0ciA9IHB0cjtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCBodGFiX2luaXRfYnVja2V0cyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4ge1xuIFx0dW5zaWduZWQgaW50IGk7XG5AQCAtMTgzLDI1ICYjNDM7MjE1LDMwIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19mZF9odGFiKGNvbnN0IHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdHJldHVybiBodGFiLVx1MDAzZW1hcC5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgKmh0YWJfZWxlbV92YWx1ZShzdHJ1Y3QgaHRhYl9lbGVtICpsLCB1MzIga2V5X3NpemUpXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX2tleShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gKHZvaWQgKilsICYjNDM7IGh0YWItXHUwMDNla2V5X29mZnNldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiBsLVx1MDAzZWtleSAmIzQzOyByb3VuZF91cChrZXlfc2l6ZSwgOCk7XG4mIzQzO1x0cmV0dXJuIGh0YWJfZWxlbV9rZXkoaHRhYiwgbCkgJiM0Mzsgcm91bmRfdXAoaHRhYi1cdTAwM2VtYXAua2V5X3NpemUsIDgpO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplLFxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsLFxuIFx0XHRcdFx0ICAgICB2b2lkIF9fcGVyY3B1ICpwcHRyKVxuIHtcbi1cdCoodm9pZCBfX3BlcmNwdSAqKilodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpID0gcHB0cjtcbiYjNDM7XHQqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpID0gcHB0cjtcbiB9XG4gXG4tc3RhdGljIGlubGluZSB2b2lkIF9fcGVyY3B1ICpodGFiX2VsZW1fZ2V0X3B0cihzdHJ1Y3QgaHRhYl9lbGVtICpsLCB1MzIga2V5X3NpemUpXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BlcmNwdSAqaHRhYl9lbGVtX2dldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGwsIGtleV9zaXplKTtcbiYjNDM7XHRyZXR1cm4gKih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgKmZkX2h0YWJfbWFwX2dldF9wdHIoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGh0YWJfZWxlbSAqbClcbiYjNDM7c3RhdGljIHZvaWQgKmZkX2h0YWJfbWFwX2dldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiAqKHZvaWQgKiopaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0cmV0dXJuICoodm9pZCAqKilodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpnZXRfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgaW50IGkpXG5AQCAtMjA5LDYgJiM0MzsyNDYsMzMgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmdldF9odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCBpbnQgaSlcbiBcdHJldHVybiAoc3RydWN0IGh0YWJfZWxlbSAqKSAoaHRhYi1cdTAwM2VlbGVtcyAmIzQzOyBpICogKHU2NClodGFiLVx1MDAzZWVsZW1fc2l6ZSk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9oYXNfaGFzaChjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gaHRhYi1cdTAwM2VoYXNfaGFzaDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB1MzIgaHRhYl9lbGVtX2hhc2goc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuJiM0MztcdFx0cmV0dXJuICoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLVx1MDAzZWRhdGE7XG4mIzQzO1x0ZWxzZSBpZiAoaHRhYl9pc19wZXJjcHUoaHRhYikgXHUwMDI2XHUwMDI2ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKVxuJiM0MztcdFx0cmV0dXJuICoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VkYXRhO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldHVybiAqKHUzMiAqKWwtXHUwMDNlZGF0YTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfaGFzaChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBoYXNoKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFodGFiX2hhc19oYXNoKGh0YWIpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmIChodGFiX2lzX2xydShodGFiKSlcbiYjNDM7XHRcdCoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLVx1MDAzZWRhdGEgPSBoYXNoO1xuJiM0MztcdGVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpIFx1MDAyNlx1MDAyNiAhaHRhYl9pc19wcmVhbGxvYyhodGFiKSlcbiYjNDM7XHRcdCoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VkYXRhID0gaGFzaDtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHQqKHUzMiAqKWwtXHUwMDNlZGF0YSA9IGhhc2g7XG4mIzQzO31cbiYjNDM7XG4gLyogQm90aCBwZXJjcHUgYW5kIGZkIGh0YWIgc3VwcG9ydCBpbi1wbGFjZSB1cGRhdGUsIHNvIG5vIG5lZWQgZm9yXG4gICogZXh0cmEgZWxlbS4gTFJVIGl0c2VsZiBjYW4gcmVtb3ZlIHRoZSBsZWFzdCB1c2VkIGVsZW1lbnQsIHNvXG4gICogdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gZXh0cmEgZWxlbSBkdXJpbmcgbWFwX3VwZGF0ZS5cbkBAIC0yMzEsNyAmIzQzOzI5NSw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFxuIFx0XHRlbGVtID0gZ2V0X2h0YWJfZWxlbShodGFiLCBpKTtcbiBcdFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xuJiM0MztcdFx0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTtcbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG4gXHR9XG4gfVxuQEAgLTI1NCw3ICYjNDM7MzE4LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX3ByZWFsbG9jZWRfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcbiBcdFx0ZWxlbSA9IGdldF9odGFiX2VsZW0oaHRhYiwgaSk7XG4gXHRcdGlmIChodGFiX2lzX3BlcmNwdShodGFiKSkge1xuLVx0XHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcbiBcdFx0XHRpbnQgY3B1O1xuIFxuIFx0XHRcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbkBAIC0yNjMsNyAmIzQzOzMyNyw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRcdFx0fVxuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdGJwZl9vYmpfZnJlZV9maWVsZHMoaHRhYi1cdTAwM2VtYXAucmVjb3JkLFxuLVx0XHRcdFx0XHQgICAgaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGh0YWItXHUwMDNlbWFwLmtleV9zaXplKSk7XG4mIzQzO1x0XHRcdFx0XHQgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTtcbiBcdFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdFx0fVxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbkBAIC0yODAsOCAmIzQzOzM0NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBodGFiLVx1MDAzZW1hcC5tYXhfZW50cmllczsgaSYjNDM7JiM0MzspIHtcbiBcdFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcbi1cdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGdldF9odGFiX2VsZW0oaHRhYiwgaSksXG4tXHRcdFx0XHRcdCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4mIzQzO1x0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZ2V0X2h0YWJfZWxlbShodGFiLCBpKSk7XG4gXHRcdGZyZWVfcGVyY3B1KHBwdHIpO1xuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdH1cbkBAIC0zMDgsOCAmIzQzOzM3MSw4IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpwcmVhbGxvY19scnVfcG9wKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LFxuIFxuIFx0aWYgKG5vZGUpIHtcbiBcdFx0YnBmX21hcF9pbmNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4tXHRcdGwgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpO1xuLVx0XHRtZW1jcHkobC1cdTAwM2VrZXksIGtleSwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUpO1xuJiM0MztcdFx0bCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7XG4mIzQzO1x0XHRtZW1jcHkoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4gXHRcdHJldHVybiBsO1xuIFx0fVxuIFxuQEAgLTM0MCw4ICYjNDM7NDAzLDcgQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdFx0XHRcdFx0ICAgIEdGUF9VU0VSIHwgX19HRlBfTk9XQVJOKTtcbiBcdFx0aWYgKCFwcHRyKVxuIFx0XHRcdGdvdG8gZnJlZV9lbGVtcztcbi1cdFx0aHRhYl9lbGVtX3NldF9wdHIoZ2V0X2h0YWJfZWxlbShodGFiLCBpKSwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUsXG4tXHRcdFx0XHQgIHBwdHIpO1xuJiM0MztcdFx0aHRhYl9lbGVtX3NldF9wdHIoaHRhYiwgZ2V0X2h0YWJfZWxlbShodGFiLCBpKSwgcHB0cik7XG4gXHRcdGNvbmRfcmVzY2hlZCgpO1xuIFx0fVxuIFxuQEAgLTM0OSw4ICYjNDM7NDExLDggQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdGlmIChodGFiX2lzX2xydShodGFiKSlcbiBcdFx0ZXJyID0gYnBmX2xydV9pbml0KFx1MDAyNmh0YWItXHUwMDNlbHJ1LFxuIFx0XHRcdFx0ICAgaHRhYi1cdTAwM2VtYXAubWFwX2ZsYWdzIFx1MDAyNiBCUEZfRl9OT19DT01NT05fTFJVLFxuLVx0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaCkgLVxuLVx0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpLFxuJiM0MztcdFx0XHRcdCAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBkYXRhKSAtXG4mIzQzO1x0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSxcbiBcdFx0XHRcdCAgIGh0YWJfbHJ1X21hcF9kZWxldGVfbm9kZSxcbiBcdFx0XHRcdCAgIGh0YWIpO1xuIFx0ZWxzZVxuQEAgLTM2MSwxMSAmIzQzOzQyMywxMSBAQCBzdGF0aWMgaW50IHByZWFsbG9jX2luaXQoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFxuIFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuIFx0XHRicGZfbHJ1X3BvcHVsYXRlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBodGFiLVx1MDAzZWVsZW1zLFxuLVx0XHRcdFx0IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSxcbiYjNDM7XHRcdFx0XHQgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSxcbiBcdFx0XHRcdCBodGFiLVx1MDAzZWVsZW1fc2l6ZSwgbnVtX2VudHJpZXMpO1xuIFx0ZWxzZVxuIFx0XHRwY3B1X2ZyZWVsaXN0X3BvcHVsYXRlKFx1MDAyNmh0YWItXHUwMDNlZnJlZWxpc3QsXG4tXHRcdFx0XHQgICAgICAgaHRhYi1cdTAwM2VlbGVtcyAmIzQzOyBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSksXG4mIzQzO1x0XHRcdFx0ICAgICAgIGh0YWItXHUwMDNlZWxlbXMgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSksXG4gXHRcdFx0XHQgICAgICAgaHRhYi1cdTAwM2VlbGVtX3NpemUsIG51bV9lbnRyaWVzKTtcbiBcbiBcdHJldHVybiAwO1xuQEAgLTQwMSw3ICYjNDM7NDYzLDcgQEAgc3RhdGljIGludCBhbGxvY19leHRyYV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRcdC8qIHBvcCB3aWxsIHN1Y2NlZWQsIHNpbmNlIHByZWFsbG9jX2luaXQoKVxuIFx0XHQgKiBwcmVhbGxvY2F0ZWQgZXh0cmEgbnVtX3Bvc3NpYmxlX2NwdXMgZWxlbWVudHNcbiBcdFx0ICovXG4tXHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKTtcbiYjNDM7XHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIG5vZGUuZm5vZGUpO1xuIFx0XHQqcGVyX2NwdV9wdHIocHB0ciwgY3B1KSA9IGxfbmV3O1xuIFx0fVxuIFx0aHRhYi1cdTAwM2VleHRyYV9lbGVtcyA9IHBwdHI7XG5AQCAtNDI1LDggJiM0Mzs0ODcsOCBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKVxuIFx0Ym9vbCB6ZXJvX3NlZWQgPSAoYXR0ci1cdTAwM2VtYXBfZmxhZ3MgXHUwMDI2IEJQRl9GX1pFUk9fU0VFRCk7XG4gXHRpbnQgbnVtYV9ub2RlID0gYnBmX21hcF9hdHRyX251bWFfbm9kZShhdHRyKTtcbiBcbi1cdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZS5uZXh0KSAhPVxuLVx0XHQgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGhhc2hfbm9kZS5wcHJldikpO1xuJiM0MztcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBmbm9kZS5uZXh0KSAhPVxuJiM0MztcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBoYXNoX25vZGUucHByZXYpKTtcbiBcbiBcdGlmICh6ZXJvX3NlZWQgXHUwMDI2XHUwMDI2ICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKVxuIFx0XHQvKiBHdWFyZCBhZ2FpbnN0IGxvY2FsIERvUywgYW5kIGRpc2NvdXJhZ2UgcHJvZHVjdGlvbiB1c2UuICovXG5AQCAtNDc2LDcgJiM0Mzs1MzgsNyBAQCBzdGF0aWMgdm9pZCBodGFiX21lbV9kdG9yKHZvaWQgKm9iaiwgdm9pZCAqY3R4KVxuIFx0aWYgKElTX0VSUl9PUl9OVUxMKGhyZWMtXHUwMDNlcmVjb3JkKSlcbiBcdFx0cmV0dXJuO1xuIFxuLVx0bWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGhyZWMtXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdG1hcF92YWx1ZSA9ICh2b2lkICopZWxlbSAmIzQzOyBocmVjLVx1MDAzZWtleV9vZmZzZXQgJiM0Mzsgcm91bmRfdXAoaHJlYy1cdTAwM2VrZXlfc2l6ZSwgOCk7XG4gXHRicGZfb2JqX2ZyZWVfZmllbGRzKGhyZWMtXHUwMDNlcmVjb3JkLCBtYXBfdmFsdWUpO1xuIH1cbiBcbkBAIC01MDIsNyAmIzQzOzU2NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZHRvcl9jdHhfZnJlZSh2b2lkICpjdHgpXG4gfVxuIFxuIHN0YXRpYyBpbnQgYnBmX21hX3NldF9kdG9yKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfbWVtX2FsbG9jICptYSxcbi1cdFx0XHQgICB2b2lkICgqZHRvcikodm9pZCAqLCB2b2lkICopKVxuJiM0MztcdFx0XHQgICB2b2lkICgqZHRvcikodm9pZCAqLCB2b2lkICopLCB1MzIga2V5X29mZnNldClcbiB7XG4gXHRzdHJ1Y3QgaHRhYl9idGZfcmVjb3JkICpocmVjO1xuIFx0aW50IGVycjtcbkBAIC01MTUsNiAmIzQzOzU3Nyw3IEBAIHN0YXRpYyBpbnQgYnBmX21hX3NldF9kdG9yKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfbWVtX2FsbG9jICptYSxcbiBcdGlmICghaHJlYylcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHRocmVjLVx1MDAzZWtleV9zaXplID0gbWFwLVx1MDAzZWtleV9zaXplO1xuJiM0MztcdGhyZWMtXHUwMDNla2V5X29mZnNldCA9IGtleV9vZmZzZXQ7XG4gXHRocmVjLVx1MDAzZXJlY29yZCA9IGJ0Zl9yZWNvcmRfZHVwKG1hcC1cdTAwM2VyZWNvcmQpO1xuIFx0aWYgKElTX0VSUihocmVjLVx1MDAzZXJlY29yZCkpIHtcbiBcdFx0ZXJyID0gUFRSX0VSUihocmVjLVx1MDAzZXJlY29yZCk7XG5AQCAtNTM3LDkgJiM0Mzs2MDAsOSBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4gXHQgKiBwb3B1bGF0ZWQgaW4gaHRhYl9tYXBfYWxsb2MoKSwgc28gaXQgd2lsbCBhbHdheXMgYXBwZWFyIGFzIE5VTEwuXG4gXHQgKi9cbiBcdGlmIChodGFiX2lzX3BlcmNwdShodGFiKSlcbi1cdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlcGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yKTtcbiYjNDM7XHRcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZodGFiLVx1MDAzZXBjcHVfbWEsIGh0YWJfcGNwdV9tZW1fZHRvciwgaHRhYi1cdTAwM2VrZXlfb2Zmc2V0KTtcbiBcdGVsc2Vcbi1cdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlbWEsIGh0YWJfbWVtX2R0b3IpO1xuJiM0MztcdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlbWEsIGh0YWJfbWVtX2R0b3IsIGh0YWItXHUwMDNla2V5X29mZnNldCk7XG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXG5AQCAtNTYyLDYgJiM0Mzs2MjUsMTMgQEAgc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcbiBcbiBcdGJwZl9tYXBfaW5pdF9mcm9tX2F0dHIoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGF0dHIpO1xuIFxuJiM0MztcdC8qIEF2b2lkIGhhc2ggbWVtb3J5IHVzZSBhbmQgY29tcGFyaXNvbnMgd2hlcmUgdW5uZWNlc3NhcnkuXG4mIzQzO1x0ICogdTMyIGhhc2ggcmVhZHMgYXJlIGFsd2F5cyBhdG9taWMuIElmIHdlIGVsaWRlIHRoZW0sIGtleSBjb21wYXJpc29ucyBtdXN0IGFsc28gYmUgYXRvbWljXG4mIzQzO1x0ICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUga2V5IG1hdGNoZXMgZHVlIHRvIHRvcm4ga2V5IHJlYWRzIC8gd3JpdGVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGVcbiYjNDM7XHQgKiB3aGVuIHRoZSBrZXkgZml0cyB3aXRoaW4gYSB3b3JkLCBzbyBjaGVjayBrZXlfc2l6ZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRodGFiLVx1MDAzZWhhc19oYXNoID0gaHRhYl9pc19scnUoaHRhYikgfHwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUgXHUwMDNlIHNpemVvZih1bnNpZ25lZCBsb25nKTtcbiYjNDM7XG4gXHRpZiAocGVyY3B1X2xydSkge1xuIFx0XHQvKiBlbnN1cmUgZWFjaCBDUFUmIzM5O3MgbHJ1IGxpc3QgaGFzIFx1MDAzZT0xIGVsZW1lbnRzLlxuIFx0XHQgKiBzaW5jZSB3ZSBhcmUgYXQgaXQsIG1ha2UgZWFjaCBscnUgbGlzdCBoYXMgdGhlIHNhbWVcbkBAIC01ODMsOCAmIzQzOzY1MywxNiBAQCBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKVxuIFxuIFx0aHRhYi1cdTAwM2VuX2J1Y2tldHMgPSByb3VuZHVwX3Bvd19vZl90d28oaHRhYi1cdTAwM2VtYXAubWF4X2VudHJpZXMpO1xuIFxuLVx0aHRhYi1cdTAwM2VlbGVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGh0YWJfZWxlbSkgJiM0Mztcbi1cdFx0XHQgIHJvdW5kX3VwKGh0YWItXHUwMDNlbWFwLmtleV9zaXplLCA4KTtcbiYjNDM7XHRpZiAoaHRhYl9pc19scnUoaHRhYikpXG4mIzQzO1x0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgZGF0YSkgJiM0MzsgODtcbiYjNDM7XHRlbHNlIGlmIChwZXJjcHUgXHUwMDI2XHUwMDI2ICFwcmVhbGxvYylcbiYjNDM7XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fcGNwdSwgZGF0YSkgJiM0MztcbiYjNDM7XHRcdFx0XHQgICAoaHRhYl9oYXNfaGFzaChodGFiKSA/IDggOiAwKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBkYXRhKSAmIzQzO1xuJiM0MztcdFx0XHRcdCAgIChodGFiX2hhc19oYXNoKGh0YWIpID8gOCA6IDApO1xuJiM0MztcbiYjNDM7XHRodGFiLVx1MDAzZWVsZW1fc2l6ZSA9IGh0YWItXHUwMDNla2V5X29mZnNldCAmIzQzOyByb3VuZF91cChodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSwgOCk7XG4gXHRpZiAocGVyY3B1KVxuIFx0XHRodGFiLVx1MDAzZWVsZW1fc2l6ZSAmIzQzOz0gc2l6ZW9mKHZvaWQgKik7XG4gXHRlbHNlXG5AQCAtNjkyLDE1ICYjNDM7NzcwLDI5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKnNlbGVjdF9idWNrZXQoc3RydWN0IGJwZl9odGFiICpodGFiLCB1MzJcbiB9XG4gXG4gLyogdGhpcyBsb29rdXAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggYnVja2V0IGxvY2sgdGFrZW4gKi9cbi1zdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLCB1MzIgaGFzaCxcbiYjNDM7c3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsXG4mIzQzO1x0XHRcdFx0XHQgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsIHUzMiBoYXNoLFxuIFx0XHRcdFx0XHQgdm9pZCAqa2V5LCB1MzIga2V5X3NpemUpXG4ge1xuIFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47XG4gXHRzdHJ1Y3QgaHRhYl9lbGVtICpsO1xuIFxuLVx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSlcbi1cdFx0aWYgKGwtXHUwMDNlaGFzaCA9PSBoYXNoIFx1MDAyNlx1MDAyNiAhbWVtY21wKFx1MDAyNmwtXHUwMDNla2V5LCBrZXksIGtleV9zaXplKSlcbi1cdFx0XHRyZXR1cm4gbDtcbiYjNDM7XHRpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkge1xuJiM0MztcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuJiM0MztcdFx0XHRpZiAoaHRhYl9lbGVtX2hhc2goaHRhYiwgbCkgPT0gaGFzaCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgICFtZW1jbXAoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBrZXlfc2l6ZSkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGw7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdC8qIFdoZW4gaGFzaCBpcyBvbWl0dGVkLCBrZXkgY29tcGFyaXNvbnMgbXVzdCBiZSBhdG9taWMuIFplcm8gZXh0ZW5kXG4mIzQzO1x0XHQgKiB0aGUgY2FsbGVyJiMzOTtzIGtleSB0byB0aGUgd29yZCBzaXplIHRvIHN1cHBvcnQgYW4gYXRvbWljIGNvbXBhcmUuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgayA9IDA7XG4mIzQzO1xuJiM0MztcdFx0bWVtY3B5KFx1MDAyNmssIGtleSwga2V5X3NpemUpO1xuJiM0MztcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuJiM0MztcdFx0XHRpZiAoUkVBRF9PTkNFKCoodW5zaWduZWQgbG9uZyAqKWh0YWJfZWxlbV9rZXkoaHRhYiwgbCkpID09IGspXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGw7XG4mIzQzO1x0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuQEAgLTcwOSw3ICYjNDM7ODAxLDggQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2hcbiAgKiB0aGUgdW5saWtlbHkgZXZlbnQgd2hlbiBlbGVtZW50cyBtb3ZlZCBmcm9tIG9uZSBidWNrZXQgaW50byBhbm90aGVyXG4gICogd2hpbGUgbGluayBsaXN0IGlzIGJlaW5nIHdhbGtlZFxuICAqL1xuLXN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGJwZl9odGFiICpodGFiLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLFxuIFx0XHRcdFx0XHQgICAgICAgdTMyIGhhc2gsIHZvaWQgKmtleSxcbiBcdFx0XHRcdFx0ICAgICAgIHUzMiBrZXlfc2l6ZSwgdTMyIG5fYnVja2V0cylcbiB7XG5AQCAtNzE3LDkgJiM0Mzs4MTAsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCxcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4gYWdhaW46XG4tXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKVxuLVx0XHRpZiAobC1cdTAwM2VoYXNoID09IGhhc2ggXHUwMDI2XHUwMDI2ICFtZW1jbXAoXHUwMDI2bC1cdTAwM2VrZXksIGtleSwga2V5X3NpemUpKVxuLVx0XHRcdHJldHVybiBsO1xuJiM0MztcdGlmIChodGFiX2hhc19oYXNoKGh0YWIpKSB7XG4mIzQzO1x0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4mIzQzO1x0XHRcdGlmIChodGFiX2VsZW1faGFzaChodGFiLCBsKSA9PSBoYXNoIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAgIW1lbWNtcChodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXksIGtleV9zaXplKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gbDtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0LyogU2VlIGxvb2t1cF9lbGVtX3JhdygpIGNvbW1lbnQgYWJvdmUuICovXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGsgPSAwO1xuJiM0MztcbiYjNDM7XHRcdG1lbWNweShcdTAwMjZrLCBrZXksIGtleV9zaXplKTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSlcbiYjNDM7XHRcdFx0aWYgKFJFQURfT05DRSgqKHVuc2lnbmVkIGxvbmcgKilodGFiX2VsZW1fa2V5KGh0YWIsIGwpKSA9PSBrKVxuJiM0MztcdFx0XHRcdHJldHVybiBsO1xuJiM0MztcdH1cbiBcbiBcdGlmICh1bmxpa2VseShnZXRfbnVsbHNfdmFsdWUobikgIT0gKGhhc2ggXHUwMDI2IChuX2J1Y2tldHMgLSAxKSkpKVxuIFx0XHRnb3RvIGFnYWluO1xuQEAgLTc0NywxNyAmIzQzOzg1MSwxOCBAQCBzdGF0aWMgdm9pZCAqX19odGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gXG4gXHRoZWFkID0gc2VsZWN0X2J1Y2tldChodGFiLCBoYXNoKTtcbiBcbi1cdGwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi1cdTAwM2VuX2J1Y2tldHMpO1xuJiM0MztcdGwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi1cdTAwM2VuX2J1Y2tldHMpO1xuIFxuIFx0cmV0dXJuIGw7XG4gfVxuIFxuIHN0YXRpYyB2b2lkICpodGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4ge1xuJiM0MztcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIFxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuQEAgLTc3NSw2ICYjNDM7ODgwLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiAgKi9cbiBzdGF0aWMgaW50IGh0YWJfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XG4gXHRjb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wO1xuIFxuQEAgLTc4Myw3ICYjNDM7ODg5LDcgQEAgc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCAxKTtcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9BTFU2NF9JTU0oQlBGX0FERCwgcmV0LFxuLVx0XHRcdFx0b2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwga2V5KSAmIzQzO1xuJiM0MztcdFx0XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCAmIzQzO1xuIFx0XHRcdFx0cm91bmRfdXAobWFwLVx1MDAzZWtleV9zaXplLCA4KSk7XG4gXHRyZXR1cm4gaW5zbiAtIGluc25fYnVmO1xuIH1cbkBAIC03OTEsMTIgJiM0Mzs4OTcsMTMgQEAgc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICpfX2h0YWJfbHJ1X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0XHRcdFx0XHRcdFx0dm9pZCAqa2V5LCBjb25zdCBib29sIG1hcmspXG4ge1xuJiM0MztcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKSB7XG4gXHRcdGlmIChtYXJrKVxuLVx0XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmwtXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsKSk7XG4mIzQzO1x0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIFx0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG5AQCAtODE1LDYgJiM0Mzs5MjIsNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfbWFwX2xvb2t1cF9lbGVtX3N5cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gc3RhdGljIGludCBodGFiX2xydV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0XHRcdFx0ICAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XG4gXHRjb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wO1xuIFx0Y29uc3QgaW50IHJlZl9yZWcgPSBCUEZfUkVHXzE7XG5AQCAtODI0LDE1ICYjNDM7OTMyLDE1IEBAIHN0YXRpYyBpbnQgaHRhYl9scnVfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDQpO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0xEWF9NRU0oQlBGX0IsIHJlZl9yZWcsIHJldCxcbi1cdFx0XHQgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSkgJiM0MztcbiYjNDM7XHRcdFx0ICAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSAmIzQzO1xuIFx0XHRcdCAgICAgIG9mZnNldG9mKHN0cnVjdCBicGZfbHJ1X25vZGUsIHJlZikpO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0pNUF9JTU0oQlBGX0pORSwgcmVmX3JlZywgMCwgMSk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfU1RfTUVNKEJQRl9CLCByZXQsXG4tXHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSkgJiM0MztcbiYjNDM7XHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpICYjNDM7XG4gXHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpLFxuIFx0XHRcdCAgICAgMSk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCxcbi1cdFx0XHRcdG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGtleSkgJiM0MztcbiYjNDM7XHRcdFx0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgJiM0MztcbiBcdFx0XHRcdHJvdW5kX3VwKG1hcC1cdTAwM2VrZXlfc2l6ZSwgOCkpO1xuIFx0cmV0dXJuIGluc24gLSBpbnNuX2J1ZjtcbiB9XG5AQCAtODQ0LDEzICYjNDM7OTUyLDEzIEBAIHN0YXRpYyB2b2lkIGNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYixcbiBcdFx0cmV0dXJuO1xuIFxuIFx0aWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKSB7XG4tXHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4mIzQzO1x0XHR2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZWxlbSk7XG4gXHRcdGludCBjcHU7XG4gXG4gXHRcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpXG4gXHRcdFx0YnBmX29ial9jYW5jZWxfZmllbGRzKFx1MDAyNmh0YWItXHUwMDNlbWFwLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcbiBcdH0gZWxzZSB7XG4tXHRcdHZvaWQgKm1hcF92YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4mIzQzO1x0XHR2b2lkICptYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSk7XG4gXG4gXHRcdGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhcdTAwMjZodGFiLVx1MDAzZW1hcCwgbWFwX3ZhbHVlKTtcbiBcdH1cbkBAIC04NjksMTcgJiM0Mzs5NzcsMTcgQEAgc3RhdGljIGJvb2wgaHRhYl9scnVfbWFwX2RlbGV0ZV9ub2RlKHZvaWQgKmFyZywgc3RydWN0IGJwZl9scnVfbm9kZSAqbm9kZSlcbiBcdHN0cnVjdCBidWNrZXQgKmI7XG4gXHRpbnQgcmV0O1xuIFxuLVx0dGd0X2wgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpO1xuLVx0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCB0Z3RfbC1cdTAwM2VoYXNoKTtcbiYjNDM7XHR0Z3RfbCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7XG4mIzQzO1x0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCBodGFiX2VsZW1faGFzaChodGFiLCB0Z3RfbCkpO1xuIFx0aGVhZCA9IFx1MDAyNmItXHUwMDNlaGVhZDtcbiBcbiBcdHJldCA9IGh0YWJfbG9ja19idWNrZXQoYiwgXHUwMDI2ZmxhZ3MpO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuLVx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSlcbiYjNDM7XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4gXHRcdGlmIChsID09IHRndF9sKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2Vub2RlLmhhc2hfbm9kZSk7XG4gXHRcdFx0YnBmX21hcF9kZWNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbkBAIC05MTIsMTggJiM0MzsxMDIwLDE5IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfZ2V0X25leHRfa2V5KHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqbmV4dF9rZXkpXG4gXHRoZWFkID0gc2VsZWN0X2J1Y2tldChodGFiLCBoYXNoKTtcbiBcbiBcdC8qIGxvb2t1cCB0aGUga2V5ICovXG4tXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXHUwMDNlbl9idWNrZXRzKTtcbiYjNDM7XHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXHUwMDNlbl9idWNrZXRzKTtcbiBcbiBcdGlmICghbClcbiBcdFx0Z290byBmaW5kX2ZpcnN0X2VsZW07XG4gXG4gXHQvKiBrZXkgd2FzIGZvdW5kLCBnZXQgbmV4dCBrZXkgaW4gdGhlIHNhbWUgYnVja2V0ICovXG4tXHRuZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXHUwMDI2bC1cdTAwM2VoYXNoX25vZGUpKSxcbi1cdFx0XHRcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcbiYjNDM7XHRuZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKFxuJiM0MztcdFx0XHRyY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX25leHRfcmN1KFx1MDAyNmwtXHUwMDNlbm9kZS5oYXNoX25vZGUpKSxcbiYjNDM7XHRcdFx0c3RydWN0IGh0YWJfZWxlbSwgbm9kZS5oYXNoX25vZGUpO1xuIFxuIFx0aWYgKG5leHRfbCkge1xuIFx0XHQvKiBpZiBuZXh0IGVsZW0gaW4gdGhpcyBoYXNoIGxpc3QgaXMgbm9uLXplcm8sIGp1c3QgcmV0dXJuIGl0ICovXG4tXHRcdG1lbWNweShuZXh0X2tleSwgbmV4dF9sLVx1MDAzZWtleSwga2V5X3NpemUpO1xuJiM0MztcdFx0bWVtY3B5KG5leHRfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIG5leHRfbCksIGtleV9zaXplKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG5AQCAtOTM4LDEwICYjNDM7MTA0NywxMCBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dldF9uZXh0X2tleShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKm5leHRfa2V5KVxuIFxuIFx0XHQvKiBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGJ1Y2tldCAqL1xuIFx0XHRuZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfZmlyc3RfcmN1KGhlYWQpKSxcbi1cdFx0XHRcdFx0ICBzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUpO1xuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XG4gXHRcdGlmIChuZXh0X2wpIHtcbiBcdFx0XHQvKiBpZiBpdCYjMzk7cyBub3QgZW1wdHksIGp1c3QgcmV0dXJuIGl0ICovXG4tXHRcdFx0bWVtY3B5KG5leHRfa2V5LCBuZXh0X2wtXHUwMDNla2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdG1lbWNweShuZXh0X2tleSwgaHRhYl9lbGVtX2tleShodGFiLCBuZXh0X2wpLCBrZXlfc2l6ZSk7XG4gXHRcdFx0cmV0dXJuIDA7XG4gXHRcdH1cbiBcdH1cbkBAIC05NTUsNyAmIzQzOzEwNjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2VsZW1fZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4gXHRjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhodGFiLCBsKTtcbiBcbiBcdGlmIChodGFiLVx1MDAzZW1hcC5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0gpXG4tXHRcdGJwZl9tZW1fY2FjaGVfZnJlZShcdTAwMjZodGFiLVx1MDAzZXBjcHVfbWEsIGwtXHUwMDNlcHRyX3RvX3BwdHIpO1xuJiM0MztcdFx0YnBmX21lbV9jYWNoZV9mcmVlKFx1MDAyNmh0YWItXHUwMDNlcGNwdV9tYSwgaHRhYl9lbGVtX2dldF9wdHJfdG9fcHB0cihsKSk7XG4gXHRicGZfbWVtX2NhY2hlX2ZyZWUoXHUwMDI2aHRhYi1cdTAwM2VtYSwgbCk7XG4gfVxuIFxuQEAgLTk2NSw3ICYjNDM7MTA3NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfcHV0X2ZkX3ZhbHVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcbiBcdHZvaWQgKnB0cjtcbiBcbiBcdGlmIChtYXAtXHUwMDNlb3BzLVx1MDAzZW1hcF9mZF9wdXRfcHRyKSB7XG4tXHRcdHB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIobWFwLCBsKTtcbiYjNDM7XHRcdHB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIoaHRhYiwgbCk7XG4gXHRcdG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2ZkX3B1dF9wdHIobWFwLCBwdHIsIHRydWUpO1xuIFx0fVxuIH1cbkBAIC0xMDA2LDcgJiM0MzsxMTE1LDcgQEAgc3RhdGljIHZvaWQgZnJlZV9odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIFx0aWYgKGh0YWJfaXNfcHJlYWxsb2MoaHRhYikpIHtcbiBcdFx0YnBmX21hcF9kZWNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4gXHRcdGNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKGh0YWIsIGwpO1xuLVx0XHRwY3B1X2ZyZWVsaXN0X3B1c2goXHUwMDI2aHRhYi1cdTAwM2VmcmVlbGlzdCwgXHUwMDI2bC1cdTAwM2Vmbm9kZSk7XG4mIzQzO1x0XHRwY3B1X2ZyZWVsaXN0X3B1c2goXHUwMDI2aHRhYi1cdTAwM2VmcmVlbGlzdCwgXHUwMDI2bC1cdTAwM2Vub2RlLmZub2RlKTtcbiBcdH0gZWxzZSB7XG4gXHRcdGRlY19lbGVtX2NvdW50KGh0YWIpO1xuIFx0XHRodGFiX2VsZW1fZnJlZShodGFiLCBsKTtcbkBAIC0xMDk3LDcgJiM0MzsxMjA2LDcgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcbiBcdFx0XHRsID0gX19wY3B1X2ZyZWVsaXN0X3BvcChcdTAwMjZodGFiLVx1MDAzZWZyZWVsaXN0KTtcbiBcdFx0XHRpZiAoIWwpXG4gXHRcdFx0XHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xuLVx0XHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKTtcbiYjNDM7XHRcdFx0bF9uZXcgPSBjb250YWluZXJfb2YobCwgc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSk7XG4gXHRcdFx0YnBmX21hcF9pbmNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4gXHRcdH1cbiBcdH0gZWxzZSB7XG5AQCAtMTExNywxMCAmIzQzOzEyMjYsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcbiBcdFx0fVxuIFx0fVxuIFxuLVx0bWVtY3B5KGxfbmV3LVx1MDAzZWtleSwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0aWYgKGh0YWJfaGFzX2hhc2goaHRhYikpIHtcbiYjNDM7XHRcdG1lbWNweShodGFiX2VsZW1fa2V5KGh0YWIsIGxfbmV3KSwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdC8qIFplcm8tZXh0ZW5kIGtleSBpbnRvIGsgZm9yIGFuIGF0b21pYyB3cml0ZSB0byBzdXBwb3J0XG4mIzQzO1x0XHQgKiBsb2NrbGVzcyBSQ1UgcmVhZGVycy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBrID0gMDtcbiYjNDM7XG4mIzQzO1x0XHRtZW1jcHkoXHUwMDI2aywga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0XHRXUklURV9PTkNFKCoodW5zaWduZWQgbG9uZyAqKWh0YWJfZWxlbV9rZXkoaHRhYiwgbF9uZXcpLCBrKTtcbiYjNDM7XHR9XG4gXHRpZiAocGVyY3B1KSB7XG4gXHRcdGlmIChwcmVhbGxvYykge1xuLVx0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsX25ldywga2V5X3NpemUpO1xuJiM0MztcdFx0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9uZXcpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdC8qIGFsbG9jX3BlcmNwdSB6ZXJvLWZpbGxzICovXG4gXHRcdFx0dm9pZCAqcHRyID0gYnBmX21lbV9jYWNoZV9hbGxvYyhcdTAwMjZodGFiLVx1MDAzZXBjcHVfbWEpO1xuQEAgLTExMzAsMjYgJiM0MzsxMjQ5LDI2IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICphbGxvY19odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksXG4gXHRcdFx0XHRsX25ldyA9IEVSUl9QVFIoLUVOT01FTSk7XG4gXHRcdFx0XHRnb3RvIGRlY19jb3VudDtcbiBcdFx0XHR9XG4tXHRcdFx0bF9uZXctXHUwMDNlcHRyX3RvX3BwdHIgPSBwdHI7XG4mIzQzO1x0XHRcdGh0YWJfZWxlbV9zZXRfcHRyX3RvX3BwdHIobF9uZXcsIHB0cik7XG4gXHRcdFx0cHB0ciA9ICoodm9pZCBfX3BlcmNwdSAqKilwdHI7XG4gXHRcdH1cbiBcbiBcdFx0cGNwdV9pbml0X3ZhbHVlKGh0YWIsIHBwdHIsIHZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7XG4gXG4gXHRcdGlmICghcHJlYWxsb2MpXG4tXHRcdFx0aHRhYl9lbGVtX3NldF9wdHIobF9uZXcsIGtleV9zaXplLCBwcHRyKTtcbiYjNDM7XHRcdFx0aHRhYl9lbGVtX3NldF9wdHIoaHRhYiwgbF9uZXcsIHBwdHIpO1xuIFx0fSBlbHNlIGlmIChmZF9odGFiX21hcF9uZWVkc19hZGp1c3QoaHRhYikpIHtcbiBcdFx0c2l6ZSA9IHJvdW5kX3VwKHNpemUsIDgpO1xuLVx0XHRtZW1jcHkoaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBrZXlfc2l6ZSksIHZhbHVlLCBzaXplKTtcbiYjNDM7XHRcdG1lbWNweShodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSwgc2l6ZSk7XG4gXHR9IGVsc2UgaWYgKG1hcF9mbGFncyBcdTAwMjYgQlBGX0ZfTE9DSykge1xuIFx0XHRjb3B5X21hcF92YWx1ZV9sb2NrZWQoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSxcbiYjNDM7XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLFxuIFx0XHRcdFx0ICAgICAgdmFsdWUsIGZhbHNlKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGNvcHlfbWFwX3ZhbHVlKFx1MDAyNmh0YWItXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSwgdmFsdWUpO1xuJiM0MztcdFx0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksIHZhbHVlKTtcbiBcdH1cbiBcbi1cdGxfbmV3LVx1MDAzZWhhc2ggPSBoYXNoO1xuJiM0MztcdGh0YWJfZWxlbV9zZXRfaGFzaChodGFiLCBsX25ldywgaGFzaCk7XG4gXHRyZXR1cm4gbF9uZXc7XG4gZGVjX2NvdW50OlxuIFx0ZGVjX2VsZW1fY291bnQoaHRhYik7XG5AQCAtMTE5OSw3ICYjNDM7MTMxOCw3IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHRcdGlmICh1bmxpa2VseSghYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVx1MDAzZXJlY29yZCwgQlBGX1NQSU5fTE9DSykpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFx0XHQvKiBmaW5kIGFuIGVsZW1lbnQgd2l0aG91dCB0YWtpbmcgdGhlIGJ1Y2tldCBsb2NrICovXG4tXHRcdGxfb2xkID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsXG4mIzQzO1x0XHRsX29sZCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLFxuIFx0XHRcdFx0XHQgICAgICBodGFiLVx1MDAzZW5fYnVja2V0cyk7XG4gXHRcdHJldCA9IGNoZWNrX2ZsYWdzKGh0YWIsIGxfb2xkLCBtYXBfZmxhZ3MpO1xuIFx0XHRpZiAocmV0KVxuQEAgLTEyMDcsNyAmIzQzOzEzMjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0XHRpZiAobF9vbGQpIHtcbiBcdFx0XHQvKiBncmFiIHRoZSBlbGVtZW50IGxvY2sgYW5kIHVwZGF0ZSB2YWx1ZSBpbiBwbGFjZSAqL1xuIFx0XHRcdGNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsXG4tXHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKSxcbiBcdFx0XHRcdFx0ICAgICAgdmFsdWUsIGZhbHNlKTtcbiBcdFx0XHRyZXR1cm4gMDtcbiBcdFx0fVxuQEAgLTEyMjEsNyAmIzQzOzEzNDAsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuJiM0MztcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuQEAgLTEyMzUsNyAmIzQzOzEzNTQsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0XHQgKiBhbmQgdXBkYXRlIGVsZW1lbnQgaW4gcGxhY2VcbiBcdFx0ICovXG4gXHRcdGNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsXG4tXHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUobF9vbGQsIGtleV9zaXplKSxcbiYjNDM7XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0ICAgICAgdmFsdWUsIGZhbHNlKTtcbiBcdFx0cmV0ID0gMDtcbiBcdFx0Z290byBlcnI7XG5AQCAtMTI1Miw5ICYjNDM7MTM3MSw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHQvKiBhZGQgbmV3IGVsZW1lbnQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXRcbiBcdCAqIGNvbmN1cnJlbnQgc2VhcmNoIHdpbGwgZmluZCBpdCBiZWZvcmUgb2xkIGVsZW1cbiBcdCAqL1xuLVx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZWhhc2hfbm9kZSwgaGVhZCk7XG4mIzQzO1x0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZW5vZGUuaGFzaF9ub2RlLCBoZWFkKTtcbiBcdGlmIChsX29sZCkge1xuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBcdFx0LyogbF9vbGQgaGFzIGFscmVhZHkgYmVlbiBzdGFzaGVkIGluIGh0YWItXHUwMDNlZXh0cmFfZWxlbXMsIGNhbmNlbFxuIFx0XHQgKiBpdHMgcmV1c2FibGUgc3BlY2lhbCBmaWVsZHMgYmVmb3JlIGl0IGlzIGF2YWlsYWJsZSBmb3IgcmV1c2UuXG5AQCAtMTI3NSw3ICYjNDM7MTM5NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfbHJ1X3B1c2hfZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pXG4ge1xuIFx0Y2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgZWxlbSk7XG4gXHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbi1cdGJwZl9scnVfcHVzaF9mcmVlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBcdTAwMjZlbGVtLVx1MDAzZWxydV9ub2RlKTtcbiYjNDM7XHRicGZfbHJ1X3B1c2hfZnJlZShcdTAwMjZodGFiLVx1MDAzZWxydSwgaHRhYl9lbGVtX2xydV9ub2RlKGVsZW0pKTtcbiB9XG4gXG4gc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG5AQCAtMTMxMCwxMyAmIzQzOzE0MjksMTMgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWVcbiBcdGxfbmV3ID0gcHJlYWxsb2NfbHJ1X3BvcChodGFiLCBrZXksIGhhc2gpO1xuIFx0aWYgKCFsX25ldylcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4tXHRjb3B5X21hcF92YWx1ZShcdTAwMjZodGFiLVx1MDAzZW1hcCwgaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBtYXAtXHUwMDNla2V5X3NpemUpLCB2YWx1ZSk7XG4mIzQzO1x0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksIHZhbHVlKTtcbiBcbiBcdHJldCA9IGh0YWJfbG9ja19idWNrZXQoYiwgXHUwMDI2ZmxhZ3MpO1xuIFx0aWYgKHJldClcbiBcdFx0Z290byBlcnJfbG9ja19idWNrZXQ7XG4gXG4tXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiYjNDM7XHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiBcbiBcdHJldCA9IGNoZWNrX2ZsYWdzKGh0YWIsIGxfb2xkLCBtYXBfZmxhZ3MpO1xuIFx0aWYgKHJldClcbkBAIC0xMzI1LDEwICYjNDM7MTQ0NCwxMCBAQCBzdGF0aWMgbG9uZyBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZVxuIFx0LyogYWRkIG5ldyBlbGVtZW50IHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0XG4gXHQgKiBjb25jdXJyZW50IHNlYXJjaCB3aWxsIGZpbmQgaXQgYmVmb3JlIG9sZCBlbGVtXG4gXHQgKi9cbi1cdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xuJiM0MztcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2Vub2RlLmhhc2hfbm9kZSwgaGVhZCk7XG4gXHRpZiAobF9vbGQpIHtcbi1cdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXHUwMDI2bF9uZXctXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobF9uZXcpKTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bF9vbGQtXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xuIFx0fVxuIFx0cmV0ID0gMDtcbiBcbkBAIC0xMzgzLDcgJiM0MzsxNTAyLDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuJiM0MztcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuQEAgLTEzOTIsMTAgJiM0MzsxNTExLDEwIEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtX2luX3BsYWNlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcdGlmIChsX29sZCkge1xuIFx0XHQvKiBVcGRhdGUgdmFsdWUgaW4tcGxhY2UgKi9cbiBcdFx0aWYgKHBlcmNwdSkge1xuLVx0XHRcdHBjcHVfY29weV92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihsX29sZCwga2V5X3NpemUpLFxuJiM0MztcdFx0XHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0XHR2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZvaWQgKippbm5lcl9tYXBfcHB0ciA9IGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpO1xuJiM0MztcdFx0XHR2b2lkICoqaW5uZXJfbWFwX3BwdHIgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpO1xuIFxuIFx0XHRcdG9sZF9tYXBfcHRyID0gKmlubmVyX21hcF9wcHRyO1xuIFx0XHRcdFdSSVRFX09OQ0UoKmlubmVyX21hcF9wcHRyLCAqKHZvaWQgKiopdmFsdWUpO1xuQEAgLTE0MDcsNyAmIzQzOzE1MjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXG4gXHRcdFx0cmV0ID0gUFRSX0VSUihsX25ldyk7XG4gXHRcdFx0Z290byBlcnI7XG4gXHRcdH1cbi1cdFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZWhhc2hfbm9kZSwgaGVhZCk7XG4mIzQzO1x0XHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlbm9kZS5oYXNoX25vZGUsIGhlYWQpO1xuIFx0fVxuIGVycjpcbiBcdGh0YWJfdW5sb2NrX2J1Y2tldChiLCBmbGFncyk7XG5AQCAtMTQ1NiwyMiAmIzQzOzE1NzUsMjIgQEAgc3RhdGljIGxvbmcgX19odGFiX2xydV9wZXJjcHVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gZXJyX2xvY2tfYnVja2V0O1xuIFxuLVx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4gXG4gXHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gZXJyO1xuIFxuIFx0aWYgKGxfb2xkKSB7XG4tXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmxfb2xkLVx1MDAzZWxydV9ub2RlKTtcbiYjNDM7XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsX29sZCkpO1xuIFxuIFx0XHQvKiBwZXItY3B1IGhhc2ggbWFwIGNhbiB1cGRhdGUgdmFsdWUgaW4tcGxhY2UgKi9cbi1cdFx0cGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfb2xkLCBrZXlfc2l6ZSksXG4mIzQzO1x0XHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0dmFsdWUsIG9uYWxsY3B1cywgbWFwX2ZsYWdzKTtcbiBcdH0gZWxzZSB7XG4tXHRcdHBjcHVfaW5pdF92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihsX25ldywga2V5X3NpemUpLFxuJiM0MztcdFx0cGNwdV9pbml0X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGxfbmV3KSxcbiBcdFx0XHRcdHZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7XG4tXHRcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xuJiM0MztcdFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZW5vZGUuaGFzaF9ub2RlLCBoZWFkKTtcbiBcdFx0bF9uZXcgPSBOVUxMO1xuIFx0fVxuIFx0cmV0ID0gMDtcbkBAIC0xNDgwLDcgJiM0MzsxNTk5LDcgQEAgc3RhdGljIGxvbmcgX19odGFiX2xydV9wZXJjcHVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBlcnJfbG9ja19idWNrZXQ6XG4gXHRpZiAobF9uZXcpIHtcbiBcdFx0YnBmX21hcF9kZWNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4tXHRcdGJwZl9scnVfcHVzaF9mcmVlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBcdTAwMjZsX25ldy1cdTAwM2VscnVfbm9kZSk7XG4mIzQzO1x0XHRicGZfbHJ1X3B1c2hfZnJlZShcdTAwMjZodGFiLVx1MDAzZWxydSwgaHRhYl9lbGVtX2xydV9ub2RlKGxfbmV3KSk7XG4gXHR9XG4gXHRyZXR1cm4gcmV0O1xuIH1cbkBAIC0xNTIxLDkgJiM0MzsxNjQwLDkgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0bCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiBcdGlmIChsKVxuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlaGFzaF9ub2RlKTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2Vub2RlLmhhc2hfbm9kZSk7XG4gXHRlbHNlXG4gXHRcdHJldCA9IC1FTk9FTlQ7XG4gXG5AQCAtMTU1NiwxMCAmIzQzOzE2NzUsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG4tXHRsID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuJiM0MztcdGwgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4gXG4gXHRpZiAobClcbi1cdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xuIFx0ZWxzZVxuIFx0XHRyZXQgPSAtRU5PRU5UO1xuIFxuQEAgLTE1ODEsOCAmIzQzOzE3MDAsOCBAQCBzdGF0aWMgdm9pZCBkZWxldGVfYWxsX2VsZW1lbnRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47XG4gXHRcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4tXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XG4mIzQzO1x0XHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2Vub2RlLmhhc2hfbm9kZSk7XG4gXHRcdFx0aHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7XG4gXHRcdH1cbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG5AQCAtMTU5OSwxMCAmIzQzOzE3MTgsMTAgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX21hbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0XHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcbiBcdFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcbi1cdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4mIzQzO1x0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuIFx0XHRcdC8qIFdlIG9ubHkgZnJlZSBpbnRlcm5hbCBzdHJ1Y3RzIG9uIHVyZWYgZHJvcHBpbmcgdG8gemVybyAqL1xuIFx0XHRcdGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKFx1MDAyNmh0YWItXHUwMDNlbWFwLFxuLVx0XHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xuJiM0MztcdFx0XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCkpO1xuIFx0XHR9XG4gXHRcdGNvbmRfcmVzY2hlZF9yY3UoKTtcbiBcdH1cbkBAIC0xNjk3LDcgJiM0MzsxODE2LDcgQEAgc3RhdGljIGludCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0bCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiBcdGlmICghbCkge1xuIFx0XHRyZXQgPSAtRU5PRU5UO1xuIFx0XHRnb3RvIG91dF91bmxvY2s7XG5AQCAtMTcwOCwxNCAmIzQzOzE4MjcsMTQgQEAgc3RhdGljIGludCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0XHR2b2lkIF9fcGVyY3B1ICpwcHRyO1xuIFx0XHRpbnQgb2ZmID0gMCwgY3B1O1xuIFxuLVx0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwga2V5X3NpemUpO1xuJiM0MztcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdFx0Y29weV9tYXBfdmFsdWVfbG9uZyhcdTAwMjZodGFiLVx1MDAzZW1hcCwgdmFsdWUgJiM0Mzsgb2ZmLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcbiBcdFx0XHRjaGVja19hbmRfaW5pdF9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIHZhbHVlICYjNDM7IG9mZik7XG4gXHRcdFx0b2ZmICYjNDM7PSByb3VuZHVwX3ZhbHVlX3NpemU7XG4gXHRcdH1cbiBcdH0gZWxzZSB7XG4tXHRcdHZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdFx0dm9pZCAqc3JjID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIFxuIFx0XHRpZiAoZmxhZ3MgXHUwMDI2IEJQRl9GX0xPQ0spXG4gXHRcdFx0Y29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCwgdmFsdWUsIHNyYywgdHJ1ZSk7XG5AQCAtMTcyNCw3ICYjNDM7MTg0Myw3IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcdFx0LyogWmVyb2luZyBzcGVjaWFsIGZpZWxkcyBpbiB0aGUgdGVtcCBidWZmZXIgKi9cbiBcdFx0Y2hlY2tfYW5kX2luaXRfbWFwX3ZhbHVlKG1hcCwgdmFsdWUpO1xuIFx0fVxuLVx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBvdXRfdW5sb2NrOlxuIFx0aHRhYl91bmxvY2tfYnVja2V0KGIsIGJmbGFncyk7XG5AQCAtMTg2MCw3ICYjNDM7MTk3OSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdH1cbiBcbiBcdGJ1Y2tldF9jbnQgPSAwO1xuLVx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSlcbiYjNDM7XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4gXHRcdGJ1Y2tldF9jbnQmIzQzOyYjNDM7O1xuIFxuIFx0aWYgKGJ1Y2tldF9jbnQgXHUwMDI2XHUwMDI2ICFsb2NrZWQpIHtcbkBAIC0xODk3LDE0ICYjNDM7MjAxNiwxNCBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXHRpZiAoIWxvY2tlZClcbiBcdFx0Z290byBuZXh0X2JhdGNoO1xuIFxuLVx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBoYXNoX25vZGUpIHtcbi1cdFx0bWVtY3B5KGRzdF9rZXksIGwtXHUwMDNla2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuJiM0MztcdFx0bWVtY3B5KGRzdF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbCksIGtleV9zaXplKTtcbiBcbiBcdFx0aWYgKGlzX3BlcmNwdSkge1xuIFx0XHRcdGludCBvZmYgPSAwLCBjcHU7XG4gXHRcdFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcbi1cdFx0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKTtcbiYjNDM7XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0XHRcdGlmIChlbGVtX21hcF9mbGFncyBcdTAwMjYgQlBGX0ZfQ1BVKSB7XG4gXHRcdFx0XHRjcHUgPSBlbGVtX21hcF9mbGFncyBcdTAwM2VcdTAwM2UgMzI7XG4gXHRcdFx0XHRjb3B5X21hcF92YWx1ZShcdTAwMjZodGFiLVx1MDAzZW1hcCwgZHN0X3ZhbCwgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7XG5AQCAtMTkxOCw3ICYjNDM7MjAzNyw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0dmFsdWUgPSBodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpO1xuJiM0MztcdFx0XHR2YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcbiBcdFx0XHRpZiAoaXNfZmRfaHRhYihodGFiKSkge1xuIFx0XHRcdFx0c3RydWN0IGJwZl9tYXAgKippbm5lcl9tYXAgPSB2YWx1ZTtcbiBcbkBAIC0xOTM2LDcgJiM0MzsyMDU1LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0XHRcdGNoZWNrX2FuZF9pbml0X21hcF92YWx1ZShtYXAsIGRzdF92YWwpO1xuIFx0XHR9XG4gXHRcdGlmIChkb19kZWxldGUpIHtcbi1cdFx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlaGFzaF9ub2RlKTtcbiYjNDM7XHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBcdFx0XHQvKiBicGZfbHJ1X3B1c2hfZnJlZSgpIHdpbGwgYWNxdWlyZSBscnVfbG9jaywgd2hpY2hcbiBcdFx0XHQgKiBtYXkgY2F1c2UgZGVhZGxvY2suIFNlZSBjb21tZW50cyBpbiBmdW5jdGlvblxuQEAgLTE5NDgsNyAmIzQzOzIwNjcsNyBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXHRcdFx0ICogbG9jayBiZWluZyBoZWxkIGFuZCBpdCB2aW9sYXRlcyB0aGUgbG9jayBydWxlLCBzb1xuIFx0XHRcdCAqIGludm9rZSBmcmVlX2h0YWJfZWxlbSgpIGFmdGVyIHVubG9jayBhcyB3ZWxsLlxuIFx0XHRcdCAqL1xuLVx0XHRcdGwtXHUwMDNlYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7XG4mIzQzO1x0XHRcdGwtXHUwMDNlbm9kZS5iYXRjaF9mbGluayA9IG5vZGVfdG9fZnJlZTtcbiBcdFx0XHRub2RlX3RvX2ZyZWUgPSBsO1xuIFx0XHR9XG4gXHRcdGRzdF9rZXkgJiM0Mzs9IGtleV9zaXplO1xuQEAgLTE5NjAsNyAmIzQzOzIwNzksNyBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXG4gXHR3aGlsZSAobm9kZV90b19mcmVlKSB7XG4gXHRcdGwgPSBub2RlX3RvX2ZyZWU7XG4tXHRcdG5vZGVfdG9fZnJlZSA9IG5vZGVfdG9fZnJlZS1cdTAwM2ViYXRjaF9mbGluaztcbiYjNDM7XHRcdG5vZGVfdG9fZnJlZSA9IG5vZGVfdG9fZnJlZS1cdTAwM2Vub2RlLmJhdGNoX2ZsaW5rO1xuIFx0XHRpZiAoaXNfbHJ1X21hcClcbiBcdFx0XHRodGFiX2xydV9wdXNoX2ZyZWUoaHRhYiwgbCk7XG4gXHRcdGVsc2VcbkBAIC0yMTA4LDggJiM0MzsyMjI3LDggQEAgYnBmX2hhc2hfbWFwX3NlcV9maW5kX25leHQoc3RydWN0IGJwZl9pdGVyX3NlcV9oYXNoX21hcF9pbmZvICppbmZvLFxuIFx0XHQvKiBubyB1cGRhdGUvZGVsZXRpb24gb24gdGhpcyBidWNrZXQsIHByZXZfZWxlbSBzaG91bGQgYmUgc3RpbGwgdmFsaWRcbiBcdFx0ICogYW5kIHdlIHdvbiYjMzk7dCBza2lwIGVsZW1lbnRzLlxuIFx0XHQgKi9cbi1cdFx0biA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXHUwMDI2cHJldl9lbGVtLVx1MDAzZWhhc2hfbm9kZSkpO1xuLVx0XHRlbGVtID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShuLCBzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUpO1xuJiM0MztcdFx0biA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXHUwMDI2cHJldl9lbGVtLVx1MDAzZW5vZGUuaGFzaF9ub2RlKSk7XG4mIzQzO1x0XHRlbGVtID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShuLCBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XG4gXHRcdGlmIChlbGVtKVxuIFx0XHRcdHJldHVybiBlbGVtO1xuIFxuQEAgLTIxMjUsNyAmIzQzOzIyNDQsNyBAQCBicGZfaGFzaF9tYXBfc2VxX2ZpbmRfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2hhc2hfbWFwX2luZm8gKmluZm8sXG4gXG4gXHRcdGNvdW50ID0gMDtcbiBcdFx0aGVhZCA9IFx1MDAyNmItXHUwMDNlaGVhZDtcbi1cdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGVsZW0sIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xuJiM0MztcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGVsZW0sIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XG4gXHRcdFx0aWYgKGNvdW50IFx1MDAzZT0gc2tpcF9lbGVtcykge1xuIFx0XHRcdFx0aW5mby1cdTAwM2VidWNrZXRfaWQgPSBpO1xuIFx0XHRcdFx0aW5mby1cdTAwM2Vza2lwX2VsZW1zID0gY291bnQ7XG5AQCAtMjE4MywxMiAmIzQzOzIzMDIsMTIgQEAgc3RhdGljIGludCBfX2JwZl9oYXNoX21hcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGh0YWJfZWxlbSAqZWxlbSlcbiBcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuIFx0XHRjdHgubWFwID0gaW5mby1cdTAwM2VtYXA7XG4gXHRcdGlmIChlbGVtKSB7XG4tXHRcdFx0Y3R4LmtleSA9IGVsZW0tXHUwMDNla2V5O1xuJiM0MztcdFx0XHRjdHgua2V5ID0gaHRhYl9lbGVtX2tleShpbmZvLVx1MDAzZWh0YWIsIGVsZW0pO1xuIFx0XHRcdGlmICghaW5mby1cdTAwM2VwZXJjcHVfdmFsdWVfYnVmKSB7XG4tXHRcdFx0XHRjdHgudmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgbWFwLVx1MDAzZWtleV9zaXplKTtcbiYjNDM7XHRcdFx0XHRjdHgudmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoaW5mby1cdTAwM2VodGFiLCBlbGVtKTtcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0cm91bmR1cF92YWx1ZV9zaXplID0gcm91bmRfdXAobWFwLVx1MDAzZXZhbHVlX3NpemUsIDgpO1xuLVx0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGluZm8tXHUwMDNlaHRhYiwgZWxlbSk7XG4gXHRcdFx0XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdFx0XHRcdGNvcHlfbWFwX3ZhbHVlX2xvbmcobWFwLCBpbmZvLVx1MDAzZXBlcmNwdV92YWx1ZV9idWYgJiM0Mzsgb2ZmLFxuIFx0XHRcdFx0XHRcdFx0ICAgIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuQEAgLTIyOTIsMTQgJiM0MzsyNDExLDE0IEBAIHN0YXRpYyBsb25nIGJwZl9mb3JfZWFjaF9oYXNoX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgYnBmX2NhbGxiYWNrX3QgY2FsbGJhY2tfXG4gXHRcdGIgPSBcdTAwMjZodGFiLVx1MDAzZWJ1Y2tldHNbaV07XG4gXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0aGVhZCA9IFx1MDAyNmItXHUwMDNlaGVhZDtcbi1cdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShlbGVtLCBuLCBoZWFkLCBoYXNoX25vZGUpIHtcbi1cdFx0XHRrZXkgPSBlbGVtLVx1MDAzZWtleTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcbiYjNDM7XHRcdFx0a2V5ID0gaHRhYl9lbGVtX2tleShodGFiLCBlbGVtKTtcbiBcdFx0XHRpZiAoaXNfcGVyY3B1KSB7XG4gXHRcdFx0XHQvKiBjdXJyZW50IGNwdSB2YWx1ZSBmb3IgcGVyY3B1IG1hcCAqL1xuLVx0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGVsZW0pO1xuIFx0XHRcdFx0dmFsID0gdGhpc19jcHVfcHRyKHBwdHIpO1xuIFx0XHRcdH0gZWxzZSB7XG4tXHRcdFx0XHR2YWwgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgbWFwLVx1MDAzZWtleV9zaXplKTtcbiYjNDM7XHRcdFx0XHR2YWwgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSk7XG4gXHRcdFx0fVxuIFx0XHRcdG51bV9lbGVtcyYjNDM7JiM0Mzs7XG4gXHRcdFx0cmV0ID0gY2FsbGJhY2tfZm4oKHU2NCkobG9uZyltYXAsICh1NjQpKGxvbmcpa2V5LFxuQEAgLTI0MDMsMTAgJiM0MzsyNTIyLDExIEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX2xydV9tYXBfb3BzID0ge1xuIC8qIENhbGxlZCBmcm9tIGVCUEYgcHJvZ3JhbSAqL1xuIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgaHRhYl9lbGVtICpsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7XG4gXG4gXHRpZiAobClcbi1cdFx0cmV0dXJuIHRoaXNfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpKTtcbiYjNDM7XHRcdHJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCkpO1xuIFx0ZWxzZVxuIFx0XHRyZXR1cm4gTlVMTDtcbiB9XG5AQCAtMjQxNCw2ICYjNDM7MjUzNCw3IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIC8qIGlubGluZSBicGZfbWFwX2xvb2t1cF9lbGVtKCkgY2FsbCBmb3IgcGVyLUNQVSBoYXNobWFwICovXG4gc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxuIHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjtcbiBcbiBcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxuQEAgLTI0MjQsNyAmIzQzOzI1NDUsNyBAQCBzdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zblxuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTtcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMyk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMCxcbi1cdFx0XHRcdG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGtleSkgJiM0Mzsgcm91bmR1cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiYjNDM7XHRcdFx0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgJiM0Mzsgcm91bmR1cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzAsIDApO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX01PVjY0X1BFUkNQVV9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzApO1xuIFxuQEAgLTI0MzMsNiAmIzQzOzI1NTQsNyBAQCBzdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zblxuIFxuIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdTMyIGNwdSlcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcbiBcdGlmIChjcHUgXHUwMDNlPSBucl9jcHVfaWRzKVxuQEAgLTI0NDAsMTggJiM0MzsyNTYyLDE5IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcbiBcdGwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKSwgY3B1KTtcbiYjNDM7XHRcdHJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKSwgY3B1KTtcbiBcdGVsc2VcbiBcdFx0cmV0dXJuIE5VTEw7XG4gfVxuIFxuIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xuIFxuIFx0aWYgKGwpIHtcbi1cdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXHUwMDI2bC1cdTAwM2VscnVfbm9kZSk7XG4tXHRcdHJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKSk7XG4mIzQzO1x0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobCkpO1xuJiM0MztcdFx0cmV0dXJuIHRoaXNfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKSk7XG4gXHR9XG4gXG4gXHRyZXR1cm4gTlVMTDtcbkBAIC0yNDU5LDYgJiM0MzsyNTgyLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIFxuIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHUzMiBjcHUpXG4ge1xuJiM0MztcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4gXHRpZiAoY3B1IFx1MDAzZT0gbnJfY3B1X2lkcylcbkBAIC0yNDY2LDggJiM0MzsyNTkwLDggQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtcbiBcbiBcdGwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcdGlmIChsKSB7XG4tXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmwtXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKSwgY3B1KTtcbiYjNDM7XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsKSk7XG4mIzQzO1x0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCksIGNwdSk7XG4gXHR9XG4gXG4gXHRyZXR1cm4gTlVMTDtcbkBAIC0yNDc1LDYgJiM0MzsyNTk5LDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtcbiBcbiBpbnQgYnBmX3BlcmNwdV9oYXNoX2NvcHkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwgdTY0IG1hcF9mbGFncylcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcdHZvaWQgX19wZXJjcHUgKnBwdHI7XG4gXHRpbnQgcmV0ID0gLUVOT0VOVDtcbkBAIC0yNDk0LDcgJiM0MzsyNjE5LDcgQEAgaW50IGJwZl9wZXJjcHVfaGFzaF9jb3B5KHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsIHU2NCBtYXBfZmxcbiBcdC8qIFdlIGRvIG5vdCBtYXJrIExSVSBtYXAgZWxlbWVudCBoZXJlIGluIG9yZGVyIHRvIG5vdCBtZXNzIHVwXG4gXHQgKiBldmljdGlvbiBoZXVyaXN0aWNzIHdoZW4gdXNlciBzcGFjZSBkb2VzIGEgbWFwIHdhbGsuXG4gXHQgKi9cbi1cdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcbiBcdGlmIChtYXBfZmxhZ3MgXHUwMDI2IEJQRl9GX0NQVSkge1xuIFx0XHRjcHUgPSBtYXBfZmxhZ3MgXHUwMDNlXHUwMDNlIDMyO1xuIFx0XHRjb3B5X21hcF92YWx1ZShtYXAsIHZhbHVlLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcbkBAIC0yNTMyLDYgJiM0MzsyNjU3LDcgQEAgaW50IGJwZl9wZXJjcHVfaGFzaF91cGRhdGUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBzdGF0aWMgdm9pZCBodGFiX3BlcmNwdV9tYXBfc2VxX3Nob3dfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXG4gXHRcdFx0XHRcdCAgc3RydWN0IHNlcV9maWxlICptKVxuIHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgaHRhYl9lbGVtICpsO1xuIFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcdGludCBjcHU7XG5AQCAtMjU0Niw3ICYjNDM7MjY3Miw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfcGVyY3B1X21hcF9zZXFfc2hvd19lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcbiBcdGJ0Zl90eXBlX3NlcV9zaG93KG1hcC1cdTAwM2VidGYsIG1hcC1cdTAwM2VidGZfa2V5X3R5cGVfaWQsIGtleSwgbSk7XG4gXHRzZXFfcHV0cyhtLCBcJiMzNDs6IHtcXG5cJiMzNDspO1xuLVx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuIFx0XHRzZXFfcHJpbnRmKG0sIFwmIzM0O1xcdGNwdSVkOiBcJiMzNDssIGNwdSk7XG4gXHRcdGJ0Zl90eXBlX3NlcV9zaG93KG1hcC1cdTAwM2VidGYsIG1hcC1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCxcbkBAIC0yNjE5LDggJiM0MzsyNzQ1LDggQEAgc3RhdGljIHZvaWQgZmRfaHRhYl9tYXBfZnJlZShzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaHRhYi1cdTAwM2VuX2J1Y2tldHM7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGkpO1xuIFxuLVx0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xuLVx0XHRcdHZvaWQgKnB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIobWFwLCBsKTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcbiYjNDM7XHRcdFx0dm9pZCAqcHRyID0gZmRfaHRhYl9tYXBfZ2V0X3B0cihodGFiLCBsKTtcbiBcbiBcdFx0XHRtYXAtXHUwMDNlb3BzLVx1MDAzZW1hcF9mZF9wdXRfcHRyKG1hcCwgcHRyLCBmYWxzZSk7XG4gXHRcdH1cbkBAIC0yNzA1LDYgJiM0MzsyODMxLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfb2ZfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBzdGF0aWMgaW50IGh0YWJfb2ZfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdCAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XG4gXHRjb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wO1xuIFxuQEAgLTI3MTMsNyAmIzQzOzI4NDAsNyBAQCBzdGF0aWMgaW50IGh0YWJfb2ZfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDIpO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCByZXQsXG4tXHRcdFx0XHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICYjNDM7XG4mIzQzO1x0XHRcdFx0aHRhYi1cdTAwM2VrZXlfb2Zmc2V0ICYjNDM7XG4gXHRcdFx0XHRyb3VuZF91cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9MRFhfTUVNKEJQRl9EVywgcmV0LCByZXQsIDApO1xuIFxuQEAgLTMxMTIsNyAmIzQzOzMyMzksNyBAQCBzdGF0aWMgaW50IHJodGFiX21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuIHtcbiBcdHN0cnVjdCBicGZfcmh0YWIgKnJodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9yaHRhYiwgbWFwKTtcbiBcbi1cdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZyaHRhYi1cdTAwM2VtYSwgcmh0YWJfbWVtX2R0b3IpO1xuJiM0MztcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZyaHRhYi1cdTAwM2VtYSwgcmh0YWJfbWVtX2R0b3IsIG9mZnNldG9mKHN0cnVjdCByaHRhYl9lbGVtLCBkYXRhKSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHJodGFiX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcClcbkBAIC0zNTMzLDMgJiM0MzszNjYwLDE2IEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyByaHRhYl9tYXBfb3BzID0ge1xuIFx0Lm1hcF9idGZfaWQgPSBcdTAwMjZyaHRhYl9tYXBfYnRmX2lkc1swXSxcbiBcdC5pdGVyX3NlcV9pbmZvID0gXHUwMDI2cmhhc2hfaXRlcl9zZXFfaW5mbyxcbiB9O1xuJiM0MztcbiYjNDM7c2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9odGFiKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBicGZfaHRhYl9tYXBfbWV0YV9pbml0KHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaHRhYiAqaW5uZXJfaHRhYl9tZXRhID0gY29udGFpbmVyX29mKGlubmVyX21hcF9tZXRhLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICppbm5lcl9odGFiID0gY29udGFpbmVyX29mKGlubmVyX21hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuJiM0MztcbiYjNDM7XHRpbm5lcl9odGFiX21ldGEtXHUwMDNla2V5X29mZnNldCA9IGlubmVyX2h0YWItXHUwMDNla2V5X29mZnNldDtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5jIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcbmluZGV4IGQyY2JhYjRiZGY2NDQuLmIyZGI1ZDBjOThiZWUgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcbkBAIC03LDYgJiM0Mzs3LDE1IEBAXG4gXG4gI2luY2x1ZGUgXCYjMzQ7bWFwX2luX21hcC5oXCYjMzQ7XG4gXG4mIzQzO3N0YXRpYyBib29sIGJwZl9tYXBfdHlwZV9pc19odGFiKGVudW0gYnBmX21hcF90eXBlIHR5cGUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSCB8fFxuJiM0MztcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfSEFTSCB8fFxuJiM0MztcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9MUlVfSEFTSCB8fFxuJiM0MztcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9MUlVfUEVSQ1BVX0hBU0ggfHxcbiYjNDM7XHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTO1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4ge1xuIFx0c3RydWN0IGJwZl9tYXAgKmlubmVyX21hcCwgKmlubmVyX21hcF9tZXRhO1xuQEAgLTI5LDYgJiM0MzszOCw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4gXHQvKiBJbiBzb21lIGNhc2VzIHZlcmlmaWVyIG5lZWRzIHRvIGFjY2VzcyBiZXlvbmQganVzdCBiYXNlIG1hcC4gKi9cbiBcdGlmIChpbm5lcl9tYXAtXHUwMDNlb3BzID09IFx1MDAyNmFycmF5X21hcF9vcHMgfHwgaW5uZXJfbWFwLVx1MDAzZW9wcyA9PSBcdTAwMjZwZXJjcHVfYXJyYXlfbWFwX29wcylcbiBcdFx0aW5uZXJfbWFwX21ldGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnBmX2FycmF5KTtcbiYjNDM7XHRlbHNlIGlmIChicGZfbWFwX3R5cGVfaXNfaHRhYihpbm5lcl9tYXAtXHUwMDNlbWFwX3R5cGUpKVxuJiM0MztcdFx0aW5uZXJfbWFwX21ldGFfc2l6ZSA9IGJwZl9odGFiX21hcF9tZXRhX3NpemUoKTtcbiBcbiBcdGlubmVyX21hcF9tZXRhID0ga3phbGxvYyhpbm5lcl9tYXBfbWV0YV9zaXplLCBHRlBfVVNFUik7XG4gXHRpZiAoIWlubmVyX21hcF9tZXRhKVxuQEAgLTcwLDYgJiM0Mzs4MSw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4gXHRcdGlubmVyX2FycmF5X21ldGEtXHUwMDNlaW5kZXhfbWFzayA9IGlubmVyX2FycmF5LVx1MDAzZWluZGV4X21hc2s7XG4gXHRcdGlubmVyX2FycmF5X21ldGEtXHUwMDNlZWxlbV9zaXplID0gaW5uZXJfYXJyYXktXHUwMDNlZWxlbV9zaXplO1xuIFx0XHRpbm5lcl9tYXBfbWV0YS1cdTAwM2VieXBhc3Nfc3BlY192MSA9IGlubmVyX21hcC1cdTAwM2VieXBhc3Nfc3BlY192MTtcbiYjNDM7XHR9IGVsc2UgaWYgKGJwZl9tYXBfdHlwZV9pc19odGFiKGlubmVyX21hcC1cdTAwM2VtYXBfdHlwZSkpIHtcbiYjNDM7XHRcdGJwZl9odGFiX21hcF9tZXRhX2luaXQoaW5uZXJfbWFwX21ldGEsIGlubmVyX21hcCk7XG4gXHR9XG4gXHRyZXR1cm4gaW5uZXJfbWFwX21ldGE7XG4gfVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5oIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmhcbmluZGV4IDdkNjE2MDIzNTRkZTguLjFlZGMyMDU3NzJkOGMgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmhcbkBAIC0xNSw1ICYjNDM7MTUsNyBAQCB2b2lkICpicGZfbWFwX2ZkX2dldF9wdHIoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGZpbGUgKm1hcF9maWxlLFxuIFx0XHRcdCBpbnQgdWZkKTtcbiB2b2lkIGJwZl9tYXBfZmRfcHV0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpwdHIsIGJvb2wgbmVlZF9kZWZlcik7XG4gdTMyIGJwZl9tYXBfZmRfc3lzX2xvb2t1cF9lbGVtKHZvaWQgKnB0cik7XG4mIzQzO3NpemVfdCBicGZfaHRhYl9tYXBfbWV0YV9zaXplKHZvaWQpO1xuJiM0Mzt2b2lkIGJwZl9odGFiX21hcF9tZXRhX2luaXQoc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcF9tZXRhLCBzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwKTtcbiBcbiAjZW5kaWZcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmNcbmluZGV4IDM3M2M4ZDE3ZWE1NTcuLjZiZDRjYjY4YzIwYzEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tYXBfcHRyX2tlcm4uY1xuQEAgLTExNCw3ICYjNDM7MTE0LDcgQEAgc3RhdGljIGlubGluZSBpbnQgY2hlY2tfaGFzaCh2b2lkKVxuIFx0VkVSSUZZKGNoZWNrX2RlZmF1bHRfbm9pbmxpbmUoXHUwMDI2aGFzaC1cdTAwM2VtYXAsIG1hcCkpO1xuIFxuIFx0VkVSSUZZKGhhc2gtXHUwMDNlbl9idWNrZXRzID09IE1BWF9FTlRSSUVTKTtcbi1cdFZFUklGWShoYXNoLVx1MDAzZWVsZW1fc2l6ZSA9PSA2NCk7XG4mIzQzO1x0VkVSSUZZKGhhc2gtXHUwMDNlZWxlbV9zaXplID09IDMyKTtcbiBcbiBcdFZFUklGWShoYXNoLVx1MDAzZWNvdW50LmNvdW50ZXIgPT0gMCk7XG4gXHRWRVJJRlkoYnBmX21hcF9zdW1fZWxlbV9jb3VudChtYXApID09IDApO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2h0YWJfbWFwX2FsbG9jJiMzNDssCiAgICAmIzM0O2h0YWJfbWFwX3VwZGF0ZV9lbGVtJiMzNDssCiAgICAmIzM0O2h0YWJfbHJ1X21hcF91cGRhdGVfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX21hcF9sb29rdXBfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX21hcF9kZWxldGVfZWxlbSYjMzQ7LAogICAgJiMzNDticGZfbWFwX21ldGFfYWxsb2MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb3B0aW1pemVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIEJQRiBoYXNoIG1hcCBlbGVtZW50cyBieSBjb25kaXRpb25hbGx5IG9taXR0aW5nIHRoZSBoYXNoIHZhbHVlIGFuZCBhZGp1c3RpbmcgdGhlIGtleSBvZmZzZXQuIFRoaXMgYWZmZWN0cyBjb3JlIEJQRiBoYXNoIG1hcCBvcGVyYXRpb25zIGxpa2UgYWxsb2NhdGlvbiwgbG9va3VwLCB1cGRhdGUsIGFuZCBkZWxldGlvbi4gRnV6emluZyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZXNlIG9wZXJhdGlvbnMgc3RpbGwgd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgbmV3IG1lbW9yeSBsYXlvdXQgYW5kIHRoYXQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBtZW1vcnkgbGVha3Mgb2NjdXIuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2NDU0YTExYzAzZGZhZWRiNGIwOWY4NTc1YWY4ZDAzNjM5ZmI1MjczCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBBdWcgNSAyMjo1MjoyMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGFzaHRhYi5jIGIva2VybmVsL2JwZi9oYXNodGFiLmMKaW5kZXggOWYzOTRlMWFhMmU4NS4uOTk2NzI2OGQ0NTNkMCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9oYXNodGFiLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9oYXNodGFiLmMKQEAgLTEwMCwxMyAmIzQzOzEwMCwxNiBAQCBzdHJ1Y3QgYnBmX2h0YWIgewogCXN0cnVjdCBwZXJjcHVfY291bnRlciBwY291bnQ7CiAJYXRvbWljX3QgY291bnQ7CiAJYm9vbCB1c2VfcGVyY3B1X2NvdW50ZXI7CiYjNDM7CWJvb2wgaGFzX2hhc2g7CiAJdTMyIG5fYnVja2V0czsJLyogbnVtYmVyIG9mIGhhc2ggYnVja2V0cyAqLwogCXUzMiBlbGVtX3NpemU7CS8qIHNpemUgb2YgZWFjaCBlbGVtZW50IGluIGJ5dGVzICovCiYjNDM7CXUzMiBrZXlfb2Zmc2V0OwkvKiBvZmZzZXQgb2Yga2V5IGluIGJ5dGVzICovCiAJdTMyIGhhc2hybmQ7CiB9OwogCiAvKiBlYWNoIGh0YWIgZWxlbWVudCBpcyBzdHJ1Y3QgaHRhYl9lbGVtICYjNDM7IGtleSAmIzQzOyB2YWx1ZSAqLwotc3RydWN0IGh0YWJfZWxlbSB7CiYjNDM7c3RydWN0IGh0YWJfZWxlbTsKJiM0MztzdHJ1Y3QgaHRhYl9ub2RlIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlIGhhc2hfbm9kZTsKIAkJc3RydWN0IHsKQEAgLTExNywxOCAmIzQzOzEyMCwzMiBAQCBzdHJ1Y3QgaHRhYl9lbGVtIHsKIAkJCX07CiAJCX07CiAJfTsKLQl1bmlvbiB7Ci0JCS8qIHBvaW50ZXIgdG8gcGVyLWNwdSBwb2ludGVyICovCi0JCXZvaWQgKnB0cl90b19wcHRyOwotCQlzdHJ1Y3QgYnBmX2xydV9ub2RlIGxydV9ub2RlOwotCX07Ci0JdTMyIGhhc2g7Ci0JY2hhciBrZXlbXSBfX2FsaWduZWQoOCk7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgaHRhYl9lbGVtIHsKJiM0MzsJc3RydWN0IGh0YWJfbm9kZSBub2RlOwomIzQzOwl1OCBkYXRhW10gX19hbGlnbmVkKDgpOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGh0YWJfZWxlbV9scnUgewomIzQzOwlzdHJ1Y3QgaHRhYl9ub2RlIG5vZGU7CiYjNDM7CXN0cnVjdCBicGZfbHJ1X25vZGUgbHJ1X25vZGU7CiYjNDM7CXU4IGRhdGFbXSBfX2FsaWduZWQoOCk7CiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBPbmx5IGZvciBub24tcHJlYWxsb2NhdGVkIFBDUFUgbWFwcy4gUHJlYWxsb2NhdGVkIFBDUFUgbWFwcyBkb24mIzM5O3QgbmVlZAomIzQzOyAqIHB0cl90b19wcHRyLCBhbmQgdXNlIGh0YWJfZWxlbS4KJiM0MzsgKi8KJiM0MztzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgewomIzQzOwlzdHJ1Y3QgaHRhYl9ub2RlIG5vZGU7CiYjNDM7CXZvaWQgKnB0cl90b19wcHRyOwomIzQzOwl1OCBkYXRhW10gX19hbGlnbmVkKDgpOwogfTsKIAogc3RydWN0IGh0YWJfYnRmX3JlY29yZCB7CiAJc3RydWN0IGJ0Zl9yZWNvcmQgKnJlY29yZDsKIAl1MzIga2V5X3NpemU7CiYjNDM7CXUzMiBrZXlfb2Zmc2V0OwogfTsKIAogc3RhdGljIGlubGluZSBib29sIGh0YWJfaXNfcHJlYWxsb2MoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKQpAQCAtMTM2LDYgJiM0MzsxNTMsMjEgQEAgc3RhdGljIGlubGluZSBib29sIGh0YWJfaXNfcHJlYWxsb2MoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKQogCXJldHVybiAhKGh0YWItJmd0O21hcC5tYXBfZmxhZ3MgJmFtcDsgQlBGX0ZfTk9fUFJFQUxMT0MpOwogfQogCiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2xydV9ub2RlICpodGFiX2VsZW1fbHJ1X25vZGUoc3RydWN0IGh0YWJfZWxlbSAqbCkKJiM0Mzt7CiYjNDM7CXJldHVybiAmYW1wOygoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS0mZ3Q7bHJ1X25vZGU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX2dldF9wdHJfdG9fcHB0cihzdHJ1Y3QgaHRhYl9lbGVtICpsKQomIzQzO3sKJiM0MzsJcmV0dXJuICgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktJmd0O3B0cl90b19wcHRyOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHJfdG9fcHB0cihzdHJ1Y3QgaHRhYl9lbGVtICpsLCB2b2lkICpwdHIpCiYjNDM7ewomIzQzOwkoKHN0cnVjdCBodGFiX2VsZW1fcGNwdSAqKWwpLSZndDtwdHJfdG9fcHB0ciA9IHB0cjsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCBodGFiX2luaXRfYnVja2V0cyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0xODMsMjUgJiM0MzsyMTUsMzAgQEAgc3RhdGljIGlubGluZSBib29sIGlzX2ZkX2h0YWIoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKQogCXJldHVybiBodGFiLSZndDttYXAubWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplKQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX2tleShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHZvaWQgKilsICYjNDM7IGh0YWItJmd0O2tleV9vZmZzZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX3ZhbHVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCkKIHsKLQlyZXR1cm4gbC0mZ3Q7a2V5ICYjNDM7IHJvdW5kX3VwKGtleV9zaXplLCA4KTsKJiM0MzsJcmV0dXJuIGh0YWJfZWxlbV9rZXkoaHRhYiwgbCkgJiM0Mzsgcm91bmRfdXAoaHRhYi0mZ3Q7bWFwLmtleV9zaXplLCA4KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBrZXlfc2l6ZSwKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsLAogCQkJCSAgICAgdm9pZCBfX3BlcmNwdSAqcHB0cikKIHsKLQkqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGwsIGtleV9zaXplKSA9IHBwdHI7CiYjNDM7CSoodm9pZCBfX3BlcmNwdSAqKilodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCkgPSBwcHRyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wZXJjcHUgKmh0YWJfZWxlbV9nZXRfcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBrZXlfc2l6ZSkKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgX19wZXJjcHUgKmh0YWJfZWxlbV9nZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCkKIHsKLQlyZXR1cm4gKih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShsLCBrZXlfc2l6ZSk7CiYjNDM7CXJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpOwogfQogCi1zdGF0aWMgdm9pZCAqZmRfaHRhYl9tYXBfZ2V0X3B0cihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKQomIzQzO3N0YXRpYyB2b2lkICpmZF9odGFiX21hcF9nZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCkKIHsKLQlyZXR1cm4gKih2b2lkICoqKWh0YWJfZWxlbV92YWx1ZShsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJcmV0dXJuICoodm9pZCAqKilodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpnZXRfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgaW50IGkpCkBAIC0yMDksNiAmIzQzOzI0NiwzMyBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqZ2V0X2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIGludCBpKQogCXJldHVybiAoc3RydWN0IGh0YWJfZWxlbSAqKSAoaHRhYi0mZ3Q7ZWxlbXMgJiM0MzsgaSAqICh1NjQpaHRhYi0mZ3Q7ZWxlbV9zaXplKTsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBodGFiX2hhc19oYXNoKGNvbnN0IHN0cnVjdCBicGZfaHRhYiAqaHRhYikKJiM0Mzt7CiYjNDM7CXJldHVybiBodGFiLSZndDtoYXNfaGFzaDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB1MzIgaHRhYl9lbGVtX2hhc2goc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKQomIzQzO3sKJiM0MzsJaWYgKGh0YWJfaXNfbHJ1KGh0YWIpKQomIzQzOwkJcmV0dXJuICoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLSZndDtkYXRhOwomIzQzOwllbHNlIGlmIChodGFiX2lzX3BlcmNwdShodGFiKSAmYW1wOyZhbXA7ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKQomIzQzOwkJcmV0dXJuICoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS0mZ3Q7ZGF0YTsKJiM0MzsJZWxzZQomIzQzOwkJcmV0dXJuICoodTMyICopbC0mZ3Q7ZGF0YTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfaGFzaChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBoYXNoKQomIzQzO3sKJiM0MzsJaWYgKCFodGFiX2hhc19oYXNoKGh0YWIpKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAoaHRhYl9pc19scnUoaHRhYikpCiYjNDM7CQkqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS0mZ3Q7ZGF0YSA9IGhhc2g7CiYjNDM7CWVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpICZhbXA7JmFtcDsgIWh0YWJfaXNfcHJlYWxsb2MoaHRhYikpCiYjNDM7CQkqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktJmd0O2RhdGEgPSBoYXNoOwomIzQzOwllbHNlCiYjNDM7CQkqKHUzMiAqKWwtJmd0O2RhdGEgPSBoYXNoOwomIzQzO30KJiM0MzsKIC8qIEJvdGggcGVyY3B1IGFuZCBmZCBodGFiIHN1cHBvcnQgaW4tcGxhY2UgdXBkYXRlLCBzbyBubyBuZWVkIGZvcgogICogZXh0cmEgZWxlbS4gTFJVIGl0c2VsZiBjYW4gcmVtb3ZlIHRoZSBsZWFzdCB1c2VkIGVsZW1lbnQsIHNvCiAgKiB0aGVyZSBpcyBubyBuZWVkIGZvciBhbiBleHRyYSBlbGVtIGR1cmluZyBtYXBfdXBkYXRlLgpAQCAtMjMxLDcgJiM0MzsyOTUsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2ZyZWVfcHJlYWxsb2NlZF9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfaHRhYiAqaHRhYikKIAogCQllbGVtID0gZ2V0X2h0YWJfZWxlbShodGFiLCBpKTsKIAkJYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoJmFtcDtodGFiLSZndDttYXAsCi0JCQkJCSAgICAgIGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLSZndDttYXAua2V5X3NpemUpKTsKJiM0MzsJCQkJCSAgICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBlbGVtKSk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIH0KQEAgLTI1NCw3ICYjNDM7MzE4LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX3ByZWFsbG9jZWRfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYikKIAogCQllbGVtID0gZ2V0X2h0YWJfZWxlbShodGFiLCBpKTsKIAkJaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKSB7Ci0JCQl2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKTsKJiM0MzsJCQl2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZWxlbSk7CiAJCQlpbnQgY3B1OwogCiAJCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CkBAIC0yNjMsNyAmIzQzOzMyNyw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlicGZfb2JqX2ZyZWVfZmllbGRzKGh0YWItJmd0O21hcC5yZWNvcmQsCi0JCQkJCSAgICBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKSk7CiYjNDM7CQkJCQkgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQl9CiAJCWNvbmRfcmVzY2hlZCgpOwpAQCAtMjgwLDggJiM0MzszNDQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2ZyZWVfZWxlbXMoc3RydWN0IGJwZl9odGFiICpodGFiKQogCWZvciAoaSA9IDA7IGkgJmx0OyBodGFiLSZndDttYXAubWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7CiAJCXZvaWQgX19wZXJjcHUgKnBwdHI7CiAKLQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGdldF9odGFiX2VsZW0oaHRhYiwgaSksCi0JCQkJCSBodGFiLSZndDttYXAua2V5X3NpemUpOwomIzQzOwkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGdldF9odGFiX2VsZW0oaHRhYiwgaSkpOwogCQlmcmVlX3BlcmNwdShwcHRyKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQpAQCAtMzA4LDggJiM0MzszNzEsOCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqcHJlYWxsb2NfbHJ1X3BvcChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSwKIAogCWlmIChub2RlKSB7CiAJCWJwZl9tYXBfaW5jX2VsZW1fY291bnQoJmFtcDtodGFiLSZndDttYXApOwotCQlsID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKTsKLQkJbWVtY3B5KGwtJmd0O2tleSwga2V5LCBodGFiLSZndDttYXAua2V5X3NpemUpOwomIzQzOwkJbCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7CiYjNDM7CQltZW1jcHkoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBodGFiLSZndDttYXAua2V5X3NpemUpOwogCQlyZXR1cm4gbDsKIAl9CiAKQEAgLTM0MCw4ICYjNDM7NDAzLDcgQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYikKIAkJCQkJICAgIEdGUF9VU0VSIHwgX19HRlBfTk9XQVJOKTsKIAkJaWYgKCFwcHRyKQogCQkJZ290byBmcmVlX2VsZW1zOwotCQlodGFiX2VsZW1fc2V0X3B0cihnZXRfaHRhYl9lbGVtKGh0YWIsIGkpLCBodGFiLSZndDttYXAua2V5X3NpemUsCi0JCQkJICBwcHRyKTsKJiM0MzsJCWh0YWJfZWxlbV9zZXRfcHRyKGh0YWIsIGdldF9odGFiX2VsZW0oaHRhYiwgaSksIHBwdHIpOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAKQEAgLTM0OSw4ICYjNDM7NDExLDggQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYikKIAlpZiAoaHRhYl9pc19scnUoaHRhYikpCiAJCWVyciA9IGJwZl9scnVfaW5pdCgmYW1wO2h0YWItJmd0O2xydSwKIAkJCQkgICBodGFiLSZndDttYXAubWFwX2ZsYWdzICZhbXA7IEJQRl9GX05PX0NPTU1PTl9MUlUsCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaCkgLQotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSwKJiM0MzsJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGRhdGEpIC0KJiM0MzsJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSwKIAkJCQkgICBodGFiX2xydV9tYXBfZGVsZXRlX25vZGUsCiAJCQkJICAgaHRhYik7CiAJZWxzZQpAQCAtMzYxLDExICYjNDM7NDIzLDExIEBAIHN0YXRpYyBpbnQgcHJlYWxsb2NfaW5pdChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiAKIAlpZiAoaHRhYl9pc19scnUoaHRhYikpCiAJCWJwZl9scnVfcG9wdWxhdGUoJmFtcDtodGFiLSZndDtscnUsIGh0YWItJmd0O2VsZW1zLAotCQkJCSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSksCiYjNDM7CQkJCSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpLAogCQkJCSBodGFiLSZndDtlbGVtX3NpemUsIG51bV9lbnRyaWVzKTsKIAllbHNlCiAJCXBjcHVfZnJlZWxpc3RfcG9wdWxhdGUoJmFtcDtodGFiLSZndDtmcmVlbGlzdCwKLQkJCQkgICAgICAgaHRhYi0mZ3Q7ZWxlbXMgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgZm5vZGUpLAomIzQzOwkJCQkgICAgICAgaHRhYi0mZ3Q7ZWxlbXMgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSksCiAJCQkJICAgICAgIGh0YWItJmd0O2VsZW1fc2l6ZSwgbnVtX2VudHJpZXMpOwogCiAJcmV0dXJuIDA7CkBAIC00MDEsNyAmIzQzOzQ2Myw3IEBAIHN0YXRpYyBpbnQgYWxsb2NfZXh0cmFfZWxlbXMoc3RydWN0IGJwZl9odGFiICpodGFiKQogCQkvKiBwb3Agd2lsbCBzdWNjZWVkLCBzaW5jZSBwcmVhbGxvY19pbml0KCkKIAkJICogcHJlYWxsb2NhdGVkIGV4dHJhIG51bV9wb3NzaWJsZV9jcHVzIGVsZW1lbnRzCiAJCSAqLwotCQlsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSk7CiYjNDM7CQlsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmZub2RlKTsKIAkJKnBlcl9jcHVfcHRyKHBwdHIsIGNwdSkgPSBsX25ldzsKIAl9CiAJaHRhYi0mZ3Q7ZXh0cmFfZWxlbXMgPSBwcHRyOwpAQCAtNDI1LDggJiM0Mzs0ODcsOCBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKQogCWJvb2wgemVyb19zZWVkID0gKGF0dHItJmd0O21hcF9mbGFncyAmYW1wOyBCUEZfRl9aRVJPX1NFRUQpOwogCWludCBudW1hX25vZGUgPSBicGZfbWFwX2F0dHJfbnVtYV9ub2RlKGF0dHIpOwogCi0JQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGZub2RlLm5leHQpICE9Ci0JCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlLnBwcmV2KSk7CiYjNDM7CUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBmbm9kZS5uZXh0KSAhPQomIzQzOwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBoYXNoX25vZGUucHByZXYpKTsKIAogCWlmICh6ZXJvX3NlZWQgJmFtcDsmYW1wOyAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJLyogR3VhcmQgYWdhaW5zdCBsb2NhbCBEb1MsIGFuZCBkaXNjb3VyYWdlIHByb2R1Y3Rpb24gdXNlLiAqLwpAQCAtNDc2LDcgJiM0Mzs1MzgsNyBAQCBzdGF0aWMgdm9pZCBodGFiX21lbV9kdG9yKHZvaWQgKm9iaiwgdm9pZCAqY3R4KQogCWlmIChJU19FUlJfT1JfTlVMTChocmVjLSZndDtyZWNvcmQpKQogCQlyZXR1cm47CiAKLQltYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHJlYy0mZ3Q7a2V5X3NpemUpOwomIzQzOwltYXBfdmFsdWUgPSAodm9pZCAqKWVsZW0gJiM0MzsgaHJlYy0mZ3Q7a2V5X29mZnNldCAmIzQzOyByb3VuZF91cChocmVjLSZndDtrZXlfc2l6ZSwgOCk7CiAJYnBmX29ial9mcmVlX2ZpZWxkcyhocmVjLSZndDtyZWNvcmQsIG1hcF92YWx1ZSk7CiB9CiAKQEAgLTUwMiw3ICYjNDM7NTY0LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9kdG9yX2N0eF9mcmVlKHZvaWQgKmN0eCkKIH0KIAogc3RhdGljIGludCBicGZfbWFfc2V0X2R0b3Ioc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9tZW1fYWxsb2MgKm1hLAotCQkJICAgdm9pZCAoKmR0b3IpKHZvaWQgKiwgdm9pZCAqKSkKJiM0MzsJCQkgICB2b2lkICgqZHRvcikodm9pZCAqLCB2b2lkICopLCB1MzIga2V5X29mZnNldCkKIHsKIAlzdHJ1Y3QgaHRhYl9idGZfcmVjb3JkICpocmVjOwogCWludCBlcnI7CkBAIC01MTUsNiAmIzQzOzU3Nyw3IEBAIHN0YXRpYyBpbnQgYnBmX21hX3NldF9kdG9yKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfbWVtX2FsbG9jICptYSwKIAlpZiAoIWhyZWMpCiAJCXJldHVybiAtRU5PTUVNOwogCWhyZWMtJmd0O2tleV9zaXplID0gbWFwLSZndDtrZXlfc2l6ZTsKJiM0MzsJaHJlYy0mZ3Q7a2V5X29mZnNldCA9IGtleV9vZmZzZXQ7CiAJaHJlYy0mZ3Q7cmVjb3JkID0gYnRmX3JlY29yZF9kdXAobWFwLSZndDtyZWNvcmQpOwogCWlmIChJU19FUlIoaHJlYy0mZ3Q7cmVjb3JkKSkgewogCQllcnIgPSBQVFJfRVJSKGhyZWMtJmd0O3JlY29yZCk7CkBAIC01MzcsOSAmIzQzOzYwMCw5IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwKIAkgKiBwb3B1bGF0ZWQgaW4gaHRhYl9tYXBfYWxsb2MoKSwgc28gaXQgd2lsbCBhbHdheXMgYXBwZWFyIGFzIE5VTEwuCiAJICovCiAJaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKQotCQlyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgJmFtcDtodGFiLSZndDtwY3B1X21hLCBodGFiX3BjcHVfbWVtX2R0b3IpOwomIzQzOwkJcmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsICZhbXA7aHRhYi0mZ3Q7cGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yLCBodGFiLSZndDtrZXlfb2Zmc2V0KTsKIAllbHNlCi0JCXJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCAmYW1wO2h0YWItJmd0O21hLCBodGFiX21lbV9kdG9yKTsKJiM0MzsJCXJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCAmYW1wO2h0YWItJmd0O21hLCBodGFiX21lbV9kdG9yLCBodGFiLSZndDtrZXlfb2Zmc2V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cikKQEAgLTU2Miw2ICYjNDM7NjI1LDEzIEBAIHN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpCiAKIAlicGZfbWFwX2luaXRfZnJvbV9hdHRyKCZhbXA7aHRhYi0mZ3Q7bWFwLCBhdHRyKTsKIAomIzQzOwkvKiBBdm9pZCBoYXNoIG1lbW9yeSB1c2UgYW5kIGNvbXBhcmlzb25zIHdoZXJlIHVubmVjZXNzYXJ5LgomIzQzOwkgKiB1MzIgaGFzaCByZWFkcyBhcmUgYWx3YXlzIGF0b21pYy4gSWYgd2UgZWxpZGUgdGhlbSwga2V5IGNvbXBhcmlzb25zIG11c3QgYWxzbyBiZSBhdG9taWMKJiM0MzsJICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUga2V5IG1hdGNoZXMgZHVlIHRvIHRvcm4ga2V5IHJlYWRzIC8gd3JpdGVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGUKJiM0MzsJICogd2hlbiB0aGUga2V5IGZpdHMgd2l0aGluIGEgd29yZCwgc28gY2hlY2sga2V5X3NpemUuCiYjNDM7CSAqLwomIzQzOwlodGFiLSZndDtoYXNfaGFzaCA9IGh0YWJfaXNfbHJ1KGh0YWIpIHx8IGh0YWItJmd0O21hcC5rZXlfc2l6ZSAmZ3Q7IHNpemVvZih1bnNpZ25lZCBsb25nKTsKJiM0MzsKIAlpZiAocGVyY3B1X2xydSkgewogCQkvKiBlbnN1cmUgZWFjaCBDUFUmIzM5O3MgbHJ1IGxpc3QgaGFzICZndDs9MSBlbGVtZW50cy4KIAkJICogc2luY2Ugd2UgYXJlIGF0IGl0LCBtYWtlIGVhY2ggbHJ1IGxpc3QgaGFzIHRoZSBzYW1lCkBAIC01ODMsOCAmIzQzOzY1MywxNiBAQCBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKQogCiAJaHRhYi0mZ3Q7bl9idWNrZXRzID0gcm91bmR1cF9wb3dfb2ZfdHdvKGh0YWItJmd0O21hcC5tYXhfZW50cmllcyk7CiAKLQlodGFiLSZndDtlbGVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGh0YWJfZWxlbSkgJiM0MzsKLQkJCSAgcm91bmRfdXAoaHRhYi0mZ3Q7bWFwLmtleV9zaXplLCA4KTsKJiM0MzsJaWYgKGh0YWJfaXNfbHJ1KGh0YWIpKQomIzQzOwkJaHRhYi0mZ3Q7a2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBkYXRhKSAmIzQzOyA4OwomIzQzOwllbHNlIGlmIChwZXJjcHUgJmFtcDsmYW1wOyAhcHJlYWxsb2MpCiYjNDM7CQlodGFiLSZndDtrZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9wY3B1LCBkYXRhKSAmIzQzOwomIzQzOwkJCQkgICAoaHRhYl9oYXNfaGFzaChodGFiKSA/IDggOiAwKTsKJiM0MzsJZWxzZQomIzQzOwkJaHRhYi0mZ3Q7a2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGRhdGEpICYjNDM7CiYjNDM7CQkJCSAgIChodGFiX2hhc19oYXNoKGh0YWIpID8gOCA6IDApOwomIzQzOwomIzQzOwlodGFiLSZndDtlbGVtX3NpemUgPSBodGFiLSZndDtrZXlfb2Zmc2V0ICYjNDM7IHJvdW5kX3VwKGh0YWItJmd0O21hcC5rZXlfc2l6ZSwgOCk7CiAJaWYgKHBlcmNwdSkKIAkJaHRhYi0mZ3Q7ZWxlbV9zaXplICYjNDM7PSBzaXplb2Yodm9pZCAqKTsKIAllbHNlCkBAIC02OTIsMTUgJiM0Mzs3NzAsMjkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqc2VsZWN0X2J1Y2tldChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHUzMgogfQogCiAvKiB0aGlzIGxvb2t1cCBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBidWNrZXQgbG9jayB0YWtlbiAqLwotc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2gsCiYjNDM7c3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsCiYjNDM7CQkJCQkgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsIHUzMiBoYXNoLAogCQkJCQkgdm9pZCAqa2V5LCB1MzIga2V5X3NpemUpCiB7CiAJc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47CiAJc3RydWN0IGh0YWJfZWxlbSAqbDsKIAotCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpCi0JCWlmIChsLSZndDtoYXNoID09IGhhc2ggJmFtcDsmYW1wOyAhbWVtY21wKCZhbXA7bC0mZ3Q7a2V5LCBrZXksIGtleV9zaXplKSkKLQkJCXJldHVybiBsOwomIzQzOwlpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkgewomIzQzOwkJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKQomIzQzOwkJCWlmIChodGFiX2VsZW1faGFzaChodGFiLCBsKSA9PSBoYXNoICZhbXA7JmFtcDsKJiM0MzsJCQkgICAgIW1lbWNtcChodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXksIGtleV9zaXplKSkKJiM0MzsJCQkJcmV0dXJuIGw7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQkvKiBXaGVuIGhhc2ggaXMgb21pdHRlZCwga2V5IGNvbXBhcmlzb25zIG11c3QgYmUgYXRvbWljLiBaZXJvIGV4dGVuZAomIzQzOwkJICogdGhlIGNhbGxlciYjMzk7cyBrZXkgdG8gdGhlIHdvcmQgc2l6ZSB0byBzdXBwb3J0IGFuIGF0b21pYyBjb21wYXJlLgomIzQzOwkJICovCiYjNDM7CQl1bnNpZ25lZCBsb25nIGsgPSAwOwomIzQzOwomIzQzOwkJbWVtY3B5KCZhbXA7aywga2V5LCBrZXlfc2l6ZSk7CiYjNDM7CQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpCiYjNDM7CQkJaWYgKFJFQURfT05DRSgqKHVuc2lnbmVkIGxvbmcgKilodGFiX2VsZW1fa2V5KGh0YWIsIGwpKSA9PSBrKQomIzQzOwkJCQlyZXR1cm4gbDsKJiM0MzsJfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC03MDksNyAmIzQzOzgwMSw4IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfZWxlbV9yYXcoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsIHUzMiBoYXNoCiAgKiB0aGUgdW5saWtlbHkgZXZlbnQgd2hlbiBlbGVtZW50cyBtb3ZlZCBmcm9tIG9uZSBidWNrZXQgaW50byBhbm90aGVyCiAgKiB3aGlsZSBsaW5rIGxpc3QgaXMgYmVpbmcgd2Fsa2VkCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsCiYjNDM7c3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsCiYjNDM7CQkJCQkgICAgICAgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsCiAJCQkJCSAgICAgICB1MzIgaGFzaCwgdm9pZCAqa2V5LAogCQkJCQkgICAgICAgdTMyIGtleV9zaXplLCB1MzIgbl9idWNrZXRzKQogewpAQCAtNzE3LDkgJiM0Mzs4MTAsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCiBhZ2FpbjoKLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKQotCQlpZiAobC0mZ3Q7aGFzaCA9PSBoYXNoICZhbXA7JmFtcDsgIW1lbWNtcCgmYW1wO2wtJmd0O2tleSwga2V5LCBrZXlfc2l6ZSkpCi0JCQlyZXR1cm4gbDsKJiM0MzsJaWYgKGh0YWJfaGFzX2hhc2goaHRhYikpIHsKJiM0MzsJCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkKJiM0MzsJCQlpZiAoaHRhYl9lbGVtX2hhc2goaHRhYiwgbCkgPT0gaGFzaCAmYW1wOyZhbXA7CiYjNDM7CQkJICAgICFtZW1jbXAoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBrZXlfc2l6ZSkpCiYjNDM7CQkJCXJldHVybiBsOwomIzQzOwl9IGVsc2UgewomIzQzOwkJLyogU2VlIGxvb2t1cF9lbGVtX3JhdygpIGNvbW1lbnQgYWJvdmUuICovCiYjNDM7CQl1bnNpZ25lZCBsb25nIGsgPSAwOwomIzQzOwomIzQzOwkJbWVtY3B5KCZhbXA7aywga2V5LCBrZXlfc2l6ZSk7CiYjNDM7CQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpCiYjNDM7CQkJaWYgKFJFQURfT05DRSgqKHVuc2lnbmVkIGxvbmcgKilodGFiX2VsZW1fa2V5KGh0YWIsIGwpKSA9PSBrKQomIzQzOwkJCQlyZXR1cm4gbDsKJiM0MzsJfQogCiAJaWYgKHVubGlrZWx5KGdldF9udWxsc192YWx1ZShuKSAhPSAoaGFzaCAmYW1wOyAobl9idWNrZXRzIC0gMSkpKSkKIAkJZ290byBhZ2FpbjsKQEAgLTc0NywxNyAmIzQzOzg1MSwxOCBAQCBzdGF0aWMgdm9pZCAqX19odGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpCiAKIAloZWFkID0gc2VsZWN0X2J1Y2tldChodGFiLCBoYXNoKTsKIAotCWwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi0mZ3Q7bl9idWNrZXRzKTsKJiM0MzsJbCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLCBodGFiLSZndDtuX2J1Y2tldHMpOwogCiAJcmV0dXJuIGw7CiB9CiAKIHN0YXRpYyB2b2lkICpodGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7CiAKIAlpZiAobCkKLQkJcmV0dXJuIGh0YWJfZWxlbV92YWx1ZShsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCXJldHVybiBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTc3NSw2ICYjNDM7ODgwLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKICAqLwogc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjsKIAljb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wOwogCkBAIC03ODMsNyAmIzQzOzg4OSw3IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKQogCSppbnNuJiM0MzsmIzQzOyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7CiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCAxKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICYjNDM7CiYjNDM7CQkJCWh0YWItJmd0O2tleV9vZmZzZXQgJiM0MzsKIAkJCQlyb3VuZF91cChtYXAtJmd0O2tleV9zaXplLCA4KSk7CiAJcmV0dXJuIGluc24gLSBpbnNuX2J1ZjsKIH0KQEAgLTc5MSwxMiAmIzQzOzg5NywxMyBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZikKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqX19odGFiX2xydV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCQkJCQl2b2lkICprZXksIGNvbnN0IGJvb2wgbWFyaykKIHsKJiM0MzsJc3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApOwogCXN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTsKIAogCWlmIChsKSB7CiAJCWlmIChtYXJrKQotCQkJYnBmX2xydV9ub2RlX3NldF9yZWYoJmFtcDtsLSZndDtscnVfbm9kZSk7Ci0JCXJldHVybiBodGFiX2VsZW1fdmFsdWUobCwgbWFwLSZndDtrZXlfc2l6ZSk7CiYjNDM7CQkJYnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTsKJiM0MzsJCXJldHVybiBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC04MTUsNiAmIzQzOzkyMiw3IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9tYXBfbG9va3VwX2VsZW1fc3lzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKIHN0YXRpYyBpbnQgaHRhYl9scnVfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCQkgICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKQogewomIzQzOwlzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7CiAJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CiAJY29uc3QgaW50IHJldCA9IEJQRl9SRUdfMDsKIAljb25zdCBpbnQgcmVmX3JlZyA9IEJQRl9SRUdfMTsKQEAgLTgyNCwxNSAmIzQzOzkzMiwxNSBAQCBzdGF0aWMgaW50IGh0YWJfbHJ1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsCiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDQpOwogCSppbnNuJiM0MzsmIzQzOyA9IEJQRl9MRFhfTUVNKEJQRl9CLCByZWZfcmVnLCByZXQsCi0JCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSkgJiM0MzsKJiM0MzsJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpICYjNDM7CiAJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfSk1QX0lNTShCUEZfSk5FLCByZWZfcmVnLCAwLCAxKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfU1RfTUVNKEJQRl9CLCByZXQsCi0JCQkgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSAmIzQzOwomIzQzOwkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSAmIzQzOwogCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpLAogCQkJICAgICAxKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICYjNDM7CiYjNDM7CQkJCWh0YWItJmd0O2tleV9vZmZzZXQgJiM0MzsKIAkJCQlyb3VuZF91cChtYXAtJmd0O2tleV9zaXplLCA4KSk7CiAJcmV0dXJuIGluc24gLSBpbnNuX2J1ZjsKIH0KQEAgLTg0NCwxMyAmIzQzOzk1MiwxMyBAQCBzdGF0aWMgdm9pZCBjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsCiAJCXJldHVybjsKIAogCWlmIChodGFiX2lzX3BlcmNwdShodGFiKSkgewotCQl2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKTsKJiM0MzsJCXZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTsKIAkJaW50IGNwdTsKIAogCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQogCQkJYnBmX29ial9jYW5jZWxfZmllbGRzKCZhbXA7aHRhYi0mZ3Q7bWFwLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTsKIAl9IGVsc2UgewotCQl2b2lkICptYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKTsKJiM0MzsJCXZvaWQgKm1hcF92YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBlbGVtKTsKIAogCQlicGZfb2JqX2NhbmNlbF9maWVsZHMoJmFtcDtodGFiLSZndDttYXAsIG1hcF92YWx1ZSk7CiAJfQpAQCAtODY5LDE3ICYjNDM7OTc3LDE3IEBAIHN0YXRpYyBib29sIGh0YWJfbHJ1X21hcF9kZWxldGVfbm9kZSh2b2lkICphcmcsIHN0cnVjdCBicGZfbHJ1X25vZGUgKm5vZGUpCiAJc3RydWN0IGJ1Y2tldCAqYjsKIAlpbnQgcmV0OwogCi0JdGd0X2wgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpOwotCWIgPSBfX3NlbGVjdF9idWNrZXQoaHRhYiwgdGd0X2wtJmd0O2hhc2gpOwomIzQzOwl0Z3RfbCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7CiYjNDM7CWIgPSBfX3NlbGVjdF9idWNrZXQoaHRhYiwgaHRhYl9lbGVtX2hhc2goaHRhYiwgdGd0X2wpKTsKIAloZWFkID0gJmFtcDtiLSZndDtoZWFkOwogCiAJcmV0ID0gaHRhYl9sb2NrX2J1Y2tldChiLCAmYW1wO2ZsYWdzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gZmFsc2U7CiAKLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKQomIzQzOwlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpCiAJCWlmIChsID09IHRndF9sKSB7Ci0JCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7bm9kZS5oYXNoX25vZGUpOwogCQkJYnBmX21hcF9kZWNfZWxlbV9jb3VudCgmYW1wO2h0YWItJmd0O21hcCk7CiAJCQlicmVhazsKIAkJfQpAQCAtOTEyLDE4ICYjNDM7MTAyMCwxOSBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dldF9uZXh0X2tleShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKm5leHRfa2V5KQogCWhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGhhc2gpOwogCiAJLyogbG9va3VwIHRoZSBrZXkgKi8KLQlsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItJmd0O25fYnVja2V0cyk7CiYjNDM7CWwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi0mZ3Q7bl9idWNrZXRzKTsKIAogCWlmICghbCkKIAkJZ290byBmaW5kX2ZpcnN0X2VsZW07CiAKIAkvKiBrZXkgd2FzIGZvdW5kLCBnZXQgbmV4dCBrZXkgaW4gdGhlIHNhbWUgYnVja2V0ICovCi0JbmV4dF9sID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShyY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX25leHRfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKSksCi0JCQkJICBzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUpOwomIzQzOwluZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKAomIzQzOwkJCXJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoJmFtcDtsLSZndDtub2RlLmhhc2hfbm9kZSkpLAomIzQzOwkJCXN0cnVjdCBodGFiX2VsZW0sIG5vZGUuaGFzaF9ub2RlKTsKIAogCWlmIChuZXh0X2wpIHsKIAkJLyogaWYgbmV4dCBlbGVtIGluIHRoaXMgaGFzaCBsaXN0IGlzIG5vbi16ZXJvLCBqdXN0IHJldHVybiBpdCAqLwotCQltZW1jcHkobmV4dF9rZXksIG5leHRfbC0mZ3Q7a2V5LCBrZXlfc2l6ZSk7CiYjNDM7CQltZW1jcHkobmV4dF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbmV4dF9sKSwga2V5X3NpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTkzOCwxMCAmIzQzOzEwNDcsMTAgQEAgc3RhdGljIGludCBodGFiX21hcF9nZXRfbmV4dF9rZXkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICpuZXh0X2tleSkKIAogCQkvKiBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGJ1Y2tldCAqLwogCQluZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfZmlyc3RfcmN1KGhlYWQpKSwKLQkJCQkJICBzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUpOwomIzQzOwkJCQkJICBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7CiAJCWlmIChuZXh0X2wpIHsKIAkJCS8qIGlmIGl0JiMzOTtzIG5vdCBlbXB0eSwganVzdCByZXR1cm4gaXQgKi8KLQkJCW1lbWNweShuZXh0X2tleSwgbmV4dF9sLSZndDtrZXksIGtleV9zaXplKTsKJiM0MzsJCQltZW1jcHkobmV4dF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbmV4dF9sKSwga2V5X3NpemUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC05NTUsNyAmIzQzOzEwNjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2VsZW1fZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiAJY2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgbCk7CiAKIAlpZiAoaHRhYi0mZ3Q7bWFwLm1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfSEFTSCkKLQkJYnBmX21lbV9jYWNoZV9mcmVlKCZhbXA7aHRhYi0mZ3Q7cGNwdV9tYSwgbC0mZ3Q7cHRyX3RvX3BwdHIpOwomIzQzOwkJYnBmX21lbV9jYWNoZV9mcmVlKCZhbXA7aHRhYi0mZ3Q7cGNwdV9tYSwgaHRhYl9lbGVtX2dldF9wdHJfdG9fcHB0cihsKSk7CiAJYnBmX21lbV9jYWNoZV9mcmVlKCZhbXA7aHRhYi0mZ3Q7bWEsIGwpOwogfQogCkBAIC05NjUsNyAmIzQzOzEwNzQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX3B1dF9mZF92YWx1ZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiAJdm9pZCAqcHRyOwogCiAJaWYgKG1hcC0mZ3Q7b3BzLSZndDttYXBfZmRfcHV0X3B0cikgewotCQlwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7CiYjNDM7CQlwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKGh0YWIsIGwpOwogCQltYXAtJmd0O29wcy0mZ3Q7bWFwX2ZkX3B1dF9wdHIobWFwLCBwdHIsIHRydWUpOwogCX0KIH0KQEAgLTEwMDYsNyAmIzQzOzExMTUsNyBAQCBzdGF0aWMgdm9pZCBmcmVlX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiAJaWYgKGh0YWJfaXNfcHJlYWxsb2MoaHRhYikpIHsKIAkJYnBmX21hcF9kZWNfZWxlbV9jb3VudCgmYW1wO2h0YWItJmd0O21hcCk7CiAJCWNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKGh0YWIsIGwpOwotCQlwY3B1X2ZyZWVsaXN0X3B1c2goJmFtcDtodGFiLSZndDtmcmVlbGlzdCwgJmFtcDtsLSZndDtmbm9kZSk7CiYjNDM7CQlwY3B1X2ZyZWVsaXN0X3B1c2goJmFtcDtodGFiLSZndDtmcmVlbGlzdCwgJmFtcDtsLSZndDtub2RlLmZub2RlKTsKIAl9IGVsc2UgewogCQlkZWNfZWxlbV9jb3VudChodGFiKTsKIAkJaHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7CkBAIC0xMDk3LDcgJiM0MzsxMjA2LDcgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSwKIAkJCWwgPSBfX3BjcHVfZnJlZWxpc3RfcG9wKCZhbXA7aHRhYi0mZ3Q7ZnJlZWxpc3QpOwogCQkJaWYgKCFsKQogCQkJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7Ci0JCQlsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSk7CiYjNDM7CQkJbF9uZXcgPSBjb250YWluZXJfb2YobCwgc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSk7CiAJCQlicGZfbWFwX2luY19lbGVtX2NvdW50KCZhbXA7aHRhYi0mZ3Q7bWFwKTsKIAkJfQogCX0gZWxzZSB7CkBAIC0xMTE3LDEwICYjNDM7MTIyNiwyMCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqYWxsb2NfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LAogCQl9CiAJfQogCi0JbWVtY3B5KGxfbmV3LSZndDtrZXksIGtleSwga2V5X3NpemUpOwomIzQzOwlpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkgewomIzQzOwkJbWVtY3B5KGh0YWJfZWxlbV9rZXkoaHRhYiwgbF9uZXcpLCBrZXksIGtleV9zaXplKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCS8qIFplcm8tZXh0ZW5kIGtleSBpbnRvIGsgZm9yIGFuIGF0b21pYyB3cml0ZSB0byBzdXBwb3J0CiYjNDM7CQkgKiBsb2NrbGVzcyBSQ1UgcmVhZGVycy4KJiM0MzsJCSAqLwomIzQzOwkJdW5zaWduZWQgbG9uZyBrID0gMDsKJiM0MzsKJiM0MzsJCW1lbWNweSgmYW1wO2ssIGtleSwga2V5X3NpemUpOwomIzQzOwkJV1JJVEVfT05DRSgqKHVuc2lnbmVkIGxvbmcgKilodGFiX2VsZW1fa2V5KGh0YWIsIGxfbmV3KSwgayk7CiYjNDM7CX0KIAlpZiAocGVyY3B1KSB7CiAJCWlmIChwcmVhbGxvYykgewotCQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSk7CiYjNDM7CQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGxfbmV3KTsKIAkJfSBlbHNlIHsKIAkJCS8qIGFsbG9jX3BlcmNwdSB6ZXJvLWZpbGxzICovCiAJCQl2b2lkICpwdHIgPSBicGZfbWVtX2NhY2hlX2FsbG9jKCZhbXA7aHRhYi0mZ3Q7cGNwdV9tYSk7CkBAIC0xMTMwLDI2ICYjNDM7MTI0OSwyNiBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqYWxsb2NfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LAogCQkJCWxfbmV3ID0gRVJSX1BUUigtRU5PTUVNKTsKIAkJCQlnb3RvIGRlY19jb3VudDsKIAkJCX0KLQkJCWxfbmV3LSZndDtwdHJfdG9fcHB0ciA9IHB0cjsKJiM0MzsJCQlodGFiX2VsZW1fc2V0X3B0cl90b19wcHRyKGxfbmV3LCBwdHIpOwogCQkJcHB0ciA9ICoodm9pZCBfX3BlcmNwdSAqKilwdHI7CiAJCX0KIAogCQlwY3B1X2luaXRfdmFsdWUoaHRhYiwgcHB0ciwgdmFsdWUsIG9uYWxsY3B1cywgbWFwX2ZsYWdzKTsKIAogCQlpZiAoIXByZWFsbG9jKQotCQkJaHRhYl9lbGVtX3NldF9wdHIobF9uZXcsIGtleV9zaXplLCBwcHRyKTsKJiM0MzsJCQlodGFiX2VsZW1fc2V0X3B0cihodGFiLCBsX25ldywgcHB0cik7CiAJfSBlbHNlIGlmIChmZF9odGFiX21hcF9uZWVkc19hZGp1c3QoaHRhYikpIHsKIAkJc2l6ZSA9IHJvdW5kX3VwKHNpemUsIDgpOwotCQltZW1jcHkoaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBrZXlfc2l6ZSksIHZhbHVlLCBzaXplKTsKJiM0MzsJCW1lbWNweShodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSwgc2l6ZSk7CiAJfSBlbHNlIGlmIChtYXBfZmxhZ3MgJmFtcDsgQlBGX0ZfTE9DSykgewogCQljb3B5X21hcF92YWx1ZV9sb2NrZWQoJmFtcDtodGFiLSZndDttYXAsCi0JCQkJICAgICAgaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBrZXlfc2l6ZSksCiYjNDM7CQkJCSAgICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksCiAJCQkJICAgICAgdmFsdWUsIGZhbHNlKTsKIAl9IGVsc2UgewotCQljb3B5X21hcF92YWx1ZSgmYW1wO2h0YWItJmd0O21hcCwgaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBrZXlfc2l6ZSksIHZhbHVlKTsKJiM0MzsJCWNvcHlfbWFwX3ZhbHVlKCZhbXA7aHRhYi0mZ3Q7bWFwLCBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSk7CiAJfQogCi0JbF9uZXctJmd0O2hhc2ggPSBoYXNoOwomIzQzOwlodGFiX2VsZW1fc2V0X2hhc2goaHRhYiwgbF9uZXcsIGhhc2gpOwogCXJldHVybiBsX25ldzsKIGRlY19jb3VudDoKIAlkZWNfZWxlbV9jb3VudChodGFiKTsKQEAgLTExOTksNyAmIzQzOzEzMTgsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAogCQlpZiAodW5saWtlbHkoIWJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC0mZ3Q7cmVjb3JkLCBCUEZfU1BJTl9MT0NLKSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJLyogZmluZCBhbiBlbGVtZW50IHdpdGhvdXQgdGFraW5nIHRoZSBidWNrZXQgbG9jayAqLwotCQlsX29sZCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLAomIzQzOwkJbF9vbGQgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwKIAkJCQkJICAgICAgaHRhYi0mZ3Q7bl9idWNrZXRzKTsKIAkJcmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7CiAJCWlmIChyZXQpCkBAIC0xMjA3LDcgJiM0MzsxMzI2LDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIAkJaWYgKGxfb2xkKSB7CiAJCQkvKiBncmFiIHRoZSBlbGVtZW50IGxvY2sgYW5kIHVwZGF0ZSB2YWx1ZSBpbiBwbGFjZSAqLwogCQkJY29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCwKLQkJCQkJICAgICAgaHRhYl9lbGVtX3ZhbHVlKGxfb2xkLCBrZXlfc2l6ZSksCiYjNDM7CQkJCQkgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpLAogCQkJCQkgICAgICB2YWx1ZSwgZmFsc2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEyMjEsNyAmIzQzOzEzNDAsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7CiAKIAlyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTsKIAlpZiAocmV0KQpAQCAtMTIzNSw3ICYjNDM7MTM1NCw3IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsCiAJCSAqIGFuZCB1cGRhdGUgZWxlbWVudCBpbiBwbGFjZQogCQkgKi8KIAkJY29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCwKLQkJCQkgICAgICBodGFiX2VsZW1fdmFsdWUobF9vbGQsIGtleV9zaXplKSwKJiM0MzsJCQkJICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKSwKIAkJCQkgICAgICB2YWx1ZSwgZmFsc2UpOwogCQlyZXQgPSAwOwogCQlnb3RvIGVycjsKQEAgLTEyNTIsOSAmIzQzOzEzNzEsOSBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAogCS8qIGFkZCBuZXcgZWxlbWVudCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgc28gdGhhdAogCSAqIGNvbmN1cnJlbnQgc2VhcmNoIHdpbGwgZmluZCBpdCBiZWZvcmUgb2xkIGVsZW0KIAkgKi8KLQlobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoJmFtcDtsX25ldy0mZ3Q7aGFzaF9ub2RlLCBoZWFkKTsKJiM0MzsJaGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KCZhbXA7bF9uZXctJmd0O25vZGUuaGFzaF9ub2RlLCBoZWFkKTsKIAlpZiAobF9vbGQpIHsKLQkJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2xfb2xkLSZndDtoYXNoX25vZGUpOwomIzQzOwkJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2xfb2xkLSZndDtub2RlLmhhc2hfbm9kZSk7CiAKIAkJLyogbF9vbGQgaGFzIGFscmVhZHkgYmVlbiBzdGFzaGVkIGluIGh0YWItJmd0O2V4dHJhX2VsZW1zLCBjYW5jZWwKIAkJICogaXRzIHJldXNhYmxlIHNwZWNpYWwgZmllbGRzIGJlZm9yZSBpdCBpcyBhdmFpbGFibGUgZm9yIHJldXNlLgpAQCAtMTI3NSw3ICYjNDM7MTM5NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfbHJ1X3B1c2hfZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pCiB7CiAJY2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgZWxlbSk7CiAJYnBmX21hcF9kZWNfZWxlbV9jb3VudCgmYW1wO2h0YWItJmd0O21hcCk7Ci0JYnBmX2xydV9wdXNoX2ZyZWUoJmFtcDtodGFiLSZndDtscnUsICZhbXA7ZWxlbS0mZ3Q7bHJ1X25vZGUpOwomIzQzOwlicGZfbHJ1X3B1c2hfZnJlZSgmYW1wO2h0YWItJmd0O2xydSwgaHRhYl9lbGVtX2xydV9ub2RlKGVsZW0pKTsKIH0KIAogc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsCkBAIC0xMzEwLDEzICYjNDM7MTQyOSwxMyBAQCBzdGF0aWMgbG9uZyBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZQogCWxfbmV3ID0gcHJlYWxsb2NfbHJ1X3BvcChodGFiLCBrZXksIGhhc2gpOwogCWlmICghbF9uZXcpCiAJCXJldHVybiAtRU5PTUVNOwotCWNvcHlfbWFwX3ZhbHVlKCZhbXA7aHRhYi0mZ3Q7bWFwLCBodGFiX2VsZW1fdmFsdWUobF9uZXcsIG1hcC0mZ3Q7a2V5X3NpemUpLCB2YWx1ZSk7CiYjNDM7CWNvcHlfbWFwX3ZhbHVlKCZhbXA7aHRhYi0mZ3Q7bWFwLCBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSk7CiAKIAlyZXQgPSBodGFiX2xvY2tfYnVja2V0KGIsICZhbXA7ZmxhZ3MpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2xvY2tfYnVja2V0OwogCi0JbF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7CiYjNDM7CWxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpOwogCiAJcmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7CiAJaWYgKHJldCkKQEAgLTEzMjUsMTAgJiM0MzsxNDQ0LDEwIEBAIHN0YXRpYyBsb25nIGh0YWJfbHJ1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlCiAJLyogYWRkIG5ldyBlbGVtZW50IHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0CiAJICogY29uY3VycmVudCBzZWFyY2ggd2lsbCBmaW5kIGl0IGJlZm9yZSBvbGQgZWxlbQogCSAqLwotCWhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmYW1wO2xfbmV3LSZndDtoYXNoX25vZGUsIGhlYWQpOwomIzQzOwlobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoJmFtcDtsX25ldy0mZ3Q7bm9kZS5oYXNoX25vZGUsIGhlYWQpOwogCWlmIChsX29sZCkgewotCQlicGZfbHJ1X25vZGVfc2V0X3JlZigmYW1wO2xfbmV3LSZndDtscnVfbm9kZSk7Ci0JCWhsaXN0X251bGxzX2RlbF9yY3UoJmFtcDtsX29sZC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCWJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsX25ldykpOwomIzQzOwkJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2xfb2xkLSZndDtub2RlLmhhc2hfbm9kZSk7CiAJfQogCXJldCA9IDA7CiAKQEAgLTEzODMsNyAmIzQzOzE1MDIsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpOwomIzQzOwlsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKIAogCXJldCA9IGNoZWNrX2ZsYWdzKGh0YWIsIGxfb2xkLCBtYXBfZmxhZ3MpOwogCWlmIChyZXQpCkBAIC0xMzkyLDEwICYjNDM7MTUxMSwxMCBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAJaWYgKGxfb2xkKSB7CiAJCS8qIFVwZGF0ZSB2YWx1ZSBpbi1wbGFjZSAqLwogCQlpZiAocGVyY3B1KSB7Ci0JCQlwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIobF9vbGQsIGtleV9zaXplKSwKJiM0MzsJCQlwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLAogCQkJCQl2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpOwogCQl9IGVsc2UgewotCQkJdm9pZCAqKmlubmVyX21hcF9wcHRyID0gaHRhYl9lbGVtX3ZhbHVlKGxfb2xkLCBrZXlfc2l6ZSk7CiYjNDM7CQkJdm9pZCAqKmlubmVyX21hcF9wcHRyID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKTsKIAogCQkJb2xkX21hcF9wdHIgPSAqaW5uZXJfbWFwX3BwdHI7CiAJCQlXUklURV9PTkNFKCppbm5lcl9tYXBfcHB0ciwgKih2b2lkICoqKXZhbHVlKTsKQEAgLTE0MDcsNyAmIzQzOzE1MjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAJCQlyZXQgPSBQVFJfRVJSKGxfbmV3KTsKIAkJCWdvdG8gZXJyOwogCQl9Ci0JCWhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmYW1wO2xfbmV3LSZndDtoYXNoX25vZGUsIGhlYWQpOwomIzQzOwkJaGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KCZhbXA7bF9uZXctJmd0O25vZGUuaGFzaF9ub2RlLCBoZWFkKTsKIAl9CiBlcnI6CiAJaHRhYl91bmxvY2tfYnVja2V0KGIsIGZsYWdzKTsKQEAgLTE0NTYsMjIgJiM0MzsxNTc1LDIyIEBAIHN0YXRpYyBsb25nIF9faHRhYl9scnVfcGVyY3B1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAJaWYgKHJldCkKIAkJZ290byBlcnJfbG9ja19idWNrZXQ7CiAKLQlsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7CiAKIAlyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAogCWlmIChsX29sZCkgewotCQlicGZfbHJ1X25vZGVfc2V0X3JlZigmYW1wO2xfb2xkLSZndDtscnVfbm9kZSk7CiYjNDM7CQlicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobF9vbGQpKTsKIAogCQkvKiBwZXItY3B1IGhhc2ggbWFwIGNhbiB1cGRhdGUgdmFsdWUgaW4tcGxhY2UgKi8KLQkJcGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfb2xkLCBrZXlfc2l6ZSksCiYjNDM7CQlwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLAogCQkJCXZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7CiAJfSBlbHNlIHsKLQkJcGNwdV9pbml0X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSksCiYjNDM7CQlwY3B1X2luaXRfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9uZXcpLAogCQkJCXZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7Ci0JCWhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmYW1wO2xfbmV3LSZndDtoYXNoX25vZGUsIGhlYWQpOwomIzQzOwkJaGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KCZhbXA7bF9uZXctJmd0O25vZGUuaGFzaF9ub2RlLCBoZWFkKTsKIAkJbF9uZXcgPSBOVUxMOwogCX0KIAlyZXQgPSAwOwpAQCAtMTQ4MCw3ICYjNDM7MTU5OSw3IEBAIHN0YXRpYyBsb25nIF9faHRhYl9scnVfcGVyY3B1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiBlcnJfbG9ja19idWNrZXQ6CiAJaWYgKGxfbmV3KSB7CiAJCWJwZl9tYXBfZGVjX2VsZW1fY291bnQoJmFtcDtodGFiLSZndDttYXApOwotCQlicGZfbHJ1X3B1c2hfZnJlZSgmYW1wO2h0YWItJmd0O2xydSwgJmFtcDtsX25ldy0mZ3Q7bHJ1X25vZGUpOwomIzQzOwkJYnBmX2xydV9wdXNoX2ZyZWUoJmFtcDtodGFiLSZndDtscnUsIGh0YWJfZWxlbV9scnVfbm9kZShsX25ldykpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMTUyMSw5ICYjNDM7MTY0MCw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKIAlpZiAobCkKLQkJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2wtJmd0O2hhc2hfbm9kZSk7CiYjNDM7CQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7bm9kZS5oYXNoX25vZGUpOwogCWVsc2UKIAkJcmV0ID0gLUVOT0VOVDsKIApAQCAtMTU1NiwxMCAmIzQzOzE2NzUsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKIAogCWlmIChsKQotCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCWhsaXN0X251bGxzX2RlbF9yY3UoJmFtcDtsLSZndDtub2RlLmhhc2hfbm9kZSk7CiAJZWxzZQogCQlyZXQgPSAtRU5PRU5UOwogCkBAIC0xNTgxLDggJiM0MzsxNzAwLDggQEAgc3RhdGljIHZvaWQgZGVsZXRlX2FsbF9lbGVtZW50cyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiAJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOwogCQlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCi0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7Ci0JCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHsKJiM0MzsJCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7bm9kZS5oYXNoX25vZGUpOwogCQkJaHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7CiAJCX0KIAkJY29uZF9yZXNjaGVkKCk7CkBAIC0xNTk5LDEwICYjNDM7MTcxOCwxMCBAQCBzdGF0aWMgdm9pZCBodGFiX2ZyZWVfbWFsbG9jZWRfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiAJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOwogCQlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCi0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkgewomIzQzOwkJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHsKIAkJCS8qIFdlIG9ubHkgZnJlZSBpbnRlcm5hbCBzdHJ1Y3RzIG9uIHVyZWYgZHJvcHBpbmcgdG8gemVybyAqLwogCQkJYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoJmFtcDtodGFiLSZndDttYXAsCi0JCQkJCQkgICAgICBodGFiX2VsZW1fdmFsdWUobCwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKSk7CiYjNDM7CQkJCQkJICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpKTsKIAkJfQogCQljb25kX3Jlc2NoZWRfcmN1KCk7CiAJfQpAQCAtMTY5Nyw3ICYjNDM7MTgxNiw3IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKIAlpZiAoIWwpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTcwOCwxNCAmIzQzOzE4MjcsMTQgQEAgc3RhdGljIGludCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LAogCQl2b2lkIF9fcGVyY3B1ICpwcHRyOwogCQlpbnQgb2ZmID0gMCwgY3B1OwogCi0JCXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBrZXlfc2l6ZSk7CiYjNDM7CQlwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCk7CiAJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJCWNvcHlfbWFwX3ZhbHVlX2xvbmcoJmFtcDtodGFiLSZndDttYXAsIHZhbHVlICYjNDM7IG9mZiwgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7CiAJCQljaGVja19hbmRfaW5pdF9tYXBfdmFsdWUoJmFtcDtodGFiLSZndDttYXAsIHZhbHVlICYjNDM7IG9mZik7CiAJCQlvZmYgJiM0Mzs9IHJvdW5kdXBfdmFsdWVfc2l6ZTsKIAkJfQogCX0gZWxzZSB7Ci0JCXZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCXZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTsKIAogCQlpZiAoZmxhZ3MgJmFtcDsgQlBGX0ZfTE9DSykKIAkJCWNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsIHZhbHVlLCBzcmMsIHRydWUpOwpAQCAtMTcyNCw3ICYjNDM7MTg0Myw3IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwKIAkJLyogWmVyb2luZyBzcGVjaWFsIGZpZWxkcyBpbiB0aGUgdGVtcCBidWZmZXIgKi8KIAkJY2hlY2tfYW5kX2luaXRfbWFwX3ZhbHVlKG1hcCwgdmFsdWUpOwogCX0KLQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2wtJmd0O25vZGUuaGFzaF9ub2RlKTsKIAogb3V0X3VubG9jazoKIAlodGFiX3VubG9ja19idWNrZXQoYiwgYmZsYWdzKTsKQEAgLTE4NjAsNyAmIzQzOzE5NzksNyBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsCiAJfQogCiAJYnVja2V0X2NudCA9IDA7Ci0JaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkKJiM0MzsJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKQogCQlidWNrZXRfY250JiM0MzsmIzQzOzsKIAogCWlmIChidWNrZXRfY250ICZhbXA7JmFtcDsgIWxvY2tlZCkgewpAQCAtMTg5NywxNCAmIzQzOzIwMTYsMTQgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLAogCWlmICghbG9ja2VkKQogCQlnb3RvIG5leHRfYmF0Y2g7CiAKLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkgewotCQltZW1jcHkoZHN0X2tleSwgbC0mZ3Q7a2V5LCBrZXlfc2l6ZSk7CiYjNDM7CWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHsKJiM0MzsJCW1lbWNweShkc3Rfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXlfc2l6ZSk7CiAKIAkJaWYgKGlzX3BlcmNwdSkgewogCQkJaW50IG9mZiA9IDAsIGNwdTsKIAkJCXZvaWQgX19wZXJjcHUgKnBwdHI7CiAKLQkJCXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCQlwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCk7CiAJCQlpZiAoZWxlbV9tYXBfZmxhZ3MgJmFtcDsgQlBGX0ZfQ1BVKSB7CiAJCQkJY3B1ID0gZWxlbV9tYXBfZmxhZ3MgJmd0OyZndDsgMzI7CiAJCQkJY29weV9tYXBfdmFsdWUoJmFtcDtodGFiLSZndDttYXAsIGRzdF92YWwsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpOwpAQCAtMTkxOCw3ICYjNDM7MjAzNyw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl2YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShsLCBrZXlfc2l6ZSk7CiYjNDM7CQkJdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7CiAJCQlpZiAoaXNfZmRfaHRhYihodGFiKSkgewogCQkJCXN0cnVjdCBicGZfbWFwICoqaW5uZXJfbWFwID0gdmFsdWU7CiAKQEAgLTE5MzYsNyAmIzQzOzIwNTUsNyBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsCiAJCQljaGVja19hbmRfaW5pdF9tYXBfdmFsdWUobWFwLCBkc3RfdmFsKTsKIAkJfQogCQlpZiAoZG9fZGVsZXRlKSB7Ci0JCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7bm9kZS5oYXNoX25vZGUpOwogCiAJCQkvKiBicGZfbHJ1X3B1c2hfZnJlZSgpIHdpbGwgYWNxdWlyZSBscnVfbG9jaywgd2hpY2gKIAkJCSAqIG1heSBjYXVzZSBkZWFkbG9jay4gU2VlIGNvbW1lbnRzIGluIGZ1bmN0aW9uCkBAIC0xOTQ4LDcgJiM0MzsyMDY3LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLAogCQkJICogbG9jayBiZWluZyBoZWxkIGFuZCBpdCB2aW9sYXRlcyB0aGUgbG9jayBydWxlLCBzbwogCQkJICogaW52b2tlIGZyZWVfaHRhYl9lbGVtKCkgYWZ0ZXIgdW5sb2NrIGFzIHdlbGwuCiAJCQkgKi8KLQkJCWwtJmd0O2JhdGNoX2ZsaW5rID0gbm9kZV90b19mcmVlOwomIzQzOwkJCWwtJmd0O25vZGUuYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7CiAJCQlub2RlX3RvX2ZyZWUgPSBsOwogCQl9CiAJCWRzdF9rZXkgJiM0Mzs9IGtleV9zaXplOwpAQCAtMTk2MCw3ICYjNDM7MjA3OSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCwKIAogCXdoaWxlIChub2RlX3RvX2ZyZWUpIHsKIAkJbCA9IG5vZGVfdG9fZnJlZTsKLQkJbm9kZV90b19mcmVlID0gbm9kZV90b19mcmVlLSZndDtiYXRjaF9mbGluazsKJiM0MzsJCW5vZGVfdG9fZnJlZSA9IG5vZGVfdG9fZnJlZS0mZ3Q7bm9kZS5iYXRjaF9mbGluazsKIAkJaWYgKGlzX2xydV9tYXApCiAJCQlodGFiX2xydV9wdXNoX2ZyZWUoaHRhYiwgbCk7CiAJCWVsc2UKQEAgLTIxMDgsOCAmIzQzOzIyMjcsOCBAQCBicGZfaGFzaF9tYXBfc2VxX2ZpbmRfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2hhc2hfbWFwX2luZm8gKmluZm8sCiAJCS8qIG5vIHVwZGF0ZS9kZWxldGlvbiBvbiB0aGlzIGJ1Y2tldCwgcHJldl9lbGVtIHNob3VsZCBiZSBzdGlsbCB2YWxpZAogCQkgKiBhbmQgd2Ugd29uJiMzOTt0IHNraXAgZWxlbWVudHMuCiAJCSAqLwotCQluID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdSgmYW1wO3ByZXZfZWxlbS0mZ3Q7aGFzaF9ub2RlKSk7Ci0JCWVsZW0gPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKG4sIHN0cnVjdCBodGFiX2VsZW0sIGhhc2hfbm9kZSk7CiYjNDM7CQluID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdSgmYW1wO3ByZXZfZWxlbS0mZ3Q7bm9kZS5oYXNoX25vZGUpKTsKJiM0MzsJCWVsZW0gPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKG4sIHN0cnVjdCBodGFiX2VsZW0sIG5vZGUuaGFzaF9ub2RlKTsKIAkJaWYgKGVsZW0pCiAJCQlyZXR1cm4gZWxlbTsKIApAQCAtMjEyNSw3ICYjNDM7MjI0NCw3IEBAIGJwZl9oYXNoX21hcF9zZXFfZmluZF9uZXh0KHN0cnVjdCBicGZfaXRlcl9zZXFfaGFzaF9tYXBfaW5mbyAqaW5mbywKIAogCQljb3VudCA9IDA7CiAJCWhlYWQgPSAmYW1wO2ItJmd0O2hlYWQ7Ci0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShlbGVtLCBuLCBoZWFkLCBoYXNoX25vZGUpIHsKJiM0MzsJCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShlbGVtLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkgewogCQkJaWYgKGNvdW50ICZndDs9IHNraXBfZWxlbXMpIHsKIAkJCQlpbmZvLSZndDtidWNrZXRfaWQgPSBpOwogCQkJCWluZm8tJmd0O3NraXBfZWxlbXMgPSBjb3VudDsKQEAgLTIxODMsMTIgJiM0MzsyMzAyLDEyIEBAIHN0YXRpYyBpbnQgX19icGZfaGFzaF9tYXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pCiAJCWN0eC5tZXRhID0gJmFtcDttZXRhOwogCQljdHgubWFwID0gaW5mby0mZ3Q7bWFwOwogCQlpZiAoZWxlbSkgewotCQkJY3R4LmtleSA9IGVsZW0tJmd0O2tleTsKJiM0MzsJCQljdHgua2V5ID0gaHRhYl9lbGVtX2tleShpbmZvLSZndDtodGFiLCBlbGVtKTsKIAkJCWlmICghaW5mby0mZ3Q7cGVyY3B1X3ZhbHVlX2J1ZikgewotCQkJCWN0eC52YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShlbGVtLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCQkJY3R4LnZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGluZm8tJmd0O2h0YWIsIGVsZW0pOwogCQkJfSBlbHNlIHsKIAkJCQlyb3VuZHVwX3ZhbHVlX3NpemUgPSByb3VuZF91cChtYXAtJmd0O3ZhbHVlX3NpemUsIDgpOwotCQkJCXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGluZm8tJmd0O2h0YWIsIGVsZW0pOwogCQkJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJCQkJY29weV9tYXBfdmFsdWVfbG9uZyhtYXAsIGluZm8tJmd0O3BlcmNwdV92YWx1ZV9idWYgJiM0Mzsgb2ZmLAogCQkJCQkJCSAgICBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTsKQEAgLTIyOTIsMTQgJiM0MzsyNDExLDE0IEBAIHN0YXRpYyBsb25nIGJwZl9mb3JfZWFjaF9oYXNoX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgYnBmX2NhbGxiYWNrX3QgY2FsbGJhY2tfCiAJCWIgPSAmYW1wO2h0YWItJmd0O2J1Y2tldHNbaV07CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJaGVhZCA9ICZhbXA7Yi0mZ3Q7aGVhZDsKLQkJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShlbGVtLCBuLCBoZWFkLCBoYXNoX25vZGUpIHsKLQkJCWtleSA9IGVsZW0tJmd0O2tleTsKJiM0MzsJCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHsKJiM0MzsJCQlrZXkgPSBodGFiX2VsZW1fa2V5KGh0YWIsIGVsZW0pOwogCQkJaWYgKGlzX3BlcmNwdSkgewogCQkJCS8qIGN1cnJlbnQgY3B1IHZhbHVlIGZvciBwZXJjcHUgbWFwICovCi0JCQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIG1hcC0mZ3Q7a2V5X3NpemUpOwomIzQzOwkJCQlwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZWxlbSk7CiAJCQkJdmFsID0gdGhpc19jcHVfcHRyKHBwdHIpOwogCQkJfSBlbHNlIHsKLQkJCQl2YWwgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgbWFwLSZndDtrZXlfc2l6ZSk7CiYjNDM7CQkJCXZhbCA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBlbGVtKTsKIAkJCX0KIAkJCW51bV9lbGVtcyYjNDM7JiM0Mzs7CiAJCQlyZXQgPSBjYWxsYmFja19mbigodTY0KShsb25nKW1hcCwgKHU2NCkobG9uZylrZXksCkBAIC0yNDAzLDEwICYjNDM7MjUyMiwxMSBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9scnVfbWFwX29wcyA9IHsKIC8qIENhbGxlZCBmcm9tIGVCUEYgcHJvZ3JhbSAqLwogc3RhdGljIHZvaWQgKmh0YWJfcGVyY3B1X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7CiAKIAlpZiAobCkKLQkJcmV0dXJuIHRoaXNfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtJmd0O2tleV9zaXplKSk7CiYjNDM7CQlyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpKTsKIAllbHNlCiAJCXJldHVybiBOVUxMOwogfQpAQCAtMjQxNCw2ICYjNDM7MjUzNCw3IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KQogLyogaW5saW5lIGJwZl9tYXBfbG9va3VwX2VsZW0oKSBjYWxsIGZvciBwZXItQ1BVIGhhc2htYXAgKi8KIHN0YXRpYyBpbnQgaHRhYl9wZXJjcHVfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZikKIHsKJiM0MzsJc3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApOwogCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmOwogCiAJaWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpCkBAIC0yNDI0LDcgJiM0MzsyNTQ1LDcgQEAgc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc24KIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pOwogCSppbnNuJiM0MzsmIzQzOyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMyk7CiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwga2V5KSAmIzQzOyByb3VuZHVwKG1hcC0mZ3Q7a2V5X3NpemUsIDgpKTsKJiM0MzsJCQkJaHRhYi0mZ3Q7a2V5X29mZnNldCAmIzQzOyByb3VuZHVwKG1hcC0mZ3Q7a2V5X3NpemUsIDgpKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18wLCAwKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfTU9WNjRfUEVSQ1BVX1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMCk7CiAKQEAgLTI0MzMsNiAmIzQzOzI1NTQsNyBAQCBzdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbgogCiBzdGF0aWMgdm9pZCAqaHRhYl9wZXJjcHVfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHUzMiBjcHUpCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCiAJaWYgKGNwdSAmZ3Q7PSBucl9jcHVfaWRzKQpAQCAtMjQ0MCwxOCAmIzQzOzI1NjIsMTkgQEAgc3RhdGljIHZvaWQgKmh0YWJfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LAogCiAJbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpOwogCWlmIChsKQotCQlyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLSZndDtrZXlfc2l6ZSksIGNwdSk7CiYjNDM7CQlyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCksIGNwdSk7CiAJZWxzZQogCQlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KQogewomIzQzOwlzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7CiAJc3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpOwogCiAJaWYgKGwpIHsKLQkJYnBmX2xydV9ub2RlX3NldF9yZWYoJmFtcDtsLSZndDtscnVfbm9kZSk7Ci0JCXJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLSZndDtrZXlfc2l6ZSkpOwomIzQzOwkJYnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTsKJiM0MzsJCXJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCkpOwogCX0KIAogCXJldHVybiBOVUxMOwpAQCAtMjQ1OSw2ICYjNDM7MjU4Miw3IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKIAogc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdTMyIGNwdSkKIHsKJiM0MzsJc3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApOwogCXN0cnVjdCBodGFiX2VsZW0gKmw7CiAKIAlpZiAoY3B1ICZndDs9IG5yX2NwdV9pZHMpCkBAIC0yNDY2LDggJiM0MzsyNTkwLDggQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmsKIAogCWwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTsKIAlpZiAobCkgewotCQlicGZfbHJ1X25vZGVfc2V0X3JlZigmYW1wO2wtJmd0O2xydV9ub2RlKTsKLQkJcmV0dXJuIHBlcl9jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC0mZ3Q7a2V5X3NpemUpLCBjcHUpOwomIzQzOwkJYnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTsKJiM0MzsJCXJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKSwgY3B1KTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTI0NzUsNiAmIzQzOzI1OTksNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqawogCiBpbnQgYnBmX3BlcmNwdV9oYXNoX2NvcHkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwgdTY0IG1hcF9mbGFncykKIHsKJiM0MzsJc3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApOwogCXN0cnVjdCBodGFiX2VsZW0gKmw7CiAJdm9pZCBfX3BlcmNwdSAqcHB0cjsKIAlpbnQgcmV0ID0gLUVOT0VOVDsKQEAgLTI0OTQsNyAmIzQzOzI2MTksNyBAQCBpbnQgYnBmX3BlcmNwdV9oYXNoX2NvcHkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwgdTY0IG1hcF9mbAogCS8qIFdlIGRvIG5vdCBtYXJrIExSVSBtYXAgZWxlbWVudCBoZXJlIGluIG9yZGVyIHRvIG5vdCBtZXNzIHVwCiAJICogZXZpY3Rpb24gaGV1cmlzdGljcyB3aGVuIHVzZXIgc3BhY2UgZG9lcyBhIG1hcCB3YWxrLgogCSAqLwotCXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpOwogCWlmIChtYXBfZmxhZ3MgJmFtcDsgQlBGX0ZfQ1BVKSB7CiAJCWNwdSA9IG1hcF9mbGFncyAmZ3Q7Jmd0OyAzMjsKIAkJY29weV9tYXBfdmFsdWUobWFwLCB2YWx1ZSwgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7CkBAIC0yNTMyLDYgJiM0MzsyNjU3LDcgQEAgaW50IGJwZl9wZXJjcHVfaGFzaF91cGRhdGUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIHN0YXRpYyB2b2lkIGh0YWJfcGVyY3B1X21hcF9zZXFfc2hvd19lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwKIAkJCQkJICBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCXZvaWQgX19wZXJjcHUgKnBwdHI7CiAJaW50IGNwdTsKQEAgLTI1NDYsNyAmIzQzOzI2NzIsNyBAQCBzdGF0aWMgdm9pZCBodGFiX3BlcmNwdV9tYXBfc2VxX3Nob3dfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAKIAlidGZfdHlwZV9zZXFfc2hvdyhtYXAtJmd0O2J0ZiwgbWFwLSZndDtidGZfa2V5X3R5cGVfaWQsIGtleSwgbSk7CiAJc2VxX3B1dHMobSwgJiMzNDs6IHtcbiYjMzQ7KTsKLQlwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLSZndDtrZXlfc2l6ZSk7CiYjNDM7CXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCXNlcV9wcmludGYobSwgJiMzNDtcdGNwdSVkOiAmIzM0OywgY3B1KTsKIAkJYnRmX3R5cGVfc2VxX3Nob3cobWFwLSZndDtidGYsIG1hcC0mZ3Q7YnRmX3ZhbHVlX3R5cGVfaWQsCkBAIC0yNjE5LDggJiM0MzsyNzQ1LDggQEAgc3RhdGljIHZvaWQgZmRfaHRhYl9tYXBfZnJlZShzdHJ1Y3QgYnBmX21hcCAqbWFwKQogCWZvciAoaSA9IDA7IGkgJmx0OyBodGFiLSZndDtuX2J1Y2tldHM7IGkmIzQzOyYjNDM7KSB7CiAJCWhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGkpOwogCi0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7Ci0JCQl2b2lkICpwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7CiYjNDM7CQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7CiYjNDM7CQkJdm9pZCAqcHRyID0gZmRfaHRhYl9tYXBfZ2V0X3B0cihodGFiLCBsKTsKIAogCQkJbWFwLSZndDtvcHMtJmd0O21hcF9mZF9wdXRfcHRyKG1hcCwgcHRyLCBmYWxzZSk7CiAJCX0KQEAgLTI3MDUsNiAmIzQzOzI4MzEsNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9vZl9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KQogc3RhdGljIGludCBodGFiX29mX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsCiAJCQkJICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKQogewomIzQzOwlzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7CiAJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CiAJY29uc3QgaW50IHJldCA9IEJQRl9SRUdfMDsKIApAQCAtMjcxMyw3ICYjNDM7Mjg0MCw3IEBAIHN0YXRpYyBpbnQgaHRhYl9vZl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLAogCSppbnNuJiM0MzsmIzQzOyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7CiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCAyKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICYjNDM7CiYjNDM7CQkJCWh0YWItJmd0O2tleV9vZmZzZXQgJiM0MzsKIAkJCQlyb3VuZF91cChtYXAtJmd0O2tleV9zaXplLCA4KSk7CiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0xEWF9NRU0oQlBGX0RXLCByZXQsIHJldCwgMCk7CiAKQEAgLTMxMTIsNyAmIzQzOzMyMzksNyBAQCBzdGF0aWMgaW50IHJodGFiX21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAogewogCXN0cnVjdCBicGZfcmh0YWIgKnJodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9yaHRhYiwgbWFwKTsKIAotCXJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCAmYW1wO3JodGFiLSZndDttYSwgcmh0YWJfbWVtX2R0b3IpOwomIzQzOwlyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgJmFtcDtyaHRhYi0mZ3Q7bWEsIHJodGFiX21lbV9kdG9yLCBvZmZzZXRvZihzdHJ1Y3Qgcmh0YWJfZWxlbSwgZGF0YSkpOwogfQogCiBzdGF0aWMgdm9pZCByaHRhYl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXApCkBAIC0zNTMzLDMgJiM0MzszNjYwLDE2IEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyByaHRhYl9tYXBfb3BzID0gewogCS5tYXBfYnRmX2lkID0gJmFtcDtyaHRhYl9tYXBfYnRmX2lkc1swXSwKIAkuaXRlcl9zZXFfaW5mbyA9ICZhbXA7cmhhc2hfaXRlcl9zZXFfaW5mbywKIH07CiYjNDM7CiYjNDM7c2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9odGFiKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBicGZfaHRhYl9tYXBfbWV0YV9pbml0KHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaW5uZXJfaHRhYl9tZXRhID0gY29udGFpbmVyX29mKGlubmVyX21hcF9tZXRhLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaW5uZXJfaHRhYiA9IGNvbnRhaW5lcl9vZihpbm5lcl9tYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKJiM0MzsKJiM0MzsJaW5uZXJfaHRhYl9tZXRhLSZndDtrZXlfb2Zmc2V0ID0gaW5uZXJfaHRhYi0mZ3Q7a2V5X29mZnNldDsKJiM0Mzt9CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuYyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5jCmluZGV4IGQyY2JhYjRiZGY2NDQuLmIyZGI1ZDBjOThiZWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5jCkBAIC03LDYgJiM0Mzs3LDE1IEBACiAKICNpbmNsdWRlICYjMzQ7bWFwX2luX21hcC5oJiMzNDsKIAomIzQzO3N0YXRpYyBib29sIGJwZl9tYXBfdHlwZV9pc19odGFiKGVudW0gYnBmX21hcF90eXBlIHR5cGUpCiYjNDM7ewomIzQzOwlyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSCB8fAomIzQzOwkgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0ggfHwKJiM0MzsJICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0xSVV9IQVNIIHx8CiYjNDM7CSAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9MUlVfUEVSQ1BVX0hBU0ggfHwKJiM0MzsJICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUzsKJiM0Mzt9CiYjNDM7CiBzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKQogewogCXN0cnVjdCBicGZfbWFwICppbm5lcl9tYXAsICppbm5lcl9tYXBfbWV0YTsKQEAgLTI5LDYgJiM0MzszOCw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpCiAJLyogSW4gc29tZSBjYXNlcyB2ZXJpZmllciBuZWVkcyB0byBhY2Nlc3MgYmV5b25kIGp1c3QgYmFzZSBtYXAuICovCiAJaWYgKGlubmVyX21hcC0mZ3Q7b3BzID09ICZhbXA7YXJyYXlfbWFwX29wcyB8fCBpbm5lcl9tYXAtJmd0O29wcyA9PSAmYW1wO3BlcmNwdV9hcnJheV9tYXBfb3BzKQogCQlpbm5lcl9tYXBfbWV0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBicGZfYXJyYXkpOwomIzQzOwllbHNlIGlmIChicGZfbWFwX3R5cGVfaXNfaHRhYihpbm5lcl9tYXAtJmd0O21hcF90eXBlKSkKJiM0MzsJCWlubmVyX21hcF9tZXRhX3NpemUgPSBicGZfaHRhYl9tYXBfbWV0YV9zaXplKCk7CiAKIAlpbm5lcl9tYXBfbWV0YSA9IGt6YWxsb2MoaW5uZXJfbWFwX21ldGFfc2l6ZSwgR0ZQX1VTRVIpOwogCWlmICghaW5uZXJfbWFwX21ldGEpCkBAIC03MCw2ICYjNDM7ODEsOCBAQCBzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKQogCQlpbm5lcl9hcnJheV9tZXRhLSZndDtpbmRleF9tYXNrID0gaW5uZXJfYXJyYXktJmd0O2luZGV4X21hc2s7CiAJCWlubmVyX2FycmF5X21ldGEtJmd0O2VsZW1fc2l6ZSA9IGlubmVyX2FycmF5LSZndDtlbGVtX3NpemU7CiAJCWlubmVyX21hcF9tZXRhLSZndDtieXBhc3Nfc3BlY192MSA9IGlubmVyX21hcC0mZ3Q7YnlwYXNzX3NwZWNfdjE7CiYjNDM7CX0gZWxzZSBpZiAoYnBmX21hcF90eXBlX2lzX2h0YWIoaW5uZXJfbWFwLSZndDttYXBfdHlwZSkpIHsKJiM0MzsJCWJwZl9odGFiX21hcF9tZXRhX2luaXQoaW5uZXJfbWFwX21ldGEsIGlubmVyX21hcCk7CiAJfQogCXJldHVybiBpbm5lcl9tYXBfbWV0YTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5oIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmgKaW5kZXggN2Q2MTYwMjM1NGRlOC4uMWVkYzIwNTc3MmQ4YyAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmgKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmgKQEAgLTE1LDUgJiM0MzsxNSw3IEBAIHZvaWQgKmJwZl9tYXBfZmRfZ2V0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgZmlsZSAqbWFwX2ZpbGUsCiAJCQkgaW50IHVmZCk7CiB2b2lkIGJwZl9tYXBfZmRfcHV0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpwdHIsIGJvb2wgbmVlZF9kZWZlcik7CiB1MzIgYnBmX21hcF9mZF9zeXNfbG9va3VwX2VsZW0odm9pZCAqcHRyKTsKJiM0MztzaXplX3QgYnBmX2h0YWJfbWFwX21ldGFfc2l6ZSh2b2lkKTsKJiM0Mzt2b2lkIGJwZl9odGFiX21hcF9tZXRhX2luaXQoc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcF9tZXRhLCBzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmMKaW5kZXggMzczYzhkMTdlYTU1Ny4uNmJkNGNiNjhjMjBjMSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tYXBfcHRyX2tlcm4uYwpAQCAtMTE0LDcgJiM0MzsxMTQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBjaGVja19oYXNoKHZvaWQpCiAJVkVSSUZZKGNoZWNrX2RlZmF1bHRfbm9pbmxpbmUoJmFtcDtoYXNoLSZndDttYXAsIG1hcCkpOwogCiAJVkVSSUZZKGhhc2gtJmd0O25fYnVja2V0cyA9PSBNQVhfRU5UUklFUyk7Ci0JVkVSSUZZKGhhc2gtJmd0O2VsZW1fc2l6ZSA9PSA2NCk7CiYjNDM7CVZFUklGWShoYXNoLSZndDtlbGVtX3NpemUgPT0gMzIpOwogCiAJVkVSSUZZKGhhc2gtJmd0O2NvdW50LmNvdW50ZXIgPT0gMCk7CiAJVkVSSUZZKGJwZl9tYXBfc3VtX2VsZW1fY291bnQobWFwKSA9PSAwKTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjIwNDQKCQkJCQkJCW91dHB1dDogNTUKCQkJCQkJCXRob3VnaHRzOiA3MTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBCUEYgSGFzaCBNYXAgT3B0aW1pemF0aW9uIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMsIHRoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgY2hhbmdlLiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCBhIGZ1bmRhbWVudGFsIHJlLWFyY2hpdGVjdHVyZSBvZiBgc3RydWN0IGh0YWJfZWxlbWAgaW4gYGtlcm5lbC9icGYvaGFzaHRhYi5jYCBhbmQgYWxzbyBpbXBhY3RpbmcgYGtlcm5lbC9icGYvbWFwX2luX21hcC5jYC4gVGhleSYjMzk7cmUgaW50cm9kdWNpbmcgbmV3IHN0cnVjdHVyZXM6IGBodGFiX25vZGVgLCBgaHRhYl9lbGVtYCwgYGh0YWJfZWxlbV9scnVgLCBgaHRhYl9lbGVtX3BjcHVgLiBUaGF0JiMzOTtzIG5vdCB0cml2aWFsLiBBbmQsIG9oIHllYWgsIGBoYXNfaGFzaGAgYW5kIGBrZXlfb2Zmc2V0YCBhcmUgZ2V0dGluZyBhZGRlZCB0byBgc3RydWN0IGJwZl9odGFiYCBhcyB3ZWxsLgoKVGhlIGJpZ2dlc3QgdGhpbmcgdGhhdCBjYXRjaGVzIG15IGF0dGVudGlvbiBpcyBob3cgdGhleSYjMzk7cmUgY29uZGl0aW9uYWxseSBpbmNsdWRpbmcgdGhlIGhhc2ggdmFsdWUgaW4gdGhlIGVsZW1lbnQgZGVwZW5kaW5nIG9uIGlmIGl0JiMzOTtzIGFuIExSVSBtYXAgb3IgaWYgdGhlIGtleSBpcyB3aWRlciB0aGFuIGEgd29yZC4gVGhhdCYjMzk7cyBhIGNsZXZlciBvcHRpbWl6YXRpb24sIGJ1dCBpdCBhbHNvIGNyZWF0ZXMgcG90ZW50aWFsIGZvciBzb21lIHJlYWxseSBzdWJ0bGUgYnVncy4gQWxzbywgdXBkYXRpbmcgYG1hcF9pbl9tYXAuY2AgdG8gc3VwcG9ydCBtZXRhLWRhdGEgZm9yIGhhc2ggbWFwcyBpbnNpZGUgb3RoZXIgbWFwcy4uLiB0aGF0IGltcGFjdHMgYW5vdGhlciBjb3JlIGNvbXBvbmVudC4KClRoaXMgKmFic29sdXRlbHkqIHNjcmVhbXMgZm9yIGZ1enppbmcuIFdlIG5lZWQgdG8gYmUgdGhvcm91Z2ggd2l0aCB0aGlzLgoKTm93LCBsZXQmIzM5O3MgZmlndXJlIG91dCB3aGVyZSB0byBmb2N1cyBvdXIgZnV6emluZyBlZmZvcnRzLiBUaGUgcGF0Y2ggbW9kaWZpZXM6IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbWFwX2xvb2t1cF9lbGVtYCwgYGh0YWJfbHJ1X21hcF9sb29rdXBfZWxlbWAsIGBodGFiX21hcF9nZXRfbmV4dF9rZXlgLCBgaHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAgYW5kIGBicGZfbWFwX21ldGFfYWxsb2NgLiBSaWdodCwgbGV0JiMzOTtzIGxvb2sgYXQgdGhvc2UgZnVuY3Rpb25zLCBlc3BlY2lhbGx5LgoKQWxyaWdodCwgY2hlY2tpbmcgYGtlcm5lbC9icGYvaGFzaHRhYi5jYC4gVGhvc2UgYGh0YWJfKmAgZnVuY3Rpb25zIGFyZSBhbGwgc3RhbmRhcmQgQlBGIG1hcCBvcGVyYXRpb25zLiAgV2UgY2FuIGZvY3VzIHRoZXJlLiBHaXZlbiB3aGF0IEkmIzM5O20gc2VlaW5nLCBgaHRhYl9tYXBfYWxsb2NgLCBgaHRhYl9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX2xydV9tYXBfbG9va3VwX2VsZW1gLCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAsIGBicGZfbWFwX21ldGFfYWxsb2NgIC0gdGhvc2Ugc2VlbSBsaWtlIHRoZSBwcmltYXJ5IGVudHJ5IHBvaW50cyB0byBzY3J1dGluaXplLgoKT2theSwgc28gbW9zdCBvZiB0aGVtIGFyZSBzdGF0aWMsIGJ1dCBhc3NpZ25lZCB0byB0aGUgYGJwZl9tYXBfb3BzYCBzdHJ1Y3R1cmVzLiAgQWgsIHJpZ2h0LiBUaGUgYWR2aWNlIGlzIHRvIHByaW9yaXRpemUgbm9uLXN0YXRpYyBlbnRyeSBwb2ludHMuIEJ1dCBldmVuIHRob3VnaCB0aGV5JiMzOTtyZSBzdGF0aWMsIHRoZXkgKmFyZW4mIzM5O3QqIGlubGluZWQgYmVjYXVzZSB0aGV5JiMzOTtyZSBjYWxsZWQgdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaW4gdGhvc2UgYGJwZl9tYXBfb3BzYCBzdHJ1Y3R1cmVzLiBUaGF0IG1lYW5zIHRoZXkgc3RpbGwgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzLCBhbmQgdGhleSBzaG91bGQgYmUgdGVzdGFibGUuICBHcmVhdC4gTGV0JiMzOTtzIGRpZyBkZWVwZXIgaW50byB0aGUgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKHN0YXRpYyApPyhzdHJ1Y3QgYnBmX21hcCBcXCp8aW50fGxvbmd8dm9pZCBcXCp8dm9pZCkgaHRhYl9tYXBfYWxsb2MmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2hhc2h0YWIuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2hhc2h0YWIuYz00NTA9c3RhdGljIGludCBhbGxvY19leHRyYV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtNDczLS8qIENhbGxlZCBmcm9tIHN5c2NhbGwgKi9cbmtlcm5lbC9icGYvaGFzaHRhYi5jOjQ3NDpzdGF0aWMgaW50IGh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKVxua2VybmVsL2JwZi9oYXNodGFiLmMtNDc1LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzYxNQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipSZWZpbmluZyB0aGUgU2VhcmNoIFN0cmF0ZWd5KioKCkFscmlnaHQsIHRoYXQgcmVnZXggSSBpbml0aWFsbHkgY3JhZnRlZCB3YXMgcHJvdmluZyBhIGxpdHRsZSB0b28gcmVzdHJpY3RpdmUuIEl0IHdhcyBwcm9iYWJseSBvdmVyY29tcGxpY2F0aW5nIHRoaW5ncywgbGVhZGluZyB0byBzb21lIGZhbHNlIG5lZ2F0aXZlcy4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIG1haW50YWluIHRoYXQgY29tcGxleCBwYXR0ZXJuLCBJJiMzOTttIGdvaW5nIHRvIGRpYWwgaXQgYmFjayBhbmQgYWRvcHQgYSBzaW1wbGVyIGFwcHJvYWNoLiBNeSBpbnN0aW5jdHMgYXJlIHRlbGxpbmcgbWUgdG8gZ28gZGlyZWN0bHkgZm9yIHRoZSBjb3JlIGZ1bmN0aW9uIEkmIzM5O20gaW50ZXJlc3RlZCBpbjogYGh0YWJfbWFwX2FsbG9jYC4gQSBzaW1wbGUgYGdyZXBgIGZvciB0aGF0IHNob3VsZCBiZSBtb3JlIGVmZmljaWVudCBhbmQgZ2V0IG1lIHRoZSByZXN1bHRzIEkgbmVlZCB3aXRob3V0IHVubmVjZXNzYXJ5IG92ZXJoZWFkIG9yIHRoZSBwb3RlbnRpYWwgZm9yIG1pc3NlZCBvY2N1cnJlbmNlcyBkdWUgdG8gb3Zlcmx5IHNwZWNpZmljIHBhdHRlcm4gbWF0Y2hpbmcuIEZvY3VzaW5nIG9uIHRoZSBmdW5jdGlvbiBuYW1lIGl0c2VsZiBzaG91bGQgcHJvdmlkZSBhIGNsZWFuZXIgYW5kIG1vcmUgZm9jdXNlZCByZXN1bHQgc2V0IGZvciBkZWVwZXIgYW5hbHlzaXMuIEl0JiMzOTtzIGEgcHJhZ21hdGljIHNoaWZ0LCBhbmQgSSBleHBlY3QgaXQgd2lsbCBiZSBtb3JlIGVmZmVjdGl2ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtodGFiX21hcF9hbGxvYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvaGFzaHRhYi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvaGFzaHRhYi5jPTQ1MD1zdGF0aWMgaW50IGFsbG9jX2V4dHJhX2VsZW1zKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy00NzMtLyogQ2FsbGVkIGZyb20gc3lzY2FsbCAqL1xua2VybmVsL2JwZi9oYXNodGFiLmM6NDc0OnN0YXRpYyBpbnQgaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy00NzUte1xuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jPTU5MT1zdGF0aWMgaW50IGh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtNTk5LVx0ICogV2UgbXVzdCBzZXQgdGhlIGR0b3IgdXNpbmcgdGhpcyBjYWxsYmFjaywgYXMgbWFwJiMzOTtzIEJURiByZWNvcmQgaXMgbm90XG5rZXJuZWwvYnBmL2hhc2h0YWIuYzo2MDA6XHQgKiBwb3B1bGF0ZWQgaW4gaHRhYl9tYXBfYWxsb2MoKSwgc28gaXQgd2lsbCBhbHdheXMgYXBwZWFyIGFzIE5VTEwuXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy02MDEtXHQgKi9cbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy02MDctXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzo2MDg6c3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTYwOS17XG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQ3Nz1jb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9tYXBfb3BzID0ge1xua2VybmVsL2JwZi9oYXNodGFiLmMtMjQ3OC1cdC5tYXBfbWV0YV9lcXVhbCA9IGJwZl9tYXBfbWV0YV9lcXVhbCxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0Nzk6XHQubWFwX2FsbG9jX2NoZWNrID0gaHRhYl9tYXBfYWxsb2NfY2hlY2ssXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNDgwOlx0Lm1hcF9hbGxvYyA9IGh0YWJfbWFwX2FsbG9jLFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjQ4MS1cdC5tYXBfZnJlZSA9IGh0YWJfbWFwX2ZyZWUsXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQ5OT1jb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9scnVfbWFwX29wcyA9IHtcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI1MDAtXHQubWFwX21ldGFfZXF1YWwgPSBicGZfbWFwX21ldGFfZXF1YWwsXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNTAxOlx0Lm1hcF9hbGxvY19jaGVjayA9IGh0YWJfbWFwX2FsbG9jX2NoZWNrLFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjUwMjpcdC5tYXBfYWxsb2MgPSBodGFiX21hcF9hbGxvYyxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI1MDMtXHQubWFwX2ZyZWUgPSBodGFiX21hcF9mcmVlLFxuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jPTI2ODc9Y29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIGh0YWJfcGVyY3B1X21hcF9vcHMgPSB7XG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNjg4LVx0Lm1hcF9tZXRhX2VxdWFsID0gYnBmX21hcF9tZXRhX2VxdWFsLFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjY4OTpcdC5tYXBfYWxsb2NfY2hlY2sgPSBodGFiX21hcF9hbGxvY19jaGVjayxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI2OTA6XHQubWFwX2FsbG9jID0gaHRhYl9tYXBfYWxsb2MsXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNjkxLVx0Lm1hcF9mcmVlID0gaHRhYl9tYXBfZnJlZSxcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yNzA5PWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX2xydV9wZXJjcHVfbWFwX29wcyA9IHtcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI3MTAtXHQubWFwX21ldGFfZXF1YWwgPSBicGZfbWFwX21ldGFfZXF1YWwsXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNzExOlx0Lm1hcF9hbGxvY19jaGVjayA9IGh0YWJfbWFwX2FsbG9jX2NoZWNrLFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjcxMjpcdC5tYXBfYWxsb2MgPSBodGFiX21hcF9hbGxvYyxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI3MTMtXHQubWFwX2ZyZWUgPSBodGFiX21hcF9mcmVlLFxuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI3MjktXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNzMwOnN0YXRpYyBpbnQgZmRfaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzMxLXtcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzMzLVx0XHRyZXR1cm4gLUVJTlZBTDtcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI3MzQ6XHRyZXR1cm4gaHRhYl9tYXBfYWxsb2NfY2hlY2soYXR0cik7XG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzM1LX1cbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yODAyPXN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9vZl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtMjgwOS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI4MTA6XHRtYXAgPSBodGFiX21hcF9hbGxvYyhhdHRyKTtcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI4MTEtXHRpZiAoSVNfRVJSKG1hcCkpIHtcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yODU2PWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX29mX21hcHNfbWFwX29wcyA9IHtcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI4NTc6XHQubWFwX2FsbG9jX2NoZWNrID0gZmRfaHRhYl9tYXBfYWxsb2NfY2hlY2ssXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yODU4LVx0Lm1hcF9hbGxvYyA9IGh0YWJfb2ZfbWFwX2FsbG9jLFxuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jPTI5MTQ9c3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyByaHRhYl9wYXJhbXNfbG9uZyA9IHtcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yOTIxLVxua2VybmVsL2JwZi9oYXNodGFiLmM6MjkyMjpzdGF0aWMgc3RydWN0IGJwZl9tYXAgKnJodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI5MjMte1xuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI5NzEtXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyOTcyOnN0YXRpYyBpbnQgcmh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKVxua2VybmVsL2JwZi9oYXNodGFiLmMtMjk3My17XG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtMjk5MS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI5OTI6XHRyZXR1cm4gaHRhYl9tYXBfYWxsb2NfY2hlY2soYXR0cik7XG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yOTkzLX1cbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0zNjQyPWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyByaHRhYl9tYXBfb3BzID0ge1xua2VybmVsL2JwZi9oYXNodGFiLmMtMzY0My1cdC5tYXBfbWV0YV9lcXVhbCA9IGJwZl9tYXBfbWV0YV9lcXVhbCxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjM2NDQ6XHQubWFwX2FsbG9jX2NoZWNrID0gcmh0YWJfbWFwX2FsbG9jX2NoZWNrLFxua2VybmVsL2JwZi9oYXNodGFiLmM6MzY0NTpcdC5tYXBfYWxsb2MgPSByaHRhYl9tYXBfYWxsb2MsXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0zNjQ2LVx0Lm1hcF9mcmVlID0gcmh0YWJfbWFwX2ZyZWUsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjU1NzIKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxNjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgSGFzaCBNYXAgRnVuY3Rpb25zKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSBmdW5jdGlvbnMgYW5kIGltbWVkaWF0ZWx5IHNlZSB0aGV5JiMzOTtyZSBzdGF0aWMsIHdoaWNoIGlzIGludGVyZXN0aW5nLCBidXQgYWN0dWFsbHksIHRoYXQgZG9lc24mIzM5O3QgcmVhbGx5IG1hdHRlci4gVGhlc2UgYXJlIHRoZSBjb3JlIG9wZXJhdGlvbnMg4oCTIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucyDigJMgZm9yIGhhc2ggbWFwcy4gVGhhdCBtYWtlcyB0aGVtIGEgdmVyeSB2YWx1YWJsZSB0YXJnZXQgZm9yIHRoZSBmdXp6ZXIuIExldCBtZSBzZWUuLi4gaWYgd2UgaW5jbHVkZSBgaHRhYl9tYXBfYWxsb2NgLCBgaHRhYl9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX2xydV9tYXBfbG9va3VwX2VsZW1gLCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAsIGFuZCBgYnBmX21hcF9tZXRhX2FsbG9jYCwgdGhlIGZ1enplciBzaG91bGQgYmUgYWJsZSB0byBkaWcgaW4gdGhlcmUuIEFoLCB3YWl0IGEgc2Vjb25kLiBIb2xkIG9uLiBJcyBgYnBmX21hcF9tZXRhX2FsbG9jYCBhY3R1YWxseSBzdGF0aWM/IFRoYXQmIzM5O3Mgbm90IHdoYXQgSSBleHBlY3RlZC4gTGV0IG1lIGp1c3QgcXVpY2tseSBjaGVjayB0aGF0LiBUaW1lIHRvIGdvIGxvb2sgaW50byBga2VybmVsL2JwZi9tYXBfaW5fbWFwLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9tYXBfbWV0YV9hbGxvYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvbWFwX2luX21hcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvbWFwX2luX21hcC5jPTEwPXN0YXRpYyBib29sIGJwZl9tYXBfdHlwZV9pc19odGFiKGVudW0gYnBmX21hcF90eXBlIHR5cGUpXG4tLVxua2VybmVsL2JwZi9tYXBfaW5fbWFwLmMtMTgtXG5rZXJuZWwvYnBmL21hcF9pbl9tYXAuYzoxOTpzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKVxua2VybmVsL2JwZi9tYXBfaW5fbWFwLmMtMjAte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2MTU0CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMzM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBCUEYgTWFwIEFsbG9jYXRpb24gRnVuY3Rpb25zKioKCk9rYXksIHNvIGBicGZfbWFwX21ldGFfYWxsb2NgIGlzIGRlZmluaXRlbHkgZXhwb3J0ZWQsIHRoYXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3csIGFib3V0IGBodGFiX21hcF9hbGxvY2AuLi4gaXQmIzM5O3MgZGVjbGFyZWQgc3RhdGljLCB3aGljaCBpbml0aWFsbHkgc2VlbXMgbGlrZSBhIHByb2JsZW0gYmFzZWQgb24gdGhlIHByb21wdCYjMzk7cyBwcmVmZXJlbmNlIGZvciBub24tc3RhdGljIGVudHJ5cG9pbnRzIHdpdGggZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3Nlcy4gQnV0IHdhaXQgYSBtaW51dGUsIGl0JiMzOTtzICphc3NpZ25lZCogdG8gYSBmdW5jdGlvbiBwb2ludGVyISBUaGF0IG1lYW5zIHRoZSBjb21waWxlciB3b24mIzM5O3QgaW5saW5lIGl0LCBhbmQgaXQgKmRvZXMqIGhhdmUgYSBkaXN0aW5jdCBzeW1ib2wuIFNvLCBpdCBzaG91bGQgYmUgZmluZSB0byBpbmNsdWRlIGl0LgoKT2YgY291cnNlLCBJIGNvdWxkIHBsYXkgaXQgc2FmZSBhbmQganVzdCBsaXN0IHRoZSBzeXNjYWxsIGVudHJ5IHBvaW50cyBsaWtlIGBtYXBfY3JlYXRlYCwgYG1hcF91cGRhdGVfZWxlbWAsIGV0Yy4gQnV0IHRoYXQmIzM5O3MgYSBiaXQgZ2VuZXJpYy4gVGhlIHByb21wdCBzcGVjaWZpY2FsbHkgd2FybnMgYWdhaW5zdCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBhdm9pZCBiaWFzaW5nIHRoZSByZXN1bHRzLiBBbmQgbGlzdGluZyB0aG9zZSBzeXNjYWxscyAqd291bGQqIHNrZXcgdGhlIHRlc3QgZGlzdHJpYnV0aW9uLgoKU28sIHRoZSBvcHRpbWFsIGFwcHJvYWNoIGhlcmUgaXMgdG8gbGlzdCB0aGUgc3BlY2lmaWMgYGh0YWJfbWFwX2FsbG9jYCBmdW5jdGlvbnM6IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbWFwX2xvb2t1cF9lbGVtYCwgYGh0YWJfbHJ1X21hcF9sb29rdXBfZWxlbWAsIGFuZCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAuIFRoYXQgY292ZXJzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBiZWluZyBvdmVybHkgZ2VuZXJpYy4KCk5vdywganVzdCB0byBiZSB0aG9yb3VnaCwgSSBzaG91bGQgY2hlY2sgZm9yIGFueSBDT05GSUcgb3B0aW9ucyB3ZSBtaWdodCBuZWVkLiBCUEYgaGFzaCBtYXBzIGFyZSBhIGZ1bmRhbWVudGFsIHBhcnQgb2YgY29yZSBCUEYsIHNvIGl0JiMzOTtzIGEgc2FmZSBiZXQgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgcHJpbWFyeSBvbmUsIGJ1dCBsZXQgbWUganVzdCBkb3VibGUgY2hlY2sgdGhlIGRldGFpbHMgdG8gYmUgc3VyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjkxNgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzIG9uIHRoaXM6CgoqKkludmVzdGlnYXRpbmcgQlBGIENvbmZpZ3VyYXRpb24gT3B0aW9ucyoqCgpBbHJpZ2h0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBCUEYgYXJlIGRlZmluZWQuIE15IGZpcnN0IGluc3RpbmN0LCBhbmQgdGhpcyBpcyB3aGVyZSBJJiMzOTtkIHN0YXJ0IGluIGFueSBrZXJuZWwgaW52ZXN0aWdhdGlvbiwgaXMgdG8gY2hlY2sgdGhlIGBLY29uZmlnYCBmaWxlcy4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIHRoaW5raW5nIEkgbmVlZCB0byBsb29rIGluIGBrZXJuZWwvYnBmL0tjb25maWdgLCBvciBzb21ld2hlcmUgc2ltaWxhciB3aXRoaW4gdGhlIEJQRiBzdWJzeXN0ZW0gZGlyZWN0b3J5LiBUaGUgYEtjb25maWdgIGZpbGVzIGFyZSB0aGUgYnJlYWQgYW5kIGJ1dHRlciBmb3IgYW55IGtlcm5lbCBkZXZlbG9wZXIgYmVjYXVzZSB0aGV5IGRlZmluZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgdXNlcnMgY2FuIHRvZ2dsZSB1c2luZyBgbWFrZSBtZW51Y29uZmlnYCBvciBzaW1pbGFyIHRvb2xzLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIHdoYXQmIzM5O3MgYXZhaWxhYmxlIGFuZCBob3cgaXQmIzM5O3Mgc3RydWN0dXJlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJQRl9TWVNDQUxMJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZz0yNT1tZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbmtlcm5lbC9icGYvS2NvbmZpZy0yNi1cbmtlcm5lbC9icGYvS2NvbmZpZzoyNzpjb25maWcgQlBGX1NZU0NBTExcbmtlcm5lbC9icGYvS2NvbmZpZy0yOC1cdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3MTk5CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUsIHRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gcmV2b2x2ZSBhcm91bmQgYEJQRl9TWVNDQUxMYCwgdGhhdCYjMzk7cyB0aGUgcHJpbWFyeSBjb25maWd1cmF0aW9uIHRvIGJlIGF3YXJlIG9mLiBJIHNob3VsZCBkb3VibGUtY2hlY2sgdG8gYmUgc3VyZSB0aGVyZSBhcmVuJiMzOTt0IGFueSBvdGhlciBjb25maWdzIHRoYXQgYXJlIHJlbGF0ZWQuCgpBbHJpZ2h0LCB0aGUgcGF0Y2ggdG91Y2hlcyBga2VybmVsL2JwZi9oYXNodGFiLmNgIGFuZCBga2VybmVsL2JwZi9tYXBfaW5fbWFwLmNgLiBIbW0sIGFyZSB0aGVyZSBhbnkgc3BlY2lhbGl6ZWQgY29uZmlndXJhdGlvbnMsIG9yIHBlcmhhcHMgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIHVuaXF1ZSB0byB0aG9zZSBmaWxlcyB3aXRoaW4gdGhpcyBjb250ZXh0PyBXZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGxpbmtlZCB3aXRoIHRoZSBzcGVjaWZpYyBjb2RlIHBhdGhzIGFsdGVyZWQgaW4gdGhvc2UgbW9kdWxlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aGFzaHRhYlxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmL01ha2VmaWxlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvTWFrZWZpbGU9MTA9b2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnBmX2l0ZXIubyBtYXBfaXRlci5vIHRhc2tfaXRlci5vIHByb2dfaXRlci5vIGxpbmtfaXRlci5vXG5rZXJuZWwvYnBmL01ha2VmaWxlOjExOm9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGhhc2h0YWIubyBhcnJheW1hcC5vIHBlcmNwdV9mcmVlbGlzdC5vIGJwZl9scnVfbGlzdC5vIGxwbV90cmllLm8gbWFwX2luX21hcC5vIGJsb29tX2ZpbHRlci5vXG5rZXJuZWwvYnBmL01ha2VmaWxlLTEyLW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGxvY2FsX3N0b3JhZ2UubyBxdWV1ZV9zdGFja19tYXBzLm8gcmluZ2J1Zi5vIGJwZl9pbnNuX2FycmF5Lm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjc2MDEKCQkJCQkJCW91dHB1dDogMTc4CgkJCQkJCQl0aG91Z2h0czogNjQ4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoaXMgQlBGIEhhc2ggTWFwIE9wdGltaXphdGlvbioqCgpSaWdodCwgc28gSSYjMzk7dmUgY29uZmlybWVkIHRoYXQgZW5hYmxpbmcgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgdGhlIGNydWNpYWwgcHJlcmVxdWlzaXRlIGhlcmUuIFRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBmb2N1cyBvbiBhIHNldCBvZiBjcml0aWNhbCBmdW5jdGlvbnMgdGhhdCByZXByZXNlbnQgdGhlIGNvcmUgb3BlcmF0aW9ucyBhZmZlY3RlZCBieSB0aGlzIG1lbW9yeSBsYXlvdXQgb3B0aW1pemF0aW9uLiBJJiMzOTt2ZSBjb21waWxlZCBhIHNob3J0bGlzdCwgZm9jdXNpbmcgb24gdGhvc2UgaW52b2x2ZWQgd2l0aCBhbGxvY2F0aW9uLCB1cGRhdGVzLCBsb29rdXBzLCBhbmQgZGVsZXRpb25zLgoKSSYjMzk7dmUgZ290IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2VsZW1gLCBhbmQgYGJwZl9tYXBfbWV0YV9hbGxvY2AgZWFybWFya2VkIGFzIHRoZSBrZXkgdGFyZ2V0cy4gSSBkaWQgYSBxdWljayBkb3VibGUgY2hlY2sgb24gYGh0YWJfbWFwX3VwZGF0ZV9lbGVtYCB0byBiZSBzdXJlIEkmIzM5O20gdGFyZ2V0aW5nIHRoZSBwcm9wZXIgZnVuY3Rpb24sIGl0JiMzOTtzIHN0YXRpYyBpbnRlcm5hbGx5IGJ1dCBleHBvc2VkIHRocm91Z2ggdGhlIGBodGFiX21hcF9vcHNgIHN0cnVjdHVyZS4gSSYjMzk7bSBrZWVwaW5nIGEgY2xvc2UgZXllIG9uIGFueSBhbGlhc2VzIG9yIHZhcmlhdGlvbnMgYXMgd2VsbCwgYnV0IHRoZXNlIHNlZW0gdG8gYmUgdGhlIHByaW1hcnkgcGxheWVycy4KClRoaXMgcGF0Y2ggaXMgZXNzZW50aWFsbHkgYSBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgY29yZSBCUEYgaGFzaCBtYXAgaW1wbGVtZW50YXRpb24sIHNwZWNpZmljYWxseSBhaW1pbmcgdG8gb3B0aW1pemUgbWVtb3J5IHVzYWdlIGJ5IGNvbmRpdGlvbmFsbHkgcmVtb3ZpbmcgdGhlIGhhc2ggdmFsdWUgZnJvbSB0aGUgZWxlbWVudCBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBJdCYjMzk7cyBub3QganVzdCBhIHR3ZWFrOyBpdCYjMzk7cyBhIGZ1bmRhbWVudGFsIHNoaWZ0IGluIGhvdyB0aGVzZSBtYXBzIG1hbmFnZSBtZW1vcnkuCgpHaXZlbiB0aGlzLCBteSBleHBlcnQgaW50dWl0aW9uIHNjcmVhbXMgZm9yIHRob3JvdWdoIGZ1enppbmcuIFRoZSBjaGFuZ2UgdG91Y2hlcyBjb3JlIG9wZXJhdGlvbnMgbGlrZSBtZW1vcnkgbGF5b3V0IGluIGEgd2F5IHRoYXQgKmRlbWFuZHMqIHJvYnVzdCB0ZXN0aW5nLiBXZSBuZWVkIHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiB0aGF0IHRoaXMgbWVtb3J5IG9wdGltaXphdGlvbiBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgdnVsbmVyYWJpbGl0aWVzIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3JzIGR1cmluZyBvcGVyYXRpb25zIGxpa2UgYWxsb2NhdGlvbiwgbG9va3VwLCB1cGRhdGUsIGFuZCBkZWxldGlvbiwgZXNwZWNpYWxseSByZWxhdGVkIHRvIG91dC1vZi1ib3VuZHMgYWNjZXNzIG9yIG1lbW9yeSBjb3JydXB0aW9uLiBJIG5lZWQgdG8gYmUgMTAwJSBjZXJ0YWluIHRoZSBrZXlzIGFuZCBkYXRhIGFyZSBzdGlsbCBtYXBwZWQgY29ycmVjdGx5LCB0b28uCgpJJiMzOTttIGZsYWdnaW5nIGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBhbmQgYGJwZl9tYXBfbWV0YV9hbGxvY2AgYXMgdGhlIGZvY3VzIHN5bWJvbHMsIGFuZCBJJiMzOTtsbCBtYWtlIHN1cmUgYEJQRl9TWVNDQUxMYCBpcyBlbmFibGVkIGZvciB0ZXN0aW5nLiBMZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtodGFiX21hcF9hbGxvYyYjMzQ7LAogICAgJiMzNDtodGFiX21hcF91cGRhdGVfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0mIzM0OywKICAgICYjMzQ7aHRhYl9tYXBfbG9va3VwX2VsZW0mIzM0OywKICAgICYjMzQ7aHRhYl9tYXBfZGVsZXRlX2VsZW0mIzM0OywKICAgICYjMzQ7YnBmX21hcF9tZXRhX2FsbG9jJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9wdGltaXplcyB0aGUgbWVtb3J5IGxheW91dCBvZiBCUEYgaGFzaCBtYXAgZWxlbWVudHMgYnkgY29uZGl0aW9uYWxseSBvbWl0dGluZyB0aGUgaGFzaCB2YWx1ZSBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBUaGlzIGFmZmVjdHMgY29yZSBCUEYgaGFzaCBtYXAgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24uIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBtZW1vcnkgbGF5b3V0IGFuZCB0aGF0IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIG9jY3VyLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2h0YWJfbWFwX2FsbG9jJiMzNDssCiAgICAmIzM0O2h0YWJfbWFwX3VwZGF0ZV9lbGVtJiMzNDssCiAgICAmIzM0O2h0YWJfbHJ1X21hcF91cGRhdGVfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX21hcF9sb29rdXBfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX21hcF9kZWxldGVfZWxlbSYjMzQ7LAogICAgJiMzNDticGZfbWFwX21ldGFfYWxsb2MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb3B0aW1pemVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIEJQRiBoYXNoIG1hcCBlbGVtZW50cyBieSBjb25kaXRpb25hbGx5IG9taXR0aW5nIHRoZSBoYXNoIHZhbHVlIGFuZCBhZGp1c3RpbmcgdGhlIGtleSBvZmZzZXQuIFRoaXMgYWZmZWN0cyBjb3JlIEJQRiBoYXNoIG1hcCBvcGVyYXRpb25zIGxpa2UgYWxsb2NhdGlvbiwgbG9va3VwLCB1cGRhdGUsIGFuZCBkZWxldGlvbi4gRnV6emluZyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZXNlIG9wZXJhdGlvbnMgc3RpbGwgd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgbmV3IG1lbW9yeSBsYXlvdXQgYW5kIHRoYXQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBtZW1vcnkgbGVha3Mgb2NjdXIuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjoyMy43NzA2Njk2NDNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDA3MTY0MDM4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImh0YWJfbWFwX2FsbG9jXCIsXG4gICAgXCJodGFiX21hcF91cGRhdGVfZWxlbVwiLFxuICAgIFwiaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtXCIsXG4gICAgXCJodGFiX21hcF9sb29rdXBfZWxlbVwiLFxuICAgIFwiaHRhYl9tYXBfZGVsZXRlX2VsZW1cIixcbiAgICBcImJwZl9tYXBfbWV0YV9hbGxvY1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9wdGltaXplcyB0aGUgbWVtb3J5IGxheW91dCBvZiBCUEYgaGFzaCBtYXAgZWxlbWVudHMgYnkgY29uZGl0aW9uYWxseSBvbWl0dGluZyB0aGUgaGFzaCB2YWx1ZSBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBUaGlzIGFmZmVjdHMgY29yZSBCUEYgaGFzaCBtYXAgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24uIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBtZW1vcnkgbGF5b3V0IGFuZCB0aGF0IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIG9jY3VyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjoyMy43NzA2Nzg4MzNaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYwMTc3MTgwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDY0NTRhMTFjMDNkZmFlZGI0YjA5Zjg1NzVhZjhkMDM2MzlmYjUyNzNcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBBdWcgNSAyMjo1MjoyMiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hhc2h0YWIuYyBiL2tlcm5lbC9icGYvaGFzaHRhYi5jXFxuaW5kZXggOWYzOTRlMWFhMmU4NS4uOTk2NzI2OGQ0NTNkMCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2hhc2h0YWIuY1xcbisrKyBiL2tlcm5lbC9icGYvaGFzaHRhYi5jXFxuQEAgLTEwMCwxMyArMTAwLDE2IEBAIHN0cnVjdCBicGZfaHRhYiB7XFxuIFxcdHN0cnVjdCBwZXJjcHVfY291bnRlciBwY291bnQ7XFxuIFxcdGF0b21pY190IGNvdW50O1xcbiBcXHRib29sIHVzZV9wZXJjcHVfY291bnRlcjtcXG4rXFx0Ym9vbCBoYXNfaGFzaDtcXG4gXFx0dTMyIG5fYnVja2V0cztcXHQvKiBudW1iZXIgb2YgaGFzaCBidWNrZXRzICovXFxuIFxcdHUzMiBlbGVtX3NpemU7XFx0Lyogc2l6ZSBvZiBlYWNoIGVsZW1lbnQgaW4gYnl0ZXMgKi9cXG4rXFx0dTMyIGtleV9vZmZzZXQ7XFx0Lyogb2Zmc2V0IG9mIGtleSBpbiBieXRlcyAqL1xcbiBcXHR1MzIgaGFzaHJuZDtcXG4gfTtcXG4gXFxuIC8qIGVhY2ggaHRhYiBlbGVtZW50IGlzIHN0cnVjdCBodGFiX2VsZW0gKyBrZXkgKyB2YWx1ZSAqL1xcbi1zdHJ1Y3QgaHRhYl9lbGVtIHtcXG4rc3RydWN0IGh0YWJfZWxlbTtcXG4rc3RydWN0IGh0YWJfbm9kZSB7XFxuIFxcdHVuaW9uIHtcXG4gXFx0XFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgaGFzaF9ub2RlO1xcbiBcXHRcXHRzdHJ1Y3Qge1xcbkBAIC0xMTcsMTggKzEyMCwzMiBAQCBzdHJ1Y3QgaHRhYl9lbGVtIHtcXG4gXFx0XFx0XFx0fTtcXG4gXFx0XFx0fTtcXG4gXFx0fTtcXG4tXFx0dW5pb24ge1xcbi1cXHRcXHQvKiBwb2ludGVyIHRvIHBlci1jcHUgcG9pbnRlciAqL1xcbi1cXHRcXHR2b2lkICpwdHJfdG9fcHB0cjtcXG4tXFx0XFx0c3RydWN0IGJwZl9scnVfbm9kZSBscnVfbm9kZTtcXG4tXFx0fTtcXG4tXFx0dTMyIGhhc2g7XFxuLVxcdGNoYXIga2V5W10gX19hbGlnbmVkKDgpO1xcbit9O1xcbitcXG4rc3RydWN0IGh0YWJfZWxlbSB7XFxuK1xcdHN0cnVjdCBodGFiX25vZGUgbm9kZTtcXG4rXFx0dTggZGF0YVtdIF9fYWxpZ25lZCg4KTtcXG4rfTtcXG4rXFxuK3N0cnVjdCBodGFiX2VsZW1fbHJ1IHtcXG4rXFx0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xcbitcXHRzdHJ1Y3QgYnBmX2xydV9ub2RlIGxydV9ub2RlO1xcbitcXHR1OCBkYXRhW10gX19hbGlnbmVkKDgpO1xcbit9O1xcbitcXG4rLyogT25seSBmb3Igbm9uLXByZWFsbG9jYXRlZCBQQ1BVIG1hcHMuIFByZWFsbG9jYXRlZCBQQ1BVIG1hcHMgZG9uJ3QgbmVlZFxcbisgKiBwdHJfdG9fcHB0ciwgYW5kIHVzZSBodGFiX2VsZW0uXFxuKyAqL1xcbitzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUge1xcbitcXHRzdHJ1Y3QgaHRhYl9ub2RlIG5vZGU7XFxuK1xcdHZvaWQgKnB0cl90b19wcHRyO1xcbitcXHR1OCBkYXRhW10gX19hbGlnbmVkKDgpO1xcbiB9O1xcbiBcXG4gc3RydWN0IGh0YWJfYnRmX3JlY29yZCB7XFxuIFxcdHN0cnVjdCBidGZfcmVjb3JkICpyZWNvcmQ7XFxuIFxcdHUzMiBrZXlfc2l6ZTtcXG4rXFx0dTMyIGtleV9vZmZzZXQ7XFxuIH07XFxuIFxcbiBzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9pc19wcmVhbGxvYyhjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuQEAgLTEzNiw2ICsxNTMsMjEgQEAgc3RhdGljIGlubGluZSBib29sIGh0YWJfaXNfcHJlYWxsb2MoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXHRyZXR1cm4gIShodGFiLVxcdTAwM2VtYXAubWFwX2ZsYWdzIFxcdTAwMjYgQlBGX0ZfTk9fUFJFQUxMT0MpO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfbHJ1X25vZGUgKmh0YWJfZWxlbV9scnVfbm9kZShzdHJ1Y3QgaHRhYl9lbGVtICpsKVxcbit7XFxuK1xcdHJldHVybiBcXHUwMDI2KChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLVxcdTAwM2VscnVfbm9kZTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fZ2V0X3B0cl90b19wcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwpXFxuK3tcXG4rXFx0cmV0dXJuICgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktXFx1MDAzZXB0cl90b19wcHRyO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHJfdG9fcHB0cihzdHJ1Y3QgaHRhYl9lbGVtICpsLCB2b2lkICpwdHIpXFxuK3tcXG4rXFx0KChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cXHUwMDNlcHRyX3RvX3BwdHIgPSBwdHI7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIGh0YWJfaW5pdF9idWNrZXRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4ge1xcbiBcXHR1bnNpZ25lZCBpbnQgaTtcXG5AQCAtMTgzLDI1ICsyMTUsMzAgQEAgc3RhdGljIGlubGluZSBib29sIGlzX2ZkX2h0YWIoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXHRyZXR1cm4gaHRhYi1cXHUwMDNlbWFwLm1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFM7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX3ZhbHVlKHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBrZXlfc2l6ZSlcXG4rc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fa2V5KHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcXG4re1xcbitcXHRyZXR1cm4gKHZvaWQgKilsICsgaHRhYi1cXHUwMDNla2V5X29mZnNldDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxcbiB7XFxuLVxcdHJldHVybiBsLVxcdTAwM2VrZXkgKyByb3VuZF91cChrZXlfc2l6ZSwgOCk7XFxuK1xcdHJldHVybiBodGFiX2VsZW1fa2V5KGh0YWIsIGwpICsgcm91bmRfdXAoaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplLCA4KTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBrZXlfc2l6ZSxcXG4rc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCxcXG4gXFx0XFx0XFx0XFx0ICAgICB2b2lkIF9fcGVyY3B1ICpwcHRyKVxcbiB7XFxuLVxcdCoodm9pZCBfX3BlcmNwdSAqKilodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpID0gcHB0cjtcXG4rXFx0Kih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShodGFiLCBsKSA9IHBwdHI7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BlcmNwdSAqaHRhYl9lbGVtX2dldF9wdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplKVxcbitzdGF0aWMgaW5saW5lIHZvaWQgX19wZXJjcHUgKmh0YWJfZWxlbV9nZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcXG4ge1xcbi1cXHRyZXR1cm4gKih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShsLCBrZXlfc2l6ZSk7XFxuK1xcdHJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCAqZmRfaHRhYl9tYXBfZ2V0X3B0cihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxcbitzdGF0aWMgdm9pZCAqZmRfaHRhYl9tYXBfZ2V0X3B0cihzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXFxuIHtcXG4tXFx0cmV0dXJuICoodm9pZCAqKilodGFiX2VsZW1fdmFsdWUobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdHJldHVybiAqKHZvaWQgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqZ2V0X2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIGludCBpKVxcbkBAIC0yMDksNiArMjQ2LDMzIEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpnZXRfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgaW50IGkpXFxuIFxcdHJldHVybiAoc3RydWN0IGh0YWJfZWxlbSAqKSAoaHRhYi1cXHUwMDNlZWxlbXMgKyBpICogKHU2NClodGFiLVxcdTAwM2VlbGVtX3NpemUpO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9oYXNfaGFzaChjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuK3tcXG4rXFx0cmV0dXJuIGh0YWItXFx1MDAzZWhhc19oYXNoO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHUzMiBodGFiX2VsZW1faGFzaChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXFxuK3tcXG4rXFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxcbitcXHRcXHRyZXR1cm4gKih1MzIgKikoKHN0cnVjdCBodGFiX2VsZW1fbHJ1ICopbCktXFx1MDAzZWRhdGE7XFxuK1xcdGVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpIFxcdTAwMjZcXHUwMDI2ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKVxcbitcXHRcXHRyZXR1cm4gKih1MzIgKikoKHN0cnVjdCBodGFiX2VsZW1fcGNwdSAqKWwpLVxcdTAwM2VkYXRhO1xcbitcXHRlbHNlXFxuK1xcdFxcdHJldHVybiAqKHUzMiAqKWwtXFx1MDAzZWRhdGE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBodGFiX2VsZW1fc2V0X2hhc2goc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsLCB1MzIgaGFzaClcXG4re1xcbitcXHRpZiAoIWh0YWJfaGFzX2hhc2goaHRhYikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxcbitcXHRcXHQqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS1cXHUwMDNlZGF0YSA9IGhhc2g7XFxuK1xcdGVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpIFxcdTAwMjZcXHUwMDI2ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKVxcbitcXHRcXHQqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktXFx1MDAzZWRhdGEgPSBoYXNoO1xcbitcXHRlbHNlXFxuK1xcdFxcdCoodTMyICopbC1cXHUwMDNlZGF0YSA9IGhhc2g7XFxuK31cXG4rXFxuIC8qIEJvdGggcGVyY3B1IGFuZCBmZCBodGFiIHN1cHBvcnQgaW4tcGxhY2UgdXBkYXRlLCBzbyBubyBuZWVkIGZvclxcbiAgKiBleHRyYSBlbGVtLiBMUlUgaXRzZWxmIGNhbiByZW1vdmUgdGhlIGxlYXN0IHVzZWQgZWxlbWVudCwgc29cXG4gICogdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gZXh0cmEgZWxlbSBkdXJpbmcgbWFwX3VwZGF0ZS5cXG5AQCAtMjMxLDcgKzI5NSw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXG4gXFx0XFx0ZWxlbSA9IGdldF9odGFiX2VsZW0oaHRhYiwgaSk7XFxuIFxcdFxcdGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLVxcdTAwM2VtYXAua2V5X3NpemUpKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTtcXG4gXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIFxcdH1cXG4gfVxcbkBAIC0yNTQsNyArMzE4LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX3ByZWFsbG9jZWRfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4gXFxuIFxcdFxcdGVsZW0gPSBnZXRfaHRhYl9lbGVtKGh0YWIsIGkpO1xcbiBcXHRcXHRpZiAoaHRhYl9pc19wZXJjcHUoaHRhYikpIHtcXG4tXFx0XFx0XFx0dm9pZCBfX3BlcmNwdSAqcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSk7XFxuK1xcdFxcdFxcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcXG4gXFx0XFx0XFx0aW50IGNwdTtcXG4gXFxuIFxcdFxcdFxcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcXG5AQCAtMjYzLDcgKzMyNyw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0fSBlbHNlIHtcXG4gXFx0XFx0XFx0YnBmX29ial9mcmVlX2ZpZWxkcyhodGFiLVxcdTAwM2VtYXAucmVjb3JkLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xcbitcXHRcXHRcXHRcXHRcXHQgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTtcXG4gXFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIFxcdFxcdH1cXG4gXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuQEAgLTI4MCw4ICszNDQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2ZyZWVfZWxlbXMoc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaHRhYi1cXHUwMDNlbWFwLm1heF9lbnRyaWVzOyBpKyspIHtcXG4gXFx0XFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcXG4gXFxuLVxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihnZXRfaHRhYl9lbGVtKGh0YWIsIGkpLFxcbi1cXHRcXHRcXHRcXHRcXHQgaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplKTtcXG4rXFx0XFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGdldF9odGFiX2VsZW0oaHRhYiwgaSkpO1xcbiBcXHRcXHRmcmVlX3BlcmNwdShwcHRyKTtcXG4gXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIFxcdH1cXG5AQCAtMzA4LDggKzM3MSw4IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpwcmVhbGxvY19scnVfcG9wKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LFxcbiBcXG4gXFx0aWYgKG5vZGUpIHtcXG4gXFx0XFx0YnBmX21hcF9pbmNfZWxlbV9jb3VudChcXHUwMDI2aHRhYi1cXHUwMDNlbWFwKTtcXG4tXFx0XFx0bCA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSk7XFxuLVxcdFxcdG1lbWNweShsLVxcdTAwM2VrZXksIGtleSwgaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplKTtcXG4rXFx0XFx0bCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7XFxuK1xcdFxcdG1lbWNweShodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXksIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSk7XFxuIFxcdFxcdHJldHVybiBsO1xcbiBcXHR9XFxuIFxcbkBAIC0zNDAsOCArNDAzLDcgQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIEdGUF9VU0VSIHwgX19HRlBfTk9XQVJOKTtcXG4gXFx0XFx0aWYgKCFwcHRyKVxcbiBcXHRcXHRcXHRnb3RvIGZyZWVfZWxlbXM7XFxuLVxcdFxcdGh0YWJfZWxlbV9zZXRfcHRyKGdldF9odGFiX2VsZW0oaHRhYiwgaSksIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSxcXG4tXFx0XFx0XFx0XFx0ICBwcHRyKTtcXG4rXFx0XFx0aHRhYl9lbGVtX3NldF9wdHIoaHRhYiwgZ2V0X2h0YWJfZWxlbShodGFiLCBpKSwgcHB0cik7XFxuIFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbiBcXHR9XFxuIFxcbkBAIC0zNDksOCArNDExLDggQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4gXFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxcbiBcXHRcXHRlcnIgPSBicGZfbHJ1X2luaXQoXFx1MDAyNmh0YWItXFx1MDAzZWxydSxcXG4gXFx0XFx0XFx0XFx0ICAgaHRhYi1cXHUwMDNlbWFwLm1hcF9mbGFncyBcXHUwMDI2IEJQRl9GX05PX0NPTU1PTl9MUlUsXFxuLVxcdFxcdFxcdFxcdCAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGhhc2gpIC1cXG4tXFx0XFx0XFx0XFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpLFxcbitcXHRcXHRcXHRcXHQgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgZGF0YSkgLVxcbitcXHRcXHRcXHRcXHQgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpLFxcbiBcXHRcXHRcXHRcXHQgICBodGFiX2xydV9tYXBfZGVsZXRlX25vZGUsXFxuIFxcdFxcdFxcdFxcdCAgIGh0YWIpO1xcbiBcXHRlbHNlXFxuQEAgLTM2MSwxMSArNDIzLDExIEBAIHN0YXRpYyBpbnQgcHJlYWxsb2NfaW5pdChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuIFxcbiBcXHRpZiAoaHRhYl9pc19scnUoaHRhYikpXFxuIFxcdFxcdGJwZl9scnVfcG9wdWxhdGUoXFx1MDAyNmh0YWItXFx1MDAzZWxydSwgaHRhYi1cXHUwMDNlZWxlbXMsXFxuLVxcdFxcdFxcdFxcdCBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSksXFxuK1xcdFxcdFxcdFxcdCBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpLFxcbiBcXHRcXHRcXHRcXHQgaHRhYi1cXHUwMDNlZWxlbV9zaXplLCBudW1fZW50cmllcyk7XFxuIFxcdGVsc2VcXG4gXFx0XFx0cGNwdV9mcmVlbGlzdF9wb3B1bGF0ZShcXHUwMDI2aHRhYi1cXHUwMDNlZnJlZWxpc3QsXFxuLVxcdFxcdFxcdFxcdCAgICAgICBodGFiLVxcdTAwM2VlbGVtcyArIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGh0YWItXFx1MDAzZWVsZW1zICsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSksXFxuIFxcdFxcdFxcdFxcdCAgICAgICBodGFiLVxcdTAwM2VlbGVtX3NpemUsIG51bV9lbnRyaWVzKTtcXG4gXFxuIFxcdHJldHVybiAwO1xcbkBAIC00MDEsNyArNDYzLDcgQEAgc3RhdGljIGludCBhbGxvY19leHRyYV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuIFxcdFxcdC8qIHBvcCB3aWxsIHN1Y2NlZWQsIHNpbmNlIHByZWFsbG9jX2luaXQoKVxcbiBcXHRcXHQgKiBwcmVhbGxvY2F0ZWQgZXh0cmEgbnVtX3Bvc3NpYmxlX2NwdXMgZWxlbWVudHNcXG4gXFx0XFx0ICovXFxuLVxcdFxcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKTtcXG4rXFx0XFx0bF9uZXcgPSBjb250YWluZXJfb2YobCwgc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSk7XFxuIFxcdFxcdCpwZXJfY3B1X3B0cihwcHRyLCBjcHUpID0gbF9uZXc7XFxuIFxcdH1cXG4gXFx0aHRhYi1cXHUwMDNlZXh0cmFfZWxlbXMgPSBwcHRyO1xcbkBAIC00MjUsOCArNDg3LDggQEAgc3RhdGljIGludCBodGFiX21hcF9hbGxvY19jaGVjayh1bmlvbiBicGZfYXR0ciAqYXR0cilcXG4gXFx0Ym9vbCB6ZXJvX3NlZWQgPSAoYXR0ci1cXHUwMDNlbWFwX2ZsYWdzIFxcdTAwMjYgQlBGX0ZfWkVST19TRUVEKTtcXG4gXFx0aW50IG51bWFfbm9kZSA9IGJwZl9tYXBfYXR0cl9udW1hX25vZGUoYXR0cik7XFxuIFxcbi1cXHRCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgZm5vZGUubmV4dCkgIT1cXG4tXFx0XFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUucHByZXYpKTtcXG4rXFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBodGFiX25vZGUsIGZub2RlLm5leHQpICE9XFxuK1xcdFxcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfbm9kZSwgaGFzaF9ub2RlLnBwcmV2KSk7XFxuIFxcbiBcXHRpZiAoemVyb19zZWVkIFxcdTAwMjZcXHUwMDI2ICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKVxcbiBcXHRcXHQvKiBHdWFyZCBhZ2FpbnN0IGxvY2FsIERvUywgYW5kIGRpc2NvdXJhZ2UgcHJvZHVjdGlvbiB1c2UuICovXFxuQEAgLTQ3Niw3ICs1MzgsNyBAQCBzdGF0aWMgdm9pZCBodGFiX21lbV9kdG9yKHZvaWQgKm9iaiwgdm9pZCAqY3R4KVxcbiBcXHRpZiAoSVNfRVJSX09SX05VTEwoaHJlYy1cXHUwMDNlcmVjb3JkKSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4tXFx0bWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGhyZWMtXFx1MDAzZWtleV9zaXplKTtcXG4rXFx0bWFwX3ZhbHVlID0gKHZvaWQgKillbGVtICsgaHJlYy1cXHUwMDNla2V5X29mZnNldCArIHJvdW5kX3VwKGhyZWMtXFx1MDAzZWtleV9zaXplLCA4KTtcXG4gXFx0YnBmX29ial9mcmVlX2ZpZWxkcyhocmVjLVxcdTAwM2VyZWNvcmQsIG1hcF92YWx1ZSk7XFxuIH1cXG4gXFxuQEAgLTUwMiw3ICs1NjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2R0b3JfY3R4X2ZyZWUodm9pZCAqY3R4KVxcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGJwZl9tYV9zZXRfZHRvcihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX21lbV9hbGxvYyAqbWEsXFxuLVxcdFxcdFxcdCAgIHZvaWQgKCpkdG9yKSh2b2lkICosIHZvaWQgKikpXFxuK1xcdFxcdFxcdCAgIHZvaWQgKCpkdG9yKSh2b2lkICosIHZvaWQgKiksIHUzMiBrZXlfb2Zmc2V0KVxcbiB7XFxuIFxcdHN0cnVjdCBodGFiX2J0Zl9yZWNvcmQgKmhyZWM7XFxuIFxcdGludCBlcnI7XFxuQEAgLTUxNSw2ICs1NzcsNyBAQCBzdGF0aWMgaW50IGJwZl9tYV9zZXRfZHRvcihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX21lbV9hbGxvYyAqbWEsXFxuIFxcdGlmICghaHJlYylcXG4gXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIFxcdGhyZWMtXFx1MDAzZWtleV9zaXplID0gbWFwLVxcdTAwM2VrZXlfc2l6ZTtcXG4rXFx0aHJlYy1cXHUwMDNla2V5X29mZnNldCA9IGtleV9vZmZzZXQ7XFxuIFxcdGhyZWMtXFx1MDAzZXJlY29yZCA9IGJ0Zl9yZWNvcmRfZHVwKG1hcC1cXHUwMDNlcmVjb3JkKTtcXG4gXFx0aWYgKElTX0VSUihocmVjLVxcdTAwM2VyZWNvcmQpKSB7XFxuIFxcdFxcdGVyciA9IFBUUl9FUlIoaHJlYy1cXHUwMDNlcmVjb3JkKTtcXG5AQCAtNTM3LDkgKzYwMCw5IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4gXFx0ICogcG9wdWxhdGVkIGluIGh0YWJfbWFwX2FsbG9jKCksIHNvIGl0IHdpbGwgYWx3YXlzIGFwcGVhciBhcyBOVUxMLlxcbiBcXHQgKi9cXG4gXFx0aWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKVxcbi1cXHRcXHRyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgXFx1MDAyNmh0YWItXFx1MDAzZXBjcHVfbWEsIGh0YWJfcGNwdV9tZW1fZHRvcik7XFxuK1xcdFxcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcXHUwMDI2aHRhYi1cXHUwMDNlcGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yLCBodGFiLVxcdTAwM2VrZXlfb2Zmc2V0KTtcXG4gXFx0ZWxzZVxcbi1cXHRcXHRyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgXFx1MDAyNmh0YWItXFx1MDAzZW1hLCBodGFiX21lbV9kdG9yKTtcXG4rXFx0XFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFxcdTAwMjZodGFiLVxcdTAwM2VtYSwgaHRhYl9tZW1fZHRvciwgaHRhYi1cXHUwMDNla2V5X29mZnNldCk7XFxuIH1cXG4gXFxuIHN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXFxuQEAgLTU2Miw2ICs2MjUsMTMgQEAgc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcXG4gXFxuIFxcdGJwZl9tYXBfaW5pdF9mcm9tX2F0dHIoXFx1MDAyNmh0YWItXFx1MDAzZW1hcCwgYXR0cik7XFxuIFxcbitcXHQvKiBBdm9pZCBoYXNoIG1lbW9yeSB1c2UgYW5kIGNvbXBhcmlzb25zIHdoZXJlIHVubmVjZXNzYXJ5LlxcbitcXHQgKiB1MzIgaGFzaCByZWFkcyBhcmUgYWx3YXlzIGF0b21pYy4gSWYgd2UgZWxpZGUgdGhlbSwga2V5IGNvbXBhcmlzb25zIG11c3QgYWxzbyBiZSBhdG9taWNcXG4rXFx0ICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUga2V5IG1hdGNoZXMgZHVlIHRvIHRvcm4ga2V5IHJlYWRzIC8gd3JpdGVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGVcXG4rXFx0ICogd2hlbiB0aGUga2V5IGZpdHMgd2l0aGluIGEgd29yZCwgc28gY2hlY2sga2V5X3NpemUuXFxuK1xcdCAqL1xcbitcXHRodGFiLVxcdTAwM2VoYXNfaGFzaCA9IGh0YWJfaXNfbHJ1KGh0YWIpIHx8IGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSBcXHUwMDNlIHNpemVvZih1bnNpZ25lZCBsb25nKTtcXG4rXFxuIFxcdGlmIChwZXJjcHVfbHJ1KSB7XFxuIFxcdFxcdC8qIGVuc3VyZSBlYWNoIENQVSdzIGxydSBsaXN0IGhhcyBcXHUwMDNlPTEgZWxlbWVudHMuXFxuIFxcdFxcdCAqIHNpbmNlIHdlIGFyZSBhdCBpdCwgbWFrZSBlYWNoIGxydSBsaXN0IGhhcyB0aGUgc2FtZVxcbkBAIC01ODMsOCArNjUzLDE2IEBAIHN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXFxuIFxcbiBcXHRodGFiLVxcdTAwM2VuX2J1Y2tldHMgPSByb3VuZHVwX3Bvd19vZl90d28oaHRhYi1cXHUwMDNlbWFwLm1heF9lbnRyaWVzKTtcXG4gXFxuLVxcdGh0YWItXFx1MDAzZWVsZW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHRhYl9lbGVtKSArXFxuLVxcdFxcdFxcdCAgcm91bmRfdXAoaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplLCA4KTtcXG4rXFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxcbitcXHRcXHRodGFiLVxcdTAwM2VrZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGRhdGEpICsgODtcXG4rXFx0ZWxzZSBpZiAocGVyY3B1IFxcdTAwMjZcXHUwMDI2ICFwcmVhbGxvYylcXG4rXFx0XFx0aHRhYi1cXHUwMDNla2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fcGNwdSwgZGF0YSkgK1xcbitcXHRcXHRcXHRcXHQgICAoaHRhYl9oYXNfaGFzaChodGFiKSA/IDggOiAwKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRodGFiLVxcdTAwM2VrZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgZGF0YSkgK1xcbitcXHRcXHRcXHRcXHQgICAoaHRhYl9oYXNfaGFzaChodGFiKSA/IDggOiAwKTtcXG4rXFxuK1xcdGh0YWItXFx1MDAzZWVsZW1fc2l6ZSA9IGh0YWItXFx1MDAzZWtleV9vZmZzZXQgKyByb3VuZF91cChodGFiLVxcdTAwM2VtYXAua2V5X3NpemUsIDgpO1xcbiBcXHRpZiAocGVyY3B1KVxcbiBcXHRcXHRodGFiLVxcdTAwM2VlbGVtX3NpemUgKz0gc2l6ZW9mKHZvaWQgKik7XFxuIFxcdGVsc2VcXG5AQCAtNjkyLDE1ICs3NzAsMjkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqc2VsZWN0X2J1Y2tldChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHUzMlxcbiB9XFxuIFxcbiAvKiB0aGlzIGxvb2t1cCBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBidWNrZXQgbG9jayB0YWtlbiAqL1xcbi1zdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLCB1MzIgaGFzaCxcXG4rc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2gsXFxuIFxcdFxcdFxcdFxcdFxcdCB2b2lkICprZXksIHUzMiBrZXlfc2l6ZSlcXG4ge1xcbiBcXHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFxuLVxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpXFxuLVxcdFxcdGlmIChsLVxcdTAwM2VoYXNoID09IGhhc2ggXFx1MDAyNlxcdTAwMjYgIW1lbWNtcChcXHUwMDI2bC1cXHUwMDNla2V5LCBrZXksIGtleV9zaXplKSlcXG4tXFx0XFx0XFx0cmV0dXJuIGw7XFxuK1xcdGlmIChodGFiX2hhc19oYXNoKGh0YWIpKSB7XFxuK1xcdFxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSlcXG4rXFx0XFx0XFx0aWYgKGh0YWJfZWxlbV9oYXNoKGh0YWIsIGwpID09IGhhc2ggXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgICFtZW1jbXAoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBrZXlfc2l6ZSkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBsO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHQvKiBXaGVuIGhhc2ggaXMgb21pdHRlZCwga2V5IGNvbXBhcmlzb25zIG11c3QgYmUgYXRvbWljLiBaZXJvIGV4dGVuZFxcbitcXHRcXHQgKiB0aGUgY2FsbGVyJ3Mga2V5IHRvIHRoZSB3b3JkIHNpemUgdG8gc3VwcG9ydCBhbiBhdG9taWMgY29tcGFyZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgayA9IDA7XFxuK1xcbitcXHRcXHRtZW1jcHkoXFx1MDAyNmssIGtleSwga2V5X3NpemUpO1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXFxuK1xcdFxcdFxcdGlmIChSRUFEX09OQ0UoKih1bnNpZ25lZCBsb25nICopaHRhYl9lbGVtX2tleShodGFiLCBsKSkgPT0gaylcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGw7XFxuK1xcdH1cXG4gXFxuIFxcdHJldHVybiBOVUxMO1xcbiB9XFxuQEAgLTcwOSw3ICs4MDEsOCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLCB1MzIgaGFzaFxcbiAgKiB0aGUgdW5saWtlbHkgZXZlbnQgd2hlbiBlbGVtZW50cyBtb3ZlZCBmcm9tIG9uZSBidWNrZXQgaW50byBhbm90aGVyXFxuICAqIHdoaWxlIGxpbmsgbGlzdCBpcyBiZWluZyB3YWxrZWRcXG4gICovXFxuLXN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsXFxuK3N0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGJwZl9odGFiICpodGFiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgICB1MzIgaGFzaCwgdm9pZCAqa2V5LFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICAgdTMyIGtleV9zaXplLCB1MzIgbl9idWNrZXRzKVxcbiB7XFxuQEAgLTcxNyw5ICs4MTAsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCxcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFxuIGFnYWluOlxcbi1cXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKVxcbi1cXHRcXHRpZiAobC1cXHUwMDNlaGFzaCA9PSBoYXNoIFxcdTAwMjZcXHUwMDI2ICFtZW1jbXAoXFx1MDAyNmwtXFx1MDAzZWtleSwga2V5LCBrZXlfc2l6ZSkpXFxuLVxcdFxcdFxcdHJldHVybiBsO1xcbitcXHRpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkge1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXFxuK1xcdFxcdFxcdGlmIChodGFiX2VsZW1faGFzaChodGFiLCBsKSA9PSBoYXNoIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICAhbWVtY21wKGh0YWJfZWxlbV9rZXkoaHRhYiwgbCksIGtleSwga2V5X3NpemUpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gbDtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0LyogU2VlIGxvb2t1cF9lbGVtX3JhdygpIGNvbW1lbnQgYWJvdmUuICovXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgayA9IDA7XFxuK1xcbitcXHRcXHRtZW1jcHkoXFx1MDAyNmssIGtleSwga2V5X3NpemUpO1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXFxuK1xcdFxcdFxcdGlmIChSRUFEX09OQ0UoKih1bnNpZ25lZCBsb25nICopaHRhYl9lbGVtX2tleShodGFiLCBsKSkgPT0gaylcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGw7XFxuK1xcdH1cXG4gXFxuIFxcdGlmICh1bmxpa2VseShnZXRfbnVsbHNfdmFsdWUobikgIT0gKGhhc2ggXFx1MDAyNiAobl9idWNrZXRzIC0gMSkpKSlcXG4gXFx0XFx0Z290byBhZ2FpbjtcXG5AQCAtNzQ3LDE3ICs4NTEsMTggQEAgc3RhdGljIHZvaWQgKl9faHRhYl9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiBcXG4gXFx0aGVhZCA9IHNlbGVjdF9idWNrZXQoaHRhYiwgaGFzaCk7XFxuIFxcbi1cXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXFx1MDAzZW5fYnVja2V0cyk7XFxuK1xcdGwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi1cXHUwMDNlbl9idWNrZXRzKTtcXG4gXFxuIFxcdHJldHVybiBsO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCAqaHRhYl9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xcbiBcXG4gXFx0aWYgKGwpXFxuLVxcdFxcdHJldHVybiBodGFiX2VsZW1fdmFsdWUobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdFxcdHJldHVybiBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG4gfVxcbkBAIC03NzUsNiArODgwLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gICovXFxuIHN0YXRpYyBpbnQgaHRhYl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XFxuIFxcdGNvbnN0IGludCByZXQgPSBCUEZfUkVHXzA7XFxuIFxcbkBAIC03ODMsNyArODg5LDcgQEAgc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXFxuIFxcdCppbnNuKysgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xcbiBcXHQqaW5zbisrID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCAxKTtcXG4gXFx0Kmluc24rKyA9IEJQRl9BTFU2NF9JTU0oQlBGX0FERCwgcmV0LFxcbi1cXHRcXHRcXHRcXHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICtcXG4rXFx0XFx0XFx0XFx0aHRhYi1cXHUwMDNla2V5X29mZnNldCArXFxuIFxcdFxcdFxcdFxcdHJvdW5kX3VwKG1hcC1cXHUwMDNla2V5X3NpemUsIDgpKTtcXG4gXFx0cmV0dXJuIGluc24gLSBpbnNuX2J1ZjtcXG4gfVxcbkBAIC03OTEsMTIgKzg5NywxMyBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICpfX2h0YWJfbHJ1X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHR2b2lkICprZXksIGNvbnN0IGJvb2wgbWFyaylcXG4ge1xcbitcXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XFxuIFxcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcXG4gXFxuIFxcdGlmIChsKSB7XFxuIFxcdFxcdGlmIChtYXJrKVxcbi1cXHRcXHRcXHRicGZfbHJ1X25vZGVfc2V0X3JlZihcXHUwMDI2bC1cXHUwMDNlbHJ1X25vZGUpO1xcbi1cXHRcXHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobCkpO1xcbitcXHRcXHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtODE1LDYgKzkyMiw3IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9tYXBfbG9va3VwX2VsZW1fc3lzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gc3RhdGljIGludCBodGFiX2xydV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XFxuIFxcdGNvbnN0IGludCByZXQgPSBCUEZfUkVHXzA7XFxuIFxcdGNvbnN0IGludCByZWZfcmVnID0gQlBGX1JFR18xO1xcbkBAIC04MjQsMTUgKzkzMiwxNSBAQCBzdGF0aWMgaW50IGh0YWJfbHJ1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsXFxuIFxcdCppbnNuKysgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xcbiBcXHQqaW5zbisrID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCA0KTtcXG4gXFx0Kmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9CLCByZWZfcmVnLCByZXQsXFxuLVxcdFxcdFxcdCAgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSArXFxuK1xcdFxcdFxcdCAgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSkgK1xcbiBcXHRcXHRcXHQgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpKTtcXG4gXFx0Kmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KTkUsIHJlZl9yZWcsIDAsIDEpO1xcbiBcXHQqaW5zbisrID0gQlBGX1NUX01FTShCUEZfQiwgcmV0LFxcbi1cXHRcXHRcXHQgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSArXFxuK1xcdFxcdFxcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSArXFxuIFxcdFxcdFxcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGJwZl9scnVfbm9kZSwgcmVmKSxcXG4gXFx0XFx0XFx0ICAgICAxKTtcXG4gXFx0Kmluc24rKyA9IEJQRl9BTFU2NF9JTU0oQlBGX0FERCwgcmV0LFxcbi1cXHRcXHRcXHRcXHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICtcXG4rXFx0XFx0XFx0XFx0aHRhYi1cXHUwMDNla2V5X29mZnNldCArXFxuIFxcdFxcdFxcdFxcdHJvdW5kX3VwKG1hcC1cXHUwMDNla2V5X3NpemUsIDgpKTtcXG4gXFx0cmV0dXJuIGluc24gLSBpbnNuX2J1ZjtcXG4gfVxcbkBAIC04NDQsMTMgKzk1MiwxMyBAQCBzdGF0aWMgdm9pZCBjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuIFxcdGlmIChodGFiX2lzX3BlcmNwdShodGFiKSkge1xcbi1cXHRcXHR2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplKTtcXG4rXFx0XFx0dm9pZCBfX3BlcmNwdSAqcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGVsZW0pO1xcbiBcXHRcXHRpbnQgY3B1O1xcbiBcXG4gXFx0XFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSlcXG4gXFx0XFx0XFx0YnBmX29ial9jYW5jZWxfZmllbGRzKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHR2b2lkICptYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplKTtcXG4rXFx0XFx0dm9pZCAqbWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pO1xcbiBcXG4gXFx0XFx0YnBmX29ial9jYW5jZWxfZmllbGRzKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIG1hcF92YWx1ZSk7XFxuIFxcdH1cXG5AQCAtODY5LDE3ICs5NzcsMTcgQEAgc3RhdGljIGJvb2wgaHRhYl9scnVfbWFwX2RlbGV0ZV9ub2RlKHZvaWQgKmFyZywgc3RydWN0IGJwZl9scnVfbm9kZSAqbm9kZSlcXG4gXFx0c3RydWN0IGJ1Y2tldCAqYjtcXG4gXFx0aW50IHJldDtcXG4gXFxuLVxcdHRndF9sID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKTtcXG4tXFx0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCB0Z3RfbC1cXHUwMDNlaGFzaCk7XFxuK1xcdHRndF9sID0gKHN0cnVjdCBodGFiX2VsZW0gKiljb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKTtcXG4rXFx0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCBodGFiX2VsZW1faGFzaChodGFiLCB0Z3RfbCkpO1xcbiBcXHRoZWFkID0gXFx1MDAyNmItXFx1MDAzZWhlYWQ7XFxuIFxcbiBcXHRyZXQgPSBodGFiX2xvY2tfYnVja2V0KGIsIFxcdTAwMjZmbGFncyk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFxuLVxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpXFxuK1xcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSlcXG4gXFx0XFx0aWYgKGwgPT0gdGd0X2wpIHtcXG4tXFx0XFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bC1cXHUwMDNlaGFzaF9ub2RlKTtcXG4rXFx0XFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bC1cXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xcbiBcXHRcXHRcXHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFxcdTAwMjZodGFiLVxcdTAwM2VtYXApO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbkBAIC05MTIsMTggKzEwMjAsMTkgQEAgc3RhdGljIGludCBodGFiX21hcF9nZXRfbmV4dF9rZXkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICpuZXh0X2tleSlcXG4gXFx0aGVhZCA9IHNlbGVjdF9idWNrZXQoaHRhYiwgaGFzaCk7XFxuIFxcbiBcXHQvKiBsb29rdXAgdGhlIGtleSAqL1xcbi1cXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXFx1MDAzZW5fYnVja2V0cyk7XFxuK1xcdGwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi1cXHUwMDNlbl9idWNrZXRzKTtcXG4gXFxuIFxcdGlmICghbClcXG4gXFx0XFx0Z290byBmaW5kX2ZpcnN0X2VsZW07XFxuIFxcbiBcXHQvKiBrZXkgd2FzIGZvdW5kLCBnZXQgbmV4dCBrZXkgaW4gdGhlIHNhbWUgYnVja2V0ICovXFxuLVxcdG5leHRfbCA9IGhsaXN0X251bGxzX2VudHJ5X3NhZmUocmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcXHUwMDI2bC1cXHUwMDNlaGFzaF9ub2RlKSksXFxuLVxcdFxcdFxcdFxcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcXG4rXFx0bmV4dF9sID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShcXG4rXFx0XFx0XFx0cmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcXHUwMDI2bC1cXHUwMDNlbm9kZS5oYXNoX25vZGUpKSxcXG4rXFx0XFx0XFx0c3RydWN0IGh0YWJfZWxlbSwgbm9kZS5oYXNoX25vZGUpO1xcbiBcXG4gXFx0aWYgKG5leHRfbCkge1xcbiBcXHRcXHQvKiBpZiBuZXh0IGVsZW0gaW4gdGhpcyBoYXNoIGxpc3QgaXMgbm9uLXplcm8sIGp1c3QgcmV0dXJuIGl0ICovXFxuLVxcdFxcdG1lbWNweShuZXh0X2tleSwgbmV4dF9sLVxcdTAwM2VrZXksIGtleV9zaXplKTtcXG4rXFx0XFx0bWVtY3B5KG5leHRfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIG5leHRfbCksIGtleV9zaXplKTtcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcdH1cXG4gXFxuQEAgLTkzOCwxMCArMTA0NywxMCBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dldF9uZXh0X2tleShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKm5leHRfa2V5KVxcbiBcXG4gXFx0XFx0LyogcGljayBmaXJzdCBlbGVtZW50IGluIHRoZSBidWNrZXQgKi9cXG4gXFx0XFx0bmV4dF9sID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShyY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX2ZpcnN0X3JjdShoZWFkKSksXFxuLVxcdFxcdFxcdFxcdFxcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XFxuIFxcdFxcdGlmIChuZXh0X2wpIHtcXG4gXFx0XFx0XFx0LyogaWYgaXQncyBub3QgZW1wdHksIGp1c3QgcmV0dXJuIGl0ICovXFxuLVxcdFxcdFxcdG1lbWNweShuZXh0X2tleSwgbmV4dF9sLVxcdTAwM2VrZXksIGtleV9zaXplKTtcXG4rXFx0XFx0XFx0bWVtY3B5KG5leHRfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIG5leHRfbCksIGtleV9zaXplKTtcXG4gXFx0XFx0XFx0cmV0dXJuIDA7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbkBAIC05NTUsNyArMTA2NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZWxlbV9mcmVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcXG4gXFx0Y2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgbCk7XFxuIFxcbiBcXHRpZiAoaHRhYi1cXHUwMDNlbWFwLm1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfSEFTSClcXG4tXFx0XFx0YnBmX21lbV9jYWNoZV9mcmVlKFxcdTAwMjZodGFiLVxcdTAwM2VwY3B1X21hLCBsLVxcdTAwM2VwdHJfdG9fcHB0cik7XFxuK1xcdFxcdGJwZl9tZW1fY2FjaGVfZnJlZShcXHUwMDI2aHRhYi1cXHUwMDNlcGNwdV9tYSwgaHRhYl9lbGVtX2dldF9wdHJfdG9fcHB0cihsKSk7XFxuIFxcdGJwZl9tZW1fY2FjaGVfZnJlZShcXHUwMDI2aHRhYi1cXHUwMDNlbWEsIGwpO1xcbiB9XFxuIFxcbkBAIC05NjUsNyArMTA3NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfcHV0X2ZkX3ZhbHVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcXG4gXFx0dm9pZCAqcHRyO1xcbiBcXG4gXFx0aWYgKG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZmRfcHV0X3B0cikge1xcbi1cXHRcXHRwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7XFxuK1xcdFxcdHB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIoaHRhYiwgbCk7XFxuIFxcdFxcdG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZmRfcHV0X3B0cihtYXAsIHB0ciwgdHJ1ZSk7XFxuIFxcdH1cXG4gfVxcbkBAIC0xMDA2LDcgKzExMTUsNyBAQCBzdGF0aWMgdm9pZCBmcmVlX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXFxuIFxcdGlmIChodGFiX2lzX3ByZWFsbG9jKGh0YWIpKSB7XFxuIFxcdFxcdGJwZl9tYXBfZGVjX2VsZW1fY291bnQoXFx1MDAyNmh0YWItXFx1MDAzZW1hcCk7XFxuIFxcdFxcdGNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKGh0YWIsIGwpO1xcbi1cXHRcXHRwY3B1X2ZyZWVsaXN0X3B1c2goXFx1MDAyNmh0YWItXFx1MDAzZWZyZWVsaXN0LCBcXHUwMDI2bC1cXHUwMDNlZm5vZGUpO1xcbitcXHRcXHRwY3B1X2ZyZWVsaXN0X3B1c2goXFx1MDAyNmh0YWItXFx1MDAzZWZyZWVsaXN0LCBcXHUwMDI2bC1cXHUwMDNlbm9kZS5mbm9kZSk7XFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdGRlY19lbGVtX2NvdW50KGh0YWIpO1xcbiBcXHRcXHRodGFiX2VsZW1fZnJlZShodGFiLCBsKTtcXG5AQCAtMTA5Nyw3ICsxMjA2LDcgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcXG4gXFx0XFx0XFx0bCA9IF9fcGNwdV9mcmVlbGlzdF9wb3AoXFx1MDAyNmh0YWItXFx1MDAzZWZyZWVsaXN0KTtcXG4gXFx0XFx0XFx0aWYgKCFsKVxcbiBcXHRcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xcbi1cXHRcXHRcXHRsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSk7XFxuK1xcdFxcdFxcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIG5vZGUuZm5vZGUpO1xcbiBcXHRcXHRcXHRicGZfbWFwX2luY19lbGVtX2NvdW50KFxcdTAwMjZodGFiLVxcdTAwM2VtYXApO1xcbiBcXHRcXHR9XFxuIFxcdH0gZWxzZSB7XFxuQEAgLTExMTcsMTAgKzEyMjYsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRtZW1jcHkobF9uZXctXFx1MDAzZWtleSwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGlmIChodGFiX2hhc19oYXNoKGh0YWIpKSB7XFxuK1xcdFxcdG1lbWNweShodGFiX2VsZW1fa2V5KGh0YWIsIGxfbmV3KSwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIFplcm8tZXh0ZW5kIGtleSBpbnRvIGsgZm9yIGFuIGF0b21pYyB3cml0ZSB0byBzdXBwb3J0XFxuK1xcdFxcdCAqIGxvY2tsZXNzIFJDVSByZWFkZXJzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBrID0gMDtcXG4rXFxuK1xcdFxcdG1lbWNweShcXHUwMDI2aywga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdFxcdFdSSVRFX09OQ0UoKih1bnNpZ25lZCBsb25nICopaHRhYl9lbGVtX2tleShodGFiLCBsX25ldyksIGspO1xcbitcXHR9XFxuIFxcdGlmIChwZXJjcHUpIHtcXG4gXFx0XFx0aWYgKHByZWFsbG9jKSB7XFxuLVxcdFxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsX25ldywga2V5X3NpemUpO1xcbitcXHRcXHRcXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9uZXcpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbiBcXHRcXHRcXHQvKiBhbGxvY19wZXJjcHUgemVyby1maWxscyAqL1xcbiBcXHRcXHRcXHR2b2lkICpwdHIgPSBicGZfbWVtX2NhY2hlX2FsbG9jKFxcdTAwMjZodGFiLVxcdTAwM2VwY3B1X21hKTtcXG5AQCAtMTEzMCwyNiArMTI0OSwyNiBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqYWxsb2NfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LFxcbiBcXHRcXHRcXHRcXHRsX25ldyA9IEVSUl9QVFIoLUVOT01FTSk7XFxuIFxcdFxcdFxcdFxcdGdvdG8gZGVjX2NvdW50O1xcbiBcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdGxfbmV3LVxcdTAwM2VwdHJfdG9fcHB0ciA9IHB0cjtcXG4rXFx0XFx0XFx0aHRhYl9lbGVtX3NldF9wdHJfdG9fcHB0cihsX25ldywgcHRyKTtcXG4gXFx0XFx0XFx0cHB0ciA9ICoodm9pZCBfX3BlcmNwdSAqKilwdHI7XFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdHBjcHVfaW5pdF92YWx1ZShodGFiLCBwcHRyLCB2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xcbiBcXG4gXFx0XFx0aWYgKCFwcmVhbGxvYylcXG4tXFx0XFx0XFx0aHRhYl9lbGVtX3NldF9wdHIobF9uZXcsIGtleV9zaXplLCBwcHRyKTtcXG4rXFx0XFx0XFx0aHRhYl9lbGVtX3NldF9wdHIoaHRhYiwgbF9uZXcsIHBwdHIpO1xcbiBcXHR9IGVsc2UgaWYgKGZkX2h0YWJfbWFwX25lZWRzX2FkanVzdChodGFiKSkge1xcbiBcXHRcXHRzaXplID0gcm91bmRfdXAoc2l6ZSwgOCk7XFxuLVxcdFxcdG1lbWNweShodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSwgdmFsdWUsIHNpemUpO1xcbitcXHRcXHRtZW1jcHkoaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfbmV3KSwgdmFsdWUsIHNpemUpO1xcbiBcXHR9IGVsc2UgaWYgKG1hcF9mbGFncyBcXHUwMDI2IEJQRl9GX0xPQ0spIHtcXG4gXFx0XFx0Y29weV9tYXBfdmFsdWVfbG9ja2VkKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsXFxuLVxcdFxcdFxcdFxcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsX25ldywga2V5X3NpemUpLFxcbitcXHRcXHRcXHRcXHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLFxcbiBcXHRcXHRcXHRcXHQgICAgICB2YWx1ZSwgZmFsc2UpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRjb3B5X21hcF92YWx1ZShcXHUwMDI2aHRhYi1cXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSwgdmFsdWUpO1xcbitcXHRcXHRjb3B5X21hcF92YWx1ZShcXHUwMDI2aHRhYi1cXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSk7XFxuIFxcdH1cXG4gXFxuLVxcdGxfbmV3LVxcdTAwM2VoYXNoID0gaGFzaDtcXG4rXFx0aHRhYl9lbGVtX3NldF9oYXNoKGh0YWIsIGxfbmV3LCBoYXNoKTtcXG4gXFx0cmV0dXJuIGxfbmV3O1xcbiBkZWNfY291bnQ6XFxuIFxcdGRlY19lbGVtX2NvdW50KGh0YWIpO1xcbkBAIC0xMTk5LDcgKzEzMTgsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbiBcXHRcXHRpZiAodW5saWtlbHkoIWJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cXHUwMDNlcmVjb3JkLCBCUEZfU1BJTl9MT0NLKSkpXFxuIFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXHRcXHQvKiBmaW5kIGFuIGVsZW1lbnQgd2l0aG91dCB0YWtpbmcgdGhlIGJ1Y2tldCBsb2NrICovXFxuLVxcdFxcdGxfb2xkID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsXFxuK1xcdFxcdGxfb2xkID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgIGh0YWItXFx1MDAzZW5fYnVja2V0cyk7XFxuIFxcdFxcdHJldCA9IGNoZWNrX2ZsYWdzKGh0YWIsIGxfb2xkLCBtYXBfZmxhZ3MpO1xcbiBcXHRcXHRpZiAocmV0KVxcbkBAIC0xMjA3LDcgKzEzMjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbiBcXHRcXHRpZiAobF9vbGQpIHtcXG4gXFx0XFx0XFx0LyogZ3JhYiB0aGUgZWxlbWVudCBsb2NrIGFuZCB1cGRhdGUgdmFsdWUgaW4gcGxhY2UgKi9cXG4gXFx0XFx0XFx0Y29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGxfb2xkLCBrZXlfc2l6ZSksXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX29sZCksXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgIHZhbHVlLCBmYWxzZSk7XFxuIFxcdFxcdFxcdHJldHVybiAwO1xcbiBcXHRcXHR9XFxuQEAgLTEyMjEsNyArMTM0MCw3IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcbi1cXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcXG4rXFx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuIFxcbiBcXHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcXG4gXFx0aWYgKHJldClcXG5AQCAtMTIzNSw3ICsxMzU0LDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4gXFx0XFx0ICogYW5kIHVwZGF0ZSBlbGVtZW50IGluIHBsYWNlXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRjb3B5X21hcF92YWx1ZV9sb2NrZWQobWFwLFxcbi1cXHRcXHRcXHRcXHQgICAgICBodGFiX2VsZW1fdmFsdWUobF9vbGQsIGtleV9zaXplKSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKSxcXG4gXFx0XFx0XFx0XFx0ICAgICAgdmFsdWUsIGZhbHNlKTtcXG4gXFx0XFx0cmV0ID0gMDtcXG4gXFx0XFx0Z290byBlcnI7XFxuQEAgLTEyNTIsOSArMTM3MSw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuIFxcdC8qIGFkZCBuZXcgZWxlbWVudCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgc28gdGhhdFxcbiBcXHQgKiBjb25jdXJyZW50IHNlYXJjaCB3aWxsIGZpbmQgaXQgYmVmb3JlIG9sZCBlbGVtXFxuIFxcdCAqL1xcbi1cXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXFx1MDAyNmxfbmV3LVxcdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xcbitcXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXFx1MDAyNmxfbmV3LVxcdTAwM2Vub2RlLmhhc2hfbm9kZSwgaGVhZCk7XFxuIFxcdGlmIChsX29sZCkge1xcbi1cXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsX29sZC1cXHUwMDNlaGFzaF9ub2RlKTtcXG4rXFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bF9vbGQtXFx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcXG4gXFxuIFxcdFxcdC8qIGxfb2xkIGhhcyBhbHJlYWR5IGJlZW4gc3Rhc2hlZCBpbiBodGFiLVxcdTAwM2VleHRyYV9lbGVtcywgY2FuY2VsXFxuIFxcdFxcdCAqIGl0cyByZXVzYWJsZSBzcGVjaWFsIGZpZWxkcyBiZWZvcmUgaXQgaXMgYXZhaWxhYmxlIGZvciByZXVzZS5cXG5AQCAtMTI3NSw3ICsxMzk0LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9scnVfcHVzaF9mcmVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqZWxlbSlcXG4ge1xcbiBcXHRjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhodGFiLCBlbGVtKTtcXG4gXFx0YnBmX21hcF9kZWNfZWxlbV9jb3VudChcXHUwMDI2aHRhYi1cXHUwMDNlbWFwKTtcXG4tXFx0YnBmX2xydV9wdXNoX2ZyZWUoXFx1MDAyNmh0YWItXFx1MDAzZWxydSwgXFx1MDAyNmVsZW0tXFx1MDAzZWxydV9ub2RlKTtcXG4rXFx0YnBmX2xydV9wdXNoX2ZyZWUoXFx1MDAyNmh0YWItXFx1MDAzZWxydSwgaHRhYl9lbGVtX2xydV9ub2RlKGVsZW0pKTtcXG4gfVxcbiBcXG4gc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuQEAgLTEzMTAsMTMgKzE0MjksMTMgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWVcXG4gXFx0bF9uZXcgPSBwcmVhbGxvY19scnVfcG9wKGh0YWIsIGtleSwgaGFzaCk7XFxuIFxcdGlmICghbF9uZXcpXFxuIFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi1cXHRjb3B5X21hcF92YWx1ZShcXHUwMDI2aHRhYi1cXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUobF9uZXcsIG1hcC1cXHUwMDNla2V5X3NpemUpLCB2YWx1ZSk7XFxuK1xcdGNvcHlfbWFwX3ZhbHVlKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksIHZhbHVlKTtcXG4gXFxuIFxcdHJldCA9IGh0YWJfbG9ja19idWNrZXQoYiwgXFx1MDAyNmZsYWdzKTtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0Z290byBlcnJfbG9ja19idWNrZXQ7XFxuIFxcbi1cXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcXG4rXFx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuIFxcbiBcXHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcXG4gXFx0aWYgKHJldClcXG5AQCAtMTMyNSwxMCArMTQ0NCwxMCBAQCBzdGF0aWMgbG9uZyBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZVxcbiBcXHQvKiBhZGQgbmV3IGVsZW1lbnQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXRcXG4gXFx0ICogY29uY3VycmVudCBzZWFyY2ggd2lsbCBmaW5kIGl0IGJlZm9yZSBvbGQgZWxlbVxcbiBcXHQgKi9cXG4tXFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFxcdTAwMjZsX25ldy1cXHUwMDNlaGFzaF9ub2RlLCBoZWFkKTtcXG4rXFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFxcdTAwMjZsX25ldy1cXHUwMDNlbm9kZS5oYXNoX25vZGUsIGhlYWQpO1xcbiBcXHRpZiAobF9vbGQpIHtcXG4tXFx0XFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXFx1MDAyNmxfbmV3LVxcdTAwM2VscnVfbm9kZSk7XFxuLVxcdFxcdGhsaXN0X251bGxzX2RlbF9yY3UoXFx1MDAyNmxfb2xkLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRcXHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobF9uZXcpKTtcXG4rXFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bF9vbGQtXFx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcXG4gXFx0fVxcbiBcXHRyZXQgPSAwO1xcbiBcXG5AQCAtMTM4Myw3ICsxNTAyLDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxcbiBcXHRpZiAocmV0KVxcbiBcXHRcXHRyZXR1cm4gcmV0O1xcbiBcXG4tXFx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xcbiBcXG4gXFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XFxuIFxcdGlmIChyZXQpXFxuQEAgLTEzOTIsMTAgKzE1MTEsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxcbiBcXHRpZiAobF9vbGQpIHtcXG4gXFx0XFx0LyogVXBkYXRlIHZhbHVlIGluLXBsYWNlICovXFxuIFxcdFxcdGlmIChwZXJjcHUpIHtcXG4tXFx0XFx0XFx0cGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfb2xkLCBrZXlfc2l6ZSksXFxuK1xcdFxcdFxcdHBjcHVfY29weV92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsX29sZCksXFxuIFxcdFxcdFxcdFxcdFxcdHZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHZvaWQgKippbm5lcl9tYXBfcHB0ciA9IGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpO1xcbitcXHRcXHRcXHR2b2lkICoqaW5uZXJfbWFwX3BwdHIgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpO1xcbiBcXG4gXFx0XFx0XFx0b2xkX21hcF9wdHIgPSAqaW5uZXJfbWFwX3BwdHI7XFxuIFxcdFxcdFxcdFdSSVRFX09OQ0UoKmlubmVyX21hcF9wcHRyLCAqKHZvaWQgKiopdmFsdWUpO1xcbkBAIC0xNDA3LDcgKzE1MjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcdFxcdFxcdHJldCA9IFBUUl9FUlIobF9uZXcpO1xcbiBcXHRcXHRcXHRnb3RvIGVycjtcXG4gXFx0XFx0fVxcbi1cXHRcXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXFx1MDAyNmxfbmV3LVxcdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xcbitcXHRcXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXFx1MDAyNmxfbmV3LVxcdTAwM2Vub2RlLmhhc2hfbm9kZSwgaGVhZCk7XFxuIFxcdH1cXG4gZXJyOlxcbiBcXHRodGFiX3VubG9ja19idWNrZXQoYiwgZmxhZ3MpO1xcbkBAIC0xNDU2LDIyICsxNTc1LDIyIEBAIHN0YXRpYyBsb25nIF9faHRhYl9scnVfcGVyY3B1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdGdvdG8gZXJyX2xvY2tfYnVja2V0O1xcbiBcXG4tXFx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xcbiBcXG4gXFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdGdvdG8gZXJyO1xcbiBcXG4gXFx0aWYgKGxfb2xkKSB7XFxuLVxcdFxcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFxcdTAwMjZsX29sZC1cXHUwMDNlbHJ1X25vZGUpO1xcbitcXHRcXHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobF9vbGQpKTtcXG4gXFxuIFxcdFxcdC8qIHBlci1jcHUgaGFzaCBtYXAgY2FuIHVwZGF0ZSB2YWx1ZSBpbi1wbGFjZSAqL1xcbi1cXHRcXHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIobF9vbGQsIGtleV9zaXplKSxcXG4rXFx0XFx0cGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGxfb2xkKSxcXG4gXFx0XFx0XFx0XFx0dmFsdWUsIG9uYWxsY3B1cywgbWFwX2ZsYWdzKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0cGNwdV9pbml0X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSksXFxuK1xcdFxcdHBjcHVfaW5pdF92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsX25ldyksXFxuIFxcdFxcdFxcdFxcdHZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7XFxuLVxcdFxcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcXHUwMDI2bF9uZXctXFx1MDAzZWhhc2hfbm9kZSwgaGVhZCk7XFxuK1xcdFxcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcXHUwMDI2bF9uZXctXFx1MDAzZW5vZGUuaGFzaF9ub2RlLCBoZWFkKTtcXG4gXFx0XFx0bF9uZXcgPSBOVUxMO1xcbiBcXHR9XFxuIFxcdHJldCA9IDA7XFxuQEAgLTE0ODAsNyArMTU5OSw3IEBAIHN0YXRpYyBsb25nIF9faHRhYl9scnVfcGVyY3B1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIGVycl9sb2NrX2J1Y2tldDpcXG4gXFx0aWYgKGxfbmV3KSB7XFxuIFxcdFxcdGJwZl9tYXBfZGVjX2VsZW1fY291bnQoXFx1MDAyNmh0YWItXFx1MDAzZW1hcCk7XFxuLVxcdFxcdGJwZl9scnVfcHVzaF9mcmVlKFxcdTAwMjZodGFiLVxcdTAwM2VscnUsIFxcdTAwMjZsX25ldy1cXHUwMDNlbHJ1X25vZGUpO1xcbitcXHRcXHRicGZfbHJ1X3B1c2hfZnJlZShcXHUwMDI2aHRhYi1cXHUwMDNlbHJ1LCBodGFiX2VsZW1fbHJ1X25vZGUobF9uZXcpKTtcXG4gXFx0fVxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuQEAgLTE1MjEsOSArMTY0MCw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuLVxcdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGwgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuIFxcdGlmIChsKVxcbi1cXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2Vub2RlLmhhc2hfbm9kZSk7XFxuIFxcdGVsc2VcXG4gXFx0XFx0cmV0ID0gLUVOT0VOVDtcXG4gXFxuQEAgLTE1NTYsMTAgKzE2NzUsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuLVxcdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGwgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuIFxcbiBcXHRpZiAobClcXG4tXFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bC1cXHUwMDNlaGFzaF9ub2RlKTtcXG4rXFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bC1cXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xcbiBcXHRlbHNlXFxuIFxcdFxcdHJldCA9IC1FTk9FTlQ7XFxuIFxcbkBAIC0xNTgxLDggKzE3MDAsOCBAQCBzdGF0aWMgdm9pZCBkZWxldGVfYWxsX2VsZW1lbnRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4gXFx0XFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47XFxuIFxcdFxcdHN0cnVjdCBodGFiX2VsZW0gKmw7XFxuIFxcbi1cXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xcbi1cXHRcXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XFxuK1xcdFxcdFxcdGhsaXN0X251bGxzX2RlbF9yY3UoXFx1MDAyNmwtXFx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcXG4gXFx0XFx0XFx0aHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7XFxuIFxcdFxcdH1cXG4gXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuQEAgLTE1OTksMTAgKzE3MTgsMTAgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX21hbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXHRcXHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcXG4gXFx0XFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFxuLVxcdFxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xcbiBcXHRcXHRcXHQvKiBXZSBvbmx5IGZyZWUgaW50ZXJuYWwgc3RydWN0cyBvbiB1cmVmIGRyb3BwaW5nIHRvIHplcm8gKi9cXG4gXFx0XFx0XFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoXFx1MDAyNmh0YWItXFx1MDAzZW1hcCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGwsIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCkpO1xcbiBcXHRcXHR9XFxuIFxcdFxcdGNvbmRfcmVzY2hlZF9yY3UoKTtcXG4gXFx0fVxcbkBAIC0xNjk3LDcgKzE4MTYsNyBAQCBzdGF0aWMgaW50IF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcbi1cXHRsID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xcbitcXHRsID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xcbiBcXHRpZiAoIWwpIHtcXG4gXFx0XFx0cmV0ID0gLUVOT0VOVDtcXG4gXFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbkBAIC0xNzA4LDE0ICsxODI3LDE0IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcXG4gXFx0XFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcXG4gXFx0XFx0aW50IG9mZiA9IDAsIGNwdTtcXG4gXFxuLVxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBrZXlfc2l6ZSk7XFxuK1xcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcXG4gXFx0XFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xcbiBcXHRcXHRcXHRjb3B5X21hcF92YWx1ZV9sb25nKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIHZhbHVlICsgb2ZmLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcXG4gXFx0XFx0XFx0Y2hlY2tfYW5kX2luaXRfbWFwX3ZhbHVlKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIHZhbHVlICsgb2ZmKTtcXG4gXFx0XFx0XFx0b2ZmICs9IHJvdW5kdXBfdmFsdWVfc2l6ZTtcXG4gXFx0XFx0fVxcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHR2b2lkICpzcmMgPSBodGFiX2VsZW1fdmFsdWUobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdFxcdHZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcXG4gXFxuIFxcdFxcdGlmIChmbGFncyBcXHUwMDI2IEJQRl9GX0xPQ0spXFxuIFxcdFxcdFxcdGNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsIHZhbHVlLCBzcmMsIHRydWUpO1xcbkBAIC0xNzI0LDcgKzE4NDMsNyBAQCBzdGF0aWMgaW50IF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcdFxcdC8qIFplcm9pbmcgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIHRlbXAgYnVmZmVyICovXFxuIFxcdFxcdGNoZWNrX2FuZF9pbml0X21hcF92YWx1ZShtYXAsIHZhbHVlKTtcXG4gXFx0fVxcbi1cXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2Vub2RlLmhhc2hfbm9kZSk7XFxuIFxcbiBvdXRfdW5sb2NrOlxcbiBcXHRodGFiX3VubG9ja19idWNrZXQoYiwgYmZsYWdzKTtcXG5AQCAtMTg2MCw3ICsxOTc5LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHR9XFxuIFxcbiBcXHRidWNrZXRfY250ID0gMDtcXG4tXFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSlcXG4rXFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxcbiBcXHRcXHRidWNrZXRfY250Kys7XFxuIFxcbiBcXHRpZiAoYnVja2V0X2NudCBcXHUwMDI2XFx1MDAyNiAhbG9ja2VkKSB7XFxuQEAgLTE4OTcsMTQgKzIwMTYsMTQgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRpZiAoIWxvY2tlZClcXG4gXFx0XFx0Z290byBuZXh0X2JhdGNoO1xcbiBcXG4tXFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBoYXNoX25vZGUpIHtcXG4tXFx0XFx0bWVtY3B5KGRzdF9rZXksIGwtXFx1MDAzZWtleSwga2V5X3NpemUpO1xcbitcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XFxuK1xcdFxcdG1lbWNweShkc3Rfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXlfc2l6ZSk7XFxuIFxcbiBcXHRcXHRpZiAoaXNfcGVyY3B1KSB7XFxuIFxcdFxcdFxcdGludCBvZmYgPSAwLCBjcHU7XFxuIFxcdFxcdFxcdHZvaWQgX19wZXJjcHUgKnBwdHI7XFxuIFxcbi1cXHRcXHRcXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdFxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcXG4gXFx0XFx0XFx0aWYgKGVsZW1fbWFwX2ZsYWdzIFxcdTAwMjYgQlBGX0ZfQ1BVKSB7XFxuIFxcdFxcdFxcdFxcdGNwdSA9IGVsZW1fbWFwX2ZsYWdzIFxcdTAwM2VcXHUwMDNlIDMyO1xcbiBcXHRcXHRcXHRcXHRjb3B5X21hcF92YWx1ZShcXHUwMDI2aHRhYi1cXHUwMDNlbWFwLCBkc3RfdmFsLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcXG5AQCAtMTkxOCw3ICsyMDM3LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0dmFsdWUgPSBodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpO1xcbitcXHRcXHRcXHR2YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcXG4gXFx0XFx0XFx0aWYgKGlzX2ZkX2h0YWIoaHRhYikpIHtcXG4gXFx0XFx0XFx0XFx0c3RydWN0IGJwZl9tYXAgKippbm5lcl9tYXAgPSB2YWx1ZTtcXG4gXFxuQEAgLTE5MzYsNyArMjA1NSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcXG4gXFx0XFx0XFx0Y2hlY2tfYW5kX2luaXRfbWFwX3ZhbHVlKG1hcCwgZHN0X3ZhbCk7XFxuIFxcdFxcdH1cXG4gXFx0XFx0aWYgKGRvX2RlbGV0ZSkge1xcbi1cXHRcXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRcXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2Vub2RlLmhhc2hfbm9kZSk7XFxuIFxcbiBcXHRcXHRcXHQvKiBicGZfbHJ1X3B1c2hfZnJlZSgpIHdpbGwgYWNxdWlyZSBscnVfbG9jaywgd2hpY2hcXG4gXFx0XFx0XFx0ICogbWF5IGNhdXNlIGRlYWRsb2NrLiBTZWUgY29tbWVudHMgaW4gZnVuY3Rpb25cXG5AQCAtMTk0OCw3ICsyMDY3LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHQgKiBsb2NrIGJlaW5nIGhlbGQgYW5kIGl0IHZpb2xhdGVzIHRoZSBsb2NrIHJ1bGUsIHNvXFxuIFxcdFxcdFxcdCAqIGludm9rZSBmcmVlX2h0YWJfZWxlbSgpIGFmdGVyIHVubG9jayBhcyB3ZWxsLlxcbiBcXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0bC1cXHUwMDNlYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7XFxuK1xcdFxcdFxcdGwtXFx1MDAzZW5vZGUuYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7XFxuIFxcdFxcdFxcdG5vZGVfdG9fZnJlZSA9IGw7XFxuIFxcdFxcdH1cXG4gXFx0XFx0ZHN0X2tleSArPSBrZXlfc2l6ZTtcXG5AQCAtMTk2MCw3ICsyMDc5LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXG4gXFx0d2hpbGUgKG5vZGVfdG9fZnJlZSkge1xcbiBcXHRcXHRsID0gbm9kZV90b19mcmVlO1xcbi1cXHRcXHRub2RlX3RvX2ZyZWUgPSBub2RlX3RvX2ZyZWUtXFx1MDAzZWJhdGNoX2ZsaW5rO1xcbitcXHRcXHRub2RlX3RvX2ZyZWUgPSBub2RlX3RvX2ZyZWUtXFx1MDAzZW5vZGUuYmF0Y2hfZmxpbms7XFxuIFxcdFxcdGlmIChpc19scnVfbWFwKVxcbiBcXHRcXHRcXHRodGFiX2xydV9wdXNoX2ZyZWUoaHRhYiwgbCk7XFxuIFxcdFxcdGVsc2VcXG5AQCAtMjEwOCw4ICsyMjI3LDggQEAgYnBmX2hhc2hfbWFwX3NlcV9maW5kX25leHQoc3RydWN0IGJwZl9pdGVyX3NlcV9oYXNoX21hcF9pbmZvICppbmZvLFxcbiBcXHRcXHQvKiBubyB1cGRhdGUvZGVsZXRpb24gb24gdGhpcyBidWNrZXQsIHByZXZfZWxlbSBzaG91bGQgYmUgc3RpbGwgdmFsaWRcXG4gXFx0XFx0ICogYW5kIHdlIHdvbid0IHNraXAgZWxlbWVudHMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRuID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcXHUwMDI2cHJldl9lbGVtLVxcdTAwM2VoYXNoX25vZGUpKTtcXG4tXFx0XFx0ZWxlbSA9IGhsaXN0X251bGxzX2VudHJ5X3NhZmUobiwgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcXG4rXFx0XFx0biA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXFx1MDAyNnByZXZfZWxlbS1cXHUwMDNlbm9kZS5oYXNoX25vZGUpKTtcXG4rXFx0XFx0ZWxlbSA9IGhsaXN0X251bGxzX2VudHJ5X3NhZmUobiwgc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5oYXNoX25vZGUpO1xcbiBcXHRcXHRpZiAoZWxlbSlcXG4gXFx0XFx0XFx0cmV0dXJuIGVsZW07XFxuIFxcbkBAIC0yMTI1LDcgKzIyNDQsNyBAQCBicGZfaGFzaF9tYXBfc2VxX2ZpbmRfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2hhc2hfbWFwX2luZm8gKmluZm8sXFxuIFxcbiBcXHRcXHRjb3VudCA9IDA7XFxuIFxcdFxcdGhlYWQgPSBcXHUwMDI2Yi1cXHUwMDNlaGVhZDtcXG4tXFx0XFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGVsZW0sIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoZWxlbSwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcXG4gXFx0XFx0XFx0aWYgKGNvdW50IFxcdTAwM2U9IHNraXBfZWxlbXMpIHtcXG4gXFx0XFx0XFx0XFx0aW5mby1cXHUwMDNlYnVja2V0X2lkID0gaTtcXG4gXFx0XFx0XFx0XFx0aW5mby1cXHUwMDNlc2tpcF9lbGVtcyA9IGNvdW50O1xcbkBAIC0yMTgzLDEyICsyMzAyLDEyIEBAIHN0YXRpYyBpbnQgX19icGZfaGFzaF9tYXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pXFxuIFxcdFxcdGN0eC5tZXRhID0gXFx1MDAyNm1ldGE7XFxuIFxcdFxcdGN0eC5tYXAgPSBpbmZvLVxcdTAwM2VtYXA7XFxuIFxcdFxcdGlmIChlbGVtKSB7XFxuLVxcdFxcdFxcdGN0eC5rZXkgPSBlbGVtLVxcdTAwM2VrZXk7XFxuK1xcdFxcdFxcdGN0eC5rZXkgPSBodGFiX2VsZW1fa2V5KGluZm8tXFx1MDAzZWh0YWIsIGVsZW0pO1xcbiBcXHRcXHRcXHRpZiAoIWluZm8tXFx1MDAzZXBlcmNwdV92YWx1ZV9idWYpIHtcXG4tXFx0XFx0XFx0XFx0Y3R4LnZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIG1hcC1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRcXHRjdHgudmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoaW5mby1cXHUwMDNlaHRhYiwgZWxlbSk7XFxuIFxcdFxcdFxcdH0gZWxzZSB7XFxuIFxcdFxcdFxcdFxcdHJvdW5kdXBfdmFsdWVfc2l6ZSA9IHJvdW5kX3VwKG1hcC1cXHUwMDNldmFsdWVfc2l6ZSwgOCk7XFxuLVxcdFxcdFxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBtYXAtXFx1MDAzZWtleV9zaXplKTtcXG4rXFx0XFx0XFx0XFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGluZm8tXFx1MDAzZWh0YWIsIGVsZW0pO1xcbiBcXHRcXHRcXHRcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuIFxcdFxcdFxcdFxcdFxcdGNvcHlfbWFwX3ZhbHVlX2xvbmcobWFwLCBpbmZvLVxcdTAwM2VwZXJjcHVfdmFsdWVfYnVmICsgb2ZmLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7XFxuQEAgLTIyOTIsMTQgKzI0MTEsMTQgQEAgc3RhdGljIGxvbmcgYnBmX2Zvcl9lYWNoX2hhc2hfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCBicGZfY2FsbGJhY2tfdCBjYWxsYmFja19cXG4gXFx0XFx0YiA9IFxcdTAwMjZodGFiLVxcdTAwM2VidWNrZXRzW2ldO1xcbiBcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIFxcdFxcdGhlYWQgPSBcXHUwMDI2Yi1cXHUwMDNlaGVhZDtcXG4tXFx0XFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShlbGVtLCBuLCBoZWFkLCBoYXNoX25vZGUpIHtcXG4tXFx0XFx0XFx0a2V5ID0gZWxlbS1cXHUwMDNla2V5O1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGVsZW0sIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XFxuK1xcdFxcdFxcdGtleSA9IGh0YWJfZWxlbV9rZXkoaHRhYiwgZWxlbSk7XFxuIFxcdFxcdFxcdGlmIChpc19wZXJjcHUpIHtcXG4gXFx0XFx0XFx0XFx0LyogY3VycmVudCBjcHUgdmFsdWUgZm9yIHBlcmNwdSBtYXAgKi9cXG4tXFx0XFx0XFx0XFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIG1hcC1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRcXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZWxlbSk7XFxuIFxcdFxcdFxcdFxcdHZhbCA9IHRoaXNfY3B1X3B0cihwcHRyKTtcXG4gXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0dmFsID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIG1hcC1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRcXHR2YWwgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSk7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0bnVtX2VsZW1zKys7XFxuIFxcdFxcdFxcdHJldCA9IGNhbGxiYWNrX2ZuKCh1NjQpKGxvbmcpbWFwLCAodTY0KShsb25nKWtleSxcXG5AQCAtMjQwMywxMCArMjUyMiwxMSBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9scnVfbWFwX29wcyA9IHtcXG4gLyogQ2FsbGVkIGZyb20gZUJQRiBwcm9ncmFtICovXFxuIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xcbiBcXG4gXFx0aWYgKGwpXFxuLVxcdFxcdHJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSkpO1xcbitcXHRcXHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpKTtcXG4gXFx0ZWxzZVxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG4gfVxcbkBAIC0yNDE0LDYgKzI1MzQsNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9wZXJjcHVfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gLyogaW5saW5lIGJwZl9tYXBfbG9va3VwX2VsZW0oKSBjYWxsIGZvciBwZXItQ1BVIGhhc2htYXAgKi9cXG4gc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XFxuIFxcbiBcXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcXG5AQCAtMjQyNCw3ICsyNTQ1LDcgQEAgc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25cXG4gXFx0Kmluc24rKyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7XFxuIFxcdCppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDMpO1xcbiBcXHQqaW5zbisrID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsXFxuLVxcdFxcdFxcdFxcdG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGtleSkgKyByb3VuZHVwKG1hcC1cXHUwMDNla2V5X3NpemUsIDgpKTtcXG4rXFx0XFx0XFx0XFx0aHRhYi1cXHUwMDNla2V5X29mZnNldCArIHJvdW5kdXAobWFwLVxcdTAwM2VrZXlfc2l6ZSwgOCkpO1xcbiBcXHQqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfMCwgMCk7XFxuIFxcdCppbnNuKysgPSBCUEZfTU9WNjRfUEVSQ1BVX1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMCk7XFxuIFxcbkBAIC0yNDMzLDYgKzI1NTQsNyBAQCBzdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zblxcbiBcXG4gc3RhdGljIHZvaWQgKmh0YWJfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB1MzIgY3B1KVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFxuIFxcdGlmIChjcHUgXFx1MDAzZT0gbnJfY3B1X2lkcylcXG5AQCAtMjQ0MCwxOCArMjU2MiwxOSBAQCBzdGF0aWMgdm9pZCAqaHRhYl9wZXJjcHVfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcbiBcXHRsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7XFxuIFxcdGlmIChsKVxcbi1cXHRcXHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSksIGNwdSk7XFxuK1xcdFxcdHJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKSwgY3B1KTtcXG4gXFx0ZWxzZVxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xcbiBcXG4gXFx0aWYgKGwpIHtcXG4tXFx0XFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXFx1MDAyNmwtXFx1MDAzZWxydV9ub2RlKTtcXG4tXFx0XFx0cmV0dXJuIHRoaXNfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXFx1MDAzZWtleV9zaXplKSk7XFxuK1xcdFxcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsKSk7XFxuK1xcdFxcdHJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCkpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMjQ1OSw2ICsyNTgyLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiBcXG4gc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdTMyIGNwdSlcXG4ge1xcbitcXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XFxuIFxcdHN0cnVjdCBodGFiX2VsZW0gKmw7XFxuIFxcbiBcXHRpZiAoY3B1IFxcdTAwM2U9IG5yX2NwdV9pZHMpXFxuQEAgLTI0NjYsOCArMjU5MCw4IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprXFxuIFxcbiBcXHRsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7XFxuIFxcdGlmIChsKSB7XFxuLVxcdFxcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFxcdTAwMjZsLVxcdTAwM2VscnVfbm9kZSk7XFxuLVxcdFxcdHJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXFx1MDAzZWtleV9zaXplKSwgY3B1KTtcXG4rXFx0XFx0YnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTtcXG4rXFx0XFx0cmV0dXJuIHBlcl9jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpLCBjcHUpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMjQ3NSw2ICsyNTk5LDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtcXG4gXFxuIGludCBicGZfcGVyY3B1X2hhc2hfY29weShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLCB1NjQgbWFwX2ZsYWdzKVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcXG4gXFx0aW50IHJldCA9IC1FTk9FTlQ7XFxuQEAgLTI0OTQsNyArMjYxOSw3IEBAIGludCBicGZfcGVyY3B1X2hhc2hfY29weShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLCB1NjQgbWFwX2ZsXFxuIFxcdC8qIFdlIGRvIG5vdCBtYXJrIExSVSBtYXAgZWxlbWVudCBoZXJlIGluIG9yZGVyIHRvIG5vdCBtZXNzIHVwXFxuIFxcdCAqIGV2aWN0aW9uIGhldXJpc3RpY3Mgd2hlbiB1c2VyIHNwYWNlIGRvZXMgYSBtYXAgd2Fsay5cXG4gXFx0ICovXFxuLVxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXFx1MDAzZWtleV9zaXplKTtcXG4rXFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xcbiBcXHRpZiAobWFwX2ZsYWdzIFxcdTAwMjYgQlBGX0ZfQ1BVKSB7XFxuIFxcdFxcdGNwdSA9IG1hcF9mbGFncyBcXHUwMDNlXFx1MDAzZSAzMjtcXG4gXFx0XFx0Y29weV9tYXBfdmFsdWUobWFwLCB2YWx1ZSwgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7XFxuQEAgLTI1MzIsNiArMjY1Nyw3IEBAIGludCBicGZfcGVyY3B1X2hhc2hfdXBkYXRlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuIHN0YXRpYyB2b2lkIGh0YWJfcGVyY3B1X21hcF9zZXFfc2hvd19lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcXG4gXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pXFxuIHtcXG4rXFx0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xcbiBcXHRzdHJ1Y3QgaHRhYl9lbGVtICpsO1xcbiBcXHR2b2lkIF9fcGVyY3B1ICpwcHRyO1xcbiBcXHRpbnQgY3B1O1xcbkBAIC0yNTQ2LDcgKzI2NzIsNyBAQCBzdGF0aWMgdm9pZCBodGFiX3BlcmNwdV9tYXBfc2VxX3Nob3dfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcbiBcXHRidGZfdHlwZV9zZXFfc2hvdyhtYXAtXFx1MDAzZWJ0ZiwgbWFwLVxcdTAwM2VidGZfa2V5X3R5cGVfaWQsIGtleSwgbSk7XFxuIFxcdHNlcV9wdXRzKG0sIFxcXCI6IHtcXFxcblxcXCIpO1xcbi1cXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcXG4gXFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xcbiBcXHRcXHRzZXFfcHJpbnRmKG0sIFxcXCJcXFxcdGNwdSVkOiBcXFwiLCBjcHUpO1xcbiBcXHRcXHRidGZfdHlwZV9zZXFfc2hvdyhtYXAtXFx1MDAzZWJ0ZiwgbWFwLVxcdTAwM2VidGZfdmFsdWVfdHlwZV9pZCxcXG5AQCAtMjYxOSw4ICsyNzQ1LDggQEAgc3RhdGljIHZvaWQgZmRfaHRhYl9tYXBfZnJlZShzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaHRhYi1cXHUwMDNlbl9idWNrZXRzOyBpKyspIHtcXG4gXFx0XFx0aGVhZCA9IHNlbGVjdF9idWNrZXQoaHRhYiwgaSk7XFxuIFxcbi1cXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xcbi1cXHRcXHRcXHR2b2lkICpwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7XFxuK1xcdFxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcXG4rXFx0XFx0XFx0dm9pZCAqcHRyID0gZmRfaHRhYl9tYXBfZ2V0X3B0cihodGFiLCBsKTtcXG4gXFxuIFxcdFxcdFxcdG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZmRfcHV0X3B0cihtYXAsIHB0ciwgZmFsc2UpO1xcbiBcXHRcXHR9XFxuQEAgLTI3MDUsNiArMjgzMSw3IEBAIHN0YXRpYyB2b2lkICpodGFiX29mX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXFxuIHN0YXRpYyBpbnQgaHRhYl9vZl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHRcXHQgIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXFxuIHtcXG4rXFx0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xcbiBcXHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjtcXG4gXFx0Y29uc3QgaW50IHJldCA9IEJQRl9SRUdfMDtcXG4gXFxuQEAgLTI3MTMsNyArMjg0MCw3IEBAIHN0YXRpYyBpbnQgaHRhYl9vZl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHQqaW5zbisrID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTtcXG4gXFx0Kmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIHJldCwgMCwgMik7XFxuIFxcdCppbnNuKysgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCxcXG4tXFx0XFx0XFx0XFx0b2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwga2V5KSArXFxuK1xcdFxcdFxcdFxcdGh0YWItXFx1MDAzZWtleV9vZmZzZXQgK1xcbiBcXHRcXHRcXHRcXHRyb3VuZF91cChtYXAtXFx1MDAzZWtleV9zaXplLCA4KSk7XFxuIFxcdCppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRFcsIHJldCwgcmV0LCAwKTtcXG4gXFxuQEAgLTMxMTIsNyArMzIzOSw3IEBAIHN0YXRpYyBpbnQgcmh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuIHtcXG4gXFx0c3RydWN0IGJwZl9yaHRhYiAqcmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX3JodGFiLCBtYXApO1xcbiBcXG4tXFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFxcdTAwMjZyaHRhYi1cXHUwMDNlbWEsIHJodGFiX21lbV9kdG9yKTtcXG4rXFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFxcdTAwMjZyaHRhYi1cXHUwMDNlbWEsIHJodGFiX21lbV9kdG9yLCBvZmZzZXRvZihzdHJ1Y3Qgcmh0YWJfZWxlbSwgZGF0YSkpO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCByaHRhYl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXApXFxuQEAgLTM1MzMsMyArMzY2MCwxNiBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgcmh0YWJfbWFwX29wcyA9IHtcXG4gXFx0Lm1hcF9idGZfaWQgPSBcXHUwMDI2cmh0YWJfbWFwX2J0Zl9pZHNbMF0sXFxuIFxcdC5pdGVyX3NlcV9pbmZvID0gXFx1MDAyNnJoYXNoX2l0ZXJfc2VxX2luZm8sXFxuIH07XFxuK1xcbitzaXplX3QgYnBmX2h0YWJfbWFwX21ldGFfc2l6ZSh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9odGFiKTtcXG4rfVxcbitcXG4rdm9pZCBicGZfaHRhYl9tYXBfbWV0YV9pbml0KHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2h0YWIgKmlubmVyX2h0YWJfbWV0YSA9IGNvbnRhaW5lcl9vZihpbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xcbitcXHRzdHJ1Y3QgYnBmX2h0YWIgKmlubmVyX2h0YWIgPSBjb250YWluZXJfb2YoaW5uZXJfbWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XFxuK1xcbitcXHRpbm5lcl9odGFiX21ldGEtXFx1MDAzZWtleV9vZmZzZXQgPSBpbm5lcl9odGFiLVxcdTAwM2VrZXlfb2Zmc2V0O1xcbit9XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5jIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcXG5pbmRleCBkMmNiYWI0YmRmNjQ0Li5iMmRiNWQwYzk4YmVlIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5jXFxuKysrIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcXG5AQCAtNyw2ICs3LDE1IEBAXFxuIFxcbiAjaW5jbHVkZSBcXFwibWFwX2luX21hcC5oXFxcIlxcbiBcXG4rc3RhdGljIGJvb2wgYnBmX21hcF90eXBlX2lzX2h0YWIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSlcXG4re1xcbitcXHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSCB8fFxcbitcXHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0ggfHxcXG4rXFx0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0xSVV9IQVNIIHx8XFxuK1xcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9MUlVfUEVSQ1BVX0hBU0ggfHxcXG4rXFx0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUztcXG4rfVxcbitcXG4gc3RydWN0IGJwZl9tYXAgKmJwZl9tYXBfbWV0YV9hbGxvYyhpbnQgaW5uZXJfbWFwX3VmZClcXG4ge1xcbiBcXHRzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwLCAqaW5uZXJfbWFwX21ldGE7XFxuQEAgLTI5LDYgKzM4LDggQEAgc3RydWN0IGJwZl9tYXAgKmJwZl9tYXBfbWV0YV9hbGxvYyhpbnQgaW5uZXJfbWFwX3VmZClcXG4gXFx0LyogSW4gc29tZSBjYXNlcyB2ZXJpZmllciBuZWVkcyB0byBhY2Nlc3MgYmV5b25kIGp1c3QgYmFzZSBtYXAuICovXFxuIFxcdGlmIChpbm5lcl9tYXAtXFx1MDAzZW9wcyA9PSBcXHUwMDI2YXJyYXlfbWFwX29wcyB8fCBpbm5lcl9tYXAtXFx1MDAzZW9wcyA9PSBcXHUwMDI2cGVyY3B1X2FycmF5X21hcF9vcHMpXFxuIFxcdFxcdGlubmVyX21hcF9tZXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGJwZl9hcnJheSk7XFxuK1xcdGVsc2UgaWYgKGJwZl9tYXBfdHlwZV9pc19odGFiKGlubmVyX21hcC1cXHUwMDNlbWFwX3R5cGUpKVxcbitcXHRcXHRpbm5lcl9tYXBfbWV0YV9zaXplID0gYnBmX2h0YWJfbWFwX21ldGFfc2l6ZSgpO1xcbiBcXG4gXFx0aW5uZXJfbWFwX21ldGEgPSBremFsbG9jKGlubmVyX21hcF9tZXRhX3NpemUsIEdGUF9VU0VSKTtcXG4gXFx0aWYgKCFpbm5lcl9tYXBfbWV0YSlcXG5AQCAtNzAsNiArODEsOCBAQCBzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKVxcbiBcXHRcXHRpbm5lcl9hcnJheV9tZXRhLVxcdTAwM2VpbmRleF9tYXNrID0gaW5uZXJfYXJyYXktXFx1MDAzZWluZGV4X21hc2s7XFxuIFxcdFxcdGlubmVyX2FycmF5X21ldGEtXFx1MDAzZWVsZW1fc2l6ZSA9IGlubmVyX2FycmF5LVxcdTAwM2VlbGVtX3NpemU7XFxuIFxcdFxcdGlubmVyX21hcF9tZXRhLVxcdTAwM2VieXBhc3Nfc3BlY192MSA9IGlubmVyX21hcC1cXHUwMDNlYnlwYXNzX3NwZWNfdjE7XFxuK1xcdH0gZWxzZSBpZiAoYnBmX21hcF90eXBlX2lzX2h0YWIoaW5uZXJfbWFwLVxcdTAwM2VtYXBfdHlwZSkpIHtcXG4rXFx0XFx0YnBmX2h0YWJfbWFwX21ldGFfaW5pdChpbm5lcl9tYXBfbWV0YSwgaW5uZXJfbWFwKTtcXG4gXFx0fVxcbiBcXHRyZXR1cm4gaW5uZXJfbWFwX21ldGE7XFxuIH1cXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmggYi9rZXJuZWwvYnBmL21hcF9pbl9tYXAuaFxcbmluZGV4IDdkNjE2MDIzNTRkZTguLjFlZGMyMDU3NzJkOGMgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmhcXG4rKysgYi9rZXJuZWwvYnBmL21hcF9pbl9tYXAuaFxcbkBAIC0xNSw1ICsxNSw3IEBAIHZvaWQgKmJwZl9tYXBfZmRfZ2V0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgZmlsZSAqbWFwX2ZpbGUsXFxuIFxcdFxcdFxcdCBpbnQgdWZkKTtcXG4gdm9pZCBicGZfbWFwX2ZkX3B1dF9wdHIoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqcHRyLCBib29sIG5lZWRfZGVmZXIpO1xcbiB1MzIgYnBmX21hcF9mZF9zeXNfbG9va3VwX2VsZW0odm9pZCAqcHRyKTtcXG4rc2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZCk7XFxuK3ZvaWQgYnBmX2h0YWJfbWFwX21ldGFfaW5pdChzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwX21ldGEsIHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXApO1xcbiBcXG4gI2VuZGlmXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tYXBfcHRyX2tlcm4uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tYXBfcHRyX2tlcm4uY1xcbmluZGV4IDM3M2M4ZDE3ZWE1NTcuLjZiZDRjYjY4YzIwYzEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jXFxuQEAgLTExNCw3ICsxMTQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBjaGVja19oYXNoKHZvaWQpXFxuIFxcdFZFUklGWShjaGVja19kZWZhdWx0X25vaW5saW5lKFxcdTAwMjZoYXNoLVxcdTAwM2VtYXAsIG1hcCkpO1xcbiBcXG4gXFx0VkVSSUZZKGhhc2gtXFx1MDAzZW5fYnVja2V0cyA9PSBNQVhfRU5UUklFUyk7XFxuLVxcdFZFUklGWShoYXNoLVxcdTAwM2VlbGVtX3NpemUgPT0gNjQpO1xcbitcXHRWRVJJRlkoaGFzaC1cXHUwMDNlZWxlbV9zaXplID09IDMyKTtcXG4gXFxuIFxcdFZFUklGWShoYXNoLVxcdTAwM2Vjb3VudC5jb3VudGVyID09IDApO1xcbiBcXHRWRVJJRlkoYnBmX21hcF9zdW1fZWxlbV9jb3VudChtYXApID09IDApO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjoyNC4zNzM0MTkxOTVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo0MzQ2ODg4MDk5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImh0YWJfbWFwX2FsbG9jXCIsXG4gICAgXCJodGFiX21hcF91cGRhdGVfZWxlbVwiLFxuICAgIFwiaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtXCIsXG4gICAgXCJodGFiX21hcF9sb29rdXBfZWxlbVwiLFxuICAgIFwiaHRhYl9tYXBfZGVsZXRlX2VsZW1cIixcbiAgICBcImJwZl9tYXBfbWV0YV9hbGxvY1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9wdGltaXplcyB0aGUgbWVtb3J5IGxheW91dCBvZiBCUEYgaGFzaCBtYXAgZWxlbWVudHMgYnkgY29uZGl0aW9uYWxseSBvbWl0dGluZyB0aGUgaGFzaCB2YWx1ZSBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBUaGlzIGFmZmVjdHMgY29yZSBCUEYgaGFzaCBtYXAgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24uIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBtZW1vcnkgbGF5b3V0IGFuZCB0aGF0IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIG9jY3VyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2NDU0YTExYzAzZGZhZWRiNGIwOWY4NTc1YWY4ZDAzNjM5ZmI1MjczXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBBdWcgNSAyMjo1MjoyMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGFzaHRhYi5jIGIva2VybmVsL2JwZi9oYXNodGFiLmNcbmluZGV4IDlmMzk0ZTFhYTJlODUuLjk5NjcyNjhkNDUzZDAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2hhc2h0YWIuY1xuKysrIGIva2VybmVsL2JwZi9oYXNodGFiLmNcbkBAIC0xMDAsMTMgKzEwMCwxNiBAQCBzdHJ1Y3QgYnBmX2h0YWIge1xuIFx0c3RydWN0IHBlcmNwdV9jb3VudGVyIHBjb3VudDtcbiBcdGF0b21pY190IGNvdW50O1xuIFx0Ym9vbCB1c2VfcGVyY3B1X2NvdW50ZXI7XG4rXHRib29sIGhhc19oYXNoO1xuIFx0dTMyIG5fYnVja2V0cztcdC8qIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgKi9cbiBcdHUzMiBlbGVtX3NpemU7XHQvKiBzaXplIG9mIGVhY2ggZWxlbWVudCBpbiBieXRlcyAqL1xuK1x0dTMyIGtleV9vZmZzZXQ7XHQvKiBvZmZzZXQgb2Yga2V5IGluIGJ5dGVzICovXG4gXHR1MzIgaGFzaHJuZDtcbiB9O1xuIFxuIC8qIGVhY2ggaHRhYiBlbGVtZW50IGlzIHN0cnVjdCBodGFiX2VsZW0gKyBrZXkgKyB2YWx1ZSAqL1xuLXN0cnVjdCBodGFiX2VsZW0ge1xuK3N0cnVjdCBodGFiX2VsZW07XG4rc3RydWN0IGh0YWJfbm9kZSB7XG4gXHR1bmlvbiB7XG4gXHRcdHN0cnVjdCBobGlzdF9udWxsc19ub2RlIGhhc2hfbm9kZTtcbiBcdFx0c3RydWN0IHtcbkBAIC0xMTcsMTggKzEyMCwzMiBAQCBzdHJ1Y3QgaHRhYl9lbGVtIHtcbiBcdFx0XHR9O1xuIFx0XHR9O1xuIFx0fTtcbi1cdHVuaW9uIHtcbi1cdFx0LyogcG9pbnRlciB0byBwZXItY3B1IHBvaW50ZXIgKi9cbi1cdFx0dm9pZCAqcHRyX3RvX3BwdHI7XG4tXHRcdHN0cnVjdCBicGZfbHJ1X25vZGUgbHJ1X25vZGU7XG4tXHR9O1xuLVx0dTMyIGhhc2g7XG4tXHRjaGFyIGtleVtdIF9fYWxpZ25lZCg4KTtcbit9O1xuK1xuK3N0cnVjdCBodGFiX2VsZW0ge1xuK1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuK1x0dTggZGF0YVtdIF9fYWxpZ25lZCg4KTtcbit9O1xuK1xuK3N0cnVjdCBodGFiX2VsZW1fbHJ1IHtcbitcdHN0cnVjdCBodGFiX25vZGUgbm9kZTtcbitcdHN0cnVjdCBicGZfbHJ1X25vZGUgbHJ1X25vZGU7XG4rXHR1OCBkYXRhW10gX19hbGlnbmVkKDgpO1xuK307XG4rXG4rLyogT25seSBmb3Igbm9uLXByZWFsbG9jYXRlZCBQQ1BVIG1hcHMuIFByZWFsbG9jYXRlZCBQQ1BVIG1hcHMgZG9uJ3QgbmVlZFxuKyAqIHB0cl90b19wcHRyLCBhbmQgdXNlIGh0YWJfZWxlbS5cbisgKi9cbitzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUge1xuK1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuK1x0dm9pZCAqcHRyX3RvX3BwdHI7XG4rXHR1OCBkYXRhW10gX19hbGlnbmVkKDgpO1xuIH07XG4gXG4gc3RydWN0IGh0YWJfYnRmX3JlY29yZCB7XG4gXHRzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjb3JkO1xuIFx0dTMyIGtleV9zaXplO1xuK1x0dTMyIGtleV9vZmZzZXQ7XG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9pc19wcmVhbGxvYyhjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG5AQCAtMTM2LDYgKzE1MywyMSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9pc19wcmVhbGxvYyhjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRyZXR1cm4gIShodGFiLVx1MDAzZW1hcC5tYXBfZmxhZ3MgXHUwMDI2IEJQRl9GX05PX1BSRUFMTE9DKTtcbiB9XG4gXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2xydV9ub2RlICpodGFiX2VsZW1fbHJ1X25vZGUoc3RydWN0IGh0YWJfZWxlbSAqbClcbit7XG4rXHRyZXR1cm4gXHUwMDI2KChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLVx1MDAzZWxydV9ub2RlO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgKmh0YWJfZWxlbV9nZXRfcHRyX3RvX3BwdHIoc3RydWN0IGh0YWJfZWxlbSAqbClcbit7XG4rXHRyZXR1cm4gKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VwdHJfdG9fcHB0cjtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyX3RvX3BwdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdm9pZCAqcHRyKVxuK3tcbitcdCgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktXHUwMDNlcHRyX3RvX3BwdHIgPSBwdHI7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIGh0YWJfaW5pdF9idWNrZXRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiB7XG4gXHR1bnNpZ25lZCBpbnQgaTtcbkBAIC0xODMsMjUgKzIxNSwzMCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgaXNfZmRfaHRhYihjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRyZXR1cm4gaHRhYi1cdTAwM2VtYXAubWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUztcbiB9XG4gXG4tc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplKVxuK3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX2tleShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4re1xuK1x0cmV0dXJuICh2b2lkICopbCArIGh0YWItXHUwMDNla2V5X29mZnNldDtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiBsLVx1MDAzZWtleSArIHJvdW5kX3VwKGtleV9zaXplLCA4KTtcbitcdHJldHVybiBodGFiX2VsZW1fa2V5KGh0YWIsIGwpICsgcm91bmRfdXAoaHRhYi1cdTAwM2VtYXAua2V5X3NpemUsIDgpO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplLFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBodGFiX2VsZW1fc2V0X3B0cihzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwsXG4gXHRcdFx0XHQgICAgIHZvaWQgX19wZXJjcHUgKnBwdHIpXG4ge1xuLVx0Kih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShsLCBrZXlfc2l6ZSkgPSBwcHRyO1xuK1x0Kih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShodGFiLCBsKSA9IHBwdHI7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BlcmNwdSAqaHRhYl9lbGVtX2dldF9wdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplKVxuK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BlcmNwdSAqaHRhYl9lbGVtX2dldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGwsIGtleV9zaXplKTtcbitcdHJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCAqZmRfaHRhYl9tYXBfZ2V0X3B0cihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuK3N0YXRpYyB2b2lkICpmZF9odGFiX21hcF9nZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcbiB7XG4tXHRyZXR1cm4gKih2b2lkICoqKWh0YWJfZWxlbV92YWx1ZShsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0cmV0dXJuICoodm9pZCAqKilodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpnZXRfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgaW50IGkpXG5AQCAtMjA5LDYgKzI0NiwzMyBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqZ2V0X2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIGludCBpKVxuIFx0cmV0dXJuIChzdHJ1Y3QgaHRhYl9lbGVtICopIChodGFiLVx1MDAzZWVsZW1zICsgaSAqICh1NjQpaHRhYi1cdTAwM2VlbGVtX3NpemUpO1xuIH1cbiBcbitzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9oYXNfaGFzaChjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4re1xuK1x0cmV0dXJuIGh0YWItXHUwMDNlaGFzX2hhc2g7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdTMyIGh0YWJfZWxlbV9oYXNoKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcbit7XG4rXHRpZiAoaHRhYl9pc19scnUoaHRhYikpXG4rXHRcdHJldHVybiAqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS1cdTAwM2VkYXRhO1xuK1x0ZWxzZSBpZiAoaHRhYl9pc19wZXJjcHUoaHRhYikgXHUwMDI2XHUwMDI2ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKVxuK1x0XHRyZXR1cm4gKih1MzIgKikoKHN0cnVjdCBodGFiX2VsZW1fcGNwdSAqKWwpLVx1MDAzZWRhdGE7XG4rXHRlbHNlXG4rXHRcdHJldHVybiAqKHUzMiAqKWwtXHUwMDNlZGF0YTtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfaGFzaChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBoYXNoKVxuK3tcbitcdGlmICghaHRhYl9oYXNfaGFzaChodGFiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuK1x0XHQqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS1cdTAwM2VkYXRhID0gaGFzaDtcbitcdGVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpIFx1MDAyNlx1MDAyNiAhaHRhYl9pc19wcmVhbGxvYyhodGFiKSlcbitcdFx0Kih1MzIgKikoKHN0cnVjdCBodGFiX2VsZW1fcGNwdSAqKWwpLVx1MDAzZWRhdGEgPSBoYXNoO1xuK1x0ZWxzZVxuK1x0XHQqKHUzMiAqKWwtXHUwMDNlZGF0YSA9IGhhc2g7XG4rfVxuK1xuIC8qIEJvdGggcGVyY3B1IGFuZCBmZCBodGFiIHN1cHBvcnQgaW4tcGxhY2UgdXBkYXRlLCBzbyBubyBuZWVkIGZvclxuICAqIGV4dHJhIGVsZW0uIExSVSBpdHNlbGYgY2FuIHJlbW92ZSB0aGUgbGVhc3QgdXNlZCBlbGVtZW50LCBzb1xuICAqIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFuIGV4dHJhIGVsZW0gZHVyaW5nIG1hcF91cGRhdGUuXG5AQCAtMjMxLDcgKzI5NSw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFxuIFx0XHRlbGVtID0gZ2V0X2h0YWJfZWxlbShodGFiLCBpKTtcbiBcdFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xuK1x0XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSkpO1xuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdH1cbiB9XG5AQCAtMjU0LDcgKzMxOCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXG4gXHRcdGVsZW0gPSBnZXRfaHRhYl9lbGVtKGh0YWIsIGkpO1xuIFx0XHRpZiAoaHRhYl9pc19wZXJjcHUoaHRhYikpIHtcbi1cdFx0XHR2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUpO1xuK1x0XHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcbiBcdFx0XHRpbnQgY3B1O1xuIFxuIFx0XHRcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbkBAIC0yNjMsNyArMzI3LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX3ByZWFsbG9jZWRfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0YnBmX29ial9mcmVlX2ZpZWxkcyhodGFiLVx1MDAzZW1hcC5yZWNvcmQsXG4tXHRcdFx0XHRcdCAgICBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUpKTtcbitcdFx0XHRcdFx0ICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBlbGVtKSk7XG4gXHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4gXHRcdH1cbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG5AQCAtMjgwLDggKzM0NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBodGFiLVx1MDAzZW1hcC5tYXhfZW50cmllczsgaSsrKSB7XG4gXHRcdHZvaWQgX19wZXJjcHUgKnBwdHI7XG4gXG4tXHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihnZXRfaHRhYl9lbGVtKGh0YWIsIGkpLFxuLVx0XHRcdFx0XHQgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUpO1xuK1x0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZ2V0X2h0YWJfZWxlbShodGFiLCBpKSk7XG4gXHRcdGZyZWVfcGVyY3B1KHBwdHIpO1xuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdH1cbkBAIC0zMDgsOCArMzcxLDggQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKnByZWFsbG9jX2xydV9wb3Aoc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksXG4gXG4gXHRpZiAobm9kZSkge1xuIFx0XHRicGZfbWFwX2luY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbi1cdFx0bCA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSk7XG4tXHRcdG1lbWNweShsLVx1MDAzZWtleSwga2V5LCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4rXHRcdGwgPSAoc3RydWN0IGh0YWJfZWxlbSAqKWNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpO1xuK1x0XHRtZW1jcHkoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4gXHRcdHJldHVybiBsO1xuIFx0fVxuIFxuQEAgLTM0MCw4ICs0MDMsNyBAQCBzdGF0aWMgaW50IHByZWFsbG9jX2luaXQoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0XHRcdFx0XHQgICAgR0ZQX1VTRVIgfCBfX0dGUF9OT1dBUk4pO1xuIFx0XHRpZiAoIXBwdHIpXG4gXHRcdFx0Z290byBmcmVlX2VsZW1zO1xuLVx0XHRodGFiX2VsZW1fc2V0X3B0cihnZXRfaHRhYl9lbGVtKGh0YWIsIGkpLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSxcbi1cdFx0XHRcdCAgcHB0cik7XG4rXHRcdGh0YWJfZWxlbV9zZXRfcHRyKGh0YWIsIGdldF9odGFiX2VsZW0oaHRhYiwgaSksIHBwdHIpO1xuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdH1cbiBcbkBAIC0zNDksOCArNDExLDggQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdGlmIChodGFiX2lzX2xydShodGFiKSlcbiBcdFx0ZXJyID0gYnBmX2xydV9pbml0KFx1MDAyNmh0YWItXHUwMDNlbHJ1LFxuIFx0XHRcdFx0ICAgaHRhYi1cdTAwM2VtYXAubWFwX2ZsYWdzIFx1MDAyNiBCUEZfRl9OT19DT01NT05fTFJVLFxuLVx0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaCkgLVxuLVx0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpLFxuK1x0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGRhdGEpIC1cbitcdFx0XHRcdCAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSksXG4gXHRcdFx0XHQgICBodGFiX2xydV9tYXBfZGVsZXRlX25vZGUsXG4gXHRcdFx0XHQgICBodGFiKTtcbiBcdGVsc2VcbkBAIC0zNjEsMTEgKzQyMywxMSBAQCBzdGF0aWMgaW50IHByZWFsbG9jX2luaXQoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFxuIFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuIFx0XHRicGZfbHJ1X3BvcHVsYXRlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBodGFiLVx1MDAzZWVsZW1zLFxuLVx0XHRcdFx0IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSxcbitcdFx0XHRcdCBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpLFxuIFx0XHRcdFx0IGh0YWItXHUwMDNlZWxlbV9zaXplLCBudW1fZW50cmllcyk7XG4gXHRlbHNlXG4gXHRcdHBjcHVfZnJlZWxpc3RfcG9wdWxhdGUoXHUwMDI2aHRhYi1cdTAwM2VmcmVlbGlzdCxcbi1cdFx0XHRcdCAgICAgICBodGFiLVx1MDAzZWVsZW1zICsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgZm5vZGUpLFxuK1x0XHRcdFx0ICAgICAgIGh0YWItXHUwMDNlZWxlbXMgKyBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmZub2RlKSxcbiBcdFx0XHRcdCAgICAgICBodGFiLVx1MDAzZWVsZW1fc2l6ZSwgbnVtX2VudHJpZXMpO1xuIFxuIFx0cmV0dXJuIDA7XG5AQCAtNDAxLDcgKzQ2Myw3IEBAIHN0YXRpYyBpbnQgYWxsb2NfZXh0cmFfZWxlbXMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0XHQvKiBwb3Agd2lsbCBzdWNjZWVkLCBzaW5jZSBwcmVhbGxvY19pbml0KClcbiBcdFx0ICogcHJlYWxsb2NhdGVkIGV4dHJhIG51bV9wb3NzaWJsZV9jcHVzIGVsZW1lbnRzXG4gXHRcdCAqL1xuLVx0XHRsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSk7XG4rXHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIG5vZGUuZm5vZGUpO1xuIFx0XHQqcGVyX2NwdV9wdHIocHB0ciwgY3B1KSA9IGxfbmV3O1xuIFx0fVxuIFx0aHRhYi1cdTAwM2VleHRyYV9lbGVtcyA9IHBwdHI7XG5AQCAtNDI1LDggKzQ4Nyw4IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXG4gXHRib29sIHplcm9fc2VlZCA9IChhdHRyLVx1MDAzZW1hcF9mbGFncyBcdTAwMjYgQlBGX0ZfWkVST19TRUVEKTtcbiBcdGludCBudW1hX25vZGUgPSBicGZfbWFwX2F0dHJfbnVtYV9ub2RlKGF0dHIpO1xuIFxuLVx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGZub2RlLm5leHQpICE9XG4tXHRcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlLnBwcmV2KSk7XG4rXHRCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGh0YWJfbm9kZSwgZm5vZGUubmV4dCkgIT1cbitcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBoYXNoX25vZGUucHByZXYpKTtcbiBcbiBcdGlmICh6ZXJvX3NlZWQgXHUwMDI2XHUwMDI2ICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKVxuIFx0XHQvKiBHdWFyZCBhZ2FpbnN0IGxvY2FsIERvUywgYW5kIGRpc2NvdXJhZ2UgcHJvZHVjdGlvbiB1c2UuICovXG5AQCAtNDc2LDcgKzUzOCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfbWVtX2R0b3Iodm9pZCAqb2JqLCB2b2lkICpjdHgpXG4gXHRpZiAoSVNfRVJSX09SX05VTEwoaHJlYy1cdTAwM2VyZWNvcmQpKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRtYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHJlYy1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRtYXBfdmFsdWUgPSAodm9pZCAqKWVsZW0gKyBocmVjLVx1MDAzZWtleV9vZmZzZXQgKyByb3VuZF91cChocmVjLVx1MDAzZWtleV9zaXplLCA4KTtcbiBcdGJwZl9vYmpfZnJlZV9maWVsZHMoaHJlYy1cdTAwM2VyZWNvcmQsIG1hcF92YWx1ZSk7XG4gfVxuIFxuQEAgLTUwMiw3ICs1NjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2R0b3JfY3R4X2ZyZWUodm9pZCAqY3R4KVxuIH1cbiBcbiBzdGF0aWMgaW50IGJwZl9tYV9zZXRfZHRvcihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX21lbV9hbGxvYyAqbWEsXG4tXHRcdFx0ICAgdm9pZCAoKmR0b3IpKHZvaWQgKiwgdm9pZCAqKSlcbitcdFx0XHQgICB2b2lkICgqZHRvcikodm9pZCAqLCB2b2lkICopLCB1MzIga2V5X29mZnNldClcbiB7XG4gXHRzdHJ1Y3QgaHRhYl9idGZfcmVjb3JkICpocmVjO1xuIFx0aW50IGVycjtcbkBAIC01MTUsNiArNTc3LDcgQEAgc3RhdGljIGludCBicGZfbWFfc2V0X2R0b3Ioc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9tZW1fYWxsb2MgKm1hLFxuIFx0aWYgKCFocmVjKVxuIFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdGhyZWMtXHUwMDNla2V5X3NpemUgPSBtYXAtXHUwMDNla2V5X3NpemU7XG4rXHRocmVjLVx1MDAzZWtleV9vZmZzZXQgPSBrZXlfb2Zmc2V0O1xuIFx0aHJlYy1cdTAwM2VyZWNvcmQgPSBidGZfcmVjb3JkX2R1cChtYXAtXHUwMDNlcmVjb3JkKTtcbiBcdGlmIChJU19FUlIoaHJlYy1cdTAwM2VyZWNvcmQpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoaHJlYy1cdTAwM2VyZWNvcmQpO1xuQEAgLTUzNyw5ICs2MDAsOSBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4gXHQgKiBwb3B1bGF0ZWQgaW4gaHRhYl9tYXBfYWxsb2MoKSwgc28gaXQgd2lsbCBhbHdheXMgYXBwZWFyIGFzIE5VTEwuXG4gXHQgKi9cbiBcdGlmIChodGFiX2lzX3BlcmNwdShodGFiKSlcbi1cdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlcGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yKTtcbitcdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlcGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yLCBodGFiLVx1MDAzZWtleV9vZmZzZXQpO1xuIFx0ZWxzZVxuLVx0XHRyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgXHUwMDI2aHRhYi1cdTAwM2VtYSwgaHRhYl9tZW1fZHRvcik7XG4rXHRcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZodGFiLVx1MDAzZW1hLCBodGFiX21lbV9kdG9yLCBodGFiLVx1MDAzZWtleV9vZmZzZXQpO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKVxuQEAgLTU2Miw2ICs2MjUsMTMgQEAgc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcbiBcbiBcdGJwZl9tYXBfaW5pdF9mcm9tX2F0dHIoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGF0dHIpO1xuIFxuK1x0LyogQXZvaWQgaGFzaCBtZW1vcnkgdXNlIGFuZCBjb21wYXJpc29ucyB3aGVyZSB1bm5lY2Vzc2FyeS5cbitcdCAqIHUzMiBoYXNoIHJlYWRzIGFyZSBhbHdheXMgYXRvbWljLiBJZiB3ZSBlbGlkZSB0aGVtLCBrZXkgY29tcGFyaXNvbnMgbXVzdCBhbHNvIGJlIGF0b21pY1xuK1x0ICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUga2V5IG1hdGNoZXMgZHVlIHRvIHRvcm4ga2V5IHJlYWRzIC8gd3JpdGVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGVcbitcdCAqIHdoZW4gdGhlIGtleSBmaXRzIHdpdGhpbiBhIHdvcmQsIHNvIGNoZWNrIGtleV9zaXplLlxuK1x0ICovXG4rXHRodGFiLVx1MDAzZWhhc19oYXNoID0gaHRhYl9pc19scnUoaHRhYikgfHwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUgXHUwMDNlIHNpemVvZih1bnNpZ25lZCBsb25nKTtcbitcbiBcdGlmIChwZXJjcHVfbHJ1KSB7XG4gXHRcdC8qIGVuc3VyZSBlYWNoIENQVSdzIGxydSBsaXN0IGhhcyBcdTAwM2U9MSBlbGVtZW50cy5cbiBcdFx0ICogc2luY2Ugd2UgYXJlIGF0IGl0LCBtYWtlIGVhY2ggbHJ1IGxpc3QgaGFzIHRoZSBzYW1lXG5AQCAtNTgzLDggKzY1MywxNiBAQCBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKVxuIFxuIFx0aHRhYi1cdTAwM2VuX2J1Y2tldHMgPSByb3VuZHVwX3Bvd19vZl90d28oaHRhYi1cdTAwM2VtYXAubWF4X2VudHJpZXMpO1xuIFxuLVx0aHRhYi1cdTAwM2VlbGVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGh0YWJfZWxlbSkgK1xuLVx0XHRcdCAgcm91bmRfdXAoaHRhYi1cdTAwM2VtYXAua2V5X3NpemUsIDgpO1xuK1x0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuK1x0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgZGF0YSkgKyA4O1xuK1x0ZWxzZSBpZiAocGVyY3B1IFx1MDAyNlx1MDAyNiAhcHJlYWxsb2MpXG4rXHRcdGh0YWItXHUwMDNla2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fcGNwdSwgZGF0YSkgK1xuK1x0XHRcdFx0ICAgKGh0YWJfaGFzX2hhc2goaHRhYikgPyA4IDogMCk7XG4rXHRlbHNlXG4rXHRcdGh0YWItXHUwMDNla2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGRhdGEpICtcbitcdFx0XHRcdCAgIChodGFiX2hhc19oYXNoKGh0YWIpID8gOCA6IDApO1xuK1xuK1x0aHRhYi1cdTAwM2VlbGVtX3NpemUgPSBodGFiLVx1MDAzZWtleV9vZmZzZXQgKyByb3VuZF91cChodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSwgOCk7XG4gXHRpZiAocGVyY3B1KVxuIFx0XHRodGFiLVx1MDAzZWVsZW1fc2l6ZSArPSBzaXplb2Yodm9pZCAqKTtcbiBcdGVsc2VcbkBAIC02OTIsMTUgKzc3MCwyOSBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpzZWxlY3RfYnVja2V0KHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdTMyXG4gfVxuIFxuIC8qIHRoaXMgbG9va3VwIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGJ1Y2tldCBsb2NrIHRha2VuICovXG4tc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2gsXG4rc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2gsXG4gXHRcdFx0XHRcdCB2b2lkICprZXksIHUzMiBrZXlfc2l6ZSlcbiB7XG4gXHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4tXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKVxuLVx0XHRpZiAobC1cdTAwM2VoYXNoID09IGhhc2ggXHUwMDI2XHUwMDI2ICFtZW1jbXAoXHUwMDI2bC1cdTAwM2VrZXksIGtleSwga2V5X3NpemUpKVxuLVx0XHRcdHJldHVybiBsO1xuK1x0aWYgKGh0YWJfaGFzX2hhc2goaHRhYikpIHtcbitcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuK1x0XHRcdGlmIChodGFiX2VsZW1faGFzaChodGFiLCBsKSA9PSBoYXNoIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCAgICAhbWVtY21wKGh0YWJfZWxlbV9rZXkoaHRhYiwgbCksIGtleSwga2V5X3NpemUpKVxuK1x0XHRcdFx0cmV0dXJuIGw7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBXaGVuIGhhc2ggaXMgb21pdHRlZCwga2V5IGNvbXBhcmlzb25zIG11c3QgYmUgYXRvbWljLiBaZXJvIGV4dGVuZFxuK1x0XHQgKiB0aGUgY2FsbGVyJ3Mga2V5IHRvIHRoZSB3b3JkIHNpemUgdG8gc3VwcG9ydCBhbiBhdG9taWMgY29tcGFyZS5cbitcdFx0ICovXG4rXHRcdHVuc2lnbmVkIGxvbmcgayA9IDA7XG4rXG4rXHRcdG1lbWNweShcdTAwMjZrLCBrZXksIGtleV9zaXplKTtcbitcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuK1x0XHRcdGlmIChSRUFEX09OQ0UoKih1bnNpZ25lZCBsb25nICopaHRhYl9lbGVtX2tleShodGFiLCBsKSkgPT0gaylcbitcdFx0XHRcdHJldHVybiBsO1xuK1x0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuQEAgLTcwOSw3ICs4MDEsOCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLCB1MzIgaGFzaFxuICAqIHRoZSB1bmxpa2VseSBldmVudCB3aGVuIGVsZW1lbnRzIG1vdmVkIGZyb20gb25lIGJ1Y2tldCBpbnRvIGFub3RoZXJcbiAgKiB3aGlsZSBsaW5rIGxpc3QgaXMgYmVpbmcgd2Fsa2VkXG4gICovXG4tc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCxcbitzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX251bGxzX2VsZW1fcmF3KHN0cnVjdCBicGZfaHRhYiAqaHRhYixcbitcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLFxuIFx0XHRcdFx0XHQgICAgICAgdTMyIGhhc2gsIHZvaWQgKmtleSxcbiBcdFx0XHRcdFx0ICAgICAgIHUzMiBrZXlfc2l6ZSwgdTMyIG5fYnVja2V0cylcbiB7XG5AQCAtNzE3LDkgKzgxMCwyMCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX251bGxzX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLFxuIFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcbiBhZ2Fpbjpcbi1cdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpXG4tXHRcdGlmIChsLVx1MDAzZWhhc2ggPT0gaGFzaCBcdTAwMjZcdTAwMjYgIW1lbWNtcChcdTAwMjZsLVx1MDAzZWtleSwga2V5LCBrZXlfc2l6ZSkpXG4tXHRcdFx0cmV0dXJuIGw7XG4rXHRpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkge1xuK1x0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4rXHRcdFx0aWYgKGh0YWJfZWxlbV9oYXNoKGh0YWIsIGwpID09IGhhc2ggXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgICFtZW1jbXAoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBrZXlfc2l6ZSkpXG4rXHRcdFx0XHRyZXR1cm4gbDtcbitcdH0gZWxzZSB7XG4rXHRcdC8qIFNlZSBsb29rdXBfZWxlbV9yYXcoKSBjb21tZW50IGFib3ZlLiAqL1xuK1x0XHR1bnNpZ25lZCBsb25nIGsgPSAwO1xuK1xuK1x0XHRtZW1jcHkoXHUwMDI2aywga2V5LCBrZXlfc2l6ZSk7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSlcbitcdFx0XHRpZiAoUkVBRF9PTkNFKCoodW5zaWduZWQgbG9uZyAqKWh0YWJfZWxlbV9rZXkoaHRhYiwgbCkpID09IGspXG4rXHRcdFx0XHRyZXR1cm4gbDtcbitcdH1cbiBcbiBcdGlmICh1bmxpa2VseShnZXRfbnVsbHNfdmFsdWUobikgIT0gKGhhc2ggXHUwMDI2IChuX2J1Y2tldHMgLSAxKSkpKVxuIFx0XHRnb3RvIGFnYWluO1xuQEAgLTc0NywxNyArODUxLDE4IEBAIHN0YXRpYyB2b2lkICpfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBcbiBcdGhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGhhc2gpO1xuIFxuLVx0bCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLCBodGFiLVx1MDAzZW5fYnVja2V0cyk7XG4rXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXHUwMDNlbl9idWNrZXRzKTtcbiBcbiBcdHJldHVybiBsO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCAqaHRhYl9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRcdHJldHVybiBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XG4gXG4gXHRyZXR1cm4gTlVMTDtcbiB9XG5AQCAtNzc1LDYgKzg4MCw3IEBAIHN0YXRpYyB2b2lkICpodGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gICovXG4gc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXG4ge1xuK1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XG4gXHRjb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wO1xuIFxuQEAgLTc4Myw3ICs4ODksNyBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiBcdCppbnNuKysgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xuIFx0Kmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIHJldCwgMCwgMSk7XG4gXHQqaW5zbisrID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCByZXQsXG4tXHRcdFx0XHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICtcbitcdFx0XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCArXG4gXHRcdFx0XHRyb3VuZF91cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiBcdHJldHVybiBpbnNuIC0gaW5zbl9idWY7XG4gfVxuQEAgLTc5MSwxMiArODk3LDEzIEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqX19odGFiX2xydV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdFx0XHRcdHZvaWQgKmtleSwgY29uc3QgYm9vbCBtYXJrKVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKSB7XG4gXHRcdGlmIChtYXJrKVxuLVx0XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmwtXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRcdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTtcbitcdFx0cmV0dXJuIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcbiBcdH1cbiBcbiBcdHJldHVybiBOVUxMO1xuQEAgLTgxNSw2ICs5MjIsNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfbWFwX2xvb2t1cF9lbGVtX3N5cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gc3RhdGljIGludCBodGFiX2xydV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0XHRcdFx0ICAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4rXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjtcbiBcdGNvbnN0IGludCByZXQgPSBCUEZfUkVHXzA7XG4gXHRjb25zdCBpbnQgcmVmX3JlZyA9IEJQRl9SRUdfMTtcbkBAIC04MjQsMTUgKzkzMiwxNSBAQCBzdGF0aWMgaW50IGh0YWJfbHJ1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXHQqaW5zbisrID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTtcbiBcdCppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDQpO1xuIFx0Kmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9CLCByZWZfcmVnLCByZXQsXG4tXHRcdFx0ICAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpICtcbitcdFx0XHQgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpICtcbiBcdFx0XHQgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpKTtcbiBcdCppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSk5FLCByZWZfcmVnLCAwLCAxKTtcbiBcdCppbnNuKysgPSBCUEZfU1RfTUVNKEJQRl9CLCByZXQsXG4tXHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSkgK1xuK1x0XHRcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSArXG4gXHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpLFxuIFx0XHRcdCAgICAgMSk7XG4gXHQqaW5zbisrID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCByZXQsXG4tXHRcdFx0XHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICtcbitcdFx0XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCArXG4gXHRcdFx0XHRyb3VuZF91cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiBcdHJldHVybiBpbnNuIC0gaW5zbl9idWY7XG4gfVxuQEAgLTg0NCwxMyArOTUyLDEzIEBAIHN0YXRpYyB2b2lkIGNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYixcbiBcdFx0cmV0dXJuO1xuIFxuIFx0aWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKSB7XG4tXHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4rXHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcbiBcdFx0aW50IGNwdTtcbiBcbiBcdFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSlcbiBcdFx0XHRicGZfb2JqX2NhbmNlbF9maWVsZHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuIFx0fSBlbHNlIHtcbi1cdFx0dm9pZCAqbWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGh0YWItXHUwMDNlbWFwLmtleV9zaXplKTtcbitcdFx0dm9pZCAqbWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pO1xuIFxuIFx0XHRicGZfb2JqX2NhbmNlbF9maWVsZHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIG1hcF92YWx1ZSk7XG4gXHR9XG5AQCAtODY5LDE3ICs5NzcsMTcgQEAgc3RhdGljIGJvb2wgaHRhYl9scnVfbWFwX2RlbGV0ZV9ub2RlKHZvaWQgKmFyZywgc3RydWN0IGJwZl9scnVfbm9kZSAqbm9kZSlcbiBcdHN0cnVjdCBidWNrZXQgKmI7XG4gXHRpbnQgcmV0O1xuIFxuLVx0dGd0X2wgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpO1xuLVx0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCB0Z3RfbC1cdTAwM2VoYXNoKTtcbitcdHRndF9sID0gKHN0cnVjdCBodGFiX2VsZW0gKiljb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKTtcbitcdGIgPSBfX3NlbGVjdF9idWNrZXQoaHRhYiwgaHRhYl9lbGVtX2hhc2goaHRhYiwgdGd0X2wpKTtcbiBcdGhlYWQgPSBcdTAwMjZiLVx1MDAzZWhlYWQ7XG4gXG4gXHRyZXQgPSBodGFiX2xvY2tfYnVja2V0KGIsIFx1MDAyNmZsYWdzKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiBmYWxzZTtcbiBcbi1cdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpXG4rXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4gXHRcdGlmIChsID09IHRndF9sKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4rXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcdFx0XHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuQEAgLTkxMiwxOCArMTAyMCwxOSBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dldF9uZXh0X2tleShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKm5leHRfa2V5KVxuIFx0aGVhZCA9IHNlbGVjdF9idWNrZXQoaHRhYiwgaGFzaCk7XG4gXG4gXHQvKiBsb29rdXAgdGhlIGtleSAqL1xuLVx0bCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLCBodGFiLVx1MDAzZW5fYnVja2V0cyk7XG4rXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXHUwMDNlbl9idWNrZXRzKTtcbiBcbiBcdGlmICghbClcbiBcdFx0Z290byBmaW5kX2ZpcnN0X2VsZW07XG4gXG4gXHQvKiBrZXkgd2FzIGZvdW5kLCBnZXQgbmV4dCBrZXkgaW4gdGhlIHNhbWUgYnVja2V0ICovXG4tXHRuZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXHUwMDI2bC1cdTAwM2VoYXNoX25vZGUpKSxcbi1cdFx0XHRcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcbitcdG5leHRfbCA9IGhsaXN0X251bGxzX2VudHJ5X3NhZmUoXG4rXHRcdFx0cmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKSksXG4rXHRcdFx0c3RydWN0IGh0YWJfZWxlbSwgbm9kZS5oYXNoX25vZGUpO1xuIFxuIFx0aWYgKG5leHRfbCkge1xuIFx0XHQvKiBpZiBuZXh0IGVsZW0gaW4gdGhpcyBoYXNoIGxpc3QgaXMgbm9uLXplcm8sIGp1c3QgcmV0dXJuIGl0ICovXG4tXHRcdG1lbWNweShuZXh0X2tleSwgbmV4dF9sLVx1MDAzZWtleSwga2V5X3NpemUpO1xuK1x0XHRtZW1jcHkobmV4dF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbmV4dF9sKSwga2V5X3NpemUpO1xuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbkBAIC05MzgsMTAgKzEwNDcsMTAgQEAgc3RhdGljIGludCBodGFiX21hcF9nZXRfbmV4dF9rZXkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICpuZXh0X2tleSlcbiBcbiBcdFx0LyogcGljayBmaXJzdCBlbGVtZW50IGluIHRoZSBidWNrZXQgKi9cbiBcdFx0bmV4dF9sID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShyY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX2ZpcnN0X3JjdShoZWFkKSksXG4tXHRcdFx0XHRcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XG4gXHRcdGlmIChuZXh0X2wpIHtcbiBcdFx0XHQvKiBpZiBpdCdzIG5vdCBlbXB0eSwganVzdCByZXR1cm4gaXQgKi9cbi1cdFx0XHRtZW1jcHkobmV4dF9rZXksIG5leHRfbC1cdTAwM2VrZXksIGtleV9zaXplKTtcbitcdFx0XHRtZW1jcHkobmV4dF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbmV4dF9sKSwga2V5X3NpemUpO1xuIFx0XHRcdHJldHVybiAwO1xuIFx0XHR9XG4gXHR9XG5AQCAtOTU1LDcgKzEwNjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2VsZW1fZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4gXHRjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhodGFiLCBsKTtcbiBcbiBcdGlmIChodGFiLVx1MDAzZW1hcC5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0gpXG4tXHRcdGJwZl9tZW1fY2FjaGVfZnJlZShcdTAwMjZodGFiLVx1MDAzZXBjcHVfbWEsIGwtXHUwMDNlcHRyX3RvX3BwdHIpO1xuK1x0XHRicGZfbWVtX2NhY2hlX2ZyZWUoXHUwMDI2aHRhYi1cdTAwM2VwY3B1X21hLCBodGFiX2VsZW1fZ2V0X3B0cl90b19wcHRyKGwpKTtcbiBcdGJwZl9tZW1fY2FjaGVfZnJlZShcdTAwMjZodGFiLVx1MDAzZW1hLCBsKTtcbiB9XG4gXG5AQCAtOTY1LDcgKzEwNzQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX3B1dF9mZF92YWx1ZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4gXHR2b2lkICpwdHI7XG4gXG4gXHRpZiAobWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZmRfcHV0X3B0cikge1xuLVx0XHRwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7XG4rXHRcdHB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIoaHRhYiwgbCk7XG4gXHRcdG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2ZkX3B1dF9wdHIobWFwLCBwdHIsIHRydWUpO1xuIFx0fVxuIH1cbkBAIC0xMDA2LDcgKzExMTUsNyBAQCBzdGF0aWMgdm9pZCBmcmVlX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4gXHRpZiAoaHRhYl9pc19wcmVhbGxvYyhodGFiKSkge1xuIFx0XHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbiBcdFx0Y2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgbCk7XG4tXHRcdHBjcHVfZnJlZWxpc3RfcHVzaChcdTAwMjZodGFiLVx1MDAzZWZyZWVsaXN0LCBcdTAwMjZsLVx1MDAzZWZub2RlKTtcbitcdFx0cGNwdV9mcmVlbGlzdF9wdXNoKFx1MDAyNmh0YWItXHUwMDNlZnJlZWxpc3QsIFx1MDAyNmwtXHUwMDNlbm9kZS5mbm9kZSk7XG4gXHR9IGVsc2Uge1xuIFx0XHRkZWNfZWxlbV9jb3VudChodGFiKTtcbiBcdFx0aHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7XG5AQCAtMTA5Nyw3ICsxMjA2LDcgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcbiBcdFx0XHRsID0gX19wY3B1X2ZyZWVsaXN0X3BvcChcdTAwMjZodGFiLVx1MDAzZWZyZWVsaXN0KTtcbiBcdFx0XHRpZiAoIWwpXG4gXHRcdFx0XHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xuLVx0XHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKTtcbitcdFx0XHRsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmZub2RlKTtcbiBcdFx0XHRicGZfbWFwX2luY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbiBcdFx0fVxuIFx0fSBlbHNlIHtcbkBAIC0xMTE3LDEwICsxMjI2LDIwIEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICphbGxvY19odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksXG4gXHRcdH1cbiBcdH1cbiBcbi1cdG1lbWNweShsX25ldy1cdTAwM2VrZXksIGtleSwga2V5X3NpemUpO1xuK1x0aWYgKGh0YWJfaGFzX2hhc2goaHRhYikpIHtcbitcdFx0bWVtY3B5KGh0YWJfZWxlbV9rZXkoaHRhYiwgbF9uZXcpLCBrZXksIGtleV9zaXplKTtcbitcdH0gZWxzZSB7XG4rXHRcdC8qIFplcm8tZXh0ZW5kIGtleSBpbnRvIGsgZm9yIGFuIGF0b21pYyB3cml0ZSB0byBzdXBwb3J0XG4rXHRcdCAqIGxvY2tsZXNzIFJDVSByZWFkZXJzLlxuK1x0XHQgKi9cbitcdFx0dW5zaWduZWQgbG9uZyBrID0gMDtcbitcbitcdFx0bWVtY3B5KFx1MDAyNmssIGtleSwga2V5X3NpemUpO1xuK1x0XHRXUklURV9PTkNFKCoodW5zaWduZWQgbG9uZyAqKWh0YWJfZWxlbV9rZXkoaHRhYiwgbF9uZXcpLCBrKTtcbitcdH1cbiBcdGlmIChwZXJjcHUpIHtcbiBcdFx0aWYgKHByZWFsbG9jKSB7XG4tXHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSk7XG4rXHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGxfbmV3KTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHQvKiBhbGxvY19wZXJjcHUgemVyby1maWxscyAqL1xuIFx0XHRcdHZvaWQgKnB0ciA9IGJwZl9tZW1fY2FjaGVfYWxsb2MoXHUwMDI2aHRhYi1cdTAwM2VwY3B1X21hKTtcbkBAIC0xMTMwLDI2ICsxMjQ5LDI2IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICphbGxvY19odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksXG4gXHRcdFx0XHRsX25ldyA9IEVSUl9QVFIoLUVOT01FTSk7XG4gXHRcdFx0XHRnb3RvIGRlY19jb3VudDtcbiBcdFx0XHR9XG4tXHRcdFx0bF9uZXctXHUwMDNlcHRyX3RvX3BwdHIgPSBwdHI7XG4rXHRcdFx0aHRhYl9lbGVtX3NldF9wdHJfdG9fcHB0cihsX25ldywgcHRyKTtcbiBcdFx0XHRwcHRyID0gKih2b2lkIF9fcGVyY3B1ICoqKXB0cjtcbiBcdFx0fVxuIFxuIFx0XHRwY3B1X2luaXRfdmFsdWUoaHRhYiwgcHB0ciwgdmFsdWUsIG9uYWxsY3B1cywgbWFwX2ZsYWdzKTtcbiBcbiBcdFx0aWYgKCFwcmVhbGxvYylcbi1cdFx0XHRodGFiX2VsZW1fc2V0X3B0cihsX25ldywga2V5X3NpemUsIHBwdHIpO1xuK1x0XHRcdGh0YWJfZWxlbV9zZXRfcHRyKGh0YWIsIGxfbmV3LCBwcHRyKTtcbiBcdH0gZWxzZSBpZiAoZmRfaHRhYl9tYXBfbmVlZHNfYWRqdXN0KGh0YWIpKSB7XG4gXHRcdHNpemUgPSByb3VuZF91cChzaXplLCA4KTtcbi1cdFx0bWVtY3B5KGh0YWJfZWxlbV92YWx1ZShsX25ldywga2V5X3NpemUpLCB2YWx1ZSwgc2l6ZSk7XG4rXHRcdG1lbWNweShodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSwgc2l6ZSk7XG4gXHR9IGVsc2UgaWYgKG1hcF9mbGFncyBcdTAwMjYgQlBGX0ZfTE9DSykge1xuIFx0XHRjb3B5X21hcF92YWx1ZV9sb2NrZWQoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSxcbitcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksXG4gXHRcdFx0XHQgICAgICB2YWx1ZSwgZmFsc2UpO1xuIFx0fSBlbHNlIHtcbi1cdFx0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShsX25ldywga2V5X3NpemUpLCB2YWx1ZSk7XG4rXHRcdGNvcHlfbWFwX3ZhbHVlKFx1MDAyNmh0YWItXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSk7XG4gXHR9XG4gXG4tXHRsX25ldy1cdTAwM2VoYXNoID0gaGFzaDtcbitcdGh0YWJfZWxlbV9zZXRfaGFzaChodGFiLCBsX25ldywgaGFzaCk7XG4gXHRyZXR1cm4gbF9uZXc7XG4gZGVjX2NvdW50OlxuIFx0ZGVjX2VsZW1fY291bnQoaHRhYik7XG5AQCAtMTE5OSw3ICsxMzE4LDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBcdFx0aWYgKHVubGlrZWx5KCFidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXHUwMDNlcmVjb3JkLCBCUEZfU1BJTl9MT0NLKSkpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdC8qIGZpbmQgYW4gZWxlbWVudCB3aXRob3V0IHRha2luZyB0aGUgYnVja2V0IGxvY2sgKi9cbi1cdFx0bF9vbGQgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSxcbitcdFx0bF9vbGQgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSxcbiBcdFx0XHRcdFx0ICAgICAgaHRhYi1cdTAwM2VuX2J1Y2tldHMpO1xuIFx0XHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcbiBcdFx0aWYgKHJldClcbkBAIC0xMjA3LDcgKzEzMjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0XHRpZiAobF9vbGQpIHtcbiBcdFx0XHQvKiBncmFiIHRoZSBlbGVtZW50IGxvY2sgYW5kIHVwZGF0ZSB2YWx1ZSBpbiBwbGFjZSAqL1xuIFx0XHRcdGNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsXG4tXHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpLFxuK1x0XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0XHQgICAgICB2YWx1ZSwgZmFsc2UpO1xuIFx0XHRcdHJldHVybiAwO1xuIFx0XHR9XG5AQCAtMTIyMSw3ICsxMzQwLDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG4tXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbitcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuQEAgLTEyMzUsNyArMTM1NCw3IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHRcdCAqIGFuZCB1cGRhdGUgZWxlbWVudCBpbiBwbGFjZVxuIFx0XHQgKi9cbiBcdFx0Y29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCxcbi1cdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpLFxuK1x0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKSxcbiBcdFx0XHRcdCAgICAgIHZhbHVlLCBmYWxzZSk7XG4gXHRcdHJldCA9IDA7XG4gXHRcdGdvdG8gZXJyO1xuQEAgLTEyNTIsOSArMTM3MSw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHQvKiBhZGQgbmV3IGVsZW1lbnQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXRcbiBcdCAqIGNvbmN1cnJlbnQgc2VhcmNoIHdpbGwgZmluZCBpdCBiZWZvcmUgb2xkIGVsZW1cbiBcdCAqL1xuLVx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZWhhc2hfbm9kZSwgaGVhZCk7XG4rXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlbm9kZS5oYXNoX25vZGUsIGhlYWQpO1xuIFx0aWYgKGxfb2xkKSB7XG4tXHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bF9vbGQtXHUwMDNlaGFzaF9ub2RlKTtcbitcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsX29sZC1cdTAwM2Vub2RlLmhhc2hfbm9kZSk7XG4gXG4gXHRcdC8qIGxfb2xkIGhhcyBhbHJlYWR5IGJlZW4gc3Rhc2hlZCBpbiBodGFiLVx1MDAzZWV4dHJhX2VsZW1zLCBjYW5jZWxcbiBcdFx0ICogaXRzIHJldXNhYmxlIHNwZWNpYWwgZmllbGRzIGJlZm9yZSBpdCBpcyBhdmFpbGFibGUgZm9yIHJldXNlLlxuQEAgLTEyNzUsNyArMTM5NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfbHJ1X3B1c2hfZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pXG4ge1xuIFx0Y2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgZWxlbSk7XG4gXHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbi1cdGJwZl9scnVfcHVzaF9mcmVlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBcdTAwMjZlbGVtLVx1MDAzZWxydV9ub2RlKTtcbitcdGJwZl9scnVfcHVzaF9mcmVlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBodGFiX2VsZW1fbHJ1X25vZGUoZWxlbSkpO1xuIH1cbiBcbiBzdGF0aWMgbG9uZyBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbkBAIC0xMzEwLDEzICsxNDI5LDEzIEBAIHN0YXRpYyBsb25nIGh0YWJfbHJ1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlXG4gXHRsX25ldyA9IHByZWFsbG9jX2xydV9wb3AoaHRhYiwga2V5LCBoYXNoKTtcbiBcdGlmICghbF9uZXcpXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuLVx0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShsX25ldywgbWFwLVx1MDAzZWtleV9zaXplKSwgdmFsdWUpO1xuK1x0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksIHZhbHVlKTtcbiBcbiBcdHJldCA9IGh0YWJfbG9ja19idWNrZXQoYiwgXHUwMDI2ZmxhZ3MpO1xuIFx0aWYgKHJldClcbiBcdFx0Z290byBlcnJfbG9ja19idWNrZXQ7XG4gXG4tXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbitcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuQEAgLTEzMjUsMTAgKzE0NDQsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWVcbiBcdC8qIGFkZCBuZXcgZWxlbWVudCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgc28gdGhhdFxuIFx0ICogY29uY3VycmVudCBzZWFyY2ggd2lsbCBmaW5kIGl0IGJlZm9yZSBvbGQgZWxlbVxuIFx0ICovXG4tXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlaGFzaF9ub2RlLCBoZWFkKTtcbitcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2Vub2RlLmhhc2hfbm9kZSwgaGVhZCk7XG4gXHRpZiAobF9vbGQpIHtcbi1cdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXHUwMDI2bF9uZXctXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZWhhc2hfbm9kZSk7XG4rXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsX25ldykpO1xuK1x0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcdH1cbiBcdHJldCA9IDA7XG4gXG5AQCAtMTM4Myw3ICsxNTAyLDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuK1x0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4gXG4gXHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcbiBcdGlmIChyZXQpXG5AQCAtMTM5MiwxMCArMTUxMSwxMCBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXG4gXHRpZiAobF9vbGQpIHtcbiBcdFx0LyogVXBkYXRlIHZhbHVlIGluLXBsYWNlICovXG4gXHRcdGlmIChwZXJjcHUpIHtcbi1cdFx0XHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIobF9vbGQsIGtleV9zaXplKSxcbitcdFx0XHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0XHR2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZvaWQgKippbm5lcl9tYXBfcHB0ciA9IGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpO1xuK1x0XHRcdHZvaWQgKippbm5lcl9tYXBfcHB0ciA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX29sZCk7XG4gXG4gXHRcdFx0b2xkX21hcF9wdHIgPSAqaW5uZXJfbWFwX3BwdHI7XG4gXHRcdFx0V1JJVEVfT05DRSgqaW5uZXJfbWFwX3BwdHIsICoodm9pZCAqKil2YWx1ZSk7XG5AQCAtMTQwNyw3ICsxNTI2LDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0XHRcdHJldCA9IFBUUl9FUlIobF9uZXcpO1xuIFx0XHRcdGdvdG8gZXJyO1xuIFx0XHR9XG4tXHRcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xuK1x0XHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlbm9kZS5oYXNoX25vZGUsIGhlYWQpO1xuIFx0fVxuIGVycjpcbiBcdGh0YWJfdW5sb2NrX2J1Y2tldChiLCBmbGFncyk7XG5AQCAtMTQ1NiwyMiArMTU3NSwyMiBAQCBzdGF0aWMgbG9uZyBfX2h0YWJfbHJ1X3BlcmNwdV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0Z290byBlcnJfbG9ja19idWNrZXQ7XG4gXG4tXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbitcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuIFx0XHRnb3RvIGVycjtcbiBcbiBcdGlmIChsX29sZCkge1xuLVx0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihcdTAwMjZsX29sZC1cdTAwM2VscnVfbm9kZSk7XG4rXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsX29sZCkpO1xuIFxuIFx0XHQvKiBwZXItY3B1IGhhc2ggbWFwIGNhbiB1cGRhdGUgdmFsdWUgaW4tcGxhY2UgKi9cbi1cdFx0cGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfb2xkLCBrZXlfc2l6ZSksXG4rXHRcdHBjcHVfY29weV92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsX29sZCksXG4gXHRcdFx0XHR2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xuIFx0fSBlbHNlIHtcbi1cdFx0cGNwdV9pbml0X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSksXG4rXHRcdHBjcHVfaW5pdF92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsX25ldyksXG4gXHRcdFx0XHR2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xuLVx0XHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlaGFzaF9ub2RlLCBoZWFkKTtcbitcdFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZW5vZGUuaGFzaF9ub2RlLCBoZWFkKTtcbiBcdFx0bF9uZXcgPSBOVUxMO1xuIFx0fVxuIFx0cmV0ID0gMDtcbkBAIC0xNDgwLDcgKzE1OTksNyBAQCBzdGF0aWMgbG9uZyBfX2h0YWJfbHJ1X3BlcmNwdV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIGVycl9sb2NrX2J1Y2tldDpcbiBcdGlmIChsX25ldykge1xuIFx0XHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbi1cdFx0YnBmX2xydV9wdXNoX2ZyZWUoXHUwMDI2aHRhYi1cdTAwM2VscnUsIFx1MDAyNmxfbmV3LVx1MDAzZWxydV9ub2RlKTtcbitcdFx0YnBmX2xydV9wdXNoX2ZyZWUoXHUwMDI2aHRhYi1cdTAwM2VscnUsIGh0YWJfZWxlbV9scnVfbm9kZShsX25ldykpO1xuIFx0fVxuIFx0cmV0dXJuIHJldDtcbiB9XG5AQCAtMTUyMSw5ICsxNjQwLDkgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4rXHRsID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFx0aWYgKGwpXG4tXHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2VoYXNoX25vZGUpO1xuK1x0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xuIFx0ZWxzZVxuIFx0XHRyZXQgPSAtRU5PRU5UO1xuIFxuQEAgLTE1NTYsMTAgKzE2NzUsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG4tXHRsID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuK1x0bCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiBcbiBcdGlmIChsKVxuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlaGFzaF9ub2RlKTtcbitcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcdGVsc2VcbiBcdFx0cmV0ID0gLUVOT0VOVDtcbiBcbkBAIC0xNTgxLDggKzE3MDAsOCBAQCBzdGF0aWMgdm9pZCBkZWxldGVfYWxsX2VsZW1lbnRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47XG4gXHRcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4tXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcbitcdFx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xuIFx0XHRcdGh0YWJfZWxlbV9mcmVlKGh0YWIsIGwpO1xuIFx0XHR9XG4gXHRcdGNvbmRfcmVzY2hlZCgpO1xuQEAgLTE1OTksMTAgKzE3MTgsMTAgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX21hbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0XHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcbiBcdFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcbi1cdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XG4gXHRcdFx0LyogV2Ugb25seSBmcmVlIGludGVybmFsIHN0cnVjdHMgb24gdXJlZiBkcm9wcGluZyB0byB6ZXJvICovXG4gXHRcdFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGwsIGh0YWItXHUwMDNlbWFwLmtleV9zaXplKSk7XG4rXHRcdFx0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpKTtcbiBcdFx0fVxuIFx0XHRjb25kX3Jlc2NoZWRfcmN1KCk7XG4gXHR9XG5AQCAtMTY5Nyw3ICsxODE2LDcgQEAgc3RhdGljIGludCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4rXHRsID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFx0aWYgKCFsKSB7XG4gXHRcdHJldCA9IC1FTk9FTlQ7XG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbkBAIC0xNzA4LDE0ICsxODI3LDE0IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcdFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcdFx0aW50IG9mZiA9IDAsIGNwdTtcbiBcbi1cdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGwsIGtleV9zaXplKTtcbitcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdFx0Y29weV9tYXBfdmFsdWVfbG9uZyhcdTAwMjZodGFiLVx1MDAzZW1hcCwgdmFsdWUgKyBvZmYsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuIFx0XHRcdGNoZWNrX2FuZF9pbml0X21hcF92YWx1ZShcdTAwMjZodGFiLVx1MDAzZW1hcCwgdmFsdWUgKyBvZmYpO1xuIFx0XHRcdG9mZiArPSByb3VuZHVwX3ZhbHVlX3NpemU7XG4gXHRcdH1cbiBcdH0gZWxzZSB7XG4tXHRcdHZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0XHR2b2lkICpzcmMgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XG4gXG4gXHRcdGlmIChmbGFncyBcdTAwMjYgQlBGX0ZfTE9DSylcbiBcdFx0XHRjb3B5X21hcF92YWx1ZV9sb2NrZWQobWFwLCB2YWx1ZSwgc3JjLCB0cnVlKTtcbkBAIC0xNzI0LDcgKzE4NDMsNyBAQCBzdGF0aWMgaW50IF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXG4gXHRcdC8qIFplcm9pbmcgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIHRlbXAgYnVmZmVyICovXG4gXHRcdGNoZWNrX2FuZF9pbml0X21hcF92YWx1ZShtYXAsIHZhbHVlKTtcbiBcdH1cbi1cdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2VoYXNoX25vZGUpO1xuK1x0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBvdXRfdW5sb2NrOlxuIFx0aHRhYl91bmxvY2tfYnVja2V0KGIsIGJmbGFncyk7XG5AQCAtMTg2MCw3ICsxOTc5LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0fVxuIFxuIFx0YnVja2V0X2NudCA9IDA7XG4tXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKVxuK1x0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuIFx0XHRidWNrZXRfY250Kys7XG4gXG4gXHRpZiAoYnVja2V0X2NudCBcdTAwMjZcdTAwMjYgIWxvY2tlZCkge1xuQEAgLTE4OTcsMTQgKzIwMTYsMTQgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0aWYgKCFsb2NrZWQpXG4gXHRcdGdvdG8gbmV4dF9iYXRjaDtcbiBcbi1cdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4tXHRcdG1lbWNweShkc3Rfa2V5LCBsLVx1MDAzZWtleSwga2V5X3NpemUpO1xuK1x0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuK1x0XHRtZW1jcHkoZHN0X2tleSwgaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5X3NpemUpO1xuIFxuIFx0XHRpZiAoaXNfcGVyY3B1KSB7XG4gXHRcdFx0aW50IG9mZiA9IDAsIGNwdTtcbiBcdFx0XHR2b2lkIF9fcGVyY3B1ICpwcHRyO1xuIFxuLVx0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcbiBcdFx0XHRpZiAoZWxlbV9tYXBfZmxhZ3MgXHUwMDI2IEJQRl9GX0NQVSkge1xuIFx0XHRcdFx0Y3B1ID0gZWxlbV9tYXBfZmxhZ3MgXHUwMDNlXHUwMDNlIDMyO1xuIFx0XHRcdFx0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGRzdF92YWwsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuQEAgLTE5MTgsNyArMjAzNyw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0dmFsdWUgPSBodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpO1xuK1x0XHRcdHZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIFx0XHRcdGlmIChpc19mZF9odGFiKGh0YWIpKSB7XG4gXHRcdFx0XHRzdHJ1Y3QgYnBmX21hcCAqKmlubmVyX21hcCA9IHZhbHVlO1xuIFxuQEAgLTE5MzYsNyArMjA1NSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRjaGVja19hbmRfaW5pdF9tYXBfdmFsdWUobWFwLCBkc3RfdmFsKTtcbiBcdFx0fVxuIFx0XHRpZiAoZG9fZGVsZXRlKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4rXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBcdFx0XHQvKiBicGZfbHJ1X3B1c2hfZnJlZSgpIHdpbGwgYWNxdWlyZSBscnVfbG9jaywgd2hpY2hcbiBcdFx0XHQgKiBtYXkgY2F1c2UgZGVhZGxvY2suIFNlZSBjb21tZW50cyBpbiBmdW5jdGlvblxuQEAgLTE5NDgsNyArMjA2Nyw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHQgKiBsb2NrIGJlaW5nIGhlbGQgYW5kIGl0IHZpb2xhdGVzIHRoZSBsb2NrIHJ1bGUsIHNvXG4gXHRcdFx0ICogaW52b2tlIGZyZWVfaHRhYl9lbGVtKCkgYWZ0ZXIgdW5sb2NrIGFzIHdlbGwuXG4gXHRcdFx0ICovXG4tXHRcdFx0bC1cdTAwM2ViYXRjaF9mbGluayA9IG5vZGVfdG9fZnJlZTtcbitcdFx0XHRsLVx1MDAzZW5vZGUuYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7XG4gXHRcdFx0bm9kZV90b19mcmVlID0gbDtcbiBcdFx0fVxuIFx0XHRkc3Rfa2V5ICs9IGtleV9zaXplO1xuQEAgLTE5NjAsNyArMjA3OSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcbiBcdHdoaWxlIChub2RlX3RvX2ZyZWUpIHtcbiBcdFx0bCA9IG5vZGVfdG9fZnJlZTtcbi1cdFx0bm9kZV90b19mcmVlID0gbm9kZV90b19mcmVlLVx1MDAzZWJhdGNoX2ZsaW5rO1xuK1x0XHRub2RlX3RvX2ZyZWUgPSBub2RlX3RvX2ZyZWUtXHUwMDNlbm9kZS5iYXRjaF9mbGluaztcbiBcdFx0aWYgKGlzX2xydV9tYXApXG4gXHRcdFx0aHRhYl9scnVfcHVzaF9mcmVlKGh0YWIsIGwpO1xuIFx0XHRlbHNlXG5AQCAtMjEwOCw4ICsyMjI3LDggQEAgYnBmX2hhc2hfbWFwX3NlcV9maW5kX25leHQoc3RydWN0IGJwZl9pdGVyX3NlcV9oYXNoX21hcF9pbmZvICppbmZvLFxuIFx0XHQvKiBubyB1cGRhdGUvZGVsZXRpb24gb24gdGhpcyBidWNrZXQsIHByZXZfZWxlbSBzaG91bGQgYmUgc3RpbGwgdmFsaWRcbiBcdFx0ICogYW5kIHdlIHdvbid0IHNraXAgZWxlbWVudHMuXG4gXHRcdCAqL1xuLVx0XHRuID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcdTAwMjZwcmV2X2VsZW0tXHUwMDNlaGFzaF9ub2RlKSk7XG4tXHRcdGVsZW0gPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKG4sIHN0cnVjdCBodGFiX2VsZW0sIGhhc2hfbm9kZSk7XG4rXHRcdG4gPSByY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX25leHRfcmN1KFx1MDAyNnByZXZfZWxlbS1cdTAwM2Vub2RlLmhhc2hfbm9kZSkpO1xuK1x0XHRlbGVtID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShuLCBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XG4gXHRcdGlmIChlbGVtKVxuIFx0XHRcdHJldHVybiBlbGVtO1xuIFxuQEAgLTIxMjUsNyArMjI0NCw3IEBAIGJwZl9oYXNoX21hcF9zZXFfZmluZF9uZXh0KHN0cnVjdCBicGZfaXRlcl9zZXFfaGFzaF9tYXBfaW5mbyAqaW5mbyxcbiBcbiBcdFx0Y291bnQgPSAwO1xuIFx0XHRoZWFkID0gXHUwMDI2Yi1cdTAwM2VoZWFkO1xuLVx0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoZWxlbSwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShlbGVtLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuIFx0XHRcdGlmIChjb3VudCBcdTAwM2U9IHNraXBfZWxlbXMpIHtcbiBcdFx0XHRcdGluZm8tXHUwMDNlYnVja2V0X2lkID0gaTtcbiBcdFx0XHRcdGluZm8tXHUwMDNlc2tpcF9lbGVtcyA9IGNvdW50O1xuQEAgLTIxODMsMTIgKzIzMDIsMTIgQEAgc3RhdGljIGludCBfX2JwZl9oYXNoX21hcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGh0YWJfZWxlbSAqZWxlbSlcbiBcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuIFx0XHRjdHgubWFwID0gaW5mby1cdTAwM2VtYXA7XG4gXHRcdGlmIChlbGVtKSB7XG4tXHRcdFx0Y3R4LmtleSA9IGVsZW0tXHUwMDNla2V5O1xuK1x0XHRcdGN0eC5rZXkgPSBodGFiX2VsZW1fa2V5KGluZm8tXHUwMDNlaHRhYiwgZWxlbSk7XG4gXHRcdFx0aWYgKCFpbmZvLVx1MDAzZXBlcmNwdV92YWx1ZV9idWYpIHtcbi1cdFx0XHRcdGN0eC52YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShlbGVtLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0XHRcdFx0Y3R4LnZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGluZm8tXHUwMDNlaHRhYiwgZWxlbSk7XG4gXHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdHJvdW5kdXBfdmFsdWVfc2l6ZSA9IHJvdW5kX3VwKG1hcC1cdTAwM2V2YWx1ZV9zaXplLCA4KTtcbi1cdFx0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGluZm8tXHUwMDNlaHRhYiwgZWxlbSk7XG4gXHRcdFx0XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdFx0XHRcdGNvcHlfbWFwX3ZhbHVlX2xvbmcobWFwLCBpbmZvLVx1MDAzZXBlcmNwdV92YWx1ZV9idWYgKyBvZmYsXG4gXHRcdFx0XHRcdFx0XHQgICAgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7XG5AQCAtMjI5MiwxNCArMjQxMSwxNCBAQCBzdGF0aWMgbG9uZyBicGZfZm9yX2VhY2hfaGFzaF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIGJwZl9jYWxsYmFja190IGNhbGxiYWNrX1xuIFx0XHRiID0gXHUwMDI2aHRhYi1cdTAwM2VidWNrZXRzW2ldO1xuIFx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdGhlYWQgPSBcdTAwMjZiLVx1MDAzZWhlYWQ7XG4tXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4tXHRcdFx0a2V5ID0gZWxlbS1cdTAwM2VrZXk7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcbitcdFx0XHRrZXkgPSBodGFiX2VsZW1fa2V5KGh0YWIsIGVsZW0pO1xuIFx0XHRcdGlmIChpc19wZXJjcHUpIHtcbiBcdFx0XHRcdC8qIGN1cnJlbnQgY3B1IHZhbHVlIGZvciBwZXJjcHUgbWFwICovXG4tXHRcdFx0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgbWFwLVx1MDAzZWtleV9zaXplKTtcbitcdFx0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcbiBcdFx0XHRcdHZhbCA9IHRoaXNfY3B1X3B0cihwcHRyKTtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0dmFsID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRcdFx0XHR2YWwgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSk7XG4gXHRcdFx0fVxuIFx0XHRcdG51bV9lbGVtcysrO1xuIFx0XHRcdHJldCA9IGNhbGxiYWNrX2ZuKCh1NjQpKGxvbmcpbWFwLCAodTY0KShsb25nKWtleSxcbkBAIC0yNDAzLDEwICsyNTIyLDExIEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX2xydV9tYXBfb3BzID0ge1xuIC8qIENhbGxlZCBmcm9tIGVCUEYgcHJvZ3JhbSAqL1xuIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSkpO1xuK1x0XHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpKTtcbiBcdGVsc2VcbiBcdFx0cmV0dXJuIE5VTEw7XG4gfVxuQEAgLTI0MTQsNiArMjUzNCw3IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIC8qIGlubGluZSBicGZfbWFwX2xvb2t1cF9lbGVtKCkgY2FsbCBmb3IgcGVyLUNQVSBoYXNobWFwICovXG4gc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmO1xuIFxuIFx0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXG5AQCAtMjQyNCw3ICsyNTQ1LDcgQEAgc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25cbiBcdCppbnNuKysgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xuIFx0Kmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMyk7XG4gXHQqaW5zbisrID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsXG4tXHRcdFx0XHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICsgcm91bmR1cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbitcdFx0XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCArIHJvdW5kdXAobWFwLVx1MDAzZWtleV9zaXplLCA4KSk7XG4gXHQqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfMCwgMCk7XG4gXHQqaW5zbisrID0gQlBGX01PVjY0X1BFUkNQVV9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzApO1xuIFxuQEAgLTI0MzMsNiArMjU1NCw3IEBAIHN0YXRpYyBpbnQgaHRhYl9wZXJjcHVfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuXG4gXG4gc3RhdGljIHZvaWQgKmh0YWJfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB1MzIgY3B1KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4gXHRpZiAoY3B1IFx1MDAzZT0gbnJfY3B1X2lkcylcbkBAIC0yNDQwLDE4ICsyNTYyLDE5IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcbiBcdGwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKSwgY3B1KTtcbitcdFx0cmV0dXJuIHBlcl9jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpLCBjcHUpO1xuIFx0ZWxzZVxuIFx0XHRyZXR1cm4gTlVMTDtcbiB9XG4gXG4gc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKSB7XG4tXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmwtXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSkpO1xuK1x0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobCkpO1xuK1x0XHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpKTtcbiBcdH1cbiBcbiBcdHJldHVybiBOVUxMO1xuQEAgLTI0NTksNiArMjU4Miw3IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBcbiBzdGF0aWMgdm9pZCAqaHRhYl9scnVfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB1MzIgY3B1KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4gXHRpZiAoY3B1IFx1MDAzZT0gbnJfY3B1X2lkcylcbkBAIC0yNDY2LDggKzI1OTAsOCBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa1xuIFxuIFx0bCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xuIFx0aWYgKGwpIHtcbi1cdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXHUwMDI2bC1cdTAwM2VscnVfbm9kZSk7XG4tXHRcdHJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpLCBjcHUpO1xuK1x0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobCkpO1xuK1x0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCksIGNwdSk7XG4gXHR9XG4gXG4gXHRyZXR1cm4gTlVMTDtcbkBAIC0yNDc1LDYgKzI1OTksNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa1xuIFxuIGludCBicGZfcGVyY3B1X2hhc2hfY29weShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLCB1NjQgbWFwX2ZsYWdzKVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXHR2b2lkIF9fcGVyY3B1ICpwcHRyO1xuIFx0aW50IHJldCA9IC1FTk9FTlQ7XG5AQCAtMjQ5NCw3ICsyNjE5LDcgQEAgaW50IGJwZl9wZXJjcHVfaGFzaF9jb3B5KHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsIHU2NCBtYXBfZmxcbiBcdC8qIFdlIGRvIG5vdCBtYXJrIExSVSBtYXAgZWxlbWVudCBoZXJlIGluIG9yZGVyIHRvIG5vdCBtZXNzIHVwXG4gXHQgKiBldmljdGlvbiBoZXVyaXN0aWNzIHdoZW4gdXNlciBzcGFjZSBkb2VzIGEgbWFwIHdhbGsuXG4gXHQgKi9cbi1cdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0aWYgKG1hcF9mbGFncyBcdTAwMjYgQlBGX0ZfQ1BVKSB7XG4gXHRcdGNwdSA9IG1hcF9mbGFncyBcdTAwM2VcdTAwM2UgMzI7XG4gXHRcdGNvcHlfbWFwX3ZhbHVlKG1hcCwgdmFsdWUsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuQEAgLTI1MzIsNiArMjY1Nyw3IEBAIGludCBicGZfcGVyY3B1X2hhc2hfdXBkYXRlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gc3RhdGljIHZvaWQgaHRhYl9wZXJjcHVfbWFwX3NlcV9zaG93X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0XHRcdFx0XHQgIHN0cnVjdCBzZXFfZmlsZSAqbSlcbiB7XG4rXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgaHRhYl9lbGVtICpsO1xuIFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcdGludCBjcHU7XG5AQCAtMjU0Niw3ICsyNjcyLDcgQEAgc3RhdGljIHZvaWQgaHRhYl9wZXJjcHVfbWFwX3NlcV9zaG93X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFxuIFx0YnRmX3R5cGVfc2VxX3Nob3cobWFwLVx1MDAzZWJ0ZiwgbWFwLVx1MDAzZWJ0Zl9rZXlfdHlwZV9pZCwga2V5LCBtKTtcbiBcdHNlcV9wdXRzKG0sIFwiOiB7XFxuXCIpO1xuLVx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCk7XG4gXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdHNlcV9wcmludGYobSwgXCJcXHRjcHUlZDogXCIsIGNwdSk7XG4gXHRcdGJ0Zl90eXBlX3NlcV9zaG93KG1hcC1cdTAwM2VidGYsIG1hcC1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCxcbkBAIC0yNjE5LDggKzI3NDUsOCBAQCBzdGF0aWMgdm9pZCBmZF9odGFiX21hcF9mcmVlKHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBodGFiLVx1MDAzZW5fYnVja2V0czsgaSsrKSB7XG4gXHRcdGhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGkpO1xuIFxuLVx0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xuLVx0XHRcdHZvaWQgKnB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIobWFwLCBsKTtcbitcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuK1x0XHRcdHZvaWQgKnB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIoaHRhYiwgbCk7XG4gXG4gXHRcdFx0bWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZmRfcHV0X3B0cihtYXAsIHB0ciwgZmFsc2UpO1xuIFx0XHR9XG5AQCAtMjcwNSw2ICsyODMxLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfb2ZfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBzdGF0aWMgaW50IGh0YWJfb2ZfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdCAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4rXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjtcbiBcdGNvbnN0IGludCByZXQgPSBCUEZfUkVHXzA7XG4gXG5AQCAtMjcxMyw3ICsyODQwLDcgQEAgc3RhdGljIGludCBodGFiX29mX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXHQqaW5zbisrID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTtcbiBcdCppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDIpO1xuIFx0Kmluc24rKyA9IEJQRl9BTFU2NF9JTU0oQlBGX0FERCwgcmV0LFxuLVx0XHRcdFx0b2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwga2V5KSArXG4rXHRcdFx0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgK1xuIFx0XHRcdFx0cm91bmRfdXAobWFwLVx1MDAzZWtleV9zaXplLCA4KSk7XG4gXHQqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0RXLCByZXQsIHJldCwgMCk7XG4gXG5AQCAtMzExMiw3ICszMjM5LDcgQEAgc3RhdGljIGludCByaHRhYl9tYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiB7XG4gXHRzdHJ1Y3QgYnBmX3JodGFiICpyaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfcmh0YWIsIG1hcCk7XG4gXG4tXHRyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgXHUwMDI2cmh0YWItXHUwMDNlbWEsIHJodGFiX21lbV9kdG9yKTtcbitcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZyaHRhYi1cdTAwM2VtYSwgcmh0YWJfbWVtX2R0b3IsIG9mZnNldG9mKHN0cnVjdCByaHRhYl9lbGVtLCBkYXRhKSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHJodGFiX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcClcbkBAIC0zNTMzLDMgKzM2NjAsMTYgQEAgY29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIHJodGFiX21hcF9vcHMgPSB7XG4gXHQubWFwX2J0Zl9pZCA9IFx1MDAyNnJodGFiX21hcF9idGZfaWRzWzBdLFxuIFx0Lml0ZXJfc2VxX2luZm8gPSBcdTAwMjZyaGFzaF9pdGVyX3NlcV9pbmZvLFxuIH07XG4rXG4rc2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZClcbit7XG4rXHRyZXR1cm4gc2l6ZW9mKHN0cnVjdCBicGZfaHRhYik7XG4rfVxuK1xuK3ZvaWQgYnBmX2h0YWJfbWFwX21ldGFfaW5pdChzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwX21ldGEsIHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXApXG4re1xuK1x0c3RydWN0IGJwZl9odGFiICppbm5lcl9odGFiX21ldGEgPSBjb250YWluZXJfb2YoaW5uZXJfbWFwX21ldGEsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbitcdHN0cnVjdCBicGZfaHRhYiAqaW5uZXJfaHRhYiA9IGNvbnRhaW5lcl9vZihpbm5lcl9tYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbitcbitcdGlubmVyX2h0YWJfbWV0YS1cdTAwM2VrZXlfb2Zmc2V0ID0gaW5uZXJfaHRhYi1cdTAwM2VrZXlfb2Zmc2V0O1xuK31cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuYyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5jXG5pbmRleCBkMmNiYWI0YmRmNjQ0Li5iMmRiNWQwYzk4YmVlIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcbisrKyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5jXG5AQCAtNyw2ICs3LDE1IEBAXG4gXG4gI2luY2x1ZGUgXCJtYXBfaW5fbWFwLmhcIlxuIFxuK3N0YXRpYyBib29sIGJwZl9tYXBfdHlwZV9pc19odGFiKGVudW0gYnBmX21hcF90eXBlIHR5cGUpXG4re1xuK1x0cmV0dXJuIHR5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0ggfHxcbitcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfSEFTSCB8fFxuK1x0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0xSVV9IQVNIIHx8XG4rXHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfTFJVX1BFUkNQVV9IQVNIIHx8XG4rXHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTO1xuK31cbitcbiBzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKVxuIHtcbiBcdHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXAsICppbm5lcl9tYXBfbWV0YTtcbkBAIC0yOSw2ICszOCw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4gXHQvKiBJbiBzb21lIGNhc2VzIHZlcmlmaWVyIG5lZWRzIHRvIGFjY2VzcyBiZXlvbmQganVzdCBiYXNlIG1hcC4gKi9cbiBcdGlmIChpbm5lcl9tYXAtXHUwMDNlb3BzID09IFx1MDAyNmFycmF5X21hcF9vcHMgfHwgaW5uZXJfbWFwLVx1MDAzZW9wcyA9PSBcdTAwMjZwZXJjcHVfYXJyYXlfbWFwX29wcylcbiBcdFx0aW5uZXJfbWFwX21ldGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnBmX2FycmF5KTtcbitcdGVsc2UgaWYgKGJwZl9tYXBfdHlwZV9pc19odGFiKGlubmVyX21hcC1cdTAwM2VtYXBfdHlwZSkpXG4rXHRcdGlubmVyX21hcF9tZXRhX3NpemUgPSBicGZfaHRhYl9tYXBfbWV0YV9zaXplKCk7XG4gXG4gXHRpbm5lcl9tYXBfbWV0YSA9IGt6YWxsb2MoaW5uZXJfbWFwX21ldGFfc2l6ZSwgR0ZQX1VTRVIpO1xuIFx0aWYgKCFpbm5lcl9tYXBfbWV0YSlcbkBAIC03MCw2ICs4MSw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4gXHRcdGlubmVyX2FycmF5X21ldGEtXHUwMDNlaW5kZXhfbWFzayA9IGlubmVyX2FycmF5LVx1MDAzZWluZGV4X21hc2s7XG4gXHRcdGlubmVyX2FycmF5X21ldGEtXHUwMDNlZWxlbV9zaXplID0gaW5uZXJfYXJyYXktXHUwMDNlZWxlbV9zaXplO1xuIFx0XHRpbm5lcl9tYXBfbWV0YS1cdTAwM2VieXBhc3Nfc3BlY192MSA9IGlubmVyX21hcC1cdTAwM2VieXBhc3Nfc3BlY192MTtcbitcdH0gZWxzZSBpZiAoYnBmX21hcF90eXBlX2lzX2h0YWIoaW5uZXJfbWFwLVx1MDAzZW1hcF90eXBlKSkge1xuK1x0XHRicGZfaHRhYl9tYXBfbWV0YV9pbml0KGlubmVyX21hcF9tZXRhLCBpbm5lcl9tYXApO1xuIFx0fVxuIFx0cmV0dXJuIGlubmVyX21hcF9tZXRhO1xuIH1cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuaCBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5oXG5pbmRleCA3ZDYxNjAyMzU0ZGU4Li4xZWRjMjA1NzcyZDhjIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmhcbisrKyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5oXG5AQCAtMTUsNSArMTUsNyBAQCB2b2lkICpicGZfbWFwX2ZkX2dldF9wdHIoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGZpbGUgKm1hcF9maWxlLFxuIFx0XHRcdCBpbnQgdWZkKTtcbiB2b2lkIGJwZl9tYXBfZmRfcHV0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpwdHIsIGJvb2wgbmVlZF9kZWZlcik7XG4gdTMyIGJwZl9tYXBfZmRfc3lzX2xvb2t1cF9lbGVtKHZvaWQgKnB0cik7XG4rc2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZCk7XG4rdm9pZCBicGZfaHRhYl9tYXBfbWV0YV9pbml0KHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcCk7XG4gXG4gI2VuZGlmXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jXG5pbmRleCAzNzNjOGQxN2VhNTU3Li42YmQ0Y2I2OGMyMGMxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmNcbkBAIC0xMTQsNyArMTE0LDcgQEAgc3RhdGljIGlubGluZSBpbnQgY2hlY2tfaGFzaCh2b2lkKVxuIFx0VkVSSUZZKGNoZWNrX2RlZmF1bHRfbm9pbmxpbmUoXHUwMDI2aGFzaC1cdTAwM2VtYXAsIG1hcCkpO1xuIFxuIFx0VkVSSUZZKGhhc2gtXHUwMDNlbl9idWNrZXRzID09IE1BWF9FTlRSSUVTKTtcbi1cdFZFUklGWShoYXNoLVx1MDAzZWVsZW1fc2l6ZSA9PSA2NCk7XG4rXHRWRVJJRlkoaGFzaC1cdTAwM2VlbGVtX3NpemUgPT0gMzIpO1xuIFxuIFx0VkVSSUZZKGhhc2gtXHUwMDNlY291bnQuY291bnRlciA9PSAwKTtcbiBcdFZFUklGWShicGZfbWFwX3N1bV9lbGVtX2NvdW50KG1hcCkgPT0gMCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjoyNC4zNzM0MjE3NTVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5ODczNjQ0NjgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQlBGIEhhc2ggTWFwIE9wdGltaXphdGlvbiBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcywgdGhpcyBpcyBhIHByZXR0eSBzaWduaWZpY2FudCBjaGFuZ2UuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgYSBmdW5kYW1lbnRhbCByZS1hcmNoaXRlY3R1cmUgb2YgYHN0cnVjdCBodGFiX2VsZW1gIGluIGBrZXJuZWwvYnBmL2hhc2h0YWIuY2AgYW5kIGFsc28gaW1wYWN0aW5nIGBrZXJuZWwvYnBmL21hcF9pbl9tYXAuY2AuIFRoZXkncmUgaW50cm9kdWNpbmcgbmV3IHN0cnVjdHVyZXM6IGBodGFiX25vZGVgLCBgaHRhYl9lbGVtYCwgYGh0YWJfZWxlbV9scnVgLCBgaHRhYl9lbGVtX3BjcHVgLiBUaGF0J3Mgbm90IHRyaXZpYWwuIEFuZCwgb2ggeWVhaCwgYGhhc19oYXNoYCBhbmQgYGtleV9vZmZzZXRgIGFyZSBnZXR0aW5nIGFkZGVkIHRvIGBzdHJ1Y3QgYnBmX2h0YWJgIGFzIHdlbGwuXG5cblRoZSBiaWdnZXN0IHRoaW5nIHRoYXQgY2F0Y2hlcyBteSBhdHRlbnRpb24gaXMgaG93IHRoZXkncmUgY29uZGl0aW9uYWxseSBpbmNsdWRpbmcgdGhlIGhhc2ggdmFsdWUgaW4gdGhlIGVsZW1lbnQgZGVwZW5kaW5nIG9uIGlmIGl0J3MgYW4gTFJVIG1hcCBvciBpZiB0aGUga2V5IGlzIHdpZGVyIHRoYW4gYSB3b3JkLiBUaGF0J3MgYSBjbGV2ZXIgb3B0aW1pemF0aW9uLCBidXQgaXQgYWxzbyBjcmVhdGVzIHBvdGVudGlhbCBmb3Igc29tZSByZWFsbHkgc3VidGxlIGJ1Z3MuIEFsc28sIHVwZGF0aW5nIGBtYXBfaW5fbWFwLmNgIHRvIHN1cHBvcnQgbWV0YS1kYXRhIGZvciBoYXNoIG1hcHMgaW5zaWRlIG90aGVyIG1hcHMuLi4gdGhhdCBpbXBhY3RzIGFub3RoZXIgY29yZSBjb21wb25lbnQuXG5cblRoaXMgKmFic29sdXRlbHkqIHNjcmVhbXMgZm9yIGZ1enppbmcuIFdlIG5lZWQgdG8gYmUgdGhvcm91Z2ggd2l0aCB0aGlzLlxuXG5Ob3csIGxldCdzIGZpZ3VyZSBvdXQgd2hlcmUgdG8gZm9jdXMgb3VyIGZ1enppbmcgZWZmb3J0cy4gVGhlIHBhdGNoIG1vZGlmaWVzOiBgaHRhYl9tYXBfYWxsb2NgLCBgaHRhYl9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX2xydV9tYXBfbG9va3VwX2VsZW1gLCBgaHRhYl9tYXBfZ2V0X25leHRfa2V5YCwgYGh0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2hgIGFuZCBgYnBmX21hcF9tZXRhX2FsbG9jYC4gUmlnaHQsIGxldCdzIGxvb2sgYXQgdGhvc2UgZnVuY3Rpb25zLCBlc3BlY2lhbGx5LlxuXG5BbHJpZ2h0LCBjaGVja2luZyBga2VybmVsL2JwZi9oYXNodGFiLmNgLiBUaG9zZSBgaHRhYl8qYCBmdW5jdGlvbnMgYXJlIGFsbCBzdGFuZGFyZCBCUEYgbWFwIG9wZXJhdGlvbnMuICBXZSBjYW4gZm9jdXMgdGhlcmUuIEdpdmVuIHdoYXQgSSdtIHNlZWluZywgYGh0YWJfbWFwX2FsbG9jYCwgYGh0YWJfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF91cGRhdGVfZWxlbWAsIGBodGFiX21hcF9kZWxldGVfZWxlbWAsIGBodGFiX2xydV9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2VsZW1gLCBgaHRhYl9scnVfbWFwX2xvb2t1cF9lbGVtYCwgYF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2hgLCBgYnBmX21hcF9tZXRhX2FsbG9jYCAtIHRob3NlIHNlZW0gbGlrZSB0aGUgcHJpbWFyeSBlbnRyeSBwb2ludHMgdG8gc2NydXRpbml6ZS5cblxuT2theSwgc28gbW9zdCBvZiB0aGVtIGFyZSBzdGF0aWMsIGJ1dCBhc3NpZ25lZCB0byB0aGUgYGJwZl9tYXBfb3BzYCBzdHJ1Y3R1cmVzLiAgQWgsIHJpZ2h0LiBUaGUgYWR2aWNlIGlzIHRvIHByaW9yaXRpemUgbm9uLXN0YXRpYyBlbnRyeSBwb2ludHMuIEJ1dCBldmVuIHRob3VnaCB0aGV5J3JlIHN0YXRpYywgdGhleSAqYXJlbid0KiBpbmxpbmVkIGJlY2F1c2UgdGhleSdyZSBjYWxsZWQgdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaW4gdGhvc2UgYGJwZl9tYXBfb3BzYCBzdHJ1Y3R1cmVzLiBUaGF0IG1lYW5zIHRoZXkgc3RpbGwgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzLCBhbmQgdGhleSBzaG91bGQgYmUgdGVzdGFibGUuICBHcmVhdC4gTGV0J3MgZGlnIGRlZXBlciBpbnRvIHRoZSBjb2RlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjA0NCwiT3V0cHV0VG9rZW5zIjo1NSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxNSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjM0LjI0NzA2ODIxOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MDE3NTkxOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKHN0YXRpYyApPyhzdHJ1Y3QgYnBmX21hcCBcXFxcKnxpbnR8bG9uZ3x2b2lkIFxcXFwqfHZvaWQpIGh0YWJfbWFwX2FsbG9jXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvaGFzaHRhYi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvaGFzaHRhYi5jPTQ1MD1zdGF0aWMgaW50IGFsbG9jX2V4dHJhX2VsZW1zKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTQ3My0vKiBDYWxsZWQgZnJvbSBzeXNjYWxsICovXFxua2VybmVsL2JwZi9oYXNodGFiLmM6NDc0OnN0YXRpYyBpbnQgaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXFxua2VybmVsL2JwZi9oYXNodGFiLmMtNDc1LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTI6MzQuMzI3MjQ5ODI1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjk4NjI2MTA1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKlJlZmluaW5nIHRoZSBTZWFyY2ggU3RyYXRlZ3kqKlxuXG5BbHJpZ2h0LCB0aGF0IHJlZ2V4IEkgaW5pdGlhbGx5IGNyYWZ0ZWQgd2FzIHByb3ZpbmcgYSBsaXR0bGUgdG9vIHJlc3RyaWN0aXZlLiBJdCB3YXMgcHJvYmFibHkgb3ZlcmNvbXBsaWNhdGluZyB0aGluZ3MsIGxlYWRpbmcgdG8gc29tZSBmYWxzZSBuZWdhdGl2ZXMuIFJhdGhlciB0aGFuIHRyeWluZyB0byBtYWludGFpbiB0aGF0IGNvbXBsZXggcGF0dGVybiwgSSdtIGdvaW5nIHRvIGRpYWwgaXQgYmFjayBhbmQgYWRvcHQgYSBzaW1wbGVyIGFwcHJvYWNoLiBNeSBpbnN0aW5jdHMgYXJlIHRlbGxpbmcgbWUgdG8gZ28gZGlyZWN0bHkgZm9yIHRoZSBjb3JlIGZ1bmN0aW9uIEknbSBpbnRlcmVzdGVkIGluOiBgaHRhYl9tYXBfYWxsb2NgLiBBIHNpbXBsZSBgZ3JlcGAgZm9yIHRoYXQgc2hvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGFuZCBnZXQgbWUgdGhlIHJlc3VsdHMgSSBuZWVkIHdpdGhvdXQgdW5uZWNlc3Nhcnkgb3ZlcmhlYWQgb3IgdGhlIHBvdGVudGlhbCBmb3IgbWlzc2VkIG9jY3VycmVuY2VzIGR1ZSB0byBvdmVybHkgc3BlY2lmaWMgcGF0dGVybiBtYXRjaGluZy4gRm9jdXNpbmcgb24gdGhlIGZ1bmN0aW9uIG5hbWUgaXRzZWxmIHNob3VsZCBwcm92aWRlIGEgY2xlYW5lciBhbmQgbW9yZSBmb2N1c2VkIHJlc3VsdCBzZXQgZm9yIGRlZXBlciBhbmFseXNpcy4gSXQncyBhIHByYWdtYXRpYyBzaGlmdCwgYW5kIEkgZXhwZWN0IGl0IHdpbGwgYmUgbW9yZSBlZmZlY3RpdmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNjE1LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTI6MzcuMzEzNTEzMzI1WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk2NDYwMTA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImh0YWJfbWFwX2FsbG9jXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvaGFzaHRhYi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvaGFzaHRhYi5jPTQ1MD1zdGF0aWMgaW50IGFsbG9jX2V4dHJhX2VsZW1zKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTQ3My0vKiBDYWxsZWQgZnJvbSBzeXNjYWxsICovXFxua2VybmVsL2JwZi9oYXNodGFiLmM6NDc0OnN0YXRpYyBpbnQgaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXFxua2VybmVsL2JwZi9oYXNodGFiLmMtNDc1LXtcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jPTU5MT1zdGF0aWMgaW50IGh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy01OTktXFx0ICogV2UgbXVzdCBzZXQgdGhlIGR0b3IgdXNpbmcgdGhpcyBjYWxsYmFjaywgYXMgbWFwJ3MgQlRGIHJlY29yZCBpcyBub3RcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzo2MDA6XFx0ICogcG9wdWxhdGVkIGluIGh0YWJfbWFwX2FsbG9jKCksIHNvIGl0IHdpbGwgYWx3YXlzIGFwcGVhciBhcyBOVUxMLlxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTYwMS1cXHQgKi9cXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTYwNy1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzo2MDg6c3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy02MDkte1xcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQ3Nz1jb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9tYXBfb3BzID0ge1xcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI0NzgtXFx0Lm1hcF9tZXRhX2VxdWFsID0gYnBmX21hcF9tZXRhX2VxdWFsLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0Nzk6XFx0Lm1hcF9hbGxvY19jaGVjayA9IGh0YWJfbWFwX2FsbG9jX2NoZWNrLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0ODA6XFx0Lm1hcF9hbGxvYyA9IGh0YWJfbWFwX2FsbG9jLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI0ODEtXFx0Lm1hcF9mcmVlID0gaHRhYl9tYXBfZnJlZSxcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jPTI0OTk9Y29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIGh0YWJfbHJ1X21hcF9vcHMgPSB7XFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjUwMC1cXHQubWFwX21ldGFfZXF1YWwgPSBicGZfbWFwX21ldGFfZXF1YWwsXFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjUwMTpcXHQubWFwX2FsbG9jX2NoZWNrID0gaHRhYl9tYXBfYWxsb2NfY2hlY2ssXFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjUwMjpcXHQubWFwX2FsbG9jID0gaHRhYl9tYXBfYWxsb2MsXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjUwMy1cXHQubWFwX2ZyZWUgPSBodGFiX21hcF9mcmVlLFxcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmM9MjY4Nz1jb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9wZXJjcHVfbWFwX29wcyA9IHtcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNjg4LVxcdC5tYXBfbWV0YV9lcXVhbCA9IGJwZl9tYXBfbWV0YV9lcXVhbCxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNjg5OlxcdC5tYXBfYWxsb2NfY2hlY2sgPSBodGFiX21hcF9hbGxvY19jaGVjayxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNjkwOlxcdC5tYXBfYWxsb2MgPSBodGFiX21hcF9hbGxvYyxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNjkxLVxcdC5tYXBfZnJlZSA9IGh0YWJfbWFwX2ZyZWUsXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yNzA5PWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX2xydV9wZXJjcHVfbWFwX29wcyA9IHtcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzEwLVxcdC5tYXBfbWV0YV9lcXVhbCA9IGJwZl9tYXBfbWV0YV9lcXVhbCxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNzExOlxcdC5tYXBfYWxsb2NfY2hlY2sgPSBodGFiX21hcF9hbGxvY19jaGVjayxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNzEyOlxcdC5tYXBfYWxsb2MgPSBodGFiX21hcF9hbGxvYyxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzEzLVxcdC5tYXBfZnJlZSA9IGh0YWJfbWFwX2ZyZWUsXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzI5LVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI3MzA6c3RhdGljIGludCBmZF9odGFiX21hcF9hbGxvY19jaGVjayh1bmlvbiBicGZfYXR0ciAqYXR0cilcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzMxLXtcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI3MzMtXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjczNDpcXHRyZXR1cm4gaHRhYl9tYXBfYWxsb2NfY2hlY2soYXR0cik7XFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjczNS19XFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yODAyPXN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9vZl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yODA5LVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI4MTA6XFx0bWFwID0gaHRhYl9tYXBfYWxsb2MoYXR0cik7XFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjgxMS1cXHRpZiAoSVNfRVJSKG1hcCkpIHtcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jPTI4NTY9Y29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIGh0YWJfb2ZfbWFwc19tYXBfb3BzID0ge1xcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI4NTc6XFx0Lm1hcF9hbGxvY19jaGVjayA9IGZkX2h0YWJfbWFwX2FsbG9jX2NoZWNrLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI4NTgtXFx0Lm1hcF9hbGxvYyA9IGh0YWJfb2ZfbWFwX2FsbG9jLFxcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmM9MjkxND1zdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHJodGFiX3BhcmFtc19sb25nID0ge1xcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjkyMS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyOTIyOnN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqcmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI5MjMte1xcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjk3MS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyOTcyOnN0YXRpYyBpbnQgcmh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI5NzMte1xcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjk5MS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyOTkyOlxcdHJldHVybiBodGFiX21hcF9hbGxvY19jaGVjayhhdHRyKTtcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yOTkzLX1cXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jPTM2NDI9Y29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIHJodGFiX21hcF9vcHMgPSB7XFxua2VybmVsL2JwZi9oYXNodGFiLmMtMzY0My1cXHQubWFwX21ldGFfZXF1YWwgPSBicGZfbWFwX21ldGFfZXF1YWwsXFxua2VybmVsL2JwZi9oYXNodGFiLmM6MzY0NDpcXHQubWFwX2FsbG9jX2NoZWNrID0gcmh0YWJfbWFwX2FsbG9jX2NoZWNrLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjM2NDU6XFx0Lm1hcF9hbGxvYyA9IHJodGFiX21hcF9hbGxvYyxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0zNjQ2LVxcdC5tYXBfZnJlZSA9IHJodGFiX21hcF9mcmVlLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjozNy40MDk5ODA1NDNaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTc4NTI3NTExLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIEhhc2ggTWFwIEZ1bmN0aW9ucyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZXNlIGZ1bmN0aW9ucyBhbmQgaW1tZWRpYXRlbHkgc2VlIHRoZXkncmUgc3RhdGljLCB3aGljaCBpcyBpbnRlcmVzdGluZywgYnV0IGFjdHVhbGx5LCB0aGF0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4gVGhlc2UgYXJlIHRoZSBjb3JlIG9wZXJhdGlvbnMg4oCTIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucyDigJMgZm9yIGhhc2ggbWFwcy4gVGhhdCBtYWtlcyB0aGVtIGEgdmVyeSB2YWx1YWJsZSB0YXJnZXQgZm9yIHRoZSBmdXp6ZXIuIExldCBtZSBzZWUuLi4gaWYgd2UgaW5jbHVkZSBgaHRhYl9tYXBfYWxsb2NgLCBgaHRhYl9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX2xydV9tYXBfbG9va3VwX2VsZW1gLCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAsIGFuZCBgYnBmX21hcF9tZXRhX2FsbG9jYCwgdGhlIGZ1enplciBzaG91bGQgYmUgYWJsZSB0byBkaWcgaW4gdGhlcmUuIEFoLCB3YWl0IGEgc2Vjb25kLiBIb2xkIG9uLiBJcyBgYnBmX21hcF9tZXRhX2FsbG9jYCBhY3R1YWxseSBzdGF0aWM/IFRoYXQncyBub3Qgd2hhdCBJIGV4cGVjdGVkLiBMZXQgbWUganVzdCBxdWlja2x5IGNoZWNrIHRoYXQuIFRpbWUgdG8gZ28gbG9vayBpbnRvIGBrZXJuZWwvYnBmL21hcF9pbl9tYXAuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1NTcyLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjQyLjM4ODUxMjI4M1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NzkyNDYyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicGZfbWFwX21ldGFfYWxsb2NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9tYXBfaW5fbWFwLmM9MTA9c3RhdGljIGJvb2wgYnBmX21hcF90eXBlX2lzX2h0YWIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSlcXG4tLVxcbmtlcm5lbC9icGYvbWFwX2luX21hcC5jLTE4LVxcbmtlcm5lbC9icGYvbWFwX2luX21hcC5jOjE5OnN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXFxua2VybmVsL2JwZi9tYXBfaW5fbWFwLmMtMjAte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1Mjo0Mi40NDY0NDM3OTFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1ODgyMzI5NDMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBCUEYgTWFwIEFsbG9jYXRpb24gRnVuY3Rpb25zKipcblxuT2theSwgc28gYGJwZl9tYXBfbWV0YV9hbGxvY2AgaXMgZGVmaW5pdGVseSBleHBvcnRlZCwgdGhhdCdzIHN0cmFpZ2h0Zm9yd2FyZC4gTm93LCBhYm91dCBgaHRhYl9tYXBfYWxsb2NgLi4uIGl0J3MgZGVjbGFyZWQgc3RhdGljLCB3aGljaCBpbml0aWFsbHkgc2VlbXMgbGlrZSBhIHByb2JsZW0gYmFzZWQgb24gdGhlIHByb21wdCdzIHByZWZlcmVuY2UgZm9yIG5vbi1zdGF0aWMgZW50cnlwb2ludHMgd2l0aCBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzLiBCdXQgd2FpdCBhIG1pbnV0ZSwgaXQncyAqYXNzaWduZWQqIHRvIGEgZnVuY3Rpb24gcG9pbnRlciEgVGhhdCBtZWFucyB0aGUgY29tcGlsZXIgd29uJ3QgaW5saW5lIGl0LCBhbmQgaXQgKmRvZXMqIGhhdmUgYSBkaXN0aW5jdCBzeW1ib2wuIFNvLCBpdCBzaG91bGQgYmUgZmluZSB0byBpbmNsdWRlIGl0LlxuXG5PZiBjb3Vyc2UsIEkgY291bGQgcGxheSBpdCBzYWZlIGFuZCBqdXN0IGxpc3QgdGhlIHN5c2NhbGwgZW50cnkgcG9pbnRzIGxpa2UgYG1hcF9jcmVhdGVgLCBgbWFwX3VwZGF0ZV9lbGVtYCwgZXRjLiBCdXQgdGhhdCdzIGEgYml0IGdlbmVyaWMuIFRoZSBwcm9tcHQgc3BlY2lmaWNhbGx5IHdhcm5zIGFnYWluc3QgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gYXZvaWQgYmlhc2luZyB0aGUgcmVzdWx0cy4gQW5kIGxpc3RpbmcgdGhvc2Ugc3lzY2FsbHMgKndvdWxkKiBza2V3IHRoZSB0ZXN0IGRpc3RyaWJ1dGlvbi5cblxuU28sIHRoZSBvcHRpbWFsIGFwcHJvYWNoIGhlcmUgaXMgdG8gbGlzdCB0aGUgc3BlY2lmaWMgYGh0YWJfbWFwX2FsbG9jYCBmdW5jdGlvbnM6IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbWFwX2xvb2t1cF9lbGVtYCwgYGh0YWJfbHJ1X21hcF9sb29rdXBfZWxlbWAsIGFuZCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAuIFRoYXQgY292ZXJzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBiZWluZyBvdmVybHkgZ2VuZXJpYy5cblxuTm93LCBqdXN0IHRvIGJlIHRob3JvdWdoLCBJIHNob3VsZCBjaGVjayBmb3IgYW55IENPTkZJRyBvcHRpb25zIHdlIG1pZ2h0IG5lZWQuIEJQRiBoYXNoIG1hcHMgYXJlIGEgZnVuZGFtZW50YWwgcGFydCBvZiBjb3JlIEJQRiwgc28gaXQncyBhIHNhZmUgYmV0IHRoYXQgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgdGhlIHByaW1hcnkgb25lLCBidXQgbGV0IG1lIGp1c3QgZG91YmxlIGNoZWNrIHRoZSBkZXRhaWxzIHRvIGJlIHN1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MTU0LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjQ4LjMyODc3NTkyNFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA5MjEwNDI3LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlBGX1NZU0NBTExcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1Mjo0OC40Mzc5OTY4NTFaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI1MTE2MDY2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gdGhpczpcblxuKipJbnZlc3RpZ2F0aW5nIEJQRiBDb25maWd1cmF0aW9uIE9wdGlvbnMqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBCUEYgYXJlIGRlZmluZWQuIE15IGZpcnN0IGluc3RpbmN0LCBhbmQgdGhpcyBpcyB3aGVyZSBJJ2Qgc3RhcnQgaW4gYW55IGtlcm5lbCBpbnZlc3RpZ2F0aW9uLCBpcyB0byBjaGVjayB0aGUgYEtjb25maWdgIGZpbGVzLiBTcGVjaWZpY2FsbHksIEknbSB0aGlua2luZyBJIG5lZWQgdG8gbG9vayBpbiBga2VybmVsL2JwZi9LY29uZmlnYCwgb3Igc29tZXdoZXJlIHNpbWlsYXIgd2l0aGluIHRoZSBCUEYgc3Vic3lzdGVtIGRpcmVjdG9yeS4gVGhlIGBLY29uZmlnYCBmaWxlcyBhcmUgdGhlIGJyZWFkIGFuZCBidXR0ZXIgZm9yIGFueSBrZXJuZWwgZGV2ZWxvcGVyIGJlY2F1c2UgdGhleSBkZWZpbmUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IHVzZXJzIGNhbiB0b2dnbGUgdXNpbmcgYG1ha2UgbWVudWNvbmZpZ2Agb3Igc2ltaWxhciB0b29scy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgdW5kZXJzdGFuZGluZyBvZiB3aGF0J3MgYXZhaWxhYmxlIGFuZCBob3cgaXQncyBzdHJ1Y3R1cmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjkxNiwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjUyLjY4OTE2MDQ0M1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI5Nzc4OTI4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlBGX1NZU0NBTExcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvS2NvbmZpZz0yNT1tZW51IFxcXCJCUEYgc3Vic3lzdGVtXFxcIlxcbmtlcm5lbC9icGYvS2NvbmZpZy0yNi1cXG5rZXJuZWwvYnBmL0tjb25maWc6Mjc6Y29uZmlnIEJQRl9TWVNDQUxMXFxua2VybmVsL2JwZi9LY29uZmlnLTI4LVxcdGJvb2wgXFxcIkVuYWJsZSBicGYoKSBzeXN0ZW0gY2FsbFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTI6NTQuOTg2OTU1MzY0WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2MzAwNDY2MTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSwgdGhlIGNvcmUgb2YgdGhpcyBzZWVtcyB0byByZXZvbHZlIGFyb3VuZCBgQlBGX1NZU0NBTExgLCB0aGF0J3MgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbiB0byBiZSBhd2FyZSBvZi4gSSBzaG91bGQgZG91YmxlLWNoZWNrIHRvIGJlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBvdGhlciBjb25maWdzIHRoYXQgYXJlIHJlbGF0ZWQuXG5cbkFscmlnaHQsIHRoZSBwYXRjaCB0b3VjaGVzIGBrZXJuZWwvYnBmL2hhc2h0YWIuY2AgYW5kIGBrZXJuZWwvYnBmL21hcF9pbl9tYXAuY2AuIEhtbSwgYXJlIHRoZXJlIGFueSBzcGVjaWFsaXplZCBjb25maWd1cmF0aW9ucywgb3IgcGVyaGFwcyBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgdW5pcXVlIHRvIHRob3NlIGZpbGVzIHdpdGhpbiB0aGlzIGNvbnRleHQ/IFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgbGlua2VkIHdpdGggdGhlIHNwZWNpZmljIGNvZGUgcGF0aHMgYWx0ZXJlZCBpbiB0aG9zZSBtb2R1bGVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNzE5OSwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjU4LjYxNzAwNTEwNVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA5Mzk3OTg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImhhc2h0YWJcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL01ha2VmaWxlPTEwPW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX2l0ZXIubyBtYXBfaXRlci5vIHRhc2tfaXRlci5vIHByb2dfaXRlci5vIGxpbmtfaXRlci5vXFxua2VybmVsL2JwZi9NYWtlZmlsZToxMTpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGhhc2h0YWIubyBhcnJheW1hcC5vIHBlcmNwdV9mcmVlbGlzdC5vIGJwZl9scnVfbGlzdC5vIGxwbV90cmllLm8gbWFwX2luX21hcC5vIGJsb29tX2ZpbHRlci5vXFxua2VybmVsL2JwZi9NYWtlZmlsZS0xMi1vYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGxvY2FsX3N0b3JhZ2UubyBxdWV1ZV9zdGFja19tYXBzLm8gcmluZ2J1Zi5vIGJwZl9pbnNuX2FycmF5Lm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTI6NTguNzI2NDA3NTkyWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg5ODU4MjIzMTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhpcyBCUEYgSGFzaCBNYXAgT3B0aW1pemF0aW9uKipcblxuUmlnaHQsIHNvIEkndmUgY29uZmlybWVkIHRoYXQgZW5hYmxpbmcgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgdGhlIGNydWNpYWwgcHJlcmVxdWlzaXRlIGhlcmUuIFRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBmb2N1cyBvbiBhIHNldCBvZiBjcml0aWNhbCBmdW5jdGlvbnMgdGhhdCByZXByZXNlbnQgdGhlIGNvcmUgb3BlcmF0aW9ucyBhZmZlY3RlZCBieSB0aGlzIG1lbW9yeSBsYXlvdXQgb3B0aW1pemF0aW9uLiBJJ3ZlIGNvbXBpbGVkIGEgc2hvcnRsaXN0LCBmb2N1c2luZyBvbiB0aG9zZSBpbnZvbHZlZCB3aXRoIGFsbG9jYXRpb24sIHVwZGF0ZXMsIGxvb2t1cHMsIGFuZCBkZWxldGlvbnMuXG5cbkkndmUgZ290IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2VsZW1gLCBhbmQgYGJwZl9tYXBfbWV0YV9hbGxvY2AgZWFybWFya2VkIGFzIHRoZSBrZXkgdGFyZ2V0cy4gSSBkaWQgYSBxdWljayBkb3VibGUgY2hlY2sgb24gYGh0YWJfbWFwX3VwZGF0ZV9lbGVtYCB0byBiZSBzdXJlIEknbSB0YXJnZXRpbmcgdGhlIHByb3BlciBmdW5jdGlvbiwgaXQncyBzdGF0aWMgaW50ZXJuYWxseSBidXQgZXhwb3NlZCB0aHJvdWdoIHRoZSBgaHRhYl9tYXBfb3BzYCBzdHJ1Y3R1cmUuIEknbSBrZWVwaW5nIGEgY2xvc2UgZXllIG9uIGFueSBhbGlhc2VzIG9yIHZhcmlhdGlvbnMgYXMgd2VsbCwgYnV0IHRoZXNlIHNlZW0gdG8gYmUgdGhlIHByaW1hcnkgcGxheWVycy5cblxuVGhpcyBwYXRjaCBpcyBlc3NlbnRpYWxseSBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIEJQRiBoYXNoIG1hcCBpbXBsZW1lbnRhdGlvbiwgc3BlY2lmaWNhbGx5IGFpbWluZyB0byBvcHRpbWl6ZSBtZW1vcnkgdXNhZ2UgYnkgY29uZGl0aW9uYWxseSByZW1vdmluZyB0aGUgaGFzaCB2YWx1ZSBmcm9tIHRoZSBlbGVtZW50IGFuZCBhZGp1c3RpbmcgdGhlIGtleSBvZmZzZXQuIEl0J3Mgbm90IGp1c3QgYSB0d2VhazsgaXQncyBhIGZ1bmRhbWVudGFsIHNoaWZ0IGluIGhvdyB0aGVzZSBtYXBzIG1hbmFnZSBtZW1vcnkuXG5cbkdpdmVuIHRoaXMsIG15IGV4cGVydCBpbnR1aXRpb24gc2NyZWFtcyBmb3IgdGhvcm91Z2ggZnV6emluZy4gVGhlIGNoYW5nZSB0b3VjaGVzIGNvcmUgb3BlcmF0aW9ucyBsaWtlIG1lbW9yeSBsYXlvdXQgaW4gYSB3YXkgdGhhdCAqZGVtYW5kcyogcm9idXN0IHRlc3RpbmcuIFdlIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluIHRoYXQgdGhpcyBtZW1vcnkgb3B0aW1pemF0aW9uIGRvZXNuJ3QgaW50cm9kdWNlIHZ1bG5lcmFiaWxpdGllcyBvciB1bmV4cGVjdGVkIGJlaGF2aW9ycyBkdXJpbmcgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24sIGVzcGVjaWFsbHkgcmVsYXRlZCB0byBvdXQtb2YtYm91bmRzIGFjY2VzcyBvciBtZW1vcnkgY29ycnVwdGlvbi4gSSBuZWVkIHRvIGJlIDEwMCUgY2VydGFpbiB0aGUga2V5cyBhbmQgZGF0YSBhcmUgc3RpbGwgbWFwcGVkIGNvcnJlY3RseSwgdG9vLlxuXG5JJ20gZmxhZ2dpbmcgYGh0YWJfbWFwX2FsbG9jYCwgYGh0YWJfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF91cGRhdGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX21hcF9kZWxldGVfZWxlbWAsIGFuZCBgYnBmX21hcF9tZXRhX2FsbG9jYCBhcyB0aGUgZm9jdXMgc3ltYm9scywgYW5kIEknbGwgbWFrZSBzdXJlIGBCUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZCBmb3IgdGVzdGluZy4gTGV0J3MgY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNzYwMSwiT3V0cHV0VG9rZW5zIjoxNzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2NDgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTM6MDcuNzEyMjMzMzIyWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMwMDYzNjY2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImh0YWJfbWFwX2FsbG9jXCIsXG4gICAgXCJodGFiX21hcF91cGRhdGVfZWxlbVwiLFxuICAgIFwiaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtXCIsXG4gICAgXCJodGFiX21hcF9sb29rdXBfZWxlbVwiLFxuICAgIFwiaHRhYl9tYXBfZGVsZXRlX2VsZW1cIixcbiAgICBcImJwZl9tYXBfbWV0YV9hbGxvY1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9wdGltaXplcyB0aGUgbWVtb3J5IGxheW91dCBvZiBCUEYgaGFzaCBtYXAgZWxlbWVudHMgYnkgY29uZGl0aW9uYWxseSBvbWl0dGluZyB0aGUgaGFzaCB2YWx1ZSBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBUaGlzIGFmZmVjdHMgY29yZSBCUEYgaGFzaCBtYXAgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24uIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBtZW1vcnkgbGF5b3V0IGFuZCB0aGF0IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIG9jY3VyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaHRhYl9tYXBfYWxsb2NcIixcbiAgICBcImh0YWJfbWFwX3VwZGF0ZV9lbGVtXCIsXG4gICAgXCJodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1cIixcbiAgICBcImh0YWJfbWFwX2xvb2t1cF9lbGVtXCIsXG4gICAgXCJodGFiX21hcF9kZWxldGVfZWxlbVwiLFxuICAgIFwiYnBmX21hcF9tZXRhX2FsbG9jXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb3B0aW1pemVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIEJQRiBoYXNoIG1hcCBlbGVtZW50cyBieSBjb25kaXRpb25hbGx5IG9taXR0aW5nIHRoZSBoYXNoIHZhbHVlIGFuZCBhZGp1c3RpbmcgdGhlIGtleSBvZmZzZXQuIFRoaXMgYWZmZWN0cyBjb3JlIEJQRiBoYXNoIG1hcCBvcGVyYXRpb25zIGxpa2UgYWxsb2NhdGlvbiwgbG9va3VwLCB1cGRhdGUsIGFuZCBkZWxldGlvbi4gRnV6emluZyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZXNlIG9wZXJhdGlvbnMgc3RpbGwgd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgbmV3IG1lbW9yeSBsYXlvdXQgYW5kIHRoYXQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBtZW1vcnkgbGVha3Mgb2NjdXIuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-05 22:49:55 +0000 UTC FinishedAt: 2026-08-05 22:53:09 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "cfce77b63375dac81d53f2f85593c548415206b7", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "cfce77b63375dac81d53f2f85593c548415206b7", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "9cd4e75e-affc-4a83-9042-f2c0004066a5" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "htab_map_alloc", "htab_map_update_elem", "htab_lru_map_update_elem", "htab_map_lookup_elem", "htab_map_delete_elem", "bpf_map_meta_alloc" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7aHRhYl9tYXBfYWxsb2MmIzM0OywKICAgICYjMzQ7aHRhYl9tYXBfdXBkYXRlX2VsZW0mIzM0OywKICAgICYjMzQ7aHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtJiMzNDssCiAgICAmIzM0O2h0YWJfbWFwX2xvb2t1cF9lbGVtJiMzNDssCiAgICAmIzM0O2h0YWJfbWFwX2RlbGV0ZV9lbGVtJiMzNDssCiAgICAmIzM0O2JwZl9tYXBfbWV0YV9hbGxvYyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBvcHRpbWl6ZXMgdGhlIG1lbW9yeSBsYXlvdXQgb2YgQlBGIGhhc2ggbWFwIGVsZW1lbnRzIGJ5IGNvbmRpdGlvbmFsbHkgb21pdHRpbmcgdGhlIGhhc2ggdmFsdWUgYW5kIGFkanVzdGluZyB0aGUga2V5IG9mZnNldC4gVGhpcyBhZmZlY3RzIGNvcmUgQlBGIGhhc2ggbWFwIG9wZXJhdGlvbnMgbGlrZSBhbGxvY2F0aW9uLCBsb29rdXAsIHVwZGF0ZSwgYW5kIGRlbGV0aW9uLiBGdXp6aW5nIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhlc2Ugb3BlcmF0aW9ucyBzdGlsbCB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBuZXcgbWVtb3J5IGxheW91dCBhbmQgdGhhdCBubyBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzIG9yIG1lbW9yeSBsZWFrcyBvY2N1ci4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDY0NTRhMTFjMDNkZmFlZGI0YjA5Zjg1NzVhZjhkMDM2MzlmYjUyNzNcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIEF1ZyA1IDIyOjUyOjIyIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGFzaHRhYi5jIGIva2VybmVsL2JwZi9oYXNodGFiLmNcbmluZGV4IDlmMzk0ZTFhYTJlODUuLjk5NjcyNjhkNDUzZDAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2hhc2h0YWIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9oYXNodGFiLmNcbkBAIC0xMDAsMTMgJiM0MzsxMDAsMTYgQEAgc3RydWN0IGJwZl9odGFiIHtcbiBcdHN0cnVjdCBwZXJjcHVfY291bnRlciBwY291bnQ7XG4gXHRhdG9taWNfdCBjb3VudDtcbiBcdGJvb2wgdXNlX3BlcmNwdV9jb3VudGVyO1xuJiM0MztcdGJvb2wgaGFzX2hhc2g7XG4gXHR1MzIgbl9idWNrZXRzO1x0LyogbnVtYmVyIG9mIGhhc2ggYnVja2V0cyAqL1xuIFx0dTMyIGVsZW1fc2l6ZTtcdC8qIHNpemUgb2YgZWFjaCBlbGVtZW50IGluIGJ5dGVzICovXG4mIzQzO1x0dTMyIGtleV9vZmZzZXQ7XHQvKiBvZmZzZXQgb2Yga2V5IGluIGJ5dGVzICovXG4gXHR1MzIgaGFzaHJuZDtcbiB9O1xuIFxuIC8qIGVhY2ggaHRhYiBlbGVtZW50IGlzIHN0cnVjdCBodGFiX2VsZW0gJiM0Mzsga2V5ICYjNDM7IHZhbHVlICovXG4tc3RydWN0IGh0YWJfZWxlbSB7XG4mIzQzO3N0cnVjdCBodGFiX2VsZW07XG4mIzQzO3N0cnVjdCBodGFiX25vZGUge1xuIFx0dW5pb24ge1xuIFx0XHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSBoYXNoX25vZGU7XG4gXHRcdHN0cnVjdCB7XG5AQCAtMTE3LDE4ICYjNDM7MTIwLDMyIEBAIHN0cnVjdCBodGFiX2VsZW0ge1xuIFx0XHRcdH07XG4gXHRcdH07XG4gXHR9O1xuLVx0dW5pb24ge1xuLVx0XHQvKiBwb2ludGVyIHRvIHBlci1jcHUgcG9pbnRlciAqL1xuLVx0XHR2b2lkICpwdHJfdG9fcHB0cjtcbi1cdFx0c3RydWN0IGJwZl9scnVfbm9kZSBscnVfbm9kZTtcbi1cdH07XG4tXHR1MzIgaGFzaDtcbi1cdGNoYXIga2V5W10gX19hbGlnbmVkKDgpO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGh0YWJfZWxlbSB7XG4mIzQzO1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuJiM0MztcdHU4IGRhdGFbXSBfX2FsaWduZWQoOCk7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgaHRhYl9lbGVtX2xydSB7XG4mIzQzO1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuJiM0MztcdHN0cnVjdCBicGZfbHJ1X25vZGUgbHJ1X25vZGU7XG4mIzQzO1x0dTggZGF0YVtdIF9fYWxpZ25lZCg4KTtcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qIE9ubHkgZm9yIG5vbi1wcmVhbGxvY2F0ZWQgUENQVSBtYXBzLiBQcmVhbGxvY2F0ZWQgUENQVSBtYXBzIGRvbiYjMzk7dCBuZWVkXG4mIzQzOyAqIHB0cl90b19wcHRyLCBhbmQgdXNlIGh0YWJfZWxlbS5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCBodGFiX2VsZW1fcGNwdSB7XG4mIzQzO1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuJiM0MztcdHZvaWQgKnB0cl90b19wcHRyO1xuJiM0MztcdHU4IGRhdGFbXSBfX2FsaWduZWQoOCk7XG4gfTtcbiBcbiBzdHJ1Y3QgaHRhYl9idGZfcmVjb3JkIHtcbiBcdHN0cnVjdCBidGZfcmVjb3JkICpyZWNvcmQ7XG4gXHR1MzIga2V5X3NpemU7XG4mIzQzO1x0dTMyIGtleV9vZmZzZXQ7XG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9pc19wcmVhbGxvYyhjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG5AQCAtMTM2LDYgJiM0MzsxNTMsMjEgQEAgc3RhdGljIGlubGluZSBib29sIGh0YWJfaXNfcHJlYWxsb2MoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0cmV0dXJuICEoaHRhYi1cdTAwM2VtYXAubWFwX2ZsYWdzIFx1MDAyNiBCUEZfRl9OT19QUkVBTExPQyk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfbHJ1X25vZGUgKmh0YWJfZWxlbV9scnVfbm9kZShzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIFx1MDAyNigoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS1cdTAwM2VscnVfbm9kZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fZ2V0X3B0cl90b19wcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VwdHJfdG9fcHB0cjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyX3RvX3BwdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdm9pZCAqcHRyKVxuJiM0Mzt7XG4mIzQzO1x0KChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VwdHJfdG9fcHB0ciA9IHB0cjtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgdm9pZCBodGFiX2luaXRfYnVja2V0cyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4ge1xuIFx0dW5zaWduZWQgaW50IGk7XG5AQCAtMTgzLDI1ICYjNDM7MjE1LDMwIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19mZF9odGFiKGNvbnN0IHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdHJldHVybiBodGFiLVx1MDAzZW1hcC5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgKmh0YWJfZWxlbV92YWx1ZShzdHJ1Y3QgaHRhYl9lbGVtICpsLCB1MzIga2V5X3NpemUpXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX2tleShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gKHZvaWQgKilsICYjNDM7IGh0YWItXHUwMDNla2V5X29mZnNldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiBsLVx1MDAzZWtleSAmIzQzOyByb3VuZF91cChrZXlfc2l6ZSwgOCk7XG4mIzQzO1x0cmV0dXJuIGh0YWJfZWxlbV9rZXkoaHRhYiwgbCkgJiM0Mzsgcm91bmRfdXAoaHRhYi1cdTAwM2VtYXAua2V5X3NpemUsIDgpO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplLFxuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsLFxuIFx0XHRcdFx0ICAgICB2b2lkIF9fcGVyY3B1ICpwcHRyKVxuIHtcbi1cdCoodm9pZCBfX3BlcmNwdSAqKilodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpID0gcHB0cjtcbiYjNDM7XHQqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpID0gcHB0cjtcbiB9XG4gXG4tc3RhdGljIGlubGluZSB2b2lkIF9fcGVyY3B1ICpodGFiX2VsZW1fZ2V0X3B0cihzdHJ1Y3QgaHRhYl9lbGVtICpsLCB1MzIga2V5X3NpemUpXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BlcmNwdSAqaHRhYl9lbGVtX2dldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGwsIGtleV9zaXplKTtcbiYjNDM7XHRyZXR1cm4gKih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgKmZkX2h0YWJfbWFwX2dldF9wdHIoY29uc3Qgc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGh0YWJfZWxlbSAqbClcbiYjNDM7c3RhdGljIHZvaWQgKmZkX2h0YWJfbWFwX2dldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiAqKHZvaWQgKiopaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0cmV0dXJuICoodm9pZCAqKilodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpnZXRfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgaW50IGkpXG5AQCAtMjA5LDYgJiM0MzsyNDYsMzMgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmdldF9odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCBpbnQgaSlcbiBcdHJldHVybiAoc3RydWN0IGh0YWJfZWxlbSAqKSAoaHRhYi1cdTAwM2VlbGVtcyAmIzQzOyBpICogKHU2NClodGFiLVx1MDAzZWVsZW1fc2l6ZSk7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9oYXNfaGFzaChjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gaHRhYi1cdTAwM2VoYXNfaGFzaDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB1MzIgaHRhYl9lbGVtX2hhc2goc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuJiM0MztcdFx0cmV0dXJuICoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLVx1MDAzZWRhdGE7XG4mIzQzO1x0ZWxzZSBpZiAoaHRhYl9pc19wZXJjcHUoaHRhYikgXHUwMDI2XHUwMDI2ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKVxuJiM0MztcdFx0cmV0dXJuICoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VkYXRhO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHJldHVybiAqKHUzMiAqKWwtXHUwMDNlZGF0YTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfaGFzaChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBoYXNoKVxuJiM0Mzt7XG4mIzQzO1x0aWYgKCFodGFiX2hhc19oYXNoKGh0YWIpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmIChodGFiX2lzX2xydShodGFiKSlcbiYjNDM7XHRcdCoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLVx1MDAzZWRhdGEgPSBoYXNoO1xuJiM0MztcdGVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpIFx1MDAyNlx1MDAyNiAhaHRhYl9pc19wcmVhbGxvYyhodGFiKSlcbiYjNDM7XHRcdCoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VkYXRhID0gaGFzaDtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHQqKHUzMiAqKWwtXHUwMDNlZGF0YSA9IGhhc2g7XG4mIzQzO31cbiYjNDM7XG4gLyogQm90aCBwZXJjcHUgYW5kIGZkIGh0YWIgc3VwcG9ydCBpbi1wbGFjZSB1cGRhdGUsIHNvIG5vIG5lZWQgZm9yXG4gICogZXh0cmEgZWxlbS4gTFJVIGl0c2VsZiBjYW4gcmVtb3ZlIHRoZSBsZWFzdCB1c2VkIGVsZW1lbnQsIHNvXG4gICogdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gZXh0cmEgZWxlbSBkdXJpbmcgbWFwX3VwZGF0ZS5cbkBAIC0yMzEsNyAmIzQzOzI5NSw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFxuIFx0XHRlbGVtID0gZ2V0X2h0YWJfZWxlbShodGFiLCBpKTtcbiBcdFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xuJiM0MztcdFx0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTtcbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG4gXHR9XG4gfVxuQEAgLTI1NCw3ICYjNDM7MzE4LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX3ByZWFsbG9jZWRfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcbiBcdFx0ZWxlbSA9IGdldF9odGFiX2VsZW0oaHRhYiwgaSk7XG4gXHRcdGlmIChodGFiX2lzX3BlcmNwdShodGFiKSkge1xuLVx0XHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcbiBcdFx0XHRpbnQgY3B1O1xuIFxuIFx0XHRcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbkBAIC0yNjMsNyAmIzQzOzMyNyw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRcdFx0fVxuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdGJwZl9vYmpfZnJlZV9maWVsZHMoaHRhYi1cdTAwM2VtYXAucmVjb3JkLFxuLVx0XHRcdFx0XHQgICAgaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGh0YWItXHUwMDNlbWFwLmtleV9zaXplKSk7XG4mIzQzO1x0XHRcdFx0XHQgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTtcbiBcdFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdFx0fVxuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbkBAIC0yODAsOCAmIzQzOzM0NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBodGFiLVx1MDAzZW1hcC5tYXhfZW50cmllczsgaSYjNDM7JiM0MzspIHtcbiBcdFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcbi1cdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGdldF9odGFiX2VsZW0oaHRhYiwgaSksXG4tXHRcdFx0XHRcdCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4mIzQzO1x0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZ2V0X2h0YWJfZWxlbShodGFiLCBpKSk7XG4gXHRcdGZyZWVfcGVyY3B1KHBwdHIpO1xuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdH1cbkBAIC0zMDgsOCAmIzQzOzM3MSw4IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpwcmVhbGxvY19scnVfcG9wKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LFxuIFxuIFx0aWYgKG5vZGUpIHtcbiBcdFx0YnBmX21hcF9pbmNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4tXHRcdGwgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpO1xuLVx0XHRtZW1jcHkobC1cdTAwM2VrZXksIGtleSwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUpO1xuJiM0MztcdFx0bCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7XG4mIzQzO1x0XHRtZW1jcHkoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4gXHRcdHJldHVybiBsO1xuIFx0fVxuIFxuQEAgLTM0MCw4ICYjNDM7NDAzLDcgQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdFx0XHRcdFx0ICAgIEdGUF9VU0VSIHwgX19HRlBfTk9XQVJOKTtcbiBcdFx0aWYgKCFwcHRyKVxuIFx0XHRcdGdvdG8gZnJlZV9lbGVtcztcbi1cdFx0aHRhYl9lbGVtX3NldF9wdHIoZ2V0X2h0YWJfZWxlbShodGFiLCBpKSwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUsXG4tXHRcdFx0XHQgIHBwdHIpO1xuJiM0MztcdFx0aHRhYl9lbGVtX3NldF9wdHIoaHRhYiwgZ2V0X2h0YWJfZWxlbShodGFiLCBpKSwgcHB0cik7XG4gXHRcdGNvbmRfcmVzY2hlZCgpO1xuIFx0fVxuIFxuQEAgLTM0OSw4ICYjNDM7NDExLDggQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdGlmIChodGFiX2lzX2xydShodGFiKSlcbiBcdFx0ZXJyID0gYnBmX2xydV9pbml0KFx1MDAyNmh0YWItXHUwMDNlbHJ1LFxuIFx0XHRcdFx0ICAgaHRhYi1cdTAwM2VtYXAubWFwX2ZsYWdzIFx1MDAyNiBCUEZfRl9OT19DT01NT05fTFJVLFxuLVx0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaCkgLVxuLVx0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpLFxuJiM0MztcdFx0XHRcdCAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBkYXRhKSAtXG4mIzQzO1x0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSxcbiBcdFx0XHRcdCAgIGh0YWJfbHJ1X21hcF9kZWxldGVfbm9kZSxcbiBcdFx0XHRcdCAgIGh0YWIpO1xuIFx0ZWxzZVxuQEAgLTM2MSwxMSAmIzQzOzQyMywxMSBAQCBzdGF0aWMgaW50IHByZWFsbG9jX2luaXQoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFxuIFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuIFx0XHRicGZfbHJ1X3BvcHVsYXRlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBodGFiLVx1MDAzZWVsZW1zLFxuLVx0XHRcdFx0IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSxcbiYjNDM7XHRcdFx0XHQgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSxcbiBcdFx0XHRcdCBodGFiLVx1MDAzZWVsZW1fc2l6ZSwgbnVtX2VudHJpZXMpO1xuIFx0ZWxzZVxuIFx0XHRwY3B1X2ZyZWVsaXN0X3BvcHVsYXRlKFx1MDAyNmh0YWItXHUwMDNlZnJlZWxpc3QsXG4tXHRcdFx0XHQgICAgICAgaHRhYi1cdTAwM2VlbGVtcyAmIzQzOyBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSksXG4mIzQzO1x0XHRcdFx0ICAgICAgIGh0YWItXHUwMDNlZWxlbXMgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSksXG4gXHRcdFx0XHQgICAgICAgaHRhYi1cdTAwM2VlbGVtX3NpemUsIG51bV9lbnRyaWVzKTtcbiBcbiBcdHJldHVybiAwO1xuQEAgLTQwMSw3ICYjNDM7NDYzLDcgQEAgc3RhdGljIGludCBhbGxvY19leHRyYV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRcdC8qIHBvcCB3aWxsIHN1Y2NlZWQsIHNpbmNlIHByZWFsbG9jX2luaXQoKVxuIFx0XHQgKiBwcmVhbGxvY2F0ZWQgZXh0cmEgbnVtX3Bvc3NpYmxlX2NwdXMgZWxlbWVudHNcbiBcdFx0ICovXG4tXHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKTtcbiYjNDM7XHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIG5vZGUuZm5vZGUpO1xuIFx0XHQqcGVyX2NwdV9wdHIocHB0ciwgY3B1KSA9IGxfbmV3O1xuIFx0fVxuIFx0aHRhYi1cdTAwM2VleHRyYV9lbGVtcyA9IHBwdHI7XG5AQCAtNDI1LDggJiM0Mzs0ODcsOCBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKVxuIFx0Ym9vbCB6ZXJvX3NlZWQgPSAoYXR0ci1cdTAwM2VtYXBfZmxhZ3MgXHUwMDI2IEJQRl9GX1pFUk9fU0VFRCk7XG4gXHRpbnQgbnVtYV9ub2RlID0gYnBmX21hcF9hdHRyX251bWFfbm9kZShhdHRyKTtcbiBcbi1cdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZS5uZXh0KSAhPVxuLVx0XHQgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGhhc2hfbm9kZS5wcHJldikpO1xuJiM0MztcdEJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBmbm9kZS5uZXh0KSAhPVxuJiM0MztcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBoYXNoX25vZGUucHByZXYpKTtcbiBcbiBcdGlmICh6ZXJvX3NlZWQgXHUwMDI2XHUwMDI2ICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKVxuIFx0XHQvKiBHdWFyZCBhZ2FpbnN0IGxvY2FsIERvUywgYW5kIGRpc2NvdXJhZ2UgcHJvZHVjdGlvbiB1c2UuICovXG5AQCAtNDc2LDcgJiM0Mzs1MzgsNyBAQCBzdGF0aWMgdm9pZCBodGFiX21lbV9kdG9yKHZvaWQgKm9iaiwgdm9pZCAqY3R4KVxuIFx0aWYgKElTX0VSUl9PUl9OVUxMKGhyZWMtXHUwMDNlcmVjb3JkKSlcbiBcdFx0cmV0dXJuO1xuIFxuLVx0bWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGhyZWMtXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdG1hcF92YWx1ZSA9ICh2b2lkICopZWxlbSAmIzQzOyBocmVjLVx1MDAzZWtleV9vZmZzZXQgJiM0Mzsgcm91bmRfdXAoaHJlYy1cdTAwM2VrZXlfc2l6ZSwgOCk7XG4gXHRicGZfb2JqX2ZyZWVfZmllbGRzKGhyZWMtXHUwMDNlcmVjb3JkLCBtYXBfdmFsdWUpO1xuIH1cbiBcbkBAIC01MDIsNyAmIzQzOzU2NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZHRvcl9jdHhfZnJlZSh2b2lkICpjdHgpXG4gfVxuIFxuIHN0YXRpYyBpbnQgYnBmX21hX3NldF9kdG9yKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfbWVtX2FsbG9jICptYSxcbi1cdFx0XHQgICB2b2lkICgqZHRvcikodm9pZCAqLCB2b2lkICopKVxuJiM0MztcdFx0XHQgICB2b2lkICgqZHRvcikodm9pZCAqLCB2b2lkICopLCB1MzIga2V5X29mZnNldClcbiB7XG4gXHRzdHJ1Y3QgaHRhYl9idGZfcmVjb3JkICpocmVjO1xuIFx0aW50IGVycjtcbkBAIC01MTUsNiAmIzQzOzU3Nyw3IEBAIHN0YXRpYyBpbnQgYnBmX21hX3NldF9kdG9yKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfbWVtX2FsbG9jICptYSxcbiBcdGlmICghaHJlYylcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4gXHRocmVjLVx1MDAzZWtleV9zaXplID0gbWFwLVx1MDAzZWtleV9zaXplO1xuJiM0MztcdGhyZWMtXHUwMDNla2V5X29mZnNldCA9IGtleV9vZmZzZXQ7XG4gXHRocmVjLVx1MDAzZXJlY29yZCA9IGJ0Zl9yZWNvcmRfZHVwKG1hcC1cdTAwM2VyZWNvcmQpO1xuIFx0aWYgKElTX0VSUihocmVjLVx1MDAzZXJlY29yZCkpIHtcbiBcdFx0ZXJyID0gUFRSX0VSUihocmVjLVx1MDAzZXJlY29yZCk7XG5AQCAtNTM3LDkgJiM0Mzs2MDAsOSBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4gXHQgKiBwb3B1bGF0ZWQgaW4gaHRhYl9tYXBfYWxsb2MoKSwgc28gaXQgd2lsbCBhbHdheXMgYXBwZWFyIGFzIE5VTEwuXG4gXHQgKi9cbiBcdGlmIChodGFiX2lzX3BlcmNwdShodGFiKSlcbi1cdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlcGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yKTtcbiYjNDM7XHRcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZodGFiLVx1MDAzZXBjcHVfbWEsIGh0YWJfcGNwdV9tZW1fZHRvciwgaHRhYi1cdTAwM2VrZXlfb2Zmc2V0KTtcbiBcdGVsc2Vcbi1cdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlbWEsIGh0YWJfbWVtX2R0b3IpO1xuJiM0MztcdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlbWEsIGh0YWJfbWVtX2R0b3IsIGh0YWItXHUwMDNla2V5X29mZnNldCk7XG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXG5AQCAtNTYyLDYgJiM0Mzs2MjUsMTMgQEAgc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcbiBcbiBcdGJwZl9tYXBfaW5pdF9mcm9tX2F0dHIoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGF0dHIpO1xuIFxuJiM0MztcdC8qIEF2b2lkIGhhc2ggbWVtb3J5IHVzZSBhbmQgY29tcGFyaXNvbnMgd2hlcmUgdW5uZWNlc3NhcnkuXG4mIzQzO1x0ICogdTMyIGhhc2ggcmVhZHMgYXJlIGFsd2F5cyBhdG9taWMuIElmIHdlIGVsaWRlIHRoZW0sIGtleSBjb21wYXJpc29ucyBtdXN0IGFsc28gYmUgYXRvbWljXG4mIzQzO1x0ICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUga2V5IG1hdGNoZXMgZHVlIHRvIHRvcm4ga2V5IHJlYWRzIC8gd3JpdGVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGVcbiYjNDM7XHQgKiB3aGVuIHRoZSBrZXkgZml0cyB3aXRoaW4gYSB3b3JkLCBzbyBjaGVjayBrZXlfc2l6ZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRodGFiLVx1MDAzZWhhc19oYXNoID0gaHRhYl9pc19scnUoaHRhYikgfHwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUgXHUwMDNlIHNpemVvZih1bnNpZ25lZCBsb25nKTtcbiYjNDM7XG4gXHRpZiAocGVyY3B1X2xydSkge1xuIFx0XHQvKiBlbnN1cmUgZWFjaCBDUFUmIzM5O3MgbHJ1IGxpc3QgaGFzIFx1MDAzZT0xIGVsZW1lbnRzLlxuIFx0XHQgKiBzaW5jZSB3ZSBhcmUgYXQgaXQsIG1ha2UgZWFjaCBscnUgbGlzdCBoYXMgdGhlIHNhbWVcbkBAIC01ODMsOCAmIzQzOzY1MywxNiBAQCBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKVxuIFxuIFx0aHRhYi1cdTAwM2VuX2J1Y2tldHMgPSByb3VuZHVwX3Bvd19vZl90d28oaHRhYi1cdTAwM2VtYXAubWF4X2VudHJpZXMpO1xuIFxuLVx0aHRhYi1cdTAwM2VlbGVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGh0YWJfZWxlbSkgJiM0Mztcbi1cdFx0XHQgIHJvdW5kX3VwKGh0YWItXHUwMDNlbWFwLmtleV9zaXplLCA4KTtcbiYjNDM7XHRpZiAoaHRhYl9pc19scnUoaHRhYikpXG4mIzQzO1x0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgZGF0YSkgJiM0MzsgODtcbiYjNDM7XHRlbHNlIGlmIChwZXJjcHUgXHUwMDI2XHUwMDI2ICFwcmVhbGxvYylcbiYjNDM7XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fcGNwdSwgZGF0YSkgJiM0MztcbiYjNDM7XHRcdFx0XHQgICAoaHRhYl9oYXNfaGFzaChodGFiKSA/IDggOiAwKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBkYXRhKSAmIzQzO1xuJiM0MztcdFx0XHRcdCAgIChodGFiX2hhc19oYXNoKGh0YWIpID8gOCA6IDApO1xuJiM0MztcbiYjNDM7XHRodGFiLVx1MDAzZWVsZW1fc2l6ZSA9IGh0YWItXHUwMDNla2V5X29mZnNldCAmIzQzOyByb3VuZF91cChodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSwgOCk7XG4gXHRpZiAocGVyY3B1KVxuIFx0XHRodGFiLVx1MDAzZWVsZW1fc2l6ZSAmIzQzOz0gc2l6ZW9mKHZvaWQgKik7XG4gXHRlbHNlXG5AQCAtNjkyLDE1ICYjNDM7NzcwLDI5IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKnNlbGVjdF9idWNrZXQoc3RydWN0IGJwZl9odGFiICpodGFiLCB1MzJcbiB9XG4gXG4gLyogdGhpcyBsb29rdXAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggYnVja2V0IGxvY2sgdGFrZW4gKi9cbi1zdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLCB1MzIgaGFzaCxcbiYjNDM7c3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsXG4mIzQzO1x0XHRcdFx0XHQgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsIHUzMiBoYXNoLFxuIFx0XHRcdFx0XHQgdm9pZCAqa2V5LCB1MzIga2V5X3NpemUpXG4ge1xuIFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47XG4gXHRzdHJ1Y3QgaHRhYl9lbGVtICpsO1xuIFxuLVx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSlcbi1cdFx0aWYgKGwtXHUwMDNlaGFzaCA9PSBoYXNoIFx1MDAyNlx1MDAyNiAhbWVtY21wKFx1MDAyNmwtXHUwMDNla2V5LCBrZXksIGtleV9zaXplKSlcbi1cdFx0XHRyZXR1cm4gbDtcbiYjNDM7XHRpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkge1xuJiM0MztcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuJiM0MztcdFx0XHRpZiAoaHRhYl9lbGVtX2hhc2goaHRhYiwgbCkgPT0gaGFzaCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdFx0ICAgICFtZW1jbXAoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBrZXlfc2l6ZSkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGw7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdC8qIFdoZW4gaGFzaCBpcyBvbWl0dGVkLCBrZXkgY29tcGFyaXNvbnMgbXVzdCBiZSBhdG9taWMuIFplcm8gZXh0ZW5kXG4mIzQzO1x0XHQgKiB0aGUgY2FsbGVyJiMzOTtzIGtleSB0byB0aGUgd29yZCBzaXplIHRvIHN1cHBvcnQgYW4gYXRvbWljIGNvbXBhcmUuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdHVuc2lnbmVkIGxvbmcgayA9IDA7XG4mIzQzO1xuJiM0MztcdFx0bWVtY3B5KFx1MDAyNmssIGtleSwga2V5X3NpemUpO1xuJiM0MztcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuJiM0MztcdFx0XHRpZiAoUkVBRF9PTkNFKCoodW5zaWduZWQgbG9uZyAqKWh0YWJfZWxlbV9rZXkoaHRhYiwgbCkpID09IGspXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGw7XG4mIzQzO1x0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuQEAgLTcwOSw3ICYjNDM7ODAxLDggQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2hcbiAgKiB0aGUgdW5saWtlbHkgZXZlbnQgd2hlbiBlbGVtZW50cyBtb3ZlZCBmcm9tIG9uZSBidWNrZXQgaW50byBhbm90aGVyXG4gICogd2hpbGUgbGluayBsaXN0IGlzIGJlaW5nIHdhbGtlZFxuICAqL1xuLXN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsXG4mIzQzO3N0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGJwZl9odGFiICpodGFiLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLFxuIFx0XHRcdFx0XHQgICAgICAgdTMyIGhhc2gsIHZvaWQgKmtleSxcbiBcdFx0XHRcdFx0ICAgICAgIHUzMiBrZXlfc2l6ZSwgdTMyIG5fYnVja2V0cylcbiB7XG5AQCAtNzE3LDkgJiM0Mzs4MTAsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCxcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4gYWdhaW46XG4tXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKVxuLVx0XHRpZiAobC1cdTAwM2VoYXNoID09IGhhc2ggXHUwMDI2XHUwMDI2ICFtZW1jbXAoXHUwMDI2bC1cdTAwM2VrZXksIGtleSwga2V5X3NpemUpKVxuLVx0XHRcdHJldHVybiBsO1xuJiM0MztcdGlmIChodGFiX2hhc19oYXNoKGh0YWIpKSB7XG4mIzQzO1x0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4mIzQzO1x0XHRcdGlmIChodGFiX2VsZW1faGFzaChodGFiLCBsKSA9PSBoYXNoIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQgICAgIW1lbWNtcChodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXksIGtleV9zaXplKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gbDtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0LyogU2VlIGxvb2t1cF9lbGVtX3JhdygpIGNvbW1lbnQgYWJvdmUuICovXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGsgPSAwO1xuJiM0MztcbiYjNDM7XHRcdG1lbWNweShcdTAwMjZrLCBrZXksIGtleV9zaXplKTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSlcbiYjNDM7XHRcdFx0aWYgKFJFQURfT05DRSgqKHVuc2lnbmVkIGxvbmcgKilodGFiX2VsZW1fa2V5KGh0YWIsIGwpKSA9PSBrKVxuJiM0MztcdFx0XHRcdHJldHVybiBsO1xuJiM0MztcdH1cbiBcbiBcdGlmICh1bmxpa2VseShnZXRfbnVsbHNfdmFsdWUobikgIT0gKGhhc2ggXHUwMDI2IChuX2J1Y2tldHMgLSAxKSkpKVxuIFx0XHRnb3RvIGFnYWluO1xuQEAgLTc0NywxNyAmIzQzOzg1MSwxOCBAQCBzdGF0aWMgdm9pZCAqX19odGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gXG4gXHRoZWFkID0gc2VsZWN0X2J1Y2tldChodGFiLCBoYXNoKTtcbiBcbi1cdGwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi1cdTAwM2VuX2J1Y2tldHMpO1xuJiM0MztcdGwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi1cdTAwM2VuX2J1Y2tldHMpO1xuIFxuIFx0cmV0dXJuIGw7XG4gfVxuIFxuIHN0YXRpYyB2b2lkICpodGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4ge1xuJiM0MztcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIFxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuQEAgLTc3NSw2ICYjNDM7ODgwLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiAgKi9cbiBzdGF0aWMgaW50IGh0YWJfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XG4gXHRjb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wO1xuIFxuQEAgLTc4Myw3ICYjNDM7ODg5LDcgQEAgc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCAxKTtcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9BTFU2NF9JTU0oQlBGX0FERCwgcmV0LFxuLVx0XHRcdFx0b2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwga2V5KSAmIzQzO1xuJiM0MztcdFx0XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCAmIzQzO1xuIFx0XHRcdFx0cm91bmRfdXAobWFwLVx1MDAzZWtleV9zaXplLCA4KSk7XG4gXHRyZXR1cm4gaW5zbiAtIGluc25fYnVmO1xuIH1cbkBAIC03OTEsMTIgJiM0Mzs4OTcsMTMgQEAgc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICpfX2h0YWJfbHJ1X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0XHRcdFx0XHRcdFx0dm9pZCAqa2V5LCBjb25zdCBib29sIG1hcmspXG4ge1xuJiM0MztcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKSB7XG4gXHRcdGlmIChtYXJrKVxuLVx0XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmwtXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsKSk7XG4mIzQzO1x0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIFx0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG5AQCAtODE1LDYgJiM0Mzs5MjIsNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfbWFwX2xvb2t1cF9lbGVtX3N5cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gc3RhdGljIGludCBodGFiX2xydV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0XHRcdFx0ICAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XG4gXHRjb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wO1xuIFx0Y29uc3QgaW50IHJlZl9yZWcgPSBCUEZfUkVHXzE7XG5AQCAtODI0LDE1ICYjNDM7OTMyLDE1IEBAIHN0YXRpYyBpbnQgaHRhYl9scnVfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDQpO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0xEWF9NRU0oQlBGX0IsIHJlZl9yZWcsIHJldCxcbi1cdFx0XHQgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSkgJiM0MztcbiYjNDM7XHRcdFx0ICAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSAmIzQzO1xuIFx0XHRcdCAgICAgIG9mZnNldG9mKHN0cnVjdCBicGZfbHJ1X25vZGUsIHJlZikpO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0pNUF9JTU0oQlBGX0pORSwgcmVmX3JlZywgMCwgMSk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfU1RfTUVNKEJQRl9CLCByZXQsXG4tXHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSkgJiM0MztcbiYjNDM7XHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpICYjNDM7XG4gXHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpLFxuIFx0XHRcdCAgICAgMSk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCxcbi1cdFx0XHRcdG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGtleSkgJiM0MztcbiYjNDM7XHRcdFx0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgJiM0MztcbiBcdFx0XHRcdHJvdW5kX3VwKG1hcC1cdTAwM2VrZXlfc2l6ZSwgOCkpO1xuIFx0cmV0dXJuIGluc24gLSBpbnNuX2J1ZjtcbiB9XG5AQCAtODQ0LDEzICYjNDM7OTUyLDEzIEBAIHN0YXRpYyB2b2lkIGNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYixcbiBcdFx0cmV0dXJuO1xuIFxuIFx0aWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKSB7XG4tXHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4mIzQzO1x0XHR2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZWxlbSk7XG4gXHRcdGludCBjcHU7XG4gXG4gXHRcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpXG4gXHRcdFx0YnBmX29ial9jYW5jZWxfZmllbGRzKFx1MDAyNmh0YWItXHUwMDNlbWFwLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcbiBcdH0gZWxzZSB7XG4tXHRcdHZvaWQgKm1hcF92YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4mIzQzO1x0XHR2b2lkICptYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSk7XG4gXG4gXHRcdGJwZl9vYmpfY2FuY2VsX2ZpZWxkcyhcdTAwMjZodGFiLVx1MDAzZW1hcCwgbWFwX3ZhbHVlKTtcbiBcdH1cbkBAIC04NjksMTcgJiM0Mzs5NzcsMTcgQEAgc3RhdGljIGJvb2wgaHRhYl9scnVfbWFwX2RlbGV0ZV9ub2RlKHZvaWQgKmFyZywgc3RydWN0IGJwZl9scnVfbm9kZSAqbm9kZSlcbiBcdHN0cnVjdCBidWNrZXQgKmI7XG4gXHRpbnQgcmV0O1xuIFxuLVx0dGd0X2wgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpO1xuLVx0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCB0Z3RfbC1cdTAwM2VoYXNoKTtcbiYjNDM7XHR0Z3RfbCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7XG4mIzQzO1x0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCBodGFiX2VsZW1faGFzaChodGFiLCB0Z3RfbCkpO1xuIFx0aGVhZCA9IFx1MDAyNmItXHUwMDNlaGVhZDtcbiBcbiBcdHJldCA9IGh0YWJfbG9ja19idWNrZXQoYiwgXHUwMDI2ZmxhZ3MpO1xuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuLVx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSlcbiYjNDM7XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4gXHRcdGlmIChsID09IHRndF9sKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2Vub2RlLmhhc2hfbm9kZSk7XG4gXHRcdFx0YnBmX21hcF9kZWNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbkBAIC05MTIsMTggJiM0MzsxMDIwLDE5IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfZ2V0X25leHRfa2V5KHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqbmV4dF9rZXkpXG4gXHRoZWFkID0gc2VsZWN0X2J1Y2tldChodGFiLCBoYXNoKTtcbiBcbiBcdC8qIGxvb2t1cCB0aGUga2V5ICovXG4tXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXHUwMDNlbl9idWNrZXRzKTtcbiYjNDM7XHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXHUwMDNlbl9idWNrZXRzKTtcbiBcbiBcdGlmICghbClcbiBcdFx0Z290byBmaW5kX2ZpcnN0X2VsZW07XG4gXG4gXHQvKiBrZXkgd2FzIGZvdW5kLCBnZXQgbmV4dCBrZXkgaW4gdGhlIHNhbWUgYnVja2V0ICovXG4tXHRuZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXHUwMDI2bC1cdTAwM2VoYXNoX25vZGUpKSxcbi1cdFx0XHRcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcbiYjNDM7XHRuZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKFxuJiM0MztcdFx0XHRyY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX25leHRfcmN1KFx1MDAyNmwtXHUwMDNlbm9kZS5oYXNoX25vZGUpKSxcbiYjNDM7XHRcdFx0c3RydWN0IGh0YWJfZWxlbSwgbm9kZS5oYXNoX25vZGUpO1xuIFxuIFx0aWYgKG5leHRfbCkge1xuIFx0XHQvKiBpZiBuZXh0IGVsZW0gaW4gdGhpcyBoYXNoIGxpc3QgaXMgbm9uLXplcm8sIGp1c3QgcmV0dXJuIGl0ICovXG4tXHRcdG1lbWNweShuZXh0X2tleSwgbmV4dF9sLVx1MDAzZWtleSwga2V5X3NpemUpO1xuJiM0MztcdFx0bWVtY3B5KG5leHRfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIG5leHRfbCksIGtleV9zaXplKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4gXG5AQCAtOTM4LDEwICYjNDM7MTA0NywxMCBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dldF9uZXh0X2tleShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKm5leHRfa2V5KVxuIFxuIFx0XHQvKiBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGJ1Y2tldCAqL1xuIFx0XHRuZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfZmlyc3RfcmN1KGhlYWQpKSxcbi1cdFx0XHRcdFx0ICBzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUpO1xuJiM0MztcdFx0XHRcdFx0ICBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XG4gXHRcdGlmIChuZXh0X2wpIHtcbiBcdFx0XHQvKiBpZiBpdCYjMzk7cyBub3QgZW1wdHksIGp1c3QgcmV0dXJuIGl0ICovXG4tXHRcdFx0bWVtY3B5KG5leHRfa2V5LCBuZXh0X2wtXHUwMDNla2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdG1lbWNweShuZXh0X2tleSwgaHRhYl9lbGVtX2tleShodGFiLCBuZXh0X2wpLCBrZXlfc2l6ZSk7XG4gXHRcdFx0cmV0dXJuIDA7XG4gXHRcdH1cbiBcdH1cbkBAIC05NTUsNyAmIzQzOzEwNjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2VsZW1fZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4gXHRjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhodGFiLCBsKTtcbiBcbiBcdGlmIChodGFiLVx1MDAzZW1hcC5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0gpXG4tXHRcdGJwZl9tZW1fY2FjaGVfZnJlZShcdTAwMjZodGFiLVx1MDAzZXBjcHVfbWEsIGwtXHUwMDNlcHRyX3RvX3BwdHIpO1xuJiM0MztcdFx0YnBmX21lbV9jYWNoZV9mcmVlKFx1MDAyNmh0YWItXHUwMDNlcGNwdV9tYSwgaHRhYl9lbGVtX2dldF9wdHJfdG9fcHB0cihsKSk7XG4gXHRicGZfbWVtX2NhY2hlX2ZyZWUoXHUwMDI2aHRhYi1cdTAwM2VtYSwgbCk7XG4gfVxuIFxuQEAgLTk2NSw3ICYjNDM7MTA3NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfcHV0X2ZkX3ZhbHVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcbiBcdHZvaWQgKnB0cjtcbiBcbiBcdGlmIChtYXAtXHUwMDNlb3BzLVx1MDAzZW1hcF9mZF9wdXRfcHRyKSB7XG4tXHRcdHB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIobWFwLCBsKTtcbiYjNDM7XHRcdHB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIoaHRhYiwgbCk7XG4gXHRcdG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2ZkX3B1dF9wdHIobWFwLCBwdHIsIHRydWUpO1xuIFx0fVxuIH1cbkBAIC0xMDA2LDcgJiM0MzsxMTE1LDcgQEAgc3RhdGljIHZvaWQgZnJlZV9odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIFx0aWYgKGh0YWJfaXNfcHJlYWxsb2MoaHRhYikpIHtcbiBcdFx0YnBmX21hcF9kZWNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4gXHRcdGNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKGh0YWIsIGwpO1xuLVx0XHRwY3B1X2ZyZWVsaXN0X3B1c2goXHUwMDI2aHRhYi1cdTAwM2VmcmVlbGlzdCwgXHUwMDI2bC1cdTAwM2Vmbm9kZSk7XG4mIzQzO1x0XHRwY3B1X2ZyZWVsaXN0X3B1c2goXHUwMDI2aHRhYi1cdTAwM2VmcmVlbGlzdCwgXHUwMDI2bC1cdTAwM2Vub2RlLmZub2RlKTtcbiBcdH0gZWxzZSB7XG4gXHRcdGRlY19lbGVtX2NvdW50KGh0YWIpO1xuIFx0XHRodGFiX2VsZW1fZnJlZShodGFiLCBsKTtcbkBAIC0xMDk3LDcgJiM0MzsxMjA2LDcgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcbiBcdFx0XHRsID0gX19wY3B1X2ZyZWVsaXN0X3BvcChcdTAwMjZodGFiLVx1MDAzZWZyZWVsaXN0KTtcbiBcdFx0XHRpZiAoIWwpXG4gXHRcdFx0XHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xuLVx0XHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKTtcbiYjNDM7XHRcdFx0bF9uZXcgPSBjb250YWluZXJfb2YobCwgc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSk7XG4gXHRcdFx0YnBmX21hcF9pbmNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4gXHRcdH1cbiBcdH0gZWxzZSB7XG5AQCAtMTExNywxMCAmIzQzOzEyMjYsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcbiBcdFx0fVxuIFx0fVxuIFxuLVx0bWVtY3B5KGxfbmV3LVx1MDAzZWtleSwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0aWYgKGh0YWJfaGFzX2hhc2goaHRhYikpIHtcbiYjNDM7XHRcdG1lbWNweShodGFiX2VsZW1fa2V5KGh0YWIsIGxfbmV3KSwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdC8qIFplcm8tZXh0ZW5kIGtleSBpbnRvIGsgZm9yIGFuIGF0b21pYyB3cml0ZSB0byBzdXBwb3J0XG4mIzQzO1x0XHQgKiBsb2NrbGVzcyBSQ1UgcmVhZGVycy5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBrID0gMDtcbiYjNDM7XG4mIzQzO1x0XHRtZW1jcHkoXHUwMDI2aywga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0XHRXUklURV9PTkNFKCoodW5zaWduZWQgbG9uZyAqKWh0YWJfZWxlbV9rZXkoaHRhYiwgbF9uZXcpLCBrKTtcbiYjNDM7XHR9XG4gXHRpZiAocGVyY3B1KSB7XG4gXHRcdGlmIChwcmVhbGxvYykge1xuLVx0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsX25ldywga2V5X3NpemUpO1xuJiM0MztcdFx0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9uZXcpO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdC8qIGFsbG9jX3BlcmNwdSB6ZXJvLWZpbGxzICovXG4gXHRcdFx0dm9pZCAqcHRyID0gYnBmX21lbV9jYWNoZV9hbGxvYyhcdTAwMjZodGFiLVx1MDAzZXBjcHVfbWEpO1xuQEAgLTExMzAsMjYgJiM0MzsxMjQ5LDI2IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICphbGxvY19odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksXG4gXHRcdFx0XHRsX25ldyA9IEVSUl9QVFIoLUVOT01FTSk7XG4gXHRcdFx0XHRnb3RvIGRlY19jb3VudDtcbiBcdFx0XHR9XG4tXHRcdFx0bF9uZXctXHUwMDNlcHRyX3RvX3BwdHIgPSBwdHI7XG4mIzQzO1x0XHRcdGh0YWJfZWxlbV9zZXRfcHRyX3RvX3BwdHIobF9uZXcsIHB0cik7XG4gXHRcdFx0cHB0ciA9ICoodm9pZCBfX3BlcmNwdSAqKilwdHI7XG4gXHRcdH1cbiBcbiBcdFx0cGNwdV9pbml0X3ZhbHVlKGh0YWIsIHBwdHIsIHZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7XG4gXG4gXHRcdGlmICghcHJlYWxsb2MpXG4tXHRcdFx0aHRhYl9lbGVtX3NldF9wdHIobF9uZXcsIGtleV9zaXplLCBwcHRyKTtcbiYjNDM7XHRcdFx0aHRhYl9lbGVtX3NldF9wdHIoaHRhYiwgbF9uZXcsIHBwdHIpO1xuIFx0fSBlbHNlIGlmIChmZF9odGFiX21hcF9uZWVkc19hZGp1c3QoaHRhYikpIHtcbiBcdFx0c2l6ZSA9IHJvdW5kX3VwKHNpemUsIDgpO1xuLVx0XHRtZW1jcHkoaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBrZXlfc2l6ZSksIHZhbHVlLCBzaXplKTtcbiYjNDM7XHRcdG1lbWNweShodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSwgc2l6ZSk7XG4gXHR9IGVsc2UgaWYgKG1hcF9mbGFncyBcdTAwMjYgQlBGX0ZfTE9DSykge1xuIFx0XHRjb3B5X21hcF92YWx1ZV9sb2NrZWQoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSxcbiYjNDM7XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLFxuIFx0XHRcdFx0ICAgICAgdmFsdWUsIGZhbHNlKTtcbiBcdH0gZWxzZSB7XG4tXHRcdGNvcHlfbWFwX3ZhbHVlKFx1MDAyNmh0YWItXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSwgdmFsdWUpO1xuJiM0MztcdFx0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksIHZhbHVlKTtcbiBcdH1cbiBcbi1cdGxfbmV3LVx1MDAzZWhhc2ggPSBoYXNoO1xuJiM0MztcdGh0YWJfZWxlbV9zZXRfaGFzaChodGFiLCBsX25ldywgaGFzaCk7XG4gXHRyZXR1cm4gbF9uZXc7XG4gZGVjX2NvdW50OlxuIFx0ZGVjX2VsZW1fY291bnQoaHRhYik7XG5AQCAtMTE5OSw3ICYjNDM7MTMxOCw3IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHRcdGlmICh1bmxpa2VseSghYnRmX3JlY29yZF9oYXNfZmllbGQobWFwLVx1MDAzZXJlY29yZCwgQlBGX1NQSU5fTE9DSykpKVxuIFx0XHRcdHJldHVybiAtRUlOVkFMO1xuIFx0XHQvKiBmaW5kIGFuIGVsZW1lbnQgd2l0aG91dCB0YWtpbmcgdGhlIGJ1Y2tldCBsb2NrICovXG4tXHRcdGxfb2xkID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsXG4mIzQzO1x0XHRsX29sZCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLFxuIFx0XHRcdFx0XHQgICAgICBodGFiLVx1MDAzZW5fYnVja2V0cyk7XG4gXHRcdHJldCA9IGNoZWNrX2ZsYWdzKGh0YWIsIGxfb2xkLCBtYXBfZmxhZ3MpO1xuIFx0XHRpZiAocmV0KVxuQEAgLTEyMDcsNyAmIzQzOzEzMjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0XHRpZiAobF9vbGQpIHtcbiBcdFx0XHQvKiBncmFiIHRoZSBlbGVtZW50IGxvY2sgYW5kIHVwZGF0ZSB2YWx1ZSBpbiBwbGFjZSAqL1xuIFx0XHRcdGNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsXG4tXHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKSxcbiBcdFx0XHRcdFx0ICAgICAgdmFsdWUsIGZhbHNlKTtcbiBcdFx0XHRyZXR1cm4gMDtcbiBcdFx0fVxuQEAgLTEyMjEsNyAmIzQzOzEzNDAsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuJiM0MztcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuQEAgLTEyMzUsNyAmIzQzOzEzNTQsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0XHQgKiBhbmQgdXBkYXRlIGVsZW1lbnQgaW4gcGxhY2VcbiBcdFx0ICovXG4gXHRcdGNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsXG4tXHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUobF9vbGQsIGtleV9zaXplKSxcbiYjNDM7XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0ICAgICAgdmFsdWUsIGZhbHNlKTtcbiBcdFx0cmV0ID0gMDtcbiBcdFx0Z290byBlcnI7XG5AQCAtMTI1Miw5ICYjNDM7MTM3MSw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHQvKiBhZGQgbmV3IGVsZW1lbnQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXRcbiBcdCAqIGNvbmN1cnJlbnQgc2VhcmNoIHdpbGwgZmluZCBpdCBiZWZvcmUgb2xkIGVsZW1cbiBcdCAqL1xuLVx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZWhhc2hfbm9kZSwgaGVhZCk7XG4mIzQzO1x0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZW5vZGUuaGFzaF9ub2RlLCBoZWFkKTtcbiBcdGlmIChsX29sZCkge1xuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBcdFx0LyogbF9vbGQgaGFzIGFscmVhZHkgYmVlbiBzdGFzaGVkIGluIGh0YWItXHUwMDNlZXh0cmFfZWxlbXMsIGNhbmNlbFxuIFx0XHQgKiBpdHMgcmV1c2FibGUgc3BlY2lhbCBmaWVsZHMgYmVmb3JlIGl0IGlzIGF2YWlsYWJsZSBmb3IgcmV1c2UuXG5AQCAtMTI3NSw3ICYjNDM7MTM5NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfbHJ1X3B1c2hfZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pXG4ge1xuIFx0Y2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgZWxlbSk7XG4gXHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbi1cdGJwZl9scnVfcHVzaF9mcmVlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBcdTAwMjZlbGVtLVx1MDAzZWxydV9ub2RlKTtcbiYjNDM7XHRicGZfbHJ1X3B1c2hfZnJlZShcdTAwMjZodGFiLVx1MDAzZWxydSwgaHRhYl9lbGVtX2xydV9ub2RlKGVsZW0pKTtcbiB9XG4gXG4gc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG5AQCAtMTMxMCwxMyAmIzQzOzE0MjksMTMgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWVcbiBcdGxfbmV3ID0gcHJlYWxsb2NfbHJ1X3BvcChodGFiLCBrZXksIGhhc2gpO1xuIFx0aWYgKCFsX25ldylcbiBcdFx0cmV0dXJuIC1FTk9NRU07XG4tXHRjb3B5X21hcF92YWx1ZShcdTAwMjZodGFiLVx1MDAzZW1hcCwgaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBtYXAtXHUwMDNla2V5X3NpemUpLCB2YWx1ZSk7XG4mIzQzO1x0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksIHZhbHVlKTtcbiBcbiBcdHJldCA9IGh0YWJfbG9ja19idWNrZXQoYiwgXHUwMDI2ZmxhZ3MpO1xuIFx0aWYgKHJldClcbiBcdFx0Z290byBlcnJfbG9ja19idWNrZXQ7XG4gXG4tXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiYjNDM7XHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiBcbiBcdHJldCA9IGNoZWNrX2ZsYWdzKGh0YWIsIGxfb2xkLCBtYXBfZmxhZ3MpO1xuIFx0aWYgKHJldClcbkBAIC0xMzI1LDEwICYjNDM7MTQ0NCwxMCBAQCBzdGF0aWMgbG9uZyBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZVxuIFx0LyogYWRkIG5ldyBlbGVtZW50IHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0XG4gXHQgKiBjb25jdXJyZW50IHNlYXJjaCB3aWxsIGZpbmQgaXQgYmVmb3JlIG9sZCBlbGVtXG4gXHQgKi9cbi1cdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xuJiM0MztcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2Vub2RlLmhhc2hfbm9kZSwgaGVhZCk7XG4gXHRpZiAobF9vbGQpIHtcbi1cdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXHUwMDI2bF9uZXctXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobF9uZXcpKTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bF9vbGQtXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xuIFx0fVxuIFx0cmV0ID0gMDtcbiBcbkBAIC0xMzgzLDcgJiM0MzsxNTAyLDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuJiM0MztcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuQEAgLTEzOTIsMTAgJiM0MzsxNTExLDEwIEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtX2luX3BsYWNlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcdGlmIChsX29sZCkge1xuIFx0XHQvKiBVcGRhdGUgdmFsdWUgaW4tcGxhY2UgKi9cbiBcdFx0aWYgKHBlcmNwdSkge1xuLVx0XHRcdHBjcHVfY29weV92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihsX29sZCwga2V5X3NpemUpLFxuJiM0MztcdFx0XHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0XHR2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZvaWQgKippbm5lcl9tYXBfcHB0ciA9IGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpO1xuJiM0MztcdFx0XHR2b2lkICoqaW5uZXJfbWFwX3BwdHIgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpO1xuIFxuIFx0XHRcdG9sZF9tYXBfcHRyID0gKmlubmVyX21hcF9wcHRyO1xuIFx0XHRcdFdSSVRFX09OQ0UoKmlubmVyX21hcF9wcHRyLCAqKHZvaWQgKiopdmFsdWUpO1xuQEAgLTE0MDcsNyAmIzQzOzE1MjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXG4gXHRcdFx0cmV0ID0gUFRSX0VSUihsX25ldyk7XG4gXHRcdFx0Z290byBlcnI7XG4gXHRcdH1cbi1cdFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZWhhc2hfbm9kZSwgaGVhZCk7XG4mIzQzO1x0XHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlbm9kZS5oYXNoX25vZGUsIGhlYWQpO1xuIFx0fVxuIGVycjpcbiBcdGh0YWJfdW5sb2NrX2J1Y2tldChiLCBmbGFncyk7XG5AQCAtMTQ1NiwyMiAmIzQzOzE1NzUsMjIgQEAgc3RhdGljIGxvbmcgX19odGFiX2xydV9wZXJjcHVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gZXJyX2xvY2tfYnVja2V0O1xuIFxuLVx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4gXG4gXHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcbiBcdGlmIChyZXQpXG4gXHRcdGdvdG8gZXJyO1xuIFxuIFx0aWYgKGxfb2xkKSB7XG4tXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmxfb2xkLVx1MDAzZWxydV9ub2RlKTtcbiYjNDM7XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsX29sZCkpO1xuIFxuIFx0XHQvKiBwZXItY3B1IGhhc2ggbWFwIGNhbiB1cGRhdGUgdmFsdWUgaW4tcGxhY2UgKi9cbi1cdFx0cGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfb2xkLCBrZXlfc2l6ZSksXG4mIzQzO1x0XHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0dmFsdWUsIG9uYWxsY3B1cywgbWFwX2ZsYWdzKTtcbiBcdH0gZWxzZSB7XG4tXHRcdHBjcHVfaW5pdF92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihsX25ldywga2V5X3NpemUpLFxuJiM0MztcdFx0cGNwdV9pbml0X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGxfbmV3KSxcbiBcdFx0XHRcdHZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7XG4tXHRcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xuJiM0MztcdFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZW5vZGUuaGFzaF9ub2RlLCBoZWFkKTtcbiBcdFx0bF9uZXcgPSBOVUxMO1xuIFx0fVxuIFx0cmV0ID0gMDtcbkBAIC0xNDgwLDcgJiM0MzsxNTk5LDcgQEAgc3RhdGljIGxvbmcgX19odGFiX2xydV9wZXJjcHVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBlcnJfbG9ja19idWNrZXQ6XG4gXHRpZiAobF9uZXcpIHtcbiBcdFx0YnBmX21hcF9kZWNfZWxlbV9jb3VudChcdTAwMjZodGFiLVx1MDAzZW1hcCk7XG4tXHRcdGJwZl9scnVfcHVzaF9mcmVlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBcdTAwMjZsX25ldy1cdTAwM2VscnVfbm9kZSk7XG4mIzQzO1x0XHRicGZfbHJ1X3B1c2hfZnJlZShcdTAwMjZodGFiLVx1MDAzZWxydSwgaHRhYl9lbGVtX2xydV9ub2RlKGxfbmV3KSk7XG4gXHR9XG4gXHRyZXR1cm4gcmV0O1xuIH1cbkBAIC0xNTIxLDkgJiM0MzsxNjQwLDkgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0bCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiBcdGlmIChsKVxuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlaGFzaF9ub2RlKTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2Vub2RlLmhhc2hfbm9kZSk7XG4gXHRlbHNlXG4gXHRcdHJldCA9IC1FTk9FTlQ7XG4gXG5AQCAtMTU1NiwxMCAmIzQzOzE2NzUsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG4tXHRsID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuJiM0MztcdGwgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4gXG4gXHRpZiAobClcbi1cdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xuIFx0ZWxzZVxuIFx0XHRyZXQgPSAtRU5PRU5UO1xuIFxuQEAgLTE1ODEsOCAmIzQzOzE3MDAsOCBAQCBzdGF0aWMgdm9pZCBkZWxldGVfYWxsX2VsZW1lbnRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47XG4gXHRcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4tXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XG4mIzQzO1x0XHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2Vub2RlLmhhc2hfbm9kZSk7XG4gXHRcdFx0aHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7XG4gXHRcdH1cbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG5AQCAtMTU5OSwxMCAmIzQzOzE3MTgsMTAgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX21hbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0XHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcbiBcdFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcbi1cdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4mIzQzO1x0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuIFx0XHRcdC8qIFdlIG9ubHkgZnJlZSBpbnRlcm5hbCBzdHJ1Y3RzIG9uIHVyZWYgZHJvcHBpbmcgdG8gemVybyAqL1xuIFx0XHRcdGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKFx1MDAyNmh0YWItXHUwMDNlbWFwLFxuLVx0XHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xuJiM0MztcdFx0XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCkpO1xuIFx0XHR9XG4gXHRcdGNvbmRfcmVzY2hlZF9yY3UoKTtcbiBcdH1cbkBAIC0xNjk3LDcgJiM0MzsxODE2LDcgQEAgc3RhdGljIGludCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0bCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiBcdGlmICghbCkge1xuIFx0XHRyZXQgPSAtRU5PRU5UO1xuIFx0XHRnb3RvIG91dF91bmxvY2s7XG5AQCAtMTcwOCwxNCAmIzQzOzE4MjcsMTQgQEAgc3RhdGljIGludCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0XHR2b2lkIF9fcGVyY3B1ICpwcHRyO1xuIFx0XHRpbnQgb2ZmID0gMCwgY3B1O1xuIFxuLVx0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwga2V5X3NpemUpO1xuJiM0MztcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdFx0Y29weV9tYXBfdmFsdWVfbG9uZyhcdTAwMjZodGFiLVx1MDAzZW1hcCwgdmFsdWUgJiM0Mzsgb2ZmLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcbiBcdFx0XHRjaGVja19hbmRfaW5pdF9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIHZhbHVlICYjNDM7IG9mZik7XG4gXHRcdFx0b2ZmICYjNDM7PSByb3VuZHVwX3ZhbHVlX3NpemU7XG4gXHRcdH1cbiBcdH0gZWxzZSB7XG4tXHRcdHZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdFx0dm9pZCAqc3JjID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIFxuIFx0XHRpZiAoZmxhZ3MgXHUwMDI2IEJQRl9GX0xPQ0spXG4gXHRcdFx0Y29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCwgdmFsdWUsIHNyYywgdHJ1ZSk7XG5AQCAtMTcyNCw3ICYjNDM7MTg0Myw3IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcdFx0LyogWmVyb2luZyBzcGVjaWFsIGZpZWxkcyBpbiB0aGUgdGVtcCBidWZmZXIgKi9cbiBcdFx0Y2hlY2tfYW5kX2luaXRfbWFwX3ZhbHVlKG1hcCwgdmFsdWUpO1xuIFx0fVxuLVx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4mIzQzO1x0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBvdXRfdW5sb2NrOlxuIFx0aHRhYl91bmxvY2tfYnVja2V0KGIsIGJmbGFncyk7XG5AQCAtMTg2MCw3ICYjNDM7MTk3OSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdH1cbiBcbiBcdGJ1Y2tldF9jbnQgPSAwO1xuLVx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSlcbiYjNDM7XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4gXHRcdGJ1Y2tldF9jbnQmIzQzOyYjNDM7O1xuIFxuIFx0aWYgKGJ1Y2tldF9jbnQgXHUwMDI2XHUwMDI2ICFsb2NrZWQpIHtcbkBAIC0xODk3LDE0ICYjNDM7MjAxNiwxNCBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXHRpZiAoIWxvY2tlZClcbiBcdFx0Z290byBuZXh0X2JhdGNoO1xuIFxuLVx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBoYXNoX25vZGUpIHtcbi1cdFx0bWVtY3B5KGRzdF9rZXksIGwtXHUwMDNla2V5LCBrZXlfc2l6ZSk7XG4mIzQzO1x0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuJiM0MztcdFx0bWVtY3B5KGRzdF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbCksIGtleV9zaXplKTtcbiBcbiBcdFx0aWYgKGlzX3BlcmNwdSkge1xuIFx0XHRcdGludCBvZmYgPSAwLCBjcHU7XG4gXHRcdFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcbi1cdFx0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKTtcbiYjNDM7XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0XHRcdGlmIChlbGVtX21hcF9mbGFncyBcdTAwMjYgQlBGX0ZfQ1BVKSB7XG4gXHRcdFx0XHRjcHUgPSBlbGVtX21hcF9mbGFncyBcdTAwM2VcdTAwM2UgMzI7XG4gXHRcdFx0XHRjb3B5X21hcF92YWx1ZShcdTAwMjZodGFiLVx1MDAzZW1hcCwgZHN0X3ZhbCwgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7XG5AQCAtMTkxOCw3ICYjNDM7MjAzNyw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0dmFsdWUgPSBodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpO1xuJiM0MztcdFx0XHR2YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcbiBcdFx0XHRpZiAoaXNfZmRfaHRhYihodGFiKSkge1xuIFx0XHRcdFx0c3RydWN0IGJwZl9tYXAgKippbm5lcl9tYXAgPSB2YWx1ZTtcbiBcbkBAIC0xOTM2LDcgJiM0MzsyMDU1LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0XHRcdGNoZWNrX2FuZF9pbml0X21hcF92YWx1ZShtYXAsIGRzdF92YWwpO1xuIFx0XHR9XG4gXHRcdGlmIChkb19kZWxldGUpIHtcbi1cdFx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlaGFzaF9ub2RlKTtcbiYjNDM7XHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBcdFx0XHQvKiBicGZfbHJ1X3B1c2hfZnJlZSgpIHdpbGwgYWNxdWlyZSBscnVfbG9jaywgd2hpY2hcbiBcdFx0XHQgKiBtYXkgY2F1c2UgZGVhZGxvY2suIFNlZSBjb21tZW50cyBpbiBmdW5jdGlvblxuQEAgLTE5NDgsNyAmIzQzOzIwNjcsNyBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXHRcdFx0ICogbG9jayBiZWluZyBoZWxkIGFuZCBpdCB2aW9sYXRlcyB0aGUgbG9jayBydWxlLCBzb1xuIFx0XHRcdCAqIGludm9rZSBmcmVlX2h0YWJfZWxlbSgpIGFmdGVyIHVubG9jayBhcyB3ZWxsLlxuIFx0XHRcdCAqL1xuLVx0XHRcdGwtXHUwMDNlYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7XG4mIzQzO1x0XHRcdGwtXHUwMDNlbm9kZS5iYXRjaF9mbGluayA9IG5vZGVfdG9fZnJlZTtcbiBcdFx0XHRub2RlX3RvX2ZyZWUgPSBsO1xuIFx0XHR9XG4gXHRcdGRzdF9rZXkgJiM0Mzs9IGtleV9zaXplO1xuQEAgLTE5NjAsNyAmIzQzOzIwNzksNyBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXG4gXHR3aGlsZSAobm9kZV90b19mcmVlKSB7XG4gXHRcdGwgPSBub2RlX3RvX2ZyZWU7XG4tXHRcdG5vZGVfdG9fZnJlZSA9IG5vZGVfdG9fZnJlZS1cdTAwM2ViYXRjaF9mbGluaztcbiYjNDM7XHRcdG5vZGVfdG9fZnJlZSA9IG5vZGVfdG9fZnJlZS1cdTAwM2Vub2RlLmJhdGNoX2ZsaW5rO1xuIFx0XHRpZiAoaXNfbHJ1X21hcClcbiBcdFx0XHRodGFiX2xydV9wdXNoX2ZyZWUoaHRhYiwgbCk7XG4gXHRcdGVsc2VcbkBAIC0yMTA4LDggJiM0MzsyMjI3LDggQEAgYnBmX2hhc2hfbWFwX3NlcV9maW5kX25leHQoc3RydWN0IGJwZl9pdGVyX3NlcV9oYXNoX21hcF9pbmZvICppbmZvLFxuIFx0XHQvKiBubyB1cGRhdGUvZGVsZXRpb24gb24gdGhpcyBidWNrZXQsIHByZXZfZWxlbSBzaG91bGQgYmUgc3RpbGwgdmFsaWRcbiBcdFx0ICogYW5kIHdlIHdvbiYjMzk7dCBza2lwIGVsZW1lbnRzLlxuIFx0XHQgKi9cbi1cdFx0biA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXHUwMDI2cHJldl9lbGVtLVx1MDAzZWhhc2hfbm9kZSkpO1xuLVx0XHRlbGVtID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShuLCBzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUpO1xuJiM0MztcdFx0biA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXHUwMDI2cHJldl9lbGVtLVx1MDAzZW5vZGUuaGFzaF9ub2RlKSk7XG4mIzQzO1x0XHRlbGVtID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShuLCBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XG4gXHRcdGlmIChlbGVtKVxuIFx0XHRcdHJldHVybiBlbGVtO1xuIFxuQEAgLTIxMjUsNyAmIzQzOzIyNDQsNyBAQCBicGZfaGFzaF9tYXBfc2VxX2ZpbmRfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2hhc2hfbWFwX2luZm8gKmluZm8sXG4gXG4gXHRcdGNvdW50ID0gMDtcbiBcdFx0aGVhZCA9IFx1MDAyNmItXHUwMDNlaGVhZDtcbi1cdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGVsZW0sIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xuJiM0MztcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGVsZW0sIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XG4gXHRcdFx0aWYgKGNvdW50IFx1MDAzZT0gc2tpcF9lbGVtcykge1xuIFx0XHRcdFx0aW5mby1cdTAwM2VidWNrZXRfaWQgPSBpO1xuIFx0XHRcdFx0aW5mby1cdTAwM2Vza2lwX2VsZW1zID0gY291bnQ7XG5AQCAtMjE4MywxMiAmIzQzOzIzMDIsMTIgQEAgc3RhdGljIGludCBfX2JwZl9oYXNoX21hcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGh0YWJfZWxlbSAqZWxlbSlcbiBcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuIFx0XHRjdHgubWFwID0gaW5mby1cdTAwM2VtYXA7XG4gXHRcdGlmIChlbGVtKSB7XG4tXHRcdFx0Y3R4LmtleSA9IGVsZW0tXHUwMDNla2V5O1xuJiM0MztcdFx0XHRjdHgua2V5ID0gaHRhYl9lbGVtX2tleShpbmZvLVx1MDAzZWh0YWIsIGVsZW0pO1xuIFx0XHRcdGlmICghaW5mby1cdTAwM2VwZXJjcHVfdmFsdWVfYnVmKSB7XG4tXHRcdFx0XHRjdHgudmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgbWFwLVx1MDAzZWtleV9zaXplKTtcbiYjNDM7XHRcdFx0XHRjdHgudmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoaW5mby1cdTAwM2VodGFiLCBlbGVtKTtcbiBcdFx0XHR9IGVsc2Uge1xuIFx0XHRcdFx0cm91bmR1cF92YWx1ZV9zaXplID0gcm91bmRfdXAobWFwLVx1MDAzZXZhbHVlX3NpemUsIDgpO1xuLVx0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGluZm8tXHUwMDNlaHRhYiwgZWxlbSk7XG4gXHRcdFx0XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdFx0XHRcdGNvcHlfbWFwX3ZhbHVlX2xvbmcobWFwLCBpbmZvLVx1MDAzZXBlcmNwdV92YWx1ZV9idWYgJiM0Mzsgb2ZmLFxuIFx0XHRcdFx0XHRcdFx0ICAgIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuQEAgLTIyOTIsMTQgJiM0MzsyNDExLDE0IEBAIHN0YXRpYyBsb25nIGJwZl9mb3JfZWFjaF9oYXNoX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgYnBmX2NhbGxiYWNrX3QgY2FsbGJhY2tfXG4gXHRcdGIgPSBcdTAwMjZodGFiLVx1MDAzZWJ1Y2tldHNbaV07XG4gXHRcdHJjdV9yZWFkX2xvY2soKTtcbiBcdFx0aGVhZCA9IFx1MDAyNmItXHUwMDNlaGVhZDtcbi1cdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShlbGVtLCBuLCBoZWFkLCBoYXNoX25vZGUpIHtcbi1cdFx0XHRrZXkgPSBlbGVtLVx1MDAzZWtleTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcbiYjNDM7XHRcdFx0a2V5ID0gaHRhYl9lbGVtX2tleShodGFiLCBlbGVtKTtcbiBcdFx0XHRpZiAoaXNfcGVyY3B1KSB7XG4gXHRcdFx0XHQvKiBjdXJyZW50IGNwdSB2YWx1ZSBmb3IgcGVyY3B1IG1hcCAqL1xuLVx0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGVsZW0pO1xuIFx0XHRcdFx0dmFsID0gdGhpc19jcHVfcHRyKHBwdHIpO1xuIFx0XHRcdH0gZWxzZSB7XG4tXHRcdFx0XHR2YWwgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgbWFwLVx1MDAzZWtleV9zaXplKTtcbiYjNDM7XHRcdFx0XHR2YWwgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSk7XG4gXHRcdFx0fVxuIFx0XHRcdG51bV9lbGVtcyYjNDM7JiM0Mzs7XG4gXHRcdFx0cmV0ID0gY2FsbGJhY2tfZm4oKHU2NCkobG9uZyltYXAsICh1NjQpKGxvbmcpa2V5LFxuQEAgLTI0MDMsMTAgJiM0MzsyNTIyLDExIEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX2xydV9tYXBfb3BzID0ge1xuIC8qIENhbGxlZCBmcm9tIGVCUEYgcHJvZ3JhbSAqL1xuIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgaHRhYl9lbGVtICpsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7XG4gXG4gXHRpZiAobClcbi1cdFx0cmV0dXJuIHRoaXNfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpKTtcbiYjNDM7XHRcdHJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCkpO1xuIFx0ZWxzZVxuIFx0XHRyZXR1cm4gTlVMTDtcbiB9XG5AQCAtMjQxNCw2ICYjNDM7MjUzNCw3IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIC8qIGlubGluZSBicGZfbWFwX2xvb2t1cF9lbGVtKCkgY2FsbCBmb3IgcGVyLUNQVSBoYXNobWFwICovXG4gc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxuIHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjtcbiBcbiBcdGlmICghYnBmX2ppdF9zdXBwb3J0c19wZXJjcHVfaW5zbigpKVxuQEAgLTI0MjQsNyAmIzQzOzI1NDUsNyBAQCBzdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zblxuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTtcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMyk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMCxcbi1cdFx0XHRcdG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGtleSkgJiM0Mzsgcm91bmR1cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiYjNDM7XHRcdFx0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgJiM0Mzsgcm91bmR1cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzAsIDApO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX01PVjY0X1BFUkNQVV9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzApO1xuIFxuQEAgLTI0MzMsNiAmIzQzOzI1NTQsNyBAQCBzdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zblxuIFxuIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdTMyIGNwdSlcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcbiBcdGlmIChjcHUgXHUwMDNlPSBucl9jcHVfaWRzKVxuQEAgLTI0NDAsMTggJiM0MzsyNTYyLDE5IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcbiBcdGwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKSwgY3B1KTtcbiYjNDM7XHRcdHJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKSwgY3B1KTtcbiBcdGVsc2VcbiBcdFx0cmV0dXJuIE5VTEw7XG4gfVxuIFxuIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xuIFxuIFx0aWYgKGwpIHtcbi1cdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXHUwMDI2bC1cdTAwM2VscnVfbm9kZSk7XG4tXHRcdHJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKSk7XG4mIzQzO1x0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobCkpO1xuJiM0MztcdFx0cmV0dXJuIHRoaXNfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKSk7XG4gXHR9XG4gXG4gXHRyZXR1cm4gTlVMTDtcbkBAIC0yNDU5LDYgJiM0MzsyNTgyLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIFxuIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHUzMiBjcHUpXG4ge1xuJiM0MztcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4gXHRpZiAoY3B1IFx1MDAzZT0gbnJfY3B1X2lkcylcbkBAIC0yNDY2LDggJiM0MzsyNTkwLDggQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtcbiBcbiBcdGwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcdGlmIChsKSB7XG4tXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmwtXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKSwgY3B1KTtcbiYjNDM7XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsKSk7XG4mIzQzO1x0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCksIGNwdSk7XG4gXHR9XG4gXG4gXHRyZXR1cm4gTlVMTDtcbkBAIC0yNDc1LDYgJiM0MzsyNTk5LDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtcbiBcbiBpbnQgYnBmX3BlcmNwdV9oYXNoX2NvcHkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwgdTY0IG1hcF9mbGFncylcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcdHZvaWQgX19wZXJjcHUgKnBwdHI7XG4gXHRpbnQgcmV0ID0gLUVOT0VOVDtcbkBAIC0yNDk0LDcgJiM0MzsyNjE5LDcgQEAgaW50IGJwZl9wZXJjcHVfaGFzaF9jb3B5KHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsIHU2NCBtYXBfZmxcbiBcdC8qIFdlIGRvIG5vdCBtYXJrIExSVSBtYXAgZWxlbWVudCBoZXJlIGluIG9yZGVyIHRvIG5vdCBtZXNzIHVwXG4gXHQgKiBldmljdGlvbiBoZXVyaXN0aWNzIHdoZW4gdXNlciBzcGFjZSBkb2VzIGEgbWFwIHdhbGsuXG4gXHQgKi9cbi1cdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuJiM0MztcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcbiBcdGlmIChtYXBfZmxhZ3MgXHUwMDI2IEJQRl9GX0NQVSkge1xuIFx0XHRjcHUgPSBtYXBfZmxhZ3MgXHUwMDNlXHUwMDNlIDMyO1xuIFx0XHRjb3B5X21hcF92YWx1ZShtYXAsIHZhbHVlLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcbkBAIC0yNTMyLDYgJiM0MzsyNjU3LDcgQEAgaW50IGJwZl9wZXJjcHVfaGFzaF91cGRhdGUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBzdGF0aWMgdm9pZCBodGFiX3BlcmNwdV9tYXBfc2VxX3Nob3dfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXG4gXHRcdFx0XHRcdCAgc3RydWN0IHNlcV9maWxlICptKVxuIHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgaHRhYl9lbGVtICpsO1xuIFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcdGludCBjcHU7XG5AQCAtMjU0Niw3ICYjNDM7MjY3Miw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfcGVyY3B1X21hcF9zZXFfc2hvd19lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcbiBcdGJ0Zl90eXBlX3NlcV9zaG93KG1hcC1cdTAwM2VidGYsIG1hcC1cdTAwM2VidGZfa2V5X3R5cGVfaWQsIGtleSwgbSk7XG4gXHRzZXFfcHV0cyhtLCBcJiMzNDs6IHtcXG5cJiMzNDspO1xuLVx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4mIzQzO1x0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xuIFx0XHRzZXFfcHJpbnRmKG0sIFwmIzM0O1xcdGNwdSVkOiBcJiMzNDssIGNwdSk7XG4gXHRcdGJ0Zl90eXBlX3NlcV9zaG93KG1hcC1cdTAwM2VidGYsIG1hcC1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCxcbkBAIC0yNjE5LDggJiM0MzsyNzQ1LDggQEAgc3RhdGljIHZvaWQgZmRfaHRhYl9tYXBfZnJlZShzdHJ1Y3QgYnBmX21hcCAqbWFwKVxuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgaHRhYi1cdTAwM2VuX2J1Y2tldHM7IGkmIzQzOyYjNDM7KSB7XG4gXHRcdGhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGkpO1xuIFxuLVx0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xuLVx0XHRcdHZvaWQgKnB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIobWFwLCBsKTtcbiYjNDM7XHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcbiYjNDM7XHRcdFx0dm9pZCAqcHRyID0gZmRfaHRhYl9tYXBfZ2V0X3B0cihodGFiLCBsKTtcbiBcbiBcdFx0XHRtYXAtXHUwMDNlb3BzLVx1MDAzZW1hcF9mZF9wdXRfcHRyKG1hcCwgcHRyLCBmYWxzZSk7XG4gXHRcdH1cbkBAIC0yNzA1LDYgJiM0MzsyODMxLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfb2ZfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBzdGF0aWMgaW50IGh0YWJfb2ZfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdCAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XG4gXHRjb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wO1xuIFxuQEAgLTI3MTMsNyAmIzQzOzI4NDAsNyBAQCBzdGF0aWMgaW50IGh0YWJfb2ZfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7XG4gXHQqaW5zbiYjNDM7JiM0MzsgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDIpO1xuIFx0Kmluc24mIzQzOyYjNDM7ID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCByZXQsXG4tXHRcdFx0XHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICYjNDM7XG4mIzQzO1x0XHRcdFx0aHRhYi1cdTAwM2VrZXlfb2Zmc2V0ICYjNDM7XG4gXHRcdFx0XHRyb3VuZF91cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiBcdCppbnNuJiM0MzsmIzQzOyA9IEJQRl9MRFhfTUVNKEJQRl9EVywgcmV0LCByZXQsIDApO1xuIFxuQEAgLTMxMTIsNyAmIzQzOzMyMzksNyBAQCBzdGF0aWMgaW50IHJodGFiX21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuIHtcbiBcdHN0cnVjdCBicGZfcmh0YWIgKnJodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9yaHRhYiwgbWFwKTtcbiBcbi1cdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZyaHRhYi1cdTAwM2VtYSwgcmh0YWJfbWVtX2R0b3IpO1xuJiM0MztcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZyaHRhYi1cdTAwM2VtYSwgcmh0YWJfbWVtX2R0b3IsIG9mZnNldG9mKHN0cnVjdCByaHRhYl9lbGVtLCBkYXRhKSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHJodGFiX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcClcbkBAIC0zNTMzLDMgJiM0MzszNjYwLDE2IEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyByaHRhYl9tYXBfb3BzID0ge1xuIFx0Lm1hcF9idGZfaWQgPSBcdTAwMjZyaHRhYl9tYXBfYnRmX2lkc1swXSxcbiBcdC5pdGVyX3NlcV9pbmZvID0gXHUwMDI2cmhhc2hfaXRlcl9zZXFfaW5mbyxcbiB9O1xuJiM0MztcbiYjNDM7c2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9odGFiKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBicGZfaHRhYl9tYXBfbWV0YV9pbml0KHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaHRhYiAqaW5uZXJfaHRhYl9tZXRhID0gY29udGFpbmVyX29mKGlubmVyX21hcF9tZXRhLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4mIzQzO1x0c3RydWN0IGJwZl9odGFiICppbm5lcl9odGFiID0gY29udGFpbmVyX29mKGlubmVyX21hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuJiM0MztcbiYjNDM7XHRpbm5lcl9odGFiX21ldGEtXHUwMDNla2V5X29mZnNldCA9IGlubmVyX2h0YWItXHUwMDNla2V5X29mZnNldDtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5jIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcbmluZGV4IGQyY2JhYjRiZGY2NDQuLmIyZGI1ZDBjOThiZWUgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcbkBAIC03LDYgJiM0Mzs3LDE1IEBAXG4gXG4gI2luY2x1ZGUgXCYjMzQ7bWFwX2luX21hcC5oXCYjMzQ7XG4gXG4mIzQzO3N0YXRpYyBib29sIGJwZl9tYXBfdHlwZV9pc19odGFiKGVudW0gYnBmX21hcF90eXBlIHR5cGUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSCB8fFxuJiM0MztcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfSEFTSCB8fFxuJiM0MztcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9MUlVfSEFTSCB8fFxuJiM0MztcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9MUlVfUEVSQ1BVX0hBU0ggfHxcbiYjNDM7XHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTO1xuJiM0Mzt9XG4mIzQzO1xuIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4ge1xuIFx0c3RydWN0IGJwZl9tYXAgKmlubmVyX21hcCwgKmlubmVyX21hcF9tZXRhO1xuQEAgLTI5LDYgJiM0MzszOCw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4gXHQvKiBJbiBzb21lIGNhc2VzIHZlcmlmaWVyIG5lZWRzIHRvIGFjY2VzcyBiZXlvbmQganVzdCBiYXNlIG1hcC4gKi9cbiBcdGlmIChpbm5lcl9tYXAtXHUwMDNlb3BzID09IFx1MDAyNmFycmF5X21hcF9vcHMgfHwgaW5uZXJfbWFwLVx1MDAzZW9wcyA9PSBcdTAwMjZwZXJjcHVfYXJyYXlfbWFwX29wcylcbiBcdFx0aW5uZXJfbWFwX21ldGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnBmX2FycmF5KTtcbiYjNDM7XHRlbHNlIGlmIChicGZfbWFwX3R5cGVfaXNfaHRhYihpbm5lcl9tYXAtXHUwMDNlbWFwX3R5cGUpKVxuJiM0MztcdFx0aW5uZXJfbWFwX21ldGFfc2l6ZSA9IGJwZl9odGFiX21hcF9tZXRhX3NpemUoKTtcbiBcbiBcdGlubmVyX21hcF9tZXRhID0ga3phbGxvYyhpbm5lcl9tYXBfbWV0YV9zaXplLCBHRlBfVVNFUik7XG4gXHRpZiAoIWlubmVyX21hcF9tZXRhKVxuQEAgLTcwLDYgJiM0Mzs4MSw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4gXHRcdGlubmVyX2FycmF5X21ldGEtXHUwMDNlaW5kZXhfbWFzayA9IGlubmVyX2FycmF5LVx1MDAzZWluZGV4X21hc2s7XG4gXHRcdGlubmVyX2FycmF5X21ldGEtXHUwMDNlZWxlbV9zaXplID0gaW5uZXJfYXJyYXktXHUwMDNlZWxlbV9zaXplO1xuIFx0XHRpbm5lcl9tYXBfbWV0YS1cdTAwM2VieXBhc3Nfc3BlY192MSA9IGlubmVyX21hcC1cdTAwM2VieXBhc3Nfc3BlY192MTtcbiYjNDM7XHR9IGVsc2UgaWYgKGJwZl9tYXBfdHlwZV9pc19odGFiKGlubmVyX21hcC1cdTAwM2VtYXBfdHlwZSkpIHtcbiYjNDM7XHRcdGJwZl9odGFiX21hcF9tZXRhX2luaXQoaW5uZXJfbWFwX21ldGEsIGlubmVyX21hcCk7XG4gXHR9XG4gXHRyZXR1cm4gaW5uZXJfbWFwX21ldGE7XG4gfVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5oIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmhcbmluZGV4IDdkNjE2MDIzNTRkZTguLjFlZGMyMDU3NzJkOGMgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmhcbkBAIC0xNSw1ICYjNDM7MTUsNyBAQCB2b2lkICpicGZfbWFwX2ZkX2dldF9wdHIoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGZpbGUgKm1hcF9maWxlLFxuIFx0XHRcdCBpbnQgdWZkKTtcbiB2b2lkIGJwZl9tYXBfZmRfcHV0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpwdHIsIGJvb2wgbmVlZF9kZWZlcik7XG4gdTMyIGJwZl9tYXBfZmRfc3lzX2xvb2t1cF9lbGVtKHZvaWQgKnB0cik7XG4mIzQzO3NpemVfdCBicGZfaHRhYl9tYXBfbWV0YV9zaXplKHZvaWQpO1xuJiM0Mzt2b2lkIGJwZl9odGFiX21hcF9tZXRhX2luaXQoc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcF9tZXRhLCBzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwKTtcbiBcbiAjZW5kaWZcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmNcbmluZGV4IDM3M2M4ZDE3ZWE1NTcuLjZiZDRjYjY4YzIwYzEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tYXBfcHRyX2tlcm4uY1xuQEAgLTExNCw3ICYjNDM7MTE0LDcgQEAgc3RhdGljIGlubGluZSBpbnQgY2hlY2tfaGFzaCh2b2lkKVxuIFx0VkVSSUZZKGNoZWNrX2RlZmF1bHRfbm9pbmxpbmUoXHUwMDI2aGFzaC1cdTAwM2VtYXAsIG1hcCkpO1xuIFxuIFx0VkVSSUZZKGhhc2gtXHUwMDNlbl9idWNrZXRzID09IE1BWF9FTlRSSUVTKTtcbi1cdFZFUklGWShoYXNoLVx1MDAzZWVsZW1fc2l6ZSA9PSA2NCk7XG4mIzQzO1x0VkVSSUZZKGhhc2gtXHUwMDNlZWxlbV9zaXplID09IDMyKTtcbiBcbiBcdFZFUklGWShoYXNoLVx1MDAzZWNvdW50LmNvdW50ZXIgPT0gMCk7XG4gXHRWRVJJRlkoYnBmX21hcF9zdW1fZWxlbV9jb3VudChtYXApID09IDApO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmJlc3QtZXhwZW5zaXZlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2h0YWJfbWFwX2FsbG9jJiMzNDssCiAgICAmIzM0O2h0YWJfbWFwX3VwZGF0ZV9lbGVtJiMzNDssCiAgICAmIzM0O2h0YWJfbHJ1X21hcF91cGRhdGVfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX21hcF9sb29rdXBfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX21hcF9kZWxldGVfZWxlbSYjMzQ7LAogICAgJiMzNDticGZfbWFwX21ldGFfYWxsb2MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb3B0aW1pemVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIEJQRiBoYXNoIG1hcCBlbGVtZW50cyBieSBjb25kaXRpb25hbGx5IG9taXR0aW5nIHRoZSBoYXNoIHZhbHVlIGFuZCBhZGp1c3RpbmcgdGhlIGtleSBvZmZzZXQuIFRoaXMgYWZmZWN0cyBjb3JlIEJQRiBoYXNoIG1hcCBvcGVyYXRpb25zIGxpa2UgYWxsb2NhdGlvbiwgbG9va3VwLCB1cGRhdGUsIGFuZCBkZWxldGlvbi4gRnV6emluZyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZXNlIG9wZXJhdGlvbnMgc3RpbGwgd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgbmV3IG1lbW9yeSBsYXlvdXQgYW5kIHRoYXQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBtZW1vcnkgbGVha3Mgb2NjdXIuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA2NDU0YTExYzAzZGZhZWRiNGIwOWY4NTc1YWY4ZDAzNjM5ZmI1MjczCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBBdWcgNSAyMjo1MjoyMiAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGFzaHRhYi5jIGIva2VybmVsL2JwZi9oYXNodGFiLmMKaW5kZXggOWYzOTRlMWFhMmU4NS4uOTk2NzI2OGQ0NTNkMCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9oYXNodGFiLmMKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9oYXNodGFiLmMKQEAgLTEwMCwxMyAmIzQzOzEwMCwxNiBAQCBzdHJ1Y3QgYnBmX2h0YWIgewogCXN0cnVjdCBwZXJjcHVfY291bnRlciBwY291bnQ7CiAJYXRvbWljX3QgY291bnQ7CiAJYm9vbCB1c2VfcGVyY3B1X2NvdW50ZXI7CiYjNDM7CWJvb2wgaGFzX2hhc2g7CiAJdTMyIG5fYnVja2V0czsJLyogbnVtYmVyIG9mIGhhc2ggYnVja2V0cyAqLwogCXUzMiBlbGVtX3NpemU7CS8qIHNpemUgb2YgZWFjaCBlbGVtZW50IGluIGJ5dGVzICovCiYjNDM7CXUzMiBrZXlfb2Zmc2V0OwkvKiBvZmZzZXQgb2Yga2V5IGluIGJ5dGVzICovCiAJdTMyIGhhc2hybmQ7CiB9OwogCiAvKiBlYWNoIGh0YWIgZWxlbWVudCBpcyBzdHJ1Y3QgaHRhYl9lbGVtICYjNDM7IGtleSAmIzQzOyB2YWx1ZSAqLwotc3RydWN0IGh0YWJfZWxlbSB7CiYjNDM7c3RydWN0IGh0YWJfZWxlbTsKJiM0MztzdHJ1Y3QgaHRhYl9ub2RlIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlIGhhc2hfbm9kZTsKIAkJc3RydWN0IHsKQEAgLTExNywxOCAmIzQzOzEyMCwzMiBAQCBzdHJ1Y3QgaHRhYl9lbGVtIHsKIAkJCX07CiAJCX07CiAJfTsKLQl1bmlvbiB7Ci0JCS8qIHBvaW50ZXIgdG8gcGVyLWNwdSBwb2ludGVyICovCi0JCXZvaWQgKnB0cl90b19wcHRyOwotCQlzdHJ1Y3QgYnBmX2xydV9ub2RlIGxydV9ub2RlOwotCX07Ci0JdTMyIGhhc2g7Ci0JY2hhciBrZXlbXSBfX2FsaWduZWQoOCk7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgaHRhYl9lbGVtIHsKJiM0MzsJc3RydWN0IGh0YWJfbm9kZSBub2RlOwomIzQzOwl1OCBkYXRhW10gX19hbGlnbmVkKDgpOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGh0YWJfZWxlbV9scnUgewomIzQzOwlzdHJ1Y3QgaHRhYl9ub2RlIG5vZGU7CiYjNDM7CXN0cnVjdCBicGZfbHJ1X25vZGUgbHJ1X25vZGU7CiYjNDM7CXU4IGRhdGFbXSBfX2FsaWduZWQoOCk7CiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBPbmx5IGZvciBub24tcHJlYWxsb2NhdGVkIFBDUFUgbWFwcy4gUHJlYWxsb2NhdGVkIFBDUFUgbWFwcyBkb24mIzM5O3QgbmVlZAomIzQzOyAqIHB0cl90b19wcHRyLCBhbmQgdXNlIGh0YWJfZWxlbS4KJiM0MzsgKi8KJiM0MztzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgewomIzQzOwlzdHJ1Y3QgaHRhYl9ub2RlIG5vZGU7CiYjNDM7CXZvaWQgKnB0cl90b19wcHRyOwomIzQzOwl1OCBkYXRhW10gX19hbGlnbmVkKDgpOwogfTsKIAogc3RydWN0IGh0YWJfYnRmX3JlY29yZCB7CiAJc3RydWN0IGJ0Zl9yZWNvcmQgKnJlY29yZDsKIAl1MzIga2V5X3NpemU7CiYjNDM7CXUzMiBrZXlfb2Zmc2V0OwogfTsKIAogc3RhdGljIGlubGluZSBib29sIGh0YWJfaXNfcHJlYWxsb2MoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKQpAQCAtMTM2LDYgJiM0MzsxNTMsMjEgQEAgc3RhdGljIGlubGluZSBib29sIGh0YWJfaXNfcHJlYWxsb2MoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKQogCXJldHVybiAhKGh0YWItJmd0O21hcC5tYXBfZmxhZ3MgJmFtcDsgQlBGX0ZfTk9fUFJFQUxMT0MpOwogfQogCiYjNDM7c3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2xydV9ub2RlICpodGFiX2VsZW1fbHJ1X25vZGUoc3RydWN0IGh0YWJfZWxlbSAqbCkKJiM0Mzt7CiYjNDM7CXJldHVybiAmYW1wOygoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS0mZ3Q7bHJ1X25vZGU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX2dldF9wdHJfdG9fcHB0cihzdHJ1Y3QgaHRhYl9lbGVtICpsKQomIzQzO3sKJiM0MzsJcmV0dXJuICgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktJmd0O3B0cl90b19wcHRyOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHJfdG9fcHB0cihzdHJ1Y3QgaHRhYl9lbGVtICpsLCB2b2lkICpwdHIpCiYjNDM7ewomIzQzOwkoKHN0cnVjdCBodGFiX2VsZW1fcGNwdSAqKWwpLSZndDtwdHJfdG9fcHB0ciA9IHB0cjsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCBodGFiX2luaXRfYnVja2V0cyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC0xODMsMjUgJiM0MzsyMTUsMzAgQEAgc3RhdGljIGlubGluZSBib29sIGlzX2ZkX2h0YWIoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKQogCXJldHVybiBodGFiLSZndDttYXAubWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplKQomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX2tleShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiYjNDM7ewomIzQzOwlyZXR1cm4gKHZvaWQgKilsICYjNDM7IGh0YWItJmd0O2tleV9vZmZzZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX3ZhbHVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCkKIHsKLQlyZXR1cm4gbC0mZ3Q7a2V5ICYjNDM7IHJvdW5kX3VwKGtleV9zaXplLCA4KTsKJiM0MzsJcmV0dXJuIGh0YWJfZWxlbV9rZXkoaHRhYiwgbCkgJiM0Mzsgcm91bmRfdXAoaHRhYi0mZ3Q7bWFwLmtleV9zaXplLCA4KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBrZXlfc2l6ZSwKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsLAogCQkJCSAgICAgdm9pZCBfX3BlcmNwdSAqcHB0cikKIHsKLQkqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGwsIGtleV9zaXplKSA9IHBwdHI7CiYjNDM7CSoodm9pZCBfX3BlcmNwdSAqKilodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCkgPSBwcHRyOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wZXJjcHUgKmh0YWJfZWxlbV9nZXRfcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBrZXlfc2l6ZSkKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgX19wZXJjcHUgKmh0YWJfZWxlbV9nZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCkKIHsKLQlyZXR1cm4gKih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShsLCBrZXlfc2l6ZSk7CiYjNDM7CXJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpOwogfQogCi1zdGF0aWMgdm9pZCAqZmRfaHRhYl9tYXBfZ2V0X3B0cihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKQomIzQzO3N0YXRpYyB2b2lkICpmZF9odGFiX21hcF9nZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCkKIHsKLQlyZXR1cm4gKih2b2lkICoqKWh0YWJfZWxlbV92YWx1ZShsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJcmV0dXJuICoodm9pZCAqKilodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpnZXRfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgaW50IGkpCkBAIC0yMDksNiAmIzQzOzI0NiwzMyBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqZ2V0X2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIGludCBpKQogCXJldHVybiAoc3RydWN0IGh0YWJfZWxlbSAqKSAoaHRhYi0mZ3Q7ZWxlbXMgJiM0MzsgaSAqICh1NjQpaHRhYi0mZ3Q7ZWxlbV9zaXplKTsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBodGFiX2hhc19oYXNoKGNvbnN0IHN0cnVjdCBicGZfaHRhYiAqaHRhYikKJiM0Mzt7CiYjNDM7CXJldHVybiBodGFiLSZndDtoYXNfaGFzaDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB1MzIgaHRhYl9lbGVtX2hhc2goc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKQomIzQzO3sKJiM0MzsJaWYgKGh0YWJfaXNfbHJ1KGh0YWIpKQomIzQzOwkJcmV0dXJuICoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLSZndDtkYXRhOwomIzQzOwllbHNlIGlmIChodGFiX2lzX3BlcmNwdShodGFiKSAmYW1wOyZhbXA7ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKQomIzQzOwkJcmV0dXJuICoodTMyICopKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS0mZ3Q7ZGF0YTsKJiM0MzsJZWxzZQomIzQzOwkJcmV0dXJuICoodTMyICopbC0mZ3Q7ZGF0YTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfaGFzaChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBoYXNoKQomIzQzO3sKJiM0MzsJaWYgKCFodGFiX2hhc19oYXNoKGh0YWIpKQomIzQzOwkJcmV0dXJuOwomIzQzOwlpZiAoaHRhYl9pc19scnUoaHRhYikpCiYjNDM7CQkqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS0mZ3Q7ZGF0YSA9IGhhc2g7CiYjNDM7CWVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpICZhbXA7JmFtcDsgIWh0YWJfaXNfcHJlYWxsb2MoaHRhYikpCiYjNDM7CQkqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktJmd0O2RhdGEgPSBoYXNoOwomIzQzOwllbHNlCiYjNDM7CQkqKHUzMiAqKWwtJmd0O2RhdGEgPSBoYXNoOwomIzQzO30KJiM0MzsKIC8qIEJvdGggcGVyY3B1IGFuZCBmZCBodGFiIHN1cHBvcnQgaW4tcGxhY2UgdXBkYXRlLCBzbyBubyBuZWVkIGZvcgogICogZXh0cmEgZWxlbS4gTFJVIGl0c2VsZiBjYW4gcmVtb3ZlIHRoZSBsZWFzdCB1c2VkIGVsZW1lbnQsIHNvCiAgKiB0aGVyZSBpcyBubyBuZWVkIGZvciBhbiBleHRyYSBlbGVtIGR1cmluZyBtYXBfdXBkYXRlLgpAQCAtMjMxLDcgJiM0MzsyOTUsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2ZyZWVfcHJlYWxsb2NlZF9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfaHRhYiAqaHRhYikKIAogCQllbGVtID0gZ2V0X2h0YWJfZWxlbShodGFiLCBpKTsKIAkJYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoJmFtcDtodGFiLSZndDttYXAsCi0JCQkJCSAgICAgIGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLSZndDttYXAua2V5X3NpemUpKTsKJiM0MzsJCQkJCSAgICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBlbGVtKSk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KIH0KQEAgLTI1NCw3ICYjNDM7MzE4LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX3ByZWFsbG9jZWRfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYikKIAogCQllbGVtID0gZ2V0X2h0YWJfZWxlbShodGFiLCBpKTsKIAkJaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKSB7Ci0JCQl2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKTsKJiM0MzsJCQl2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZWxlbSk7CiAJCQlpbnQgY3B1OwogCiAJCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CkBAIC0yNjMsNyAmIzQzOzMyNyw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlicGZfb2JqX2ZyZWVfZmllbGRzKGh0YWItJmd0O21hcC5yZWNvcmQsCi0JCQkJCSAgICBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKSk7CiYjNDM7CQkJCQkgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCQl9CiAJCWNvbmRfcmVzY2hlZCgpOwpAQCAtMjgwLDggJiM0MzszNDQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2ZyZWVfZWxlbXMoc3RydWN0IGJwZl9odGFiICpodGFiKQogCWZvciAoaSA9IDA7IGkgJmx0OyBodGFiLSZndDttYXAubWF4X2VudHJpZXM7IGkmIzQzOyYjNDM7KSB7CiAJCXZvaWQgX19wZXJjcHUgKnBwdHI7CiAKLQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGdldF9odGFiX2VsZW0oaHRhYiwgaSksCi0JCQkJCSBodGFiLSZndDttYXAua2V5X3NpemUpOwomIzQzOwkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGdldF9odGFiX2VsZW0oaHRhYiwgaSkpOwogCQlmcmVlX3BlcmNwdShwcHRyKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQpAQCAtMzA4LDggJiM0MzszNzEsOCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqcHJlYWxsb2NfbHJ1X3BvcChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSwKIAogCWlmIChub2RlKSB7CiAJCWJwZl9tYXBfaW5jX2VsZW1fY291bnQoJmFtcDtodGFiLSZndDttYXApOwotCQlsID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKTsKLQkJbWVtY3B5KGwtJmd0O2tleSwga2V5LCBodGFiLSZndDttYXAua2V5X3NpemUpOwomIzQzOwkJbCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7CiYjNDM7CQltZW1jcHkoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBodGFiLSZndDttYXAua2V5X3NpemUpOwogCQlyZXR1cm4gbDsKIAl9CiAKQEAgLTM0MCw4ICYjNDM7NDAzLDcgQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYikKIAkJCQkJICAgIEdGUF9VU0VSIHwgX19HRlBfTk9XQVJOKTsKIAkJaWYgKCFwcHRyKQogCQkJZ290byBmcmVlX2VsZW1zOwotCQlodGFiX2VsZW1fc2V0X3B0cihnZXRfaHRhYl9lbGVtKGh0YWIsIGkpLCBodGFiLSZndDttYXAua2V5X3NpemUsCi0JCQkJICBwcHRyKTsKJiM0MzsJCWh0YWJfZWxlbV9zZXRfcHRyKGh0YWIsIGdldF9odGFiX2VsZW0oaHRhYiwgaSksIHBwdHIpOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAKQEAgLTM0OSw4ICYjNDM7NDExLDggQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYikKIAlpZiAoaHRhYl9pc19scnUoaHRhYikpCiAJCWVyciA9IGJwZl9scnVfaW5pdCgmYW1wO2h0YWItJmd0O2xydSwKIAkJCQkgICBodGFiLSZndDttYXAubWFwX2ZsYWdzICZhbXA7IEJQRl9GX05PX0NPTU1PTl9MUlUsCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaCkgLQotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSwKJiM0MzsJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGRhdGEpIC0KJiM0MzsJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSwKIAkJCQkgICBodGFiX2xydV9tYXBfZGVsZXRlX25vZGUsCiAJCQkJICAgaHRhYik7CiAJZWxzZQpAQCAtMzYxLDExICYjNDM7NDIzLDExIEBAIHN0YXRpYyBpbnQgcHJlYWxsb2NfaW5pdChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiAKIAlpZiAoaHRhYl9pc19scnUoaHRhYikpCiAJCWJwZl9scnVfcG9wdWxhdGUoJmFtcDtodGFiLSZndDtscnUsIGh0YWItJmd0O2VsZW1zLAotCQkJCSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSksCiYjNDM7CQkJCSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpLAogCQkJCSBodGFiLSZndDtlbGVtX3NpemUsIG51bV9lbnRyaWVzKTsKIAllbHNlCiAJCXBjcHVfZnJlZWxpc3RfcG9wdWxhdGUoJmFtcDtodGFiLSZndDtmcmVlbGlzdCwKLQkJCQkgICAgICAgaHRhYi0mZ3Q7ZWxlbXMgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgZm5vZGUpLAomIzQzOwkJCQkgICAgICAgaHRhYi0mZ3Q7ZWxlbXMgJiM0Mzsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSksCiAJCQkJICAgICAgIGh0YWItJmd0O2VsZW1fc2l6ZSwgbnVtX2VudHJpZXMpOwogCiAJcmV0dXJuIDA7CkBAIC00MDEsNyAmIzQzOzQ2Myw3IEBAIHN0YXRpYyBpbnQgYWxsb2NfZXh0cmFfZWxlbXMoc3RydWN0IGJwZl9odGFiICpodGFiKQogCQkvKiBwb3Agd2lsbCBzdWNjZWVkLCBzaW5jZSBwcmVhbGxvY19pbml0KCkKIAkJICogcHJlYWxsb2NhdGVkIGV4dHJhIG51bV9wb3NzaWJsZV9jcHVzIGVsZW1lbnRzCiAJCSAqLwotCQlsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSk7CiYjNDM7CQlsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmZub2RlKTsKIAkJKnBlcl9jcHVfcHRyKHBwdHIsIGNwdSkgPSBsX25ldzsKIAl9CiAJaHRhYi0mZ3Q7ZXh0cmFfZWxlbXMgPSBwcHRyOwpAQCAtNDI1LDggJiM0Mzs0ODcsOCBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKQogCWJvb2wgemVyb19zZWVkID0gKGF0dHItJmd0O21hcF9mbGFncyAmYW1wOyBCUEZfRl9aRVJPX1NFRUQpOwogCWludCBudW1hX25vZGUgPSBicGZfbWFwX2F0dHJfbnVtYV9ub2RlKGF0dHIpOwogCi0JQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGZub2RlLm5leHQpICE9Ci0JCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlLnBwcmV2KSk7CiYjNDM7CUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBmbm9kZS5uZXh0KSAhPQomIzQzOwkJICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBoYXNoX25vZGUucHByZXYpKTsKIAogCWlmICh6ZXJvX3NlZWQgJmFtcDsmYW1wOyAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKIAkJLyogR3VhcmQgYWdhaW5zdCBsb2NhbCBEb1MsIGFuZCBkaXNjb3VyYWdlIHByb2R1Y3Rpb24gdXNlLiAqLwpAQCAtNDc2LDcgJiM0Mzs1MzgsNyBAQCBzdGF0aWMgdm9pZCBodGFiX21lbV9kdG9yKHZvaWQgKm9iaiwgdm9pZCAqY3R4KQogCWlmIChJU19FUlJfT1JfTlVMTChocmVjLSZndDtyZWNvcmQpKQogCQlyZXR1cm47CiAKLQltYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHJlYy0mZ3Q7a2V5X3NpemUpOwomIzQzOwltYXBfdmFsdWUgPSAodm9pZCAqKWVsZW0gJiM0MzsgaHJlYy0mZ3Q7a2V5X29mZnNldCAmIzQzOyByb3VuZF91cChocmVjLSZndDtrZXlfc2l6ZSwgOCk7CiAJYnBmX29ial9mcmVlX2ZpZWxkcyhocmVjLSZndDtyZWNvcmQsIG1hcF92YWx1ZSk7CiB9CiAKQEAgLTUwMiw3ICYjNDM7NTY0LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9kdG9yX2N0eF9mcmVlKHZvaWQgKmN0eCkKIH0KIAogc3RhdGljIGludCBicGZfbWFfc2V0X2R0b3Ioc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9tZW1fYWxsb2MgKm1hLAotCQkJICAgdm9pZCAoKmR0b3IpKHZvaWQgKiwgdm9pZCAqKSkKJiM0MzsJCQkgICB2b2lkICgqZHRvcikodm9pZCAqLCB2b2lkICopLCB1MzIga2V5X29mZnNldCkKIHsKIAlzdHJ1Y3QgaHRhYl9idGZfcmVjb3JkICpocmVjOwogCWludCBlcnI7CkBAIC01MTUsNiAmIzQzOzU3Nyw3IEBAIHN0YXRpYyBpbnQgYnBmX21hX3NldF9kdG9yKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfbWVtX2FsbG9jICptYSwKIAlpZiAoIWhyZWMpCiAJCXJldHVybiAtRU5PTUVNOwogCWhyZWMtJmd0O2tleV9zaXplID0gbWFwLSZndDtrZXlfc2l6ZTsKJiM0MzsJaHJlYy0mZ3Q7a2V5X29mZnNldCA9IGtleV9vZmZzZXQ7CiAJaHJlYy0mZ3Q7cmVjb3JkID0gYnRmX3JlY29yZF9kdXAobWFwLSZndDtyZWNvcmQpOwogCWlmIChJU19FUlIoaHJlYy0mZ3Q7cmVjb3JkKSkgewogCQllcnIgPSBQVFJfRVJSKGhyZWMtJmd0O3JlY29yZCk7CkBAIC01MzcsOSAmIzQzOzYwMCw5IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwKIAkgKiBwb3B1bGF0ZWQgaW4gaHRhYl9tYXBfYWxsb2MoKSwgc28gaXQgd2lsbCBhbHdheXMgYXBwZWFyIGFzIE5VTEwuCiAJICovCiAJaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKQotCQlyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgJmFtcDtodGFiLSZndDtwY3B1X21hLCBodGFiX3BjcHVfbWVtX2R0b3IpOwomIzQzOwkJcmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsICZhbXA7aHRhYi0mZ3Q7cGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yLCBodGFiLSZndDtrZXlfb2Zmc2V0KTsKIAllbHNlCi0JCXJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCAmYW1wO2h0YWItJmd0O21hLCBodGFiX21lbV9kdG9yKTsKJiM0MzsJCXJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCAmYW1wO2h0YWItJmd0O21hLCBodGFiX21lbV9kdG9yLCBodGFiLSZndDtrZXlfb2Zmc2V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cikKQEAgLTU2Miw2ICYjNDM7NjI1LDEzIEBAIHN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpCiAKIAlicGZfbWFwX2luaXRfZnJvbV9hdHRyKCZhbXA7aHRhYi0mZ3Q7bWFwLCBhdHRyKTsKIAomIzQzOwkvKiBBdm9pZCBoYXNoIG1lbW9yeSB1c2UgYW5kIGNvbXBhcmlzb25zIHdoZXJlIHVubmVjZXNzYXJ5LgomIzQzOwkgKiB1MzIgaGFzaCByZWFkcyBhcmUgYWx3YXlzIGF0b21pYy4gSWYgd2UgZWxpZGUgdGhlbSwga2V5IGNvbXBhcmlzb25zIG11c3QgYWxzbyBiZSBhdG9taWMKJiM0MzsJICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUga2V5IG1hdGNoZXMgZHVlIHRvIHRvcm4ga2V5IHJlYWRzIC8gd3JpdGVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGUKJiM0MzsJICogd2hlbiB0aGUga2V5IGZpdHMgd2l0aGluIGEgd29yZCwgc28gY2hlY2sga2V5X3NpemUuCiYjNDM7CSAqLwomIzQzOwlodGFiLSZndDtoYXNfaGFzaCA9IGh0YWJfaXNfbHJ1KGh0YWIpIHx8IGh0YWItJmd0O21hcC5rZXlfc2l6ZSAmZ3Q7IHNpemVvZih1bnNpZ25lZCBsb25nKTsKJiM0MzsKIAlpZiAocGVyY3B1X2xydSkgewogCQkvKiBlbnN1cmUgZWFjaCBDUFUmIzM5O3MgbHJ1IGxpc3QgaGFzICZndDs9MSBlbGVtZW50cy4KIAkJICogc2luY2Ugd2UgYXJlIGF0IGl0LCBtYWtlIGVhY2ggbHJ1IGxpc3QgaGFzIHRoZSBzYW1lCkBAIC01ODMsOCAmIzQzOzY1MywxNiBAQCBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKQogCiAJaHRhYi0mZ3Q7bl9idWNrZXRzID0gcm91bmR1cF9wb3dfb2ZfdHdvKGh0YWItJmd0O21hcC5tYXhfZW50cmllcyk7CiAKLQlodGFiLSZndDtlbGVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGh0YWJfZWxlbSkgJiM0MzsKLQkJCSAgcm91bmRfdXAoaHRhYi0mZ3Q7bWFwLmtleV9zaXplLCA4KTsKJiM0MzsJaWYgKGh0YWJfaXNfbHJ1KGh0YWIpKQomIzQzOwkJaHRhYi0mZ3Q7a2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBkYXRhKSAmIzQzOyA4OwomIzQzOwllbHNlIGlmIChwZXJjcHUgJmFtcDsmYW1wOyAhcHJlYWxsb2MpCiYjNDM7CQlodGFiLSZndDtrZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9wY3B1LCBkYXRhKSAmIzQzOwomIzQzOwkJCQkgICAoaHRhYl9oYXNfaGFzaChodGFiKSA/IDggOiAwKTsKJiM0MzsJZWxzZQomIzQzOwkJaHRhYi0mZ3Q7a2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGRhdGEpICYjNDM7CiYjNDM7CQkJCSAgIChodGFiX2hhc19oYXNoKGh0YWIpID8gOCA6IDApOwomIzQzOwomIzQzOwlodGFiLSZndDtlbGVtX3NpemUgPSBodGFiLSZndDtrZXlfb2Zmc2V0ICYjNDM7IHJvdW5kX3VwKGh0YWItJmd0O21hcC5rZXlfc2l6ZSwgOCk7CiAJaWYgKHBlcmNwdSkKIAkJaHRhYi0mZ3Q7ZWxlbV9zaXplICYjNDM7PSBzaXplb2Yodm9pZCAqKTsKIAllbHNlCkBAIC02OTIsMTUgJiM0Mzs3NzAsMjkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqc2VsZWN0X2J1Y2tldChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHUzMgogfQogCiAvKiB0aGlzIGxvb2t1cCBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBidWNrZXQgbG9jayB0YWtlbiAqLwotc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2gsCiYjNDM7c3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsCiYjNDM7CQkJCQkgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsIHUzMiBoYXNoLAogCQkJCQkgdm9pZCAqa2V5LCB1MzIga2V5X3NpemUpCiB7CiAJc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47CiAJc3RydWN0IGh0YWJfZWxlbSAqbDsKIAotCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpCi0JCWlmIChsLSZndDtoYXNoID09IGhhc2ggJmFtcDsmYW1wOyAhbWVtY21wKCZhbXA7bC0mZ3Q7a2V5LCBrZXksIGtleV9zaXplKSkKLQkJCXJldHVybiBsOwomIzQzOwlpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkgewomIzQzOwkJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKQomIzQzOwkJCWlmIChodGFiX2VsZW1faGFzaChodGFiLCBsKSA9PSBoYXNoICZhbXA7JmFtcDsKJiM0MzsJCQkgICAgIW1lbWNtcChodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXksIGtleV9zaXplKSkKJiM0MzsJCQkJcmV0dXJuIGw7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQkvKiBXaGVuIGhhc2ggaXMgb21pdHRlZCwga2V5IGNvbXBhcmlzb25zIG11c3QgYmUgYXRvbWljLiBaZXJvIGV4dGVuZAomIzQzOwkJICogdGhlIGNhbGxlciYjMzk7cyBrZXkgdG8gdGhlIHdvcmQgc2l6ZSB0byBzdXBwb3J0IGFuIGF0b21pYyBjb21wYXJlLgomIzQzOwkJICovCiYjNDM7CQl1bnNpZ25lZCBsb25nIGsgPSAwOwomIzQzOwomIzQzOwkJbWVtY3B5KCZhbXA7aywga2V5LCBrZXlfc2l6ZSk7CiYjNDM7CQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpCiYjNDM7CQkJaWYgKFJFQURfT05DRSgqKHVuc2lnbmVkIGxvbmcgKilodGFiX2VsZW1fa2V5KGh0YWIsIGwpKSA9PSBrKQomIzQzOwkJCQlyZXR1cm4gbDsKJiM0MzsJfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC03MDksNyAmIzQzOzgwMSw4IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfZWxlbV9yYXcoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsIHUzMiBoYXNoCiAgKiB0aGUgdW5saWtlbHkgZXZlbnQgd2hlbiBlbGVtZW50cyBtb3ZlZCBmcm9tIG9uZSBidWNrZXQgaW50byBhbm90aGVyCiAgKiB3aGlsZSBsaW5rIGxpc3QgaXMgYmVpbmcgd2Fsa2VkCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsCiYjNDM7c3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsCiYjNDM7CQkJCQkgICAgICAgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsCiAJCQkJCSAgICAgICB1MzIgaGFzaCwgdm9pZCAqa2V5LAogCQkJCQkgICAgICAgdTMyIGtleV9zaXplLCB1MzIgbl9idWNrZXRzKQogewpAQCAtNzE3LDkgJiM0Mzs4MTAsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCiBhZ2FpbjoKLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKQotCQlpZiAobC0mZ3Q7aGFzaCA9PSBoYXNoICZhbXA7JmFtcDsgIW1lbWNtcCgmYW1wO2wtJmd0O2tleSwga2V5LCBrZXlfc2l6ZSkpCi0JCQlyZXR1cm4gbDsKJiM0MzsJaWYgKGh0YWJfaGFzX2hhc2goaHRhYikpIHsKJiM0MzsJCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkKJiM0MzsJCQlpZiAoaHRhYl9lbGVtX2hhc2goaHRhYiwgbCkgPT0gaGFzaCAmYW1wOyZhbXA7CiYjNDM7CQkJICAgICFtZW1jbXAoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBrZXlfc2l6ZSkpCiYjNDM7CQkJCXJldHVybiBsOwomIzQzOwl9IGVsc2UgewomIzQzOwkJLyogU2VlIGxvb2t1cF9lbGVtX3JhdygpIGNvbW1lbnQgYWJvdmUuICovCiYjNDM7CQl1bnNpZ25lZCBsb25nIGsgPSAwOwomIzQzOwomIzQzOwkJbWVtY3B5KCZhbXA7aywga2V5LCBrZXlfc2l6ZSk7CiYjNDM7CQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpCiYjNDM7CQkJaWYgKFJFQURfT05DRSgqKHVuc2lnbmVkIGxvbmcgKilodGFiX2VsZW1fa2V5KGh0YWIsIGwpKSA9PSBrKQomIzQzOwkJCQlyZXR1cm4gbDsKJiM0MzsJfQogCiAJaWYgKHVubGlrZWx5KGdldF9udWxsc192YWx1ZShuKSAhPSAoaGFzaCAmYW1wOyAobl9idWNrZXRzIC0gMSkpKSkKIAkJZ290byBhZ2FpbjsKQEAgLTc0NywxNyAmIzQzOzg1MSwxOCBAQCBzdGF0aWMgdm9pZCAqX19odGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpCiAKIAloZWFkID0gc2VsZWN0X2J1Y2tldChodGFiLCBoYXNoKTsKIAotCWwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi0mZ3Q7bl9idWNrZXRzKTsKJiM0MzsJbCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLCBodGFiLSZndDtuX2J1Y2tldHMpOwogCiAJcmV0dXJuIGw7CiB9CiAKIHN0YXRpYyB2b2lkICpodGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7CiAKIAlpZiAobCkKLQkJcmV0dXJuIGh0YWJfZWxlbV92YWx1ZShsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCXJldHVybiBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTc3NSw2ICYjNDM7ODgwLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKICAqLwogc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjsKIAljb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wOwogCkBAIC03ODMsNyAmIzQzOzg4OSw3IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKQogCSppbnNuJiM0MzsmIzQzOyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7CiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCAxKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICYjNDM7CiYjNDM7CQkJCWh0YWItJmd0O2tleV9vZmZzZXQgJiM0MzsKIAkJCQlyb3VuZF91cChtYXAtJmd0O2tleV9zaXplLCA4KSk7CiAJcmV0dXJuIGluc24gLSBpbnNuX2J1ZjsKIH0KQEAgLTc5MSwxMiAmIzQzOzg5NywxMyBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZikKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqX19odGFiX2xydV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCQkJCQl2b2lkICprZXksIGNvbnN0IGJvb2wgbWFyaykKIHsKJiM0MzsJc3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApOwogCXN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTsKIAogCWlmIChsKSB7CiAJCWlmIChtYXJrKQotCQkJYnBmX2xydV9ub2RlX3NldF9yZWYoJmFtcDtsLSZndDtscnVfbm9kZSk7Ci0JCXJldHVybiBodGFiX2VsZW1fdmFsdWUobCwgbWFwLSZndDtrZXlfc2l6ZSk7CiYjNDM7CQkJYnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTsKJiM0MzsJCXJldHVybiBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7CiAJfQogCiAJcmV0dXJuIE5VTEw7CkBAIC04MTUsNiAmIzQzOzkyMiw3IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9tYXBfbG9va3VwX2VsZW1fc3lzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKIHN0YXRpYyBpbnQgaHRhYl9scnVfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCQkgICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKQogewomIzQzOwlzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7CiAJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CiAJY29uc3QgaW50IHJldCA9IEJQRl9SRUdfMDsKIAljb25zdCBpbnQgcmVmX3JlZyA9IEJQRl9SRUdfMTsKQEAgLTgyNCwxNSAmIzQzOzkzMiwxNSBAQCBzdGF0aWMgaW50IGh0YWJfbHJ1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsCiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDQpOwogCSppbnNuJiM0MzsmIzQzOyA9IEJQRl9MRFhfTUVNKEJQRl9CLCByZWZfcmVnLCByZXQsCi0JCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSkgJiM0MzsKJiM0MzsJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpICYjNDM7CiAJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfSk1QX0lNTShCUEZfSk5FLCByZWZfcmVnLCAwLCAxKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfU1RfTUVNKEJQRl9CLCByZXQsCi0JCQkgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSAmIzQzOwomIzQzOwkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSAmIzQzOwogCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpLAogCQkJICAgICAxKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICYjNDM7CiYjNDM7CQkJCWh0YWItJmd0O2tleV9vZmZzZXQgJiM0MzsKIAkJCQlyb3VuZF91cChtYXAtJmd0O2tleV9zaXplLCA4KSk7CiAJcmV0dXJuIGluc24gLSBpbnNuX2J1ZjsKIH0KQEAgLTg0NCwxMyAmIzQzOzk1MiwxMyBAQCBzdGF0aWMgdm9pZCBjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsCiAJCXJldHVybjsKIAogCWlmIChodGFiX2lzX3BlcmNwdShodGFiKSkgewotCQl2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKTsKJiM0MzsJCXZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTsKIAkJaW50IGNwdTsKIAogCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQogCQkJYnBmX29ial9jYW5jZWxfZmllbGRzKCZhbXA7aHRhYi0mZ3Q7bWFwLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTsKIAl9IGVsc2UgewotCQl2b2lkICptYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKTsKJiM0MzsJCXZvaWQgKm1hcF92YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBlbGVtKTsKIAogCQlicGZfb2JqX2NhbmNlbF9maWVsZHMoJmFtcDtodGFiLSZndDttYXAsIG1hcF92YWx1ZSk7CiAJfQpAQCAtODY5LDE3ICYjNDM7OTc3LDE3IEBAIHN0YXRpYyBib29sIGh0YWJfbHJ1X21hcF9kZWxldGVfbm9kZSh2b2lkICphcmcsIHN0cnVjdCBicGZfbHJ1X25vZGUgKm5vZGUpCiAJc3RydWN0IGJ1Y2tldCAqYjsKIAlpbnQgcmV0OwogCi0JdGd0X2wgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpOwotCWIgPSBfX3NlbGVjdF9idWNrZXQoaHRhYiwgdGd0X2wtJmd0O2hhc2gpOwomIzQzOwl0Z3RfbCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7CiYjNDM7CWIgPSBfX3NlbGVjdF9idWNrZXQoaHRhYiwgaHRhYl9lbGVtX2hhc2goaHRhYiwgdGd0X2wpKTsKIAloZWFkID0gJmFtcDtiLSZndDtoZWFkOwogCiAJcmV0ID0gaHRhYl9sb2NrX2J1Y2tldChiLCAmYW1wO2ZsYWdzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gZmFsc2U7CiAKLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKQomIzQzOwlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpCiAJCWlmIChsID09IHRndF9sKSB7Ci0JCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7bm9kZS5oYXNoX25vZGUpOwogCQkJYnBmX21hcF9kZWNfZWxlbV9jb3VudCgmYW1wO2h0YWItJmd0O21hcCk7CiAJCQlicmVhazsKIAkJfQpAQCAtOTEyLDE4ICYjNDM7MTAyMCwxOSBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dldF9uZXh0X2tleShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKm5leHRfa2V5KQogCWhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGhhc2gpOwogCiAJLyogbG9va3VwIHRoZSBrZXkgKi8KLQlsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItJmd0O25fYnVja2V0cyk7CiYjNDM7CWwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi0mZ3Q7bl9idWNrZXRzKTsKIAogCWlmICghbCkKIAkJZ290byBmaW5kX2ZpcnN0X2VsZW07CiAKIAkvKiBrZXkgd2FzIGZvdW5kLCBnZXQgbmV4dCBrZXkgaW4gdGhlIHNhbWUgYnVja2V0ICovCi0JbmV4dF9sID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShyY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX25leHRfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKSksCi0JCQkJICBzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUpOwomIzQzOwluZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKAomIzQzOwkJCXJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoJmFtcDtsLSZndDtub2RlLmhhc2hfbm9kZSkpLAomIzQzOwkJCXN0cnVjdCBodGFiX2VsZW0sIG5vZGUuaGFzaF9ub2RlKTsKIAogCWlmIChuZXh0X2wpIHsKIAkJLyogaWYgbmV4dCBlbGVtIGluIHRoaXMgaGFzaCBsaXN0IGlzIG5vbi16ZXJvLCBqdXN0IHJldHVybiBpdCAqLwotCQltZW1jcHkobmV4dF9rZXksIG5leHRfbC0mZ3Q7a2V5LCBrZXlfc2l6ZSk7CiYjNDM7CQltZW1jcHkobmV4dF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbmV4dF9sKSwga2V5X3NpemUpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTkzOCwxMCAmIzQzOzEwNDcsMTAgQEAgc3RhdGljIGludCBodGFiX21hcF9nZXRfbmV4dF9rZXkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICpuZXh0X2tleSkKIAogCQkvKiBwaWNrIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGJ1Y2tldCAqLwogCQluZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfZmlyc3RfcmN1KGhlYWQpKSwKLQkJCQkJICBzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUpOwomIzQzOwkJCQkJICBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7CiAJCWlmIChuZXh0X2wpIHsKIAkJCS8qIGlmIGl0JiMzOTtzIG5vdCBlbXB0eSwganVzdCByZXR1cm4gaXQgKi8KLQkJCW1lbWNweShuZXh0X2tleSwgbmV4dF9sLSZndDtrZXksIGtleV9zaXplKTsKJiM0MzsJCQltZW1jcHkobmV4dF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbmV4dF9sKSwga2V5X3NpemUpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC05NTUsNyAmIzQzOzEwNjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2VsZW1fZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiAJY2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgbCk7CiAKIAlpZiAoaHRhYi0mZ3Q7bWFwLm1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfSEFTSCkKLQkJYnBmX21lbV9jYWNoZV9mcmVlKCZhbXA7aHRhYi0mZ3Q7cGNwdV9tYSwgbC0mZ3Q7cHRyX3RvX3BwdHIpOwomIzQzOwkJYnBmX21lbV9jYWNoZV9mcmVlKCZhbXA7aHRhYi0mZ3Q7cGNwdV9tYSwgaHRhYl9lbGVtX2dldF9wdHJfdG9fcHB0cihsKSk7CiAJYnBmX21lbV9jYWNoZV9mcmVlKCZhbXA7aHRhYi0mZ3Q7bWEsIGwpOwogfQogCkBAIC05NjUsNyAmIzQzOzEwNzQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX3B1dF9mZF92YWx1ZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiAJdm9pZCAqcHRyOwogCiAJaWYgKG1hcC0mZ3Q7b3BzLSZndDttYXBfZmRfcHV0X3B0cikgewotCQlwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7CiYjNDM7CQlwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKGh0YWIsIGwpOwogCQltYXAtJmd0O29wcy0mZ3Q7bWFwX2ZkX3B1dF9wdHIobWFwLCBwdHIsIHRydWUpOwogCX0KIH0KQEAgLTEwMDYsNyAmIzQzOzExMTUsNyBAQCBzdGF0aWMgdm9pZCBmcmVlX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpCiAJaWYgKGh0YWJfaXNfcHJlYWxsb2MoaHRhYikpIHsKIAkJYnBmX21hcF9kZWNfZWxlbV9jb3VudCgmYW1wO2h0YWItJmd0O21hcCk7CiAJCWNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKGh0YWIsIGwpOwotCQlwY3B1X2ZyZWVsaXN0X3B1c2goJmFtcDtodGFiLSZndDtmcmVlbGlzdCwgJmFtcDtsLSZndDtmbm9kZSk7CiYjNDM7CQlwY3B1X2ZyZWVsaXN0X3B1c2goJmFtcDtodGFiLSZndDtmcmVlbGlzdCwgJmFtcDtsLSZndDtub2RlLmZub2RlKTsKIAl9IGVsc2UgewogCQlkZWNfZWxlbV9jb3VudChodGFiKTsKIAkJaHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7CkBAIC0xMDk3LDcgJiM0MzsxMjA2LDcgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSwKIAkJCWwgPSBfX3BjcHVfZnJlZWxpc3RfcG9wKCZhbXA7aHRhYi0mZ3Q7ZnJlZWxpc3QpOwogCQkJaWYgKCFsKQogCQkJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7Ci0JCQlsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSk7CiYjNDM7CQkJbF9uZXcgPSBjb250YWluZXJfb2YobCwgc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSk7CiAJCQlicGZfbWFwX2luY19lbGVtX2NvdW50KCZhbXA7aHRhYi0mZ3Q7bWFwKTsKIAkJfQogCX0gZWxzZSB7CkBAIC0xMTE3LDEwICYjNDM7MTIyNiwyMCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqYWxsb2NfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LAogCQl9CiAJfQogCi0JbWVtY3B5KGxfbmV3LSZndDtrZXksIGtleSwga2V5X3NpemUpOwomIzQzOwlpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkgewomIzQzOwkJbWVtY3B5KGh0YWJfZWxlbV9rZXkoaHRhYiwgbF9uZXcpLCBrZXksIGtleV9zaXplKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCS8qIFplcm8tZXh0ZW5kIGtleSBpbnRvIGsgZm9yIGFuIGF0b21pYyB3cml0ZSB0byBzdXBwb3J0CiYjNDM7CQkgKiBsb2NrbGVzcyBSQ1UgcmVhZGVycy4KJiM0MzsJCSAqLwomIzQzOwkJdW5zaWduZWQgbG9uZyBrID0gMDsKJiM0MzsKJiM0MzsJCW1lbWNweSgmYW1wO2ssIGtleSwga2V5X3NpemUpOwomIzQzOwkJV1JJVEVfT05DRSgqKHVuc2lnbmVkIGxvbmcgKilodGFiX2VsZW1fa2V5KGh0YWIsIGxfbmV3KSwgayk7CiYjNDM7CX0KIAlpZiAocGVyY3B1KSB7CiAJCWlmIChwcmVhbGxvYykgewotCQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSk7CiYjNDM7CQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGxfbmV3KTsKIAkJfSBlbHNlIHsKIAkJCS8qIGFsbG9jX3BlcmNwdSB6ZXJvLWZpbGxzICovCiAJCQl2b2lkICpwdHIgPSBicGZfbWVtX2NhY2hlX2FsbG9jKCZhbXA7aHRhYi0mZ3Q7cGNwdV9tYSk7CkBAIC0xMTMwLDI2ICYjNDM7MTI0OSwyNiBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqYWxsb2NfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LAogCQkJCWxfbmV3ID0gRVJSX1BUUigtRU5PTUVNKTsKIAkJCQlnb3RvIGRlY19jb3VudDsKIAkJCX0KLQkJCWxfbmV3LSZndDtwdHJfdG9fcHB0ciA9IHB0cjsKJiM0MzsJCQlodGFiX2VsZW1fc2V0X3B0cl90b19wcHRyKGxfbmV3LCBwdHIpOwogCQkJcHB0ciA9ICoodm9pZCBfX3BlcmNwdSAqKilwdHI7CiAJCX0KIAogCQlwY3B1X2luaXRfdmFsdWUoaHRhYiwgcHB0ciwgdmFsdWUsIG9uYWxsY3B1cywgbWFwX2ZsYWdzKTsKIAogCQlpZiAoIXByZWFsbG9jKQotCQkJaHRhYl9lbGVtX3NldF9wdHIobF9uZXcsIGtleV9zaXplLCBwcHRyKTsKJiM0MzsJCQlodGFiX2VsZW1fc2V0X3B0cihodGFiLCBsX25ldywgcHB0cik7CiAJfSBlbHNlIGlmIChmZF9odGFiX21hcF9uZWVkc19hZGp1c3QoaHRhYikpIHsKIAkJc2l6ZSA9IHJvdW5kX3VwKHNpemUsIDgpOwotCQltZW1jcHkoaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBrZXlfc2l6ZSksIHZhbHVlLCBzaXplKTsKJiM0MzsJCW1lbWNweShodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSwgc2l6ZSk7CiAJfSBlbHNlIGlmIChtYXBfZmxhZ3MgJmFtcDsgQlBGX0ZfTE9DSykgewogCQljb3B5X21hcF92YWx1ZV9sb2NrZWQoJmFtcDtodGFiLSZndDttYXAsCi0JCQkJICAgICAgaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBrZXlfc2l6ZSksCiYjNDM7CQkJCSAgICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksCiAJCQkJICAgICAgdmFsdWUsIGZhbHNlKTsKIAl9IGVsc2UgewotCQljb3B5X21hcF92YWx1ZSgmYW1wO2h0YWItJmd0O21hcCwgaHRhYl9lbGVtX3ZhbHVlKGxfbmV3LCBrZXlfc2l6ZSksIHZhbHVlKTsKJiM0MzsJCWNvcHlfbWFwX3ZhbHVlKCZhbXA7aHRhYi0mZ3Q7bWFwLCBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSk7CiAJfQogCi0JbF9uZXctJmd0O2hhc2ggPSBoYXNoOwomIzQzOwlodGFiX2VsZW1fc2V0X2hhc2goaHRhYiwgbF9uZXcsIGhhc2gpOwogCXJldHVybiBsX25ldzsKIGRlY19jb3VudDoKIAlkZWNfZWxlbV9jb3VudChodGFiKTsKQEAgLTExOTksNyAmIzQzOzEzMTgsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAogCQlpZiAodW5saWtlbHkoIWJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC0mZ3Q7cmVjb3JkLCBCUEZfU1BJTl9MT0NLKSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJLyogZmluZCBhbiBlbGVtZW50IHdpdGhvdXQgdGFraW5nIHRoZSBidWNrZXQgbG9jayAqLwotCQlsX29sZCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLAomIzQzOwkJbF9vbGQgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwKIAkJCQkJICAgICAgaHRhYi0mZ3Q7bl9idWNrZXRzKTsKIAkJcmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7CiAJCWlmIChyZXQpCkBAIC0xMjA3LDcgJiM0MzsxMzI2LDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIAkJaWYgKGxfb2xkKSB7CiAJCQkvKiBncmFiIHRoZSBlbGVtZW50IGxvY2sgYW5kIHVwZGF0ZSB2YWx1ZSBpbiBwbGFjZSAqLwogCQkJY29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCwKLQkJCQkJICAgICAgaHRhYl9lbGVtX3ZhbHVlKGxfb2xkLCBrZXlfc2l6ZSksCiYjNDM7CQkJCQkgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpLAogCQkJCQkgICAgICB2YWx1ZSwgZmFsc2UpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEyMjEsNyAmIzQzOzEzNDAsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7CiAKIAlyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTsKIAlpZiAocmV0KQpAQCAtMTIzNSw3ICYjNDM7MTM1NCw3IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsCiAJCSAqIGFuZCB1cGRhdGUgZWxlbWVudCBpbiBwbGFjZQogCQkgKi8KIAkJY29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCwKLQkJCQkgICAgICBodGFiX2VsZW1fdmFsdWUobF9vbGQsIGtleV9zaXplKSwKJiM0MzsJCQkJICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKSwKIAkJCQkgICAgICB2YWx1ZSwgZmFsc2UpOwogCQlyZXQgPSAwOwogCQlnb3RvIGVycjsKQEAgLTEyNTIsOSAmIzQzOzEzNzEsOSBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLAogCS8qIGFkZCBuZXcgZWxlbWVudCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgc28gdGhhdAogCSAqIGNvbmN1cnJlbnQgc2VhcmNoIHdpbGwgZmluZCBpdCBiZWZvcmUgb2xkIGVsZW0KIAkgKi8KLQlobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoJmFtcDtsX25ldy0mZ3Q7aGFzaF9ub2RlLCBoZWFkKTsKJiM0MzsJaGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KCZhbXA7bF9uZXctJmd0O25vZGUuaGFzaF9ub2RlLCBoZWFkKTsKIAlpZiAobF9vbGQpIHsKLQkJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2xfb2xkLSZndDtoYXNoX25vZGUpOwomIzQzOwkJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2xfb2xkLSZndDtub2RlLmhhc2hfbm9kZSk7CiAKIAkJLyogbF9vbGQgaGFzIGFscmVhZHkgYmVlbiBzdGFzaGVkIGluIGh0YWItJmd0O2V4dHJhX2VsZW1zLCBjYW5jZWwKIAkJICogaXRzIHJldXNhYmxlIHNwZWNpYWwgZmllbGRzIGJlZm9yZSBpdCBpcyBhdmFpbGFibGUgZm9yIHJldXNlLgpAQCAtMTI3NSw3ICYjNDM7MTM5NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfbHJ1X3B1c2hfZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pCiB7CiAJY2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgZWxlbSk7CiAJYnBmX21hcF9kZWNfZWxlbV9jb3VudCgmYW1wO2h0YWItJmd0O21hcCk7Ci0JYnBmX2xydV9wdXNoX2ZyZWUoJmFtcDtodGFiLSZndDtscnUsICZhbXA7ZWxlbS0mZ3Q7bHJ1X25vZGUpOwomIzQzOwlicGZfbHJ1X3B1c2hfZnJlZSgmYW1wO2h0YWItJmd0O2xydSwgaHRhYl9lbGVtX2xydV9ub2RlKGVsZW0pKTsKIH0KIAogc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsCkBAIC0xMzEwLDEzICYjNDM7MTQyOSwxMyBAQCBzdGF0aWMgbG9uZyBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZQogCWxfbmV3ID0gcHJlYWxsb2NfbHJ1X3BvcChodGFiLCBrZXksIGhhc2gpOwogCWlmICghbF9uZXcpCiAJCXJldHVybiAtRU5PTUVNOwotCWNvcHlfbWFwX3ZhbHVlKCZhbXA7aHRhYi0mZ3Q7bWFwLCBodGFiX2VsZW1fdmFsdWUobF9uZXcsIG1hcC0mZ3Q7a2V5X3NpemUpLCB2YWx1ZSk7CiYjNDM7CWNvcHlfbWFwX3ZhbHVlKCZhbXA7aHRhYi0mZ3Q7bWFwLCBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSk7CiAKIAlyZXQgPSBodGFiX2xvY2tfYnVja2V0KGIsICZhbXA7ZmxhZ3MpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2xvY2tfYnVja2V0OwogCi0JbF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7CiYjNDM7CWxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpOwogCiAJcmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7CiAJaWYgKHJldCkKQEAgLTEzMjUsMTAgJiM0MzsxNDQ0LDEwIEBAIHN0YXRpYyBsb25nIGh0YWJfbHJ1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlCiAJLyogYWRkIG5ldyBlbGVtZW50IHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyB0aGF0CiAJICogY29uY3VycmVudCBzZWFyY2ggd2lsbCBmaW5kIGl0IGJlZm9yZSBvbGQgZWxlbQogCSAqLwotCWhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmYW1wO2xfbmV3LSZndDtoYXNoX25vZGUsIGhlYWQpOwomIzQzOwlobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoJmFtcDtsX25ldy0mZ3Q7bm9kZS5oYXNoX25vZGUsIGhlYWQpOwogCWlmIChsX29sZCkgewotCQlicGZfbHJ1X25vZGVfc2V0X3JlZigmYW1wO2xfbmV3LSZndDtscnVfbm9kZSk7Ci0JCWhsaXN0X251bGxzX2RlbF9yY3UoJmFtcDtsX29sZC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCWJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsX25ldykpOwomIzQzOwkJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2xfb2xkLSZndDtub2RlLmhhc2hfbm9kZSk7CiAJfQogCXJldCA9IDA7CiAKQEAgLTEzODMsNyAmIzQzOzE1MDIsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpOwomIzQzOwlsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKIAogCXJldCA9IGNoZWNrX2ZsYWdzKGh0YWIsIGxfb2xkLCBtYXBfZmxhZ3MpOwogCWlmIChyZXQpCkBAIC0xMzkyLDEwICYjNDM7MTUxMSwxMCBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAJaWYgKGxfb2xkKSB7CiAJCS8qIFVwZGF0ZSB2YWx1ZSBpbi1wbGFjZSAqLwogCQlpZiAocGVyY3B1KSB7Ci0JCQlwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIobF9vbGQsIGtleV9zaXplKSwKJiM0MzsJCQlwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLAogCQkJCQl2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpOwogCQl9IGVsc2UgewotCQkJdm9pZCAqKmlubmVyX21hcF9wcHRyID0gaHRhYl9lbGVtX3ZhbHVlKGxfb2xkLCBrZXlfc2l6ZSk7CiYjNDM7CQkJdm9pZCAqKmlubmVyX21hcF9wcHRyID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKTsKIAogCQkJb2xkX21hcF9wdHIgPSAqaW5uZXJfbWFwX3BwdHI7CiAJCQlXUklURV9PTkNFKCppbm5lcl9tYXBfcHB0ciwgKih2b2lkICoqKXZhbHVlKTsKQEAgLTE0MDcsNyAmIzQzOzE1MjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAJCQlyZXQgPSBQVFJfRVJSKGxfbmV3KTsKIAkJCWdvdG8gZXJyOwogCQl9Ci0JCWhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmYW1wO2xfbmV3LSZndDtoYXNoX25vZGUsIGhlYWQpOwomIzQzOwkJaGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KCZhbXA7bF9uZXctJmd0O25vZGUuaGFzaF9ub2RlLCBoZWFkKTsKIAl9CiBlcnI6CiAJaHRhYl91bmxvY2tfYnVja2V0KGIsIGZsYWdzKTsKQEAgLTE0NTYsMjIgJiM0MzsxNTc1LDIyIEBAIHN0YXRpYyBsb25nIF9faHRhYl9scnVfcGVyY3B1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAJaWYgKHJldCkKIAkJZ290byBlcnJfbG9ja19idWNrZXQ7CiAKLQlsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7CiAKIAlyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAogCWlmIChsX29sZCkgewotCQlicGZfbHJ1X25vZGVfc2V0X3JlZigmYW1wO2xfb2xkLSZndDtscnVfbm9kZSk7CiYjNDM7CQlicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobF9vbGQpKTsKIAogCQkvKiBwZXItY3B1IGhhc2ggbWFwIGNhbiB1cGRhdGUgdmFsdWUgaW4tcGxhY2UgKi8KLQkJcGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfb2xkLCBrZXlfc2l6ZSksCiYjNDM7CQlwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLAogCQkJCXZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7CiAJfSBlbHNlIHsKLQkJcGNwdV9pbml0X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSksCiYjNDM7CQlwY3B1X2luaXRfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9uZXcpLAogCQkJCXZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7Ci0JCWhsaXN0X251bGxzX2FkZF9oZWFkX3JjdSgmYW1wO2xfbmV3LSZndDtoYXNoX25vZGUsIGhlYWQpOwomIzQzOwkJaGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KCZhbXA7bF9uZXctJmd0O25vZGUuaGFzaF9ub2RlLCBoZWFkKTsKIAkJbF9uZXcgPSBOVUxMOwogCX0KIAlyZXQgPSAwOwpAQCAtMTQ4MCw3ICYjNDM7MTU5OSw3IEBAIHN0YXRpYyBsb25nIF9faHRhYl9scnVfcGVyY3B1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiBlcnJfbG9ja19idWNrZXQ6CiAJaWYgKGxfbmV3KSB7CiAJCWJwZl9tYXBfZGVjX2VsZW1fY291bnQoJmFtcDtodGFiLSZndDttYXApOwotCQlicGZfbHJ1X3B1c2hfZnJlZSgmYW1wO2h0YWItJmd0O2xydSwgJmFtcDtsX25ldy0mZ3Q7bHJ1X25vZGUpOwomIzQzOwkJYnBmX2xydV9wdXNoX2ZyZWUoJmFtcDtodGFiLSZndDtscnUsIGh0YWJfZWxlbV9scnVfbm9kZShsX25ldykpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMTUyMSw5ICYjNDM7MTY0MCw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKIAlpZiAobCkKLQkJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2wtJmd0O2hhc2hfbm9kZSk7CiYjNDM7CQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7bm9kZS5oYXNoX25vZGUpOwogCWVsc2UKIAkJcmV0ID0gLUVOT0VOVDsKIApAQCAtMTU1NiwxMCAmIzQzOzE2NzUsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKIAogCWlmIChsKQotCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCWhsaXN0X251bGxzX2RlbF9yY3UoJmFtcDtsLSZndDtub2RlLmhhc2hfbm9kZSk7CiAJZWxzZQogCQlyZXQgPSAtRU5PRU5UOwogCkBAIC0xNTgxLDggJiM0MzsxNzAwLDggQEAgc3RhdGljIHZvaWQgZGVsZXRlX2FsbF9lbGVtZW50cyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiAJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOwogCQlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCi0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7Ci0JCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHsKJiM0MzsJCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7bm9kZS5oYXNoX25vZGUpOwogCQkJaHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7CiAJCX0KIAkJY29uZF9yZXNjaGVkKCk7CkBAIC0xNTk5LDEwICYjNDM7MTcxOCwxMCBAQCBzdGF0aWMgdm9pZCBodGFiX2ZyZWVfbWFsbG9jZWRfaW50ZXJuYWxfc3RydWN0cyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpCiAJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOwogCQlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCi0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkgewomIzQzOwkJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHsKIAkJCS8qIFdlIG9ubHkgZnJlZSBpbnRlcm5hbCBzdHJ1Y3RzIG9uIHVyZWYgZHJvcHBpbmcgdG8gemVybyAqLwogCQkJYnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoJmFtcDtodGFiLSZndDttYXAsCi0JCQkJCQkgICAgICBodGFiX2VsZW1fdmFsdWUobCwgaHRhYi0mZ3Q7bWFwLmtleV9zaXplKSk7CiYjNDM7CQkJCQkJICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpKTsKIAkJfQogCQljb25kX3Jlc2NoZWRfcmN1KCk7CiAJfQpAQCAtMTY5Nyw3ICYjNDM7MTgxNiw3IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKJiM0MzsJbCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTsKIAlpZiAoIWwpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMTcwOCwxNCAmIzQzOzE4MjcsMTQgQEAgc3RhdGljIGludCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LAogCQl2b2lkIF9fcGVyY3B1ICpwcHRyOwogCQlpbnQgb2ZmID0gMCwgY3B1OwogCi0JCXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBrZXlfc2l6ZSk7CiYjNDM7CQlwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCk7CiAJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJCWNvcHlfbWFwX3ZhbHVlX2xvbmcoJmFtcDtodGFiLSZndDttYXAsIHZhbHVlICYjNDM7IG9mZiwgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7CiAJCQljaGVja19hbmRfaW5pdF9tYXBfdmFsdWUoJmFtcDtodGFiLSZndDttYXAsIHZhbHVlICYjNDM7IG9mZik7CiAJCQlvZmYgJiM0Mzs9IHJvdW5kdXBfdmFsdWVfc2l6ZTsKIAkJfQogCX0gZWxzZSB7Ci0JCXZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCXZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTsKIAogCQlpZiAoZmxhZ3MgJmFtcDsgQlBGX0ZfTE9DSykKIAkJCWNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsIHZhbHVlLCBzcmMsIHRydWUpOwpAQCAtMTcyNCw3ICYjNDM7MTg0Myw3IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwKIAkJLyogWmVyb2luZyBzcGVjaWFsIGZpZWxkcyBpbiB0aGUgdGVtcCBidWZmZXIgKi8KIAkJY2hlY2tfYW5kX2luaXRfbWFwX3ZhbHVlKG1hcCwgdmFsdWUpOwogCX0KLQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJaGxpc3RfbnVsbHNfZGVsX3JjdSgmYW1wO2wtJmd0O25vZGUuaGFzaF9ub2RlKTsKIAogb3V0X3VubG9jazoKIAlodGFiX3VubG9ja19idWNrZXQoYiwgYmZsYWdzKTsKQEAgLTE4NjAsNyAmIzQzOzE5NzksNyBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsCiAJfQogCiAJYnVja2V0X2NudCA9IDA7Ci0JaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkKJiM0MzsJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKQogCQlidWNrZXRfY250JiM0MzsmIzQzOzsKIAogCWlmIChidWNrZXRfY250ICZhbXA7JmFtcDsgIWxvY2tlZCkgewpAQCAtMTg5NywxNCAmIzQzOzIwMTYsMTQgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLAogCWlmICghbG9ja2VkKQogCQlnb3RvIG5leHRfYmF0Y2g7CiAKLQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkgewotCQltZW1jcHkoZHN0X2tleSwgbC0mZ3Q7a2V5LCBrZXlfc2l6ZSk7CiYjNDM7CWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHsKJiM0MzsJCW1lbWNweShkc3Rfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXlfc2l6ZSk7CiAKIAkJaWYgKGlzX3BlcmNwdSkgewogCQkJaW50IG9mZiA9IDAsIGNwdTsKIAkJCXZvaWQgX19wZXJjcHUgKnBwdHI7CiAKLQkJCXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCQlwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCk7CiAJCQlpZiAoZWxlbV9tYXBfZmxhZ3MgJmFtcDsgQlBGX0ZfQ1BVKSB7CiAJCQkJY3B1ID0gZWxlbV9tYXBfZmxhZ3MgJmd0OyZndDsgMzI7CiAJCQkJY29weV9tYXBfdmFsdWUoJmFtcDtodGFiLSZndDttYXAsIGRzdF92YWwsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpOwpAQCAtMTkxOCw3ICYjNDM7MjAzNyw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCwKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQl2YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShsLCBrZXlfc2l6ZSk7CiYjNDM7CQkJdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7CiAJCQlpZiAoaXNfZmRfaHRhYihodGFiKSkgewogCQkJCXN0cnVjdCBicGZfbWFwICoqaW5uZXJfbWFwID0gdmFsdWU7CiAKQEAgLTE5MzYsNyAmIzQzOzIwNTUsNyBAQCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2JhdGNoKHN0cnVjdCBicGZfbWFwICptYXAsCiAJCQljaGVja19hbmRfaW5pdF9tYXBfdmFsdWUobWFwLCBkc3RfdmFsKTsKIAkJfQogCQlpZiAoZG9fZGVsZXRlKSB7Ci0JCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7aGFzaF9ub2RlKTsKJiM0MzsJCQlobGlzdF9udWxsc19kZWxfcmN1KCZhbXA7bC0mZ3Q7bm9kZS5oYXNoX25vZGUpOwogCiAJCQkvKiBicGZfbHJ1X3B1c2hfZnJlZSgpIHdpbGwgYWNxdWlyZSBscnVfbG9jaywgd2hpY2gKIAkJCSAqIG1heSBjYXVzZSBkZWFkbG9jay4gU2VlIGNvbW1lbnRzIGluIGZ1bmN0aW9uCkBAIC0xOTQ4LDcgJiM0MzsyMDY3LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLAogCQkJICogbG9jayBiZWluZyBoZWxkIGFuZCBpdCB2aW9sYXRlcyB0aGUgbG9jayBydWxlLCBzbwogCQkJICogaW52b2tlIGZyZWVfaHRhYl9lbGVtKCkgYWZ0ZXIgdW5sb2NrIGFzIHdlbGwuCiAJCQkgKi8KLQkJCWwtJmd0O2JhdGNoX2ZsaW5rID0gbm9kZV90b19mcmVlOwomIzQzOwkJCWwtJmd0O25vZGUuYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7CiAJCQlub2RlX3RvX2ZyZWUgPSBsOwogCQl9CiAJCWRzdF9rZXkgJiM0Mzs9IGtleV9zaXplOwpAQCAtMTk2MCw3ICYjNDM7MjA3OSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCwKIAogCXdoaWxlIChub2RlX3RvX2ZyZWUpIHsKIAkJbCA9IG5vZGVfdG9fZnJlZTsKLQkJbm9kZV90b19mcmVlID0gbm9kZV90b19mcmVlLSZndDtiYXRjaF9mbGluazsKJiM0MzsJCW5vZGVfdG9fZnJlZSA9IG5vZGVfdG9fZnJlZS0mZ3Q7bm9kZS5iYXRjaF9mbGluazsKIAkJaWYgKGlzX2xydV9tYXApCiAJCQlodGFiX2xydV9wdXNoX2ZyZWUoaHRhYiwgbCk7CiAJCWVsc2UKQEAgLTIxMDgsOCAmIzQzOzIyMjcsOCBAQCBicGZfaGFzaF9tYXBfc2VxX2ZpbmRfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2hhc2hfbWFwX2luZm8gKmluZm8sCiAJCS8qIG5vIHVwZGF0ZS9kZWxldGlvbiBvbiB0aGlzIGJ1Y2tldCwgcHJldl9lbGVtIHNob3VsZCBiZSBzdGlsbCB2YWxpZAogCQkgKiBhbmQgd2Ugd29uJiMzOTt0IHNraXAgZWxlbWVudHMuCiAJCSAqLwotCQluID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdSgmYW1wO3ByZXZfZWxlbS0mZ3Q7aGFzaF9ub2RlKSk7Ci0JCWVsZW0gPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKG4sIHN0cnVjdCBodGFiX2VsZW0sIGhhc2hfbm9kZSk7CiYjNDM7CQluID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdSgmYW1wO3ByZXZfZWxlbS0mZ3Q7bm9kZS5oYXNoX25vZGUpKTsKJiM0MzsJCWVsZW0gPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKG4sIHN0cnVjdCBodGFiX2VsZW0sIG5vZGUuaGFzaF9ub2RlKTsKIAkJaWYgKGVsZW0pCiAJCQlyZXR1cm4gZWxlbTsKIApAQCAtMjEyNSw3ICYjNDM7MjI0NCw3IEBAIGJwZl9oYXNoX21hcF9zZXFfZmluZF9uZXh0KHN0cnVjdCBicGZfaXRlcl9zZXFfaGFzaF9tYXBfaW5mbyAqaW5mbywKIAogCQljb3VudCA9IDA7CiAJCWhlYWQgPSAmYW1wO2ItJmd0O2hlYWQ7Ci0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShlbGVtLCBuLCBoZWFkLCBoYXNoX25vZGUpIHsKJiM0MzsJCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShlbGVtLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkgewogCQkJaWYgKGNvdW50ICZndDs9IHNraXBfZWxlbXMpIHsKIAkJCQlpbmZvLSZndDtidWNrZXRfaWQgPSBpOwogCQkJCWluZm8tJmd0O3NraXBfZWxlbXMgPSBjb3VudDsKQEAgLTIxODMsMTIgJiM0MzsyMzAyLDEyIEBAIHN0YXRpYyBpbnQgX19icGZfaGFzaF9tYXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pCiAJCWN0eC5tZXRhID0gJmFtcDttZXRhOwogCQljdHgubWFwID0gaW5mby0mZ3Q7bWFwOwogCQlpZiAoZWxlbSkgewotCQkJY3R4LmtleSA9IGVsZW0tJmd0O2tleTsKJiM0MzsJCQljdHgua2V5ID0gaHRhYl9lbGVtX2tleShpbmZvLSZndDtodGFiLCBlbGVtKTsKIAkJCWlmICghaW5mby0mZ3Q7cGVyY3B1X3ZhbHVlX2J1ZikgewotCQkJCWN0eC52YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShlbGVtLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCQkJY3R4LnZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGluZm8tJmd0O2h0YWIsIGVsZW0pOwogCQkJfSBlbHNlIHsKIAkJCQlyb3VuZHVwX3ZhbHVlX3NpemUgPSByb3VuZF91cChtYXAtJmd0O3ZhbHVlX3NpemUsIDgpOwotCQkJCXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJCQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGluZm8tJmd0O2h0YWIsIGVsZW0pOwogCQkJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJCQkJY29weV9tYXBfdmFsdWVfbG9uZyhtYXAsIGluZm8tJmd0O3BlcmNwdV92YWx1ZV9idWYgJiM0Mzsgb2ZmLAogCQkJCQkJCSAgICBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTsKQEAgLTIyOTIsMTQgJiM0MzsyNDExLDE0IEBAIHN0YXRpYyBsb25nIGJwZl9mb3JfZWFjaF9oYXNoX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgYnBmX2NhbGxiYWNrX3QgY2FsbGJhY2tfCiAJCWIgPSAmYW1wO2h0YWItJmd0O2J1Y2tldHNbaV07CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJaGVhZCA9ICZhbXA7Yi0mZ3Q7aGVhZDsKLQkJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShlbGVtLCBuLCBoZWFkLCBoYXNoX25vZGUpIHsKLQkJCWtleSA9IGVsZW0tJmd0O2tleTsKJiM0MzsJCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHsKJiM0MzsJCQlrZXkgPSBodGFiX2VsZW1fa2V5KGh0YWIsIGVsZW0pOwogCQkJaWYgKGlzX3BlcmNwdSkgewogCQkJCS8qIGN1cnJlbnQgY3B1IHZhbHVlIGZvciBwZXJjcHUgbWFwICovCi0JCQkJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIG1hcC0mZ3Q7a2V5X3NpemUpOwomIzQzOwkJCQlwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZWxlbSk7CiAJCQkJdmFsID0gdGhpc19jcHVfcHRyKHBwdHIpOwogCQkJfSBlbHNlIHsKLQkJCQl2YWwgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgbWFwLSZndDtrZXlfc2l6ZSk7CiYjNDM7CQkJCXZhbCA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBlbGVtKTsKIAkJCX0KIAkJCW51bV9lbGVtcyYjNDM7JiM0Mzs7CiAJCQlyZXQgPSBjYWxsYmFja19mbigodTY0KShsb25nKW1hcCwgKHU2NCkobG9uZylrZXksCkBAIC0yNDAzLDEwICYjNDM7MjUyMiwxMSBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9scnVfbWFwX29wcyA9IHsKIC8qIENhbGxlZCBmcm9tIGVCUEYgcHJvZ3JhbSAqLwogc3RhdGljIHZvaWQgKmh0YWJfcGVyY3B1X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7CiAKIAlpZiAobCkKLQkJcmV0dXJuIHRoaXNfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtJmd0O2tleV9zaXplKSk7CiYjNDM7CQlyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpKTsKIAllbHNlCiAJCXJldHVybiBOVUxMOwogfQpAQCAtMjQxNCw2ICYjNDM7MjUzNCw3IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KQogLyogaW5saW5lIGJwZl9tYXBfbG9va3VwX2VsZW0oKSBjYWxsIGZvciBwZXItQ1BVIGhhc2htYXAgKi8KIHN0YXRpYyBpbnQgaHRhYl9wZXJjcHVfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZikKIHsKJiM0MzsJc3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApOwogCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmOwogCiAJaWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpCkBAIC0yNDI0LDcgJiM0MzsyNTQ1LDcgQEAgc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc24KIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pOwogCSppbnNuJiM0MzsmIzQzOyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMyk7CiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwga2V5KSAmIzQzOyByb3VuZHVwKG1hcC0mZ3Q7a2V5X3NpemUsIDgpKTsKJiM0MzsJCQkJaHRhYi0mZ3Q7a2V5X29mZnNldCAmIzQzOyByb3VuZHVwKG1hcC0mZ3Q7a2V5X3NpemUsIDgpKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18wLCAwKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfTU9WNjRfUEVSQ1BVX1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMCk7CiAKQEAgLTI0MzMsNiAmIzQzOzI1NTQsNyBAQCBzdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbgogCiBzdGF0aWMgdm9pZCAqaHRhYl9wZXJjcHVfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHUzMiBjcHUpCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCiAJaWYgKGNwdSAmZ3Q7PSBucl9jcHVfaWRzKQpAQCAtMjQ0MCwxOCAmIzQzOzI1NjIsMTkgQEAgc3RhdGljIHZvaWQgKmh0YWJfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LAogCiAJbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpOwogCWlmIChsKQotCQlyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLSZndDtrZXlfc2l6ZSksIGNwdSk7CiYjNDM7CQlyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCksIGNwdSk7CiAJZWxzZQogCQlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KQogewomIzQzOwlzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7CiAJc3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpOwogCiAJaWYgKGwpIHsKLQkJYnBmX2xydV9ub2RlX3NldF9yZWYoJmFtcDtsLSZndDtscnVfbm9kZSk7Ci0JCXJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLSZndDtrZXlfc2l6ZSkpOwomIzQzOwkJYnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTsKJiM0MzsJCXJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCkpOwogCX0KIAogCXJldHVybiBOVUxMOwpAQCAtMjQ1OSw2ICYjNDM7MjU4Miw3IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSkKIAogc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdTMyIGNwdSkKIHsKJiM0MzsJc3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApOwogCXN0cnVjdCBodGFiX2VsZW0gKmw7CiAKIAlpZiAoY3B1ICZndDs9IG5yX2NwdV9pZHMpCkBAIC0yNDY2LDggJiM0MzsyNTkwLDggQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmsKIAogCWwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTsKIAlpZiAobCkgewotCQlicGZfbHJ1X25vZGVfc2V0X3JlZigmYW1wO2wtJmd0O2xydV9ub2RlKTsKLQkJcmV0dXJuIHBlcl9jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC0mZ3Q7a2V5X3NpemUpLCBjcHUpOwomIzQzOwkJYnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTsKJiM0MzsJCXJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKSwgY3B1KTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTI0NzUsNiAmIzQzOzI1OTksNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqawogCiBpbnQgYnBmX3BlcmNwdV9oYXNoX2NvcHkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwgdTY0IG1hcF9mbGFncykKIHsKJiM0MzsJc3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApOwogCXN0cnVjdCBodGFiX2VsZW0gKmw7CiAJdm9pZCBfX3BlcmNwdSAqcHB0cjsKIAlpbnQgcmV0ID0gLUVOT0VOVDsKQEAgLTI0OTQsNyAmIzQzOzI2MTksNyBAQCBpbnQgYnBmX3BlcmNwdV9oYXNoX2NvcHkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwgdTY0IG1hcF9mbAogCS8qIFdlIGRvIG5vdCBtYXJrIExSVSBtYXAgZWxlbWVudCBoZXJlIGluIG9yZGVyIHRvIG5vdCBtZXNzIHVwCiAJICogZXZpY3Rpb24gaGV1cmlzdGljcyB3aGVuIHVzZXIgc3BhY2UgZG9lcyBhIG1hcCB3YWxrLgogCSAqLwotCXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtJmd0O2tleV9zaXplKTsKJiM0MzsJcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpOwogCWlmIChtYXBfZmxhZ3MgJmFtcDsgQlBGX0ZfQ1BVKSB7CiAJCWNwdSA9IG1hcF9mbGFncyAmZ3Q7Jmd0OyAzMjsKIAkJY29weV9tYXBfdmFsdWUobWFwLCB2YWx1ZSwgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7CkBAIC0yNTMyLDYgJiM0MzsyNjU3LDcgQEAgaW50IGJwZl9wZXJjcHVfaGFzaF91cGRhdGUoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSwKIHN0YXRpYyB2b2lkIGh0YWJfcGVyY3B1X21hcF9zZXFfc2hvd19lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwKIAkJCQkJICBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKIAlzdHJ1Y3QgaHRhYl9lbGVtICpsOwogCXZvaWQgX19wZXJjcHUgKnBwdHI7CiAJaW50IGNwdTsKQEAgLTI1NDYsNyAmIzQzOzI2NzIsNyBAQCBzdGF0aWMgdm9pZCBodGFiX3BlcmNwdV9tYXBfc2VxX3Nob3dfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksCiAKIAlidGZfdHlwZV9zZXFfc2hvdyhtYXAtJmd0O2J0ZiwgbWFwLSZndDtidGZfa2V5X3R5cGVfaWQsIGtleSwgbSk7CiAJc2VxX3B1dHMobSwgJiMzNDs6IHtcbiYjMzQ7KTsKLQlwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLSZndDtrZXlfc2l6ZSk7CiYjNDM7CXBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCXNlcV9wcmludGYobSwgJiMzNDtcdGNwdSVkOiAmIzM0OywgY3B1KTsKIAkJYnRmX3R5cGVfc2VxX3Nob3cobWFwLSZndDtidGYsIG1hcC0mZ3Q7YnRmX3ZhbHVlX3R5cGVfaWQsCkBAIC0yNjE5LDggJiM0MzsyNzQ1LDggQEAgc3RhdGljIHZvaWQgZmRfaHRhYl9tYXBfZnJlZShzdHJ1Y3QgYnBmX21hcCAqbWFwKQogCWZvciAoaSA9IDA7IGkgJmx0OyBodGFiLSZndDtuX2J1Y2tldHM7IGkmIzQzOyYjNDM7KSB7CiAJCWhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGkpOwogCi0JCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7Ci0JCQl2b2lkICpwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7CiYjNDM7CQlobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7CiYjNDM7CQkJdm9pZCAqcHRyID0gZmRfaHRhYl9tYXBfZ2V0X3B0cihodGFiLCBsKTsKIAogCQkJbWFwLSZndDtvcHMtJmd0O21hcF9mZF9wdXRfcHRyKG1hcCwgcHRyLCBmYWxzZSk7CiAJCX0KQEAgLTI3MDUsNiAmIzQzOzI4MzEsNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9vZl9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KQogc3RhdGljIGludCBodGFiX29mX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsCiAJCQkJICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKQogewomIzQzOwlzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7CiAJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CiAJY29uc3QgaW50IHJldCA9IEJQRl9SRUdfMDsKIApAQCAtMjcxMyw3ICYjNDM7Mjg0MCw3IEBAIHN0YXRpYyBpbnQgaHRhYl9vZl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLAogCSppbnNuJiM0MzsmIzQzOyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7CiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCAyKTsKIAkqaW5zbiYjNDM7JiM0MzsgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICYjNDM7CiYjNDM7CQkJCWh0YWItJmd0O2tleV9vZmZzZXQgJiM0MzsKIAkJCQlyb3VuZF91cChtYXAtJmd0O2tleV9zaXplLCA4KSk7CiAJKmluc24mIzQzOyYjNDM7ID0gQlBGX0xEWF9NRU0oQlBGX0RXLCByZXQsIHJldCwgMCk7CiAKQEAgLTMxMTIsNyAmIzQzOzMyMzksNyBAQCBzdGF0aWMgaW50IHJodGFiX21hcF9jaGVja19idGYoc3RydWN0IGJwZl9tYXAgKm1hcCwgY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLAogewogCXN0cnVjdCBicGZfcmh0YWIgKnJodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9yaHRhYiwgbWFwKTsKIAotCXJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCAmYW1wO3JodGFiLSZndDttYSwgcmh0YWJfbWVtX2R0b3IpOwomIzQzOwlyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgJmFtcDtyaHRhYi0mZ3Q7bWEsIHJodGFiX21lbV9kdG9yLCBvZmZzZXRvZihzdHJ1Y3Qgcmh0YWJfZWxlbSwgZGF0YSkpOwogfQogCiBzdGF0aWMgdm9pZCByaHRhYl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXApCkBAIC0zNTMzLDMgJiM0MzszNjYwLDE2IEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyByaHRhYl9tYXBfb3BzID0gewogCS5tYXBfYnRmX2lkID0gJmFtcDtyaHRhYl9tYXBfYnRmX2lkc1swXSwKIAkuaXRlcl9zZXFfaW5mbyA9ICZhbXA7cmhhc2hfaXRlcl9zZXFfaW5mbywKIH07CiYjNDM7CiYjNDM7c2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9odGFiKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCBicGZfaHRhYl9tYXBfbWV0YV9pbml0KHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaW5uZXJfaHRhYl9tZXRhID0gY29udGFpbmVyX29mKGlubmVyX21hcF9tZXRhLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7CiYjNDM7CXN0cnVjdCBicGZfaHRhYiAqaW5uZXJfaHRhYiA9IGNvbnRhaW5lcl9vZihpbm5lcl9tYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTsKJiM0MzsKJiM0MzsJaW5uZXJfaHRhYl9tZXRhLSZndDtrZXlfb2Zmc2V0ID0gaW5uZXJfaHRhYi0mZ3Q7a2V5X29mZnNldDsKJiM0Mzt9CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuYyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5jCmluZGV4IGQyY2JhYjRiZGY2NDQuLmIyZGI1ZDBjOThiZWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5jCkBAIC03LDYgJiM0Mzs3LDE1IEBACiAKICNpbmNsdWRlICYjMzQ7bWFwX2luX21hcC5oJiMzNDsKIAomIzQzO3N0YXRpYyBib29sIGJwZl9tYXBfdHlwZV9pc19odGFiKGVudW0gYnBmX21hcF90eXBlIHR5cGUpCiYjNDM7ewomIzQzOwlyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSCB8fAomIzQzOwkgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0ggfHwKJiM0MzsJICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0xSVV9IQVNIIHx8CiYjNDM7CSAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9MUlVfUEVSQ1BVX0hBU0ggfHwKJiM0MzsJICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUzsKJiM0Mzt9CiYjNDM7CiBzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKQogewogCXN0cnVjdCBicGZfbWFwICppbm5lcl9tYXAsICppbm5lcl9tYXBfbWV0YTsKQEAgLTI5LDYgJiM0MzszOCw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpCiAJLyogSW4gc29tZSBjYXNlcyB2ZXJpZmllciBuZWVkcyB0byBhY2Nlc3MgYmV5b25kIGp1c3QgYmFzZSBtYXAuICovCiAJaWYgKGlubmVyX21hcC0mZ3Q7b3BzID09ICZhbXA7YXJyYXlfbWFwX29wcyB8fCBpbm5lcl9tYXAtJmd0O29wcyA9PSAmYW1wO3BlcmNwdV9hcnJheV9tYXBfb3BzKQogCQlpbm5lcl9tYXBfbWV0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBicGZfYXJyYXkpOwomIzQzOwllbHNlIGlmIChicGZfbWFwX3R5cGVfaXNfaHRhYihpbm5lcl9tYXAtJmd0O21hcF90eXBlKSkKJiM0MzsJCWlubmVyX21hcF9tZXRhX3NpemUgPSBicGZfaHRhYl9tYXBfbWV0YV9zaXplKCk7CiAKIAlpbm5lcl9tYXBfbWV0YSA9IGt6YWxsb2MoaW5uZXJfbWFwX21ldGFfc2l6ZSwgR0ZQX1VTRVIpOwogCWlmICghaW5uZXJfbWFwX21ldGEpCkBAIC03MCw2ICYjNDM7ODEsOCBAQCBzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKQogCQlpbm5lcl9hcnJheV9tZXRhLSZndDtpbmRleF9tYXNrID0gaW5uZXJfYXJyYXktJmd0O2luZGV4X21hc2s7CiAJCWlubmVyX2FycmF5X21ldGEtJmd0O2VsZW1fc2l6ZSA9IGlubmVyX2FycmF5LSZndDtlbGVtX3NpemU7CiAJCWlubmVyX21hcF9tZXRhLSZndDtieXBhc3Nfc3BlY192MSA9IGlubmVyX21hcC0mZ3Q7YnlwYXNzX3NwZWNfdjE7CiYjNDM7CX0gZWxzZSBpZiAoYnBmX21hcF90eXBlX2lzX2h0YWIoaW5uZXJfbWFwLSZndDttYXBfdHlwZSkpIHsKJiM0MzsJCWJwZl9odGFiX21hcF9tZXRhX2luaXQoaW5uZXJfbWFwX21ldGEsIGlubmVyX21hcCk7CiAJfQogCXJldHVybiBpbm5lcl9tYXBfbWV0YTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5oIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmgKaW5kZXggN2Q2MTYwMjM1NGRlOC4uMWVkYzIwNTc3MmQ4YyAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmgKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmgKQEAgLTE1LDUgJiM0MzsxNSw3IEBAIHZvaWQgKmJwZl9tYXBfZmRfZ2V0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgZmlsZSAqbWFwX2ZpbGUsCiAJCQkgaW50IHVmZCk7CiB2b2lkIGJwZl9tYXBfZmRfcHV0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpwdHIsIGJvb2wgbmVlZF9kZWZlcik7CiB1MzIgYnBmX21hcF9mZF9zeXNfbG9va3VwX2VsZW0odm9pZCAqcHRyKTsKJiM0MztzaXplX3QgYnBmX2h0YWJfbWFwX21ldGFfc2l6ZSh2b2lkKTsKJiM0Mzt2b2lkIGJwZl9odGFiX21hcF9tZXRhX2luaXQoc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcF9tZXRhLCBzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmMKaW5kZXggMzczYzhkMTdlYTU1Ny4uNmJkNGNiNjhjMjBjMSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tYXBfcHRyX2tlcm4uYwpAQCAtMTE0LDcgJiM0MzsxMTQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBjaGVja19oYXNoKHZvaWQpCiAJVkVSSUZZKGNoZWNrX2RlZmF1bHRfbm9pbmxpbmUoJmFtcDtoYXNoLSZndDttYXAsIG1hcCkpOwogCiAJVkVSSUZZKGhhc2gtJmd0O25fYnVja2V0cyA9PSBNQVhfRU5UUklFUyk7Ci0JVkVSSUZZKGhhc2gtJmd0O2VsZW1fc2l6ZSA9PSA2NCk7CiYjNDM7CVZFUklGWShoYXNoLSZndDtlbGVtX3NpemUgPT0gMzIpOwogCiAJVkVSSUZZKGhhc2gtJmd0O2NvdW50LmNvdW50ZXIgPT0gMCk7CiAJVkVSSUZZKGJwZl9tYXBfc3VtX2VsZW1fY291bnQobWFwKSA9PSAwKTsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjIwNDQKCQkJCQkJCW91dHB1dDogNTUKCQkJCQkJCXRob3VnaHRzOiA3MTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBCUEYgSGFzaCBNYXAgT3B0aW1pemF0aW9uIFBhdGNoKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGFuZCBteSBpbml0aWFsIHRob3VnaHQgaXMsIHRoaXMgaXMgYSBwcmV0dHkgc2lnbmlmaWNhbnQgY2hhbmdlLiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCBhIGZ1bmRhbWVudGFsIHJlLWFyY2hpdGVjdHVyZSBvZiBgc3RydWN0IGh0YWJfZWxlbWAgaW4gYGtlcm5lbC9icGYvaGFzaHRhYi5jYCBhbmQgYWxzbyBpbXBhY3RpbmcgYGtlcm5lbC9icGYvbWFwX2luX21hcC5jYC4gVGhleSYjMzk7cmUgaW50cm9kdWNpbmcgbmV3IHN0cnVjdHVyZXM6IGBodGFiX25vZGVgLCBgaHRhYl9lbGVtYCwgYGh0YWJfZWxlbV9scnVgLCBgaHRhYl9lbGVtX3BjcHVgLiBUaGF0JiMzOTtzIG5vdCB0cml2aWFsLiBBbmQsIG9oIHllYWgsIGBoYXNfaGFzaGAgYW5kIGBrZXlfb2Zmc2V0YCBhcmUgZ2V0dGluZyBhZGRlZCB0byBgc3RydWN0IGJwZl9odGFiYCBhcyB3ZWxsLgoKVGhlIGJpZ2dlc3QgdGhpbmcgdGhhdCBjYXRjaGVzIG15IGF0dGVudGlvbiBpcyBob3cgdGhleSYjMzk7cmUgY29uZGl0aW9uYWxseSBpbmNsdWRpbmcgdGhlIGhhc2ggdmFsdWUgaW4gdGhlIGVsZW1lbnQgZGVwZW5kaW5nIG9uIGlmIGl0JiMzOTtzIGFuIExSVSBtYXAgb3IgaWYgdGhlIGtleSBpcyB3aWRlciB0aGFuIGEgd29yZC4gVGhhdCYjMzk7cyBhIGNsZXZlciBvcHRpbWl6YXRpb24sIGJ1dCBpdCBhbHNvIGNyZWF0ZXMgcG90ZW50aWFsIGZvciBzb21lIHJlYWxseSBzdWJ0bGUgYnVncy4gQWxzbywgdXBkYXRpbmcgYG1hcF9pbl9tYXAuY2AgdG8gc3VwcG9ydCBtZXRhLWRhdGEgZm9yIGhhc2ggbWFwcyBpbnNpZGUgb3RoZXIgbWFwcy4uLiB0aGF0IGltcGFjdHMgYW5vdGhlciBjb3JlIGNvbXBvbmVudC4KClRoaXMgKmFic29sdXRlbHkqIHNjcmVhbXMgZm9yIGZ1enppbmcuIFdlIG5lZWQgdG8gYmUgdGhvcm91Z2ggd2l0aCB0aGlzLgoKTm93LCBsZXQmIzM5O3MgZmlndXJlIG91dCB3aGVyZSB0byBmb2N1cyBvdXIgZnV6emluZyBlZmZvcnRzLiBUaGUgcGF0Y2ggbW9kaWZpZXM6IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbWFwX2xvb2t1cF9lbGVtYCwgYGh0YWJfbHJ1X21hcF9sb29rdXBfZWxlbWAsIGBodGFiX21hcF9nZXRfbmV4dF9rZXlgLCBgaHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAgYW5kIGBicGZfbWFwX21ldGFfYWxsb2NgLiBSaWdodCwgbGV0JiMzOTtzIGxvb2sgYXQgdGhvc2UgZnVuY3Rpb25zLCBlc3BlY2lhbGx5LgoKQWxyaWdodCwgY2hlY2tpbmcgYGtlcm5lbC9icGYvaGFzaHRhYi5jYC4gVGhvc2UgYGh0YWJfKmAgZnVuY3Rpb25zIGFyZSBhbGwgc3RhbmRhcmQgQlBGIG1hcCBvcGVyYXRpb25zLiAgV2UgY2FuIGZvY3VzIHRoZXJlLiBHaXZlbiB3aGF0IEkmIzM5O20gc2VlaW5nLCBgaHRhYl9tYXBfYWxsb2NgLCBgaHRhYl9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX2xydV9tYXBfbG9va3VwX2VsZW1gLCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAsIGBicGZfbWFwX21ldGFfYWxsb2NgIC0gdGhvc2Ugc2VlbSBsaWtlIHRoZSBwcmltYXJ5IGVudHJ5IHBvaW50cyB0byBzY3J1dGluaXplLgoKT2theSwgc28gbW9zdCBvZiB0aGVtIGFyZSBzdGF0aWMsIGJ1dCBhc3NpZ25lZCB0byB0aGUgYGJwZl9tYXBfb3BzYCBzdHJ1Y3R1cmVzLiAgQWgsIHJpZ2h0LiBUaGUgYWR2aWNlIGlzIHRvIHByaW9yaXRpemUgbm9uLXN0YXRpYyBlbnRyeSBwb2ludHMuIEJ1dCBldmVuIHRob3VnaCB0aGV5JiMzOTtyZSBzdGF0aWMsIHRoZXkgKmFyZW4mIzM5O3QqIGlubGluZWQgYmVjYXVzZSB0aGV5JiMzOTtyZSBjYWxsZWQgdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaW4gdGhvc2UgYGJwZl9tYXBfb3BzYCBzdHJ1Y3R1cmVzLiBUaGF0IG1lYW5zIHRoZXkgc3RpbGwgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzLCBhbmQgdGhleSBzaG91bGQgYmUgdGVzdGFibGUuICBHcmVhdC4gTGV0JiMzOTtzIGRpZyBkZWVwZXIgaW50byB0aGUgY29kZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDteKHN0YXRpYyApPyhzdHJ1Y3QgYnBmX21hcCBcXCp8aW50fGxvbmd8dm9pZCBcXCp8dm9pZCkgaHRhYl9tYXBfYWxsb2MmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2hhc2h0YWIuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL2hhc2h0YWIuYz00NTA9c3RhdGljIGludCBhbGxvY19leHRyYV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtNDczLS8qIENhbGxlZCBmcm9tIHN5c2NhbGwgKi9cbmtlcm5lbC9icGYvaGFzaHRhYi5jOjQ3NDpzdGF0aWMgaW50IGh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKVxua2VybmVsL2JwZi9oYXNodGFiLmMtNDc1LXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMzYxNQoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipSZWZpbmluZyB0aGUgU2VhcmNoIFN0cmF0ZWd5KioKCkFscmlnaHQsIHRoYXQgcmVnZXggSSBpbml0aWFsbHkgY3JhZnRlZCB3YXMgcHJvdmluZyBhIGxpdHRsZSB0b28gcmVzdHJpY3RpdmUuIEl0IHdhcyBwcm9iYWJseSBvdmVyY29tcGxpY2F0aW5nIHRoaW5ncywgbGVhZGluZyB0byBzb21lIGZhbHNlIG5lZ2F0aXZlcy4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIG1haW50YWluIHRoYXQgY29tcGxleCBwYXR0ZXJuLCBJJiMzOTttIGdvaW5nIHRvIGRpYWwgaXQgYmFjayBhbmQgYWRvcHQgYSBzaW1wbGVyIGFwcHJvYWNoLiBNeSBpbnN0aW5jdHMgYXJlIHRlbGxpbmcgbWUgdG8gZ28gZGlyZWN0bHkgZm9yIHRoZSBjb3JlIGZ1bmN0aW9uIEkmIzM5O20gaW50ZXJlc3RlZCBpbjogYGh0YWJfbWFwX2FsbG9jYC4gQSBzaW1wbGUgYGdyZXBgIGZvciB0aGF0IHNob3VsZCBiZSBtb3JlIGVmZmljaWVudCBhbmQgZ2V0IG1lIHRoZSByZXN1bHRzIEkgbmVlZCB3aXRob3V0IHVubmVjZXNzYXJ5IG92ZXJoZWFkIG9yIHRoZSBwb3RlbnRpYWwgZm9yIG1pc3NlZCBvY2N1cnJlbmNlcyBkdWUgdG8gb3Zlcmx5IHNwZWNpZmljIHBhdHRlcm4gbWF0Y2hpbmcuIEZvY3VzaW5nIG9uIHRoZSBmdW5jdGlvbiBuYW1lIGl0c2VsZiBzaG91bGQgcHJvdmlkZSBhIGNsZWFuZXIgYW5kIG1vcmUgZm9jdXNlZCByZXN1bHQgc2V0IGZvciBkZWVwZXIgYW5hbHlzaXMuIEl0JiMzOTtzIGEgcHJhZ21hdGljIHNoaWZ0LCBhbmQgSSBleHBlY3QgaXQgd2lsbCBiZSBtb3JlIGVmZmVjdGl2ZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtodGFiX21hcF9hbGxvYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvaGFzaHRhYi5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvaGFzaHRhYi5jPTQ1MD1zdGF0aWMgaW50IGFsbG9jX2V4dHJhX2VsZW1zKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy00NzMtLyogQ2FsbGVkIGZyb20gc3lzY2FsbCAqL1xua2VybmVsL2JwZi9oYXNodGFiLmM6NDc0OnN0YXRpYyBpbnQgaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy00NzUte1xuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jPTU5MT1zdGF0aWMgaW50IGh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtNTk5LVx0ICogV2UgbXVzdCBzZXQgdGhlIGR0b3IgdXNpbmcgdGhpcyBjYWxsYmFjaywgYXMgbWFwJiMzOTtzIEJURiByZWNvcmQgaXMgbm90XG5rZXJuZWwvYnBmL2hhc2h0YWIuYzo2MDA6XHQgKiBwb3B1bGF0ZWQgaW4gaHRhYl9tYXBfYWxsb2MoKSwgc28gaXQgd2lsbCBhbHdheXMgYXBwZWFyIGFzIE5VTEwuXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy02MDEtXHQgKi9cbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy02MDctXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzo2MDg6c3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTYwOS17XG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQ3Nz1jb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9tYXBfb3BzID0ge1xua2VybmVsL2JwZi9oYXNodGFiLmMtMjQ3OC1cdC5tYXBfbWV0YV9lcXVhbCA9IGJwZl9tYXBfbWV0YV9lcXVhbCxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0Nzk6XHQubWFwX2FsbG9jX2NoZWNrID0gaHRhYl9tYXBfYWxsb2NfY2hlY2ssXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNDgwOlx0Lm1hcF9hbGxvYyA9IGh0YWJfbWFwX2FsbG9jLFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjQ4MS1cdC5tYXBfZnJlZSA9IGh0YWJfbWFwX2ZyZWUsXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQ5OT1jb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9scnVfbWFwX29wcyA9IHtcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI1MDAtXHQubWFwX21ldGFfZXF1YWwgPSBicGZfbWFwX21ldGFfZXF1YWwsXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNTAxOlx0Lm1hcF9hbGxvY19jaGVjayA9IGh0YWJfbWFwX2FsbG9jX2NoZWNrLFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjUwMjpcdC5tYXBfYWxsb2MgPSBodGFiX21hcF9hbGxvYyxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI1MDMtXHQubWFwX2ZyZWUgPSBodGFiX21hcF9mcmVlLFxuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jPTI2ODc9Y29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIGh0YWJfcGVyY3B1X21hcF9vcHMgPSB7XG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNjg4LVx0Lm1hcF9tZXRhX2VxdWFsID0gYnBmX21hcF9tZXRhX2VxdWFsLFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjY4OTpcdC5tYXBfYWxsb2NfY2hlY2sgPSBodGFiX21hcF9hbGxvY19jaGVjayxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI2OTA6XHQubWFwX2FsbG9jID0gaHRhYl9tYXBfYWxsb2MsXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNjkxLVx0Lm1hcF9mcmVlID0gaHRhYl9tYXBfZnJlZSxcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yNzA5PWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX2xydV9wZXJjcHVfbWFwX29wcyA9IHtcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI3MTAtXHQubWFwX21ldGFfZXF1YWwgPSBicGZfbWFwX21ldGFfZXF1YWwsXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNzExOlx0Lm1hcF9hbGxvY19jaGVjayA9IGh0YWJfbWFwX2FsbG9jX2NoZWNrLFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjcxMjpcdC5tYXBfYWxsb2MgPSBodGFiX21hcF9hbGxvYyxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI3MTMtXHQubWFwX2ZyZWUgPSBodGFiX21hcF9mcmVlLFxuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI3MjktXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNzMwOnN0YXRpYyBpbnQgZmRfaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzMxLXtcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzMzLVx0XHRyZXR1cm4gLUVJTlZBTDtcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI3MzQ6XHRyZXR1cm4gaHRhYl9tYXBfYWxsb2NfY2hlY2soYXR0cik7XG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzM1LX1cbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yODAyPXN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9vZl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtMjgwOS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI4MTA6XHRtYXAgPSBodGFiX21hcF9hbGxvYyhhdHRyKTtcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI4MTEtXHRpZiAoSVNfRVJSKG1hcCkpIHtcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yODU2PWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX29mX21hcHNfbWFwX29wcyA9IHtcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI4NTc6XHQubWFwX2FsbG9jX2NoZWNrID0gZmRfaHRhYl9tYXBfYWxsb2NfY2hlY2ssXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yODU4LVx0Lm1hcF9hbGxvYyA9IGh0YWJfb2ZfbWFwX2FsbG9jLFxuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jPTI5MTQ9c3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyByaHRhYl9wYXJhbXNfbG9uZyA9IHtcbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yOTIxLVxua2VybmVsL2JwZi9oYXNodGFiLmM6MjkyMjpzdGF0aWMgc3RydWN0IGJwZl9tYXAgKnJodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI5MjMte1xuLS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI5NzEtXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyOTcyOnN0YXRpYyBpbnQgcmh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKVxua2VybmVsL2JwZi9oYXNodGFiLmMtMjk3My17XG4tLVxua2VybmVsL2JwZi9oYXNodGFiLmMtMjk5MS1cbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI5OTI6XHRyZXR1cm4gaHRhYl9tYXBfYWxsb2NfY2hlY2soYXR0cik7XG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yOTkzLX1cbi0tXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0zNjQyPWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyByaHRhYl9tYXBfb3BzID0ge1xua2VybmVsL2JwZi9oYXNodGFiLmMtMzY0My1cdC5tYXBfbWV0YV9lcXVhbCA9IGJwZl9tYXBfbWV0YV9lcXVhbCxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjM2NDQ6XHQubWFwX2FsbG9jX2NoZWNrID0gcmh0YWJfbWFwX2FsbG9jX2NoZWNrLFxua2VybmVsL2JwZi9oYXNodGFiLmM6MzY0NTpcdC5tYXBfYWxsb2MgPSByaHRhYl9tYXBfYWxsb2MsXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0zNjQ2LVx0Lm1hcF9mcmVlID0gcmh0YWJfbWFwX2ZyZWUsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjU1NzIKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxNjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgSGFzaCBNYXAgRnVuY3Rpb25zKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGVzZSBmdW5jdGlvbnMgYW5kIGltbWVkaWF0ZWx5IHNlZSB0aGV5JiMzOTtyZSBzdGF0aWMsIHdoaWNoIGlzIGludGVyZXN0aW5nLCBidXQgYWN0dWFsbHksIHRoYXQgZG9lc24mIzM5O3QgcmVhbGx5IG1hdHRlci4gVGhlc2UgYXJlIHRoZSBjb3JlIG9wZXJhdGlvbnMg4oCTIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucyDigJMgZm9yIGhhc2ggbWFwcy4gVGhhdCBtYWtlcyB0aGVtIGEgdmVyeSB2YWx1YWJsZSB0YXJnZXQgZm9yIHRoZSBmdXp6ZXIuIExldCBtZSBzZWUuLi4gaWYgd2UgaW5jbHVkZSBgaHRhYl9tYXBfYWxsb2NgLCBgaHRhYl9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX2xydV9tYXBfbG9va3VwX2VsZW1gLCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAsIGFuZCBgYnBmX21hcF9tZXRhX2FsbG9jYCwgdGhlIGZ1enplciBzaG91bGQgYmUgYWJsZSB0byBkaWcgaW4gdGhlcmUuIEFoLCB3YWl0IGEgc2Vjb25kLiBIb2xkIG9uLiBJcyBgYnBmX21hcF9tZXRhX2FsbG9jYCBhY3R1YWxseSBzdGF0aWM/IFRoYXQmIzM5O3Mgbm90IHdoYXQgSSBleHBlY3RlZC4gTGV0IG1lIGp1c3QgcXVpY2tseSBjaGVjayB0aGF0LiBUaW1lIHRvIGdvIGxvb2sgaW50byBga2VybmVsL2JwZi9tYXBfaW5fbWFwLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2JwZl9tYXBfbWV0YV9hbGxvYyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvbWFwX2luX21hcC5jJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvbWFwX2luX21hcC5jPTEwPXN0YXRpYyBib29sIGJwZl9tYXBfdHlwZV9pc19odGFiKGVudW0gYnBmX21hcF90eXBlIHR5cGUpXG4tLVxua2VybmVsL2JwZi9tYXBfaW5fbWFwLmMtMTgtXG5rZXJuZWwvYnBmL21hcF9pbl9tYXAuYzoxOTpzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKVxua2VybmVsL2JwZi9tYXBfaW5fbWFwLmMtMjAte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI2MTU0CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMzM3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBCUEYgTWFwIEFsbG9jYXRpb24gRnVuY3Rpb25zKioKCk9rYXksIHNvIGBicGZfbWFwX21ldGFfYWxsb2NgIGlzIGRlZmluaXRlbHkgZXhwb3J0ZWQsIHRoYXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3csIGFib3V0IGBodGFiX21hcF9hbGxvY2AuLi4gaXQmIzM5O3MgZGVjbGFyZWQgc3RhdGljLCB3aGljaCBpbml0aWFsbHkgc2VlbXMgbGlrZSBhIHByb2JsZW0gYmFzZWQgb24gdGhlIHByb21wdCYjMzk7cyBwcmVmZXJlbmNlIGZvciBub24tc3RhdGljIGVudHJ5cG9pbnRzIHdpdGggZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3Nlcy4gQnV0IHdhaXQgYSBtaW51dGUsIGl0JiMzOTtzICphc3NpZ25lZCogdG8gYSBmdW5jdGlvbiBwb2ludGVyISBUaGF0IG1lYW5zIHRoZSBjb21waWxlciB3b24mIzM5O3QgaW5saW5lIGl0LCBhbmQgaXQgKmRvZXMqIGhhdmUgYSBkaXN0aW5jdCBzeW1ib2wuIFNvLCBpdCBzaG91bGQgYmUgZmluZSB0byBpbmNsdWRlIGl0LgoKT2YgY291cnNlLCBJIGNvdWxkIHBsYXkgaXQgc2FmZSBhbmQganVzdCBsaXN0IHRoZSBzeXNjYWxsIGVudHJ5IHBvaW50cyBsaWtlIGBtYXBfY3JlYXRlYCwgYG1hcF91cGRhdGVfZWxlbWAsIGV0Yy4gQnV0IHRoYXQmIzM5O3MgYSBiaXQgZ2VuZXJpYy4gVGhlIHByb21wdCBzcGVjaWZpY2FsbHkgd2FybnMgYWdhaW5zdCBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBhdm9pZCBiaWFzaW5nIHRoZSByZXN1bHRzLiBBbmQgbGlzdGluZyB0aG9zZSBzeXNjYWxscyAqd291bGQqIHNrZXcgdGhlIHRlc3QgZGlzdHJpYnV0aW9uLgoKU28sIHRoZSBvcHRpbWFsIGFwcHJvYWNoIGhlcmUgaXMgdG8gbGlzdCB0aGUgc3BlY2lmaWMgYGh0YWJfbWFwX2FsbG9jYCBmdW5jdGlvbnM6IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbWFwX2xvb2t1cF9lbGVtYCwgYGh0YWJfbHJ1X21hcF9sb29rdXBfZWxlbWAsIGFuZCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAuIFRoYXQgY292ZXJzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBiZWluZyBvdmVybHkgZ2VuZXJpYy4KCk5vdywganVzdCB0byBiZSB0aG9yb3VnaCwgSSBzaG91bGQgY2hlY2sgZm9yIGFueSBDT05GSUcgb3B0aW9ucyB3ZSBtaWdodCBuZWVkLiBCUEYgaGFzaCBtYXBzIGFyZSBhIGZ1bmRhbWVudGFsIHBhcnQgb2YgY29yZSBCUEYsIHNvIGl0JiMzOTtzIGEgc2FmZSBiZXQgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgcHJpbWFyeSBvbmUsIGJ1dCBsZXQgbWUganVzdCBkb3VibGUgY2hlY2sgdGhlIGRldGFpbHMgdG8gYmUgc3VyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjkxNgoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzIG9uIHRoaXM6CgoqKkludmVzdGlnYXRpbmcgQlBGIENvbmZpZ3VyYXRpb24gT3B0aW9ucyoqCgpBbHJpZ2h0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBCUEYgYXJlIGRlZmluZWQuIE15IGZpcnN0IGluc3RpbmN0LCBhbmQgdGhpcyBpcyB3aGVyZSBJJiMzOTtkIHN0YXJ0IGluIGFueSBrZXJuZWwgaW52ZXN0aWdhdGlvbiwgaXMgdG8gY2hlY2sgdGhlIGBLY29uZmlnYCBmaWxlcy4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIHRoaW5raW5nIEkgbmVlZCB0byBsb29rIGluIGBrZXJuZWwvYnBmL0tjb25maWdgLCBvciBzb21ld2hlcmUgc2ltaWxhciB3aXRoaW4gdGhlIEJQRiBzdWJzeXN0ZW0gZGlyZWN0b3J5LiBUaGUgYEtjb25maWdgIGZpbGVzIGFyZSB0aGUgYnJlYWQgYW5kIGJ1dHRlciBmb3IgYW55IGtlcm5lbCBkZXZlbG9wZXIgYmVjYXVzZSB0aGV5IGRlZmluZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgdXNlcnMgY2FuIHRvZ2dsZSB1c2luZyBgbWFrZSBtZW51Y29uZmlnYCBvciBzaW1pbGFyIHRvb2xzLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgZ29vZCB1bmRlcnN0YW5kaW5nIG9mIHdoYXQmIzM5O3MgYXZhaWxhYmxlIGFuZCBob3cgaXQmIzM5O3Mgc3RydWN0dXJlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJQRl9TWVNDQUxMJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZz0yNT1tZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbmtlcm5lbC9icGYvS2NvbmZpZy0yNi1cbmtlcm5lbC9icGYvS2NvbmZpZzoyNzpjb25maWcgQlBGX1NZU0NBTExcbmtlcm5lbC9icGYvS2NvbmZpZy0yOC1cdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzA1IDIyOjUyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3MTk5CgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogNjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBzZWUsIHRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gcmV2b2x2ZSBhcm91bmQgYEJQRl9TWVNDQUxMYCwgdGhhdCYjMzk7cyB0aGUgcHJpbWFyeSBjb25maWd1cmF0aW9uIHRvIGJlIGF3YXJlIG9mLiBJIHNob3VsZCBkb3VibGUtY2hlY2sgdG8gYmUgc3VyZSB0aGVyZSBhcmVuJiMzOTt0IGFueSBvdGhlciBjb25maWdzIHRoYXQgYXJlIHJlbGF0ZWQuCgpBbHJpZ2h0LCB0aGUgcGF0Y2ggdG91Y2hlcyBga2VybmVsL2JwZi9oYXNodGFiLmNgIGFuZCBga2VybmVsL2JwZi9tYXBfaW5fbWFwLmNgLiBIbW0sIGFyZSB0aGVyZSBhbnkgc3BlY2lhbGl6ZWQgY29uZmlndXJhdGlvbnMsIG9yIHBlcmhhcHMgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIHVuaXF1ZSB0byB0aG9zZSBmaWxlcyB3aXRoaW4gdGhpcyBjb250ZXh0PyBXZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGVyZSBhcmUgYW55IHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIGxpbmtlZCB3aXRoIHRoZSBzcGVjaWZpYyBjb2RlIHBhdGhzIGFsdGVyZWQgaW4gdGhvc2UgbW9kdWxlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aGFzaHRhYlxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmL01ha2VmaWxlJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvTWFrZWZpbGU9MTA9b2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gYnBmX2l0ZXIubyBtYXBfaXRlci5vIHRhc2tfaXRlci5vIHByb2dfaXRlci5vIGxpbmtfaXRlci5vXG5rZXJuZWwvYnBmL01ha2VmaWxlOjExOm9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGhhc2h0YWIubyBhcnJheW1hcC5vIHBlcmNwdV9mcmVlbGlzdC5vIGJwZl9scnVfbGlzdC5vIGxwbV90cmllLm8gbWFwX2luX21hcC5vIGJsb29tX2ZpbHRlci5vXG5rZXJuZWwvYnBmL01ha2VmaWxlLTEyLW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGxvY2FsX3N0b3JhZ2UubyBxdWV1ZV9zdGFja19tYXBzLm8gcmluZ2J1Zi5vIGJwZl9pbnNuX2FycmF5Lm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMDUgMjI6NTI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjc2MDEKCQkJCQkJCW91dHB1dDogMTc4CgkJCQkJCQl0aG91Z2h0czogNjQ4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoaXMgQlBGIEhhc2ggTWFwIE9wdGltaXphdGlvbioqCgpSaWdodCwgc28gSSYjMzk7dmUgY29uZmlybWVkIHRoYXQgZW5hYmxpbmcgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgdGhlIGNydWNpYWwgcHJlcmVxdWlzaXRlIGhlcmUuIFRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBmb2N1cyBvbiBhIHNldCBvZiBjcml0aWNhbCBmdW5jdGlvbnMgdGhhdCByZXByZXNlbnQgdGhlIGNvcmUgb3BlcmF0aW9ucyBhZmZlY3RlZCBieSB0aGlzIG1lbW9yeSBsYXlvdXQgb3B0aW1pemF0aW9uLiBJJiMzOTt2ZSBjb21waWxlZCBhIHNob3J0bGlzdCwgZm9jdXNpbmcgb24gdGhvc2UgaW52b2x2ZWQgd2l0aCBhbGxvY2F0aW9uLCB1cGRhdGVzLCBsb29rdXBzLCBhbmQgZGVsZXRpb25zLgoKSSYjMzk7dmUgZ290IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2VsZW1gLCBhbmQgYGJwZl9tYXBfbWV0YV9hbGxvY2AgZWFybWFya2VkIGFzIHRoZSBrZXkgdGFyZ2V0cy4gSSBkaWQgYSBxdWljayBkb3VibGUgY2hlY2sgb24gYGh0YWJfbWFwX3VwZGF0ZV9lbGVtYCB0byBiZSBzdXJlIEkmIzM5O20gdGFyZ2V0aW5nIHRoZSBwcm9wZXIgZnVuY3Rpb24sIGl0JiMzOTtzIHN0YXRpYyBpbnRlcm5hbGx5IGJ1dCBleHBvc2VkIHRocm91Z2ggdGhlIGBodGFiX21hcF9vcHNgIHN0cnVjdHVyZS4gSSYjMzk7bSBrZWVwaW5nIGEgY2xvc2UgZXllIG9uIGFueSBhbGlhc2VzIG9yIHZhcmlhdGlvbnMgYXMgd2VsbCwgYnV0IHRoZXNlIHNlZW0gdG8gYmUgdGhlIHByaW1hcnkgcGxheWVycy4KClRoaXMgcGF0Y2ggaXMgZXNzZW50aWFsbHkgYSBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgY29yZSBCUEYgaGFzaCBtYXAgaW1wbGVtZW50YXRpb24sIHNwZWNpZmljYWxseSBhaW1pbmcgdG8gb3B0aW1pemUgbWVtb3J5IHVzYWdlIGJ5IGNvbmRpdGlvbmFsbHkgcmVtb3ZpbmcgdGhlIGhhc2ggdmFsdWUgZnJvbSB0aGUgZWxlbWVudCBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBJdCYjMzk7cyBub3QganVzdCBhIHR3ZWFrOyBpdCYjMzk7cyBhIGZ1bmRhbWVudGFsIHNoaWZ0IGluIGhvdyB0aGVzZSBtYXBzIG1hbmFnZSBtZW1vcnkuCgpHaXZlbiB0aGlzLCBteSBleHBlcnQgaW50dWl0aW9uIHNjcmVhbXMgZm9yIHRob3JvdWdoIGZ1enppbmcuIFRoZSBjaGFuZ2UgdG91Y2hlcyBjb3JlIG9wZXJhdGlvbnMgbGlrZSBtZW1vcnkgbGF5b3V0IGluIGEgd2F5IHRoYXQgKmRlbWFuZHMqIHJvYnVzdCB0ZXN0aW5nLiBXZSBuZWVkIHRvIGJlIGFic29sdXRlbHkgY2VydGFpbiB0aGF0IHRoaXMgbWVtb3J5IG9wdGltaXphdGlvbiBkb2VzbiYjMzk7dCBpbnRyb2R1Y2UgdnVsbmVyYWJpbGl0aWVzIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3JzIGR1cmluZyBvcGVyYXRpb25zIGxpa2UgYWxsb2NhdGlvbiwgbG9va3VwLCB1cGRhdGUsIGFuZCBkZWxldGlvbiwgZXNwZWNpYWxseSByZWxhdGVkIHRvIG91dC1vZi1ib3VuZHMgYWNjZXNzIG9yIG1lbW9yeSBjb3JydXB0aW9uLiBJIG5lZWQgdG8gYmUgMTAwJSBjZXJ0YWluIHRoZSBrZXlzIGFuZCBkYXRhIGFyZSBzdGlsbCBtYXBwZWQgY29ycmVjdGx5LCB0b28uCgpJJiMzOTttIGZsYWdnaW5nIGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBhbmQgYGJwZl9tYXBfbWV0YV9hbGxvY2AgYXMgdGhlIGZvY3VzIHN5bWJvbHMsIGFuZCBJJiMzOTtsbCBtYWtlIHN1cmUgYEJQRl9TWVNDQUxMYCBpcyBlbmFibGVkIGZvciB0ZXN0aW5nLiBMZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8wNSAyMjo1MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtodGFiX21hcF9hbGxvYyYjMzQ7LAogICAgJiMzNDtodGFiX21hcF91cGRhdGVfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0mIzM0OywKICAgICYjMzQ7aHRhYl9tYXBfbG9va3VwX2VsZW0mIzM0OywKICAgICYjMzQ7aHRhYl9tYXBfZGVsZXRlX2VsZW0mIzM0OywKICAgICYjMzQ7YnBmX21hcF9tZXRhX2FsbG9jJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG9wdGltaXplcyB0aGUgbWVtb3J5IGxheW91dCBvZiBCUEYgaGFzaCBtYXAgZWxlbWVudHMgYnkgY29uZGl0aW9uYWxseSBvbWl0dGluZyB0aGUgaGFzaCB2YWx1ZSBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBUaGlzIGFmZmVjdHMgY29yZSBCUEYgaGFzaCBtYXAgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24uIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBtZW1vcnkgbGF5b3V0IGFuZCB0aGF0IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIG9jY3VyLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2h0YWJfbWFwX2FsbG9jJiMzNDssCiAgICAmIzM0O2h0YWJfbWFwX3VwZGF0ZV9lbGVtJiMzNDssCiAgICAmIzM0O2h0YWJfbHJ1X21hcF91cGRhdGVfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX21hcF9sb29rdXBfZWxlbSYjMzQ7LAogICAgJiMzNDtodGFiX21hcF9kZWxldGVfZWxlbSYjMzQ7LAogICAgJiMzNDticGZfbWFwX21ldGFfYWxsb2MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggb3B0aW1pemVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIEJQRiBoYXNoIG1hcCBlbGVtZW50cyBieSBjb25kaXRpb25hbGx5IG9taXR0aW5nIHRoZSBoYXNoIHZhbHVlIGFuZCBhZGp1c3RpbmcgdGhlIGtleSBvZmZzZXQuIFRoaXMgYWZmZWN0cyBjb3JlIEJQRiBoYXNoIG1hcCBvcGVyYXRpb25zIGxpa2UgYWxsb2NhdGlvbiwgbG9va3VwLCB1cGRhdGUsIGFuZCBkZWxldGlvbi4gRnV6emluZyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZXNlIG9wZXJhdGlvbnMgc3RpbGwgd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgbmV3IG1lbW9yeSBsYXlvdXQgYW5kIHRoYXQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBtZW1vcnkgbGVha3Mgb2NjdXIuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjoyMy43NzA2Njk2NDNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NDA3MTY0MDM4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImh0YWJfbWFwX2FsbG9jXCIsXG4gICAgXCJodGFiX21hcF91cGRhdGVfZWxlbVwiLFxuICAgIFwiaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtXCIsXG4gICAgXCJodGFiX21hcF9sb29rdXBfZWxlbVwiLFxuICAgIFwiaHRhYl9tYXBfZGVsZXRlX2VsZW1cIixcbiAgICBcImJwZl9tYXBfbWV0YV9hbGxvY1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9wdGltaXplcyB0aGUgbWVtb3J5IGxheW91dCBvZiBCUEYgaGFzaCBtYXAgZWxlbWVudHMgYnkgY29uZGl0aW9uYWxseSBvbWl0dGluZyB0aGUgaGFzaCB2YWx1ZSBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBUaGlzIGFmZmVjdHMgY29yZSBCUEYgaGFzaCBtYXAgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24uIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBtZW1vcnkgbGF5b3V0IGFuZCB0aGF0IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIG9jY3VyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjoyMy43NzA2Nzg4MzNaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYwMTc3MTgwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IDY0NTRhMTFjMDNkZmFlZGI0YjA5Zjg1NzVhZjhkMDM2MzlmYjUyNzNcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBBdWcgNSAyMjo1MjoyMiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2hhc2h0YWIuYyBiL2tlcm5lbC9icGYvaGFzaHRhYi5jXFxuaW5kZXggOWYzOTRlMWFhMmU4NS4uOTk2NzI2OGQ0NTNkMCAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL2hhc2h0YWIuY1xcbisrKyBiL2tlcm5lbC9icGYvaGFzaHRhYi5jXFxuQEAgLTEwMCwxMyArMTAwLDE2IEBAIHN0cnVjdCBicGZfaHRhYiB7XFxuIFxcdHN0cnVjdCBwZXJjcHVfY291bnRlciBwY291bnQ7XFxuIFxcdGF0b21pY190IGNvdW50O1xcbiBcXHRib29sIHVzZV9wZXJjcHVfY291bnRlcjtcXG4rXFx0Ym9vbCBoYXNfaGFzaDtcXG4gXFx0dTMyIG5fYnVja2V0cztcXHQvKiBudW1iZXIgb2YgaGFzaCBidWNrZXRzICovXFxuIFxcdHUzMiBlbGVtX3NpemU7XFx0Lyogc2l6ZSBvZiBlYWNoIGVsZW1lbnQgaW4gYnl0ZXMgKi9cXG4rXFx0dTMyIGtleV9vZmZzZXQ7XFx0Lyogb2Zmc2V0IG9mIGtleSBpbiBieXRlcyAqL1xcbiBcXHR1MzIgaGFzaHJuZDtcXG4gfTtcXG4gXFxuIC8qIGVhY2ggaHRhYiBlbGVtZW50IGlzIHN0cnVjdCBodGFiX2VsZW0gKyBrZXkgKyB2YWx1ZSAqL1xcbi1zdHJ1Y3QgaHRhYl9lbGVtIHtcXG4rc3RydWN0IGh0YWJfZWxlbTtcXG4rc3RydWN0IGh0YWJfbm9kZSB7XFxuIFxcdHVuaW9uIHtcXG4gXFx0XFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgaGFzaF9ub2RlO1xcbiBcXHRcXHRzdHJ1Y3Qge1xcbkBAIC0xMTcsMTggKzEyMCwzMiBAQCBzdHJ1Y3QgaHRhYl9lbGVtIHtcXG4gXFx0XFx0XFx0fTtcXG4gXFx0XFx0fTtcXG4gXFx0fTtcXG4tXFx0dW5pb24ge1xcbi1cXHRcXHQvKiBwb2ludGVyIHRvIHBlci1jcHUgcG9pbnRlciAqL1xcbi1cXHRcXHR2b2lkICpwdHJfdG9fcHB0cjtcXG4tXFx0XFx0c3RydWN0IGJwZl9scnVfbm9kZSBscnVfbm9kZTtcXG4tXFx0fTtcXG4tXFx0dTMyIGhhc2g7XFxuLVxcdGNoYXIga2V5W10gX19hbGlnbmVkKDgpO1xcbit9O1xcbitcXG4rc3RydWN0IGh0YWJfZWxlbSB7XFxuK1xcdHN0cnVjdCBodGFiX25vZGUgbm9kZTtcXG4rXFx0dTggZGF0YVtdIF9fYWxpZ25lZCg4KTtcXG4rfTtcXG4rXFxuK3N0cnVjdCBodGFiX2VsZW1fbHJ1IHtcXG4rXFx0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xcbitcXHRzdHJ1Y3QgYnBmX2xydV9ub2RlIGxydV9ub2RlO1xcbitcXHR1OCBkYXRhW10gX19hbGlnbmVkKDgpO1xcbit9O1xcbitcXG4rLyogT25seSBmb3Igbm9uLXByZWFsbG9jYXRlZCBQQ1BVIG1hcHMuIFByZWFsbG9jYXRlZCBQQ1BVIG1hcHMgZG9uJ3QgbmVlZFxcbisgKiBwdHJfdG9fcHB0ciwgYW5kIHVzZSBodGFiX2VsZW0uXFxuKyAqL1xcbitzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUge1xcbitcXHRzdHJ1Y3QgaHRhYl9ub2RlIG5vZGU7XFxuK1xcdHZvaWQgKnB0cl90b19wcHRyO1xcbitcXHR1OCBkYXRhW10gX19hbGlnbmVkKDgpO1xcbiB9O1xcbiBcXG4gc3RydWN0IGh0YWJfYnRmX3JlY29yZCB7XFxuIFxcdHN0cnVjdCBidGZfcmVjb3JkICpyZWNvcmQ7XFxuIFxcdHUzMiBrZXlfc2l6ZTtcXG4rXFx0dTMyIGtleV9vZmZzZXQ7XFxuIH07XFxuIFxcbiBzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9pc19wcmVhbGxvYyhjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuQEAgLTEzNiw2ICsxNTMsMjEgQEAgc3RhdGljIGlubGluZSBib29sIGh0YWJfaXNfcHJlYWxsb2MoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXHRyZXR1cm4gIShodGFiLVxcdTAwM2VtYXAubWFwX2ZsYWdzIFxcdTAwMjYgQlBGX0ZfTk9fUFJFQUxMT0MpO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfbHJ1X25vZGUgKmh0YWJfZWxlbV9scnVfbm9kZShzdHJ1Y3QgaHRhYl9lbGVtICpsKVxcbit7XFxuK1xcdHJldHVybiBcXHUwMDI2KChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLVxcdTAwM2VscnVfbm9kZTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fZ2V0X3B0cl90b19wcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwpXFxuK3tcXG4rXFx0cmV0dXJuICgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktXFx1MDAzZXB0cl90b19wcHRyO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHJfdG9fcHB0cihzdHJ1Y3QgaHRhYl9lbGVtICpsLCB2b2lkICpwdHIpXFxuK3tcXG4rXFx0KChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cXHUwMDNlcHRyX3RvX3BwdHIgPSBwdHI7XFxuK31cXG4rXFxuIHN0YXRpYyB2b2lkIGh0YWJfaW5pdF9idWNrZXRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4ge1xcbiBcXHR1bnNpZ25lZCBpbnQgaTtcXG5AQCAtMTgzLDI1ICsyMTUsMzAgQEAgc3RhdGljIGlubGluZSBib29sIGlzX2ZkX2h0YWIoY29uc3Qgc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXHRyZXR1cm4gaHRhYi1cXHUwMDNlbWFwLm1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9IQVNIX09GX01BUFM7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX3ZhbHVlKHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBrZXlfc2l6ZSlcXG4rc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fa2V5KHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcXG4re1xcbitcXHRyZXR1cm4gKHZvaWQgKilsICsgaHRhYi1cXHUwMDNla2V5X29mZnNldDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxcbiB7XFxuLVxcdHJldHVybiBsLVxcdTAwM2VrZXkgKyByb3VuZF91cChrZXlfc2l6ZSwgOCk7XFxuK1xcdHJldHVybiBodGFiX2VsZW1fa2V5KGh0YWIsIGwpICsgcm91bmRfdXAoaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplLCA4KTtcXG4gfVxcbiBcXG4tc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyKHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBrZXlfc2l6ZSxcXG4rc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbCxcXG4gXFx0XFx0XFx0XFx0ICAgICB2b2lkIF9fcGVyY3B1ICpwcHRyKVxcbiB7XFxuLVxcdCoodm9pZCBfX3BlcmNwdSAqKilodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpID0gcHB0cjtcXG4rXFx0Kih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShodGFiLCBsKSA9IHBwdHI7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BlcmNwdSAqaHRhYl9lbGVtX2dldF9wdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplKVxcbitzdGF0aWMgaW5saW5lIHZvaWQgX19wZXJjcHUgKmh0YWJfZWxlbV9nZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcXG4ge1xcbi1cXHRyZXR1cm4gKih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShsLCBrZXlfc2l6ZSk7XFxuK1xcdHJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xcbiB9XFxuIFxcbi1zdGF0aWMgdm9pZCAqZmRfaHRhYl9tYXBfZ2V0X3B0cihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxcbitzdGF0aWMgdm9pZCAqZmRfaHRhYl9tYXBfZ2V0X3B0cihzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXFxuIHtcXG4tXFx0cmV0dXJuICoodm9pZCAqKilodGFiX2VsZW1fdmFsdWUobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdHJldHVybiAqKHZvaWQgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqZ2V0X2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIGludCBpKVxcbkBAIC0yMDksNiArMjQ2LDMzIEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpnZXRfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgaW50IGkpXFxuIFxcdHJldHVybiAoc3RydWN0IGh0YWJfZWxlbSAqKSAoaHRhYi1cXHUwMDNlZWxlbXMgKyBpICogKHU2NClodGFiLVxcdTAwM2VlbGVtX3NpemUpO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9oYXNfaGFzaChjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuK3tcXG4rXFx0cmV0dXJuIGh0YWItXFx1MDAzZWhhc19oYXNoO1xcbit9XFxuK1xcbitzdGF0aWMgaW5saW5lIHUzMiBodGFiX2VsZW1faGFzaChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXFxuK3tcXG4rXFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxcbitcXHRcXHRyZXR1cm4gKih1MzIgKikoKHN0cnVjdCBodGFiX2VsZW1fbHJ1ICopbCktXFx1MDAzZWRhdGE7XFxuK1xcdGVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpIFxcdTAwMjZcXHUwMDI2ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKVxcbitcXHRcXHRyZXR1cm4gKih1MzIgKikoKHN0cnVjdCBodGFiX2VsZW1fcGNwdSAqKWwpLVxcdTAwM2VkYXRhO1xcbitcXHRlbHNlXFxuK1xcdFxcdHJldHVybiAqKHUzMiAqKWwtXFx1MDAzZWRhdGE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBodGFiX2VsZW1fc2V0X2hhc2goc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsLCB1MzIgaGFzaClcXG4re1xcbitcXHRpZiAoIWh0YWJfaGFzX2hhc2goaHRhYikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxcbitcXHRcXHQqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS1cXHUwMDNlZGF0YSA9IGhhc2g7XFxuK1xcdGVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpIFxcdTAwMjZcXHUwMDI2ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKVxcbitcXHRcXHQqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktXFx1MDAzZWRhdGEgPSBoYXNoO1xcbitcXHRlbHNlXFxuK1xcdFxcdCoodTMyICopbC1cXHUwMDNlZGF0YSA9IGhhc2g7XFxuK31cXG4rXFxuIC8qIEJvdGggcGVyY3B1IGFuZCBmZCBodGFiIHN1cHBvcnQgaW4tcGxhY2UgdXBkYXRlLCBzbyBubyBuZWVkIGZvclxcbiAgKiBleHRyYSBlbGVtLiBMUlUgaXRzZWxmIGNhbiByZW1vdmUgdGhlIGxlYXN0IHVzZWQgZWxlbWVudCwgc29cXG4gICogdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gZXh0cmEgZWxlbSBkdXJpbmcgbWFwX3VwZGF0ZS5cXG5AQCAtMjMxLDcgKzI5NSw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXG4gXFx0XFx0ZWxlbSA9IGdldF9odGFiX2VsZW0oaHRhYiwgaSk7XFxuIFxcdFxcdGJwZl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLVxcdTAwM2VtYXAua2V5X3NpemUpKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTtcXG4gXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIFxcdH1cXG4gfVxcbkBAIC0yNTQsNyArMzE4LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX3ByZWFsbG9jZWRfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4gXFxuIFxcdFxcdGVsZW0gPSBnZXRfaHRhYl9lbGVtKGh0YWIsIGkpO1xcbiBcXHRcXHRpZiAoaHRhYl9pc19wZXJjcHUoaHRhYikpIHtcXG4tXFx0XFx0XFx0dm9pZCBfX3BlcmNwdSAqcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSk7XFxuK1xcdFxcdFxcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcXG4gXFx0XFx0XFx0aW50IGNwdTtcXG4gXFxuIFxcdFxcdFxcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcXG5AQCAtMjYzLDcgKzMyNyw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0fSBlbHNlIHtcXG4gXFx0XFx0XFx0YnBmX29ial9mcmVlX2ZpZWxkcyhodGFiLVxcdTAwM2VtYXAucmVjb3JkLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xcbitcXHRcXHRcXHRcXHRcXHQgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pKTtcXG4gXFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIFxcdFxcdH1cXG4gXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuQEAgLTI4MCw4ICszNDQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2ZyZWVfZWxlbXMoc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaHRhYi1cXHUwMDNlbWFwLm1heF9lbnRyaWVzOyBpKyspIHtcXG4gXFx0XFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcXG4gXFxuLVxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihnZXRfaHRhYl9lbGVtKGh0YWIsIGkpLFxcbi1cXHRcXHRcXHRcXHRcXHQgaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplKTtcXG4rXFx0XFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGdldF9odGFiX2VsZW0oaHRhYiwgaSkpO1xcbiBcXHRcXHRmcmVlX3BlcmNwdShwcHRyKTtcXG4gXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIFxcdH1cXG5AQCAtMzA4LDggKzM3MSw4IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpwcmVhbGxvY19scnVfcG9wKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LFxcbiBcXG4gXFx0aWYgKG5vZGUpIHtcXG4gXFx0XFx0YnBmX21hcF9pbmNfZWxlbV9jb3VudChcXHUwMDI2aHRhYi1cXHUwMDNlbWFwKTtcXG4tXFx0XFx0bCA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSk7XFxuLVxcdFxcdG1lbWNweShsLVxcdTAwM2VrZXksIGtleSwgaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplKTtcXG4rXFx0XFx0bCA9IChzdHJ1Y3QgaHRhYl9lbGVtICopY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSk7XFxuK1xcdFxcdG1lbWNweShodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXksIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSk7XFxuIFxcdFxcdHJldHVybiBsO1xcbiBcXHR9XFxuIFxcbkBAIC0zNDAsOCArNDAzLDcgQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4gXFx0XFx0XFx0XFx0XFx0ICAgIEdGUF9VU0VSIHwgX19HRlBfTk9XQVJOKTtcXG4gXFx0XFx0aWYgKCFwcHRyKVxcbiBcXHRcXHRcXHRnb3RvIGZyZWVfZWxlbXM7XFxuLVxcdFxcdGh0YWJfZWxlbV9zZXRfcHRyKGdldF9odGFiX2VsZW0oaHRhYiwgaSksIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSxcXG4tXFx0XFx0XFx0XFx0ICBwcHRyKTtcXG4rXFx0XFx0aHRhYl9lbGVtX3NldF9wdHIoaHRhYiwgZ2V0X2h0YWJfZWxlbShodGFiLCBpKSwgcHB0cik7XFxuIFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbiBcXHR9XFxuIFxcbkBAIC0zNDksOCArNDExLDggQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4gXFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxcbiBcXHRcXHRlcnIgPSBicGZfbHJ1X2luaXQoXFx1MDAyNmh0YWItXFx1MDAzZWxydSxcXG4gXFx0XFx0XFx0XFx0ICAgaHRhYi1cXHUwMDNlbWFwLm1hcF9mbGFncyBcXHUwMDI2IEJQRl9GX05PX0NPTU1PTl9MUlUsXFxuLVxcdFxcdFxcdFxcdCAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGhhc2gpIC1cXG4tXFx0XFx0XFx0XFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpLFxcbitcXHRcXHRcXHRcXHQgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgZGF0YSkgLVxcbitcXHRcXHRcXHRcXHQgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpLFxcbiBcXHRcXHRcXHRcXHQgICBodGFiX2xydV9tYXBfZGVsZXRlX25vZGUsXFxuIFxcdFxcdFxcdFxcdCAgIGh0YWIpO1xcbiBcXHRlbHNlXFxuQEAgLTM2MSwxMSArNDIzLDExIEBAIHN0YXRpYyBpbnQgcHJlYWxsb2NfaW5pdChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuIFxcbiBcXHRpZiAoaHRhYl9pc19scnUoaHRhYikpXFxuIFxcdFxcdGJwZl9scnVfcG9wdWxhdGUoXFx1MDAyNmh0YWItXFx1MDAzZWxydSwgaHRhYi1cXHUwMDNlZWxlbXMsXFxuLVxcdFxcdFxcdFxcdCBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSksXFxuK1xcdFxcdFxcdFxcdCBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpLFxcbiBcXHRcXHRcXHRcXHQgaHRhYi1cXHUwMDNlZWxlbV9zaXplLCBudW1fZW50cmllcyk7XFxuIFxcdGVsc2VcXG4gXFx0XFx0cGNwdV9mcmVlbGlzdF9wb3B1bGF0ZShcXHUwMDI2aHRhYi1cXHUwMDNlZnJlZWxpc3QsXFxuLVxcdFxcdFxcdFxcdCAgICAgICBodGFiLVxcdTAwM2VlbGVtcyArIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgIGh0YWItXFx1MDAzZWVsZW1zICsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSksXFxuIFxcdFxcdFxcdFxcdCAgICAgICBodGFiLVxcdTAwM2VlbGVtX3NpemUsIG51bV9lbnRyaWVzKTtcXG4gXFxuIFxcdHJldHVybiAwO1xcbkBAIC00MDEsNyArNDYzLDcgQEAgc3RhdGljIGludCBhbGxvY19leHRyYV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXFxuIFxcdFxcdC8qIHBvcCB3aWxsIHN1Y2NlZWQsIHNpbmNlIHByZWFsbG9jX2luaXQoKVxcbiBcXHRcXHQgKiBwcmVhbGxvY2F0ZWQgZXh0cmEgbnVtX3Bvc3NpYmxlX2NwdXMgZWxlbWVudHNcXG4gXFx0XFx0ICovXFxuLVxcdFxcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKTtcXG4rXFx0XFx0bF9uZXcgPSBjb250YWluZXJfb2YobCwgc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5mbm9kZSk7XFxuIFxcdFxcdCpwZXJfY3B1X3B0cihwcHRyLCBjcHUpID0gbF9uZXc7XFxuIFxcdH1cXG4gXFx0aHRhYi1cXHUwMDNlZXh0cmFfZWxlbXMgPSBwcHRyO1xcbkBAIC00MjUsOCArNDg3LDggQEAgc3RhdGljIGludCBodGFiX21hcF9hbGxvY19jaGVjayh1bmlvbiBicGZfYXR0ciAqYXR0cilcXG4gXFx0Ym9vbCB6ZXJvX3NlZWQgPSAoYXR0ci1cXHUwMDNlbWFwX2ZsYWdzIFxcdTAwMjYgQlBGX0ZfWkVST19TRUVEKTtcXG4gXFx0aW50IG51bWFfbm9kZSA9IGJwZl9tYXBfYXR0cl9udW1hX25vZGUoYXR0cik7XFxuIFxcbi1cXHRCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgZm5vZGUubmV4dCkgIT1cXG4tXFx0XFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBoYXNoX25vZGUucHByZXYpKTtcXG4rXFx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBodGFiX25vZGUsIGZub2RlLm5leHQpICE9XFxuK1xcdFxcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfbm9kZSwgaGFzaF9ub2RlLnBwcmV2KSk7XFxuIFxcbiBcXHRpZiAoemVyb19zZWVkIFxcdTAwMjZcXHUwMDI2ICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKVxcbiBcXHRcXHQvKiBHdWFyZCBhZ2FpbnN0IGxvY2FsIERvUywgYW5kIGRpc2NvdXJhZ2UgcHJvZHVjdGlvbiB1c2UuICovXFxuQEAgLTQ3Niw3ICs1MzgsNyBAQCBzdGF0aWMgdm9pZCBodGFiX21lbV9kdG9yKHZvaWQgKm9iaiwgdm9pZCAqY3R4KVxcbiBcXHRpZiAoSVNfRVJSX09SX05VTEwoaHJlYy1cXHUwMDNlcmVjb3JkKSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4tXFx0bWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGhyZWMtXFx1MDAzZWtleV9zaXplKTtcXG4rXFx0bWFwX3ZhbHVlID0gKHZvaWQgKillbGVtICsgaHJlYy1cXHUwMDNla2V5X29mZnNldCArIHJvdW5kX3VwKGhyZWMtXFx1MDAzZWtleV9zaXplLCA4KTtcXG4gXFx0YnBmX29ial9mcmVlX2ZpZWxkcyhocmVjLVxcdTAwM2VyZWNvcmQsIG1hcF92YWx1ZSk7XFxuIH1cXG4gXFxuQEAgLTUwMiw3ICs1NjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2R0b3JfY3R4X2ZyZWUodm9pZCAqY3R4KVxcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGJwZl9tYV9zZXRfZHRvcihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX21lbV9hbGxvYyAqbWEsXFxuLVxcdFxcdFxcdCAgIHZvaWQgKCpkdG9yKSh2b2lkICosIHZvaWQgKikpXFxuK1xcdFxcdFxcdCAgIHZvaWQgKCpkdG9yKSh2b2lkICosIHZvaWQgKiksIHUzMiBrZXlfb2Zmc2V0KVxcbiB7XFxuIFxcdHN0cnVjdCBodGFiX2J0Zl9yZWNvcmQgKmhyZWM7XFxuIFxcdGludCBlcnI7XFxuQEAgLTUxNSw2ICs1NzcsNyBAQCBzdGF0aWMgaW50IGJwZl9tYV9zZXRfZHRvcihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX21lbV9hbGxvYyAqbWEsXFxuIFxcdGlmICghaHJlYylcXG4gXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIFxcdGhyZWMtXFx1MDAzZWtleV9zaXplID0gbWFwLVxcdTAwM2VrZXlfc2l6ZTtcXG4rXFx0aHJlYy1cXHUwMDNla2V5X29mZnNldCA9IGtleV9vZmZzZXQ7XFxuIFxcdGhyZWMtXFx1MDAzZXJlY29yZCA9IGJ0Zl9yZWNvcmRfZHVwKG1hcC1cXHUwMDNlcmVjb3JkKTtcXG4gXFx0aWYgKElTX0VSUihocmVjLVxcdTAwM2VyZWNvcmQpKSB7XFxuIFxcdFxcdGVyciA9IFBUUl9FUlIoaHJlYy1cXHUwMDNlcmVjb3JkKTtcXG5AQCAtNTM3LDkgKzYwMCw5IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4gXFx0ICogcG9wdWxhdGVkIGluIGh0YWJfbWFwX2FsbG9jKCksIHNvIGl0IHdpbGwgYWx3YXlzIGFwcGVhciBhcyBOVUxMLlxcbiBcXHQgKi9cXG4gXFx0aWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKVxcbi1cXHRcXHRyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgXFx1MDAyNmh0YWItXFx1MDAzZXBjcHVfbWEsIGh0YWJfcGNwdV9tZW1fZHRvcik7XFxuK1xcdFxcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcXHUwMDI2aHRhYi1cXHUwMDNlcGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yLCBodGFiLVxcdTAwM2VrZXlfb2Zmc2V0KTtcXG4gXFx0ZWxzZVxcbi1cXHRcXHRyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgXFx1MDAyNmh0YWItXFx1MDAzZW1hLCBodGFiX21lbV9kdG9yKTtcXG4rXFx0XFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFxcdTAwMjZodGFiLVxcdTAwM2VtYSwgaHRhYl9tZW1fZHRvciwgaHRhYi1cXHUwMDNla2V5X29mZnNldCk7XFxuIH1cXG4gXFxuIHN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXFxuQEAgLTU2Miw2ICs2MjUsMTMgQEAgc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcXG4gXFxuIFxcdGJwZl9tYXBfaW5pdF9mcm9tX2F0dHIoXFx1MDAyNmh0YWItXFx1MDAzZW1hcCwgYXR0cik7XFxuIFxcbitcXHQvKiBBdm9pZCBoYXNoIG1lbW9yeSB1c2UgYW5kIGNvbXBhcmlzb25zIHdoZXJlIHVubmVjZXNzYXJ5LlxcbitcXHQgKiB1MzIgaGFzaCByZWFkcyBhcmUgYWx3YXlzIGF0b21pYy4gSWYgd2UgZWxpZGUgdGhlbSwga2V5IGNvbXBhcmlzb25zIG11c3QgYWxzbyBiZSBhdG9taWNcXG4rXFx0ICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUga2V5IG1hdGNoZXMgZHVlIHRvIHRvcm4ga2V5IHJlYWRzIC8gd3JpdGVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGVcXG4rXFx0ICogd2hlbiB0aGUga2V5IGZpdHMgd2l0aGluIGEgd29yZCwgc28gY2hlY2sga2V5X3NpemUuXFxuK1xcdCAqL1xcbitcXHRodGFiLVxcdTAwM2VoYXNfaGFzaCA9IGh0YWJfaXNfbHJ1KGh0YWIpIHx8IGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSBcXHUwMDNlIHNpemVvZih1bnNpZ25lZCBsb25nKTtcXG4rXFxuIFxcdGlmIChwZXJjcHVfbHJ1KSB7XFxuIFxcdFxcdC8qIGVuc3VyZSBlYWNoIENQVSdzIGxydSBsaXN0IGhhcyBcXHUwMDNlPTEgZWxlbWVudHMuXFxuIFxcdFxcdCAqIHNpbmNlIHdlIGFyZSBhdCBpdCwgbWFrZSBlYWNoIGxydSBsaXN0IGhhcyB0aGUgc2FtZVxcbkBAIC01ODMsOCArNjUzLDE2IEBAIHN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXFxuIFxcbiBcXHRodGFiLVxcdTAwM2VuX2J1Y2tldHMgPSByb3VuZHVwX3Bvd19vZl90d28oaHRhYi1cXHUwMDNlbWFwLm1heF9lbnRyaWVzKTtcXG4gXFxuLVxcdGh0YWItXFx1MDAzZWVsZW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaHRhYl9lbGVtKSArXFxuLVxcdFxcdFxcdCAgcm91bmRfdXAoaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplLCA4KTtcXG4rXFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxcbitcXHRcXHRodGFiLVxcdTAwM2VrZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGRhdGEpICsgODtcXG4rXFx0ZWxzZSBpZiAocGVyY3B1IFxcdTAwMjZcXHUwMDI2ICFwcmVhbGxvYylcXG4rXFx0XFx0aHRhYi1cXHUwMDNla2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fcGNwdSwgZGF0YSkgK1xcbitcXHRcXHRcXHRcXHQgICAoaHRhYl9oYXNfaGFzaChodGFiKSA/IDggOiAwKTtcXG4rXFx0ZWxzZVxcbitcXHRcXHRodGFiLVxcdTAwM2VrZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgZGF0YSkgK1xcbitcXHRcXHRcXHRcXHQgICAoaHRhYl9oYXNfaGFzaChodGFiKSA/IDggOiAwKTtcXG4rXFxuK1xcdGh0YWItXFx1MDAzZWVsZW1fc2l6ZSA9IGh0YWItXFx1MDAzZWtleV9vZmZzZXQgKyByb3VuZF91cChodGFiLVxcdTAwM2VtYXAua2V5X3NpemUsIDgpO1xcbiBcXHRpZiAocGVyY3B1KVxcbiBcXHRcXHRodGFiLVxcdTAwM2VlbGVtX3NpemUgKz0gc2l6ZW9mKHZvaWQgKik7XFxuIFxcdGVsc2VcXG5AQCAtNjkyLDE1ICs3NzAsMjkgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqc2VsZWN0X2J1Y2tldChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHUzMlxcbiB9XFxuIFxcbiAvKiB0aGlzIGxvb2t1cCBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBidWNrZXQgbG9jayB0YWtlbiAqL1xcbi1zdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLCB1MzIgaGFzaCxcXG4rc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsXFxuK1xcdFxcdFxcdFxcdFxcdCBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2gsXFxuIFxcdFxcdFxcdFxcdFxcdCB2b2lkICprZXksIHUzMiBrZXlfc2l6ZSlcXG4ge1xcbiBcXHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFxuLVxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpXFxuLVxcdFxcdGlmIChsLVxcdTAwM2VoYXNoID09IGhhc2ggXFx1MDAyNlxcdTAwMjYgIW1lbWNtcChcXHUwMDI2bC1cXHUwMDNla2V5LCBrZXksIGtleV9zaXplKSlcXG4tXFx0XFx0XFx0cmV0dXJuIGw7XFxuK1xcdGlmIChodGFiX2hhc19oYXNoKGh0YWIpKSB7XFxuK1xcdFxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSlcXG4rXFx0XFx0XFx0aWYgKGh0YWJfZWxlbV9oYXNoKGh0YWIsIGwpID09IGhhc2ggXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0XFx0ICAgICFtZW1jbXAoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBrZXlfc2l6ZSkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBsO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHQvKiBXaGVuIGhhc2ggaXMgb21pdHRlZCwga2V5IGNvbXBhcmlzb25zIG11c3QgYmUgYXRvbWljLiBaZXJvIGV4dGVuZFxcbitcXHRcXHQgKiB0aGUgY2FsbGVyJ3Mga2V5IHRvIHRoZSB3b3JkIHNpemUgdG8gc3VwcG9ydCBhbiBhdG9taWMgY29tcGFyZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgayA9IDA7XFxuK1xcbitcXHRcXHRtZW1jcHkoXFx1MDAyNmssIGtleSwga2V5X3NpemUpO1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXFxuK1xcdFxcdFxcdGlmIChSRUFEX09OQ0UoKih1bnNpZ25lZCBsb25nICopaHRhYl9lbGVtX2tleShodGFiLCBsKSkgPT0gaylcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGw7XFxuK1xcdH1cXG4gXFxuIFxcdHJldHVybiBOVUxMO1xcbiB9XFxuQEAgLTcwOSw3ICs4MDEsOCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLCB1MzIgaGFzaFxcbiAgKiB0aGUgdW5saWtlbHkgZXZlbnQgd2hlbiBlbGVtZW50cyBtb3ZlZCBmcm9tIG9uZSBidWNrZXQgaW50byBhbm90aGVyXFxuICAqIHdoaWxlIGxpbmsgbGlzdCBpcyBiZWluZyB3YWxrZWRcXG4gICovXFxuLXN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsXFxuK3N0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpsb29rdXBfbnVsbHNfZWxlbV9yYXcoc3RydWN0IGJwZl9odGFiICpodGFiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmhlYWQsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgICB1MzIgaGFzaCwgdm9pZCAqa2V5LFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICAgdTMyIGtleV9zaXplLCB1MzIgbl9idWNrZXRzKVxcbiB7XFxuQEAgLTcxNyw5ICs4MTAsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCxcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFxuIGFnYWluOlxcbi1cXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKVxcbi1cXHRcXHRpZiAobC1cXHUwMDNlaGFzaCA9PSBoYXNoIFxcdTAwMjZcXHUwMDI2ICFtZW1jbXAoXFx1MDAyNmwtXFx1MDAzZWtleSwga2V5LCBrZXlfc2l6ZSkpXFxuLVxcdFxcdFxcdHJldHVybiBsO1xcbitcXHRpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkge1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXFxuK1xcdFxcdFxcdGlmIChodGFiX2VsZW1faGFzaChodGFiLCBsKSA9PSBoYXNoIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdCAgICAhbWVtY21wKGh0YWJfZWxlbV9rZXkoaHRhYiwgbCksIGtleSwga2V5X3NpemUpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gbDtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0LyogU2VlIGxvb2t1cF9lbGVtX3JhdygpIGNvbW1lbnQgYWJvdmUuICovXFxuK1xcdFxcdHVuc2lnbmVkIGxvbmcgayA9IDA7XFxuK1xcbitcXHRcXHRtZW1jcHkoXFx1MDAyNmssIGtleSwga2V5X3NpemUpO1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXFxuK1xcdFxcdFxcdGlmIChSRUFEX09OQ0UoKih1bnNpZ25lZCBsb25nICopaHRhYl9lbGVtX2tleShodGFiLCBsKSkgPT0gaylcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIGw7XFxuK1xcdH1cXG4gXFxuIFxcdGlmICh1bmxpa2VseShnZXRfbnVsbHNfdmFsdWUobikgIT0gKGhhc2ggXFx1MDAyNiAobl9idWNrZXRzIC0gMSkpKSlcXG4gXFx0XFx0Z290byBhZ2FpbjtcXG5AQCAtNzQ3LDE3ICs4NTEsMTggQEAgc3RhdGljIHZvaWQgKl9faHRhYl9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiBcXG4gXFx0aGVhZCA9IHNlbGVjdF9idWNrZXQoaHRhYiwgaGFzaCk7XFxuIFxcbi1cXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXFx1MDAzZW5fYnVja2V0cyk7XFxuK1xcdGwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi1cXHUwMDNlbl9idWNrZXRzKTtcXG4gXFxuIFxcdHJldHVybiBsO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCAqaHRhYl9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xcbiBcXG4gXFx0aWYgKGwpXFxuLVxcdFxcdHJldHVybiBodGFiX2VsZW1fdmFsdWUobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdFxcdHJldHVybiBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG4gfVxcbkBAIC03NzUsNiArODgwLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gICovXFxuIHN0YXRpYyBpbnQgaHRhYl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XFxuIFxcdGNvbnN0IGludCByZXQgPSBCUEZfUkVHXzA7XFxuIFxcbkBAIC03ODMsNyArODg5LDcgQEAgc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXFxuIFxcdCppbnNuKysgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xcbiBcXHQqaW5zbisrID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCAxKTtcXG4gXFx0Kmluc24rKyA9IEJQRl9BTFU2NF9JTU0oQlBGX0FERCwgcmV0LFxcbi1cXHRcXHRcXHRcXHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICtcXG4rXFx0XFx0XFx0XFx0aHRhYi1cXHUwMDNla2V5X29mZnNldCArXFxuIFxcdFxcdFxcdFxcdHJvdW5kX3VwKG1hcC1cXHUwMDNla2V5X3NpemUsIDgpKTtcXG4gXFx0cmV0dXJuIGluc24gLSBpbnNuX2J1ZjtcXG4gfVxcbkBAIC03OTEsMTIgKzg5NywxMyBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcXG4gc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkICpfX2h0YWJfbHJ1X21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHR2b2lkICprZXksIGNvbnN0IGJvb2wgbWFyaylcXG4ge1xcbitcXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XFxuIFxcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcXG4gXFxuIFxcdGlmIChsKSB7XFxuIFxcdFxcdGlmIChtYXJrKVxcbi1cXHRcXHRcXHRicGZfbHJ1X25vZGVfc2V0X3JlZihcXHUwMDI2bC1cXHUwMDNlbHJ1X25vZGUpO1xcbi1cXHRcXHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobCkpO1xcbitcXHRcXHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtODE1LDYgKzkyMiw3IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9tYXBfbG9va3VwX2VsZW1fc3lzKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gc3RhdGljIGludCBodGFiX2xydV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XFxuIFxcdGNvbnN0IGludCByZXQgPSBCUEZfUkVHXzA7XFxuIFxcdGNvbnN0IGludCByZWZfcmVnID0gQlBGX1JFR18xO1xcbkBAIC04MjQsMTUgKzkzMiwxNSBAQCBzdGF0aWMgaW50IGh0YWJfbHJ1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsXFxuIFxcdCppbnNuKysgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xcbiBcXHQqaW5zbisrID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgcmV0LCAwLCA0KTtcXG4gXFx0Kmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9CLCByZWZfcmVnLCByZXQsXFxuLVxcdFxcdFxcdCAgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSArXFxuK1xcdFxcdFxcdCAgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSkgK1xcbiBcXHRcXHRcXHQgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpKTtcXG4gXFx0Kmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KTkUsIHJlZl9yZWcsIDAsIDEpO1xcbiBcXHQqaW5zbisrID0gQlBGX1NUX01FTShCUEZfQiwgcmV0LFxcbi1cXHRcXHRcXHQgICAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSArXFxuK1xcdFxcdFxcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSArXFxuIFxcdFxcdFxcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGJwZl9scnVfbm9kZSwgcmVmKSxcXG4gXFx0XFx0XFx0ICAgICAxKTtcXG4gXFx0Kmluc24rKyA9IEJQRl9BTFU2NF9JTU0oQlBGX0FERCwgcmV0LFxcbi1cXHRcXHRcXHRcXHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICtcXG4rXFx0XFx0XFx0XFx0aHRhYi1cXHUwMDNla2V5X29mZnNldCArXFxuIFxcdFxcdFxcdFxcdHJvdW5kX3VwKG1hcC1cXHUwMDNla2V5X3NpemUsIDgpKTtcXG4gXFx0cmV0dXJuIGluc24gLSBpbnNuX2J1ZjtcXG4gfVxcbkBAIC04NDQsMTMgKzk1MiwxMyBAQCBzdGF0aWMgdm9pZCBjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuIFxcdGlmIChodGFiX2lzX3BlcmNwdShodGFiKSkge1xcbi1cXHRcXHR2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplKTtcXG4rXFx0XFx0dm9pZCBfX3BlcmNwdSAqcHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGVsZW0pO1xcbiBcXHRcXHRpbnQgY3B1O1xcbiBcXG4gXFx0XFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSlcXG4gXFx0XFx0XFx0YnBmX29ial9jYW5jZWxfZmllbGRzKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHR2b2lkICptYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHRhYi1cXHUwMDNlbWFwLmtleV9zaXplKTtcXG4rXFx0XFx0dm9pZCAqbWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pO1xcbiBcXG4gXFx0XFx0YnBmX29ial9jYW5jZWxfZmllbGRzKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIG1hcF92YWx1ZSk7XFxuIFxcdH1cXG5AQCAtODY5LDE3ICs5NzcsMTcgQEAgc3RhdGljIGJvb2wgaHRhYl9scnVfbWFwX2RlbGV0ZV9ub2RlKHZvaWQgKmFyZywgc3RydWN0IGJwZl9scnVfbm9kZSAqbm9kZSlcXG4gXFx0c3RydWN0IGJ1Y2tldCAqYjtcXG4gXFx0aW50IHJldDtcXG4gXFxuLVxcdHRndF9sID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKTtcXG4tXFx0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCB0Z3RfbC1cXHUwMDNlaGFzaCk7XFxuK1xcdHRndF9sID0gKHN0cnVjdCBodGFiX2VsZW0gKiljb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKTtcXG4rXFx0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCBodGFiX2VsZW1faGFzaChodGFiLCB0Z3RfbCkpO1xcbiBcXHRoZWFkID0gXFx1MDAyNmItXFx1MDAzZWhlYWQ7XFxuIFxcbiBcXHRyZXQgPSBodGFiX2xvY2tfYnVja2V0KGIsIFxcdTAwMjZmbGFncyk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFxuLVxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpXFxuK1xcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSlcXG4gXFx0XFx0aWYgKGwgPT0gdGd0X2wpIHtcXG4tXFx0XFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bC1cXHUwMDNlaGFzaF9ub2RlKTtcXG4rXFx0XFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bC1cXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xcbiBcXHRcXHRcXHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFxcdTAwMjZodGFiLVxcdTAwM2VtYXApO1xcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fVxcbkBAIC05MTIsMTggKzEwMjAsMTkgQEAgc3RhdGljIGludCBodGFiX21hcF9nZXRfbmV4dF9rZXkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICpuZXh0X2tleSlcXG4gXFx0aGVhZCA9IHNlbGVjdF9idWNrZXQoaHRhYiwgaGFzaCk7XFxuIFxcbiBcXHQvKiBsb29rdXAgdGhlIGtleSAqL1xcbi1cXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXFx1MDAzZW5fYnVja2V0cyk7XFxuK1xcdGwgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSwgaHRhYi1cXHUwMDNlbl9idWNrZXRzKTtcXG4gXFxuIFxcdGlmICghbClcXG4gXFx0XFx0Z290byBmaW5kX2ZpcnN0X2VsZW07XFxuIFxcbiBcXHQvKiBrZXkgd2FzIGZvdW5kLCBnZXQgbmV4dCBrZXkgaW4gdGhlIHNhbWUgYnVja2V0ICovXFxuLVxcdG5leHRfbCA9IGhsaXN0X251bGxzX2VudHJ5X3NhZmUocmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcXHUwMDI2bC1cXHUwMDNlaGFzaF9ub2RlKSksXFxuLVxcdFxcdFxcdFxcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcXG4rXFx0bmV4dF9sID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShcXG4rXFx0XFx0XFx0cmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcXHUwMDI2bC1cXHUwMDNlbm9kZS5oYXNoX25vZGUpKSxcXG4rXFx0XFx0XFx0c3RydWN0IGh0YWJfZWxlbSwgbm9kZS5oYXNoX25vZGUpO1xcbiBcXG4gXFx0aWYgKG5leHRfbCkge1xcbiBcXHRcXHQvKiBpZiBuZXh0IGVsZW0gaW4gdGhpcyBoYXNoIGxpc3QgaXMgbm9uLXplcm8sIGp1c3QgcmV0dXJuIGl0ICovXFxuLVxcdFxcdG1lbWNweShuZXh0X2tleSwgbmV4dF9sLVxcdTAwM2VrZXksIGtleV9zaXplKTtcXG4rXFx0XFx0bWVtY3B5KG5leHRfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIG5leHRfbCksIGtleV9zaXplKTtcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcdH1cXG4gXFxuQEAgLTkzOCwxMCArMTA0NywxMCBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dldF9uZXh0X2tleShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKm5leHRfa2V5KVxcbiBcXG4gXFx0XFx0LyogcGljayBmaXJzdCBlbGVtZW50IGluIHRoZSBidWNrZXQgKi9cXG4gXFx0XFx0bmV4dF9sID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShyY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX2ZpcnN0X3JjdShoZWFkKSksXFxuLVxcdFxcdFxcdFxcdFxcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcXG4rXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XFxuIFxcdFxcdGlmIChuZXh0X2wpIHtcXG4gXFx0XFx0XFx0LyogaWYgaXQncyBub3QgZW1wdHksIGp1c3QgcmV0dXJuIGl0ICovXFxuLVxcdFxcdFxcdG1lbWNweShuZXh0X2tleSwgbmV4dF9sLVxcdTAwM2VrZXksIGtleV9zaXplKTtcXG4rXFx0XFx0XFx0bWVtY3B5KG5leHRfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIG5leHRfbCksIGtleV9zaXplKTtcXG4gXFx0XFx0XFx0cmV0dXJuIDA7XFxuIFxcdFxcdH1cXG4gXFx0fVxcbkBAIC05NTUsNyArMTA2NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZWxlbV9mcmVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcXG4gXFx0Y2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgbCk7XFxuIFxcbiBcXHRpZiAoaHRhYi1cXHUwMDNlbWFwLm1hcF90eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfSEFTSClcXG4tXFx0XFx0YnBmX21lbV9jYWNoZV9mcmVlKFxcdTAwMjZodGFiLVxcdTAwM2VwY3B1X21hLCBsLVxcdTAwM2VwdHJfdG9fcHB0cik7XFxuK1xcdFxcdGJwZl9tZW1fY2FjaGVfZnJlZShcXHUwMDI2aHRhYi1cXHUwMDNlcGNwdV9tYSwgaHRhYl9lbGVtX2dldF9wdHJfdG9fcHB0cihsKSk7XFxuIFxcdGJwZl9tZW1fY2FjaGVfZnJlZShcXHUwMDI2aHRhYi1cXHUwMDNlbWEsIGwpO1xcbiB9XFxuIFxcbkBAIC05NjUsNyArMTA3NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfcHV0X2ZkX3ZhbHVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcXG4gXFx0dm9pZCAqcHRyO1xcbiBcXG4gXFx0aWYgKG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZmRfcHV0X3B0cikge1xcbi1cXHRcXHRwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7XFxuK1xcdFxcdHB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIoaHRhYiwgbCk7XFxuIFxcdFxcdG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZmRfcHV0X3B0cihtYXAsIHB0ciwgdHJ1ZSk7XFxuIFxcdH1cXG4gfVxcbkBAIC0xMDA2LDcgKzExMTUsNyBAQCBzdGF0aWMgdm9pZCBmcmVlX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXFxuIFxcdGlmIChodGFiX2lzX3ByZWFsbG9jKGh0YWIpKSB7XFxuIFxcdFxcdGJwZl9tYXBfZGVjX2VsZW1fY291bnQoXFx1MDAyNmh0YWItXFx1MDAzZW1hcCk7XFxuIFxcdFxcdGNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKGh0YWIsIGwpO1xcbi1cXHRcXHRwY3B1X2ZyZWVsaXN0X3B1c2goXFx1MDAyNmh0YWItXFx1MDAzZWZyZWVsaXN0LCBcXHUwMDI2bC1cXHUwMDNlZm5vZGUpO1xcbitcXHRcXHRwY3B1X2ZyZWVsaXN0X3B1c2goXFx1MDAyNmh0YWItXFx1MDAzZWZyZWVsaXN0LCBcXHUwMDI2bC1cXHUwMDNlbm9kZS5mbm9kZSk7XFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdGRlY19lbGVtX2NvdW50KGh0YWIpO1xcbiBcXHRcXHRodGFiX2VsZW1fZnJlZShodGFiLCBsKTtcXG5AQCAtMTA5Nyw3ICsxMjA2LDcgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcXG4gXFx0XFx0XFx0bCA9IF9fcGNwdV9mcmVlbGlzdF9wb3AoXFx1MDAyNmh0YWItXFx1MDAzZWZyZWVsaXN0KTtcXG4gXFx0XFx0XFx0aWYgKCFsKVxcbiBcXHRcXHRcXHRcXHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xcbi1cXHRcXHRcXHRsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSk7XFxuK1xcdFxcdFxcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIG5vZGUuZm5vZGUpO1xcbiBcXHRcXHRcXHRicGZfbWFwX2luY19lbGVtX2NvdW50KFxcdTAwMjZodGFiLVxcdTAwM2VtYXApO1xcbiBcXHRcXHR9XFxuIFxcdH0gZWxzZSB7XFxuQEAgLTExMTcsMTAgKzEyMjYsMjAgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcXG4gXFx0XFx0fVxcbiBcXHR9XFxuIFxcbi1cXHRtZW1jcHkobF9uZXctXFx1MDAzZWtleSwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGlmIChodGFiX2hhc19oYXNoKGh0YWIpKSB7XFxuK1xcdFxcdG1lbWNweShodGFiX2VsZW1fa2V5KGh0YWIsIGxfbmV3KSwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIFplcm8tZXh0ZW5kIGtleSBpbnRvIGsgZm9yIGFuIGF0b21pYyB3cml0ZSB0byBzdXBwb3J0XFxuK1xcdFxcdCAqIGxvY2tsZXNzIFJDVSByZWFkZXJzLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBrID0gMDtcXG4rXFxuK1xcdFxcdG1lbWNweShcXHUwMDI2aywga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdFxcdFdSSVRFX09OQ0UoKih1bnNpZ25lZCBsb25nICopaHRhYl9lbGVtX2tleShodGFiLCBsX25ldyksIGspO1xcbitcXHR9XFxuIFxcdGlmIChwZXJjcHUpIHtcXG4gXFx0XFx0aWYgKHByZWFsbG9jKSB7XFxuLVxcdFxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsX25ldywga2V5X3NpemUpO1xcbitcXHRcXHRcXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9uZXcpO1xcbiBcXHRcXHR9IGVsc2Uge1xcbiBcXHRcXHRcXHQvKiBhbGxvY19wZXJjcHUgemVyby1maWxscyAqL1xcbiBcXHRcXHRcXHR2b2lkICpwdHIgPSBicGZfbWVtX2NhY2hlX2FsbG9jKFxcdTAwMjZodGFiLVxcdTAwM2VwY3B1X21hKTtcXG5AQCAtMTEzMCwyNiArMTI0OSwyNiBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqYWxsb2NfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdm9pZCAqa2V5LFxcbiBcXHRcXHRcXHRcXHRsX25ldyA9IEVSUl9QVFIoLUVOT01FTSk7XFxuIFxcdFxcdFxcdFxcdGdvdG8gZGVjX2NvdW50O1xcbiBcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdGxfbmV3LVxcdTAwM2VwdHJfdG9fcHB0ciA9IHB0cjtcXG4rXFx0XFx0XFx0aHRhYl9lbGVtX3NldF9wdHJfdG9fcHB0cihsX25ldywgcHRyKTtcXG4gXFx0XFx0XFx0cHB0ciA9ICoodm9pZCBfX3BlcmNwdSAqKilwdHI7XFxuIFxcdFxcdH1cXG4gXFxuIFxcdFxcdHBjcHVfaW5pdF92YWx1ZShodGFiLCBwcHRyLCB2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xcbiBcXG4gXFx0XFx0aWYgKCFwcmVhbGxvYylcXG4tXFx0XFx0XFx0aHRhYl9lbGVtX3NldF9wdHIobF9uZXcsIGtleV9zaXplLCBwcHRyKTtcXG4rXFx0XFx0XFx0aHRhYl9lbGVtX3NldF9wdHIoaHRhYiwgbF9uZXcsIHBwdHIpO1xcbiBcXHR9IGVsc2UgaWYgKGZkX2h0YWJfbWFwX25lZWRzX2FkanVzdChodGFiKSkge1xcbiBcXHRcXHRzaXplID0gcm91bmRfdXAoc2l6ZSwgOCk7XFxuLVxcdFxcdG1lbWNweShodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSwgdmFsdWUsIHNpemUpO1xcbitcXHRcXHRtZW1jcHkoaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfbmV3KSwgdmFsdWUsIHNpemUpO1xcbiBcXHR9IGVsc2UgaWYgKG1hcF9mbGFncyBcXHUwMDI2IEJQRl9GX0xPQ0spIHtcXG4gXFx0XFx0Y29weV9tYXBfdmFsdWVfbG9ja2VkKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsXFxuLVxcdFxcdFxcdFxcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsX25ldywga2V5X3NpemUpLFxcbitcXHRcXHRcXHRcXHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLFxcbiBcXHRcXHRcXHRcXHQgICAgICB2YWx1ZSwgZmFsc2UpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRjb3B5X21hcF92YWx1ZShcXHUwMDI2aHRhYi1cXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSwgdmFsdWUpO1xcbitcXHRcXHRjb3B5X21hcF92YWx1ZShcXHUwMDI2aHRhYi1cXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSk7XFxuIFxcdH1cXG4gXFxuLVxcdGxfbmV3LVxcdTAwM2VoYXNoID0gaGFzaDtcXG4rXFx0aHRhYl9lbGVtX3NldF9oYXNoKGh0YWIsIGxfbmV3LCBoYXNoKTtcXG4gXFx0cmV0dXJuIGxfbmV3O1xcbiBkZWNfY291bnQ6XFxuIFxcdGRlY19lbGVtX2NvdW50KGh0YWIpO1xcbkBAIC0xMTk5LDcgKzEzMTgsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbiBcXHRcXHRpZiAodW5saWtlbHkoIWJ0Zl9yZWNvcmRfaGFzX2ZpZWxkKG1hcC1cXHUwMDNlcmVjb3JkLCBCUEZfU1BJTl9MT0NLKSkpXFxuIFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbiBcXHRcXHQvKiBmaW5kIGFuIGVsZW1lbnQgd2l0aG91dCB0YWtpbmcgdGhlIGJ1Y2tldCBsb2NrICovXFxuLVxcdFxcdGxfb2xkID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsXFxuK1xcdFxcdGxfb2xkID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgIGh0YWItXFx1MDAzZW5fYnVja2V0cyk7XFxuIFxcdFxcdHJldCA9IGNoZWNrX2ZsYWdzKGh0YWIsIGxfb2xkLCBtYXBfZmxhZ3MpO1xcbiBcXHRcXHRpZiAocmV0KVxcbkBAIC0xMjA3LDcgKzEzMjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxcbiBcXHRcXHRpZiAobF9vbGQpIHtcXG4gXFx0XFx0XFx0LyogZ3JhYiB0aGUgZWxlbWVudCBsb2NrIGFuZCB1cGRhdGUgdmFsdWUgaW4gcGxhY2UgKi9cXG4gXFx0XFx0XFx0Y29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCxcXG4tXFx0XFx0XFx0XFx0XFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGxfb2xkLCBrZXlfc2l6ZSksXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX29sZCksXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgIHZhbHVlLCBmYWxzZSk7XFxuIFxcdFxcdFxcdHJldHVybiAwO1xcbiBcXHRcXHR9XFxuQEAgLTEyMjEsNyArMTM0MCw3IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcbi1cXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcXG4rXFx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuIFxcbiBcXHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcXG4gXFx0aWYgKHJldClcXG5AQCAtMTIzNSw3ICsxMzU0LDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcXG4gXFx0XFx0ICogYW5kIHVwZGF0ZSBlbGVtZW50IGluIHBsYWNlXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRjb3B5X21hcF92YWx1ZV9sb2NrZWQobWFwLFxcbi1cXHRcXHRcXHRcXHQgICAgICBodGFiX2VsZW1fdmFsdWUobF9vbGQsIGtleV9zaXplKSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKSxcXG4gXFx0XFx0XFx0XFx0ICAgICAgdmFsdWUsIGZhbHNlKTtcXG4gXFx0XFx0cmV0ID0gMDtcXG4gXFx0XFx0Z290byBlcnI7XFxuQEAgLTEyNTIsOSArMTM3MSw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuIFxcdC8qIGFkZCBuZXcgZWxlbWVudCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgc28gdGhhdFxcbiBcXHQgKiBjb25jdXJyZW50IHNlYXJjaCB3aWxsIGZpbmQgaXQgYmVmb3JlIG9sZCBlbGVtXFxuIFxcdCAqL1xcbi1cXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXFx1MDAyNmxfbmV3LVxcdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xcbitcXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXFx1MDAyNmxfbmV3LVxcdTAwM2Vub2RlLmhhc2hfbm9kZSwgaGVhZCk7XFxuIFxcdGlmIChsX29sZCkge1xcbi1cXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsX29sZC1cXHUwMDNlaGFzaF9ub2RlKTtcXG4rXFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bF9vbGQtXFx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcXG4gXFxuIFxcdFxcdC8qIGxfb2xkIGhhcyBhbHJlYWR5IGJlZW4gc3Rhc2hlZCBpbiBodGFiLVxcdTAwM2VleHRyYV9lbGVtcywgY2FuY2VsXFxuIFxcdFxcdCAqIGl0cyByZXVzYWJsZSBzcGVjaWFsIGZpZWxkcyBiZWZvcmUgaXQgaXMgYXZhaWxhYmxlIGZvciByZXVzZS5cXG5AQCAtMTI3NSw3ICsxMzk0LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9scnVfcHVzaF9mcmVlKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqZWxlbSlcXG4ge1xcbiBcXHRjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhodGFiLCBlbGVtKTtcXG4gXFx0YnBmX21hcF9kZWNfZWxlbV9jb3VudChcXHUwMDI2aHRhYi1cXHUwMDNlbWFwKTtcXG4tXFx0YnBmX2xydV9wdXNoX2ZyZWUoXFx1MDAyNmh0YWItXFx1MDAzZWxydSwgXFx1MDAyNmVsZW0tXFx1MDAzZWxydV9ub2RlKTtcXG4rXFx0YnBmX2xydV9wdXNoX2ZyZWUoXFx1MDAyNmh0YWItXFx1MDAzZWxydSwgaHRhYl9lbGVtX2xydV9ub2RlKGVsZW0pKTtcXG4gfVxcbiBcXG4gc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuQEAgLTEzMTAsMTMgKzE0MjksMTMgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWVcXG4gXFx0bF9uZXcgPSBwcmVhbGxvY19scnVfcG9wKGh0YWIsIGtleSwgaGFzaCk7XFxuIFxcdGlmICghbF9uZXcpXFxuIFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbi1cXHRjb3B5X21hcF92YWx1ZShcXHUwMDI2aHRhYi1cXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUobF9uZXcsIG1hcC1cXHUwMDNla2V5X3NpemUpLCB2YWx1ZSk7XFxuK1xcdGNvcHlfbWFwX3ZhbHVlKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksIHZhbHVlKTtcXG4gXFxuIFxcdHJldCA9IGh0YWJfbG9ja19idWNrZXQoYiwgXFx1MDAyNmZsYWdzKTtcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0Z290byBlcnJfbG9ja19idWNrZXQ7XFxuIFxcbi1cXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcXG4rXFx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuIFxcbiBcXHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcXG4gXFx0aWYgKHJldClcXG5AQCAtMTMyNSwxMCArMTQ0NCwxMCBAQCBzdGF0aWMgbG9uZyBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZVxcbiBcXHQvKiBhZGQgbmV3IGVsZW1lbnQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXRcXG4gXFx0ICogY29uY3VycmVudCBzZWFyY2ggd2lsbCBmaW5kIGl0IGJlZm9yZSBvbGQgZWxlbVxcbiBcXHQgKi9cXG4tXFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFxcdTAwMjZsX25ldy1cXHUwMDNlaGFzaF9ub2RlLCBoZWFkKTtcXG4rXFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFxcdTAwMjZsX25ldy1cXHUwMDNlbm9kZS5oYXNoX25vZGUsIGhlYWQpO1xcbiBcXHRpZiAobF9vbGQpIHtcXG4tXFx0XFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXFx1MDAyNmxfbmV3LVxcdTAwM2VscnVfbm9kZSk7XFxuLVxcdFxcdGhsaXN0X251bGxzX2RlbF9yY3UoXFx1MDAyNmxfb2xkLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRcXHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobF9uZXcpKTtcXG4rXFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bF9vbGQtXFx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcXG4gXFx0fVxcbiBcXHRyZXQgPSAwO1xcbiBcXG5AQCAtMTM4Myw3ICsxNTAyLDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxcbiBcXHRpZiAocmV0KVxcbiBcXHRcXHRyZXR1cm4gcmV0O1xcbiBcXG4tXFx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xcbiBcXG4gXFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XFxuIFxcdGlmIChyZXQpXFxuQEAgLTEzOTIsMTAgKzE1MTEsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxcbiBcXHRpZiAobF9vbGQpIHtcXG4gXFx0XFx0LyogVXBkYXRlIHZhbHVlIGluLXBsYWNlICovXFxuIFxcdFxcdGlmIChwZXJjcHUpIHtcXG4tXFx0XFx0XFx0cGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfb2xkLCBrZXlfc2l6ZSksXFxuK1xcdFxcdFxcdHBjcHVfY29weV92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsX29sZCksXFxuIFxcdFxcdFxcdFxcdFxcdHZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7XFxuIFxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHZvaWQgKippbm5lcl9tYXBfcHB0ciA9IGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpO1xcbitcXHRcXHRcXHR2b2lkICoqaW5uZXJfbWFwX3BwdHIgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpO1xcbiBcXG4gXFx0XFx0XFx0b2xkX21hcF9wdHIgPSAqaW5uZXJfbWFwX3BwdHI7XFxuIFxcdFxcdFxcdFdSSVRFX09OQ0UoKmlubmVyX21hcF9wcHRyLCAqKHZvaWQgKiopdmFsdWUpO1xcbkBAIC0xNDA3LDcgKzE1MjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcdFxcdFxcdHJldCA9IFBUUl9FUlIobF9uZXcpO1xcbiBcXHRcXHRcXHRnb3RvIGVycjtcXG4gXFx0XFx0fVxcbi1cXHRcXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXFx1MDAyNmxfbmV3LVxcdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xcbitcXHRcXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXFx1MDAyNmxfbmV3LVxcdTAwM2Vub2RlLmhhc2hfbm9kZSwgaGVhZCk7XFxuIFxcdH1cXG4gZXJyOlxcbiBcXHRodGFiX3VubG9ja19idWNrZXQoYiwgZmxhZ3MpO1xcbkBAIC0xNDU2LDIyICsxNTc1LDIyIEBAIHN0YXRpYyBsb25nIF9faHRhYl9scnVfcGVyY3B1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdGdvdG8gZXJyX2xvY2tfYnVja2V0O1xcbiBcXG4tXFx0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xcbiBcXG4gXFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdGdvdG8gZXJyO1xcbiBcXG4gXFx0aWYgKGxfb2xkKSB7XFxuLVxcdFxcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFxcdTAwMjZsX29sZC1cXHUwMDNlbHJ1X25vZGUpO1xcbitcXHRcXHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobF9vbGQpKTtcXG4gXFxuIFxcdFxcdC8qIHBlci1jcHUgaGFzaCBtYXAgY2FuIHVwZGF0ZSB2YWx1ZSBpbi1wbGFjZSAqL1xcbi1cXHRcXHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIobF9vbGQsIGtleV9zaXplKSxcXG4rXFx0XFx0cGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGxfb2xkKSxcXG4gXFx0XFx0XFx0XFx0dmFsdWUsIG9uYWxsY3B1cywgbWFwX2ZsYWdzKTtcXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0cGNwdV9pbml0X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSksXFxuK1xcdFxcdHBjcHVfaW5pdF92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsX25ldyksXFxuIFxcdFxcdFxcdFxcdHZhbHVlLCBvbmFsbGNwdXMsIG1hcF9mbGFncyk7XFxuLVxcdFxcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcXHUwMDI2bF9uZXctXFx1MDAzZWhhc2hfbm9kZSwgaGVhZCk7XFxuK1xcdFxcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcXHUwMDI2bF9uZXctXFx1MDAzZW5vZGUuaGFzaF9ub2RlLCBoZWFkKTtcXG4gXFx0XFx0bF9uZXcgPSBOVUxMO1xcbiBcXHR9XFxuIFxcdHJldCA9IDA7XFxuQEAgLTE0ODAsNyArMTU5OSw3IEBAIHN0YXRpYyBsb25nIF9faHRhYl9scnVfcGVyY3B1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIGVycl9sb2NrX2J1Y2tldDpcXG4gXFx0aWYgKGxfbmV3KSB7XFxuIFxcdFxcdGJwZl9tYXBfZGVjX2VsZW1fY291bnQoXFx1MDAyNmh0YWItXFx1MDAzZW1hcCk7XFxuLVxcdFxcdGJwZl9scnVfcHVzaF9mcmVlKFxcdTAwMjZodGFiLVxcdTAwM2VscnUsIFxcdTAwMjZsX25ldy1cXHUwMDNlbHJ1X25vZGUpO1xcbitcXHRcXHRicGZfbHJ1X3B1c2hfZnJlZShcXHUwMDI2aHRhYi1cXHUwMDNlbHJ1LCBodGFiX2VsZW1fbHJ1X25vZGUobF9uZXcpKTtcXG4gXFx0fVxcbiBcXHRyZXR1cm4gcmV0O1xcbiB9XFxuQEAgLTE1MjEsOSArMTY0MCw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuLVxcdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGwgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuIFxcdGlmIChsKVxcbi1cXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2Vub2RlLmhhc2hfbm9kZSk7XFxuIFxcdGVsc2VcXG4gXFx0XFx0cmV0ID0gLUVOT0VOVDtcXG4gXFxuQEAgLTE1NTYsMTAgKzE2NzUsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gXFx0aWYgKHJldClcXG4gXFx0XFx0cmV0dXJuIHJldDtcXG4gXFxuLVxcdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuK1xcdGwgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XFxuIFxcbiBcXHRpZiAobClcXG4tXFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bC1cXHUwMDNlaGFzaF9ub2RlKTtcXG4rXFx0XFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcXHUwMDI2bC1cXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xcbiBcXHRlbHNlXFxuIFxcdFxcdHJldCA9IC1FTk9FTlQ7XFxuIFxcbkBAIC0xNTgxLDggKzE3MDAsOCBAQCBzdGF0aWMgdm9pZCBkZWxldGVfYWxsX2VsZW1lbnRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4gXFx0XFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47XFxuIFxcdFxcdHN0cnVjdCBodGFiX2VsZW0gKmw7XFxuIFxcbi1cXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xcbi1cXHRcXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XFxuK1xcdFxcdFxcdGhsaXN0X251bGxzX2RlbF9yY3UoXFx1MDAyNmwtXFx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcXG4gXFx0XFx0XFx0aHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7XFxuIFxcdFxcdH1cXG4gXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuQEAgLTE1OTksMTAgKzE3MTgsMTAgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX21hbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxcbiBcXHRcXHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcXG4gXFx0XFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFxuLVxcdFxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xcbiBcXHRcXHRcXHQvKiBXZSBvbmx5IGZyZWUgaW50ZXJuYWwgc3RydWN0cyBvbiB1cmVmIGRyb3BwaW5nIHRvIHplcm8gKi9cXG4gXFx0XFx0XFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoXFx1MDAyNmh0YWItXFx1MDAzZW1hcCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGwsIGh0YWItXFx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCkpO1xcbiBcXHRcXHR9XFxuIFxcdFxcdGNvbmRfcmVzY2hlZF9yY3UoKTtcXG4gXFx0fVxcbkBAIC0xNjk3LDcgKzE4MTYsNyBAQCBzdGF0aWMgaW50IF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcdGlmIChyZXQpXFxuIFxcdFxcdHJldHVybiByZXQ7XFxuIFxcbi1cXHRsID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xcbitcXHRsID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xcbiBcXHRpZiAoIWwpIHtcXG4gXFx0XFx0cmV0ID0gLUVOT0VOVDtcXG4gXFx0XFx0Z290byBvdXRfdW5sb2NrO1xcbkBAIC0xNzA4LDE0ICsxODI3LDE0IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcXG4gXFx0XFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcXG4gXFx0XFx0aW50IG9mZiA9IDAsIGNwdTtcXG4gXFxuLVxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBrZXlfc2l6ZSk7XFxuK1xcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcXG4gXFx0XFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xcbiBcXHRcXHRcXHRjb3B5X21hcF92YWx1ZV9sb25nKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIHZhbHVlICsgb2ZmLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcXG4gXFx0XFx0XFx0Y2hlY2tfYW5kX2luaXRfbWFwX3ZhbHVlKFxcdTAwMjZodGFiLVxcdTAwM2VtYXAsIHZhbHVlICsgb2ZmKTtcXG4gXFx0XFx0XFx0b2ZmICs9IHJvdW5kdXBfdmFsdWVfc2l6ZTtcXG4gXFx0XFx0fVxcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHR2b2lkICpzcmMgPSBodGFiX2VsZW1fdmFsdWUobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdFxcdHZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcXG4gXFxuIFxcdFxcdGlmIChmbGFncyBcXHUwMDI2IEJQRl9GX0xPQ0spXFxuIFxcdFxcdFxcdGNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsIHZhbHVlLCBzcmMsIHRydWUpO1xcbkBAIC0xNzI0LDcgKzE4NDMsNyBAQCBzdGF0aWMgaW50IF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcdFxcdC8qIFplcm9pbmcgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIHRlbXAgYnVmZmVyICovXFxuIFxcdFxcdGNoZWNrX2FuZF9pbml0X21hcF92YWx1ZShtYXAsIHZhbHVlKTtcXG4gXFx0fVxcbi1cXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2Vub2RlLmhhc2hfbm9kZSk7XFxuIFxcbiBvdXRfdW5sb2NrOlxcbiBcXHRodGFiX3VubG9ja19idWNrZXQoYiwgYmZsYWdzKTtcXG5AQCAtMTg2MCw3ICsxOTc5LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHR9XFxuIFxcbiBcXHRidWNrZXRfY250ID0gMDtcXG4tXFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIGhhc2hfbm9kZSlcXG4rXFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxcbiBcXHRcXHRidWNrZXRfY250Kys7XFxuIFxcbiBcXHRpZiAoYnVja2V0X2NudCBcXHUwMDI2XFx1MDAyNiAhbG9ja2VkKSB7XFxuQEAgLTE4OTcsMTQgKzIwMTYsMTQgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRpZiAoIWxvY2tlZClcXG4gXFx0XFx0Z290byBuZXh0X2JhdGNoO1xcbiBcXG4tXFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBoYXNoX25vZGUpIHtcXG4tXFx0XFx0bWVtY3B5KGRzdF9rZXksIGwtXFx1MDAzZWtleSwga2V5X3NpemUpO1xcbitcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XFxuK1xcdFxcdG1lbWNweShkc3Rfa2V5LCBodGFiX2VsZW1fa2V5KGh0YWIsIGwpLCBrZXlfc2l6ZSk7XFxuIFxcbiBcXHRcXHRpZiAoaXNfcGVyY3B1KSB7XFxuIFxcdFxcdFxcdGludCBvZmYgPSAwLCBjcHU7XFxuIFxcdFxcdFxcdHZvaWQgX19wZXJjcHUgKnBwdHI7XFxuIFxcbi1cXHRcXHRcXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdFxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcXG4gXFx0XFx0XFx0aWYgKGVsZW1fbWFwX2ZsYWdzIFxcdTAwMjYgQlBGX0ZfQ1BVKSB7XFxuIFxcdFxcdFxcdFxcdGNwdSA9IGVsZW1fbWFwX2ZsYWdzIFxcdTAwM2VcXHUwMDNlIDMyO1xcbiBcXHRcXHRcXHRcXHRjb3B5X21hcF92YWx1ZShcXHUwMDI2aHRhYi1cXHUwMDNlbWFwLCBkc3RfdmFsLCBwZXJfY3B1X3B0cihwcHRyLCBjcHUpKTtcXG5AQCAtMTkxOCw3ICsyMDM3LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0dmFsdWUgPSBodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpO1xcbitcXHRcXHRcXHR2YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcXG4gXFx0XFx0XFx0aWYgKGlzX2ZkX2h0YWIoaHRhYikpIHtcXG4gXFx0XFx0XFx0XFx0c3RydWN0IGJwZl9tYXAgKippbm5lcl9tYXAgPSB2YWx1ZTtcXG4gXFxuQEAgLTE5MzYsNyArMjA1NSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcXG4gXFx0XFx0XFx0Y2hlY2tfYW5kX2luaXRfbWFwX3ZhbHVlKG1hcCwgZHN0X3ZhbCk7XFxuIFxcdFxcdH1cXG4gXFx0XFx0aWYgKGRvX2RlbGV0ZSkge1xcbi1cXHRcXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2VoYXNoX25vZGUpO1xcbitcXHRcXHRcXHRobGlzdF9udWxsc19kZWxfcmN1KFxcdTAwMjZsLVxcdTAwM2Vub2RlLmhhc2hfbm9kZSk7XFxuIFxcbiBcXHRcXHRcXHQvKiBicGZfbHJ1X3B1c2hfZnJlZSgpIHdpbGwgYWNxdWlyZSBscnVfbG9jaywgd2hpY2hcXG4gXFx0XFx0XFx0ICogbWF5IGNhdXNlIGRlYWRsb2NrLiBTZWUgY29tbWVudHMgaW4gZnVuY3Rpb25cXG5AQCAtMTk0OCw3ICsyMDY3LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHQgKiBsb2NrIGJlaW5nIGhlbGQgYW5kIGl0IHZpb2xhdGVzIHRoZSBsb2NrIHJ1bGUsIHNvXFxuIFxcdFxcdFxcdCAqIGludm9rZSBmcmVlX2h0YWJfZWxlbSgpIGFmdGVyIHVubG9jayBhcyB3ZWxsLlxcbiBcXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0bC1cXHUwMDNlYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7XFxuK1xcdFxcdFxcdGwtXFx1MDAzZW5vZGUuYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7XFxuIFxcdFxcdFxcdG5vZGVfdG9fZnJlZSA9IGw7XFxuIFxcdFxcdH1cXG4gXFx0XFx0ZHN0X2tleSArPSBrZXlfc2l6ZTtcXG5AQCAtMTk2MCw3ICsyMDc5LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXG4gXFx0d2hpbGUgKG5vZGVfdG9fZnJlZSkge1xcbiBcXHRcXHRsID0gbm9kZV90b19mcmVlO1xcbi1cXHRcXHRub2RlX3RvX2ZyZWUgPSBub2RlX3RvX2ZyZWUtXFx1MDAzZWJhdGNoX2ZsaW5rO1xcbitcXHRcXHRub2RlX3RvX2ZyZWUgPSBub2RlX3RvX2ZyZWUtXFx1MDAzZW5vZGUuYmF0Y2hfZmxpbms7XFxuIFxcdFxcdGlmIChpc19scnVfbWFwKVxcbiBcXHRcXHRcXHRodGFiX2xydV9wdXNoX2ZyZWUoaHRhYiwgbCk7XFxuIFxcdFxcdGVsc2VcXG5AQCAtMjEwOCw4ICsyMjI3LDggQEAgYnBmX2hhc2hfbWFwX3NlcV9maW5kX25leHQoc3RydWN0IGJwZl9pdGVyX3NlcV9oYXNoX21hcF9pbmZvICppbmZvLFxcbiBcXHRcXHQvKiBubyB1cGRhdGUvZGVsZXRpb24gb24gdGhpcyBidWNrZXQsIHByZXZfZWxlbSBzaG91bGQgYmUgc3RpbGwgdmFsaWRcXG4gXFx0XFx0ICogYW5kIHdlIHdvbid0IHNraXAgZWxlbWVudHMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRuID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcXHUwMDI2cHJldl9lbGVtLVxcdTAwM2VoYXNoX25vZGUpKTtcXG4tXFx0XFx0ZWxlbSA9IGhsaXN0X251bGxzX2VudHJ5X3NhZmUobiwgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcXG4rXFx0XFx0biA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXFx1MDAyNnByZXZfZWxlbS1cXHUwMDNlbm9kZS5oYXNoX25vZGUpKTtcXG4rXFx0XFx0ZWxlbSA9IGhsaXN0X251bGxzX2VudHJ5X3NhZmUobiwgc3RydWN0IGh0YWJfZWxlbSwgbm9kZS5oYXNoX25vZGUpO1xcbiBcXHRcXHRpZiAoZWxlbSlcXG4gXFx0XFx0XFx0cmV0dXJuIGVsZW07XFxuIFxcbkBAIC0yMTI1LDcgKzIyNDQsNyBAQCBicGZfaGFzaF9tYXBfc2VxX2ZpbmRfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2hhc2hfbWFwX2luZm8gKmluZm8sXFxuIFxcbiBcXHRcXHRjb3VudCA9IDA7XFxuIFxcdFxcdGhlYWQgPSBcXHUwMDI2Yi1cXHUwMDNlaGVhZDtcXG4tXFx0XFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGVsZW0sIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoZWxlbSwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcXG4gXFx0XFx0XFx0aWYgKGNvdW50IFxcdTAwM2U9IHNraXBfZWxlbXMpIHtcXG4gXFx0XFx0XFx0XFx0aW5mby1cXHUwMDNlYnVja2V0X2lkID0gaTtcXG4gXFx0XFx0XFx0XFx0aW5mby1cXHUwMDNlc2tpcF9lbGVtcyA9IGNvdW50O1xcbkBAIC0yMTgzLDEyICsyMzAyLDEyIEBAIHN0YXRpYyBpbnQgX19icGZfaGFzaF9tYXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pXFxuIFxcdFxcdGN0eC5tZXRhID0gXFx1MDAyNm1ldGE7XFxuIFxcdFxcdGN0eC5tYXAgPSBpbmZvLVxcdTAwM2VtYXA7XFxuIFxcdFxcdGlmIChlbGVtKSB7XFxuLVxcdFxcdFxcdGN0eC5rZXkgPSBlbGVtLVxcdTAwM2VrZXk7XFxuK1xcdFxcdFxcdGN0eC5rZXkgPSBodGFiX2VsZW1fa2V5KGluZm8tXFx1MDAzZWh0YWIsIGVsZW0pO1xcbiBcXHRcXHRcXHRpZiAoIWluZm8tXFx1MDAzZXBlcmNwdV92YWx1ZV9idWYpIHtcXG4tXFx0XFx0XFx0XFx0Y3R4LnZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIG1hcC1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRcXHRjdHgudmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoaW5mby1cXHUwMDNlaHRhYiwgZWxlbSk7XFxuIFxcdFxcdFxcdH0gZWxzZSB7XFxuIFxcdFxcdFxcdFxcdHJvdW5kdXBfdmFsdWVfc2l6ZSA9IHJvdW5kX3VwKG1hcC1cXHUwMDNldmFsdWVfc2l6ZSwgOCk7XFxuLVxcdFxcdFxcdFxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBtYXAtXFx1MDAzZWtleV9zaXplKTtcXG4rXFx0XFx0XFx0XFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGluZm8tXFx1MDAzZWh0YWIsIGVsZW0pO1xcbiBcXHRcXHRcXHRcXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XFxuIFxcdFxcdFxcdFxcdFxcdGNvcHlfbWFwX3ZhbHVlX2xvbmcobWFwLCBpbmZvLVxcdTAwM2VwZXJjcHVfdmFsdWVfYnVmICsgb2ZmLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7XFxuQEAgLTIyOTIsMTQgKzI0MTEsMTQgQEAgc3RhdGljIGxvbmcgYnBmX2Zvcl9lYWNoX2hhc2hfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCBicGZfY2FsbGJhY2tfdCBjYWxsYmFja19cXG4gXFx0XFx0YiA9IFxcdTAwMjZodGFiLVxcdTAwM2VidWNrZXRzW2ldO1xcbiBcXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuIFxcdFxcdGhlYWQgPSBcXHUwMDI2Yi1cXHUwMDNlaGVhZDtcXG4tXFx0XFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShlbGVtLCBuLCBoZWFkLCBoYXNoX25vZGUpIHtcXG4tXFx0XFx0XFx0a2V5ID0gZWxlbS1cXHUwMDNla2V5O1xcbitcXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGVsZW0sIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XFxuK1xcdFxcdFxcdGtleSA9IGh0YWJfZWxlbV9rZXkoaHRhYiwgZWxlbSk7XFxuIFxcdFxcdFxcdGlmIChpc19wZXJjcHUpIHtcXG4gXFx0XFx0XFx0XFx0LyogY3VycmVudCBjcHUgdmFsdWUgZm9yIHBlcmNwdSBtYXAgKi9cXG4tXFx0XFx0XFx0XFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGVsZW0sIG1hcC1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRcXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZWxlbSk7XFxuIFxcdFxcdFxcdFxcdHZhbCA9IHRoaXNfY3B1X3B0cihwcHRyKTtcXG4gXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0dmFsID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIG1hcC1cXHUwMDNla2V5X3NpemUpO1xcbitcXHRcXHRcXHRcXHR2YWwgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSk7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0bnVtX2VsZW1zKys7XFxuIFxcdFxcdFxcdHJldCA9IGNhbGxiYWNrX2ZuKCh1NjQpKGxvbmcpbWFwLCAodTY0KShsb25nKWtleSxcXG5AQCAtMjQwMywxMCArMjUyMiwxMSBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9scnVfbWFwX29wcyA9IHtcXG4gLyogQ2FsbGVkIGZyb20gZUJQRiBwcm9ncmFtICovXFxuIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xcbiBcXG4gXFx0aWYgKGwpXFxuLVxcdFxcdHJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSkpO1xcbitcXHRcXHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpKTtcXG4gXFx0ZWxzZVxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG4gfVxcbkBAIC0yNDE0LDYgKzI1MzQsNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9wZXJjcHVfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcXG4gLyogaW5saW5lIGJwZl9tYXBfbG9va3VwX2VsZW0oKSBjYWxsIGZvciBwZXItQ1BVIGhhc2htYXAgKi9cXG4gc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XFxuIFxcbiBcXHRpZiAoIWJwZl9qaXRfc3VwcG9ydHNfcGVyY3B1X2luc24oKSlcXG5AQCAtMjQyNCw3ICsyNTQ1LDcgQEAgc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25cXG4gXFx0Kmluc24rKyA9IEJQRl9FTUlUX0NBTEwoX19odGFiX21hcF9sb29rdXBfZWxlbSk7XFxuIFxcdCppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDMpO1xcbiBcXHQqaW5zbisrID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsXFxuLVxcdFxcdFxcdFxcdG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGtleSkgKyByb3VuZHVwKG1hcC1cXHUwMDNla2V5X3NpemUsIDgpKTtcXG4rXFx0XFx0XFx0XFx0aHRhYi1cXHUwMDNla2V5X29mZnNldCArIHJvdW5kdXAobWFwLVxcdTAwM2VrZXlfc2l6ZSwgOCkpO1xcbiBcXHQqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfMCwgMCk7XFxuIFxcdCppbnNuKysgPSBCUEZfTU9WNjRfUEVSQ1BVX1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMCk7XFxuIFxcbkBAIC0yNDMzLDYgKzI1NTQsNyBAQCBzdGF0aWMgaW50IGh0YWJfcGVyY3B1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zblxcbiBcXG4gc3RhdGljIHZvaWQgKmh0YWJfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB1MzIgY3B1KVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFxuIFxcdGlmIChjcHUgXFx1MDAzZT0gbnJfY3B1X2lkcylcXG5AQCAtMjQ0MCwxOCArMjU2MiwxOSBAQCBzdGF0aWMgdm9pZCAqaHRhYl9wZXJjcHVfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcbiBcXHRsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7XFxuIFxcdGlmIChsKVxcbi1cXHRcXHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSksIGNwdSk7XFxuK1xcdFxcdHJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKSwgY3B1KTtcXG4gXFx0ZWxzZVxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xcbiBcXG4gXFx0aWYgKGwpIHtcXG4tXFx0XFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXFx1MDAyNmwtXFx1MDAzZWxydV9ub2RlKTtcXG4tXFx0XFx0cmV0dXJuIHRoaXNfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXFx1MDAzZWtleV9zaXplKSk7XFxuK1xcdFxcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsKSk7XFxuK1xcdFxcdHJldHVybiB0aGlzX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCkpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMjQ1OSw2ICsyNTgyLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxcbiBcXG4gc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdTMyIGNwdSlcXG4ge1xcbitcXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XFxuIFxcdHN0cnVjdCBodGFiX2VsZW0gKmw7XFxuIFxcbiBcXHRpZiAoY3B1IFxcdTAwM2U9IG5yX2NwdV9pZHMpXFxuQEAgLTI0NjYsOCArMjU5MCw4IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9wZXJjcHVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprXFxuIFxcbiBcXHRsID0gX19odGFiX21hcF9sb29rdXBfZWxlbShtYXAsIGtleSk7XFxuIFxcdGlmIChsKSB7XFxuLVxcdFxcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFxcdTAwMjZsLVxcdTAwM2VscnVfbm9kZSk7XFxuLVxcdFxcdHJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXFx1MDAzZWtleV9zaXplKSwgY3B1KTtcXG4rXFx0XFx0YnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTtcXG4rXFx0XFx0cmV0dXJuIHBlcl9jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpLCBjcHUpO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMjQ3NSw2ICsyNTk5LDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtcXG4gXFxuIGludCBicGZfcGVyY3B1X2hhc2hfY29weShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLCB1NjQgbWFwX2ZsYWdzKVxcbiB7XFxuK1xcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcXG4gXFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcXG4gXFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcXG4gXFx0aW50IHJldCA9IC1FTk9FTlQ7XFxuQEAgLTI0OTQsNyArMjYxOSw3IEBAIGludCBicGZfcGVyY3B1X2hhc2hfY29weShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLCB1NjQgbWFwX2ZsXFxuIFxcdC8qIFdlIGRvIG5vdCBtYXJrIExSVSBtYXAgZWxlbWVudCBoZXJlIGluIG9yZGVyIHRvIG5vdCBtZXNzIHVwXFxuIFxcdCAqIGV2aWN0aW9uIGhldXJpc3RpY3Mgd2hlbiB1c2VyIHNwYWNlIGRvZXMgYSBtYXAgd2Fsay5cXG4gXFx0ICovXFxuLVxcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXFx1MDAzZWtleV9zaXplKTtcXG4rXFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xcbiBcXHRpZiAobWFwX2ZsYWdzIFxcdTAwMjYgQlBGX0ZfQ1BVKSB7XFxuIFxcdFxcdGNwdSA9IG1hcF9mbGFncyBcXHUwMDNlXFx1MDAzZSAzMjtcXG4gXFx0XFx0Y29weV9tYXBfdmFsdWUobWFwLCB2YWx1ZSwgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7XFxuQEAgLTI1MzIsNiArMjY1Nyw3IEBAIGludCBicGZfcGVyY3B1X2hhc2hfdXBkYXRlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXFxuIHN0YXRpYyB2b2lkIGh0YWJfcGVyY3B1X21hcF9zZXFfc2hvd19lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcXG4gXFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pXFxuIHtcXG4rXFx0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xcbiBcXHRzdHJ1Y3QgaHRhYl9lbGVtICpsO1xcbiBcXHR2b2lkIF9fcGVyY3B1ICpwcHRyO1xcbiBcXHRpbnQgY3B1O1xcbkBAIC0yNTQ2LDcgKzI2NzIsNyBAQCBzdGF0aWMgdm9pZCBodGFiX3BlcmNwdV9tYXBfc2VxX3Nob3dfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXFxuIFxcbiBcXHRidGZfdHlwZV9zZXFfc2hvdyhtYXAtXFx1MDAzZWJ0ZiwgbWFwLVxcdTAwM2VidGZfa2V5X3R5cGVfaWQsIGtleSwgbSk7XFxuIFxcdHNlcV9wdXRzKG0sIFxcXCI6IHtcXFxcblxcXCIpO1xcbi1cXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVxcdTAwM2VrZXlfc2l6ZSk7XFxuK1xcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcXG4gXFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkge1xcbiBcXHRcXHRzZXFfcHJpbnRmKG0sIFxcXCJcXFxcdGNwdSVkOiBcXFwiLCBjcHUpO1xcbiBcXHRcXHRidGZfdHlwZV9zZXFfc2hvdyhtYXAtXFx1MDAzZWJ0ZiwgbWFwLVxcdTAwM2VidGZfdmFsdWVfdHlwZV9pZCxcXG5AQCAtMjYxOSw4ICsyNzQ1LDggQEAgc3RhdGljIHZvaWQgZmRfaHRhYl9tYXBfZnJlZShzdHJ1Y3QgYnBmX21hcCAqbWFwKVxcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgaHRhYi1cXHUwMDNlbl9idWNrZXRzOyBpKyspIHtcXG4gXFx0XFx0aGVhZCA9IHNlbGVjdF9idWNrZXQoaHRhYiwgaSk7XFxuIFxcbi1cXHRcXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xcbi1cXHRcXHRcXHR2b2lkICpwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7XFxuK1xcdFxcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcXG4rXFx0XFx0XFx0dm9pZCAqcHRyID0gZmRfaHRhYl9tYXBfZ2V0X3B0cihodGFiLCBsKTtcXG4gXFxuIFxcdFxcdFxcdG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZmRfcHV0X3B0cihtYXAsIHB0ciwgZmFsc2UpO1xcbiBcXHRcXHR9XFxuQEAgLTI3MDUsNiArMjgzMSw3IEBAIHN0YXRpYyB2b2lkICpodGFiX29mX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXFxuIHN0YXRpYyBpbnQgaHRhYl9vZl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHRcXHRcXHRcXHQgIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXFxuIHtcXG4rXFx0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xcbiBcXHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjtcXG4gXFx0Y29uc3QgaW50IHJldCA9IEJQRl9SRUdfMDtcXG4gXFxuQEAgLTI3MTMsNyArMjg0MCw3IEBAIHN0YXRpYyBpbnQgaHRhYl9vZl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxcbiBcXHQqaW5zbisrID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTtcXG4gXFx0Kmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIHJldCwgMCwgMik7XFxuIFxcdCppbnNuKysgPSBCUEZfQUxVNjRfSU1NKEJQRl9BREQsIHJldCxcXG4tXFx0XFx0XFx0XFx0b2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwga2V5KSArXFxuK1xcdFxcdFxcdFxcdGh0YWItXFx1MDAzZWtleV9vZmZzZXQgK1xcbiBcXHRcXHRcXHRcXHRyb3VuZF91cChtYXAtXFx1MDAzZWtleV9zaXplLCA4KSk7XFxuIFxcdCppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRFcsIHJldCwgcmV0LCAwKTtcXG4gXFxuQEAgLTMxMTIsNyArMzIzOSw3IEBAIHN0YXRpYyBpbnQgcmh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuIHtcXG4gXFx0c3RydWN0IGJwZl9yaHRhYiAqcmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX3JodGFiLCBtYXApO1xcbiBcXG4tXFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFxcdTAwMjZyaHRhYi1cXHUwMDNlbWEsIHJodGFiX21lbV9kdG9yKTtcXG4rXFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFxcdTAwMjZyaHRhYi1cXHUwMDNlbWEsIHJodGFiX21lbV9kdG9yLCBvZmZzZXRvZihzdHJ1Y3Qgcmh0YWJfZWxlbSwgZGF0YSkpO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCByaHRhYl9tYXBfZnJlZV9pbnRlcm5hbF9zdHJ1Y3RzKHN0cnVjdCBicGZfbWFwICptYXApXFxuQEAgLTM1MzMsMyArMzY2MCwxNiBAQCBjb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgcmh0YWJfbWFwX29wcyA9IHtcXG4gXFx0Lm1hcF9idGZfaWQgPSBcXHUwMDI2cmh0YWJfbWFwX2J0Zl9pZHNbMF0sXFxuIFxcdC5pdGVyX3NlcV9pbmZvID0gXFx1MDAyNnJoYXNoX2l0ZXJfc2VxX2luZm8sXFxuIH07XFxuK1xcbitzaXplX3QgYnBmX2h0YWJfbWFwX21ldGFfc2l6ZSh2b2lkKVxcbit7XFxuK1xcdHJldHVybiBzaXplb2Yoc3RydWN0IGJwZl9odGFiKTtcXG4rfVxcbitcXG4rdm9pZCBicGZfaHRhYl9tYXBfbWV0YV9pbml0KHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2h0YWIgKmlubmVyX2h0YWJfbWV0YSA9IGNvbnRhaW5lcl9vZihpbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xcbitcXHRzdHJ1Y3QgYnBmX2h0YWIgKmlubmVyX2h0YWIgPSBjb250YWluZXJfb2YoaW5uZXJfbWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XFxuK1xcbitcXHRpbm5lcl9odGFiX21ldGEtXFx1MDAzZWtleV9vZmZzZXQgPSBpbm5lcl9odGFiLVxcdTAwM2VrZXlfb2Zmc2V0O1xcbit9XFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5jIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcXG5pbmRleCBkMmNiYWI0YmRmNjQ0Li5iMmRiNWQwYzk4YmVlIDEwMDY0NFxcbi0tLSBhL2tlcm5lbC9icGYvbWFwX2luX21hcC5jXFxuKysrIGIva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcXG5AQCAtNyw2ICs3LDE1IEBAXFxuIFxcbiAjaW5jbHVkZSBcXFwibWFwX2luX21hcC5oXFxcIlxcbiBcXG4rc3RhdGljIGJvb2wgYnBmX21hcF90eXBlX2lzX2h0YWIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSlcXG4re1xcbitcXHRyZXR1cm4gdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSCB8fFxcbitcXHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0ggfHxcXG4rXFx0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0xSVV9IQVNIIHx8XFxuK1xcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9MUlVfUEVSQ1BVX0hBU0ggfHxcXG4rXFx0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUztcXG4rfVxcbitcXG4gc3RydWN0IGJwZl9tYXAgKmJwZl9tYXBfbWV0YV9hbGxvYyhpbnQgaW5uZXJfbWFwX3VmZClcXG4ge1xcbiBcXHRzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwLCAqaW5uZXJfbWFwX21ldGE7XFxuQEAgLTI5LDYgKzM4LDggQEAgc3RydWN0IGJwZl9tYXAgKmJwZl9tYXBfbWV0YV9hbGxvYyhpbnQgaW5uZXJfbWFwX3VmZClcXG4gXFx0LyogSW4gc29tZSBjYXNlcyB2ZXJpZmllciBuZWVkcyB0byBhY2Nlc3MgYmV5b25kIGp1c3QgYmFzZSBtYXAuICovXFxuIFxcdGlmIChpbm5lcl9tYXAtXFx1MDAzZW9wcyA9PSBcXHUwMDI2YXJyYXlfbWFwX29wcyB8fCBpbm5lcl9tYXAtXFx1MDAzZW9wcyA9PSBcXHUwMDI2cGVyY3B1X2FycmF5X21hcF9vcHMpXFxuIFxcdFxcdGlubmVyX21hcF9tZXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGJwZl9hcnJheSk7XFxuK1xcdGVsc2UgaWYgKGJwZl9tYXBfdHlwZV9pc19odGFiKGlubmVyX21hcC1cXHUwMDNlbWFwX3R5cGUpKVxcbitcXHRcXHRpbm5lcl9tYXBfbWV0YV9zaXplID0gYnBmX2h0YWJfbWFwX21ldGFfc2l6ZSgpO1xcbiBcXG4gXFx0aW5uZXJfbWFwX21ldGEgPSBremFsbG9jKGlubmVyX21hcF9tZXRhX3NpemUsIEdGUF9VU0VSKTtcXG4gXFx0aWYgKCFpbm5lcl9tYXBfbWV0YSlcXG5AQCAtNzAsNiArODEsOCBAQCBzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKVxcbiBcXHRcXHRpbm5lcl9hcnJheV9tZXRhLVxcdTAwM2VpbmRleF9tYXNrID0gaW5uZXJfYXJyYXktXFx1MDAzZWluZGV4X21hc2s7XFxuIFxcdFxcdGlubmVyX2FycmF5X21ldGEtXFx1MDAzZWVsZW1fc2l6ZSA9IGlubmVyX2FycmF5LVxcdTAwM2VlbGVtX3NpemU7XFxuIFxcdFxcdGlubmVyX21hcF9tZXRhLVxcdTAwM2VieXBhc3Nfc3BlY192MSA9IGlubmVyX21hcC1cXHUwMDNlYnlwYXNzX3NwZWNfdjE7XFxuK1xcdH0gZWxzZSBpZiAoYnBmX21hcF90eXBlX2lzX2h0YWIoaW5uZXJfbWFwLVxcdTAwM2VtYXBfdHlwZSkpIHtcXG4rXFx0XFx0YnBmX2h0YWJfbWFwX21ldGFfaW5pdChpbm5lcl9tYXBfbWV0YSwgaW5uZXJfbWFwKTtcXG4gXFx0fVxcbiBcXHRyZXR1cm4gaW5uZXJfbWFwX21ldGE7XFxuIH1cXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmggYi9rZXJuZWwvYnBmL21hcF9pbl9tYXAuaFxcbmluZGV4IDdkNjE2MDIzNTRkZTguLjFlZGMyMDU3NzJkOGMgMTAwNjQ0XFxuLS0tIGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmhcXG4rKysgYi9rZXJuZWwvYnBmL21hcF9pbl9tYXAuaFxcbkBAIC0xNSw1ICsxNSw3IEBAIHZvaWQgKmJwZl9tYXBfZmRfZ2V0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgZmlsZSAqbWFwX2ZpbGUsXFxuIFxcdFxcdFxcdCBpbnQgdWZkKTtcXG4gdm9pZCBicGZfbWFwX2ZkX3B1dF9wdHIoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqcHRyLCBib29sIG5lZWRfZGVmZXIpO1xcbiB1MzIgYnBmX21hcF9mZF9zeXNfbG9va3VwX2VsZW0odm9pZCAqcHRyKTtcXG4rc2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZCk7XFxuK3ZvaWQgYnBmX2h0YWJfbWFwX21ldGFfaW5pdChzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwX21ldGEsIHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXApO1xcbiBcXG4gI2VuZGlmXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tYXBfcHRyX2tlcm4uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tYXBfcHRyX2tlcm4uY1xcbmluZGV4IDM3M2M4ZDE3ZWE1NTcuLjZiZDRjYjY4YzIwYzEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jXFxuQEAgLTExNCw3ICsxMTQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBjaGVja19oYXNoKHZvaWQpXFxuIFxcdFZFUklGWShjaGVja19kZWZhdWx0X25vaW5saW5lKFxcdTAwMjZoYXNoLVxcdTAwM2VtYXAsIG1hcCkpO1xcbiBcXG4gXFx0VkVSSUZZKGhhc2gtXFx1MDAzZW5fYnVja2V0cyA9PSBNQVhfRU5UUklFUyk7XFxuLVxcdFZFUklGWShoYXNoLVxcdTAwM2VlbGVtX3NpemUgPT0gNjQpO1xcbitcXHRWRVJJRlkoaGFzaC1cXHUwMDNlZWxlbV9zaXplID09IDMyKTtcXG4gXFxuIFxcdFZFUklGWShoYXNoLVxcdTAwM2Vjb3VudC5jb3VudGVyID09IDApO1xcbiBcXHRWRVJJRlkoYnBmX21hcF9zdW1fZWxlbV9jb3VudChtYXApID09IDApO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjoyNC4zNzM0MTkxOTVaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjo0MzQ2ODg4MDk5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImh0YWJfbWFwX2FsbG9jXCIsXG4gICAgXCJodGFiX21hcF91cGRhdGVfZWxlbVwiLFxuICAgIFwiaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtXCIsXG4gICAgXCJodGFiX21hcF9sb29rdXBfZWxlbVwiLFxuICAgIFwiaHRhYl9tYXBfZGVsZXRlX2VsZW1cIixcbiAgICBcImJwZl9tYXBfbWV0YV9hbGxvY1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9wdGltaXplcyB0aGUgbWVtb3J5IGxheW91dCBvZiBCUEYgaGFzaCBtYXAgZWxlbWVudHMgYnkgY29uZGl0aW9uYWxseSBvbWl0dGluZyB0aGUgaGFzaCB2YWx1ZSBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBUaGlzIGFmZmVjdHMgY29yZSBCUEYgaGFzaCBtYXAgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24uIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBtZW1vcnkgbGF5b3V0IGFuZCB0aGF0IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIG9jY3VyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA2NDU0YTExYzAzZGZhZWRiNGIwOWY4NTc1YWY4ZDAzNjM5ZmI1MjczXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBBdWcgNSAyMjo1MjoyMiAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGFzaHRhYi5jIGIva2VybmVsL2JwZi9oYXNodGFiLmNcbmluZGV4IDlmMzk0ZTFhYTJlODUuLjk5NjcyNjhkNDUzZDAgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL2hhc2h0YWIuY1xuKysrIGIva2VybmVsL2JwZi9oYXNodGFiLmNcbkBAIC0xMDAsMTMgKzEwMCwxNiBAQCBzdHJ1Y3QgYnBmX2h0YWIge1xuIFx0c3RydWN0IHBlcmNwdV9jb3VudGVyIHBjb3VudDtcbiBcdGF0b21pY190IGNvdW50O1xuIFx0Ym9vbCB1c2VfcGVyY3B1X2NvdW50ZXI7XG4rXHRib29sIGhhc19oYXNoO1xuIFx0dTMyIG5fYnVja2V0cztcdC8qIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgKi9cbiBcdHUzMiBlbGVtX3NpemU7XHQvKiBzaXplIG9mIGVhY2ggZWxlbWVudCBpbiBieXRlcyAqL1xuK1x0dTMyIGtleV9vZmZzZXQ7XHQvKiBvZmZzZXQgb2Yga2V5IGluIGJ5dGVzICovXG4gXHR1MzIgaGFzaHJuZDtcbiB9O1xuIFxuIC8qIGVhY2ggaHRhYiBlbGVtZW50IGlzIHN0cnVjdCBodGFiX2VsZW0gKyBrZXkgKyB2YWx1ZSAqL1xuLXN0cnVjdCBodGFiX2VsZW0ge1xuK3N0cnVjdCBodGFiX2VsZW07XG4rc3RydWN0IGh0YWJfbm9kZSB7XG4gXHR1bmlvbiB7XG4gXHRcdHN0cnVjdCBobGlzdF9udWxsc19ub2RlIGhhc2hfbm9kZTtcbiBcdFx0c3RydWN0IHtcbkBAIC0xMTcsMTggKzEyMCwzMiBAQCBzdHJ1Y3QgaHRhYl9lbGVtIHtcbiBcdFx0XHR9O1xuIFx0XHR9O1xuIFx0fTtcbi1cdHVuaW9uIHtcbi1cdFx0LyogcG9pbnRlciB0byBwZXItY3B1IHBvaW50ZXIgKi9cbi1cdFx0dm9pZCAqcHRyX3RvX3BwdHI7XG4tXHRcdHN0cnVjdCBicGZfbHJ1X25vZGUgbHJ1X25vZGU7XG4tXHR9O1xuLVx0dTMyIGhhc2g7XG4tXHRjaGFyIGtleVtdIF9fYWxpZ25lZCg4KTtcbit9O1xuK1xuK3N0cnVjdCBodGFiX2VsZW0ge1xuK1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuK1x0dTggZGF0YVtdIF9fYWxpZ25lZCg4KTtcbit9O1xuK1xuK3N0cnVjdCBodGFiX2VsZW1fbHJ1IHtcbitcdHN0cnVjdCBodGFiX25vZGUgbm9kZTtcbitcdHN0cnVjdCBicGZfbHJ1X25vZGUgbHJ1X25vZGU7XG4rXHR1OCBkYXRhW10gX19hbGlnbmVkKDgpO1xuK307XG4rXG4rLyogT25seSBmb3Igbm9uLXByZWFsbG9jYXRlZCBQQ1BVIG1hcHMuIFByZWFsbG9jYXRlZCBQQ1BVIG1hcHMgZG9uJ3QgbmVlZFxuKyAqIHB0cl90b19wcHRyLCBhbmQgdXNlIGh0YWJfZWxlbS5cbisgKi9cbitzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUge1xuK1x0c3RydWN0IGh0YWJfbm9kZSBub2RlO1xuK1x0dm9pZCAqcHRyX3RvX3BwdHI7XG4rXHR1OCBkYXRhW10gX19hbGlnbmVkKDgpO1xuIH07XG4gXG4gc3RydWN0IGh0YWJfYnRmX3JlY29yZCB7XG4gXHRzdHJ1Y3QgYnRmX3JlY29yZCAqcmVjb3JkO1xuIFx0dTMyIGtleV9zaXplO1xuK1x0dTMyIGtleV9vZmZzZXQ7XG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9pc19wcmVhbGxvYyhjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG5AQCAtMTM2LDYgKzE1MywyMSBAQCBzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9pc19wcmVhbGxvYyhjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRyZXR1cm4gIShodGFiLVx1MDAzZW1hcC5tYXBfZmxhZ3MgXHUwMDI2IEJQRl9GX05PX1BSRUFMTE9DKTtcbiB9XG4gXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2xydV9ub2RlICpodGFiX2VsZW1fbHJ1X25vZGUoc3RydWN0IGh0YWJfZWxlbSAqbClcbit7XG4rXHRyZXR1cm4gXHUwMDI2KChzdHJ1Y3QgaHRhYl9lbGVtX2xydSAqKWwpLVx1MDAzZWxydV9ub2RlO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgKmh0YWJfZWxlbV9nZXRfcHRyX3RvX3BwdHIoc3RydWN0IGh0YWJfZWxlbSAqbClcbit7XG4rXHRyZXR1cm4gKChzdHJ1Y3QgaHRhYl9lbGVtX3BjcHUgKilsKS1cdTAwM2VwdHJfdG9fcHB0cjtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfcHRyX3RvX3BwdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdm9pZCAqcHRyKVxuK3tcbitcdCgoc3RydWN0IGh0YWJfZWxlbV9wY3B1ICopbCktXHUwMDNlcHRyX3RvX3BwdHIgPSBwdHI7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIGh0YWJfaW5pdF9idWNrZXRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiB7XG4gXHR1bnNpZ25lZCBpbnQgaTtcbkBAIC0xODMsMjUgKzIxNSwzMCBAQCBzdGF0aWMgaW5saW5lIGJvb2wgaXNfZmRfaHRhYihjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRyZXR1cm4gaHRhYi1cdTAwM2VtYXAubWFwX3R5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0hfT0ZfTUFQUztcbiB9XG4gXG4tc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplKVxuK3N0YXRpYyBpbmxpbmUgdm9pZCAqaHRhYl9lbGVtX2tleShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4re1xuK1x0cmV0dXJuICh2b2lkICopbCArIGh0YWItXHUwMDNla2V5X29mZnNldDtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkICpodGFiX2VsZW1fdmFsdWUoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiBsLVx1MDAzZWtleSArIHJvdW5kX3VwKGtleV9zaXplLCA4KTtcbitcdHJldHVybiBodGFiX2VsZW1fa2V5KGh0YWIsIGwpICsgcm91bmRfdXAoaHRhYi1cdTAwM2VtYXAua2V5X3NpemUsIDgpO1xuIH1cbiBcbi1zdGF0aWMgaW5saW5lIHZvaWQgaHRhYl9lbGVtX3NldF9wdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplLFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBodGFiX2VsZW1fc2V0X3B0cihzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwsXG4gXHRcdFx0XHQgICAgIHZvaWQgX19wZXJjcHUgKnBwdHIpXG4ge1xuLVx0Kih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShsLCBrZXlfc2l6ZSkgPSBwcHRyO1xuK1x0Kih2b2lkIF9fcGVyY3B1ICoqKWh0YWJfZWxlbV92YWx1ZShodGFiLCBsKSA9IHBwdHI7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3BlcmNwdSAqaHRhYl9lbGVtX2dldF9wdHIoc3RydWN0IGh0YWJfZWxlbSAqbCwgdTMyIGtleV9zaXplKVxuK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BlcmNwdSAqaHRhYl9lbGVtX2dldF9wdHIoc3RydWN0IGJwZl9odGFiICpodGFiLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuIHtcbi1cdHJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGwsIGtleV9zaXplKTtcbitcdHJldHVybiAqKHZvaWQgX19wZXJjcHUgKiopaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCAqZmRfaHRhYl9tYXBfZ2V0X3B0cihjb25zdCBzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgaHRhYl9lbGVtICpsKVxuK3N0YXRpYyB2b2lkICpmZF9odGFiX21hcF9nZXRfcHRyKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcbiB7XG4tXHRyZXR1cm4gKih2b2lkICoqKWh0YWJfZWxlbV92YWx1ZShsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0cmV0dXJuICoodm9pZCAqKilodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICpnZXRfaHRhYl9lbGVtKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgaW50IGkpXG5AQCAtMjA5LDYgKzI0NiwzMyBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqZ2V0X2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIGludCBpKVxuIFx0cmV0dXJuIChzdHJ1Y3QgaHRhYl9lbGVtICopIChodGFiLVx1MDAzZWVsZW1zICsgaSAqICh1NjQpaHRhYi1cdTAwM2VlbGVtX3NpemUpO1xuIH1cbiBcbitzdGF0aWMgaW5saW5lIGJvb2wgaHRhYl9oYXNfaGFzaChjb25zdCBzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4re1xuK1x0cmV0dXJuIGh0YWItXHUwMDNlaGFzX2hhc2g7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdTMyIGh0YWJfZWxlbV9oYXNoKHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgc3RydWN0IGh0YWJfZWxlbSAqbClcbit7XG4rXHRpZiAoaHRhYl9pc19scnUoaHRhYikpXG4rXHRcdHJldHVybiAqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS1cdTAwM2VkYXRhO1xuK1x0ZWxzZSBpZiAoaHRhYl9pc19wZXJjcHUoaHRhYikgXHUwMDI2XHUwMDI2ICFodGFiX2lzX3ByZWFsbG9jKGh0YWIpKVxuK1x0XHRyZXR1cm4gKih1MzIgKikoKHN0cnVjdCBodGFiX2VsZW1fcGNwdSAqKWwpLVx1MDAzZWRhdGE7XG4rXHRlbHNlXG4rXHRcdHJldHVybiAqKHUzMiAqKWwtXHUwMDNlZGF0YTtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIGh0YWJfZWxlbV9zZXRfaGFzaChzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwsIHUzMiBoYXNoKVxuK3tcbitcdGlmICghaHRhYl9oYXNfaGFzaChodGFiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuK1x0XHQqKHUzMiAqKSgoc3RydWN0IGh0YWJfZWxlbV9scnUgKilsKS1cdTAwM2VkYXRhID0gaGFzaDtcbitcdGVsc2UgaWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpIFx1MDAyNlx1MDAyNiAhaHRhYl9pc19wcmVhbGxvYyhodGFiKSlcbitcdFx0Kih1MzIgKikoKHN0cnVjdCBodGFiX2VsZW1fcGNwdSAqKWwpLVx1MDAzZWRhdGEgPSBoYXNoO1xuK1x0ZWxzZVxuK1x0XHQqKHUzMiAqKWwtXHUwMDNlZGF0YSA9IGhhc2g7XG4rfVxuK1xuIC8qIEJvdGggcGVyY3B1IGFuZCBmZCBodGFiIHN1cHBvcnQgaW4tcGxhY2UgdXBkYXRlLCBzbyBubyBuZWVkIGZvclxuICAqIGV4dHJhIGVsZW0uIExSVSBpdHNlbGYgY2FuIHJlbW92ZSB0aGUgbGVhc3QgdXNlZCBlbGVtZW50LCBzb1xuICAqIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGFuIGV4dHJhIGVsZW0gZHVyaW5nIG1hcF91cGRhdGUuXG5AQCAtMjMxLDcgKzI5NSw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFxuIFx0XHRlbGVtID0gZ2V0X2h0YWJfZWxlbShodGFiLCBpKTtcbiBcdFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSkpO1xuK1x0XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSkpO1xuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdH1cbiB9XG5AQCAtMjU0LDcgKzMxOCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9wcmVhbGxvY2VkX2ZpZWxkcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXG4gXHRcdGVsZW0gPSBnZXRfaHRhYl9lbGVtKGh0YWIsIGkpO1xuIFx0XHRpZiAoaHRhYl9pc19wZXJjcHUoaHRhYikpIHtcbi1cdFx0XHR2b2lkIF9fcGVyY3B1ICpwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUpO1xuK1x0XHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcbiBcdFx0XHRpbnQgY3B1O1xuIFxuIFx0XHRcdGZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHtcbkBAIC0yNjMsNyArMzI3LDcgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX3ByZWFsbG9jZWRfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0YnBmX29ial9mcmVlX2ZpZWxkcyhodGFiLVx1MDAzZW1hcC5yZWNvcmQsXG4tXHRcdFx0XHRcdCAgICBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUpKTtcbitcdFx0XHRcdFx0ICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBlbGVtKSk7XG4gXHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4gXHRcdH1cbiBcdFx0Y29uZF9yZXNjaGVkKCk7XG5AQCAtMjgwLDggKzM0NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfZnJlZV9lbGVtcyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIpXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBodGFiLVx1MDAzZW1hcC5tYXhfZW50cmllczsgaSsrKSB7XG4gXHRcdHZvaWQgX19wZXJjcHUgKnBwdHI7XG4gXG4tXHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihnZXRfaHRhYl9lbGVtKGh0YWIsIGkpLFxuLVx0XHRcdFx0XHQgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUpO1xuK1x0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgZ2V0X2h0YWJfZWxlbShodGFiLCBpKSk7XG4gXHRcdGZyZWVfcGVyY3B1KHBwdHIpO1xuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdH1cbkBAIC0zMDgsOCArMzcxLDggQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKnByZWFsbG9jX2xydV9wb3Aoc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksXG4gXG4gXHRpZiAobm9kZSkge1xuIFx0XHRicGZfbWFwX2luY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbi1cdFx0bCA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSk7XG4tXHRcdG1lbWNweShsLVx1MDAzZWtleSwga2V5LCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4rXHRcdGwgPSAoc3RydWN0IGh0YWJfZWxlbSAqKWNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpO1xuK1x0XHRtZW1jcHkoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4gXHRcdHJldHVybiBsO1xuIFx0fVxuIFxuQEAgLTM0MCw4ICs0MDMsNyBAQCBzdGF0aWMgaW50IHByZWFsbG9jX2luaXQoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0XHRcdFx0XHQgICAgR0ZQX1VTRVIgfCBfX0dGUF9OT1dBUk4pO1xuIFx0XHRpZiAoIXBwdHIpXG4gXHRcdFx0Z290byBmcmVlX2VsZW1zO1xuLVx0XHRodGFiX2VsZW1fc2V0X3B0cihnZXRfaHRhYl9lbGVtKGh0YWIsIGkpLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSxcbi1cdFx0XHRcdCAgcHB0cik7XG4rXHRcdGh0YWJfZWxlbV9zZXRfcHRyKGh0YWIsIGdldF9odGFiX2VsZW0oaHRhYiwgaSksIHBwdHIpO1xuIFx0XHRjb25kX3Jlc2NoZWQoKTtcbiBcdH1cbiBcbkBAIC0zNDksOCArNDExLDggQEAgc3RhdGljIGludCBwcmVhbGxvY19pbml0KHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdGlmIChodGFiX2lzX2xydShodGFiKSlcbiBcdFx0ZXJyID0gYnBmX2xydV9pbml0KFx1MDAyNmh0YWItXHUwMDNlbHJ1LFxuIFx0XHRcdFx0ICAgaHRhYi1cdTAwM2VtYXAubWFwX2ZsYWdzIFx1MDAyNiBCUEZfRl9OT19DT01NT05fTFJVLFxuLVx0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaCkgLVxuLVx0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpLFxuK1x0XHRcdFx0ICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGRhdGEpIC1cbitcdFx0XHRcdCAgIG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fbHJ1LCBscnVfbm9kZSksXG4gXHRcdFx0XHQgICBodGFiX2xydV9tYXBfZGVsZXRlX25vZGUsXG4gXHRcdFx0XHQgICBodGFiKTtcbiBcdGVsc2VcbkBAIC0zNjEsMTEgKzQyMywxMSBAQCBzdGF0aWMgaW50IHByZWFsbG9jX2luaXQoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFxuIFx0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuIFx0XHRicGZfbHJ1X3BvcHVsYXRlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBodGFiLVx1MDAzZWVsZW1zLFxuLVx0XHRcdFx0IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGxydV9ub2RlKSxcbitcdFx0XHRcdCBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpLFxuIFx0XHRcdFx0IGh0YWItXHUwMDNlZWxlbV9zaXplLCBudW1fZW50cmllcyk7XG4gXHRlbHNlXG4gXHRcdHBjcHVfZnJlZWxpc3RfcG9wdWxhdGUoXHUwMDI2aHRhYi1cdTAwM2VmcmVlbGlzdCxcbi1cdFx0XHRcdCAgICAgICBodGFiLVx1MDAzZWVsZW1zICsgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgZm5vZGUpLFxuK1x0XHRcdFx0ICAgICAgIGh0YWItXHUwMDNlZWxlbXMgKyBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmZub2RlKSxcbiBcdFx0XHRcdCAgICAgICBodGFiLVx1MDAzZWVsZW1fc2l6ZSwgbnVtX2VudHJpZXMpO1xuIFxuIFx0cmV0dXJuIDA7XG5AQCAtNDAxLDcgKzQ2Myw3IEBAIHN0YXRpYyBpbnQgYWxsb2NfZXh0cmFfZWxlbXMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0XHQvKiBwb3Agd2lsbCBzdWNjZWVkLCBzaW5jZSBwcmVhbGxvY19pbml0KClcbiBcdFx0ICogcHJlYWxsb2NhdGVkIGV4dHJhIG51bV9wb3NzaWJsZV9jcHVzIGVsZW1lbnRzXG4gXHRcdCAqL1xuLVx0XHRsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBmbm9kZSk7XG4rXHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIG5vZGUuZm5vZGUpO1xuIFx0XHQqcGVyX2NwdV9wdHIocHB0ciwgY3B1KSA9IGxfbmV3O1xuIFx0fVxuIFx0aHRhYi1cdTAwM2VleHRyYV9lbGVtcyA9IHBwdHI7XG5AQCAtNDI1LDggKzQ4Nyw4IEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXG4gXHRib29sIHplcm9fc2VlZCA9IChhdHRyLVx1MDAzZW1hcF9mbGFncyBcdTAwMjYgQlBGX0ZfWkVST19TRUVEKTtcbiBcdGludCBudW1hX25vZGUgPSBicGZfbWFwX2F0dHJfbnVtYV9ub2RlKGF0dHIpO1xuIFxuLVx0QlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGZub2RlLm5leHQpICE9XG4tXHRcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlLnBwcmV2KSk7XG4rXHRCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGh0YWJfbm9kZSwgZm5vZGUubmV4dCkgIT1cbitcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9ub2RlLCBoYXNoX25vZGUucHByZXYpKTtcbiBcbiBcdGlmICh6ZXJvX3NlZWQgXHUwMDI2XHUwMDI2ICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKVxuIFx0XHQvKiBHdWFyZCBhZ2FpbnN0IGxvY2FsIERvUywgYW5kIGRpc2NvdXJhZ2UgcHJvZHVjdGlvbiB1c2UuICovXG5AQCAtNDc2LDcgKzUzOCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfbWVtX2R0b3Iodm9pZCAqb2JqLCB2b2lkICpjdHgpXG4gXHRpZiAoSVNfRVJSX09SX05VTEwoaHJlYy1cdTAwM2VyZWNvcmQpKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRtYXBfdmFsdWUgPSBodGFiX2VsZW1fdmFsdWUoZWxlbSwgaHJlYy1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRtYXBfdmFsdWUgPSAodm9pZCAqKWVsZW0gKyBocmVjLVx1MDAzZWtleV9vZmZzZXQgKyByb3VuZF91cChocmVjLVx1MDAzZWtleV9zaXplLCA4KTtcbiBcdGJwZl9vYmpfZnJlZV9maWVsZHMoaHJlYy1cdTAwM2VyZWNvcmQsIG1hcF92YWx1ZSk7XG4gfVxuIFxuQEAgLTUwMiw3ICs1NjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2R0b3JfY3R4X2ZyZWUodm9pZCAqY3R4KVxuIH1cbiBcbiBzdGF0aWMgaW50IGJwZl9tYV9zZXRfZHRvcihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX21lbV9hbGxvYyAqbWEsXG4tXHRcdFx0ICAgdm9pZCAoKmR0b3IpKHZvaWQgKiwgdm9pZCAqKSlcbitcdFx0XHQgICB2b2lkICgqZHRvcikodm9pZCAqLCB2b2lkICopLCB1MzIga2V5X29mZnNldClcbiB7XG4gXHRzdHJ1Y3QgaHRhYl9idGZfcmVjb3JkICpocmVjO1xuIFx0aW50IGVycjtcbkBAIC01MTUsNiArNTc3LDcgQEAgc3RhdGljIGludCBicGZfbWFfc2V0X2R0b3Ioc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9tZW1fYWxsb2MgKm1hLFxuIFx0aWYgKCFocmVjKVxuIFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdGhyZWMtXHUwMDNla2V5X3NpemUgPSBtYXAtXHUwMDNla2V5X3NpemU7XG4rXHRocmVjLVx1MDAzZWtleV9vZmZzZXQgPSBrZXlfb2Zmc2V0O1xuIFx0aHJlYy1cdTAwM2VyZWNvcmQgPSBidGZfcmVjb3JkX2R1cChtYXAtXHUwMDNlcmVjb3JkKTtcbiBcdGlmIChJU19FUlIoaHJlYy1cdTAwM2VyZWNvcmQpKSB7XG4gXHRcdGVyciA9IFBUUl9FUlIoaHJlYy1cdTAwM2VyZWNvcmQpO1xuQEAgLTUzNyw5ICs2MDAsOSBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4gXHQgKiBwb3B1bGF0ZWQgaW4gaHRhYl9tYXBfYWxsb2MoKSwgc28gaXQgd2lsbCBhbHdheXMgYXBwZWFyIGFzIE5VTEwuXG4gXHQgKi9cbiBcdGlmIChodGFiX2lzX3BlcmNwdShodGFiKSlcbi1cdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlcGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yKTtcbitcdFx0cmV0dXJuIGJwZl9tYV9zZXRfZHRvcihtYXAsIFx1MDAyNmh0YWItXHUwMDNlcGNwdV9tYSwgaHRhYl9wY3B1X21lbV9kdG9yLCBodGFiLVx1MDAzZWtleV9vZmZzZXQpO1xuIFx0ZWxzZVxuLVx0XHRyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgXHUwMDI2aHRhYi1cdTAwM2VtYSwgaHRhYl9tZW1fZHRvcik7XG4rXHRcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZodGFiLVx1MDAzZW1hLCBodGFiX21lbV9kdG9yLCBodGFiLVx1MDAzZWtleV9vZmZzZXQpO1xuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKVxuQEAgLTU2Miw2ICs2MjUsMTMgQEAgc3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcbiBcbiBcdGJwZl9tYXBfaW5pdF9mcm9tX2F0dHIoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGF0dHIpO1xuIFxuK1x0LyogQXZvaWQgaGFzaCBtZW1vcnkgdXNlIGFuZCBjb21wYXJpc29ucyB3aGVyZSB1bm5lY2Vzc2FyeS5cbitcdCAqIHUzMiBoYXNoIHJlYWRzIGFyZSBhbHdheXMgYXRvbWljLiBJZiB3ZSBlbGlkZSB0aGVtLCBrZXkgY29tcGFyaXNvbnMgbXVzdCBhbHNvIGJlIGF0b21pY1xuK1x0ICogdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmUga2V5IG1hdGNoZXMgZHVlIHRvIHRvcm4ga2V5IHJlYWRzIC8gd3JpdGVzLiBUaGlzIGlzIG9ubHkgcG9zc2libGVcbitcdCAqIHdoZW4gdGhlIGtleSBmaXRzIHdpdGhpbiBhIHdvcmQsIHNvIGNoZWNrIGtleV9zaXplLlxuK1x0ICovXG4rXHRodGFiLVx1MDAzZWhhc19oYXNoID0gaHRhYl9pc19scnUoaHRhYikgfHwgaHRhYi1cdTAwM2VtYXAua2V5X3NpemUgXHUwMDNlIHNpemVvZih1bnNpZ25lZCBsb25nKTtcbitcbiBcdGlmIChwZXJjcHVfbHJ1KSB7XG4gXHRcdC8qIGVuc3VyZSBlYWNoIENQVSdzIGxydSBsaXN0IGhhcyBcdTAwM2U9MSBlbGVtZW50cy5cbiBcdFx0ICogc2luY2Ugd2UgYXJlIGF0IGl0LCBtYWtlIGVhY2ggbHJ1IGxpc3QgaGFzIHRoZSBzYW1lXG5AQCAtNTgzLDggKzY1MywxNiBAQCBzdGF0aWMgc3RydWN0IGJwZl9tYXAgKmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKVxuIFxuIFx0aHRhYi1cdTAwM2VuX2J1Y2tldHMgPSByb3VuZHVwX3Bvd19vZl90d28oaHRhYi1cdTAwM2VtYXAubWF4X2VudHJpZXMpO1xuIFxuLVx0aHRhYi1cdTAwM2VlbGVtX3NpemUgPSBzaXplb2Yoc3RydWN0IGh0YWJfZWxlbSkgK1xuLVx0XHRcdCAgcm91bmRfdXAoaHRhYi1cdTAwM2VtYXAua2V5X3NpemUsIDgpO1xuK1x0aWYgKGh0YWJfaXNfbHJ1KGh0YWIpKVxuK1x0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgZGF0YSkgKyA4O1xuK1x0ZWxzZSBpZiAocGVyY3B1IFx1MDAyNlx1MDAyNiAhcHJlYWxsb2MpXG4rXHRcdGh0YWItXHUwMDNla2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW1fcGNwdSwgZGF0YSkgK1xuK1x0XHRcdFx0ICAgKGh0YWJfaGFzX2hhc2goaHRhYikgPyA4IDogMCk7XG4rXHRlbHNlXG4rXHRcdGh0YWItXHUwMDNla2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBodGFiX2VsZW0sIGRhdGEpICtcbitcdFx0XHRcdCAgIChodGFiX2hhc19oYXNoKGh0YWIpID8gOCA6IDApO1xuK1xuK1x0aHRhYi1cdTAwM2VlbGVtX3NpemUgPSBodGFiLVx1MDAzZWtleV9vZmZzZXQgKyByb3VuZF91cChodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSwgOCk7XG4gXHRpZiAocGVyY3B1KVxuIFx0XHRodGFiLVx1MDAzZWVsZW1fc2l6ZSArPSBzaXplb2Yodm9pZCAqKTtcbiBcdGVsc2VcbkBAIC02OTIsMTUgKzc3MCwyOSBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpzZWxlY3RfYnVja2V0KHN0cnVjdCBicGZfaHRhYiAqaHRhYiwgdTMyXG4gfVxuIFxuIC8qIHRoaXMgbG9va3VwIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGJ1Y2tldCBsb2NrIHRha2VuICovXG4tc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2gsXG4rc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9lbGVtX3JhdyhzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsXG4rXHRcdFx0XHRcdCBzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCwgdTMyIGhhc2gsXG4gXHRcdFx0XHRcdCB2b2lkICprZXksIHUzMiBrZXlfc2l6ZSlcbiB7XG4gXHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4tXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKVxuLVx0XHRpZiAobC1cdTAwM2VoYXNoID09IGhhc2ggXHUwMDI2XHUwMDI2ICFtZW1jbXAoXHUwMDI2bC1cdTAwM2VrZXksIGtleSwga2V5X3NpemUpKVxuLVx0XHRcdHJldHVybiBsO1xuK1x0aWYgKGh0YWJfaGFzX2hhc2goaHRhYikpIHtcbitcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuK1x0XHRcdGlmIChodGFiX2VsZW1faGFzaChodGFiLCBsKSA9PSBoYXNoIFx1MDAyNlx1MDAyNlxuK1x0XHRcdCAgICAhbWVtY21wKGh0YWJfZWxlbV9rZXkoaHRhYiwgbCksIGtleSwga2V5X3NpemUpKVxuK1x0XHRcdFx0cmV0dXJuIGw7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBXaGVuIGhhc2ggaXMgb21pdHRlZCwga2V5IGNvbXBhcmlzb25zIG11c3QgYmUgYXRvbWljLiBaZXJvIGV4dGVuZFxuK1x0XHQgKiB0aGUgY2FsbGVyJ3Mga2V5IHRvIHRoZSB3b3JkIHNpemUgdG8gc3VwcG9ydCBhbiBhdG9taWMgY29tcGFyZS5cbitcdFx0ICovXG4rXHRcdHVuc2lnbmVkIGxvbmcgayA9IDA7XG4rXG4rXHRcdG1lbWNweShcdTAwMjZrLCBrZXksIGtleV9zaXplKTtcbitcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuK1x0XHRcdGlmIChSRUFEX09OQ0UoKih1bnNpZ25lZCBsb25nICopaHRhYl9lbGVtX2tleShodGFiLCBsKSkgPT0gaylcbitcdFx0XHRcdHJldHVybiBsO1xuK1x0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuQEAgLTcwOSw3ICs4MDEsOCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLCB1MzIgaGFzaFxuICAqIHRoZSB1bmxpa2VseSBldmVudCB3aGVuIGVsZW1lbnRzIG1vdmVkIGZyb20gb25lIGJ1Y2tldCBpbnRvIGFub3RoZXJcbiAgKiB3aGlsZSBsaW5rIGxpc3QgaXMgYmVpbmcgd2Fsa2VkXG4gICovXG4tc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmxvb2t1cF9udWxsc19lbGVtX3JhdyhzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGVhZCxcbitzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX251bGxzX2VsZW1fcmF3KHN0cnVjdCBicGZfaHRhYiAqaHRhYixcbitcdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLFxuIFx0XHRcdFx0XHQgICAgICAgdTMyIGhhc2gsIHZvaWQgKmtleSxcbiBcdFx0XHRcdFx0ICAgICAgIHUzMiBrZXlfc2l6ZSwgdTMyIG5fYnVja2V0cylcbiB7XG5AQCAtNzE3LDkgKzgxMCwyMCBAQCBzdGF0aWMgc3RydWN0IGh0YWJfZWxlbSAqbG9va3VwX251bGxzX2VsZW1fcmF3KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICpoZWFkLFxuIFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcbiBhZ2Fpbjpcbi1cdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpXG4tXHRcdGlmIChsLVx1MDAzZWhhc2ggPT0gaGFzaCBcdTAwMjZcdTAwMjYgIW1lbWNtcChcdTAwMjZsLVx1MDAzZWtleSwga2V5LCBrZXlfc2l6ZSkpXG4tXHRcdFx0cmV0dXJuIGw7XG4rXHRpZiAoaHRhYl9oYXNfaGFzaChodGFiKSkge1xuK1x0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4rXHRcdFx0aWYgKGh0YWJfZWxlbV9oYXNoKGh0YWIsIGwpID09IGhhc2ggXHUwMDI2XHUwMDI2XG4rXHRcdFx0ICAgICFtZW1jbXAoaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5LCBrZXlfc2l6ZSkpXG4rXHRcdFx0XHRyZXR1cm4gbDtcbitcdH0gZWxzZSB7XG4rXHRcdC8qIFNlZSBsb29rdXBfZWxlbV9yYXcoKSBjb21tZW50IGFib3ZlLiAqL1xuK1x0XHR1bnNpZ25lZCBsb25nIGsgPSAwO1xuK1xuK1x0XHRtZW1jcHkoXHUwMDI2aywga2V5LCBrZXlfc2l6ZSk7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSlcbitcdFx0XHRpZiAoUkVBRF9PTkNFKCoodW5zaWduZWQgbG9uZyAqKWh0YWJfZWxlbV9rZXkoaHRhYiwgbCkpID09IGspXG4rXHRcdFx0XHRyZXR1cm4gbDtcbitcdH1cbiBcbiBcdGlmICh1bmxpa2VseShnZXRfbnVsbHNfdmFsdWUobikgIT0gKGhhc2ggXHUwMDI2IChuX2J1Y2tldHMgLSAxKSkpKVxuIFx0XHRnb3RvIGFnYWluO1xuQEAgLTc0NywxNyArODUxLDE4IEBAIHN0YXRpYyB2b2lkICpfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBcbiBcdGhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGhhc2gpO1xuIFxuLVx0bCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLCBodGFiLVx1MDAzZW5fYnVja2V0cyk7XG4rXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXHUwMDNlbl9idWNrZXRzKTtcbiBcbiBcdHJldHVybiBsO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCAqaHRhYl9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRcdHJldHVybiBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XG4gXG4gXHRyZXR1cm4gTlVMTDtcbiB9XG5AQCAtNzc1LDYgKzg4MCw3IEBAIHN0YXRpYyB2b2lkICpodGFiX21hcF9sb29rdXBfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gICovXG4gc3RhdGljIGludCBodGFiX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpXG4ge1xuK1x0c3RydWN0IGJwZl9odGFiICpodGFiID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9odGFiLCBtYXApO1xuIFx0c3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7XG4gXHRjb25zdCBpbnQgcmV0ID0gQlBGX1JFR18wO1xuIFxuQEAgLTc4Myw3ICs4ODksNyBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiBcdCppbnNuKysgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xuIFx0Kmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIHJldCwgMCwgMSk7XG4gXHQqaW5zbisrID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCByZXQsXG4tXHRcdFx0XHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICtcbitcdFx0XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCArXG4gXHRcdFx0XHRyb3VuZF91cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiBcdHJldHVybiBpbnNuIC0gaW5zbl9idWY7XG4gfVxuQEAgLTc5MSwxMiArODk3LDEzIEBAIHN0YXRpYyBpbnQgaHRhYl9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxuIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqX19odGFiX2xydV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdFx0XHRcdHZvaWQgKmtleSwgY29uc3QgYm9vbCBtYXJrKVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKSB7XG4gXHRcdGlmIChtYXJrKVxuLVx0XHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmwtXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRyZXR1cm4gaHRhYl9lbGVtX3ZhbHVlKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRcdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoaHRhYl9lbGVtX2xydV9ub2RlKGwpKTtcbitcdFx0cmV0dXJuIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsKTtcbiBcdH1cbiBcbiBcdHJldHVybiBOVUxMO1xuQEAgLTgxNSw2ICs5MjIsNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfbWFwX2xvb2t1cF9lbGVtX3N5cyhzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXkpXG4gc3RhdGljIGludCBodGFiX2xydV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0XHRcdFx0ICAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4rXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjtcbiBcdGNvbnN0IGludCByZXQgPSBCUEZfUkVHXzA7XG4gXHRjb25zdCBpbnQgcmVmX3JlZyA9IEJQRl9SRUdfMTtcbkBAIC04MjQsMTUgKzkzMiwxNSBAQCBzdGF0aWMgaW50IGh0YWJfbHJ1X21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXHQqaW5zbisrID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTtcbiBcdCppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDQpO1xuIFx0Kmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9CLCByZWZfcmVnLCByZXQsXG4tXHRcdFx0ICAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpICtcbitcdFx0XHQgICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtX2xydSwgbHJ1X25vZGUpICtcbiBcdFx0XHQgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpKTtcbiBcdCppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSk5FLCByZWZfcmVnLCAwLCAxKTtcbiBcdCppbnNuKysgPSBCUEZfU1RfTUVNKEJQRl9CLCByZXQsXG4tXHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBscnVfbm9kZSkgK1xuK1x0XHRcdCAgICAgb2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKSArXG4gXHRcdFx0ICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX2xydV9ub2RlLCByZWYpLFxuIFx0XHRcdCAgICAgMSk7XG4gXHQqaW5zbisrID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCByZXQsXG4tXHRcdFx0XHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICtcbitcdFx0XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCArXG4gXHRcdFx0XHRyb3VuZF91cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbiBcdHJldHVybiBpbnNuIC0gaW5zbl9idWY7XG4gfVxuQEAgLTg0NCwxMyArOTUyLDEzIEBAIHN0YXRpYyB2b2lkIGNoZWNrX2FuZF9jYW5jZWxfZmllbGRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYixcbiBcdFx0cmV0dXJuO1xuIFxuIFx0aWYgKGh0YWJfaXNfcGVyY3B1KGh0YWIpKSB7XG4tXHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBodGFiLVx1MDAzZW1hcC5rZXlfc2l6ZSk7XG4rXHRcdHZvaWQgX19wZXJjcHUgKnBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcbiBcdFx0aW50IGNwdTtcbiBcbiBcdFx0Zm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSlcbiBcdFx0XHRicGZfb2JqX2NhbmNlbF9maWVsZHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuIFx0fSBlbHNlIHtcbi1cdFx0dm9pZCAqbWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIGh0YWItXHUwMDNlbWFwLmtleV9zaXplKTtcbitcdFx0dm9pZCAqbWFwX3ZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGVsZW0pO1xuIFxuIFx0XHRicGZfb2JqX2NhbmNlbF9maWVsZHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIG1hcF92YWx1ZSk7XG4gXHR9XG5AQCAtODY5LDE3ICs5NzcsMTcgQEAgc3RhdGljIGJvb2wgaHRhYl9scnVfbWFwX2RlbGV0ZV9ub2RlKHZvaWQgKmFyZywgc3RydWN0IGJwZl9scnVfbm9kZSAqbm9kZSlcbiBcdHN0cnVjdCBidWNrZXQgKmI7XG4gXHRpbnQgcmV0O1xuIFxuLVx0dGd0X2wgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbSwgbHJ1X25vZGUpO1xuLVx0YiA9IF9fc2VsZWN0X2J1Y2tldChodGFiLCB0Z3RfbC1cdTAwM2VoYXNoKTtcbitcdHRndF9sID0gKHN0cnVjdCBodGFiX2VsZW0gKiljb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGh0YWJfZWxlbV9scnUsIGxydV9ub2RlKTtcbitcdGIgPSBfX3NlbGVjdF9idWNrZXQoaHRhYiwgaHRhYl9lbGVtX2hhc2goaHRhYiwgdGd0X2wpKTtcbiBcdGhlYWQgPSBcdTAwMjZiLVx1MDAzZWhlYWQ7XG4gXG4gXHRyZXQgPSBodGFiX2xvY2tfYnVja2V0KGIsIFx1MDAyNmZsYWdzKTtcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiBmYWxzZTtcbiBcbi1cdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShsLCBuLCBoZWFkLCBoYXNoX25vZGUpXG4rXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpXG4gXHRcdGlmIChsID09IHRndF9sKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4rXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcdFx0XHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbiBcdFx0XHRicmVhaztcbiBcdFx0fVxuQEAgLTkxMiwxOCArMTAyMCwxOSBAQCBzdGF0aWMgaW50IGh0YWJfbWFwX2dldF9uZXh0X2tleShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKm5leHRfa2V5KVxuIFx0aGVhZCA9IHNlbGVjdF9idWNrZXQoaHRhYiwgaGFzaCk7XG4gXG4gXHQvKiBsb29rdXAgdGhlIGtleSAqL1xuLVx0bCA9IGxvb2t1cF9udWxsc19lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplLCBodGFiLVx1MDAzZW5fYnVja2V0cyk7XG4rXHRsID0gbG9va3VwX251bGxzX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUsIGh0YWItXHUwMDNlbl9idWNrZXRzKTtcbiBcbiBcdGlmICghbClcbiBcdFx0Z290byBmaW5kX2ZpcnN0X2VsZW07XG4gXG4gXHQvKiBrZXkgd2FzIGZvdW5kLCBnZXQgbmV4dCBrZXkgaW4gdGhlIHNhbWUgYnVja2V0ICovXG4tXHRuZXh0X2wgPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKHJjdV9kZXJlZmVyZW5jZV9yYXcoaGxpc3RfbnVsbHNfbmV4dF9yY3UoXHUwMDI2bC1cdTAwM2VoYXNoX25vZGUpKSxcbi1cdFx0XHRcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcbitcdG5leHRfbCA9IGhsaXN0X251bGxzX2VudHJ5X3NhZmUoXG4rXHRcdFx0cmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKSksXG4rXHRcdFx0c3RydWN0IGh0YWJfZWxlbSwgbm9kZS5oYXNoX25vZGUpO1xuIFxuIFx0aWYgKG5leHRfbCkge1xuIFx0XHQvKiBpZiBuZXh0IGVsZW0gaW4gdGhpcyBoYXNoIGxpc3QgaXMgbm9uLXplcm8sIGp1c3QgcmV0dXJuIGl0ICovXG4tXHRcdG1lbWNweShuZXh0X2tleSwgbmV4dF9sLVx1MDAzZWtleSwga2V5X3NpemUpO1xuK1x0XHRtZW1jcHkobmV4dF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbmV4dF9sKSwga2V5X3NpemUpO1xuIFx0XHRyZXR1cm4gMDtcbiBcdH1cbiBcbkBAIC05MzgsMTAgKzEwNDcsMTAgQEAgc3RhdGljIGludCBodGFiX21hcF9nZXRfbmV4dF9rZXkoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICpuZXh0X2tleSlcbiBcbiBcdFx0LyogcGljayBmaXJzdCBlbGVtZW50IGluIHRoZSBidWNrZXQgKi9cbiBcdFx0bmV4dF9sID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShyY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX2ZpcnN0X3JjdShoZWFkKSksXG4tXHRcdFx0XHRcdCAgc3RydWN0IGh0YWJfZWxlbSwgaGFzaF9ub2RlKTtcbitcdFx0XHRcdFx0ICBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XG4gXHRcdGlmIChuZXh0X2wpIHtcbiBcdFx0XHQvKiBpZiBpdCdzIG5vdCBlbXB0eSwganVzdCByZXR1cm4gaXQgKi9cbi1cdFx0XHRtZW1jcHkobmV4dF9rZXksIG5leHRfbC1cdTAwM2VrZXksIGtleV9zaXplKTtcbitcdFx0XHRtZW1jcHkobmV4dF9rZXksIGh0YWJfZWxlbV9rZXkoaHRhYiwgbmV4dF9sKSwga2V5X3NpemUpO1xuIFx0XHRcdHJldHVybiAwO1xuIFx0XHR9XG4gXHR9XG5AQCAtOTU1LDcgKzEwNjQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX2VsZW1fZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4gXHRjaGVja19hbmRfY2FuY2VsX2ZpZWxkcyhodGFiLCBsKTtcbiBcbiBcdGlmIChodGFiLVx1MDAzZW1hcC5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0gpXG4tXHRcdGJwZl9tZW1fY2FjaGVfZnJlZShcdTAwMjZodGFiLVx1MDAzZXBjcHVfbWEsIGwtXHUwMDNlcHRyX3RvX3BwdHIpO1xuK1x0XHRicGZfbWVtX2NhY2hlX2ZyZWUoXHUwMDI2aHRhYi1cdTAwM2VwY3B1X21hLCBodGFiX2VsZW1fZ2V0X3B0cl90b19wcHRyKGwpKTtcbiBcdGJwZl9tZW1fY2FjaGVfZnJlZShcdTAwMjZodGFiLVx1MDAzZW1hLCBsKTtcbiB9XG4gXG5AQCAtOTY1LDcgKzEwNzQsNyBAQCBzdGF0aWMgdm9pZCBodGFiX3B1dF9mZF92YWx1ZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4gXHR2b2lkICpwdHI7XG4gXG4gXHRpZiAobWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZmRfcHV0X3B0cikge1xuLVx0XHRwdHIgPSBmZF9odGFiX21hcF9nZXRfcHRyKG1hcCwgbCk7XG4rXHRcdHB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIoaHRhYiwgbCk7XG4gXHRcdG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2ZkX3B1dF9wdHIobWFwLCBwdHIsIHRydWUpO1xuIFx0fVxuIH1cbkBAIC0xMDA2LDcgKzExMTUsNyBAQCBzdGF0aWMgdm9pZCBmcmVlX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmwpXG4gXHRpZiAoaHRhYl9pc19wcmVhbGxvYyhodGFiKSkge1xuIFx0XHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbiBcdFx0Y2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgbCk7XG4tXHRcdHBjcHVfZnJlZWxpc3RfcHVzaChcdTAwMjZodGFiLVx1MDAzZWZyZWVsaXN0LCBcdTAwMjZsLVx1MDAzZWZub2RlKTtcbitcdFx0cGNwdV9mcmVlbGlzdF9wdXNoKFx1MDAyNmh0YWItXHUwMDNlZnJlZWxpc3QsIFx1MDAyNmwtXHUwMDNlbm9kZS5mbm9kZSk7XG4gXHR9IGVsc2Uge1xuIFx0XHRkZWNfZWxlbV9jb3VudChodGFiKTtcbiBcdFx0aHRhYl9lbGVtX2ZyZWUoaHRhYiwgbCk7XG5AQCAtMTA5Nyw3ICsxMjA2LDcgQEAgc3RhdGljIHN0cnVjdCBodGFiX2VsZW0gKmFsbG9jX2h0YWJfZWxlbShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHZvaWQgKmtleSxcbiBcdFx0XHRsID0gX19wY3B1X2ZyZWVsaXN0X3BvcChcdTAwMjZodGFiLVx1MDAzZWZyZWVsaXN0KTtcbiBcdFx0XHRpZiAoIWwpXG4gXHRcdFx0XHRyZXR1cm4gRVJSX1BUUigtRTJCSUcpO1xuLVx0XHRcdGxfbmV3ID0gY29udGFpbmVyX29mKGwsIHN0cnVjdCBodGFiX2VsZW0sIGZub2RlKTtcbitcdFx0XHRsX25ldyA9IGNvbnRhaW5lcl9vZihsLCBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmZub2RlKTtcbiBcdFx0XHRicGZfbWFwX2luY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbiBcdFx0fVxuIFx0fSBlbHNlIHtcbkBAIC0xMTE3LDEwICsxMjI2LDIwIEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICphbGxvY19odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksXG4gXHRcdH1cbiBcdH1cbiBcbi1cdG1lbWNweShsX25ldy1cdTAwM2VrZXksIGtleSwga2V5X3NpemUpO1xuK1x0aWYgKGh0YWJfaGFzX2hhc2goaHRhYikpIHtcbitcdFx0bWVtY3B5KGh0YWJfZWxlbV9rZXkoaHRhYiwgbF9uZXcpLCBrZXksIGtleV9zaXplKTtcbitcdH0gZWxzZSB7XG4rXHRcdC8qIFplcm8tZXh0ZW5kIGtleSBpbnRvIGsgZm9yIGFuIGF0b21pYyB3cml0ZSB0byBzdXBwb3J0XG4rXHRcdCAqIGxvY2tsZXNzIFJDVSByZWFkZXJzLlxuK1x0XHQgKi9cbitcdFx0dW5zaWduZWQgbG9uZyBrID0gMDtcbitcbitcdFx0bWVtY3B5KFx1MDAyNmssIGtleSwga2V5X3NpemUpO1xuK1x0XHRXUklURV9PTkNFKCoodW5zaWduZWQgbG9uZyAqKWh0YWJfZWxlbV9rZXkoaHRhYiwgbF9uZXcpLCBrKTtcbitcdH1cbiBcdGlmIChwZXJjcHUpIHtcbiBcdFx0aWYgKHByZWFsbG9jKSB7XG4tXHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSk7XG4rXHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGxfbmV3KTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHQvKiBhbGxvY19wZXJjcHUgemVyby1maWxscyAqL1xuIFx0XHRcdHZvaWQgKnB0ciA9IGJwZl9tZW1fY2FjaGVfYWxsb2MoXHUwMDI2aHRhYi1cdTAwM2VwY3B1X21hKTtcbkBAIC0xMTMwLDI2ICsxMjQ5LDI2IEBAIHN0YXRpYyBzdHJ1Y3QgaHRhYl9lbGVtICphbGxvY19odGFiX2VsZW0oc3RydWN0IGJwZl9odGFiICpodGFiLCB2b2lkICprZXksXG4gXHRcdFx0XHRsX25ldyA9IEVSUl9QVFIoLUVOT01FTSk7XG4gXHRcdFx0XHRnb3RvIGRlY19jb3VudDtcbiBcdFx0XHR9XG4tXHRcdFx0bF9uZXctXHUwMDNlcHRyX3RvX3BwdHIgPSBwdHI7XG4rXHRcdFx0aHRhYl9lbGVtX3NldF9wdHJfdG9fcHB0cihsX25ldywgcHRyKTtcbiBcdFx0XHRwcHRyID0gKih2b2lkIF9fcGVyY3B1ICoqKXB0cjtcbiBcdFx0fVxuIFxuIFx0XHRwY3B1X2luaXRfdmFsdWUoaHRhYiwgcHB0ciwgdmFsdWUsIG9uYWxsY3B1cywgbWFwX2ZsYWdzKTtcbiBcbiBcdFx0aWYgKCFwcmVhbGxvYylcbi1cdFx0XHRodGFiX2VsZW1fc2V0X3B0cihsX25ldywga2V5X3NpemUsIHBwdHIpO1xuK1x0XHRcdGh0YWJfZWxlbV9zZXRfcHRyKGh0YWIsIGxfbmV3LCBwcHRyKTtcbiBcdH0gZWxzZSBpZiAoZmRfaHRhYl9tYXBfbmVlZHNfYWRqdXN0KGh0YWIpKSB7XG4gXHRcdHNpemUgPSByb3VuZF91cChzaXplLCA4KTtcbi1cdFx0bWVtY3B5KGh0YWJfZWxlbV92YWx1ZShsX25ldywga2V5X3NpemUpLCB2YWx1ZSwgc2l6ZSk7XG4rXHRcdG1lbWNweShodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSwgc2l6ZSk7XG4gXHR9IGVsc2UgaWYgKG1hcF9mbGFncyBcdTAwMjYgQlBGX0ZfTE9DSykge1xuIFx0XHRjb3B5X21hcF92YWx1ZV9sb2NrZWQoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUobF9uZXcsIGtleV9zaXplKSxcbitcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksXG4gXHRcdFx0XHQgICAgICB2YWx1ZSwgZmFsc2UpO1xuIFx0fSBlbHNlIHtcbi1cdFx0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShsX25ldywga2V5X3NpemUpLCB2YWx1ZSk7XG4rXHRcdGNvcHlfbWFwX3ZhbHVlKFx1MDAyNmh0YWItXHUwMDNlbWFwLCBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9uZXcpLCB2YWx1ZSk7XG4gXHR9XG4gXG4tXHRsX25ldy1cdTAwM2VoYXNoID0gaGFzaDtcbitcdGh0YWJfZWxlbV9zZXRfaGFzaChodGFiLCBsX25ldywgaGFzaCk7XG4gXHRyZXR1cm4gbF9uZXc7XG4gZGVjX2NvdW50OlxuIFx0ZGVjX2VsZW1fY291bnQoaHRhYik7XG5AQCAtMTE5OSw3ICsxMzE4LDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBcdFx0aWYgKHVubGlrZWx5KCFidGZfcmVjb3JkX2hhc19maWVsZChtYXAtXHUwMDNlcmVjb3JkLCBCUEZfU1BJTl9MT0NLKSkpXG4gXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gXHRcdC8qIGZpbmQgYW4gZWxlbWVudCB3aXRob3V0IHRha2luZyB0aGUgYnVja2V0IGxvY2sgKi9cbi1cdFx0bF9vbGQgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSxcbitcdFx0bF9vbGQgPSBsb29rdXBfbnVsbHNfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSxcbiBcdFx0XHRcdFx0ICAgICAgaHRhYi1cdTAwM2VuX2J1Y2tldHMpO1xuIFx0XHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcbiBcdFx0aWYgKHJldClcbkBAIC0xMjA3LDcgKzEzMjYsNyBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLFxuIFx0XHRpZiAobF9vbGQpIHtcbiBcdFx0XHQvKiBncmFiIHRoZSBlbGVtZW50IGxvY2sgYW5kIHVwZGF0ZSB2YWx1ZSBpbiBwbGFjZSAqL1xuIFx0XHRcdGNvcHlfbWFwX3ZhbHVlX2xvY2tlZChtYXAsXG4tXHRcdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpLFxuK1x0XHRcdFx0XHQgICAgICBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0XHQgICAgICB2YWx1ZSwgZmFsc2UpO1xuIFx0XHRcdHJldHVybiAwO1xuIFx0XHR9XG5AQCAtMTIyMSw3ICsxMzQwLDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG4tXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbitcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuQEAgLTEyMzUsNyArMTM1NCw3IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHRcdCAqIGFuZCB1cGRhdGUgZWxlbWVudCBpbiBwbGFjZVxuIFx0XHQgKi9cbiBcdFx0Y29weV9tYXBfdmFsdWVfbG9ja2VkKG1hcCxcbi1cdFx0XHRcdCAgICAgIGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpLFxuK1x0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGxfb2xkKSxcbiBcdFx0XHRcdCAgICAgIHZhbHVlLCBmYWxzZSk7XG4gXHRcdHJldCA9IDA7XG4gXHRcdGdvdG8gZXJyO1xuQEAgLTEyNTIsOSArMTM3MSw5IEBAIHN0YXRpYyBsb25nIGh0YWJfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gXHQvKiBhZGQgbmV3IGVsZW1lbnQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QsIHNvIHRoYXRcbiBcdCAqIGNvbmN1cnJlbnQgc2VhcmNoIHdpbGwgZmluZCBpdCBiZWZvcmUgb2xkIGVsZW1cbiBcdCAqL1xuLVx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZWhhc2hfbm9kZSwgaGVhZCk7XG4rXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlbm9kZS5oYXNoX25vZGUsIGhlYWQpO1xuIFx0aWYgKGxfb2xkKSB7XG4tXHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bF9vbGQtXHUwMDNlaGFzaF9ub2RlKTtcbitcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsX29sZC1cdTAwM2Vub2RlLmhhc2hfbm9kZSk7XG4gXG4gXHRcdC8qIGxfb2xkIGhhcyBhbHJlYWR5IGJlZW4gc3Rhc2hlZCBpbiBodGFiLVx1MDAzZWV4dHJhX2VsZW1zLCBjYW5jZWxcbiBcdFx0ICogaXRzIHJldXNhYmxlIHNwZWNpYWwgZmllbGRzIGJlZm9yZSBpdCBpcyBhdmFpbGFibGUgZm9yIHJldXNlLlxuQEAgLTEyNzUsNyArMTM5NCw3IEBAIHN0YXRpYyB2b2lkIGh0YWJfbHJ1X3B1c2hfZnJlZShzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIsIHN0cnVjdCBodGFiX2VsZW0gKmVsZW0pXG4ge1xuIFx0Y2hlY2tfYW5kX2NhbmNlbF9maWVsZHMoaHRhYiwgZWxlbSk7XG4gXHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbi1cdGJwZl9scnVfcHVzaF9mcmVlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBcdTAwMjZlbGVtLVx1MDAzZWxydV9ub2RlKTtcbitcdGJwZl9scnVfcHVzaF9mcmVlKFx1MDAyNmh0YWItXHUwMDNlbHJ1LCBodGFiX2VsZW1fbHJ1X25vZGUoZWxlbSkpO1xuIH1cbiBcbiBzdGF0aWMgbG9uZyBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB2b2lkICp2YWx1ZSxcbkBAIC0xMzEwLDEzICsxNDI5LDEzIEBAIHN0YXRpYyBsb25nIGh0YWJfbHJ1X21hcF91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlXG4gXHRsX25ldyA9IHByZWFsbG9jX2xydV9wb3AoaHRhYiwga2V5LCBoYXNoKTtcbiBcdGlmICghbF9uZXcpXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuLVx0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShsX25ldywgbWFwLVx1MDAzZWtleV9zaXplKSwgdmFsdWUpO1xuK1x0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX25ldyksIHZhbHVlKTtcbiBcbiBcdHJldCA9IGh0YWJfbG9ja19idWNrZXQoYiwgXHUwMDI2ZmxhZ3MpO1xuIFx0aWYgKHJldClcbiBcdFx0Z290byBlcnJfbG9ja19idWNrZXQ7XG4gXG4tXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbitcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuQEAgLTEzMjUsMTAgKzE0NDQsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWVcbiBcdC8qIGFkZCBuZXcgZWxlbWVudCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgc28gdGhhdFxuIFx0ICogY29uY3VycmVudCBzZWFyY2ggd2lsbCBmaW5kIGl0IGJlZm9yZSBvbGQgZWxlbVxuIFx0ICovXG4tXHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlaGFzaF9ub2RlLCBoZWFkKTtcbitcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2Vub2RlLmhhc2hfbm9kZSwgaGVhZCk7XG4gXHRpZiAobF9vbGQpIHtcbi1cdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXHUwMDI2bF9uZXctXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZWhhc2hfbm9kZSk7XG4rXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsX25ldykpO1xuK1x0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmxfb2xkLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcdH1cbiBcdHJldCA9IDA7XG4gXG5AQCAtMTM4Myw3ICsxNTAyLDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuK1x0bF9vbGQgPSBsb29rdXBfZWxlbV9yYXcoaHRhYiwgaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4gXG4gXHRyZXQgPSBjaGVja19mbGFncyhodGFiLCBsX29sZCwgbWFwX2ZsYWdzKTtcbiBcdGlmIChyZXQpXG5AQCAtMTM5MiwxMCArMTUxMSwxMCBAQCBzdGF0aWMgbG9uZyBodGFiX21hcF91cGRhdGVfZWxlbV9pbl9wbGFjZShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXG4gXHRpZiAobF9vbGQpIHtcbiBcdFx0LyogVXBkYXRlIHZhbHVlIGluLXBsYWNlICovXG4gXHRcdGlmIChwZXJjcHUpIHtcbi1cdFx0XHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIobF9vbGQsIGtleV9zaXplKSxcbitcdFx0XHRwY3B1X2NvcHlfdmFsdWUoaHRhYiwgaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbF9vbGQpLFxuIFx0XHRcdFx0XHR2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdHZvaWQgKippbm5lcl9tYXBfcHB0ciA9IGh0YWJfZWxlbV92YWx1ZShsX29sZCwga2V5X3NpemUpO1xuK1x0XHRcdHZvaWQgKippbm5lcl9tYXBfcHB0ciA9IGh0YWJfZWxlbV92YWx1ZShodGFiLCBsX29sZCk7XG4gXG4gXHRcdFx0b2xkX21hcF9wdHIgPSAqaW5uZXJfbWFwX3BwdHI7XG4gXHRcdFx0V1JJVEVfT05DRSgqaW5uZXJfbWFwX3BwdHIsICoodm9pZCAqKil2YWx1ZSk7XG5AQCAtMTQwNyw3ICsxNTI2LDcgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfdXBkYXRlX2VsZW1faW5fcGxhY2Uoc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0XHRcdHJldCA9IFBUUl9FUlIobF9uZXcpO1xuIFx0XHRcdGdvdG8gZXJyO1xuIFx0XHR9XG4tXHRcdGhsaXN0X251bGxzX2FkZF9oZWFkX3JjdShcdTAwMjZsX25ldy1cdTAwM2VoYXNoX25vZGUsIGhlYWQpO1xuK1x0XHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlbm9kZS5oYXNoX25vZGUsIGhlYWQpO1xuIFx0fVxuIGVycjpcbiBcdGh0YWJfdW5sb2NrX2J1Y2tldChiLCBmbGFncyk7XG5AQCAtMTQ1NiwyMiArMTU3NSwyMiBAQCBzdGF0aWMgbG9uZyBfX2h0YWJfbHJ1X3BlcmNwdV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0Z290byBlcnJfbG9ja19idWNrZXQ7XG4gXG4tXHRsX29sZCA9IGxvb2t1cF9lbGVtX3JhdyhoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbitcdGxfb2xkID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFxuIFx0cmV0ID0gY2hlY2tfZmxhZ3MoaHRhYiwgbF9vbGQsIG1hcF9mbGFncyk7XG4gXHRpZiAocmV0KVxuIFx0XHRnb3RvIGVycjtcbiBcbiBcdGlmIChsX29sZCkge1xuLVx0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihcdTAwMjZsX29sZC1cdTAwM2VscnVfbm9kZSk7XG4rXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKGh0YWJfZWxlbV9scnVfbm9kZShsX29sZCkpO1xuIFxuIFx0XHQvKiBwZXItY3B1IGhhc2ggbWFwIGNhbiB1cGRhdGUgdmFsdWUgaW4tcGxhY2UgKi9cbi1cdFx0cGNwdV9jb3B5X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfb2xkLCBrZXlfc2l6ZSksXG4rXHRcdHBjcHVfY29weV92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsX29sZCksXG4gXHRcdFx0XHR2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xuIFx0fSBlbHNlIHtcbi1cdFx0cGNwdV9pbml0X3ZhbHVlKGh0YWIsIGh0YWJfZWxlbV9nZXRfcHRyKGxfbmV3LCBrZXlfc2l6ZSksXG4rXHRcdHBjcHVfaW5pdF92YWx1ZShodGFiLCBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsX25ldyksXG4gXHRcdFx0XHR2YWx1ZSwgb25hbGxjcHVzLCBtYXBfZmxhZ3MpO1xuLVx0XHRobGlzdF9udWxsc19hZGRfaGVhZF9yY3UoXHUwMDI2bF9uZXctXHUwMDNlaGFzaF9ub2RlLCBoZWFkKTtcbitcdFx0aGxpc3RfbnVsbHNfYWRkX2hlYWRfcmN1KFx1MDAyNmxfbmV3LVx1MDAzZW5vZGUuaGFzaF9ub2RlLCBoZWFkKTtcbiBcdFx0bF9uZXcgPSBOVUxMO1xuIFx0fVxuIFx0cmV0ID0gMDtcbkBAIC0xNDgwLDcgKzE1OTksNyBAQCBzdGF0aWMgbG9uZyBfX2h0YWJfbHJ1X3BlcmNwdV9tYXBfdXBkYXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIGVycl9sb2NrX2J1Y2tldDpcbiBcdGlmIChsX25ldykge1xuIFx0XHRicGZfbWFwX2RlY19lbGVtX2NvdW50KFx1MDAyNmh0YWItXHUwMDNlbWFwKTtcbi1cdFx0YnBmX2xydV9wdXNoX2ZyZWUoXHUwMDI2aHRhYi1cdTAwM2VscnUsIFx1MDAyNmxfbmV3LVx1MDAzZWxydV9ub2RlKTtcbitcdFx0YnBmX2xydV9wdXNoX2ZyZWUoXHUwMDI2aHRhYi1cdTAwM2VscnUsIGh0YWJfZWxlbV9scnVfbm9kZShsX25ldykpO1xuIFx0fVxuIFx0cmV0dXJuIHJldDtcbiB9XG5AQCAtMTUyMSw5ICsxNjQwLDkgQEAgc3RhdGljIGxvbmcgaHRhYl9tYXBfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4rXHRsID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFx0aWYgKGwpXG4tXHRcdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2VoYXNoX25vZGUpO1xuK1x0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xuIFx0ZWxzZVxuIFx0XHRyZXQgPSAtRU5PRU5UO1xuIFxuQEAgLTE1NTYsMTAgKzE2NzUsMTAgQEAgc3RhdGljIGxvbmcgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBcdGlmIChyZXQpXG4gXHRcdHJldHVybiByZXQ7XG4gXG4tXHRsID0gbG9va3VwX2VsZW1fcmF3KGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuK1x0bCA9IGxvb2t1cF9lbGVtX3JhdyhodGFiLCBoZWFkLCBoYXNoLCBrZXksIGtleV9zaXplKTtcbiBcbiBcdGlmIChsKVxuLVx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlaGFzaF9ub2RlKTtcbitcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcdGVsc2VcbiBcdFx0cmV0ID0gLUVOT0VOVDtcbiBcbkBAIC0xNTgxLDggKzE3MDAsOCBAQCBzdGF0aWMgdm9pZCBkZWxldGVfYWxsX2VsZW1lbnRzKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcbiBcdFx0c3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47XG4gXHRcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4tXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcbitcdFx0XHRobGlzdF9udWxsc19kZWxfcmN1KFx1MDAyNmwtXHUwMDNlbm9kZS5oYXNoX25vZGUpO1xuIFx0XHRcdGh0YWJfZWxlbV9mcmVlKGh0YWIsIGwpO1xuIFx0XHR9XG4gXHRcdGNvbmRfcmVzY2hlZCgpO1xuQEAgLTE1OTksMTAgKzE3MTgsMTAgQEAgc3RhdGljIHZvaWQgaHRhYl9mcmVlX21hbGxvY2VkX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9odGFiICpodGFiKVxuIFx0XHRzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjtcbiBcdFx0c3RydWN0IGh0YWJfZWxlbSAqbDtcbiBcbi1cdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKSB7XG4gXHRcdFx0LyogV2Ugb25seSBmcmVlIGludGVybmFsIHN0cnVjdHMgb24gdXJlZiBkcm9wcGluZyB0byB6ZXJvICovXG4gXHRcdFx0YnBmX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoXHUwMDI2aHRhYi1cdTAwM2VtYXAsXG4tXHRcdFx0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGwsIGh0YWItXHUwMDNlbWFwLmtleV9zaXplKSk7XG4rXHRcdFx0XHRcdFx0ICAgICAgaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpKTtcbiBcdFx0fVxuIFx0XHRjb25kX3Jlc2NoZWRfcmN1KCk7XG4gXHR9XG5AQCAtMTY5Nyw3ICsxODE2LDcgQEAgc3RhdGljIGludCBfX2h0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0aWYgKHJldClcbiBcdFx0cmV0dXJuIHJldDtcbiBcbi1cdGwgPSBsb29rdXBfZWxlbV9yYXcoaGVhZCwgaGFzaCwga2V5LCBrZXlfc2l6ZSk7XG4rXHRsID0gbG9va3VwX2VsZW1fcmF3KGh0YWIsIGhlYWQsIGhhc2gsIGtleSwga2V5X3NpemUpO1xuIFx0aWYgKCFsKSB7XG4gXHRcdHJldCA9IC1FTk9FTlQ7XG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbkBAIC0xNzA4LDE0ICsxODI3LDE0IEBAIHN0YXRpYyBpbnQgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcdFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcdFx0aW50IG9mZiA9IDAsIGNwdTtcbiBcbi1cdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGwsIGtleV9zaXplKTtcbitcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdFx0Y29weV9tYXBfdmFsdWVfbG9uZyhcdTAwMjZodGFiLVx1MDAzZW1hcCwgdmFsdWUgKyBvZmYsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuIFx0XHRcdGNoZWNrX2FuZF9pbml0X21hcF92YWx1ZShcdTAwMjZodGFiLVx1MDAzZW1hcCwgdmFsdWUgKyBvZmYpO1xuIFx0XHRcdG9mZiArPSByb3VuZHVwX3ZhbHVlX3NpemU7XG4gXHRcdH1cbiBcdH0gZWxzZSB7XG4tXHRcdHZvaWQgKnNyYyA9IGh0YWJfZWxlbV92YWx1ZShsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0XHR2b2lkICpzcmMgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgbCk7XG4gXG4gXHRcdGlmIChmbGFncyBcdTAwMjYgQlBGX0ZfTE9DSylcbiBcdFx0XHRjb3B5X21hcF92YWx1ZV9sb2NrZWQobWFwLCB2YWx1ZSwgc3JjLCB0cnVlKTtcbkBAIC0xNzI0LDcgKzE4NDMsNyBAQCBzdGF0aWMgaW50IF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksXG4gXHRcdC8qIFplcm9pbmcgc3BlY2lhbCBmaWVsZHMgaW4gdGhlIHRlbXAgYnVmZmVyICovXG4gXHRcdGNoZWNrX2FuZF9pbml0X21hcF92YWx1ZShtYXAsIHZhbHVlKTtcbiBcdH1cbi1cdGhsaXN0X251bGxzX2RlbF9yY3UoXHUwMDI2bC1cdTAwM2VoYXNoX25vZGUpO1xuK1x0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBvdXRfdW5sb2NrOlxuIFx0aHRhYl91bmxvY2tfYnVja2V0KGIsIGJmbGFncyk7XG5AQCAtMTg2MCw3ICsxOTc5LDcgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0fVxuIFxuIFx0YnVja2V0X2NudCA9IDA7XG4tXHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UobCwgbiwgaGVhZCwgaGFzaF9ub2RlKVxuK1x0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGwsIG4sIGhlYWQsIG5vZGUuaGFzaF9ub2RlKVxuIFx0XHRidWNrZXRfY250Kys7XG4gXG4gXHRpZiAoYnVja2V0X2NudCBcdTAwMjZcdTAwMjYgIWxvY2tlZCkge1xuQEAgLTE4OTcsMTQgKzIwMTYsMTQgQEAgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaChzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuIFx0aWYgKCFsb2NrZWQpXG4gXHRcdGdvdG8gbmV4dF9iYXRjaDtcbiBcbi1cdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUobCwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4tXHRcdG1lbWNweShkc3Rfa2V5LCBsLVx1MDAzZWtleSwga2V5X3NpemUpO1xuK1x0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuK1x0XHRtZW1jcHkoZHN0X2tleSwgaHRhYl9lbGVtX2tleShodGFiLCBsKSwga2V5X3NpemUpO1xuIFxuIFx0XHRpZiAoaXNfcGVyY3B1KSB7XG4gXHRcdFx0aW50IG9mZiA9IDAsIGNwdTtcbiBcdFx0XHR2b2lkIF9fcGVyY3B1ICpwcHRyO1xuIFxuLVx0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBsKTtcbiBcdFx0XHRpZiAoZWxlbV9tYXBfZmxhZ3MgXHUwMDI2IEJQRl9GX0NQVSkge1xuIFx0XHRcdFx0Y3B1ID0gZWxlbV9tYXBfZmxhZ3MgXHUwMDNlXHUwMDNlIDMyO1xuIFx0XHRcdFx0Y29weV9tYXBfdmFsdWUoXHUwMDI2aHRhYi1cdTAwM2VtYXAsIGRzdF92YWwsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuQEAgLTE5MTgsNyArMjAzNyw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdH1cbiBcdFx0XHR9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0dmFsdWUgPSBodGFiX2VsZW1fdmFsdWUobCwga2V5X3NpemUpO1xuK1x0XHRcdHZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGh0YWIsIGwpO1xuIFx0XHRcdGlmIChpc19mZF9odGFiKGh0YWIpKSB7XG4gXHRcdFx0XHRzdHJ1Y3QgYnBmX21hcCAqKmlubmVyX21hcCA9IHZhbHVlO1xuIFxuQEAgLTE5MzYsNyArMjA1NSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRjaGVja19hbmRfaW5pdF9tYXBfdmFsdWUobWFwLCBkc3RfdmFsKTtcbiBcdFx0fVxuIFx0XHRpZiAoZG9fZGVsZXRlKSB7XG4tXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZWhhc2hfbm9kZSk7XG4rXHRcdFx0aGxpc3RfbnVsbHNfZGVsX3JjdShcdTAwMjZsLVx1MDAzZW5vZGUuaGFzaF9ub2RlKTtcbiBcbiBcdFx0XHQvKiBicGZfbHJ1X3B1c2hfZnJlZSgpIHdpbGwgYWNxdWlyZSBscnVfbG9jaywgd2hpY2hcbiBcdFx0XHQgKiBtYXkgY2F1c2UgZGVhZGxvY2suIFNlZSBjb21tZW50cyBpbiBmdW5jdGlvblxuQEAgLTE5NDgsNyArMjA2Nyw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHQgKiBsb2NrIGJlaW5nIGhlbGQgYW5kIGl0IHZpb2xhdGVzIHRoZSBsb2NrIHJ1bGUsIHNvXG4gXHRcdFx0ICogaW52b2tlIGZyZWVfaHRhYl9lbGVtKCkgYWZ0ZXIgdW5sb2NrIGFzIHdlbGwuXG4gXHRcdFx0ICovXG4tXHRcdFx0bC1cdTAwM2ViYXRjaF9mbGluayA9IG5vZGVfdG9fZnJlZTtcbitcdFx0XHRsLVx1MDAzZW5vZGUuYmF0Y2hfZmxpbmsgPSBub2RlX3RvX2ZyZWU7XG4gXHRcdFx0bm9kZV90b19mcmVlID0gbDtcbiBcdFx0fVxuIFx0XHRkc3Rfa2V5ICs9IGtleV9zaXplO1xuQEAgLTE5NjAsNyArMjA3OSw3IEBAIF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2goc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcbiBcdHdoaWxlIChub2RlX3RvX2ZyZWUpIHtcbiBcdFx0bCA9IG5vZGVfdG9fZnJlZTtcbi1cdFx0bm9kZV90b19mcmVlID0gbm9kZV90b19mcmVlLVx1MDAzZWJhdGNoX2ZsaW5rO1xuK1x0XHRub2RlX3RvX2ZyZWUgPSBub2RlX3RvX2ZyZWUtXHUwMDNlbm9kZS5iYXRjaF9mbGluaztcbiBcdFx0aWYgKGlzX2xydV9tYXApXG4gXHRcdFx0aHRhYl9scnVfcHVzaF9mcmVlKGh0YWIsIGwpO1xuIFx0XHRlbHNlXG5AQCAtMjEwOCw4ICsyMjI3LDggQEAgYnBmX2hhc2hfbWFwX3NlcV9maW5kX25leHQoc3RydWN0IGJwZl9pdGVyX3NlcV9oYXNoX21hcF9pbmZvICppbmZvLFxuIFx0XHQvKiBubyB1cGRhdGUvZGVsZXRpb24gb24gdGhpcyBidWNrZXQsIHByZXZfZWxlbSBzaG91bGQgYmUgc3RpbGwgdmFsaWRcbiBcdFx0ICogYW5kIHdlIHdvbid0IHNraXAgZWxlbWVudHMuXG4gXHRcdCAqL1xuLVx0XHRuID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhobGlzdF9udWxsc19uZXh0X3JjdShcdTAwMjZwcmV2X2VsZW0tXHUwMDNlaGFzaF9ub2RlKSk7XG4tXHRcdGVsZW0gPSBobGlzdF9udWxsc19lbnRyeV9zYWZlKG4sIHN0cnVjdCBodGFiX2VsZW0sIGhhc2hfbm9kZSk7XG4rXHRcdG4gPSByY3VfZGVyZWZlcmVuY2VfcmF3KGhsaXN0X251bGxzX25leHRfcmN1KFx1MDAyNnByZXZfZWxlbS1cdTAwM2Vub2RlLmhhc2hfbm9kZSkpO1xuK1x0XHRlbGVtID0gaGxpc3RfbnVsbHNfZW50cnlfc2FmZShuLCBzdHJ1Y3QgaHRhYl9lbGVtLCBub2RlLmhhc2hfbm9kZSk7XG4gXHRcdGlmIChlbGVtKVxuIFx0XHRcdHJldHVybiBlbGVtO1xuIFxuQEAgLTIxMjUsNyArMjI0NCw3IEBAIGJwZl9oYXNoX21hcF9zZXFfZmluZF9uZXh0KHN0cnVjdCBicGZfaXRlcl9zZXFfaGFzaF9tYXBfaW5mbyAqaW5mbyxcbiBcbiBcdFx0Y291bnQgPSAwO1xuIFx0XHRoZWFkID0gXHUwMDI2Yi1cdTAwM2VoZWFkO1xuLVx0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9yY3UoZWxlbSwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShlbGVtLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuIFx0XHRcdGlmIChjb3VudCBcdTAwM2U9IHNraXBfZWxlbXMpIHtcbiBcdFx0XHRcdGluZm8tXHUwMDNlYnVja2V0X2lkID0gaTtcbiBcdFx0XHRcdGluZm8tXHUwMDNlc2tpcF9lbGVtcyA9IGNvdW50O1xuQEAgLTIxODMsMTIgKzIzMDIsMTIgQEAgc3RhdGljIGludCBfX2JwZl9oYXNoX21hcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IGh0YWJfZWxlbSAqZWxlbSlcbiBcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuIFx0XHRjdHgubWFwID0gaW5mby1cdTAwM2VtYXA7XG4gXHRcdGlmIChlbGVtKSB7XG4tXHRcdFx0Y3R4LmtleSA9IGVsZW0tXHUwMDNla2V5O1xuK1x0XHRcdGN0eC5rZXkgPSBodGFiX2VsZW1fa2V5KGluZm8tXHUwMDNlaHRhYiwgZWxlbSk7XG4gXHRcdFx0aWYgKCFpbmZvLVx1MDAzZXBlcmNwdV92YWx1ZV9idWYpIHtcbi1cdFx0XHRcdGN0eC52YWx1ZSA9IGh0YWJfZWxlbV92YWx1ZShlbGVtLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0XHRcdFx0Y3R4LnZhbHVlID0gaHRhYl9lbGVtX3ZhbHVlKGluZm8tXHUwMDNlaHRhYiwgZWxlbSk7XG4gXHRcdFx0fSBlbHNlIHtcbiBcdFx0XHRcdHJvdW5kdXBfdmFsdWVfc2l6ZSA9IHJvdW5kX3VwKG1hcC1cdTAwM2V2YWx1ZV9zaXplLCA4KTtcbi1cdFx0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihlbGVtLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0XHRcdFx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGluZm8tXHUwMDNlaHRhYiwgZWxlbSk7XG4gXHRcdFx0XHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdFx0XHRcdGNvcHlfbWFwX3ZhbHVlX2xvbmcobWFwLCBpbmZvLVx1MDAzZXBlcmNwdV92YWx1ZV9idWYgKyBvZmYsXG4gXHRcdFx0XHRcdFx0XHQgICAgcGVyX2NwdV9wdHIocHB0ciwgY3B1KSk7XG5AQCAtMjI5MiwxNCArMjQxMSwxNCBAQCBzdGF0aWMgbG9uZyBicGZfZm9yX2VhY2hfaGFzaF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIGJwZl9jYWxsYmFja190IGNhbGxiYWNrX1xuIFx0XHRiID0gXHUwMDI2aHRhYi1cdTAwM2VidWNrZXRzW2ldO1xuIFx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gXHRcdGhlYWQgPSBcdTAwMjZiLVx1MDAzZWhlYWQ7XG4tXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgbiwgaGVhZCwgaGFzaF9ub2RlKSB7XG4tXHRcdFx0a2V5ID0gZWxlbS1cdTAwM2VrZXk7XG4rXHRcdGhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3NhZmUoZWxlbSwgbiwgaGVhZCwgbm9kZS5oYXNoX25vZGUpIHtcbitcdFx0XHRrZXkgPSBodGFiX2VsZW1fa2V5KGh0YWIsIGVsZW0pO1xuIFx0XHRcdGlmIChpc19wZXJjcHUpIHtcbiBcdFx0XHRcdC8qIGN1cnJlbnQgY3B1IHZhbHVlIGZvciBwZXJjcHUgbWFwICovXG4tXHRcdFx0XHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoZWxlbSwgbWFwLVx1MDAzZWtleV9zaXplKTtcbitcdFx0XHRcdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihodGFiLCBlbGVtKTtcbiBcdFx0XHRcdHZhbCA9IHRoaXNfY3B1X3B0cihwcHRyKTtcbiBcdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0dmFsID0gaHRhYl9lbGVtX3ZhbHVlKGVsZW0sIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRcdFx0XHR2YWwgPSBodGFiX2VsZW1fdmFsdWUoaHRhYiwgZWxlbSk7XG4gXHRcdFx0fVxuIFx0XHRcdG51bV9lbGVtcysrO1xuIFx0XHRcdHJldCA9IGNhbGxiYWNrX2ZuKCh1NjQpKGxvbmcpbWFwLCAodTY0KShsb25nKWtleSxcbkBAIC0yNDAzLDEwICsyNTIyLDExIEBAIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX2xydV9tYXBfb3BzID0ge1xuIC8qIENhbGxlZCBmcm9tIGVCUEYgcHJvZ3JhbSAqL1xuIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSkpO1xuK1x0XHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpKTtcbiBcdGVsc2VcbiBcdFx0cmV0dXJuIE5VTEw7XG4gfVxuQEAgLTI0MTQsNiArMjUzNCw3IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIC8qIGlubGluZSBicGZfbWFwX2xvb2t1cF9lbGVtKCkgY2FsbCBmb3IgcGVyLUNQVSBoYXNobWFwICovXG4gc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmKVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmO1xuIFxuIFx0aWYgKCFicGZfaml0X3N1cHBvcnRzX3BlcmNwdV9pbnNuKCkpXG5AQCAtMjQyNCw3ICsyNTQ1LDcgQEAgc3RhdGljIGludCBodGFiX3BlcmNwdV9tYXBfZ2VuX2xvb2t1cChzdHJ1Y3QgYnBmX21hcCAqbWFwLCBzdHJ1Y3QgYnBmX2luc24gKmluc25cbiBcdCppbnNuKysgPSBCUEZfRU1JVF9DQUxMKF9faHRhYl9tYXBfbG9va3VwX2VsZW0pO1xuIFx0Kmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMyk7XG4gXHQqaW5zbisrID0gQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsXG4tXHRcdFx0XHRvZmZzZXRvZihzdHJ1Y3QgaHRhYl9lbGVtLCBrZXkpICsgcm91bmR1cChtYXAtXHUwMDNla2V5X3NpemUsIDgpKTtcbitcdFx0XHRcdGh0YWItXHUwMDNla2V5X29mZnNldCArIHJvdW5kdXAobWFwLVx1MDAzZWtleV9zaXplLCA4KSk7XG4gXHQqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfMCwgMCk7XG4gXHQqaW5zbisrID0gQlBGX01PVjY0X1BFUkNQVV9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzApO1xuIFxuQEAgLTI0MzMsNiArMjU1NCw3IEBAIHN0YXRpYyBpbnQgaHRhYl9wZXJjcHVfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGJwZl9pbnNuICppbnNuXG4gXG4gc3RhdGljIHZvaWQgKmh0YWJfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB1MzIgY3B1KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4gXHRpZiAoY3B1IFx1MDAzZT0gbnJfY3B1X2lkcylcbkBAIC0yNDQwLDE4ICsyNTYyLDE5IEBAIHN0YXRpYyB2b2lkICpodGFiX3BlcmNwdV9tYXBfbG9va3VwX3BlcmNwdV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSxcbiBcbiBcdGwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcdGlmIChsKVxuLVx0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIobCwgbWFwLVx1MDAzZWtleV9zaXplKSwgY3B1KTtcbitcdFx0cmV0dXJuIHBlcl9jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpLCBjcHUpO1xuIFx0ZWxzZVxuIFx0XHRyZXR1cm4gTlVMTDtcbiB9XG4gXG4gc3RhdGljIHZvaWQgKmh0YWJfbHJ1X3BlcmNwdV9tYXBfbG9va3VwX2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmwgPSBfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTtcbiBcbiBcdGlmIChsKSB7XG4tXHRcdGJwZl9scnVfbm9kZV9zZXRfcmVmKFx1MDAyNmwtXHUwMDNlbHJ1X25vZGUpO1xuLVx0XHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSkpO1xuK1x0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobCkpO1xuK1x0XHRyZXR1cm4gdGhpc19jcHVfcHRyKGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpKTtcbiBcdH1cbiBcbiBcdHJldHVybiBOVUxMO1xuQEAgLTI0NTksNiArMjU4Miw3IEBAIHN0YXRpYyB2b2lkICpodGFiX2xydV9wZXJjcHVfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBcbiBzdGF0aWMgdm9pZCAqaHRhYl9scnVfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LCB1MzIgY3B1KVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXG4gXHRpZiAoY3B1IFx1MDAzZT0gbnJfY3B1X2lkcylcbkBAIC0yNDY2LDggKzI1OTAsOCBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa1xuIFxuIFx0bCA9IF9faHRhYl9tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpO1xuIFx0aWYgKGwpIHtcbi1cdFx0YnBmX2xydV9ub2RlX3NldF9yZWYoXHUwMDI2bC1cdTAwM2VscnVfbm9kZSk7XG4tXHRcdHJldHVybiBwZXJfY3B1X3B0cihodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpLCBjcHUpO1xuK1x0XHRicGZfbHJ1X25vZGVfc2V0X3JlZihodGFiX2VsZW1fbHJ1X25vZGUobCkpO1xuK1x0XHRyZXR1cm4gcGVyX2NwdV9wdHIoaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCksIGNwdSk7XG4gXHR9XG4gXG4gXHRyZXR1cm4gTlVMTDtcbkBAIC0yNDc1LDYgKzI1OTksNyBAQCBzdGF0aWMgdm9pZCAqaHRhYl9scnVfcGVyY3B1X21hcF9sb29rdXBfcGVyY3B1X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa1xuIFxuIGludCBicGZfcGVyY3B1X2hhc2hfY29weShzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICprZXksIHZvaWQgKnZhbHVlLCB1NjQgbWFwX2ZsYWdzKVxuIHtcbitcdHN0cnVjdCBicGZfaHRhYiAqaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbiBcdHN0cnVjdCBodGFiX2VsZW0gKmw7XG4gXHR2b2lkIF9fcGVyY3B1ICpwcHRyO1xuIFx0aW50IHJldCA9IC1FTk9FTlQ7XG5AQCAtMjQ5NCw3ICsyNjE5LDcgQEAgaW50IGJwZl9wZXJjcHVfaGFzaF9jb3B5KHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsIHU2NCBtYXBfZmxcbiBcdC8qIFdlIGRvIG5vdCBtYXJrIExSVSBtYXAgZWxlbWVudCBoZXJlIGluIG9yZGVyIHRvIG5vdCBtZXNzIHVwXG4gXHQgKiBldmljdGlvbiBoZXVyaXN0aWNzIHdoZW4gdXNlciBzcGFjZSBkb2VzIGEgbWFwIHdhbGsuXG4gXHQgKi9cbi1cdHBwdHIgPSBodGFiX2VsZW1fZ2V0X3B0cihsLCBtYXAtXHUwMDNla2V5X3NpemUpO1xuK1x0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGh0YWIsIGwpO1xuIFx0aWYgKG1hcF9mbGFncyBcdTAwMjYgQlBGX0ZfQ1BVKSB7XG4gXHRcdGNwdSA9IG1hcF9mbGFncyBcdTAwM2VcdTAwM2UgMzI7XG4gXHRcdGNvcHlfbWFwX3ZhbHVlKG1hcCwgdmFsdWUsIHBlcl9jcHVfcHRyKHBwdHIsIGNwdSkpO1xuQEAgLTI1MzIsNiArMjY1Nyw3IEBAIGludCBicGZfcGVyY3B1X2hhc2hfdXBkYXRlKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSwgdm9pZCAqdmFsdWUsXG4gc3RhdGljIHZvaWQgaHRhYl9wZXJjcHVfbWFwX3NlcV9zaG93X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFx0XHRcdFx0XHQgIHN0cnVjdCBzZXFfZmlsZSAqbSlcbiB7XG4rXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgaHRhYl9lbGVtICpsO1xuIFx0dm9pZCBfX3BlcmNwdSAqcHB0cjtcbiBcdGludCBjcHU7XG5AQCAtMjU0Niw3ICsyNjcyLDcgQEAgc3RhdGljIHZvaWQgaHRhYl9wZXJjcHVfbWFwX3NlcV9zaG93X2VsZW0oc3RydWN0IGJwZl9tYXAgKm1hcCwgdm9pZCAqa2V5LFxuIFxuIFx0YnRmX3R5cGVfc2VxX3Nob3cobWFwLVx1MDAzZWJ0ZiwgbWFwLVx1MDAzZWJ0Zl9rZXlfdHlwZV9pZCwga2V5LCBtKTtcbiBcdHNlcV9wdXRzKG0sIFwiOiB7XFxuXCIpO1xuLVx0cHB0ciA9IGh0YWJfZWxlbV9nZXRfcHRyKGwsIG1hcC1cdTAwM2VrZXlfc2l6ZSk7XG4rXHRwcHRyID0gaHRhYl9lbGVtX2dldF9wdHIoaHRhYiwgbCk7XG4gXHRmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7XG4gXHRcdHNlcV9wcmludGYobSwgXCJcXHRjcHUlZDogXCIsIGNwdSk7XG4gXHRcdGJ0Zl90eXBlX3NlcV9zaG93KG1hcC1cdTAwM2VidGYsIG1hcC1cdTAwM2VidGZfdmFsdWVfdHlwZV9pZCxcbkBAIC0yNjE5LDggKzI3NDUsOCBAQCBzdGF0aWMgdm9pZCBmZF9odGFiX21hcF9mcmVlKHN0cnVjdCBicGZfbWFwICptYXApXG4gXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBodGFiLVx1MDAzZW5fYnVja2V0czsgaSsrKSB7XG4gXHRcdGhlYWQgPSBzZWxlY3RfYnVja2V0KGh0YWIsIGkpO1xuIFxuLVx0XHRobGlzdF9udWxsc19mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIG4sIGhlYWQsIGhhc2hfbm9kZSkge1xuLVx0XHRcdHZvaWQgKnB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIobWFwLCBsKTtcbitcdFx0aGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfc2FmZShsLCBuLCBoZWFkLCBub2RlLmhhc2hfbm9kZSkge1xuK1x0XHRcdHZvaWQgKnB0ciA9IGZkX2h0YWJfbWFwX2dldF9wdHIoaHRhYiwgbCk7XG4gXG4gXHRcdFx0bWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZmRfcHV0X3B0cihtYXAsIHB0ciwgZmFsc2UpO1xuIFx0XHR9XG5AQCAtMjcwNSw2ICsyODMxLDcgQEAgc3RhdGljIHZvaWQgKmh0YWJfb2ZfbWFwX2xvb2t1cF9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsIHZvaWQgKmtleSlcbiBzdGF0aWMgaW50IGh0YWJfb2ZfbWFwX2dlbl9sb29rdXAoc3RydWN0IGJwZl9tYXAgKm1hcCxcbiBcdFx0XHRcdCAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZilcbiB7XG4rXHRzdHJ1Y3QgYnBmX2h0YWIgKmh0YWIgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2h0YWIsIG1hcCk7XG4gXHRzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBpbnNuX2J1ZjtcbiBcdGNvbnN0IGludCByZXQgPSBCUEZfUkVHXzA7XG4gXG5AQCAtMjcxMyw3ICsyODQwLDcgQEAgc3RhdGljIGludCBodGFiX29mX21hcF9nZW5fbG9va3VwKHN0cnVjdCBicGZfbWFwICptYXAsXG4gXHQqaW5zbisrID0gQlBGX0VNSVRfQ0FMTChfX2h0YWJfbWFwX2xvb2t1cF9lbGVtKTtcbiBcdCppbnNuKysgPSBCUEZfSk1QX0lNTShCUEZfSkVRLCByZXQsIDAsIDIpO1xuIFx0Kmluc24rKyA9IEJQRl9BTFU2NF9JTU0oQlBGX0FERCwgcmV0LFxuLVx0XHRcdFx0b2Zmc2V0b2Yoc3RydWN0IGh0YWJfZWxlbSwga2V5KSArXG4rXHRcdFx0XHRodGFiLVx1MDAzZWtleV9vZmZzZXQgK1xuIFx0XHRcdFx0cm91bmRfdXAobWFwLVx1MDAzZWtleV9zaXplLCA4KSk7XG4gXHQqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0RXLCByZXQsIHJldCwgMCk7XG4gXG5AQCAtMzExMiw3ICszMjM5LDcgQEAgc3RhdGljIGludCByaHRhYl9tYXBfY2hlY2tfYnRmKHN0cnVjdCBicGZfbWFwICptYXAsIGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiB7XG4gXHRzdHJ1Y3QgYnBmX3JodGFiICpyaHRhYiA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfcmh0YWIsIG1hcCk7XG4gXG4tXHRyZXR1cm4gYnBmX21hX3NldF9kdG9yKG1hcCwgXHUwMDI2cmh0YWItXHUwMDNlbWEsIHJodGFiX21lbV9kdG9yKTtcbitcdHJldHVybiBicGZfbWFfc2V0X2R0b3IobWFwLCBcdTAwMjZyaHRhYi1cdTAwM2VtYSwgcmh0YWJfbWVtX2R0b3IsIG9mZnNldG9mKHN0cnVjdCByaHRhYl9lbGVtLCBkYXRhKSk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHJodGFiX21hcF9mcmVlX2ludGVybmFsX3N0cnVjdHMoc3RydWN0IGJwZl9tYXAgKm1hcClcbkBAIC0zNTMzLDMgKzM2NjAsMTYgQEAgY29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIHJodGFiX21hcF9vcHMgPSB7XG4gXHQubWFwX2J0Zl9pZCA9IFx1MDAyNnJodGFiX21hcF9idGZfaWRzWzBdLFxuIFx0Lml0ZXJfc2VxX2luZm8gPSBcdTAwMjZyaGFzaF9pdGVyX3NlcV9pbmZvLFxuIH07XG4rXG4rc2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZClcbit7XG4rXHRyZXR1cm4gc2l6ZW9mKHN0cnVjdCBicGZfaHRhYik7XG4rfVxuK1xuK3ZvaWQgYnBmX2h0YWJfbWFwX21ldGFfaW5pdChzdHJ1Y3QgYnBmX21hcCAqaW5uZXJfbWFwX21ldGEsIHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXApXG4re1xuK1x0c3RydWN0IGJwZl9odGFiICppbm5lcl9odGFiX21ldGEgPSBjb250YWluZXJfb2YoaW5uZXJfbWFwX21ldGEsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbitcdHN0cnVjdCBicGZfaHRhYiAqaW5uZXJfaHRhYiA9IGNvbnRhaW5lcl9vZihpbm5lcl9tYXAsIHN0cnVjdCBicGZfaHRhYiwgbWFwKTtcbitcbitcdGlubmVyX2h0YWJfbWV0YS1cdTAwM2VrZXlfb2Zmc2V0ID0gaW5uZXJfaHRhYi1cdTAwM2VrZXlfb2Zmc2V0O1xuK31cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuYyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5jXG5pbmRleCBkMmNiYWI0YmRmNjQ0Li5iMmRiNWQwYzk4YmVlIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcbisrKyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5jXG5AQCAtNyw2ICs3LDE1IEBAXG4gXG4gI2luY2x1ZGUgXCJtYXBfaW5fbWFwLmhcIlxuIFxuK3N0YXRpYyBib29sIGJwZl9tYXBfdHlwZV9pc19odGFiKGVudW0gYnBmX21hcF90eXBlIHR5cGUpXG4re1xuK1x0cmV0dXJuIHR5cGUgPT0gQlBGX01BUF9UWVBFX0hBU0ggfHxcbitcdCAgICAgICB0eXBlID09IEJQRl9NQVBfVFlQRV9QRVJDUFVfSEFTSCB8fFxuK1x0ICAgICAgIHR5cGUgPT0gQlBGX01BUF9UWVBFX0xSVV9IQVNIIHx8XG4rXHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfTFJVX1BFUkNQVV9IQVNIIHx8XG4rXHQgICAgICAgdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSF9PRl9NQVBTO1xuK31cbitcbiBzdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9tZXRhX2FsbG9jKGludCBpbm5lcl9tYXBfdWZkKVxuIHtcbiBcdHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXAsICppbm5lcl9tYXBfbWV0YTtcbkBAIC0yOSw2ICszOCw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4gXHQvKiBJbiBzb21lIGNhc2VzIHZlcmlmaWVyIG5lZWRzIHRvIGFjY2VzcyBiZXlvbmQganVzdCBiYXNlIG1hcC4gKi9cbiBcdGlmIChpbm5lcl9tYXAtXHUwMDNlb3BzID09IFx1MDAyNmFycmF5X21hcF9vcHMgfHwgaW5uZXJfbWFwLVx1MDAzZW9wcyA9PSBcdTAwMjZwZXJjcHVfYXJyYXlfbWFwX29wcylcbiBcdFx0aW5uZXJfbWFwX21ldGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnBmX2FycmF5KTtcbitcdGVsc2UgaWYgKGJwZl9tYXBfdHlwZV9pc19odGFiKGlubmVyX21hcC1cdTAwM2VtYXBfdHlwZSkpXG4rXHRcdGlubmVyX21hcF9tZXRhX3NpemUgPSBicGZfaHRhYl9tYXBfbWV0YV9zaXplKCk7XG4gXG4gXHRpbm5lcl9tYXBfbWV0YSA9IGt6YWxsb2MoaW5uZXJfbWFwX21ldGFfc2l6ZSwgR0ZQX1VTRVIpO1xuIFx0aWYgKCFpbm5lcl9tYXBfbWV0YSlcbkBAIC03MCw2ICs4MSw4IEBAIHN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXG4gXHRcdGlubmVyX2FycmF5X21ldGEtXHUwMDNlaW5kZXhfbWFzayA9IGlubmVyX2FycmF5LVx1MDAzZWluZGV4X21hc2s7XG4gXHRcdGlubmVyX2FycmF5X21ldGEtXHUwMDNlZWxlbV9zaXplID0gaW5uZXJfYXJyYXktXHUwMDNlZWxlbV9zaXplO1xuIFx0XHRpbm5lcl9tYXBfbWV0YS1cdTAwM2VieXBhc3Nfc3BlY192MSA9IGlubmVyX21hcC1cdTAwM2VieXBhc3Nfc3BlY192MTtcbitcdH0gZWxzZSBpZiAoYnBmX21hcF90eXBlX2lzX2h0YWIoaW5uZXJfbWFwLVx1MDAzZW1hcF90eXBlKSkge1xuK1x0XHRicGZfaHRhYl9tYXBfbWV0YV9pbml0KGlubmVyX21hcF9tZXRhLCBpbm5lcl9tYXApO1xuIFx0fVxuIFx0cmV0dXJuIGlubmVyX21hcF9tZXRhO1xuIH1cbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL21hcF9pbl9tYXAuaCBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5oXG5pbmRleCA3ZDYxNjAyMzU0ZGU4Li4xZWRjMjA1NzcyZDhjIDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9tYXBfaW5fbWFwLmhcbisrKyBiL2tlcm5lbC9icGYvbWFwX2luX21hcC5oXG5AQCAtMTUsNSArMTUsNyBAQCB2b2lkICpicGZfbWFwX2ZkX2dldF9wdHIoc3RydWN0IGJwZl9tYXAgKm1hcCwgc3RydWN0IGZpbGUgKm1hcF9maWxlLFxuIFx0XHRcdCBpbnQgdWZkKTtcbiB2b2lkIGJwZl9tYXBfZmRfcHV0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLCB2b2lkICpwdHIsIGJvb2wgbmVlZF9kZWZlcik7XG4gdTMyIGJwZl9tYXBfZmRfc3lzX2xvb2t1cF9lbGVtKHZvaWQgKnB0cik7XG4rc2l6ZV90IGJwZl9odGFiX21hcF9tZXRhX3NpemUodm9pZCk7XG4rdm9pZCBicGZfaHRhYl9tYXBfbWV0YV9pbml0KHN0cnVjdCBicGZfbWFwICppbm5lcl9tYXBfbWV0YSwgc3RydWN0IGJwZl9tYXAgKmlubmVyX21hcCk7XG4gXG4gI2VuZGlmXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jXG5pbmRleCAzNzNjOGQxN2VhNTU3Li42YmQ0Y2I2OGMyMGMxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21hcF9wdHJfa2Vybi5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWFwX3B0cl9rZXJuLmNcbkBAIC0xMTQsNyArMTE0LDcgQEAgc3RhdGljIGlubGluZSBpbnQgY2hlY2tfaGFzaCh2b2lkKVxuIFx0VkVSSUZZKGNoZWNrX2RlZmF1bHRfbm9pbmxpbmUoXHUwMDI2aGFzaC1cdTAwM2VtYXAsIG1hcCkpO1xuIFxuIFx0VkVSSUZZKGhhc2gtXHUwMDNlbl9idWNrZXRzID09IE1BWF9FTlRSSUVTKTtcbi1cdFZFUklGWShoYXNoLVx1MDAzZWVsZW1fc2l6ZSA9PSA2NCk7XG4rXHRWRVJJRlkoaGFzaC1cdTAwM2VlbGVtX3NpemUgPT0gMzIpO1xuIFxuIFx0VkVSSUZZKGhhc2gtXHUwMDNlY291bnQuY291bnRlciA9PSAwKTtcbiBcdFZFUklGWShicGZfbWFwX3N1bV9lbGVtX2NvdW50KG1hcCkgPT0gMCk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjoyNC4zNzM0MjE3NTVaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo5ODczNjQ0NjgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQlBGIEhhc2ggTWFwIE9wdGltaXphdGlvbiBQYXRjaCoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIG15IGluaXRpYWwgdGhvdWdodCBpcywgdGhpcyBpcyBhIHByZXR0eSBzaWduaWZpY2FudCBjaGFuZ2UuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgYSBmdW5kYW1lbnRhbCByZS1hcmNoaXRlY3R1cmUgb2YgYHN0cnVjdCBodGFiX2VsZW1gIGluIGBrZXJuZWwvYnBmL2hhc2h0YWIuY2AgYW5kIGFsc28gaW1wYWN0aW5nIGBrZXJuZWwvYnBmL21hcF9pbl9tYXAuY2AuIFRoZXkncmUgaW50cm9kdWNpbmcgbmV3IHN0cnVjdHVyZXM6IGBodGFiX25vZGVgLCBgaHRhYl9lbGVtYCwgYGh0YWJfZWxlbV9scnVgLCBgaHRhYl9lbGVtX3BjcHVgLiBUaGF0J3Mgbm90IHRyaXZpYWwuIEFuZCwgb2ggeWVhaCwgYGhhc19oYXNoYCBhbmQgYGtleV9vZmZzZXRgIGFyZSBnZXR0aW5nIGFkZGVkIHRvIGBzdHJ1Y3QgYnBmX2h0YWJgIGFzIHdlbGwuXG5cblRoZSBiaWdnZXN0IHRoaW5nIHRoYXQgY2F0Y2hlcyBteSBhdHRlbnRpb24gaXMgaG93IHRoZXkncmUgY29uZGl0aW9uYWxseSBpbmNsdWRpbmcgdGhlIGhhc2ggdmFsdWUgaW4gdGhlIGVsZW1lbnQgZGVwZW5kaW5nIG9uIGlmIGl0J3MgYW4gTFJVIG1hcCBvciBpZiB0aGUga2V5IGlzIHdpZGVyIHRoYW4gYSB3b3JkLiBUaGF0J3MgYSBjbGV2ZXIgb3B0aW1pemF0aW9uLCBidXQgaXQgYWxzbyBjcmVhdGVzIHBvdGVudGlhbCBmb3Igc29tZSByZWFsbHkgc3VidGxlIGJ1Z3MuIEFsc28sIHVwZGF0aW5nIGBtYXBfaW5fbWFwLmNgIHRvIHN1cHBvcnQgbWV0YS1kYXRhIGZvciBoYXNoIG1hcHMgaW5zaWRlIG90aGVyIG1hcHMuLi4gdGhhdCBpbXBhY3RzIGFub3RoZXIgY29yZSBjb21wb25lbnQuXG5cblRoaXMgKmFic29sdXRlbHkqIHNjcmVhbXMgZm9yIGZ1enppbmcuIFdlIG5lZWQgdG8gYmUgdGhvcm91Z2ggd2l0aCB0aGlzLlxuXG5Ob3csIGxldCdzIGZpZ3VyZSBvdXQgd2hlcmUgdG8gZm9jdXMgb3VyIGZ1enppbmcgZWZmb3J0cy4gVGhlIHBhdGNoIG1vZGlmaWVzOiBgaHRhYl9tYXBfYWxsb2NgLCBgaHRhYl9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX2xydV9tYXBfbG9va3VwX2VsZW1gLCBgaHRhYl9tYXBfZ2V0X25leHRfa2V5YCwgYGh0YWJfbWFwX2xvb2t1cF9hbmRfZGVsZXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2hgIGFuZCBgYnBmX21hcF9tZXRhX2FsbG9jYC4gUmlnaHQsIGxldCdzIGxvb2sgYXQgdGhvc2UgZnVuY3Rpb25zLCBlc3BlY2lhbGx5LlxuXG5BbHJpZ2h0LCBjaGVja2luZyBga2VybmVsL2JwZi9oYXNodGFiLmNgLiBUaG9zZSBgaHRhYl8qYCBmdW5jdGlvbnMgYXJlIGFsbCBzdGFuZGFyZCBCUEYgbWFwIG9wZXJhdGlvbnMuICBXZSBjYW4gZm9jdXMgdGhlcmUuIEdpdmVuIHdoYXQgSSdtIHNlZWluZywgYGh0YWJfbWFwX2FsbG9jYCwgYGh0YWJfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF91cGRhdGVfZWxlbWAsIGBodGFiX21hcF9kZWxldGVfZWxlbWAsIGBodGFiX2xydV9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2VsZW1gLCBgaHRhYl9scnVfbWFwX2xvb2t1cF9lbGVtYCwgYF9faHRhYl9tYXBfbG9va3VwX2FuZF9kZWxldGVfYmF0Y2hgLCBgYnBmX21hcF9tZXRhX2FsbG9jYCAtIHRob3NlIHNlZW0gbGlrZSB0aGUgcHJpbWFyeSBlbnRyeSBwb2ludHMgdG8gc2NydXRpbml6ZS5cblxuT2theSwgc28gbW9zdCBvZiB0aGVtIGFyZSBzdGF0aWMsIGJ1dCBhc3NpZ25lZCB0byB0aGUgYGJwZl9tYXBfb3BzYCBzdHJ1Y3R1cmVzLiAgQWgsIHJpZ2h0LiBUaGUgYWR2aWNlIGlzIHRvIHByaW9yaXRpemUgbm9uLXN0YXRpYyBlbnRyeSBwb2ludHMuIEJ1dCBldmVuIHRob3VnaCB0aGV5J3JlIHN0YXRpYywgdGhleSAqYXJlbid0KiBpbmxpbmVkIGJlY2F1c2UgdGhleSdyZSBjYWxsZWQgdGhyb3VnaCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgaW4gdGhvc2UgYGJwZl9tYXBfb3BzYCBzdHJ1Y3R1cmVzLiBUaGF0IG1lYW5zIHRoZXkgc3RpbGwgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzLCBhbmQgdGhleSBzaG91bGQgYmUgdGVzdGFibGUuICBHcmVhdC4gTGV0J3MgZGlnIGRlZXBlciBpbnRvIHRoZSBjb2RlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjA0NCwiT3V0cHV0VG9rZW5zIjo1NSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxNSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjM0LjI0NzA2ODIxOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4MDE3NTkxOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeKHN0YXRpYyApPyhzdHJ1Y3QgYnBmX21hcCBcXFxcKnxpbnR8bG9uZ3x2b2lkIFxcXFwqfHZvaWQpIGh0YWJfbWFwX2FsbG9jXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvaGFzaHRhYi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvaGFzaHRhYi5jPTQ1MD1zdGF0aWMgaW50IGFsbG9jX2V4dHJhX2VsZW1zKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTQ3My0vKiBDYWxsZWQgZnJvbSBzeXNjYWxsICovXFxua2VybmVsL2JwZi9oYXNodGFiLmM6NDc0OnN0YXRpYyBpbnQgaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXFxua2VybmVsL2JwZi9oYXNodGFiLmMtNDc1LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTI6MzQuMzI3MjQ5ODI1WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6Mjk4NjI2MTA1MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKlJlZmluaW5nIHRoZSBTZWFyY2ggU3RyYXRlZ3kqKlxuXG5BbHJpZ2h0LCB0aGF0IHJlZ2V4IEkgaW5pdGlhbGx5IGNyYWZ0ZWQgd2FzIHByb3ZpbmcgYSBsaXR0bGUgdG9vIHJlc3RyaWN0aXZlLiBJdCB3YXMgcHJvYmFibHkgb3ZlcmNvbXBsaWNhdGluZyB0aGluZ3MsIGxlYWRpbmcgdG8gc29tZSBmYWxzZSBuZWdhdGl2ZXMuIFJhdGhlciB0aGFuIHRyeWluZyB0byBtYWludGFpbiB0aGF0IGNvbXBsZXggcGF0dGVybiwgSSdtIGdvaW5nIHRvIGRpYWwgaXQgYmFjayBhbmQgYWRvcHQgYSBzaW1wbGVyIGFwcHJvYWNoLiBNeSBpbnN0aW5jdHMgYXJlIHRlbGxpbmcgbWUgdG8gZ28gZGlyZWN0bHkgZm9yIHRoZSBjb3JlIGZ1bmN0aW9uIEknbSBpbnRlcmVzdGVkIGluOiBgaHRhYl9tYXBfYWxsb2NgLiBBIHNpbXBsZSBgZ3JlcGAgZm9yIHRoYXQgc2hvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGFuZCBnZXQgbWUgdGhlIHJlc3VsdHMgSSBuZWVkIHdpdGhvdXQgdW5uZWNlc3Nhcnkgb3ZlcmhlYWQgb3IgdGhlIHBvdGVudGlhbCBmb3IgbWlzc2VkIG9jY3VycmVuY2VzIGR1ZSB0byBvdmVybHkgc3BlY2lmaWMgcGF0dGVybiBtYXRjaGluZy4gRm9jdXNpbmcgb24gdGhlIGZ1bmN0aW9uIG5hbWUgaXRzZWxmIHNob3VsZCBwcm92aWRlIGEgY2xlYW5lciBhbmQgbW9yZSBmb2N1c2VkIHJlc3VsdCBzZXQgZm9yIGRlZXBlciBhbmFseXNpcy4gSXQncyBhIHByYWdtYXRpYyBzaGlmdCwgYW5kIEkgZXhwZWN0IGl0IHdpbGwgYmUgbW9yZSBlZmZlY3RpdmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNjE1LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTI6MzcuMzEzNTEzMzI1WiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjk2NDYwMTA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImh0YWJfbWFwX2FsbG9jXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvaGFzaHRhYi5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvaGFzaHRhYi5jPTQ1MD1zdGF0aWMgaW50IGFsbG9jX2V4dHJhX2VsZW1zKHN0cnVjdCBicGZfaHRhYiAqaHRhYilcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTQ3My0vKiBDYWxsZWQgZnJvbSBzeXNjYWxsICovXFxua2VybmVsL2JwZi9oYXNodGFiLmM6NDc0OnN0YXRpYyBpbnQgaHRhYl9tYXBfYWxsb2NfY2hlY2sodW5pb24gYnBmX2F0dHIgKmF0dHIpXFxua2VybmVsL2JwZi9oYXNodGFiLmMtNDc1LXtcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jPTU5MT1zdGF0aWMgaW50IGh0YWJfbWFwX2NoZWNrX2J0ZihzdHJ1Y3QgYnBmX21hcCAqbWFwLCBjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy01OTktXFx0ICogV2UgbXVzdCBzZXQgdGhlIGR0b3IgdXNpbmcgdGhpcyBjYWxsYmFjaywgYXMgbWFwJ3MgQlRGIHJlY29yZCBpcyBub3RcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzo2MDA6XFx0ICogcG9wdWxhdGVkIGluIGh0YWJfbWFwX2FsbG9jKCksIHNvIGl0IHdpbGwgYWx3YXlzIGFwcGVhciBhcyBOVUxMLlxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTYwMS1cXHQgKi9cXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTYwNy1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzo2MDg6c3RhdGljIHN0cnVjdCBicGZfbWFwICpodGFiX21hcF9hbGxvYyh1bmlvbiBicGZfYXR0ciAqYXR0cilcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy02MDkte1xcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmM9MjQ3Nz1jb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9tYXBfb3BzID0ge1xcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI0NzgtXFx0Lm1hcF9tZXRhX2VxdWFsID0gYnBmX21hcF9tZXRhX2VxdWFsLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0Nzk6XFx0Lm1hcF9hbGxvY19jaGVjayA9IGh0YWJfbWFwX2FsbG9jX2NoZWNrLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI0ODA6XFx0Lm1hcF9hbGxvYyA9IGh0YWJfbWFwX2FsbG9jLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI0ODEtXFx0Lm1hcF9mcmVlID0gaHRhYl9tYXBfZnJlZSxcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jPTI0OTk9Y29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIGh0YWJfbHJ1X21hcF9vcHMgPSB7XFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjUwMC1cXHQubWFwX21ldGFfZXF1YWwgPSBicGZfbWFwX21ldGFfZXF1YWwsXFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjUwMTpcXHQubWFwX2FsbG9jX2NoZWNrID0gaHRhYl9tYXBfYWxsb2NfY2hlY2ssXFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjUwMjpcXHQubWFwX2FsbG9jID0gaHRhYl9tYXBfYWxsb2MsXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjUwMy1cXHQubWFwX2ZyZWUgPSBodGFiX21hcF9mcmVlLFxcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmM9MjY4Nz1jb25zdCBzdHJ1Y3QgYnBmX21hcF9vcHMgaHRhYl9wZXJjcHVfbWFwX29wcyA9IHtcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNjg4LVxcdC5tYXBfbWV0YV9lcXVhbCA9IGJwZl9tYXBfbWV0YV9lcXVhbCxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNjg5OlxcdC5tYXBfYWxsb2NfY2hlY2sgPSBodGFiX21hcF9hbGxvY19jaGVjayxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNjkwOlxcdC5tYXBfYWxsb2MgPSBodGFiX21hcF9hbGxvYyxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNjkxLVxcdC5tYXBfZnJlZSA9IGh0YWJfbWFwX2ZyZWUsXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yNzA5PWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX2xydV9wZXJjcHVfbWFwX29wcyA9IHtcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzEwLVxcdC5tYXBfbWV0YV9lcXVhbCA9IGJwZl9tYXBfbWV0YV9lcXVhbCxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNzExOlxcdC5tYXBfYWxsb2NfY2hlY2sgPSBodGFiX21hcF9hbGxvY19jaGVjayxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyNzEyOlxcdC5tYXBfYWxsb2MgPSBodGFiX21hcF9hbGxvYyxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzEzLVxcdC5tYXBfZnJlZSA9IGh0YWJfbWFwX2ZyZWUsXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzI5LVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI3MzA6c3RhdGljIGludCBmZF9odGFiX21hcF9hbGxvY19jaGVjayh1bmlvbiBicGZfYXR0ciAqYXR0cilcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yNzMxLXtcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI3MzMtXFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxua2VybmVsL2JwZi9oYXNodGFiLmM6MjczNDpcXHRyZXR1cm4gaHRhYl9tYXBfYWxsb2NfY2hlY2soYXR0cik7XFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjczNS19XFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYz0yODAyPXN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqaHRhYl9vZl9tYXBfYWxsb2ModW5pb24gYnBmX2F0dHIgKmF0dHIpXFxuLS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yODA5LVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI4MTA6XFx0bWFwID0gaHRhYl9tYXBfYWxsb2MoYXR0cik7XFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjgxMS1cXHRpZiAoSVNfRVJSKG1hcCkpIHtcXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jPTI4NTY9Y29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIGh0YWJfb2ZfbWFwc19tYXBfb3BzID0ge1xcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjI4NTc6XFx0Lm1hcF9hbGxvY19jaGVjayA9IGZkX2h0YWJfbWFwX2FsbG9jX2NoZWNrLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI4NTgtXFx0Lm1hcF9hbGxvYyA9IGh0YWJfb2ZfbWFwX2FsbG9jLFxcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmM9MjkxND1zdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHJodGFiX3BhcmFtc19sb25nID0ge1xcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjkyMS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyOTIyOnN0YXRpYyBzdHJ1Y3QgYnBmX21hcCAqcmh0YWJfbWFwX2FsbG9jKHVuaW9uIGJwZl9hdHRyICphdHRyKVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI5MjMte1xcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjk3MS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyOTcyOnN0YXRpYyBpbnQgcmh0YWJfbWFwX2FsbG9jX2NoZWNrKHVuaW9uIGJwZl9hdHRyICphdHRyKVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jLTI5NzMte1xcbi0tXFxua2VybmVsL2JwZi9oYXNodGFiLmMtMjk5MS1cXG5rZXJuZWwvYnBmL2hhc2h0YWIuYzoyOTkyOlxcdHJldHVybiBodGFiX21hcF9hbGxvY19jaGVjayhhdHRyKTtcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0yOTkzLX1cXG4tLVxcbmtlcm5lbC9icGYvaGFzaHRhYi5jPTM2NDI9Y29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIHJodGFiX21hcF9vcHMgPSB7XFxua2VybmVsL2JwZi9oYXNodGFiLmMtMzY0My1cXHQubWFwX21ldGFfZXF1YWwgPSBicGZfbWFwX21ldGFfZXF1YWwsXFxua2VybmVsL2JwZi9oYXNodGFiLmM6MzY0NDpcXHQubWFwX2FsbG9jX2NoZWNrID0gcmh0YWJfbWFwX2FsbG9jX2NoZWNrLFxcbmtlcm5lbC9icGYvaGFzaHRhYi5jOjM2NDU6XFx0Lm1hcF9hbGxvYyA9IHJodGFiX21hcF9hbGxvYyxcXG5rZXJuZWwvYnBmL2hhc2h0YWIuYy0zNjQ2LVxcdC5tYXBfZnJlZSA9IHJodGFiX21hcF9mcmVlLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1MjozNy40MDk5ODA1NDNaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo0OTc4NTI3NTExLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQgb2YgdGhlIEhhc2ggTWFwIEZ1bmN0aW9ucyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZXNlIGZ1bmN0aW9ucyBhbmQgaW1tZWRpYXRlbHkgc2VlIHRoZXkncmUgc3RhdGljLCB3aGljaCBpcyBpbnRlcmVzdGluZywgYnV0IGFjdHVhbGx5LCB0aGF0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlci4gVGhlc2UgYXJlIHRoZSBjb3JlIG9wZXJhdGlvbnMg4oCTIHRoZSBtYXBwaW5nIGZ1bmN0aW9ucyDigJMgZm9yIGhhc2ggbWFwcy4gVGhhdCBtYWtlcyB0aGVtIGEgdmVyeSB2YWx1YWJsZSB0YXJnZXQgZm9yIHRoZSBmdXp6ZXIuIExldCBtZSBzZWUuLi4gaWYgd2UgaW5jbHVkZSBgaHRhYl9tYXBfYWxsb2NgLCBgaHRhYl9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF9kZWxldGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX2xydV9tYXBfbG9va3VwX2VsZW1gLCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAsIGFuZCBgYnBmX21hcF9tZXRhX2FsbG9jYCwgdGhlIGZ1enplciBzaG91bGQgYmUgYWJsZSB0byBkaWcgaW4gdGhlcmUuIEFoLCB3YWl0IGEgc2Vjb25kLiBIb2xkIG9uLiBJcyBgYnBmX21hcF9tZXRhX2FsbG9jYCBhY3R1YWxseSBzdGF0aWM/IFRoYXQncyBub3Qgd2hhdCBJIGV4cGVjdGVkLiBMZXQgbWUganVzdCBxdWlja2x5IGNoZWNrIHRoYXQuIFRpbWUgdG8gZ28gbG9vayBpbnRvIGBrZXJuZWwvYnBmL21hcF9pbl9tYXAuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1NTcyLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjQyLjM4ODUxMjI4M1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NzkyNDYyOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJicGZfbWFwX21ldGFfYWxsb2NcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9tYXBfaW5fbWFwLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9tYXBfaW5fbWFwLmM9MTA9c3RhdGljIGJvb2wgYnBmX21hcF90eXBlX2lzX2h0YWIoZW51bSBicGZfbWFwX3R5cGUgdHlwZSlcXG4tLVxcbmtlcm5lbC9icGYvbWFwX2luX21hcC5jLTE4LVxcbmtlcm5lbC9icGYvbWFwX2luX21hcC5jOjE5OnN0cnVjdCBicGZfbWFwICpicGZfbWFwX21ldGFfYWxsb2MoaW50IGlubmVyX21hcF91ZmQpXFxua2VybmVsL2JwZi9tYXBfaW5fbWFwLmMtMjAte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1Mjo0Mi40NDY0NDM3OTFaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo1ODgyMzI5NDMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBCUEYgTWFwIEFsbG9jYXRpb24gRnVuY3Rpb25zKipcblxuT2theSwgc28gYGJwZl9tYXBfbWV0YV9hbGxvY2AgaXMgZGVmaW5pdGVseSBleHBvcnRlZCwgdGhhdCdzIHN0cmFpZ2h0Zm9yd2FyZC4gTm93LCBhYm91dCBgaHRhYl9tYXBfYWxsb2NgLi4uIGl0J3MgZGVjbGFyZWQgc3RhdGljLCB3aGljaCBpbml0aWFsbHkgc2VlbXMgbGlrZSBhIHByb2JsZW0gYmFzZWQgb24gdGhlIHByb21wdCdzIHByZWZlcmVuY2UgZm9yIG5vbi1zdGF0aWMgZW50cnlwb2ludHMgd2l0aCBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzLiBCdXQgd2FpdCBhIG1pbnV0ZSwgaXQncyAqYXNzaWduZWQqIHRvIGEgZnVuY3Rpb24gcG9pbnRlciEgVGhhdCBtZWFucyB0aGUgY29tcGlsZXIgd29uJ3QgaW5saW5lIGl0LCBhbmQgaXQgKmRvZXMqIGhhdmUgYSBkaXN0aW5jdCBzeW1ib2wuIFNvLCBpdCBzaG91bGQgYmUgZmluZSB0byBpbmNsdWRlIGl0LlxuXG5PZiBjb3Vyc2UsIEkgY291bGQgcGxheSBpdCBzYWZlIGFuZCBqdXN0IGxpc3QgdGhlIHN5c2NhbGwgZW50cnkgcG9pbnRzIGxpa2UgYG1hcF9jcmVhdGVgLCBgbWFwX3VwZGF0ZV9lbGVtYCwgZXRjLiBCdXQgdGhhdCdzIGEgYml0IGdlbmVyaWMuIFRoZSBwcm9tcHQgc3BlY2lmaWNhbGx5IHdhcm5zIGFnYWluc3QgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gYXZvaWQgYmlhc2luZyB0aGUgcmVzdWx0cy4gQW5kIGxpc3RpbmcgdGhvc2Ugc3lzY2FsbHMgKndvdWxkKiBza2V3IHRoZSB0ZXN0IGRpc3RyaWJ1dGlvbi5cblxuU28sIHRoZSBvcHRpbWFsIGFwcHJvYWNoIGhlcmUgaXMgdG8gbGlzdCB0aGUgc3BlY2lmaWMgYGh0YWJfbWFwX2FsbG9jYCBmdW5jdGlvbnM6IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9scnVfbWFwX2RlbGV0ZV9lbGVtYCwgYGh0YWJfbWFwX2xvb2t1cF9lbGVtYCwgYGh0YWJfbHJ1X21hcF9sb29rdXBfZWxlbWAsIGFuZCBgX19odGFiX21hcF9sb29rdXBfYW5kX2RlbGV0ZV9iYXRjaGAuIFRoYXQgY292ZXJzIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBiZWluZyBvdmVybHkgZ2VuZXJpYy5cblxuTm93LCBqdXN0IHRvIGJlIHRob3JvdWdoLCBJIHNob3VsZCBjaGVjayBmb3IgYW55IENPTkZJRyBvcHRpb25zIHdlIG1pZ2h0IG5lZWQuIEJQRiBoYXNoIG1hcHMgYXJlIGEgZnVuZGFtZW50YWwgcGFydCBvZiBjb3JlIEJQRiwgc28gaXQncyBhIHNhZmUgYmV0IHRoYXQgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgdGhlIHByaW1hcnkgb25lLCBidXQgbGV0IG1lIGp1c3QgZG91YmxlIGNoZWNrIHRoZSBkZXRhaWxzIHRvIGJlIHN1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI2MTU0LCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzM3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjQ4LjMyODc3NTkyNFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA5MjEwNDI3LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlBGX1NZU0NBTExcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcImVycm9yXCI6IFwibm8gbWF0Y2hlc1wiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0wNVQyMjo1Mjo0OC40Mzc5OTY4NTFaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI1MTE2MDY2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBteSB0aG91Z2h0IHByb2Nlc3Mgb24gdGhpczpcblxuKipJbnZlc3RpZ2F0aW5nIEJQRiBDb25maWd1cmF0aW9uIE9wdGlvbnMqKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGVyZSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBCUEYgYXJlIGRlZmluZWQuIE15IGZpcnN0IGluc3RpbmN0LCBhbmQgdGhpcyBpcyB3aGVyZSBJJ2Qgc3RhcnQgaW4gYW55IGtlcm5lbCBpbnZlc3RpZ2F0aW9uLCBpcyB0byBjaGVjayB0aGUgYEtjb25maWdgIGZpbGVzLiBTcGVjaWZpY2FsbHksIEknbSB0aGlua2luZyBJIG5lZWQgdG8gbG9vayBpbiBga2VybmVsL2JwZi9LY29uZmlnYCwgb3Igc29tZXdoZXJlIHNpbWlsYXIgd2l0aGluIHRoZSBCUEYgc3Vic3lzdGVtIGRpcmVjdG9yeS4gVGhlIGBLY29uZmlnYCBmaWxlcyBhcmUgdGhlIGJyZWFkIGFuZCBidXR0ZXIgZm9yIGFueSBrZXJuZWwgZGV2ZWxvcGVyIGJlY2F1c2UgdGhleSBkZWZpbmUgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IHVzZXJzIGNhbiB0b2dnbGUgdXNpbmcgYG1ha2UgbWVudWNvbmZpZ2Agb3Igc2ltaWxhciB0b29scy4gVGhpcyBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgdW5kZXJzdGFuZGluZyBvZiB3aGF0J3MgYXZhaWxhYmxlIGFuZCBob3cgaXQncyBzdHJ1Y3R1cmVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjkxNiwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjUyLjY4OTE2MDQ0M1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI5Nzc4OTI4MSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlBGX1NZU0NBTExcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvS2NvbmZpZz0yNT1tZW51IFxcXCJCUEYgc3Vic3lzdGVtXFxcIlxcbmtlcm5lbC9icGYvS2NvbmZpZy0yNi1cXG5rZXJuZWwvYnBmL0tjb25maWc6Mjc6Y29uZmlnIEJQRl9TWVNDQUxMXFxua2VybmVsL2JwZi9LY29uZmlnLTI4LVxcdGJvb2wgXFxcIkVuYWJsZSBicGYoKSBzeXN0ZW0gY2FsbFxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTI6NTQuOTg2OTU1MzY0WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjM2MzAwNDY2MTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIHNlZSwgdGhlIGNvcmUgb2YgdGhpcyBzZWVtcyB0byByZXZvbHZlIGFyb3VuZCBgQlBGX1NZU0NBTExgLCB0aGF0J3MgdGhlIHByaW1hcnkgY29uZmlndXJhdGlvbiB0byBiZSBhd2FyZSBvZi4gSSBzaG91bGQgZG91YmxlLWNoZWNrIHRvIGJlIHN1cmUgdGhlcmUgYXJlbid0IGFueSBvdGhlciBjb25maWdzIHRoYXQgYXJlIHJlbGF0ZWQuXG5cbkFscmlnaHQsIHRoZSBwYXRjaCB0b3VjaGVzIGBrZXJuZWwvYnBmL2hhc2h0YWIuY2AgYW5kIGBrZXJuZWwvYnBmL21hcF9pbl9tYXAuY2AuIEhtbSwgYXJlIHRoZXJlIGFueSBzcGVjaWFsaXplZCBjb25maWd1cmF0aW9ucywgb3IgcGVyaGFwcyBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgdW5pcXVlIHRvIHRob3NlIGZpbGVzIHdpdGhpbiB0aGlzIGNvbnRleHQ/IFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMgbGlua2VkIHdpdGggdGhlIHNwZWNpZmljIGNvZGUgcGF0aHMgYWx0ZXJlZCBpbiB0aG9zZSBtb2R1bGVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNzE5OSwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTA1VDIyOjUyOjU4LjYxNzAwNTEwNVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA5Mzk3OTg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImhhc2h0YWJcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL2JwZi9NYWtlZmlsZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL01ha2VmaWxlPTEwPW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gYnBmX2l0ZXIubyBtYXBfaXRlci5vIHRhc2tfaXRlci5vIHByb2dfaXRlci5vIGxpbmtfaXRlci5vXFxua2VybmVsL2JwZi9NYWtlZmlsZToxMTpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGhhc2h0YWIubyBhcnJheW1hcC5vIHBlcmNwdV9mcmVlbGlzdC5vIGJwZl9scnVfbGlzdC5vIGxwbV90cmllLm8gbWFwX2luX21hcC5vIGJsb29tX2ZpbHRlci5vXFxua2VybmVsL2JwZi9NYWtlZmlsZS0xMi1vYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGxvY2FsX3N0b3JhZ2UubyBxdWV1ZV9zdGFja19tYXBzLm8gcmluZ2J1Zi5vIGJwZl9pbnNuX2FycmF5Lm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTI6NTguNzI2NDA3NTkyWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjg5ODU4MjIzMTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgdGhpcyBCUEYgSGFzaCBNYXAgT3B0aW1pemF0aW9uKipcblxuUmlnaHQsIHNvIEkndmUgY29uZmlybWVkIHRoYXQgZW5hYmxpbmcgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgdGhlIGNydWNpYWwgcHJlcmVxdWlzaXRlIGhlcmUuIFRpbWUgdG8gZ2V0IHRvIHRoZSBoZWFydCBvZiB0aGlzIHBhdGNoLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byBmb2N1cyBvbiBhIHNldCBvZiBjcml0aWNhbCBmdW5jdGlvbnMgdGhhdCByZXByZXNlbnQgdGhlIGNvcmUgb3BlcmF0aW9ucyBhZmZlY3RlZCBieSB0aGlzIG1lbW9yeSBsYXlvdXQgb3B0aW1pemF0aW9uLiBJJ3ZlIGNvbXBpbGVkIGEgc2hvcnRsaXN0LCBmb2N1c2luZyBvbiB0aG9zZSBpbnZvbHZlZCB3aXRoIGFsbG9jYXRpb24sIHVwZGF0ZXMsIGxvb2t1cHMsIGFuZCBkZWxldGlvbnMuXG5cbkkndmUgZ290IGBodGFiX21hcF9hbGxvY2AsIGBodGFiX21hcF91cGRhdGVfZWxlbWAsIGBodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1gLCBgaHRhYl9tYXBfZGVsZXRlX2VsZW1gLCBgaHRhYl9tYXBfbG9va3VwX2VsZW1gLCBhbmQgYGJwZl9tYXBfbWV0YV9hbGxvY2AgZWFybWFya2VkIGFzIHRoZSBrZXkgdGFyZ2V0cy4gSSBkaWQgYSBxdWljayBkb3VibGUgY2hlY2sgb24gYGh0YWJfbWFwX3VwZGF0ZV9lbGVtYCB0byBiZSBzdXJlIEknbSB0YXJnZXRpbmcgdGhlIHByb3BlciBmdW5jdGlvbiwgaXQncyBzdGF0aWMgaW50ZXJuYWxseSBidXQgZXhwb3NlZCB0aHJvdWdoIHRoZSBgaHRhYl9tYXBfb3BzYCBzdHJ1Y3R1cmUuIEknbSBrZWVwaW5nIGEgY2xvc2UgZXllIG9uIGFueSBhbGlhc2VzIG9yIHZhcmlhdGlvbnMgYXMgd2VsbCwgYnV0IHRoZXNlIHNlZW0gdG8gYmUgdGhlIHByaW1hcnkgcGxheWVycy5cblxuVGhpcyBwYXRjaCBpcyBlc3NlbnRpYWxseSBhIGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBjb3JlIEJQRiBoYXNoIG1hcCBpbXBsZW1lbnRhdGlvbiwgc3BlY2lmaWNhbGx5IGFpbWluZyB0byBvcHRpbWl6ZSBtZW1vcnkgdXNhZ2UgYnkgY29uZGl0aW9uYWxseSByZW1vdmluZyB0aGUgaGFzaCB2YWx1ZSBmcm9tIHRoZSBlbGVtZW50IGFuZCBhZGp1c3RpbmcgdGhlIGtleSBvZmZzZXQuIEl0J3Mgbm90IGp1c3QgYSB0d2VhazsgaXQncyBhIGZ1bmRhbWVudGFsIHNoaWZ0IGluIGhvdyB0aGVzZSBtYXBzIG1hbmFnZSBtZW1vcnkuXG5cbkdpdmVuIHRoaXMsIG15IGV4cGVydCBpbnR1aXRpb24gc2NyZWFtcyBmb3IgdGhvcm91Z2ggZnV6emluZy4gVGhlIGNoYW5nZSB0b3VjaGVzIGNvcmUgb3BlcmF0aW9ucyBsaWtlIG1lbW9yeSBsYXlvdXQgaW4gYSB3YXkgdGhhdCAqZGVtYW5kcyogcm9idXN0IHRlc3RpbmcuIFdlIG5lZWQgdG8gYmUgYWJzb2x1dGVseSBjZXJ0YWluIHRoYXQgdGhpcyBtZW1vcnkgb3B0aW1pemF0aW9uIGRvZXNuJ3QgaW50cm9kdWNlIHZ1bG5lcmFiaWxpdGllcyBvciB1bmV4cGVjdGVkIGJlaGF2aW9ycyBkdXJpbmcgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24sIGVzcGVjaWFsbHkgcmVsYXRlZCB0byBvdXQtb2YtYm91bmRzIGFjY2VzcyBvciBtZW1vcnkgY29ycnVwdGlvbi4gSSBuZWVkIHRvIGJlIDEwMCUgY2VydGFpbiB0aGUga2V5cyBhbmQgZGF0YSBhcmUgc3RpbGwgbWFwcGVkIGNvcnJlY3RseSwgdG9vLlxuXG5JJ20gZmxhZ2dpbmcgYGh0YWJfbWFwX2FsbG9jYCwgYGh0YWJfbWFwX3VwZGF0ZV9lbGVtYCwgYGh0YWJfbHJ1X21hcF91cGRhdGVfZWxlbWAsIGBodGFiX21hcF9sb29rdXBfZWxlbWAsIGBodGFiX21hcF9kZWxldGVfZWxlbWAsIGFuZCBgYnBmX21hcF9tZXRhX2FsbG9jYCBhcyB0aGUgZm9jdXMgc3ltYm9scywgYW5kIEknbGwgbWFrZSBzdXJlIGBCUEZfU1lTQ0FMTGAgaXMgZW5hYmxlZCBmb3IgdGVzdGluZy4gTGV0J3MgY2FsbCBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNzYwMSwiT3V0cHV0VG9rZW5zIjoxNzgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2NDgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMDVUMjI6NTM6MDcuNzEyMjMzMzIyWiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTMwMDYzNjY2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImh0YWJfbWFwX2FsbG9jXCIsXG4gICAgXCJodGFiX21hcF91cGRhdGVfZWxlbVwiLFxuICAgIFwiaHRhYl9scnVfbWFwX3VwZGF0ZV9lbGVtXCIsXG4gICAgXCJodGFiX21hcF9sb29rdXBfZWxlbVwiLFxuICAgIFwiaHRhYl9tYXBfZGVsZXRlX2VsZW1cIixcbiAgICBcImJwZl9tYXBfbWV0YV9hbGxvY1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG9wdGltaXplcyB0aGUgbWVtb3J5IGxheW91dCBvZiBCUEYgaGFzaCBtYXAgZWxlbWVudHMgYnkgY29uZGl0aW9uYWxseSBvbWl0dGluZyB0aGUgaGFzaCB2YWx1ZSBhbmQgYWRqdXN0aW5nIHRoZSBrZXkgb2Zmc2V0LiBUaGlzIGFmZmVjdHMgY29yZSBCUEYgaGFzaCBtYXAgb3BlcmF0aW9ucyBsaWtlIGFsbG9jYXRpb24sIGxvb2t1cCwgdXBkYXRlLCBhbmQgZGVsZXRpb24uIEZ1enppbmcgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGVzZSBvcGVyYXRpb25zIHN0aWxsIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBtZW1vcnkgbGF5b3V0IGFuZCB0aGF0IG5vIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMgb3IgbWVtb3J5IGxlYWtzIG9jY3VyLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiaHRhYl9tYXBfYWxsb2NcIixcbiAgICBcImh0YWJfbWFwX3VwZGF0ZV9lbGVtXCIsXG4gICAgXCJodGFiX2xydV9tYXBfdXBkYXRlX2VsZW1cIixcbiAgICBcImh0YWJfbWFwX2xvb2t1cF9lbGVtXCIsXG4gICAgXCJodGFiX21hcF9kZWxldGVfZWxlbVwiLFxuICAgIFwiYnBmX21hcF9tZXRhX2FsbG9jXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggb3B0aW1pemVzIHRoZSBtZW1vcnkgbGF5b3V0IG9mIEJQRiBoYXNoIG1hcCBlbGVtZW50cyBieSBjb25kaXRpb25hbGx5IG9taXR0aW5nIHRoZSBoYXNoIHZhbHVlIGFuZCBhZGp1c3RpbmcgdGhlIGtleSBvZmZzZXQuIFRoaXMgYWZmZWN0cyBjb3JlIEJQRiBoYXNoIG1hcCBvcGVyYXRpb25zIGxpa2UgYWxsb2NhdGlvbiwgbG9va3VwLCB1cGRhdGUsIGFuZCBkZWxldGlvbi4gRnV6emluZyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZXNlIG9wZXJhdGlvbnMgc3RpbGwgd29yayBjb3JyZWN0bHkgd2l0aCB0aGUgbmV3IG1lbW9yeSBsYXlvdXQgYW5kIHRoYXQgbm8gb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBvciBtZW1vcnkgbGVha3Mgb2NjdXIuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[1] Phase: Succeeded StartedAt: 2026-08-05 22:53:19 +0000 UTC FinishedAt: 2026-08-05 22:53:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-05 22:53:19 +0000 UTC FinishedAt: 2026-08-05 22:53:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2] Phase: Succeeded StartedAt: 2026-08-05 22:53:19 +0000 UTC FinishedAt: 2026-08-06 02:39:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-05 22:53:19 +0000 UTC FinishedAt: 2026-08-06 02:39:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-05 22:53:19 +0000 UTC FinishedAt: 2026-08-05 22:53:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-05 22:53:19 +0000 UTC FinishedAt: 2026-08-05 22:53:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-convert-artifact-1668886535/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-05 22:53:29 +0000 UTC FinishedAt: 2026-08-05 23:13:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-05 22:53:29 +0000 UTC FinishedAt: 2026-08-05 23:13:11 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*22a46896-3938-462f-9cd0-79a832ba2ebc,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-convert-artifact-1668886535/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "35e62854-8c0b-4d19-84e9-7e99e2760da4", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-728399517/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-05 22:53:29 +0000 UTC FinishedAt: 2026-08-05 23:13:01 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*22a46896-3938-462f-9cd0-79a832ba2ebc,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-convert-artifact-1668886535/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "35e62854-8c0b-4d19-84e9-7e99e2760da4", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-728399517/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-05 23:13:11 +0000 UTC FinishedAt: 2026-08-05 23:13:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-05 23:13:11 +0000 UTC FinishedAt: 2026-08-05 23:13:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-05 23:13:11 +0000 UTC FinishedAt: 2026-08-05 23:13:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-05 23:13:11 +0000 UTC FinishedAt: 2026-08-05 23:13:15 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-convert-artifact-3409569334/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-05 23:13:21 +0000 UTC FinishedAt: 2026-08-05 23:15:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-05 23:13:21 +0000 UTC FinishedAt: 2026-08-05 23:15:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*35e62854-8c0b-4d19-84e9-7e99e2760da4,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-728399517/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-05 23:15:38 +0000 UTC FinishedAt: 2026-08-05 23:15:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-05 23:15:38 +0000 UTC FinishedAt: 2026-08-05 23:15:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-05 23:15:38 +0000 UTC FinishedAt: 2026-08-05 23:34:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-05 23:15:38 +0000 UTC FinishedAt: 2026-08-05 23:34:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*22a46896-3938-462f-9cd0-79a832ba2ebc,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-convert-artifact-3409569334/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "f39410c7-dfbd-417b-93bc-a00a85acac14", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-758262586/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-05 23:15:38 +0000 UTC FinishedAt: 2026-08-05 23:34:45 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*22a46896-3938-462f-9cd0-79a832ba2ebc,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-convert-artifact-3409569334/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "f39410c7-dfbd-417b-93bc-a00a85acac14", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-758262586/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-05 23:34:55 +0000 UTC FinishedAt: 2026-08-05 23:34:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-05 23:34:55 +0000 UTC FinishedAt: 2026-08-05 23:34:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-05 23:34:55 +0000 UTC FinishedAt: 2026-08-05 23:36:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-05 23:34:55 +0000 UTC FinishedAt: 2026-08-05 23:36:34 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*f39410c7-dfbd-417b-93bc-a00a85acac14,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-758262586/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-05 23:36:44 +0000 UTC FinishedAt: 2026-08-06 02:39:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-05 23:36:44 +0000 UTC FinishedAt: 2026-08-06 02:39:31 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*35e62854-8c0b-4d19-84e9-7e99e2760da4,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*f39410c7-dfbd-417b-93bc-a00a85acac14,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-728399517/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-758262586/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-05 23:36:44 +0000 UTC FinishedAt: 2026-08-05 23:36:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-05 23:36:44 +0000 UTC FinishedAt: 2026-08-05 23:36:50 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-convert-artifact-2608468571/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-05 23:36:44 +0000 UTC FinishedAt: 2026-08-05 23:36:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-05 23:36:44 +0000 UTC FinishedAt: 2026-08-05 23:36:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-05 23:36:44 +0000 UTC FinishedAt: 2026-08-05 23:36:44 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-05 23:36:54 +0000 UTC FinishedAt: 2026-08-06 02:39:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowfltv8[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db"],"focus":["bpf"],"focus_symbols":["htab_map_alloc","htab_map_update_elem","htab_lru_map_update_elem","htab_map_lookup_elem","htab_map_delete_elem","bpf_map_meta_alloc"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"cfce77b63375dac81d53f2f85593c548415206b7","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"9cd4e75e-affc-4a83-9042-f2c0004066a5","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-05 23:36:54 +0000 UTC FinishedAt: 2026-08-06 02:39:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*35e62854-8c0b-4d19-84e9-7e99e2760da4,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*f39410c7-dfbd-417b-93bc-a00a85acac14,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-728399517/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-build-action-758262586/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowfltv8/series-workflowfltv8-convert-artifact-2608468571/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}