Name: series-workflowg5xlr Phase: Succeeded StartedAt: 2026-07-29 03:56:46 +0000 UTC FinishedAt: 2026-07-29 07:47:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[0] Phase: Succeeded StartedAt: 2026-07-29 03:56:46 +0000 UTC FinishedAt: 2026-07-29 04:02:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[0].run-triage Phase: Succeeded StartedAt: 2026-07-29 03:56:46 +0000 UTC FinishedAt: 2026-07-29 04:02:03 +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": "87267b89459813cb50ab5377e076b639c07b4491", "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": "87267b89459813cb50ab5377e076b639c07b4491", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "29c71d21-3b1c-4a5e-85f7-0b9b4d647850" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "bpf_iter_workqueue_new", "bpf_iter_workqueue_next", "bpf_iter_workqueue_destroy", "bpf_iter_worker_pool_new", "bpf_iter_worker_pool_next", "bpf_iter_worker_pool_destroy", "workqueue_iter_seq_start", "workqueue_iter_seq_next", "workqueue_iter_seq_show", "workqueue_iter_seq_stop", "worker_pool_iter_seq_start", "worker_pool_iter_seq_next", "worker_pool_iter_seq_show", "worker_pool_iter_seq_stop", "wq_pending_fill", "wq_pending_seq_start", "wq_pending_seq_next", "wq_pending_seq_show", "wq_pending_seq_stop" ], "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+CgkJCTx0ZD4yMDI2LzA3LzI5IDA0OjAxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2l0ZXJfd29ya3F1ZXVlX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfbmV4dCYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfZGVzdHJveSYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc2hvdyYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc3RvcCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0JiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3cmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX2ZpbGwmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfc3RhcnQmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9zaG93JiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX3N0b3AmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA0OjAxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZTY5MzM2ZDY5YTllYzMwMTMzNzljMjMwZjJmODRhMGJkMDgwYzZjZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgSnVsIDI5IDA0OjAxOjM0IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuY1xuaW5kZXggNzgwNjhhZThmMjhhNi4uNmU4Nzk0OTBjODExYSAxMDA2NDRcbi0tLSBhL2tlcm5lbC93b3JrcXVldWUuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3dvcmtxdWV1ZS5jXG5AQCAtNTYsNiAmIzQzOzU2LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fcGFyYS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZGVsYXkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycV93b3JrLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnRmX2lkcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7d29ya3F1ZXVlX2ludGVybmFsLmhcJiMzNDtcbiBcbkBAIC04NDczLDMgJiM0Mzs4NDc1LDU1NyBAQCBzdGF0aWMgaW50IF9faW5pdCB3b3JrcXVldWVfdW5ib3VuZF9jcHVzX3NldHVwKGNoYXIgKnN0cilcbiBcdHJldHVybiAxO1xuIH1cbiBfX3NldHVwKFwmIzM0O3dvcmtxdWV1ZS51bmJvdW5kX2NwdXM9XCYjMzQ7LCB3b3JrcXVldWVfdW5ib3VuZF9jcHVzX3NldHVwKTtcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEJQRiBvcGVuLWNvZGVkIGl0ZXJhdG9yIG92ZXIgYWxsIHdvcmtxdWV1ZXMuXG4mIzQzOyAqXG4mIzQzOyAqIFdhbGtzIHRoZSBnbG9iYWwgQHdvcmtxdWV1ZXMgbGlzdCwgbGV0dGluZyBCUEYgcHJvZ3JhbXMgcmVhZCBsaXZlIHdvcmtxdWV1ZVxuJiM0MzsgKiBzdGF0ZS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGNhbGxlciBtdXN0IGhvbGQgYnBmX3JjdV9yZWFkX2xvY2soKSBhY3Jvc3MgbmV3KCktXHUwMDNlbmV4dCgpLVx1MDAzZWRlc3Ryb3koKS5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsvKiBTZW50aW5lbCBmb3IgXCYjMzQ7bmV3KCkgZG9uZSwgbmV4dCgpIG5vdCB5ZXQgY2FsbGVkXCYjMzQ7IHZzIFwmIzM0O2l0ZXJhdGlvbiBlbmRlZFwmIzM0Oy4gKi9cbiYjNDM7I2RlZmluZSBCUEZfV1FfSVRFUl9TVEFSVCAoKHZvaWQgKikxTClcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWUge1xuJiM0MztcdF9fdTY0IF9fb3BhcXVlWzFdO1xuJiM0Mzt9IF9fYWxpZ25lZCg4KTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiB7XG4mIzQzO1x0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBvcztcbiYjNDM7fSBfX2FsaWduZWQoOCk7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wge1xuJiM0MztcdF9fdTY0IF9fb3BhcXVlWzFdO1xuJiM0Mzt9IF9fYWxpZ25lZCg4KTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuIHtcbiYjNDM7XHRpbnQgaWQ7XHRcdC8qIG5leHQgd29ya2VyX3Bvb2xfaWRyIGlkIHRvIHNlYXJjaCBmcm9tICovXG4mIzQzO30gX19hbGlnbmVkKDgpO1xuJiM0MztcbiYjNDM7X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcoKSAtIEluaXRpYWxpemUgYSB3b3JrcXVldWUgaXRlcmF0b3JcbiYjNDM7ICogQGl0OiBUaGUgbmV3IGJwZl9pdGVyX3dvcmtxdWV1ZSB0byBpbml0aWFsaXplXG4mIzQzOyAqXG4mIzQzOyAqIEl0ZXJhdGVzIGV2ZXJ5IHdvcmtxdWV1ZSBvbiB0aGUgZ2xvYmFsIEB3b3JrcXVldWVzIGxpc3QuIE11c3QgYmUgdXNlZCBpbnNpZGVcbiYjNDM7ICogYSBicGZfcmN1X3JlYWRfbG9jaygpIHJlZ2lvbiAoS0ZfUkNVX1BST1RFQ1RFRCkuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbiYjNDM7XG4mIzQzO1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4pIFx1MDAzZVxuJiM0MztcdFx0ICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSkpO1xuJiM0MztcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4pICE9XG4mIzQzO1x0XHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUpKTtcbiYjNDM7XG4mIzQzO1x0a2l0LVx1MDAzZXBvcyA9IEJQRl9XUV9JVEVSX1NUQVJUO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoKSAtIEdldCB0aGUgbmV4dCB3b3JrcXVldWVcbiYjNDM7ICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya3F1ZXVlXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdCB3b3JrcXVldWVfc3RydWN0LCBvciBOVUxMIHdoZW4gZG9uZS5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpcbiYjNDM7YnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4mIzQzO1xuJiM0MztcdGlmICgha2l0LVx1MDAzZXBvcylcdFx0XHQvKiBhbHJlYWR5IHJlYWNoZWQgdGhlIGVuZCAqL1xuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdGlmIChraXQtXHUwMDNlcG9zID09IEJQRl9XUV9JVEVSX1NUQVJUKVxuJiM0MztcdFx0a2l0LVx1MDAzZXBvcyA9IGxpc3RfZmlyc3Rfb3JfbnVsbF9yY3UoXHUwMDI2d29ya3F1ZXVlcyxcbiYjNDM7XHRcdFx0XHRcdFx0ICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0a2l0LVx1MDAzZXBvcyA9IGxpc3RfbmV4dF9vcl9udWxsX3JjdShcdTAwMjZ3b3JrcXVldWVzLCBcdTAwMjZraXQtXHUwMDNlcG9zLVx1MDAzZWxpc3QsXG4mIzQzO1x0XHRcdFx0XHRcdCBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XG4mIzQzO1x0cmV0dXJuIGtpdC1cdTAwM2Vwb3M7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveSgpIC0gRGVzdHJveSBhIHdvcmtxdWV1ZSBpdGVyYXRvclxuJiM0MzsgKiBAaXQ6IFRoZSBicGZfaXRlcl93b3JrcXVldWUgdG8gZGVzdHJveVxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdClcbiYjNDM7e1xuJiM0MztcdC8qIE5vIHJlZmVyZW5jZXMgdGFrZW47IFJDVSBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIuICovXG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcoKSAtIEluaXRpYWxpemUgYSB3b3JrZXJfcG9vbCBpdGVyYXRvclxuJiM0MzsgKiBAaXQ6IFRoZSBuZXcgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gaW5pdGlhbGl6ZVxuJiM0MzsgKlxuJiM0MzsgKiBJdGVyYXRlcyBldmVyeSB3b3JrZXJfcG9vbCBpbiB0aGUgc3lzdGVtICh3b3JrZXJfcG9vbF9pZHIpIGluIGFzY2VuZGluZ1xuJiM0MzsgKiBwb29sLWlkIG9yZGVyLlxuJiM0MzsgKiBUaGUgY2FsbGVyIHNob3VsZCBob2xkIFJDVSByZWFkIGxvY2suXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbiYjNDM7XG4mIzQzO1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybikgXHUwMDNlXG4mIzQzO1x0XHQgICAgIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wpKTtcbiYjNDM7XHRCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4pICE9XG4mIzQzO1x0XHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCkpO1xuJiM0MztcbiYjNDM7XHRraXQtXHUwMDNlaWQgPSAwO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCgpIC0gR2V0IHRoZSBuZXh0IHdvcmtlcl9wb29sXG4mIzQzOyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtlcl9wb29sXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdCB3b3JrZXJfcG9vbCwgb3IgTlVMTCB3aGVuIGRvbmUuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKlxuJiM0MzticGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbiYjNDM7XHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XG4mIzQzO1xuJiM0MztcdC8qIGlkcl9nZXRfbmV4dCgpIGlzIFJDVS1zYWZlOyBzZWUgdGhlIGZvcl9lYWNoX3Bvb2woKSBsb2NrIGxlZ2VuZC4gKi9cbiYjNDM7XHRwb29sID0gaWRyX2dldF9uZXh0KFx1MDAyNndvcmtlcl9wb29sX2lkciwgXHUwMDI2a2l0LVx1MDAzZWlkKTtcbiYjNDM7XHRpZiAocG9vbClcbiYjNDM7XHRcdGtpdC1cdTAwM2VpZCYjNDM7JiM0Mzs7XHQvKiBhZHZhbmNlIHBhc3QgdGhpcyBwb29sIGZvciB0aGUgbmV4dCBjYWxsICovXG4mIzQzO1x0cmV0dXJuIHBvb2w7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KCkgLSBEZXN0cm95IGEgd29ya2VyX3Bvb2wgaXRlcmF0b3JcbiYjNDM7ICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gZGVzdHJveVxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXG4mIzQzO3tcbiYjNDM7XHQvKiBOb3RoaW5nIHRvIGJlIGRvbmU7IFJDVSBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIuICovXG4mIzQzO31cbiYjNDM7XG4mIzQzO19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4mIzQzO1xuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcylcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcsIEtGX0lURVJfTkVXIHwgS0ZfUkNVX1BST1RFQ1RFRClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcsIEtGX0lURVJfTkVXIHwgS0ZfUkNVX1BST1RFQ1RFRClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKVxuJiM0MztCVEZfS0ZVTkNTX0VORCh3b3JrcXVldWVfaXRlcl9rZnVuY19pZHMpXG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgd29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0ID0ge1xuJiM0MztcdC5vd25lclx0PSBUSElTX01PRFVMRSxcbiYjNDM7XHQuc2V0XHQ9IFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIHNlcV9maWxlIGZvcm0gb2YgdGhlIHdvcmtxdWV1ZSBpdGVyYXRvci4gSXQgcmV1c2VzIHRoZSBvcGVuLWNvZGVkXG4mIzQzOyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KCkuXG4mIzQzOyAqXG4mIzQzOyAqIFNpbmNlIHRoZSBvcGVuLWNvZGVkIG5leHQoKSBpcyBLRl9SQ1VfUFJPVEVDVEVELCB0aGUgc2VxIHBhdGggc3VwcGxpZXNcbiYjNDM7ICogdGhlIFJDVSBzZWN0aW9uIGl0c2VsZi5cbiYjNDM7ICogc2VxX3N0YXJ0KCkgdGFrZXMgcmN1X3JlYWRfbG9jaygpIGFuZCBob2xkcyBpdCBhY3Jvc3MgdGhlIHdob2xlIHJlYWQgY2h1bmtcbiYjNDM7ICogKHN0YXJ0Li5zdG9wKS4gUG9zaXRpb24gaXMgcmUtZGVyaXZlZCBmcm9tICpwb3Mgb24gZWFjaCBzdGFydCwgc28gbm90aGluZ1xuJiM0MzsgKiBpcyBkZXJlZmVyZW5jZWQgYWNyb3NzIHRoZSByY3UgZ2FwIGJldHdlZW4gY2h1bmtzLiBUaGUgYXR0YWNoZWQgQlBGIHByb2dyYW1cbiYjNDM7ICogbXVzdCBiZSBub24tc2xlZXBhYmxlLlxuJiM0MzsgKi9cbiYjNDM7dW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiB7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSBpdDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4ga2l0O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUge1xuJiM0MztcdF9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTtcbiYjNDM7XHRfX2JwZl9tZF9wdHIoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKiwgd3EpO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKndvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpXG4mIzQzO3tcbiYjNDM7XHR1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2ICpwID0gc2VxLVx1MDAzZXByaXZhdGU7XG4mIzQzO1x0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxO1xuJiM0MztcdGxvZmZfdCBjbnQgPSAwO1xuJiM0MztcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XHQvKiBoZWxkIHVudGlsIHNlcV9zdG9wKCkgKi9cbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh3cSwgXHUwMDI2d29ya3F1ZXVlcywgbGlzdCkge1xuJiM0MztcdFx0aWYgKGNudCA9PSAqcG9zKSB7XG4mIzQzO1x0XHRcdHAtXHUwMDNla2l0LnBvcyA9IHdxO1xuJiM0MztcdFx0XHRyZXR1cm4gd3E7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjbnQmIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHRwLVx1MDAzZWtpdC5wb3MgPSBOVUxMO1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqd29ya3F1ZXVlX2l0ZXJfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuJiM0Mzt7XG4mIzQzO1x0dW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiAqcCA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuJiM0MztcbiYjNDM7XHQmIzQzOyYjNDM7KnBvcztcbiYjNDM7XHRyZXR1cm4gYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoXHUwMDI2cC1cdTAwM2VpdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd29ya3F1ZXVlX2l0ZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSBjdHg7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4mIzQzO1xuJiM0MztcdG1ldGEuc2VxID0gc2VxO1xuJiM0MztcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcdTAwMjZtZXRhLCBmYWxzZSk7XG4mIzQzO1x0aWYgKCFwcm9nKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuJiM0MztcdGN0eC53cSA9IHY7XG4mIzQzO1x0cmV0dXJuIGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUgY3R4O1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuJiM0MztcbiYjNDM7XHRpZiAoIXYpIHtcbiYjNDM7XHRcdG1ldGEuc2VxID0gc2VxO1xuJiM0MztcdFx0cHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKFx1MDAyNm1ldGEsIHRydWUpO1xuJiM0MztcdFx0aWYgKHByb2cpIHtcbiYjNDM7XHRcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuJiM0MztcdFx0XHRjdHgud3EgPSBOVUxMO1xuJiM0MztcdFx0XHRicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcdTAwMjZjdHgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcdC8qIHBhaXJlZCB3aXRoIHNlcV9zdGFydCgpICovXG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd29ya3F1ZXVlX2l0ZXJfc2VxX29wcyA9IHtcbiYjNDM7XHQuc3RhcnRcdD0gd29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0LFxuJiM0MztcdC5uZXh0XHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0LFxuJiM0MztcdC5zdG9wXHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wLFxuJiM0MztcdC5zaG93XHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93LFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcbiYjNDM7XHRcdCAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3b3JrcXVldWVfaXRlcl9zZXFfaW5mbyA9IHtcbiYjNDM7XHQuc2VxX29wc1x0PSBcdTAwMjZ3b3JrcXVldWVfaXRlcl9zZXFfb3BzLFxuJiM0MztcdC5zZXFfcHJpdl9zaXplXHQ9IHNpemVvZih1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2KSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO0JURl9JRF9MSVNUX1NJTkdMRSh3b3JrcXVldWVfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtxdWV1ZV9zdHJ1Y3QpXG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3b3JrcXVldWVfaXRlcl9yZWdfaW5mbyA9IHtcbiYjNDM7XHQudGFyZ2V0XHRcdFx0PSBcJiMzNDt3b3JrcXVldWVcJiMzNDssXG4mIzQzO1x0LmN0eF9hcmdfaW5mb19zaXplXHQ9IDEsXG4mIzQzO1x0LmN0eF9hcmdfaW5mb1x0XHQ9IHtcbiYjNDM7XHRcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUsIHdxKSxcbiYjNDM7XHRcdCAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSxcbiYjNDM7XHR9LFxuJiM0MztcdC5zZXFfaW5mb1x0XHQ9IFx1MDAyNndvcmtxdWV1ZV9pdGVyX3NlcV9pbmZvLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogc2VxX2ZpbGUgZm9ybSBvZiB0aGUgd29ya2VyX3Bvb2wgaXRlcmF0b3I7IHNhbWUgUkNVLXBlci1jaHVuayBzY2hlbWUgYXMgdGhlXG4mIzQzOyAqIHdvcmtxdWV1ZSBvbmUsIHJldXNpbmcgdGhlIG9wZW4tY29kZWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCgpLlxuJiM0MzsgKi9cbiYjNDM7dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2IHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgaXQ7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4ga2l0O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCB7XG4mIzQzO1x0X19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpO1xuJiM0MztcdF9fYnBmX21kX3B0cihzdHJ1Y3Qgd29ya2VyX3Bvb2wgKiwgcG9vbCk7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxuJiM0Mzt7XG4mIzQzO1x0dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2ICpwID0gc2VxLVx1MDAzZXByaXZhdGU7XG4mIzQzO1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuJiM0MztcdGxvZmZfdCBjbnQgPSAwO1xuJiM0MztcdGludCBpZCA9IDA7XG4mIzQzO1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHR3aGlsZSAoKHBvb2wgPSBpZHJfZ2V0X25leHQoXHUwMDI2d29ya2VyX3Bvb2xfaWRyLCBcdTAwMjZpZCkpKSB7XG4mIzQzO1x0XHRpZiAoY250ID09ICpwb3MpIHtcbiYjNDM7XHRcdFx0cC1cdTAwM2VraXQuaWQgPSBpZCAmIzQzOyAxO1xuJiM0MztcdFx0XHRyZXR1cm4gcG9vbDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZCYjNDM7JiM0Mzs7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXG4mIzQzO3tcbiYjNDM7XHR1bmlvbiB3b3JrZXJfcG9vbF9pdGVyX3ByaXYgKnAgPSBzZXEtXHUwMDNlcHJpdmF0ZTtcbiYjNDM7XG4mIzQzO1x0JiM0MzsmIzQzOypwb3M7XG4mIzQzO1x0cmV0dXJuIGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoXHUwMDI2cC1cdTAwM2VpdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9fd29ya2VyX3Bvb2wgY3R4O1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuJiM0MztcbiYjNDM7XHRtZXRhLnNlcSA9IHNlcTtcbiYjNDM7XHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgZmFsc2UpO1xuJiM0MztcdGlmICghcHJvZylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbiYjNDM7XHRjdHgucG9vbCA9IHY7XG4mIzQzO1x0cmV0dXJuIGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIGN0eDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhO1xuJiM0MztcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcbiYjNDM7XG4mIzQzO1x0aWYgKCF2KSB7XG4mIzQzO1x0XHRtZXRhLnNlcSA9IHNlcTtcbiYjNDM7XHRcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcdTAwMjZtZXRhLCB0cnVlKTtcbiYjNDM7XHRcdGlmIChwcm9nKSB7XG4mIzQzO1x0XHRcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbiYjNDM7XHRcdFx0Y3R4LnBvb2wgPSBOVUxMO1xuJiM0MztcdFx0XHRicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcdTAwMjZjdHgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3b3JrZXJfcG9vbF9pdGVyX3NlcV9vcHMgPSB7XG4mIzQzO1x0LnN0YXJ0XHQ9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0LFxuJiM0MztcdC5uZXh0XHQ9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQsXG4mIzQzO1x0LnN0b3BcdD0gd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcCxcbiYjNDM7XHQuc2hvd1x0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93LFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya2VyX3Bvb2wsIHN0cnVjdCBicGZfaXRlcl9tZXRhICptZXRhLFxuJiM0MztcdFx0ICAgICBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wpXG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIHdvcmtlcl9wb29sX2l0ZXJfc2VxX2luZm8gPSB7XG4mIzQzO1x0LnNlcV9vcHNcdD0gXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9zZXFfb3BzLFxuJiM0MztcdC5zZXFfcHJpdl9zaXplXHQ9IHNpemVvZih1bmlvbiB3b3JrZXJfcG9vbF9pdGVyX3ByaXYpLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7QlRGX0lEX0xJU1RfU0lOR0xFKHdvcmtlcl9wb29sX2J0Zl9pZCwgc3RydWN0LCB3b3JrZXJfcG9vbClcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2l0ZXJfcmVnIHdvcmtlcl9wb29sX2l0ZXJfcmVnX2luZm8gPSB7XG4mIzQzO1x0LnRhcmdldFx0XHRcdD0gXCYjMzQ7d29ya2VyX3Bvb2xcJiMzNDssXG4mIzQzO1x0LmN0eF9hcmdfaW5mb19zaXplXHQ9IDEsXG4mIzQzO1x0LmN0eF9hcmdfaW5mb1x0XHQ9IHtcbiYjNDM7XHRcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCwgcG9vbCksXG4mIzQzO1x0XHQgIFBUUl9UT19CVEZfSURfT1JfTlVMTCB8IFBUUl9UUlVTVEVEIH0sXG4mIzQzO1x0fSxcbiYjNDM7XHQuc2VxX2luZm9cdFx0PSBcdTAwMjZ3b3JrZXJfcG9vbF9pdGVyX3NlcV9pbmZvLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogc2VxLWZpbGUgQlBGIGl0ZXJhdG9yIG92ZXIgdGhlIHBlbmRpbmcgd29yayBpdGVtcyBvZiBldmVyeSB3b3JrZXJfcG9vbC5cbiYjNDM7ICpcbiYjNDM7ICogcG9vbC1cdTAwM2V3b3JrbGlzdCBpcyBwcm90ZWN0ZWQgYnkgcG9vbC1cdTAwM2Vsb2NrIGFuZCB3b3JrX3N0cnVjdCBoYXMgbmVpdGhlciBhXG4mIzQzOyAqIHJlZmNvdW50IG5vciBSQ1UtZnJlZWluZywgc28gYSBwZW5kaW5nIHdvcmsgY2Fubm90IGJlIGhhbmRlZCB0byBhIHN1c3BlbmRlZFxuJiM0MzsgKiAob3Blbi1jb2RlZCkgaXRlcmF0b3Igc2FmZWx5LlxuJiM0MzsgKiBJbnN0ZWFkLCBmb3IgZWFjaCBwb29sIGEgYm91bmRlZCBzbmFwc2hvdCBvZiBpdHMgcGVuZGluZyB3b3JrcyBpcyBjb3BpZWQgb3V0XG4mIzQzOyAqIHdoaWxlIHBvb2wtXHUwMDNlbG9jayBpcyBoZWxkLCBtaXJyb3JpbmcgdGhlIHByaW50a19kZWZlcnJlZCBzZWN0aW9uIG9mXG4mIzQzOyAqIHNob3dfb25lX3dvcmtlcl9wb29sKCkgYW5kIHRoZW4gdGhlIGxvY2sgaXMgZHJvcHBlZC5cbiYjNDM7ICogVGhlIEJQRiBwcm9ncmFtIHRoZW4gcnVucyBvdmVyIHRoZSBzdGFibGUgc25hcHNob3Qgd2l0aCBubyBsb2NrIGhlbGQuXG4mIzQzOyAqXG4mIzQzOyAqIFBvb2xzIGFyZSB2aXNpdGVkIGluIHdvcmtlcl9wb29sX2lkciBvcmRlciAoYSBzdGFibGUgcmVzdW1lIGtleSk7IGVhY2ggcG9vbCYjMzk7c1xuJiM0MzsgKiBzbmFwc2hvdCBsaXZlcyBpbiB0aGUgcGVyc2lzdGVudCBzZXFfcHJpdmF0ZSwgc28gdGhlIHdhbGsgcmVzdW1lcyBjb3JyZWN0bHlcbiYjNDM7ICogYWNyb3NzIHJlYWQoKSBjaHVua3MuIEEgcG9vbCB3aXRoIG1vcmUgdGhhbiBXUV9QRU5ESU5HX1NOQVBfTUFYIHBlbmRpbmcgd29ya3NcbiYjNDM7ICogaXMgdHJ1bmNhdGVkIChiZXN0LWVmZm9ydCwgbGlrZSB0aGUga2VybmVsJiMzOTtzIG93biB3b3JrbGlzdCBkdW1wKS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgV1FfUEVORElOR19TTkFQX01BWCAxMjhcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE9uZSBwcm9qZWN0ZWQgcGVuZGluZyB3b3JrIGl0ZW0sIGFzIHNlZW4gYnkgdGhlIEJQRiBwcm9ncmFtLiBBZGRyZXNzZXMgb25seVxuJiM0MzsgKiAtLSB0aGUgbGl2ZSB3b3JrX3N0cnVjdCBpcyBub3QgZXhwb3NlZCAoaXQgbWF5IGJlIGZyZWVkIGFmdGVyIHRoZSBsb2NrKS5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyB7XG4mIzQzO1x0X191NjQgcG9vbF9pZDtcbiYjNDM7XHRfX3U2NCB3b3JrO1xuJiM0MztcdF9fdTY0IGZ1bmM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYge1xuJiM0MztcdGludCAgICAgICAgICBuZXh0X3Bvb2w7XHQvKiB3b3JrZXJfcG9vbF9pZHIgY3Vyc29yIGZvciB0aGUgbmV4dCBmaWxsICovXG4mIzQzO1x0dW5zaWduZWQgaW50IGlkeDtcdC8qIHBvc2l0aW9uIHdpdGhpbiBzbmFwW10gICAgICAgICAgICAgICAgICAgKi9cbiYjNDM7XHR1bnNpZ25lZCBpbnQgY291bnQ7XHQvKiB2YWxpZCBlbnRyaWVzIGluIHNuYXBbXSAgICAgICAgICAgICAgICAgICovXG4mIzQzO1x0c3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvIHNuYXBbV1FfUEVORElOR19TTkFQX01BWF07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsge1xuJiM0MztcdF9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTtcbiYjNDM7XHRfX2JwZl9tZF9wdHIoc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICosIGluZm8pO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU25hcHNob3QgdGhlIG5leHQgbm9uLWVtcHR5IHBvb2wmIzM5O3MgcGVuZGluZyB3b3JrcyBpbnRvIHByaXYtXHUwMDNlc25hcFtdLCBhZHZhbmNpbmdcbiYjNDM7ICogcHJpdi1cdTAwM2VuZXh0X3Bvb2wgcGFzdCBpdC4gUmV0dXJucyB0cnVlIGlmIGEgcG9vbCB3YXMgY2FwdHVyZWQsIGZhbHNlIGF0IGVuZC5cbiYjNDM7ICogcG9vbC1cdTAwM2Vsb2NrIGlzIGhlbGQgb25seSBmb3IgdGhlIGZpZWxkIGNvcHk7IFJDVSBrZWVwcyBlYWNoIHBvb2wgYWxpdmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCB3cV9wZW5kaW5nX2ZpbGwoc3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuJiM0MztcdHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaztcbiYjNDM7XHRpbnQgaWQ7XG4mIzQzO1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRmb3IgKGlkID0gcHJpdi1cdTAwM2VuZXh0X3Bvb2w7IChwb29sID0gaWRyX2dldF9uZXh0KFx1MDAyNndvcmtlcl9wb29sX2lkciwgXHUwMDI2aWQpKTsgaWQmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgbiA9IDA7XG4mIzQzO1xuJiM0MztcdFx0cmF3X3NwaW5fbG9ja19pcnEoXHUwMDI2cG9vbC1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkod29yaywgXHUwMDI2cG9vbC1cdTAwM2V3b3JrbGlzdCwgZW50cnkpIHtcbiYjNDM7XHRcdFx0aWYgKG4gXHUwMDNlPSBXUV9QRU5ESU5HX1NOQVBfTUFYKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRwcml2LVx1MDAzZXNuYXBbbl0ucG9vbF9pZCA9IHBvb2wtXHUwMDNlaWQ7XG4mIzQzO1x0XHRcdHByaXYtXHUwMDNlc25hcFtuXS53b3JrID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXdvcms7XG4mIzQzO1x0XHRcdHByaXYtXHUwMDNlc25hcFtuXS5mdW5jID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXdvcmstXHUwMDNlZnVuYztcbiYjNDM7XHRcdFx0biYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyYXdfc3Bpbl91bmxvY2tfaXJxKFx1MDAyNnBvb2wtXHUwMDNlbG9jayk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKG4pIHtcbiYjNDM7XHRcdFx0cHJpdi1cdTAwM2Vjb3VudCA9IG47XG4mIzQzO1x0XHRcdHByaXYtXHUwMDNlaWR4ID0gMDtcbiYjNDM7XHRcdFx0cHJpdi1cdTAwM2VuZXh0X3Bvb2wgPSBpZCAmIzQzOyAxO1xuJiM0MztcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKndxX3BlbmRpbmdfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiAqcHJpdiA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuJiM0MztcbiYjNDM7XHRpZiAoKnBvcyA9PSAwKSB7XG4mIzQzO1x0XHRwcml2LVx1MDAzZW5leHRfcG9vbCA9IDA7XG4mIzQzO1x0XHRwcml2LVx1MDAzZWlkeCA9IDA7XG4mIzQzO1x0XHRwcml2LVx1MDAzZWNvdW50ID0gMDtcbiYjNDM7XHR9XG4mIzQzO1x0d2hpbGUgKHByaXYtXHUwMDNlaWR4IFx1MDAzZT0gcHJpdi1cdTAwM2Vjb3VudCkge1xuJiM0MztcdFx0aWYgKCF3cV9wZW5kaW5nX2ZpbGwocHJpdikpXG4mIzQzO1x0XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gXHUwMDI2cHJpdi1cdTAwM2VzbmFwW3ByaXYtXHUwMDNlaWR4XTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKndxX3BlbmRpbmdfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2ID0gc2VxLVx1MDAzZXByaXZhdGU7XG4mIzQzO1xuJiM0MztcdCYjNDM7JiM0MzsqcG9zO1xuJiM0MztcdHByaXYtXHUwMDNlaWR4JiM0MzsmIzQzOztcbiYjNDM7XHR3aGlsZSAocHJpdi1cdTAwM2VpZHggXHUwMDNlPSBwcml2LVx1MDAzZWNvdW50KSB7XG4mIzQzO1x0XHRpZiAoIXdxX3BlbmRpbmdfZmlsbChwcml2KSlcbiYjNDM7XHRcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBcdTAwMjZwcml2LVx1MDAzZXNuYXBbcHJpdi1cdTAwM2VpZHhdO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdxX3BlbmRpbmdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsgY3R4O1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuJiM0MztcbiYjNDM7XHRtZXRhLnNlcSA9IHNlcTtcbiYjNDM7XHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgZmFsc2UpO1xuJiM0MztcdGlmICghcHJvZylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbiYjNDM7XHRjdHguaW5mbyA9IHY7XG4mIzQzO1x0cmV0dXJuIGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHdxX3BlbmRpbmdfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsgY3R4O1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuJiM0MztcbiYjNDM7XHRpZiAodilcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRtZXRhLnNlcSA9IHNlcTtcbiYjNDM7XHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKHByb2cpIHtcbiYjNDM7XHRcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbiYjNDM7XHRcdGN0eC5pbmZvID0gTlVMTDtcbiYjNDM7XHRcdGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdxX3BlbmRpbmdfc2VxX29wcyA9IHtcbiYjNDM7XHQuc3RhcnRcdD0gd3FfcGVuZGluZ19zZXFfc3RhcnQsXG4mIzQzO1x0Lm5leHRcdD0gd3FfcGVuZGluZ19zZXFfbmV4dCxcbiYjNDM7XHQuc3RvcFx0PSB3cV9wZW5kaW5nX3NlcV9zdG9wLFxuJiM0MztcdC5zaG93XHQ9IHdxX3BlbmRpbmdfc2VxX3Nob3csXG4mIzQzO307XG4mIzQzO1xuJiM0MztERUZJTkVfQlBGX0lURVJfRlVOQyh3b3JrcXVldWVfcGVuZGluZ193b3JrLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcbiYjNDM7XHRcdCAgICAgc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvKVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3cV9wZW5kaW5nX3NlcV9pbmZvID0ge1xuJiM0MztcdC5zZXFfb3BzXHQ9IFx1MDAyNndxX3BlbmRpbmdfc2VxX29wcyxcbiYjNDM7XHQuc2VxX3ByaXZfc2l6ZVx0PSBzaXplb2Yoc3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2KSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO0JURl9JRF9MSVNUX1NJTkdMRSh3cV9wZW5kaW5nX3dvcmtfaW5mb19idGZfaWQsIHN0cnVjdCwgd3FfcGVuZGluZ193b3JrX2luZm8pXG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3cV9wZW5kaW5nX3JlZ19pbmZvID0ge1xuJiM0MztcdC50YXJnZXRcdFx0XHQ9IFwmIzM0O3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmtcJiMzNDssXG4mIzQzO1x0LmZlYXR1cmVcdFx0PSBCUEZfSVRFUl9SRVNDSEVELFxuJiM0MztcdC5jdHhfYXJnX2luZm9fc2l6ZVx0PSAxLFxuJiM0MztcdC5jdHhfYXJnX2luZm9cdFx0PSB7XG4mIzQzO1x0XHR7IG9mZnNldG9mKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yaywgaW5mbyksXG4mIzQzO1x0XHQgIFBUUl9UT19CVEZfSURfT1JfTlVMTCB9LFxuJiM0MztcdH0sXG4mIzQzO1x0LnNlcV9pbmZvXHRcdD0gXHUwMDI2d3FfcGVuZGluZ19zZXFfaW5mbyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl93b3JrcXVldWVfaXRlcl9pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORyxcbiYjNDM7XHRcdFx0XHRcdFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZ3b3JrcXVldWVfaXRlcl9rZnVuY19zZXQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR3b3JrcXVldWVfaXRlcl9yZWdfaW5mby5jdHhfYXJnX2luZm9bMF0uYnRmX2lkID0gd29ya3F1ZXVlX2J0Zl9pZFswXTtcbiYjNDM7XHRyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KFx1MDAyNndvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0d29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mby5jdHhfYXJnX2luZm9bMF0uYnRmX2lkID0gd29ya2VyX3Bvb2xfYnRmX2lkWzBdO1xuJiM0MztcdHJldCA9IGJwZl9pdGVyX3JlZ190YXJnZXQoXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mbyk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHdxX3BlbmRpbmdfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdxX3BlbmRpbmdfd29ya19pbmZvX2J0Zl9pZFswXTtcbiYjNDM7XHRyZXR1cm4gYnBmX2l0ZXJfcmVnX3RhcmdldChcdTAwMjZ3cV9wZW5kaW5nX3JlZ19pbmZvKTtcbiYjNDM7fVxuJiM0MztsYXRlX2luaXRjYWxsKGJwZl93b3JrcXVldWVfaXRlcl9pbml0KTtcbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaFxuaW5kZXggNjdmZjc4ODIyOTllYy4uNmRhOTNjNDg2NjUwOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbkBAIC0zNjEsNiAmIzQzOzM2MSwxNiBAQCBleHRlcm4gaW50IGJwZl9pdGVyX2RtYWJ1Zl9uZXcoc3RydWN0IGJwZl9pdGVyX2RtYWJ1ZiAqaXQpIF9fd2VhayBfX2tzeW07XG4gZXh0ZXJuIHN0cnVjdCBkbWFfYnVmICpicGZfaXRlcl9kbWFidWZfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcbiBleHRlcm4gdm9pZCBicGZfaXRlcl9kbWFidWZfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcbiBcbiYjNDM7c3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZTtcbiYjNDM7ZXh0ZXJuIGludCBicGZfaXRlcl93b3JrcXVldWVfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KSBfX3dlYWsgX19rc3ltO1xuJiM0MztleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KSBfX3dlYWsgX19rc3ltO1xuJiM0MztleHRlcm4gdm9pZCBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbDtcbiYjNDM7ZXh0ZXJuIGludCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkgX193ZWFrIF9fa3N5bTtcbiYjNDM7ZXh0ZXJuIHN0cnVjdCB3b3JrZXJfcG9vbCAqYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KSBfX3dlYWsgX19rc3ltO1xuJiM0MztleHRlcm4gdm9pZCBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpIF9fd2VhayBfX2tzeW07XG4mIzQzO1xuIGV4dGVybiBpbnQgYnBmX2Nncm91cF9yZWFkX3hhdHRyKHN0cnVjdCBjZ3JvdXAgKmNncm91cCwgY29uc3QgY2hhciAqbmFtZV9fc3RyLFxuIFx0XHRcdFx0IHN0cnVjdCBicGZfZHlucHRyICp2YWx1ZV9wKSBfX3dlYWsgX19rc3ltO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjczMzgzYzI2M2JlZThcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuY1xuQEAgLTAsMCAmIzQzOzEsODAgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O3dxX2l0ZXIuc2tlbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3dxX2l0ZXJfZmFpbC5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN1YnRlc3Rfb3Blbl9jb2RlZChzdHJ1Y3Qgd3FfaXRlciAqc2tlbClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzKTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLmNvdW50X3dvcmtxdWV1ZXMpLFxuJiM0MztcdFx0XHRcdCAgICAgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtydW4gY291bnRfd29ya3F1ZXVlc1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0LyogVGhlcmUgYXJlIGFsd2F5cyBzZXZlcmFsIHN5c3RlbSB3b3JrcXVldWVzIChldmVudHMsIC4uLikuICovXG4mIzQzO1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3dvcmtxdWV1ZXMsIDAsIFwmIzM0O25yX3dvcmtxdWV1ZXNcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLmNvdW50X3dvcmtlcl9wb29scyksXG4mIzQzO1x0XHRcdFx0ICAgICBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3J1biBjb3VudF93b3JrZXJfcG9vbHNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdC8qIEF0IGxlYXN0IHRoZSBwZXItQ1BVIG5vcm1hbC9oaWdocHJpIHBvb2xzIGV4aXN0LiAqL1xuJiM0MztcdEFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2Vucl93b3JrZXJfcG9vbHMsIDAsIFwmIzM0O25yX3dvcmtlcl9wb29sc1wmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3BlcmNwdV9wb29scywgMCwgXCYjMzQ7bnJfcGVyY3B1X3Bvb2xzXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZHJhaW5faXRlcihzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2csIGNvbnN0IGNoYXIgKm5hbWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbms7XG4mIzQzO1x0Y2hhciBidWZbNTEyXTtcbiYjNDM7XHRpbnQgaXRlcl9mZDtcbiYjNDM7XHRzc2l6ZV90IG47XG4mIzQzO1xuJiM0MztcdGxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIocHJvZywgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIG5hbWUpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGl0ZXJfZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShpdGVyX2ZkLCAwLCBcJiMzNDtpdGVyX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR3aGlsZSAoKG4gPSByZWFkKGl0ZXJfZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSBcdTAwM2UgMClcbiYjNDM7XHRcdDtcbiYjNDM7XHRBU1NFUlRfR0UobiwgMCwgXCYjMzQ7cmVhZCBpdGVyXCYjMzQ7KTtcbiYjNDM7XHRjbG9zZShpdGVyX2ZkKTtcbiYjNDM7b3V0OlxuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KGxpbmspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBzdWJ0ZXN0X3NlcShzdHJ1Y3Qgd3FfaXRlciAqc2tlbClcbiYjNDM7e1xuJiM0MztcdC8qIHNlcSBmb3JtcyBhcmUgYmFja2VkIGJ5IHRoZSBzYW1lIG9wZW4tY29kZWQgbmV4dCgpLiAqL1xuJiM0MztcdGRyYWluX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5kdW1wX3dvcmtxdWV1ZXMsIFwmIzM0O2F0dGFjaCB3b3JrcXVldWUgaXRlclwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3dxX3NlcSwgMCwgXCYjMzQ7bnJfd3Ffc2VxXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZHJhaW5faXRlcihza2VsLVx1MDAzZXByb2dzLmR1bXBfd29ya2VyX3Bvb2xzLCBcJiMzNDthdHRhY2ggd29ya2VyX3Bvb2wgaXRlclwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3Bvb2xfc2VxLCAwLCBcJiMzNDtucl9wb29sX3NlcVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogd29ya2xpc3RzIGFyZSB1c3VhbGx5IGVtcHR5IG9uIGFuIGlkbGUgc3lzdGVtOyB0aGlzIGRyaXZlcyB0aGUgd2hvbGVcbiYjNDM7XHQgKiBwZXItcG9vbCBzbmFwc2hvdCBwYXRoIGFuZCB2ZXJpZmllcyBpdCBkcmFpbnMgY2xlYW5seS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRkcmFpbl9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuZHVtcF9wZW5kaW5nLCBcJiMzNDthdHRhY2ggcGVuZGluZ193b3JrIGl0ZXJcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3Rfd3FfaXRlcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2l0ZXIgKnNrZWw7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSB3cV9pdGVyX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O3dxX2l0ZXJfX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtvcGVuX2NvZGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHN1YnRlc3Rfb3Blbl9jb2RlZChza2VsKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzZXFcJiMzNDspKVxuJiM0MztcdFx0c3VidGVzdF9zZXEoc2tlbCk7XG4mIzQzO1xuJiM0MztcdHdxX2l0ZXJfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1xuJiM0MztcdFJVTl9URVNUUyh3cV9pdGVyX2ZhaWwpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy93cV9pdGVyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xNWYwODFiYzYzNGI2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlci5jXG5AQCAtMCwwICYjNDM7MSw5NSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bWxpbnV4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiM0MztcbiYjNDM7dm9pZCBicGZfcmN1X3JlYWRfbG9jayh2b2lkKSBfX2tzeW07XG4mIzQzO3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07XG4mIzQzO1xuJiM0MzsvKiBSZXN1bHRzLCBjaGVja2VkIGJ5IHVzZXJzcGFjZS4gKi9cbiYjNDM7aW50IG5yX3dvcmtxdWV1ZXM7XG4mIzQzO2ludCBucl93b3JrZXJfcG9vbHM7XG4mIzQzO2ludCBucl9wZXJjcHVfcG9vbHM7XG4mIzQzO2ludCBucl93cV9zZXE7XG4mIzQzO2ludCBucl9wb29sX3NlcTtcbiYjNDM7aW50IG5yX3BlbmRpbmc7XG4mIzQzO1xuJiM0MzsvKiAtLS0gb3Blbi1jb2RlZCBpdGVyYXRvcnMgKEtGX1JDVV9QUk9URUNURUQpIC0tLSAqL1xuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCBjb3VudF93b3JrcXVldWVzKGNvbnN0IHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcbiYjNDM7XHRpbnQgbiA9IDA7XG4mIzQzO1xuJiM0MztcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0YnBmX2Zvcl9lYWNoKHdvcmtxdWV1ZSwgd3EpXG4mIzQzO1x0XHRuJiM0MzsmIzQzOztcbiYjNDM7XHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1xuJiM0MztcdG5yX3dvcmtxdWV1ZXMgPSBuO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IGNvdW50X3dvcmtlcl9wb29scyhjb25zdCB2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XG4mIzQzO1x0aW50IG4gPSAwLCBwZXJjcHUgPSAwO1xuJiM0MztcbiYjNDM7XHRicGZfcmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdGJwZl9mb3JfZWFjaCh3b3JrZXJfcG9vbCwgcG9vbCkge1xuJiM0MztcdFx0biYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZiAocG9vbC1cdTAwM2VjcHUgXHUwMDNlPSAwKVx0XHQvKiBwZXItQ1BVIHBvb2wgKi9cbiYjNDM7XHRcdFx0cGVyY3B1JiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0YnBmX3JjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRucl93b3JrZXJfcG9vbHMgPSBuO1xuJiM0MztcdG5yX3BlcmNwdV9wb29scyA9IHBlcmNwdTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogLS0tIHNlcV9maWxlIGl0ZXJhdG9ycyAtLS0gKi9cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtpdGVyL3dvcmtxdWV1ZVwmIzM0OylcbiYjNDM7aW50IGR1bXBfd29ya3F1ZXVlcyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtXHUwMDNlbWV0YS1cdTAwM2VzZXE7XG4mIzQzO1x0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxID0gY3R4LVx1MDAzZXdxO1xuJiM0MztcbiYjNDM7XHRpZiAoIXdxKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0bnJfd3Ffc2VxJiM0MzsmIzQzOztcbiYjNDM7XHRCUEZfU0VRX1BSSU5URihzZXEsIFwmIzM0OyVzXFxuXCYjMzQ7LCB3cS1cdTAwM2VuYW1lKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O2l0ZXIvd29ya2VyX3Bvb2xcJiMzNDspXG4mIzQzO2ludCBkdW1wX3dvcmtlcl9wb29scyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wgPSBjdHgtXHUwMDNlcG9vbDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwb29sKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0bnJfcG9vbF9zZXEmIzQzOyYjNDM7O1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7aXRlci93b3JrcXVldWVfcGVuZGluZ193b3JrXCYjMzQ7KVxuJiM0MztpbnQgZHVtcF9wZW5kaW5nKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtXHUwMDNlbWV0YS1cdTAwM2VzZXE7XG4mIzQzO1x0c3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvID0gY3R4LVx1MDAzZWluZm87XG4mIzQzO1xuJiM0MztcdGlmICghaW5mbylcdFx0XHQvKiBmaW5hbCBjYWxsICovXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0bnJfcGVuZGluZyYjNDM7JiM0Mzs7XG4mIzQzO1x0QlBGX1NFUV9QUklOVEYoc2VxLCBcJiMzNDtwb29sICVsbHUgd29yayAweCVsbHggZnVuYyAweCVsbHhcXG5cJiMzNDssXG4mIzQzO1x0XHQgICAgICAgaW5mby1cdTAwM2Vwb29sX2lkLCBpbmZvLVx1MDAzZXdvcmssIGluZm8tXHUwMDNlZnVuYyk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mYjJkY2Y5ODQ3ZTJiXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcbkBAIC0wLDAgJiM0MzsxLDM3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfbWlzYy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9leHBlcmltZW50YWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB3b3JrcXVldWUgYW5kIHdvcmtlcl9wb29sIG9wZW4tY29kZWQgaXRlcmF0b3JzIGFyZSBLRl9SQ1VfUFJPVEVDVEVEOlxuJiM0MzsgKiB1c2luZyB0aGVtIG91dHNpZGUgYSBicGZfcmN1X3JlYWRfbG9jaygpIHJlZ2lvbiBtdXN0IGJlIHJlamVjdGVkLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDs/c3lzY2FsbFwmIzM0OylcbiYjNDM7X19mYWlsdXJlIF9fbXNnKFwmIzM0O2tlcm5lbCBmdW5jIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblwmIzM0OylcbiYjNDM7aW50IHdvcmtxdWV1ZV9pdGVyX25vX3JjdShjb25zdCB2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7XG4mIzQzO1x0aW50IG4gPSAwO1xuJiM0MztcbiYjNDM7XHRicGZfZm9yX2VhY2god29ya3F1ZXVlLCB3cSlcbiYjNDM7XHRcdG4mIzQzOyYjNDM7O1xuJiM0MztcdHJldHVybiBuO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7P3N5c2NhbGxcJiMzNDspXG4mIzQzO19fZmFpbHVyZSBfX21zZyhcJiMzNDtrZXJuZWwgZnVuYyBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblwmIzM0OylcbiYjNDM7aW50IHdvcmtlcl9wb29sX2l0ZXJfbm9fcmN1KGNvbnN0IHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbDtcbiYjNDM7XHRpbnQgbiA9IDA7XG4mIzQzO1xuJiM0MztcdGJwZl9mb3JfZWFjaCh3b3JrZXJfcG9vbCwgcG9vbClcbiYjNDM7XHRcdG4mIzQzOyYjNDM7O1xuJiM0MztcdHJldHVybiBuO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDQ6MDE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2l0ZXJfd29ya3F1ZXVlX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfbmV4dCYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfZGVzdHJveSYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc2hvdyYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc3RvcCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0JiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3cmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX2ZpbGwmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfc3RhcnQmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9zaG93JiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX3N0b3AmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTY5MzM2ZDY5YTllYzMwMTMzNzljMjMwZjJmODRhMGJkMDgwYzZjZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgSnVsIDI5IDA0OjAxOjM0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDc4MDY4YWU4ZjI4YTYuLjZlODc5NDkwYzgxMWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTU2LDYgJiM0Mzs1Niw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgva3ZtX3BhcmEuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9kZWxheS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2lycV93b3JrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7d29ya3F1ZXVlX2ludGVybmFsLmgmIzM0OwogCkBAIC04NDczLDMgJiM0Mzs4NDc1LDU1NyBAQCBzdGF0aWMgaW50IF9faW5pdCB3b3JrcXVldWVfdW5ib3VuZF9jcHVzX3NldHVwKGNoYXIgKnN0cikKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoJiMzNDt3b3JrcXVldWUudW5ib3VuZF9jcHVzPSYjMzQ7LCB3b3JrcXVldWVfdW5ib3VuZF9jcHVzX3NldHVwKTsKJiM0MzsKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBCUEYgb3Blbi1jb2RlZCBpdGVyYXRvciBvdmVyIGFsbCB3b3JrcXVldWVzLgomIzQzOyAqCiYjNDM7ICogV2Fsa3MgdGhlIGdsb2JhbCBAd29ya3F1ZXVlcyBsaXN0LCBsZXR0aW5nIEJQRiBwcm9ncmFtcyByZWFkIGxpdmUgd29ya3F1ZXVlCiYjNDM7ICogc3RhdGUuCiYjNDM7ICoKJiM0MzsgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBicGZfcmN1X3JlYWRfbG9jaygpIGFjcm9zcyBuZXcoKS0mZ3Q7bmV4dCgpLSZndDtkZXN0cm95KCkuCiYjNDM7ICovCiYjNDM7CiYjNDM7LyogU2VudGluZWwgZm9yICYjMzQ7bmV3KCkgZG9uZSwgbmV4dCgpIG5vdCB5ZXQgY2FsbGVkJiMzNDsgdnMgJiMzNDtpdGVyYXRpb24gZW5kZWQmIzM0Oy4gKi8KJiM0MzsjZGVmaW5lIEJQRl9XUV9JVEVSX1NUQVJUICgodm9pZCAqKTFMKQomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgewomIzQzOwlfX3U2NCBfX29wYXF1ZVsxXTsKJiM0Mzt9IF9fYWxpZ25lZCg4KTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4gewomIzQzOwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcG9zOwomIzQzO30gX19hbGlnbmVkKDgpOwomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCB7CiYjNDM7CV9fdTY0IF9fb3BhcXVlWzFdOwomIzQzO30gX19hbGlnbmVkKDgpOwomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuIHsKJiM0MzsJaW50IGlkOwkJLyogbmV4dCB3b3JrZXJfcG9vbF9pZHIgaWQgdG8gc2VhcmNoIGZyb20gKi8KJiM0Mzt9IF9fYWxpZ25lZCg4KTsKJiM0MzsKJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfd29ya3F1ZXVlX25ldygpIC0gSW5pdGlhbGl6ZSBhIHdvcmtxdWV1ZSBpdGVyYXRvcgomIzQzOyAqIEBpdDogVGhlIG5ldyBicGZfaXRlcl93b3JrcXVldWUgdG8gaW5pdGlhbGl6ZQomIzQzOyAqCiYjNDM7ICogSXRlcmF0ZXMgZXZlcnkgd29ya3F1ZXVlIG9uIHRoZSBnbG9iYWwgQHdvcmtxdWV1ZXMgbGlzdC4gTXVzdCBiZSB1c2VkIGluc2lkZQomIzQzOyAqIGEgYnBmX3JjdV9yZWFkX2xvY2soKSByZWdpb24gKEtGX1JDVV9QUk9URUNURUQpLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIGludCBicGZfaXRlcl93b3JrcXVldWVfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuICpraXQgPSAodm9pZCAqKWl0OwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybikgJmd0OwomIzQzOwkJICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSkpOwomIzQzOwlCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuKSAhPQomIzQzOwkJICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlKSk7CiYjNDM7CiYjNDM7CWtpdC0mZ3Q7cG9zID0gQlBGX1dRX0lURVJfU1RBUlQ7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl93b3JrcXVldWVfbmV4dCgpIC0gR2V0IHRoZSBuZXh0IHdvcmtxdWV1ZQomIzQzOyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtxdWV1ZQomIzQzOyAqCiYjNDM7ICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QsIG9yIE5VTEwgd2hlbiBkb25lLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICoKJiM0MzticGZfaXRlcl93b3JrcXVldWVfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsKJiM0MzsJaWYgKCFraXQtJmd0O3BvcykJCQkvKiBhbHJlYWR5IHJlYWNoZWQgdGhlIGVuZCAqLwomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmIChraXQtJmd0O3BvcyA9PSBCUEZfV1FfSVRFUl9TVEFSVCkKJiM0MzsJCWtpdC0mZ3Q7cG9zID0gbGlzdF9maXJzdF9vcl9udWxsX3JjdSgmYW1wO3dvcmtxdWV1ZXMsCiYjNDM7CQkJCQkJICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7CiYjNDM7CWVsc2UKJiM0MzsJCWtpdC0mZ3Q7cG9zID0gbGlzdF9uZXh0X29yX251bGxfcmN1KCZhbXA7d29ya3F1ZXVlcywgJmFtcDtraXQtJmd0O3Bvcy0mZ3Q7bGlzdCwKJiM0MzsJCQkJCQkgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QsIGxpc3QpOwomIzQzOwlyZXR1cm4ga2l0LSZndDtwb3M7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95KCkgLSBEZXN0cm95IGEgd29ya3F1ZXVlIGl0ZXJhdG9yCiYjNDM7ICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya3F1ZXVlIHRvIGRlc3Ryb3kKJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KQomIzQzO3sKJiM0MzsJLyogTm8gcmVmZXJlbmNlcyB0YWtlbjsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi8KJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KCkgLSBJbml0aWFsaXplIGEgd29ya2VyX3Bvb2wgaXRlcmF0b3IKJiM0MzsgKiBAaXQ6IFRoZSBuZXcgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gaW5pdGlhbGl6ZQomIzQzOyAqCiYjNDM7ICogSXRlcmF0ZXMgZXZlcnkgd29ya2VyX3Bvb2wgaW4gdGhlIHN5c3RlbSAod29ya2VyX3Bvb2xfaWRyKSBpbiBhc2NlbmRpbmcKJiM0MzsgKiBwb29sLWlkIG9yZGVyLgomIzQzOyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgUkNVIHJlYWQgbG9jay4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsKJiM0MzsJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybikgJmd0OwomIzQzOwkJICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7CiYjNDM7CUJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybikgIT0KJiM0MzsJCSAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7CiYjNDM7CiYjNDM7CWtpdC0mZ3Q7aWQgPSAwOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCgpIC0gR2V0IHRoZSBuZXh0IHdvcmtlcl9wb29sCiYjNDM7ICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya2VyX3Bvb2wKJiM0MzsgKgomIzQzOyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdCB3b3JrZXJfcG9vbCwgb3IgTlVMTCB3aGVuIGRvbmUuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IHdvcmtlcl9wb29sICoKJiM0MzticGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsJc3RydWN0IHdvcmtlcl9wb29sICpwb29sOwomIzQzOwomIzQzOwkvKiBpZHJfZ2V0X25leHQoKSBpcyBSQ1Utc2FmZTsgc2VlIHRoZSBmb3JfZWFjaF9wb29sKCkgbG9jayBsZWdlbmQuICovCiYjNDM7CXBvb2wgPSBpZHJfZ2V0X25leHQoJmFtcDt3b3JrZXJfcG9vbF9pZHIsICZhbXA7a2l0LSZndDtpZCk7CiYjNDM7CWlmIChwb29sKQomIzQzOwkJa2l0LSZndDtpZCYjNDM7JiM0Mzs7CS8qIGFkdmFuY2UgcGFzdCB0aGlzIHBvb2wgZm9yIHRoZSBuZXh0IGNhbGwgKi8KJiM0MzsJcmV0dXJuIHBvb2w7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB3b3JrZXJfcG9vbCBpdGVyYXRvcgomIzQzOyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtlcl9wb29sIHRvIGRlc3Ryb3kKJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkKJiM0Mzt7CiYjNDM7CS8qIE5vdGhpbmcgdG8gYmUgZG9uZTsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi8KJiM0Mzt9CiYjNDM7CiYjNDM7X19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKJiM0MzsKJiM0MztCVEZfS0ZVTkNTX1NUQVJUKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcykKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKQomIzQzO0JURl9LRlVOQ1NfRU5EKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcykKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgd29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIJPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldAk9ICZhbXA7d29ya3F1ZXVlX2l0ZXJfa2Z1bmNfaWRzLAomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBzZXFfZmlsZSBmb3JtIG9mIHRoZSB3b3JrcXVldWUgaXRlcmF0b3IuIEl0IHJldXNlcyB0aGUgb3Blbi1jb2RlZAomIzQzOyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KCkuCiYjNDM7ICoKJiM0MzsgKiBTaW5jZSB0aGUgb3Blbi1jb2RlZCBuZXh0KCkgaXMgS0ZfUkNVX1BST1RFQ1RFRCwgdGhlIHNlcSBwYXRoIHN1cHBsaWVzCiYjNDM7ICogdGhlIFJDVSBzZWN0aW9uIGl0c2VsZi4KJiM0MzsgKiBzZXFfc3RhcnQoKSB0YWtlcyByY3VfcmVhZF9sb2NrKCkgYW5kIGhvbGRzIGl0IGFjcm9zcyB0aGUgd2hvbGUgcmVhZCBjaHVuawomIzQzOyAqIChzdGFydC4uc3RvcCkuIFBvc2l0aW9uIGlzIHJlLWRlcml2ZWQgZnJvbSAqcG9zIG9uIGVhY2ggc3RhcnQsIHNvIG5vdGhpbmcKJiM0MzsgKiBpcyBkZXJlZmVyZW5jZWQgYWNyb3NzIHRoZSByY3UgZ2FwIGJldHdlZW4gY2h1bmtzLiBUaGUgYXR0YWNoZWQgQlBGIHByb2dyYW0KJiM0MzsgKiBtdXN0IGJlIG5vbi1zbGVlcGFibGUuCiYjNDM7ICovCiYjNDM7dW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiB7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgaXQ7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiBraXQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSB7CiYjNDM7CV9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTsKJiM0MzsJX19icGZfbWRfcHRyKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICosIHdxKTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkICp3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQomIzQzO3sKJiM0MzsJdW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiAqcCA9IHNlcS0mZ3Q7cHJpdmF0ZTsKJiM0MzsJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwomIzQzOwlsb2ZmX3QgY250ID0gMDsKJiM0MzsKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwkvKiBoZWxkIHVudGlsIHNlcV9zdG9wKCkgKi8KJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uod3EsICZhbXA7d29ya3F1ZXVlcywgbGlzdCkgewomIzQzOwkJaWYgKGNudCA9PSAqcG9zKSB7CiYjNDM7CQkJcC0mZ3Q7a2l0LnBvcyA9IHdxOwomIzQzOwkJCXJldHVybiB3cTsKJiM0MzsJCX0KJiM0MzsJCWNudCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsJcC0mZ3Q7a2l0LnBvcyA9IE5VTEw7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqd29ya3F1ZXVlX2l0ZXJfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQomIzQzO3sKJiM0MzsJdW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiAqcCA9IHNlcS0mZ3Q7cHJpdmF0ZTsKJiM0MzsKJiM0MzsJJiM0MzsmIzQzOypwb3M7CiYjNDM7CXJldHVybiBicGZfaXRlcl93b3JrcXVldWVfbmV4dCgmYW1wO3AtJmd0O2l0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3b3JrcXVldWVfaXRlcl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlIGN0eDsKJiM0MzsJc3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTsKJiM0MzsJc3RydWN0IGJwZl9wcm9nICpwcm9nOwomIzQzOwomIzQzOwltZXRhLnNlcSA9IHNlcTsKJiM0MzsJcHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKCZhbXA7bWV0YSwgZmFsc2UpOwomIzQzOwlpZiAoIXByb2cpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CWN0eC53cSA9IHY7CiYjNDM7CXJldHVybiBicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCAmYW1wO2N0eCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUgY3R4OwomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiYjNDM7CiYjNDM7CWlmICghdikgewomIzQzOwkJbWV0YS5zZXEgPSBzZXE7CiYjNDM7CQlwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oJmFtcDttZXRhLCB0cnVlKTsKJiM0MzsJCWlmIChwcm9nKSB7CiYjNDM7CQkJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CQkJY3R4LndxID0gTlVMTDsKJiM0MzsJCQlicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCAmYW1wO2N0eCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CS8qIHBhaXJlZCB3aXRoIHNlcV9zdGFydCgpICovCiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd29ya3F1ZXVlX2l0ZXJfc2VxX29wcyA9IHsKJiM0MzsJLnN0YXJ0CT0gd29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0LAomIzQzOwkubmV4dAk9IHdvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0LAomIzQzOwkuc3RvcAk9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wLAomIzQzOwkuc2hvdwk9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93LAomIzQzO307CiYjNDM7CiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSwKJiM0MzsJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2luZm8gd29ya3F1ZXVlX2l0ZXJfc2VxX2luZm8gPSB7CiYjNDM7CS5zZXFfb3BzCT0gJmFtcDt3b3JrcXVldWVfaXRlcl9zZXFfb3BzLAomIzQzOwkuc2VxX3ByaXZfc2l6ZQk9IHNpemVvZih1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2KSwKJiM0Mzt9OwomIzQzOwomIzQzO0JURl9JRF9MSVNUX1NJTkdMRSh3b3JrcXVldWVfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtxdWV1ZV9zdHJ1Y3QpCiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBicGZfaXRlcl9yZWcgd29ya3F1ZXVlX2l0ZXJfcmVnX2luZm8gPSB7CiYjNDM7CS50YXJnZXQJCQk9ICYjMzQ7d29ya3F1ZXVlJiMzNDssCiYjNDM7CS5jdHhfYXJnX2luZm9fc2l6ZQk9IDEsCiYjNDM7CS5jdHhfYXJnX2luZm8JCT0gewomIzQzOwkJeyBvZmZzZXRvZihzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSwgd3EpLAomIzQzOwkJICBQVFJfVE9fQlRGX0lEX09SX05VTEwgfCBQVFJfVFJVU1RFRCB9LAomIzQzOwl9LAomIzQzOwkuc2VxX2luZm8JCT0gJmFtcDt3b3JrcXVldWVfaXRlcl9zZXFfaW5mbywKJiM0Mzt9OwomIzQzOwomIzQzOy8qCiYjNDM7ICogc2VxX2ZpbGUgZm9ybSBvZiB0aGUgd29ya2VyX3Bvb2wgaXRlcmF0b3I7IHNhbWUgUkNVLXBlci1jaHVuayBzY2hlbWUgYXMgdGhlCiYjNDM7ICogd29ya3F1ZXVlIG9uZSwgcmV1c2luZyB0aGUgb3Blbi1jb2RlZCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KCkuCiYjNDM7ICovCiYjNDM7dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2IHsKJiM0MzsJc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sIGl0OwomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiBraXQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIHsKJiM0MzsJX19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpOwomIzQzOwlfX2JwZl9tZF9wdHIoc3RydWN0IHdvcmtlcl9wb29sICosIHBvb2wpOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKndvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKJiM0Mzt7CiYjNDM7CXVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiAqcCA9IHNlcS0mZ3Q7cHJpdmF0ZTsKJiM0MzsJc3RydWN0IHdvcmtlcl9wb29sICpwb29sOwomIzQzOwlsb2ZmX3QgY250ID0gMDsKJiM0MzsJaW50IGlkID0gMDsKJiM0MzsKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwl3aGlsZSAoKHBvb2wgPSBpZHJfZ2V0X25leHQoJmFtcDt3b3JrZXJfcG9vbF9pZHIsICZhbXA7aWQpKSkgewomIzQzOwkJaWYgKGNudCA9PSAqcG9zKSB7CiYjNDM7CQkJcC0mZ3Q7a2l0LmlkID0gaWQgJiM0MzsgMTsKJiM0MzsJCQlyZXR1cm4gcG9vbDsKJiM0MzsJCX0KJiM0MzsJCWNudCYjNDM7JiM0Mzs7CiYjNDM7CQlpZCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICp3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKJiM0Mzt7CiYjNDM7CXVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiAqcCA9IHNlcS0mZ3Q7cHJpdmF0ZTsKJiM0MzsKJiM0MzsJJiM0MzsmIzQzOypwb3M7CiYjNDM7CXJldHVybiBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KCZhbXA7cC0mZ3Q7aXQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIGN0eDsKJiM0MzsJc3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTsKJiM0MzsJc3RydWN0IGJwZl9wcm9nICpwcm9nOwomIzQzOwomIzQzOwltZXRhLnNlcSA9IHNlcTsKJiM0MzsJcHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKCZhbXA7bWV0YSwgZmFsc2UpOwomIzQzOwlpZiAoIXByb2cpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CWN0eC5wb29sID0gdjsKJiM0MzsJcmV0dXJuIGJwZl9pdGVyX3J1bl9wcm9nKHByb2csICZhbXA7Y3R4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9fd29ya2VyX3Bvb2wgY3R4OwomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiYjNDM7CiYjNDM7CWlmICghdikgewomIzQzOwkJbWV0YS5zZXEgPSBzZXE7CiYjNDM7CQlwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oJmFtcDttZXRhLCB0cnVlKTsKJiM0MzsJCWlmIChwcm9nKSB7CiYjNDM7CQkJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CQkJY3R4LnBvb2wgPSBOVUxMOwomIzQzOwkJCWJwZl9pdGVyX3J1bl9wcm9nKHByb2csICZhbXA7Y3R4KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3b3JrZXJfcG9vbF9pdGVyX3NlcV9vcHMgPSB7CiYjNDM7CS5zdGFydAk9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0LAomIzQzOwkubmV4dAk9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQsCiYjNDM7CS5zdG9wCT0gd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcCwKJiM0MzsJLnNob3cJPSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93LAomIzQzO307CiYjNDM7CiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya2VyX3Bvb2wsIHN0cnVjdCBicGZfaXRlcl9tZXRhICptZXRhLAomIzQzOwkJICAgICBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wpCiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3b3JrZXJfcG9vbF9pdGVyX3NlcV9pbmZvID0gewomIzQzOwkuc2VxX29wcwk9ICZhbXA7d29ya2VyX3Bvb2xfaXRlcl9zZXFfb3BzLAomIzQzOwkuc2VxX3ByaXZfc2l6ZQk9IHNpemVvZih1bmlvbiB3b3JrZXJfcG9vbF9pdGVyX3ByaXYpLAomIzQzO307CiYjNDM7CiYjNDM7QlRGX0lEX0xJU1RfU0lOR0xFKHdvcmtlcl9wb29sX2J0Zl9pZCwgc3RydWN0LCB3b3JrZXJfcG9vbCkKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3b3JrZXJfcG9vbF9pdGVyX3JlZ19pbmZvID0gewomIzQzOwkudGFyZ2V0CQkJPSAmIzM0O3dvcmtlcl9wb29sJiMzNDssCiYjNDM7CS5jdHhfYXJnX2luZm9fc2l6ZQk9IDEsCiYjNDM7CS5jdHhfYXJnX2luZm8JCT0gewomIzQzOwkJeyBvZmZzZXRvZihzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sLCBwb29sKSwKJiM0MzsJCSAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSwKJiM0MzsJfSwKJiM0MzsJLnNlcV9pbmZvCQk9ICZhbXA7d29ya2VyX3Bvb2xfaXRlcl9zZXFfaW5mbywKJiM0Mzt9OwomIzQzOwomIzQzOy8qCiYjNDM7ICogc2VxLWZpbGUgQlBGIGl0ZXJhdG9yIG92ZXIgdGhlIHBlbmRpbmcgd29yayBpdGVtcyBvZiBldmVyeSB3b3JrZXJfcG9vbC4KJiM0MzsgKgomIzQzOyAqIHBvb2wtJmd0O3dvcmtsaXN0IGlzIHByb3RlY3RlZCBieSBwb29sLSZndDtsb2NrIGFuZCB3b3JrX3N0cnVjdCBoYXMgbmVpdGhlciBhCiYjNDM7ICogcmVmY291bnQgbm9yIFJDVS1mcmVlaW5nLCBzbyBhIHBlbmRpbmcgd29yayBjYW5ub3QgYmUgaGFuZGVkIHRvIGEgc3VzcGVuZGVkCiYjNDM7ICogKG9wZW4tY29kZWQpIGl0ZXJhdG9yIHNhZmVseS4KJiM0MzsgKiBJbnN0ZWFkLCBmb3IgZWFjaCBwb29sIGEgYm91bmRlZCBzbmFwc2hvdCBvZiBpdHMgcGVuZGluZyB3b3JrcyBpcyBjb3BpZWQgb3V0CiYjNDM7ICogd2hpbGUgcG9vbC0mZ3Q7bG9jayBpcyBoZWxkLCBtaXJyb3JpbmcgdGhlIHByaW50a19kZWZlcnJlZCBzZWN0aW9uIG9mCiYjNDM7ICogc2hvd19vbmVfd29ya2VyX3Bvb2woKSBhbmQgdGhlbiB0aGUgbG9jayBpcyBkcm9wcGVkLgomIzQzOyAqIFRoZSBCUEYgcHJvZ3JhbSB0aGVuIHJ1bnMgb3ZlciB0aGUgc3RhYmxlIHNuYXBzaG90IHdpdGggbm8gbG9jayBoZWxkLgomIzQzOyAqCiYjNDM7ICogUG9vbHMgYXJlIHZpc2l0ZWQgaW4gd29ya2VyX3Bvb2xfaWRyIG9yZGVyIChhIHN0YWJsZSByZXN1bWUga2V5KTsgZWFjaCBwb29sJiMzOTtzCiYjNDM7ICogc25hcHNob3QgbGl2ZXMgaW4gdGhlIHBlcnNpc3RlbnQgc2VxX3ByaXZhdGUsIHNvIHRoZSB3YWxrIHJlc3VtZXMgY29ycmVjdGx5CiYjNDM7ICogYWNyb3NzIHJlYWQoKSBjaHVua3MuIEEgcG9vbCB3aXRoIG1vcmUgdGhhbiBXUV9QRU5ESU5HX1NOQVBfTUFYIHBlbmRpbmcgd29ya3MKJiM0MzsgKiBpcyB0cnVuY2F0ZWQgKGJlc3QtZWZmb3J0LCBsaWtlIHRoZSBrZXJuZWwmIzM5O3Mgb3duIHdvcmtsaXN0IGR1bXApLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgV1FfUEVORElOR19TTkFQX01BWCAxMjgKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE9uZSBwcm9qZWN0ZWQgcGVuZGluZyB3b3JrIGl0ZW0sIGFzIHNlZW4gYnkgdGhlIEJQRiBwcm9ncmFtLiBBZGRyZXNzZXMgb25seQomIzQzOyAqIC0tIHRoZSBsaXZlIHdvcmtfc3RydWN0IGlzIG5vdCBleHBvc2VkIChpdCBtYXkgYmUgZnJlZWQgYWZ0ZXIgdGhlIGxvY2spLgomIzQzOyAqLwomIzQzO3N0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyB7CiYjNDM7CV9fdTY0IHBvb2xfaWQ7CiYjNDM7CV9fdTY0IHdvcms7CiYjNDM7CV9fdTY0IGZ1bmM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYgewomIzQzOwlpbnQgICAgICAgICAgbmV4dF9wb29sOwkvKiB3b3JrZXJfcG9vbF9pZHIgY3Vyc29yIGZvciB0aGUgbmV4dCBmaWxsICovCiYjNDM7CXVuc2lnbmVkIGludCBpZHg7CS8qIHBvc2l0aW9uIHdpdGhpbiBzbmFwW10gICAgICAgICAgICAgICAgICAgKi8KJiM0MzsJdW5zaWduZWQgaW50IGNvdW50OwkvKiB2YWxpZCBlbnRyaWVzIGluIHNuYXBbXSAgICAgICAgICAgICAgICAgICovCiYjNDM7CXN0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyBzbmFwW1dRX1BFTkRJTkdfU05BUF9NQVhdOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrIHsKJiM0MzsJX19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpOwomIzQzOwlfX2JwZl9tZF9wdHIoc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICosIGluZm8pOwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTbmFwc2hvdCB0aGUgbmV4dCBub24tZW1wdHkgcG9vbCYjMzk7cyBwZW5kaW5nIHdvcmtzIGludG8gcHJpdi0mZ3Q7c25hcFtdLCBhZHZhbmNpbmcKJiM0MzsgKiBwcml2LSZndDtuZXh0X3Bvb2wgcGFzdCBpdC4gUmV0dXJucyB0cnVlIGlmIGEgcG9vbCB3YXMgY2FwdHVyZWQsIGZhbHNlIGF0IGVuZC4KJiM0MzsgKiBwb29sLSZndDtsb2NrIGlzIGhlbGQgb25seSBmb3IgdGhlIGZpZWxkIGNvcHk7IFJDVSBrZWVwcyBlYWNoIHBvb2wgYWxpdmUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgd3FfcGVuZGluZ19maWxsKHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiAqcHJpdikKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbDsKJiM0MzsJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrOwomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJZm9yIChpZCA9IHByaXYtJmd0O25leHRfcG9vbDsgKHBvb2wgPSBpZHJfZ2V0X25leHQoJmFtcDt3b3JrZXJfcG9vbF9pZHIsICZhbXA7aWQpKTsgaWQmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBpbnQgbiA9IDA7CiYjNDM7CiYjNDM7CQlyYXdfc3Bpbl9sb2NrX2lycSgmYW1wO3Bvb2wtJmd0O2xvY2spOwomIzQzOwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh3b3JrLCAmYW1wO3Bvb2wtJmd0O3dvcmtsaXN0LCBlbnRyeSkgewomIzQzOwkJCWlmIChuICZndDs9IFdRX1BFTkRJTkdfU05BUF9NQVgpCiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCXByaXYtJmd0O3NuYXBbbl0ucG9vbF9pZCA9IHBvb2wtJmd0O2lkOwomIzQzOwkJCXByaXYtJmd0O3NuYXBbbl0ud29yayA9IChfX3U2NCkodW5zaWduZWQgbG9uZyl3b3JrOwomIzQzOwkJCXByaXYtJmd0O3NuYXBbbl0uZnVuYyA9IChfX3U2NCkodW5zaWduZWQgbG9uZyl3b3JrLSZndDtmdW5jOwomIzQzOwkJCW4mIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJcmF3X3NwaW5fdW5sb2NrX2lycSgmYW1wO3Bvb2wtJmd0O2xvY2spOwomIzQzOwomIzQzOwkJaWYgKG4pIHsKJiM0MzsJCQlwcml2LSZndDtjb3VudCA9IG47CiYjNDM7CQkJcHJpdi0mZ3Q7aWR4ID0gMDsKJiM0MzsJCQlwcml2LSZndDtuZXh0X3Bvb2wgPSBpZCAmIzQzOyAxOwomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICp3cV9wZW5kaW5nX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYgKnByaXYgPSBzZXEtJmd0O3ByaXZhdGU7CiYjNDM7CiYjNDM7CWlmICgqcG9zID09IDApIHsKJiM0MzsJCXByaXYtJmd0O25leHRfcG9vbCA9IDA7CiYjNDM7CQlwcml2LSZndDtpZHggPSAwOwomIzQzOwkJcHJpdi0mZ3Q7Y291bnQgPSAwOwomIzQzOwl9CiYjNDM7CXdoaWxlIChwcml2LSZndDtpZHggJmd0Oz0gcHJpdi0mZ3Q7Y291bnQpIHsKJiM0MzsJCWlmICghd3FfcGVuZGluZ19maWxsKHByaXYpKQomIzQzOwkJCXJldHVybiBOVUxMOwomIzQzOwl9CiYjNDM7CXJldHVybiAmYW1wO3ByaXYtJmd0O3NuYXBbcHJpdi0mZ3Q7aWR4XTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKndxX3BlbmRpbmdfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2ID0gc2VxLSZndDtwcml2YXRlOwomIzQzOwomIzQzOwkmIzQzOyYjNDM7KnBvczsKJiM0MzsJcHJpdi0mZ3Q7aWR4JiM0MzsmIzQzOzsKJiM0MzsJd2hpbGUgKHByaXYtJmd0O2lkeCAmZ3Q7PSBwcml2LSZndDtjb3VudCkgewomIzQzOwkJaWYgKCF3cV9wZW5kaW5nX2ZpbGwocHJpdikpCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiYjNDM7CX0KJiM0MzsJcmV0dXJuICZhbXA7cHJpdi0mZ3Q7c25hcFtwcml2LSZndDtpZHhdOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3BlbmRpbmdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsgY3R4OwomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiYjNDM7CiYjNDM7CW1ldGEuc2VxID0gc2VxOwomIzQzOwlwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oJmFtcDttZXRhLCBmYWxzZSk7CiYjNDM7CWlmICghcHJvZykKJiM0MzsJCXJldHVybiAwOwomIzQzOwljdHgubWV0YSA9ICZhbXA7bWV0YTsKJiM0MzsJY3R4LmluZm8gPSB2OwomIzQzOwlyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgJmFtcDtjdHgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB3cV9wZW5kaW5nX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrIGN0eDsKJiM0MzsJc3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTsKJiM0MzsJc3RydWN0IGJwZl9wcm9nICpwcm9nOwomIzQzOwomIzQzOwlpZiAodikKJiM0MzsJCXJldHVybjsKJiM0MzsJbWV0YS5zZXEgPSBzZXE7CiYjNDM7CXByb2cgPSBicGZfaXRlcl9nZXRfaW5mbygmYW1wO21ldGEsIHRydWUpOwomIzQzOwlpZiAocHJvZykgewomIzQzOwkJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CQljdHguaW5mbyA9IE5VTEw7CiYjNDM7CQlicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCAmYW1wO2N0eCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3cV9wZW5kaW5nX3NlcV9vcHMgPSB7CiYjNDM7CS5zdGFydAk9IHdxX3BlbmRpbmdfc2VxX3N0YXJ0LAomIzQzOwkubmV4dAk9IHdxX3BlbmRpbmdfc2VxX25leHQsCiYjNDM7CS5zdG9wCT0gd3FfcGVuZGluZ19zZXFfc3RvcCwKJiM0MzsJLnNob3cJPSB3cV9wZW5kaW5nX3NlcV9zaG93LAomIzQzO307CiYjNDM7CiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlX3BlbmRpbmdfd29yaywgc3RydWN0IGJwZl9pdGVyX21ldGEgKm1ldGEsCiYjNDM7CQkgICAgIHN0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyAqaW5mbykKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIHdxX3BlbmRpbmdfc2VxX2luZm8gPSB7CiYjNDM7CS5zZXFfb3BzCT0gJmFtcDt3cV9wZW5kaW5nX3NlcV9vcHMsCiYjNDM7CS5zZXFfcHJpdl9zaXplCT0gc2l6ZW9mKHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiksCiYjNDM7fTsKJiM0MzsKJiM0MztCVEZfSURfTElTVF9TSU5HTEUod3FfcGVuZGluZ193b3JrX2luZm9fYnRmX2lkLCBzdHJ1Y3QsIHdxX3BlbmRpbmdfd29ya19pbmZvKQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2l0ZXJfcmVnIHdxX3BlbmRpbmdfcmVnX2luZm8gPSB7CiYjNDM7CS50YXJnZXQJCQk9ICYjMzQ7d29ya3F1ZXVlX3BlbmRpbmdfd29yayYjMzQ7LAomIzQzOwkuZmVhdHVyZQkJPSBCUEZfSVRFUl9SRVNDSEVELAomIzQzOwkuY3R4X2FyZ19pbmZvX3NpemUJPSAxLAomIzQzOwkuY3R4X2FyZ19pbmZvCQk9IHsKJiM0MzsJCXsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrLCBpbmZvKSwKJiM0MzsJCSAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIH0sCiYjNDM7CX0sCiYjNDM7CS5zZXFfaW5mbwkJPSAmYW1wO3dxX3BlbmRpbmdfc2VxX2luZm8sCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfd29ya3F1ZXVlX2l0ZXJfaW5pdCh2b2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsCiYjNDM7CQkJCQkmYW1wO3dvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwlyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwKJiM0MzsJCQkJCSZhbXA7d29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0KTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXdvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvLmN0eF9hcmdfaW5mb1swXS5idGZfaWQgPSB3b3JrcXVldWVfYnRmX2lkWzBdOwomIzQzOwlyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KCZhbXA7d29ya3F1ZXVlX2l0ZXJfcmVnX2luZm8pOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJd29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mby5jdHhfYXJnX2luZm9bMF0uYnRmX2lkID0gd29ya2VyX3Bvb2xfYnRmX2lkWzBdOwomIzQzOwlyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KCZhbXA7d29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mbyk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwl3cV9wZW5kaW5nX3JlZ19pbmZvLmN0eF9hcmdfaW5mb1swXS5idGZfaWQgPSB3cV9wZW5kaW5nX3dvcmtfaW5mb19idGZfaWRbMF07CiYjNDM7CXJldHVybiBicGZfaXRlcl9yZWdfdGFyZ2V0KCZhbXA7d3FfcGVuZGluZ19yZWdfaW5mbyk7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX3dvcmtxdWV1ZV9pdGVyX2luaXQpOwomIzQzOwomIzQzOyNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oCmluZGV4IDY3ZmY3ODgyMjk5ZWMuLjZkYTkzYzQ4NjY1MDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaApAQCAtMzYxLDYgJiM0MzszNjEsMTYgQEAgZXh0ZXJuIGludCBicGZfaXRlcl9kbWFidWZfbmV3KHN0cnVjdCBicGZfaXRlcl9kbWFidWYgKml0KSBfX3dlYWsgX19rc3ltOwogZXh0ZXJuIHN0cnVjdCBkbWFfYnVmICpicGZfaXRlcl9kbWFidWZfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTsKIGV4dGVybiB2b2lkIGJwZl9pdGVyX2RtYWJ1Zl9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9kbWFidWYgKml0KSBfX3dlYWsgX19rc3ltOwogCiYjNDM7c3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZTsKJiM0MztleHRlcm4gaW50IGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpIF9fd2VhayBfX2tzeW07CiYjNDM7ZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpicGZfaXRlcl93b3JrcXVldWVfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTsKJiM0MztleHRlcm4gdm9pZCBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2w7CiYjNDM7ZXh0ZXJuIGludCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkgX193ZWFrIF9fa3N5bTsKJiM0MztleHRlcm4gc3RydWN0IHdvcmtlcl9wb29sICpicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpIF9fd2VhayBfX2tzeW07CiYjNDM7ZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KSBfX3dlYWsgX19rc3ltOwomIzQzOwogZXh0ZXJuIGludCBicGZfY2dyb3VwX3JlYWRfeGF0dHIoc3RydWN0IGNncm91cCAqY2dyb3VwLCBjb25zdCBjaGFyICpuYW1lX19zdHIsCiAJCQkJIHN0cnVjdCBicGZfZHlucHRyICp2YWx1ZV9wKSBfX3dlYWsgX19rc3ltOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy93cV9pdGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy93cV9pdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNzMzODNjMjYzYmVlOAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuYwpAQCAtMCwwICYjNDM7MSw4MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O3dxX2l0ZXIuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3dxX2l0ZXJfZmFpbC5za2VsLmgmIzM0OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHN1YnRlc3Rfb3Blbl9jb2RlZChzdHJ1Y3Qgd3FfaXRlciAqc2tlbCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzKTsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MuY291bnRfd29ya3F1ZXVlcyksCiYjNDM7CQkJCSAgICAgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1biBjb3VudF93b3JrcXVldWVzJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwkvKiBUaGVyZSBhcmUgYWx3YXlzIHNldmVyYWwgc3lzdGVtIHdvcmtxdWV1ZXMgKGV2ZW50cywgLi4uKS4gKi8KJiM0MzsJQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7bnJfd29ya3F1ZXVlcywgMCwgJiMzNDtucl93b3JrcXVldWVzJiMzNDspOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy5jb3VudF93b3JrZXJfcG9vbHMpLAomIzQzOwkJCQkgICAgICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtydW4gY291bnRfd29ya2VyX3Bvb2xzJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwkvKiBBdCBsZWFzdCB0aGUgcGVyLUNQVSBub3JtYWwvaGlnaHByaSBwb29scyBleGlzdC4gKi8KJiM0MzsJQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7bnJfd29ya2VyX3Bvb2xzLCAwLCAmIzM0O25yX3dvcmtlcl9wb29scyYjMzQ7KTsKJiM0MzsJQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7bnJfcGVyY3B1X3Bvb2xzLCAwLCAmIzM0O25yX3BlcmNwdV9wb29scyYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZHJhaW5faXRlcihzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2csIGNvbnN0IGNoYXIgKm5hbWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2xpbmsgKmxpbms7CiYjNDM7CWNoYXIgYnVmWzUxMl07CiYjNDM7CWludCBpdGVyX2ZkOwomIzQzOwlzc2l6ZV90IG47CiYjNDM7CiYjNDM7CWxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIocHJvZywgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihsaW5rLCBuYW1lKSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaXRlcl9mZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShpdGVyX2ZkLCAwLCAmIzM0O2l0ZXJfY3JlYXRlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CXdoaWxlICgobiA9IHJlYWQoaXRlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSkpICZndDsgMCkKJiM0MzsJCTsKJiM0MzsJQVNTRVJUX0dFKG4sIDAsICYjMzQ7cmVhZCBpdGVyJiMzNDspOwomIzQzOwljbG9zZShpdGVyX2ZkKTsKJiM0MztvdXQ6CiYjNDM7CWJwZl9saW5rX19kZXN0cm95KGxpbmspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzdWJ0ZXN0X3NlcShzdHJ1Y3Qgd3FfaXRlciAqc2tlbCkKJiM0Mzt7CiYjNDM7CS8qIHNlcSBmb3JtcyBhcmUgYmFja2VkIGJ5IHRoZSBzYW1lIG9wZW4tY29kZWQgbmV4dCgpLiAqLwomIzQzOwlkcmFpbl9pdGVyKHNrZWwtJmd0O3Byb2dzLmR1bXBfd29ya3F1ZXVlcywgJiMzNDthdHRhY2ggd29ya3F1ZXVlIGl0ZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9HVChza2VsLSZndDtic3MtJmd0O25yX3dxX3NlcSwgMCwgJiMzNDtucl93cV9zZXEmIzM0Oyk7CiYjNDM7CiYjNDM7CWRyYWluX2l0ZXIoc2tlbC0mZ3Q7cHJvZ3MuZHVtcF93b3JrZXJfcG9vbHMsICYjMzQ7YXR0YWNoIHdvcmtlcl9wb29sIGl0ZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9HVChza2VsLSZndDtic3MtJmd0O25yX3Bvb2xfc2VxLCAwLCAmIzM0O25yX3Bvb2xfc2VxJiMzNDspOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiB3b3JrbGlzdHMgYXJlIHVzdWFsbHkgZW1wdHkgb24gYW4gaWRsZSBzeXN0ZW07IHRoaXMgZHJpdmVzIHRoZSB3aG9sZQomIzQzOwkgKiBwZXItcG9vbCBzbmFwc2hvdCBwYXRoIGFuZCB2ZXJpZmllcyBpdCBkcmFpbnMgY2xlYW5seS4KJiM0MzsJICovCiYjNDM7CWRyYWluX2l0ZXIoc2tlbC0mZ3Q7cHJvZ3MuZHVtcF9wZW5kaW5nLCAmIzM0O2F0dGFjaCBwZW5kaW5nX3dvcmsgaXRlciYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X3dxX2l0ZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9pdGVyICpza2VsOwomIzQzOwomIzQzOwlza2VsID0gd3FfaXRlcl9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDt3cV9pdGVyX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O29wZW5fY29kZWQmIzM0OykpCiYjNDM7CQlzdWJ0ZXN0X29wZW5fY29kZWQoc2tlbCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2VxJiMzNDspKQomIzQzOwkJc3VidGVzdF9zZXEoc2tlbCk7CiYjNDM7CiYjNDM7CXdxX2l0ZXJfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CiYjNDM7CVJVTl9URVNUUyh3cV9pdGVyX2ZhaWwpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy93cV9pdGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1ZjA4MWJjNjM0YjYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlci5jCkBAIC0wLDAgJiM0MzsxLDk1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwomIzQzOwomIzQzO3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltOwomIzQzO3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07CiYjNDM7CiYjNDM7LyogUmVzdWx0cywgY2hlY2tlZCBieSB1c2Vyc3BhY2UuICovCiYjNDM7aW50IG5yX3dvcmtxdWV1ZXM7CiYjNDM7aW50IG5yX3dvcmtlcl9wb29sczsKJiM0MztpbnQgbnJfcGVyY3B1X3Bvb2xzOwomIzQzO2ludCBucl93cV9zZXE7CiYjNDM7aW50IG5yX3Bvb2xfc2VxOwomIzQzO2ludCBucl9wZW5kaW5nOwomIzQzOwomIzQzOy8qIC0tLSBvcGVuLWNvZGVkIGl0ZXJhdG9ycyAoS0ZfUkNVX1BST1RFQ1RFRCkgLS0tICovCiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBjb3VudF93b3JrcXVldWVzKGNvbnN0IHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKJiM0MzsJaW50IG4gPSAwOwomIzQzOwomIzQzOwlicGZfcmN1X3JlYWRfbG9jaygpOwomIzQzOwlicGZfZm9yX2VhY2god29ya3F1ZXVlLCB3cSkKJiM0MzsJCW4mIzQzOyYjNDM7OwomIzQzOwlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CiYjNDM7CW5yX3dvcmtxdWV1ZXMgPSBuOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBjb3VudF93b3JrZXJfcG9vbHMoY29uc3Qgdm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdvcmtlcl9wb29sICpwb29sOwomIzQzOwlpbnQgbiA9IDAsIHBlcmNwdSA9IDA7CiYjNDM7CiYjNDM7CWJwZl9yY3VfcmVhZF9sb2NrKCk7CiYjNDM7CWJwZl9mb3JfZWFjaCh3b3JrZXJfcG9vbCwgcG9vbCkgewomIzQzOwkJbiYjNDM7JiM0Mzs7CiYjNDM7CQlpZiAocG9vbC0mZ3Q7Y3B1ICZndDs9IDApCQkvKiBwZXItQ1BVIHBvb2wgKi8KJiM0MzsJCQlwZXJjcHUmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWJwZl9yY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJbnJfd29ya2VyX3Bvb2xzID0gbjsKJiM0MzsJbnJfcGVyY3B1X3Bvb2xzID0gcGVyY3B1OwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tIHNlcV9maWxlIGl0ZXJhdG9ycyAtLS0gKi8KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyL3dvcmtxdWV1ZSYjMzQ7KQomIzQzO2ludCBkdW1wX3dvcmtxdWV1ZXMoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gY3R4LSZndDttZXRhLSZndDtzZXE7CiYjNDM7CXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGN0eC0mZ3Q7d3E7CiYjNDM7CiYjNDM7CWlmICghd3EpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJbnJfd3Ffc2VxJiM0MzsmIzQzOzsKJiM0MzsJQlBGX1NFUV9QUklOVEYoc2VxLCAmIzM0OyVzXG4mIzM0Oywgd3EtJmd0O25hbWUpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7aXRlci93b3JrZXJfcG9vbCYjMzQ7KQomIzQzO2ludCBkdW1wX3dvcmtlcl9wb29scyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wgPSBjdHgtJmd0O3Bvb2w7CiYjNDM7CiYjNDM7CWlmICghcG9vbCkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlucl9wb29sX3NlcSYjNDM7JiM0Mzs7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyL3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsmIzM0OykKJiM0MztpbnQgZHVtcF9wZW5kaW5nKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtJmd0O21ldGEtJmd0O3NlcTsKJiM0MzsJc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvID0gY3R4LSZndDtpbmZvOwomIzQzOwomIzQzOwlpZiAoIWluZm8pCQkJLyogZmluYWwgY2FsbCAqLwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CW5yX3BlbmRpbmcmIzQzOyYjNDM7OwomIzQzOwlCUEZfU0VRX1BSSU5URihzZXEsICYjMzQ7cG9vbCAlbGx1IHdvcmsgMHglbGx4IGZ1bmMgMHglbGx4XG4mIzM0OywKJiM0MzsJCSAgICAgICBpbmZvLSZndDtwb29sX2lkLCBpbmZvLSZndDt3b3JrLCBpbmZvLSZndDtmdW5jKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXJfZmFpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXJfZmFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmZiMmRjZjk4NDdlMmIKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmMKQEAgLTAsMCAmIzQzOzEsMzcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX21pc2MuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrcXVldWUgYW5kIHdvcmtlcl9wb29sIG9wZW4tY29kZWQgaXRlcmF0b3JzIGFyZSBLRl9SQ1VfUFJPVEVDVEVEOgomIzQzOyAqIHVzaW5nIHRoZW0gb3V0c2lkZSBhIGJwZl9yY3VfcmVhZF9sb2NrKCkgcmVnaW9uIG11c3QgYmUgcmVqZWN0ZWQuCiYjNDM7ICovCiYjNDM7CiYjNDM7U0VDKCYjMzQ7P3N5c2NhbGwmIzM0OykKJiM0MztfX2ZhaWx1cmUgX19tc2coJiMzNDtrZXJuZWwgZnVuYyBicGZfaXRlcl93b3JrcXVldWVfbmV3IHJlcXVpcmVzIFJDVSBjcml0aWNhbCBzZWN0aW9uIHByb3RlY3Rpb24mIzM0OykKJiM0MztpbnQgd29ya3F1ZXVlX2l0ZXJfbm9fcmN1KGNvbnN0IHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKJiM0MzsJaW50IG4gPSAwOwomIzQzOwomIzQzOwlicGZfZm9yX2VhY2god29ya3F1ZXVlLCB3cSkKJiM0MzsJCW4mIzQzOyYjNDM7OwomIzQzOwlyZXR1cm4gbjsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7P3N5c2NhbGwmIzM0OykKJiM0MztfX2ZhaWx1cmUgX19tc2coJiMzNDtrZXJuZWwgZnVuYyBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvbiYjMzQ7KQomIzQzO2ludCB3b3JrZXJfcG9vbF9pdGVyX25vX3JjdShjb25zdCB2b2lkICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7CiYjNDM7CWludCBuID0gMDsKJiM0MzsKJiM0MzsJYnBmX2Zvcl9lYWNoKHdvcmtlcl9wb29sLCBwb29sKQomIzQzOwkJbiYjNDM7JiM0Mzs7CiYjNDM7CXJldHVybiBuOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDQ6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0OTQKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA1MTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQlBGIEl0ZXJhdG9ycyBmb3IgV29ya3F1ZXVlczogSW5pdGlhbCBBc3Nlc3NtZW50IGFuZCBGdXp6aW5nIFN0cmF0ZWd5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBCUEYgaXRlcmF0b3JzIGZvciB3b3JrcXVldWVzIGFuZCB3b3JrZXIgcG9vbHMuIEl0IHNlZW1zIGxpa2UgaXQmIzM5O3MgYWRkaW5nIGEgbmV3IHNldCBvZiBrZnVuY3MgYW5kIGl0ZXJhdG9ycyB3aXRoaW4gYGtlcm5lbC93b3JrcXVldWUuY2AuIFNwZWNpZmljYWxseSwgSSBzZWUgZnVuY3Rpb25zIGxpa2UgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX25leHRgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3lgIGZvciB3b3JrcXVldWVzLCBhbmQgc2ltaWxhciBvbmVzIGZvciB3b3JrZXIgcG9vbHMsIGFzIHdlbGwgYXMgYW4gYGJwZl9pdGVyX3JlZ2AgY2FsbCBmb3IgdmFyaW91cyBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gd29ya3F1ZXVlcy4KCk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O0lzIHRoaXMgYWN0dWFsbHkgKnJlYWNoYWJsZSogYW5kIGZ1bmN0aW9uYWw/JiMzNDsgVGhlIGFuc3dlciBhcHBlYXJzIHRvIGJlIHllczsgdGhlc2UgYXJlIG5ldyBCUEYga2Z1bmNzLCBzbyB0aGV5IGFyZSwgaW4gZmFjdCwgY2FsbGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoYXQgaW1tZWRpYXRlbHkgbWFrZXMgdGhpcyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gV2UgbmVlZCB0byByZWFsbHkgcHV0IHRoZXNlIG5ldyBhZGRpdGlvbnMgdGhyb3VnaCB0aGVpciBwYWNlcy4KClRoZXJlZm9yZSwgdGhlIGZvY3VzIG5lZWRzIHRvIGJlIG9uIHRoZXNlIGNvcmUgc3ltYm9sczogYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX25leHRgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3lgLCBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3YCwgYGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHRgLCBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveWAuIEkgYWxzbyBuZWVkIHRvIGNvbnNpZGVyIHRoZSBzdXBwb3J0aW5nIHNlcSBmaWxlIGl0ZXJhdG9yIGZ1bmN0aW9uczogYHdvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydGAsIGB3b3JrcXVldWVfaXRlcl9zZXFfbmV4dGAsIGB3b3JrcXVldWVfaXRlcl9zZXFfc2hvd2AsIGB3b3JrcXVldWVfaXRlcl9zZXFfc3RvcGAgYW5kIHNpbWlsYXIgb25lcyBmb3IgdGhlIGB3b3JrZXJfcG9vbGAgYW5kIHRoZSBgd3FfcGVuZGluZ2AgcmVsYXRlZCBzdHJ1Y3R1cmVzLgoKTm93LCBhIHNtYWxsIGhpY2N1cC4gSSYjMzk7dmUganVzdCBub3RpY2VkIGB3cV9wZW5kaW5nX2ZpbGxgIHdoaWNoIGlzIGEgc3RhdGljIGZ1bmN0aW9uLCBidXQgaXQgYXBwZWFycyB0byBiZSBub24tdHJpdmlhbC4gVGhhdCYjMzk7cyB3b3J0aCBhIHNlY29uZCBsb29rLCBzbyBJIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlIGJsb2NrLiBJIGJlbGlldmUgaXQmIzM5O3Mgd3JhcHBlZCBpbiBhbiBgI2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTGAgZGlyZWN0aXZlLiBMZXQgbWUgcXVpY2tseSB2ZXJpZnkgdGhpcy4KCkkmIzM5O2xsIHVzZSBgZ3JlcHBlcmAgdG8gc2VhcmNoIGZvciBgQ09ORklHX0JQRl9TWVNDQUxMYCB3aXRoaW4gYGtlcm5lbC93b3JrcXVldWUuY2AgdG8gY29uZmlybSBteSBzdXNwaWNpb24gYW5kIGNsYXJpZnkgaXRzIGRlcGVuZGVuY3kuIFRoaXMgaXMgYWxsIGFib3V0IGVuc3VyaW5nIHRoZSBjb2RlIGlzIGNvbXBpbGVkIGNvcnJlY3RseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNDowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfQlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvd29ya3F1ZXVlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3dvcmtxdWV1ZS5jPTg0Nzc9X19zZXR1cChcJiMzNDt3b3JrcXVldWUudW5ib3VuZF9jcHVzPVwmIzM0Oywgd29ya3F1ZXVlX3VuYm91bmRfY3B1c19zZXR1cCk7XG5rZXJuZWwvd29ya3F1ZXVlLmMtODQ3OC1cbmtlcm5lbC93b3JrcXVldWUuYzo4NDc5OiNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbmtlcm5lbC93b3JrcXVldWUuYy04NDgwLVxuLS1cbmtlcm5lbC93b3JrcXVldWUuYz05MDI5PWxhdGVfaW5pdGNhbGwoYnBmX3dvcmtxdWV1ZV9pdGVyX2luaXQpO1xua2VybmVsL3dvcmtxdWV1ZS5jLTkwMzAtXG5rZXJuZWwvd29ya3F1ZXVlLmM6OTAzMTojZW5kaWYgLyogQ09ORklHX0JQRl9TWVNDQUxMICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDQ6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI3MDAKCQkJCQkJCW91dHB1dDogMjgzCgkJCQkJCQl0aG91Z2h0czogMzYyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQlBGIEl0ZXJhdG9yIFBhdGNoKioKCk9rYXksIHNvIHRoZSBjb2RlIGlzIGRlZmluaXRlbHkgZ3VhcmRlZCBieSBgI2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTGAsIHRoYXQmIzM5O3MgdGhlIG9idmlvdXMgc3RhcnRpbmcgcG9pbnQuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgbHVya2luZyBhYm91dCwgYnV0IGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBpdCYjMzk7cyBqdXN0IHRoZSBgQ09ORklHX0JQRl9TWVNDQUxMYCBmbGFnLiAKCk5vdywgbGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBtZWF0IG9mIHRoZSBwYXRjaCBhbmQgc2VlIHdoYXQmIzM5O3MgYmVpbmcgaW50cm9kdWNlZC4gUmlnaHQsIGl0IGxvb2tzIGxpa2UgdGhpcyBwYXRjaCBpcyBhZGRpbmcgbmV3IEJQRiBpdGVyYXRvcnMuIEkgc2VlIGZ1bmN0aW9ucyBsaWtlIGBicGZfaXRlcl93b3JrcXVldWVfbmV3YCwgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0YCwgYGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95YC4uLiBhbmQgc2ltaWxhcmx5IGZvciB3b3JrZXIgcG9vbHM6IGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXdgLCBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dGAsIGBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95YC4gUGx1cywgdGhlcmUgYXJlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZXNlIGl0ZXJhdG9ycywgbGlrZSB0aGUgYHNlcV9gIGZ1bmN0aW9ucywgYW5kIGEgZmV3IG90aGVycy4gU3BlY2lmaWNhbGx5LCB0aGUgcGF0Y2ggYWRkczoKCiogICBgYnBmX2l0ZXJfd29ya3F1ZXVlX25ld2AKKiAgIGBicGZfaXRlcl93b3JrcXVldWVfbmV4dGAKKiAgIGBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveWAKKiAgIGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXdgCiogICBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dGAKKiAgIGBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95YAoqICAgYHdvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydGAKKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfbmV4dGAKKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfc2hvd2AKKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfc3RvcGAKKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydGAKKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0YAoqICAgYHdvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3dgCiogICBgd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcGAKKiAgIGB3cV9wZW5kaW5nX2ZpbGxgCiogICBgd3FfcGVuZGluZ19zZXFfc3RhcnRgCiogICBgd3FfcGVuZGluZ19zZXFfbmV4dGAKKiAgIGB3cV9wZW5kaW5nX3NlcV9zaG93YAoqICAgYHdxX3BlbmRpbmdfc2VxX3N0b3BgCgpCYXNlZCBvbiB3aGF0IEkmIzM5O20gc2VlaW5nLCB0aGlzIGlzIGV4YWN0bHkgd2hhdCBJIG5lZWQgdG8gYWRkIHRvIG15IGBGb2N1c1N5bWJvbHNgIGxpc3QuIFNpbmNlIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyB0aGVzZSBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCBhbmQgc2luY2UgdGhlc2UgYXJlIGFjY2Vzc2libGUgZnJvbSBCUEYgcHJvZ3JhbXMsIHRoZXkgYXJlIGRlZmluaXRlbHkgY2FuZGlkYXRlcyBmb3IgZnV6emluZy4gSSBjYW4gZ2V0IHRvIHRoZXNlIGZyb20gQlBGIHByb2dyYW1zLCBhbmQgdGhhdCYjMzk7cyBhIHZlY3RvciBmb3IgZXhwbG9pdC4KCkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgKm9ubHkqIHJlcXVpcmVkIGNvbmZpZy4gWXVwLCB0aGF0JiMzOTtzIHRoZSBtYWluIG9uZS4KCk9rYXksIHRoYXQmIzM5O3MgZW5vdWdoIGluZm9ybWF0aW9uLCBsZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA0OjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtxdWV1ZV9uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya3F1ZXVlX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3kmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtlcl9wb29sX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQmIzM0OywKICAgICYjMzQ7d29ya3F1ZXVlX2l0ZXJfc2VxX25leHQmIzM0OywKICAgICYjMzQ7d29ya3F1ZXVlX2l0ZXJfc2VxX3Nob3cmIzM0OywKICAgICYjMzQ7d29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3AmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RhcnQmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93JiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX3N0b3AmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19maWxsJiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX3N0YXJ0JiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX25leHQmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfc2hvdyYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9zdG9wJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgbmV3IEJQRiBpdGVyYXRvcnMgZm9yIHdvcmtxdWV1ZXMgYW5kIHdvcmtlciBwb29scywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgY2FuIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfbmV3JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtlcl9wb29sX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3kmIzM0OywKICAgICYjMzQ7d29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9zaG93JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wJiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0JiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvdyYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wJiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfZmlsbCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9uZXh0JiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX3Nob3cmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfc3RvcCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIG5ldyBCUEYgaXRlcmF0b3JzIGZvciB3b3JrcXVldWVzIGFuZCB3b3JrZXIgcG9vbHMsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGNhbiBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTozNS4xMTkyMjU2MDdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjk3ODE5ODMzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdcIixcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveVwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnRcIixcbiAgICBcIndvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc2hvd1wiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3BcIixcbiAgICBcIndvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wXCIsXG4gICAgXCJ3cV9wZW5kaW5nX2ZpbGxcIixcbiAgICBcIndxX3BlbmRpbmdfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9uZXh0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zaG93XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zdG9wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTozNS4xMTkyMzI0NzhaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNTYyMjkwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGU2OTMzNmQ2OWE5ZWMzMDEzMzc5YzIzMGYyZjg0YTBiZDA4MGM2Y2RcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBKdWwgMjkgMDQ6MDE6MzQgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jXFxuaW5kZXggNzgwNjhhZThmMjhhNi4uNmU4Nzk0OTBjODExYSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmNcXG4rKysgYi9rZXJuZWwvd29ya3F1ZXVlLmNcXG5AQCAtNTYsNiArNTYsOCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva3ZtX3BhcmEuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2RlbGF5LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9pcnFfd29yay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXFwid29ya3F1ZXVlX2ludGVybmFsLmhcXFwiXFxuIFxcbkBAIC04NDczLDMgKzg0NzUsNTU3IEBAIHN0YXRpYyBpbnQgX19pbml0IHdvcmtxdWV1ZV91bmJvdW5kX2NwdXNfc2V0dXAoY2hhciAqc3RyKVxcbiBcXHRyZXR1cm4gMTtcXG4gfVxcbiBfX3NldHVwKFxcXCJ3b3JrcXVldWUudW5ib3VuZF9jcHVzPVxcXCIsIHdvcmtxdWV1ZV91bmJvdW5kX2NwdXNfc2V0dXApO1xcbitcXG4rI2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxcbitcXG4rLypcXG4rICogQlBGIG9wZW4tY29kZWQgaXRlcmF0b3Igb3ZlciBhbGwgd29ya3F1ZXVlcy5cXG4rICpcXG4rICogV2Fsa3MgdGhlIGdsb2JhbCBAd29ya3F1ZXVlcyBsaXN0LCBsZXR0aW5nIEJQRiBwcm9ncmFtcyByZWFkIGxpdmUgd29ya3F1ZXVlXFxuKyAqIHN0YXRlLlxcbisgKlxcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBicGZfcmN1X3JlYWRfbG9jaygpIGFjcm9zcyBuZXcoKS1cXHUwMDNlbmV4dCgpLVxcdTAwM2VkZXN0cm95KCkuXFxuKyAqL1xcbitcXG4rLyogU2VudGluZWwgZm9yIFxcXCJuZXcoKSBkb25lLCBuZXh0KCkgbm90IHlldCBjYWxsZWRcXFwiIHZzIFxcXCJpdGVyYXRpb24gZW5kZWRcXFwiLiAqL1xcbisjZGVmaW5lIEJQRl9XUV9JVEVSX1NUQVJUICgodm9pZCAqKTFMKVxcbitcXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSB7XFxuK1xcdF9fdTY0IF9fb3BhcXVlWzFdO1xcbit9IF9fYWxpZ25lZCg4KTtcXG4rXFxuK3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiB7XFxuK1xcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwb3M7XFxuK30gX19hbGlnbmVkKDgpO1xcbitcXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sIHtcXG4rXFx0X191NjQgX19vcGFxdWVbMV07XFxuK30gX19hbGlnbmVkKDgpO1xcbitcXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4ge1xcbitcXHRpbnQgaWQ7XFx0XFx0LyogbmV4dCB3b3JrZXJfcG9vbF9pZHIgaWQgdG8gc2VhcmNoIGZyb20gKi9cXG4rfSBfX2FsaWduZWQoOCk7XFxuK1xcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX25ldygpIC0gSW5pdGlhbGl6ZSBhIHdvcmtxdWV1ZSBpdGVyYXRvclxcbisgKiBAaXQ6IFRoZSBuZXcgYnBmX2l0ZXJfd29ya3F1ZXVlIHRvIGluaXRpYWxpemVcXG4rICpcXG4rICogSXRlcmF0ZXMgZXZlcnkgd29ya3F1ZXVlIG9uIHRoZSBnbG9iYWwgQHdvcmtxdWV1ZXMgbGlzdC4gTXVzdCBiZSB1c2VkIGluc2lkZVxcbisgKiBhIGJwZl9yY3VfcmVhZF9sb2NrKCkgcmVnaW9uIChLRl9SQ1VfUFJPVEVDVEVEKS5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl93b3JrcXVldWVfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFxuK1xcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuKSBcXHUwMDNlXFxuK1xcdFxcdCAgICAgc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUpKTtcXG4rXFx0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybikgIT1cXG4rXFx0XFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlKSk7XFxuK1xcbitcXHRraXQtXFx1MDAzZXBvcyA9IEJQRl9XUV9JVEVSX1NUQVJUO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KCkgLSBHZXQgdGhlIG5leHQgd29ya3F1ZXVlXFxuKyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtxdWV1ZVxcbisgKlxcbisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgb3IgTlVMTCB3aGVuIGRvbmUuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqXFxuK2JwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFxuK1xcdGlmICgha2l0LVxcdTAwM2Vwb3MpXFx0XFx0XFx0LyogYWxyZWFkeSByZWFjaGVkIHRoZSBlbmQgKi9cXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcbitcXHRpZiAoa2l0LVxcdTAwM2Vwb3MgPT0gQlBGX1dRX0lURVJfU1RBUlQpXFxuK1xcdFxcdGtpdC1cXHUwMDNlcG9zID0gbGlzdF9maXJzdF9vcl9udWxsX3JjdShcXHUwMDI2d29ya3F1ZXVlcyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0a2l0LVxcdTAwM2Vwb3MgPSBsaXN0X25leHRfb3JfbnVsbF9yY3UoXFx1MDAyNndvcmtxdWV1ZXMsIFxcdTAwMjZraXQtXFx1MDAzZXBvcy1cXHUwMDNlbGlzdCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHN0cnVjdCB3b3JrcXVldWVfc3RydWN0LCBsaXN0KTtcXG4rXFx0cmV0dXJuIGtpdC1cXHUwMDNlcG9zO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB3b3JrcXVldWUgaXRlcmF0b3JcXG4rICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya3F1ZXVlIHRvIGRlc3Ryb3lcXG4rICovXFxuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpXFxuK3tcXG4rXFx0LyogTm8gcmVmZXJlbmNlcyB0YWtlbjsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi9cXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldygpIC0gSW5pdGlhbGl6ZSBhIHdvcmtlcl9wb29sIGl0ZXJhdG9yXFxuKyAqIEBpdDogVGhlIG5ldyBicGZfaXRlcl93b3JrZXJfcG9vbCB0byBpbml0aWFsaXplXFxuKyAqXFxuKyAqIEl0ZXJhdGVzIGV2ZXJ5IHdvcmtlcl9wb29sIGluIHRoZSBzeXN0ZW0gKHdvcmtlcl9wb29sX2lkcikgaW4gYXNjZW5kaW5nXFxuKyAqIHBvb2wtaWQgb3JkZXIuXFxuKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgUkNVIHJlYWQgbG9jay5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFxuK1xcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4pIFxcdTAwM2VcXG4rXFx0XFx0ICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7XFxuK1xcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybikgIT1cXG4rXFx0XFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wpKTtcXG4rXFxuK1xcdGtpdC1cXHUwMDNlaWQgPSAwO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoKSAtIEdldCB0aGUgbmV4dCB3b3JrZXJfcG9vbFxcbisgKiBAaXQ6IFRoZSBicGZfaXRlcl93b3JrZXJfcG9vbFxcbisgKlxcbisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzdHJ1Y3Qgd29ya2VyX3Bvb2wsIG9yIE5VTEwgd2hlbiBkb25lLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgc3RydWN0IHdvcmtlcl9wb29sICpcXG4rYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuICpraXQgPSAodm9pZCAqKWl0O1xcbitcXHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XFxuK1xcbitcXHQvKiBpZHJfZ2V0X25leHQoKSBpcyBSQ1Utc2FmZTsgc2VlIHRoZSBmb3JfZWFjaF9wb29sKCkgbG9jayBsZWdlbmQuICovXFxuK1xcdHBvb2wgPSBpZHJfZ2V0X25leHQoXFx1MDAyNndvcmtlcl9wb29sX2lkciwgXFx1MDAyNmtpdC1cXHUwMDNlaWQpO1xcbitcXHRpZiAocG9vbClcXG4rXFx0XFx0a2l0LVxcdTAwM2VpZCsrO1xcdC8qIGFkdmFuY2UgcGFzdCB0aGlzIHBvb2wgZm9yIHRoZSBuZXh0IGNhbGwgKi9cXG4rXFx0cmV0dXJuIHBvb2w7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KCkgLSBEZXN0cm95IGEgd29ya2VyX3Bvb2wgaXRlcmF0b3JcXG4rICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gZGVzdHJveVxcbisgKi9cXG4rX19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXFxuK3tcXG4rXFx0LyogTm90aGluZyB0byBiZSBkb25lOyBSQ1UgaXMgaGVsZCBieSB0aGUgY2FsbGVyLiAqL1xcbit9XFxuK1xcbitfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbitcXG4rQlRGX0tGVU5DU19TVEFSVCh3b3JrcXVldWVfaXRlcl9rZnVuY19pZHMpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfbmV3LCBLRl9JVEVSX05FVyB8IEtGX1JDVV9QUk9URUNURUQpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3LCBLRl9JVEVSX05FVyB8IEtGX1JDVV9QUk9URUNURUQpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTClcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcXG4rQlRGX0tGVU5DU19FTkQod29ya3F1ZXVlX2l0ZXJfa2Z1bmNfaWRzKVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IHdvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCA9IHtcXG4rXFx0Lm93bmVyXFx0PSBUSElTX01PRFVMRSxcXG4rXFx0LnNldFxcdD0gXFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcyxcXG4rfTtcXG4rXFxuKy8qXFxuKyAqIHNlcV9maWxlIGZvcm0gb2YgdGhlIHdvcmtxdWV1ZSBpdGVyYXRvci4gSXQgcmV1c2VzIHRoZSBvcGVuLWNvZGVkXFxuKyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KCkuXFxuKyAqXFxuKyAqIFNpbmNlIHRoZSBvcGVuLWNvZGVkIG5leHQoKSBpcyBLRl9SQ1VfUFJPVEVDVEVELCB0aGUgc2VxIHBhdGggc3VwcGxpZXNcXG4rICogdGhlIFJDVSBzZWN0aW9uIGl0c2VsZi5cXG4rICogc2VxX3N0YXJ0KCkgdGFrZXMgcmN1X3JlYWRfbG9jaygpIGFuZCBob2xkcyBpdCBhY3Jvc3MgdGhlIHdob2xlIHJlYWQgY2h1bmtcXG4rICogKHN0YXJ0Li5zdG9wKS4gUG9zaXRpb24gaXMgcmUtZGVyaXZlZCBmcm9tICpwb3Mgb24gZWFjaCBzdGFydCwgc28gbm90aGluZ1xcbisgKiBpcyBkZXJlZmVyZW5jZWQgYWNyb3NzIHRoZSByY3UgZ2FwIGJldHdlZW4gY2h1bmtzLiBUaGUgYXR0YWNoZWQgQlBGIHByb2dyYW1cXG4rICogbXVzdCBiZSBub24tc2xlZXBhYmxlLlxcbisgKi9cXG4rdW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiB7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgaXQ7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiBraXQ7XFxuK307XFxuK1xcbitzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSB7XFxuK1xcdF9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTtcXG4rXFx0X19icGZfbWRfcHRyKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICosIHdxKTtcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkICp3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxcbit7XFxuK1xcdHVuaW9uIHdvcmtxdWV1ZV9pdGVyX3ByaXYgKnAgPSBzZXEtXFx1MDAzZXByaXZhdGU7XFxuK1xcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcXG4rXFx0bG9mZl90IGNudCA9IDA7XFxuK1xcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFx0LyogaGVsZCB1bnRpbCBzZXFfc3RvcCgpICovXFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHdxLCBcXHUwMDI2d29ya3F1ZXVlcywgbGlzdCkge1xcbitcXHRcXHRpZiAoY250ID09ICpwb3MpIHtcXG4rXFx0XFx0XFx0cC1cXHUwMDNla2l0LnBvcyA9IHdxO1xcbitcXHRcXHRcXHRyZXR1cm4gd3E7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y250Kys7XFxuK1xcdH1cXG4rXFx0cC1cXHUwMDNla2l0LnBvcyA9IE5VTEw7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqd29ya3F1ZXVlX2l0ZXJfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxcbit7XFxuK1xcdHVuaW9uIHdvcmtxdWV1ZV9pdGVyX3ByaXYgKnAgPSBzZXEtXFx1MDAzZXByaXZhdGU7XFxuK1xcbitcXHQrKypwb3M7XFxuK1xcdHJldHVybiBicGZfaXRlcl93b3JrcXVldWVfbmV4dChcXHUwMDI2cC1cXHUwMDNlaXQpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlIGN0eDtcXG4rXFx0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcXG4rXFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbitcXG4rXFx0bWV0YS5zZXEgPSBzZXE7XFxuK1xcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcXHUwMDI2bWV0YSwgZmFsc2UpO1xcbitcXHRpZiAoIXByb2cpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRjdHgubWV0YSA9IFxcdTAwMjZtZXRhO1xcbitcXHRjdHgud3EgPSB2O1xcbitcXHRyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXFx1MDAyNmN0eCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlIGN0eDtcXG4rXFx0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcXG4rXFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbitcXG4rXFx0aWYgKCF2KSB7XFxuK1xcdFxcdG1ldGEuc2VxID0gc2VxO1xcbitcXHRcXHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXFx1MDAyNm1ldGEsIHRydWUpO1xcbitcXHRcXHRpZiAocHJvZykge1xcbitcXHRcXHRcXHRjdHgubWV0YSA9IFxcdTAwMjZtZXRhO1xcbitcXHRcXHRcXHRjdHgud3EgPSBOVUxMO1xcbitcXHRcXHRcXHRicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcdC8qIHBhaXJlZCB3aXRoIHNlcV9zdGFydCgpICovXFxuK31cXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd29ya3F1ZXVlX2l0ZXJfc2VxX29wcyA9IHtcXG4rXFx0LnN0YXJ0XFx0PSB3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQsXFxuK1xcdC5uZXh0XFx0PSB3b3JrcXVldWVfaXRlcl9zZXFfbmV4dCxcXG4rXFx0LnN0b3BcXHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wLFxcbitcXHQuc2hvd1xcdD0gd29ya3F1ZXVlX2l0ZXJfc2VxX3Nob3csXFxuK307XFxuK1xcbitERUZJTkVfQlBGX0lURVJfRlVOQyh3b3JrcXVldWUsIHN0cnVjdCBicGZfaXRlcl9tZXRhICptZXRhLFxcbitcXHRcXHQgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSlcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2luZm8gd29ya3F1ZXVlX2l0ZXJfc2VxX2luZm8gPSB7XFxuK1xcdC5zZXFfb3BzXFx0PSBcXHUwMDI2d29ya3F1ZXVlX2l0ZXJfc2VxX29wcyxcXG4rXFx0LnNlcV9wcml2X3NpemVcXHQ9IHNpemVvZih1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2KSxcXG4rfTtcXG4rXFxuK0JURl9JRF9MSVNUX1NJTkdMRSh3b3JrcXVldWVfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtxdWV1ZV9zdHJ1Y3QpXFxuK1xcbitzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3b3JrcXVldWVfaXRlcl9yZWdfaW5mbyA9IHtcXG4rXFx0LnRhcmdldFxcdFxcdFxcdD0gXFxcIndvcmtxdWV1ZVxcXCIsXFxuK1xcdC5jdHhfYXJnX2luZm9fc2l6ZVxcdD0gMSxcXG4rXFx0LmN0eF9hcmdfaW5mb1xcdFxcdD0ge1xcbitcXHRcXHR7IG9mZnNldG9mKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlLCB3cSksXFxuK1xcdFxcdCAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSxcXG4rXFx0fSxcXG4rXFx0LnNlcV9pbmZvXFx0XFx0PSBcXHUwMDI2d29ya3F1ZXVlX2l0ZXJfc2VxX2luZm8sXFxuK307XFxuK1xcbisvKlxcbisgKiBzZXFfZmlsZSBmb3JtIG9mIHRoZSB3b3JrZXJfcG9vbCBpdGVyYXRvcjsgc2FtZSBSQ1UtcGVyLWNodW5rIHNjaGVtZSBhcyB0aGVcXG4rICogd29ya3F1ZXVlIG9uZSwgcmV1c2luZyB0aGUgb3Blbi1jb2RlZCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KCkuXFxuKyAqL1xcbit1bmlvbiB3b3JrZXJfcG9vbF9pdGVyX3ByaXYge1xcbitcXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgaXQ7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuIGtpdDtcXG4rfTtcXG4rXFxuK3N0cnVjdCBicGZfaXRlcl9fd29ya2VyX3Bvb2wge1xcbitcXHRfX2JwZl9tZF9wdHIoc3RydWN0IGJwZl9pdGVyX21ldGEgKiwgbWV0YSk7XFxuK1xcdF9fYnBmX21kX3B0cihzdHJ1Y3Qgd29ya2VyX3Bvb2wgKiwgcG9vbCk7XFxuK307XFxuK1xcbitzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxcbit7XFxuK1xcdHVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiAqcCA9IHNlcS1cXHUwMDNlcHJpdmF0ZTtcXG4rXFx0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xcbitcXHRsb2ZmX3QgY250ID0gMDtcXG4rXFx0aW50IGlkID0gMDtcXG4rXFxuK1xcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0d2hpbGUgKChwb29sID0gaWRyX2dldF9uZXh0KFxcdTAwMjZ3b3JrZXJfcG9vbF9pZHIsIFxcdTAwMjZpZCkpKSB7XFxuK1xcdFxcdGlmIChjbnQgPT0gKnBvcykge1xcbitcXHRcXHRcXHRwLVxcdTAwM2VraXQuaWQgPSBpZCArIDE7XFxuK1xcdFxcdFxcdHJldHVybiBwb29sO1xcbitcXHRcXHR9XFxuK1xcdFxcdGNudCsrO1xcbitcXHRcXHRpZCsrO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXFxuK3tcXG4rXFx0dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2ICpwID0gc2VxLVxcdTAwM2Vwcml2YXRlO1xcbitcXG4rXFx0KysqcG9zO1xcbitcXHRyZXR1cm4gYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChcXHUwMDI2cC1cXHUwMDNlaXQpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCBjdHg7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XFxuK1xcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcXG4rXFxuK1xcdG1ldGEuc2VxID0gc2VxO1xcbitcXHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXFx1MDAyNm1ldGEsIGZhbHNlKTtcXG4rXFx0aWYgKCFwcm9nKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0Y3R4Lm1ldGEgPSBcXHUwMDI2bWV0YTtcXG4rXFx0Y3R4LnBvb2wgPSB2O1xcbitcXHRyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXFx1MDAyNmN0eCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCBjdHg7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XFxuK1xcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcXG4rXFxuK1xcdGlmICghdikge1xcbitcXHRcXHRtZXRhLnNlcSA9IHNlcTtcXG4rXFx0XFx0cHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKFxcdTAwMjZtZXRhLCB0cnVlKTtcXG4rXFx0XFx0aWYgKHByb2cpIHtcXG4rXFx0XFx0XFx0Y3R4Lm1ldGEgPSBcXHUwMDI2bWV0YTtcXG4rXFx0XFx0XFx0Y3R4LnBvb2wgPSBOVUxMO1xcbitcXHRcXHRcXHRicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdvcmtlcl9wb29sX2l0ZXJfc2VxX29wcyA9IHtcXG4rXFx0LnN0YXJ0XFx0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydCxcXG4rXFx0Lm5leHRcXHQ9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQsXFxuK1xcdC5zdG9wXFx0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wLFxcbitcXHQuc2hvd1xcdD0gd29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvdyxcXG4rfTtcXG4rXFxuK0RFRklORV9CUEZfSVRFUl9GVU5DKHdvcmtlcl9wb29sLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcXG4rXFx0XFx0ICAgICBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wpXFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIHdvcmtlcl9wb29sX2l0ZXJfc2VxX2luZm8gPSB7XFxuK1xcdC5zZXFfb3BzXFx0PSBcXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9zZXFfb3BzLFxcbitcXHQuc2VxX3ByaXZfc2l6ZVxcdD0gc2l6ZW9mKHVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiksXFxuK307XFxuK1xcbitCVEZfSURfTElTVF9TSU5HTEUod29ya2VyX3Bvb2xfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtlcl9wb29sKVxcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfaXRlcl9yZWcgd29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mbyA9IHtcXG4rXFx0LnRhcmdldFxcdFxcdFxcdD0gXFxcIndvcmtlcl9wb29sXFxcIixcXG4rXFx0LmN0eF9hcmdfaW5mb19zaXplXFx0PSAxLFxcbitcXHQuY3R4X2FyZ19pbmZvXFx0XFx0PSB7XFxuK1xcdFxcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCwgcG9vbCksXFxuK1xcdFxcdCAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSxcXG4rXFx0fSxcXG4rXFx0LnNlcV9pbmZvXFx0XFx0PSBcXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9zZXFfaW5mbyxcXG4rfTtcXG4rXFxuKy8qXFxuKyAqIHNlcS1maWxlIEJQRiBpdGVyYXRvciBvdmVyIHRoZSBwZW5kaW5nIHdvcmsgaXRlbXMgb2YgZXZlcnkgd29ya2VyX3Bvb2wuXFxuKyAqXFxuKyAqIHBvb2wtXFx1MDAzZXdvcmtsaXN0IGlzIHByb3RlY3RlZCBieSBwb29sLVxcdTAwM2Vsb2NrIGFuZCB3b3JrX3N0cnVjdCBoYXMgbmVpdGhlciBhXFxuKyAqIHJlZmNvdW50IG5vciBSQ1UtZnJlZWluZywgc28gYSBwZW5kaW5nIHdvcmsgY2Fubm90IGJlIGhhbmRlZCB0byBhIHN1c3BlbmRlZFxcbisgKiAob3Blbi1jb2RlZCkgaXRlcmF0b3Igc2FmZWx5LlxcbisgKiBJbnN0ZWFkLCBmb3IgZWFjaCBwb29sIGEgYm91bmRlZCBzbmFwc2hvdCBvZiBpdHMgcGVuZGluZyB3b3JrcyBpcyBjb3BpZWQgb3V0XFxuKyAqIHdoaWxlIHBvb2wtXFx1MDAzZWxvY2sgaXMgaGVsZCwgbWlycm9yaW5nIHRoZSBwcmludGtfZGVmZXJyZWQgc2VjdGlvbiBvZlxcbisgKiBzaG93X29uZV93b3JrZXJfcG9vbCgpIGFuZCB0aGVuIHRoZSBsb2NrIGlzIGRyb3BwZWQuXFxuKyAqIFRoZSBCUEYgcHJvZ3JhbSB0aGVuIHJ1bnMgb3ZlciB0aGUgc3RhYmxlIHNuYXBzaG90IHdpdGggbm8gbG9jayBoZWxkLlxcbisgKlxcbisgKiBQb29scyBhcmUgdmlzaXRlZCBpbiB3b3JrZXJfcG9vbF9pZHIgb3JkZXIgKGEgc3RhYmxlIHJlc3VtZSBrZXkpOyBlYWNoIHBvb2wnc1xcbisgKiBzbmFwc2hvdCBsaXZlcyBpbiB0aGUgcGVyc2lzdGVudCBzZXFfcHJpdmF0ZSwgc28gdGhlIHdhbGsgcmVzdW1lcyBjb3JyZWN0bHlcXG4rICogYWNyb3NzIHJlYWQoKSBjaHVua3MuIEEgcG9vbCB3aXRoIG1vcmUgdGhhbiBXUV9QRU5ESU5HX1NOQVBfTUFYIHBlbmRpbmcgd29ya3NcXG4rICogaXMgdHJ1bmNhdGVkIChiZXN0LWVmZm9ydCwgbGlrZSB0aGUga2VybmVsJ3Mgb3duIHdvcmtsaXN0IGR1bXApLlxcbisgKi9cXG4rI2RlZmluZSBXUV9QRU5ESU5HX1NOQVBfTUFYIDEyOFxcbitcXG4rLypcXG4rICogT25lIHByb2plY3RlZCBwZW5kaW5nIHdvcmsgaXRlbSwgYXMgc2VlbiBieSB0aGUgQlBGIHByb2dyYW0uIEFkZHJlc3NlcyBvbmx5XFxuKyAqIC0tIHRoZSBsaXZlIHdvcmtfc3RydWN0IGlzIG5vdCBleHBvc2VkIChpdCBtYXkgYmUgZnJlZWQgYWZ0ZXIgdGhlIGxvY2spLlxcbisgKi9cXG4rc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvIHtcXG4rXFx0X191NjQgcG9vbF9pZDtcXG4rXFx0X191NjQgd29yaztcXG4rXFx0X191NjQgZnVuYztcXG4rfTtcXG4rXFxuK3N0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiB7XFxuK1xcdGludCAgICAgICAgICBuZXh0X3Bvb2w7XFx0Lyogd29ya2VyX3Bvb2xfaWRyIGN1cnNvciBmb3IgdGhlIG5leHQgZmlsbCAqL1xcbitcXHR1bnNpZ25lZCBpbnQgaWR4O1xcdC8qIHBvc2l0aW9uIHdpdGhpbiBzbmFwW10gICAgICAgICAgICAgICAgICAgKi9cXG4rXFx0dW5zaWduZWQgaW50IGNvdW50O1xcdC8qIHZhbGlkIGVudHJpZXMgaW4gc25hcFtdICAgICAgICAgICAgICAgICAgKi9cXG4rXFx0c3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvIHNuYXBbV1FfUEVORElOR19TTkFQX01BWF07XFxuK307XFxuK1xcbitzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsge1xcbitcXHRfX2JwZl9tZF9wdHIoc3RydWN0IGJwZl9pdGVyX21ldGEgKiwgbWV0YSk7XFxuK1xcdF9fYnBmX21kX3B0cihzdHJ1Y3Qgd3FfcGVuZGluZ193b3JrX2luZm8gKiwgaW5mbyk7XFxuK307XFxuK1xcbisvKlxcbisgKiBTbmFwc2hvdCB0aGUgbmV4dCBub24tZW1wdHkgcG9vbCdzIHBlbmRpbmcgd29ya3MgaW50byBwcml2LVxcdTAwM2VzbmFwW10sIGFkdmFuY2luZ1xcbisgKiBwcml2LVxcdTAwM2VuZXh0X3Bvb2wgcGFzdCBpdC4gUmV0dXJucyB0cnVlIGlmIGEgcG9vbCB3YXMgY2FwdHVyZWQsIGZhbHNlIGF0IGVuZC5cXG4rICogcG9vbC1cXHUwMDNlbG9jayBpcyBoZWxkIG9ubHkgZm9yIHRoZSBmaWVsZCBjb3B5OyBSQ1Uga2VlcHMgZWFjaCBwb29sIGFsaXZlLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgd3FfcGVuZGluZ19maWxsKHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiAqcHJpdilcXG4re1xcbitcXHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaztcXG4rXFx0aW50IGlkO1xcbitcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRmb3IgKGlkID0gcHJpdi1cXHUwMDNlbmV4dF9wb29sOyAocG9vbCA9IGlkcl9nZXRfbmV4dChcXHUwMDI2d29ya2VyX3Bvb2xfaWRyLCBcXHUwMDI2aWQpKTsgaWQrKykge1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgbiA9IDA7XFxuK1xcbitcXHRcXHRyYXdfc3Bpbl9sb2NrX2lycShcXHUwMDI2cG9vbC1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkod29yaywgXFx1MDAyNnBvb2wtXFx1MDAzZXdvcmtsaXN0LCBlbnRyeSkge1xcbitcXHRcXHRcXHRpZiAobiBcXHUwMDNlPSBXUV9QRU5ESU5HX1NOQVBfTUFYKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0cHJpdi1cXHUwMDNlc25hcFtuXS5wb29sX2lkID0gcG9vbC1cXHUwMDNlaWQ7XFxuK1xcdFxcdFxcdHByaXYtXFx1MDAzZXNuYXBbbl0ud29yayA9IChfX3U2NCkodW5zaWduZWQgbG9uZyl3b3JrO1xcbitcXHRcXHRcXHRwcml2LVxcdTAwM2VzbmFwW25dLmZ1bmMgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpd29yay1cXHUwMDNlZnVuYztcXG4rXFx0XFx0XFx0bisrO1xcbitcXHRcXHR9XFxuK1xcdFxcdHJhd19zcGluX3VubG9ja19pcnEoXFx1MDAyNnBvb2wtXFx1MDAzZWxvY2spO1xcbitcXG4rXFx0XFx0aWYgKG4pIHtcXG4rXFx0XFx0XFx0cHJpdi1cXHUwMDNlY291bnQgPSBuO1xcbitcXHRcXHRcXHRwcml2LVxcdTAwM2VpZHggPSAwO1xcbitcXHRcXHRcXHRwcml2LVxcdTAwM2VuZXh0X3Bvb2wgPSBpZCArIDE7XFxuK1xcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICp3cV9wZW5kaW5nX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpXFxuK3tcXG4rXFx0c3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2ID0gc2VxLVxcdTAwM2Vwcml2YXRlO1xcbitcXG4rXFx0aWYgKCpwb3MgPT0gMCkge1xcbitcXHRcXHRwcml2LVxcdTAwM2VuZXh0X3Bvb2wgPSAwO1xcbitcXHRcXHRwcml2LVxcdTAwM2VpZHggPSAwO1xcbitcXHRcXHRwcml2LVxcdTAwM2Vjb3VudCA9IDA7XFxuK1xcdH1cXG4rXFx0d2hpbGUgKHByaXYtXFx1MDAzZWlkeCBcXHUwMDNlPSBwcml2LVxcdTAwM2Vjb3VudCkge1xcbitcXHRcXHRpZiAoIXdxX3BlbmRpbmdfZmlsbChwcml2KSlcXG4rXFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIFxcdTAwMjZwcml2LVxcdTAwM2VzbmFwW3ByaXYtXFx1MDAzZWlkeF07XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICp3cV9wZW5kaW5nX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcylcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYgKnByaXYgPSBzZXEtXFx1MDAzZXByaXZhdGU7XFxuK1xcbitcXHQrKypwb3M7XFxuK1xcdHByaXYtXFx1MDAzZWlkeCsrO1xcbitcXHR3aGlsZSAocHJpdi1cXHUwMDNlaWR4IFxcdTAwM2U9IHByaXYtXFx1MDAzZWNvdW50KSB7XFxuK1xcdFxcdGlmICghd3FfcGVuZGluZ19maWxsKHByaXYpKVxcbitcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHRyZXR1cm4gXFx1MDAyNnByaXYtXFx1MDAzZXNuYXBbcHJpdi1cXHUwMDNlaWR4XTtcXG4rfVxcbitcXG4rc3RhdGljIGludCB3cV9wZW5kaW5nX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayBjdHg7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XFxuK1xcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcXG4rXFxuK1xcdG1ldGEuc2VxID0gc2VxO1xcbitcXHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXFx1MDAyNm1ldGEsIGZhbHNlKTtcXG4rXFx0aWYgKCFwcm9nKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0Y3R4Lm1ldGEgPSBcXHUwMDI2bWV0YTtcXG4rXFx0Y3R4LmluZm8gPSB2O1xcbitcXHRyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXFx1MDAyNmN0eCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHdxX3BlbmRpbmdfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrIGN0eDtcXG4rXFx0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcXG4rXFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbitcXG4rXFx0aWYgKHYpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0bWV0YS5zZXEgPSBzZXE7XFxuK1xcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcXHUwMDI2bWV0YSwgdHJ1ZSk7XFxuK1xcdGlmIChwcm9nKSB7XFxuK1xcdFxcdGN0eC5tZXRhID0gXFx1MDAyNm1ldGE7XFxuK1xcdFxcdGN0eC5pbmZvID0gTlVMTDtcXG4rXFx0XFx0YnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXFx1MDAyNmN0eCk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3cV9wZW5kaW5nX3NlcV9vcHMgPSB7XFxuK1xcdC5zdGFydFxcdD0gd3FfcGVuZGluZ19zZXFfc3RhcnQsXFxuK1xcdC5uZXh0XFx0PSB3cV9wZW5kaW5nX3NlcV9uZXh0LFxcbitcXHQuc3RvcFxcdD0gd3FfcGVuZGluZ19zZXFfc3RvcCxcXG4rXFx0LnNob3dcXHQ9IHdxX3BlbmRpbmdfc2VxX3Nob3csXFxuK307XFxuK1xcbitERUZJTkVfQlBGX0lURVJfRlVOQyh3b3JrcXVldWVfcGVuZGluZ193b3JrLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcXG4rXFx0XFx0ICAgICBzdHJ1Y3Qgd3FfcGVuZGluZ193b3JrX2luZm8gKmluZm8pXFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIHdxX3BlbmRpbmdfc2VxX2luZm8gPSB7XFxuK1xcdC5zZXFfb3BzXFx0PSBcXHUwMDI2d3FfcGVuZGluZ19zZXFfb3BzLFxcbitcXHQuc2VxX3ByaXZfc2l6ZVxcdD0gc2l6ZW9mKHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiksXFxuK307XFxuK1xcbitCVEZfSURfTElTVF9TSU5HTEUod3FfcGVuZGluZ193b3JrX2luZm9fYnRmX2lkLCBzdHJ1Y3QsIHdxX3BlbmRpbmdfd29ya19pbmZvKVxcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfaXRlcl9yZWcgd3FfcGVuZGluZ19yZWdfaW5mbyA9IHtcXG4rXFx0LnRhcmdldFxcdFxcdFxcdD0gXFxcIndvcmtxdWV1ZV9wZW5kaW5nX3dvcmtcXFwiLFxcbitcXHQuZmVhdHVyZVxcdFxcdD0gQlBGX0lURVJfUkVTQ0hFRCxcXG4rXFx0LmN0eF9hcmdfaW5mb19zaXplXFx0PSAxLFxcbitcXHQuY3R4X2FyZ19pbmZvXFx0XFx0PSB7XFxuK1xcdFxcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrLCBpbmZvKSxcXG4rXFx0XFx0ICBQVFJfVE9fQlRGX0lEX09SX05VTEwgfSxcXG4rXFx0fSxcXG4rXFx0LnNlcV9pbmZvXFx0XFx0PSBcXHUwMDI2d3FfcGVuZGluZ19zZXFfaW5mbyxcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGJwZl93b3JrcXVldWVfaXRlcl9pbml0KHZvaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLFxcbitcXHRcXHRcXHRcXHRcXHRcXHUwMDI2d29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0KTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZ3b3JrcXVldWVfaXRlcl9rZnVuY19zZXQpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0d29ya3F1ZXVlX2l0ZXJfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdvcmtxdWV1ZV9idGZfaWRbMF07XFxuK1xcdHJldCA9IGJwZl9pdGVyX3JlZ190YXJnZXQoXFx1MDAyNndvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHdvcmtlcl9wb29sX2l0ZXJfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdvcmtlcl9wb29sX2J0Zl9pZFswXTtcXG4rXFx0cmV0ID0gYnBmX2l0ZXJfcmVnX3RhcmdldChcXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mbyk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR3cV9wZW5kaW5nX3JlZ19pbmZvLmN0eF9hcmdfaW5mb1swXS5idGZfaWQgPSB3cV9wZW5kaW5nX3dvcmtfaW5mb19idGZfaWRbMF07XFxuK1xcdHJldHVybiBicGZfaXRlcl9yZWdfdGFyZ2V0KFxcdTAwMjZ3cV9wZW5kaW5nX3JlZ19pbmZvKTtcXG4rfVxcbitsYXRlX2luaXRjYWxsKGJwZl93b3JrcXVldWVfaXRlcl9pbml0KTtcXG4rXFxuKyNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi9cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcXG5pbmRleCA2N2ZmNzg4MjI5OWVjLi42ZGE5M2M0ODY2NTA5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXFxuQEAgLTM2MSw2ICszNjEsMTYgQEAgZXh0ZXJuIGludCBicGZfaXRlcl9kbWFidWZfbmV3KHN0cnVjdCBicGZfaXRlcl9kbWFidWYgKml0KSBfX3dlYWsgX19rc3ltO1xcbiBleHRlcm4gc3RydWN0IGRtYV9idWYgKmJwZl9pdGVyX2RtYWJ1Zl9uZXh0KHN0cnVjdCBicGZfaXRlcl9kbWFidWYgKml0KSBfX3dlYWsgX19rc3ltO1xcbiBleHRlcm4gdm9pZCBicGZfaXRlcl9kbWFidWZfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcXG4gXFxuK3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWU7XFxuK2V4dGVybiBpbnQgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTtcXG4rZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpicGZfaXRlcl93b3JrcXVldWVfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTtcXG4rZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpIF9fd2VhayBfX2tzeW07XFxuK1xcbitzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2w7XFxuK2V4dGVybiBpbnQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpIF9fd2VhayBfX2tzeW07XFxuK2V4dGVybiBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKmJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkgX193ZWFrIF9fa3N5bTtcXG4rZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KSBfX3dlYWsgX19rc3ltO1xcbitcXG4gZXh0ZXJuIGludCBicGZfY2dyb3VwX3JlYWRfeGF0dHIoc3RydWN0IGNncm91cCAqY2dyb3VwLCBjb25zdCBjaGFyICpuYW1lX19zdHIsXFxuIFxcdFxcdFxcdFxcdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqdmFsdWVfcCkgX193ZWFrIF9fa3N5bTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzMzODNjMjYzYmVlOFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy93cV9pdGVyLmNcXG5AQCAtMCwwICsxLDgwIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJ3cV9pdGVyLnNrZWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcIndxX2l0ZXJfZmFpbC5za2VsLmhcXFwiXFxuK1xcbitzdGF0aWMgdm9pZCBzdWJ0ZXN0X29wZW5fY29kZWQoc3RydWN0IHdxX2l0ZXIgKnNrZWwpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MuY291bnRfd29ya3F1ZXVlcyksXFxuK1xcdFxcdFxcdFxcdCAgICAgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW4gY291bnRfd29ya3F1ZXVlc1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdC8qIFRoZXJlIGFyZSBhbHdheXMgc2V2ZXJhbCBzeXN0ZW0gd29ya3F1ZXVlcyAoZXZlbnRzLCAuLi4pLiAqL1xcbitcXHRBU1NFUlRfR1Qoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2Vucl93b3JrcXVldWVzLCAwLCBcXFwibnJfd29ya3F1ZXVlc1xcXCIpO1xcbitcXG4rXFx0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MuY291bnRfd29ya2VyX3Bvb2xzKSxcXG4rXFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInJ1biBjb3VudF93b3JrZXJfcG9vbHNcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHQvKiBBdCBsZWFzdCB0aGUgcGVyLUNQVSBub3JtYWwvaGlnaHByaSBwb29scyBleGlzdC4gKi9cXG4rXFx0QVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlbnJfd29ya2VyX3Bvb2xzLCAwLCBcXFwibnJfd29ya2VyX3Bvb2xzXFxcIik7XFxuK1xcdEFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZW5yX3BlcmNwdV9wb29scywgMCwgXFxcIm5yX3BlcmNwdV9wb29sc1xcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBkcmFpbl9pdGVyKHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZywgY29uc3QgY2hhciAqbmFtZSlcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbms7XFxuK1xcdGNoYXIgYnVmWzUxMl07XFxuK1xcdGludCBpdGVyX2ZkO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcbitcXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHByb2csIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgbmFtZSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aXRlcl9mZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShpdGVyX2ZkLCAwLCBcXFwiaXRlcl9jcmVhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdHdoaWxlICgobiA9IHJlYWQoaXRlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSkpIFxcdTAwM2UgMClcXG4rXFx0XFx0O1xcbitcXHRBU1NFUlRfR0UobiwgMCwgXFxcInJlYWQgaXRlclxcXCIpO1xcbitcXHRjbG9zZShpdGVyX2ZkKTtcXG4rb3V0OlxcbitcXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc3VidGVzdF9zZXEoc3RydWN0IHdxX2l0ZXIgKnNrZWwpXFxuK3tcXG4rXFx0Lyogc2VxIGZvcm1zIGFyZSBiYWNrZWQgYnkgdGhlIHNhbWUgb3Blbi1jb2RlZCBuZXh0KCkuICovXFxuK1xcdGRyYWluX2l0ZXIoc2tlbC1cXHUwMDNlcHJvZ3MuZHVtcF93b3JrcXVldWVzLCBcXFwiYXR0YWNoIHdvcmtxdWV1ZSBpdGVyXFxcIik7XFxuK1xcdEFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZW5yX3dxX3NlcSwgMCwgXFxcIm5yX3dxX3NlcVxcXCIpO1xcbitcXG4rXFx0ZHJhaW5faXRlcihza2VsLVxcdTAwM2Vwcm9ncy5kdW1wX3dvcmtlcl9wb29scywgXFxcImF0dGFjaCB3b3JrZXJfcG9vbCBpdGVyXFxcIik7XFxuK1xcdEFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZW5yX3Bvb2xfc2VxLCAwLCBcXFwibnJfcG9vbF9zZXFcXFwiKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIHdvcmtsaXN0cyBhcmUgdXN1YWxseSBlbXB0eSBvbiBhbiBpZGxlIHN5c3RlbTsgdGhpcyBkcml2ZXMgdGhlIHdob2xlXFxuK1xcdCAqIHBlci1wb29sIHNuYXBzaG90IHBhdGggYW5kIHZlcmlmaWVzIGl0IGRyYWlucyBjbGVhbmx5LlxcbitcXHQgKi9cXG4rXFx0ZHJhaW5faXRlcihza2VsLVxcdTAwM2Vwcm9ncy5kdW1wX3BlbmRpbmcsIFxcXCJhdHRhY2ggcGVuZGluZ193b3JrIGl0ZXJcXFwiKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X3dxX2l0ZXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfaXRlciAqc2tlbDtcXG4rXFxuK1xcdHNrZWwgPSB3cV9pdGVyX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwid3FfaXRlcl9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwib3Blbl9jb2RlZFxcXCIpKVxcbitcXHRcXHRzdWJ0ZXN0X29wZW5fY29kZWQoc2tlbCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzZXFcXFwiKSlcXG4rXFx0XFx0c3VidGVzdF9zZXEoc2tlbCk7XFxuK1xcbitcXHR3cV9pdGVyX19kZXN0cm95KHNrZWwpO1xcbitcXG4rXFx0UlVOX1RFU1RTKHdxX2l0ZXJfZmFpbCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy93cV9pdGVyLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1ZjA4MWJjNjM0YjZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXIuY1xcbkBAIC0wLDAgKzEsOTUgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuK1xcbitjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG4rXFxuK3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltO1xcbit2b2lkIGJwZl9yY3VfcmVhZF91bmxvY2sodm9pZCkgX19rc3ltO1xcbitcXG4rLyogUmVzdWx0cywgY2hlY2tlZCBieSB1c2Vyc3BhY2UuICovXFxuK2ludCBucl93b3JrcXVldWVzO1xcbitpbnQgbnJfd29ya2VyX3Bvb2xzO1xcbitpbnQgbnJfcGVyY3B1X3Bvb2xzO1xcbitpbnQgbnJfd3Ffc2VxO1xcbitpbnQgbnJfcG9vbF9zZXE7XFxuK2ludCBucl9wZW5kaW5nO1xcbitcXG4rLyogLS0tIG9wZW4tY29kZWQgaXRlcmF0b3JzIChLRl9SQ1VfUFJPVEVDVEVEKSAtLS0gKi9cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBjb3VudF93b3JrcXVldWVzKGNvbnN0IHZvaWQgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7XFxuK1xcdGludCBuID0gMDtcXG4rXFxuK1xcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XFxuK1xcdGJwZl9mb3JfZWFjaCh3b3JrcXVldWUsIHdxKVxcbitcXHRcXHRuKys7XFxuK1xcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcXG4rXFxuK1xcdG5yX3dvcmtxdWV1ZXMgPSBuO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJzeXNjYWxsXFxcIilcXG4raW50IGNvdW50X3dvcmtlcl9wb29scyhjb25zdCB2b2lkICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xcbitcXHRpbnQgbiA9IDAsIHBlcmNwdSA9IDA7XFxuK1xcbitcXHRicGZfcmN1X3JlYWRfbG9jaygpO1xcbitcXHRicGZfZm9yX2VhY2god29ya2VyX3Bvb2wsIHBvb2wpIHtcXG4rXFx0XFx0bisrO1xcbitcXHRcXHRpZiAocG9vbC1cXHUwMDNlY3B1IFxcdTAwM2U9IDApXFx0XFx0LyogcGVyLUNQVSBwb29sICovXFxuK1xcdFxcdFxcdHBlcmNwdSsrO1xcbitcXHR9XFxuK1xcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcXG4rXFxuK1xcdG5yX3dvcmtlcl9wb29scyA9IG47XFxuK1xcdG5yX3BlcmNwdV9wb29scyA9IHBlcmNwdTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIC0tLSBzZXFfZmlsZSBpdGVyYXRvcnMgLS0tICovXFxuK1xcbitTRUMoXFxcIml0ZXIvd29ya3F1ZXVlXFxcIilcXG4raW50IGR1bXBfd29ya3F1ZXVlcyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBzZXFfZmlsZSAqc2VxID0gY3R4LVxcdTAwM2VtZXRhLVxcdTAwM2VzZXE7XFxuK1xcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGN0eC1cXHUwMDNld3E7XFxuK1xcbitcXHRpZiAoIXdxKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0bnJfd3Ffc2VxKys7XFxuK1xcdEJQRl9TRVFfUFJJTlRGKHNlcSwgXFxcIiVzXFxcXG5cXFwiLCB3cS1cXHUwMDNlbmFtZSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIvd29ya2VyX3Bvb2xcXFwiKVxcbitpbnQgZHVtcF93b3JrZXJfcG9vbHMoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbCA9IGN0eC1cXHUwMDNlcG9vbDtcXG4rXFxuK1xcdGlmICghcG9vbClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdG5yX3Bvb2xfc2VxKys7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIvd29ya3F1ZXVlX3BlbmRpbmdfd29ya1xcXCIpXFxuK2ludCBkdW1wX3BlbmRpbmcoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtXFx1MDAzZW1ldGEtXFx1MDAzZXNlcTtcXG4rXFx0c3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvID0gY3R4LVxcdTAwM2VpbmZvO1xcbitcXG4rXFx0aWYgKCFpbmZvKVxcdFxcdFxcdC8qIGZpbmFsIGNhbGwgKi9cXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRucl9wZW5kaW5nKys7XFxuK1xcdEJQRl9TRVFfUFJJTlRGKHNlcSwgXFxcInBvb2wgJWxsdSB3b3JrIDB4JWxseCBmdW5jIDB4JWxseFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIGluZm8tXFx1MDAzZXBvb2xfaWQsIGluZm8tXFx1MDAzZXdvcmssIGluZm8tXFx1MDAzZWZ1bmMpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmZiMmRjZjk4NDdlMmJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXJfZmFpbC5jXFxuQEAgLTAsMCArMSwzNyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImJwZl9taXNjLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuK1xcbitjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrcXVldWUgYW5kIHdvcmtlcl9wb29sIG9wZW4tY29kZWQgaXRlcmF0b3JzIGFyZSBLRl9SQ1VfUFJPVEVDVEVEOlxcbisgKiB1c2luZyB0aGVtIG91dHNpZGUgYSBicGZfcmN1X3JlYWRfbG9jaygpIHJlZ2lvbiBtdXN0IGJlIHJlamVjdGVkLlxcbisgKi9cXG4rXFxuK1NFQyhcXFwiP3N5c2NhbGxcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcImtlcm5lbCBmdW5jIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblxcXCIpXFxuK2ludCB3b3JrcXVldWVfaXRlcl9ub19yY3UoY29uc3Qgdm9pZCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcXG4rXFx0aW50IG4gPSAwO1xcbitcXG4rXFx0YnBmX2Zvcl9lYWNoKHdvcmtxdWV1ZSwgd3EpXFxuK1xcdFxcdG4rKztcXG4rXFx0cmV0dXJuIG47XFxuK31cXG4rXFxuK1NFQyhcXFwiP3N5c2NhbGxcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcImtlcm5lbCBmdW5jIGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldyByZXF1aXJlcyBSQ1UgY3JpdGljYWwgc2VjdGlvbiBwcm90ZWN0aW9uXFxcIilcXG4raW50IHdvcmtlcl9wb29sX2l0ZXJfbm9fcmN1KGNvbnN0IHZvaWQgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XFxuK1xcdGludCBuID0gMDtcXG4rXFxuK1xcdGJwZl9mb3JfZWFjaCh3b3JrZXJfcG9vbCwgcG9vbClcXG4rXFx0XFx0bisrO1xcbitcXHRyZXR1cm4gbjtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTozNS43MzU4MjkxOTZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxNjM2MTU4NTYzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdcIixcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveVwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnRcIixcbiAgICBcIndvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc2hvd1wiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3BcIixcbiAgICBcIndvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wXCIsXG4gICAgXCJ3cV9wZW5kaW5nX2ZpbGxcIixcbiAgICBcIndxX3BlbmRpbmdfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9uZXh0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zaG93XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zdG9wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBlNjkzMzZkNjlhOWVjMzAxMzM3OWMyMzBmMmY4NGEwYmQwODBjNmNkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBKdWwgMjkgMDQ6MDE6MzQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmNcbmluZGV4IDc4MDY4YWU4ZjI4YTYuLjZlODc5NDkwYzgxMWEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmNcbisrKyBiL2tlcm5lbC93b3JrcXVldWUuY1xuQEAgLTU2LDYgKzU2LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fcGFyYS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZGVsYXkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycV93b3JrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwid29ya3F1ZXVlX2ludGVybmFsLmhcIlxuIFxuQEAgLTg0NzMsMyArODQ3NSw1NTcgQEAgc3RhdGljIGludCBfX2luaXQgd29ya3F1ZXVlX3VuYm91bmRfY3B1c19zZXR1cChjaGFyICpzdHIpXG4gXHRyZXR1cm4gMTtcbiB9XG4gX19zZXR1cChcIndvcmtxdWV1ZS51bmJvdW5kX2NwdXM9XCIsIHdvcmtxdWV1ZV91bmJvdW5kX2NwdXNfc2V0dXApO1xuK1xuKyNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbitcbisvKlxuKyAqIEJQRiBvcGVuLWNvZGVkIGl0ZXJhdG9yIG92ZXIgYWxsIHdvcmtxdWV1ZXMuXG4rICpcbisgKiBXYWxrcyB0aGUgZ2xvYmFsIEB3b3JrcXVldWVzIGxpc3QsIGxldHRpbmcgQlBGIHByb2dyYW1zIHJlYWQgbGl2ZSB3b3JrcXVldWVcbisgKiBzdGF0ZS5cbisgKlxuKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIGJwZl9yY3VfcmVhZF9sb2NrKCkgYWNyb3NzIG5ldygpLVx1MDAzZW5leHQoKS1cdTAwM2VkZXN0cm95KCkuXG4rICovXG4rXG4rLyogU2VudGluZWwgZm9yIFwibmV3KCkgZG9uZSwgbmV4dCgpIG5vdCB5ZXQgY2FsbGVkXCIgdnMgXCJpdGVyYXRpb24gZW5kZWRcIi4gKi9cbisjZGVmaW5lIEJQRl9XUV9JVEVSX1NUQVJUICgodm9pZCAqKTFMKVxuK1xuK3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWUge1xuK1x0X191NjQgX19vcGFxdWVbMV07XG4rfSBfX2FsaWduZWQoOCk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuIHtcbitcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwb3M7XG4rfSBfX2FsaWduZWQoOCk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sIHtcbitcdF9fdTY0IF9fb3BhcXVlWzFdO1xuK30gX19hbGlnbmVkKDgpO1xuK1xuK3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuIHtcbitcdGludCBpZDtcdFx0LyogbmV4dCB3b3JrZXJfcG9vbF9pZHIgaWQgdG8gc2VhcmNoIGZyb20gKi9cbit9IF9fYWxpZ25lZCg4KTtcbitcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX25ldygpIC0gSW5pdGlhbGl6ZSBhIHdvcmtxdWV1ZSBpdGVyYXRvclxuKyAqIEBpdDogVGhlIG5ldyBicGZfaXRlcl93b3JrcXVldWUgdG8gaW5pdGlhbGl6ZVxuKyAqXG4rICogSXRlcmF0ZXMgZXZlcnkgd29ya3F1ZXVlIG9uIHRoZSBnbG9iYWwgQHdvcmtxdWV1ZXMgbGlzdC4gTXVzdCBiZSB1c2VkIGluc2lkZVxuKyAqIGEgYnBmX3JjdV9yZWFkX2xvY2soKSByZWdpb24gKEtGX1JDVV9QUk9URUNURUQpLlxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl93b3JrcXVldWVfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuKSBcdTAwM2VcbitcdFx0ICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSkpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybikgIT1cbitcdFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlKSk7XG4rXG4rXHRraXQtXHUwMDNlcG9zID0gQlBGX1dRX0lURVJfU1RBUlQ7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoKSAtIEdldCB0aGUgbmV4dCB3b3JrcXVldWVcbisgKiBAaXQ6IFRoZSBicGZfaXRlcl93b3JrcXVldWVcbisgKlxuKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdCB3b3JrcXVldWVfc3RydWN0LCBvciBOVUxMIHdoZW4gZG9uZS5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqXG4rYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuK1xuK1x0aWYgKCFraXQtXHUwMDNlcG9zKVx0XHRcdC8qIGFscmVhZHkgcmVhY2hlZCB0aGUgZW5kICovXG4rXHRcdHJldHVybiBOVUxMO1xuK1xuK1x0aWYgKGtpdC1cdTAwM2Vwb3MgPT0gQlBGX1dRX0lURVJfU1RBUlQpXG4rXHRcdGtpdC1cdTAwM2Vwb3MgPSBsaXN0X2ZpcnN0X29yX251bGxfcmN1KFx1MDAyNndvcmtxdWV1ZXMsXG4rXHRcdFx0XHRcdFx0ICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XG4rXHRlbHNlXG4rXHRcdGtpdC1cdTAwM2Vwb3MgPSBsaXN0X25leHRfb3JfbnVsbF9yY3UoXHUwMDI2d29ya3F1ZXVlcywgXHUwMDI2a2l0LVx1MDAzZXBvcy1cdTAwM2VsaXN0LFxuK1x0XHRcdFx0XHRcdCBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XG4rXHRyZXR1cm4ga2l0LVx1MDAzZXBvcztcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB3b3JrcXVldWUgaXRlcmF0b3JcbisgKiBAaXQ6IFRoZSBicGZfaXRlcl93b3JrcXVldWUgdG8gZGVzdHJveVxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpXG4re1xuK1x0LyogTm8gcmVmZXJlbmNlcyB0YWtlbjsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi9cbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KCkgLSBJbml0aWFsaXplIGEgd29ya2VyX3Bvb2wgaXRlcmF0b3JcbisgKiBAaXQ6IFRoZSBuZXcgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gaW5pdGlhbGl6ZVxuKyAqXG4rICogSXRlcmF0ZXMgZXZlcnkgd29ya2VyX3Bvb2wgaW4gdGhlIHN5c3RlbSAod29ya2VyX3Bvb2xfaWRyKSBpbiBhc2NlbmRpbmdcbisgKiBwb29sLWlkIG9yZGVyLlxuKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgUkNVIHJlYWQgbG9jay5cbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4rXG4rXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuKSBcdTAwM2VcbitcdFx0ICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7XG4rXHRCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4pICE9XG4rXHRcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7XG4rXG4rXHRraXQtXHUwMDNlaWQgPSAwO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoKSAtIEdldCB0aGUgbmV4dCB3b3JrZXJfcG9vbFxuKyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtlcl9wb29sXG4rICpcbisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzdHJ1Y3Qgd29ya2VyX3Bvb2wsIG9yIE5VTEwgd2hlbiBkb25lLlxuKyAqL1xuK19fYnBmX2tmdW5jIHN0cnVjdCB3b3JrZXJfcG9vbCAqXG4rYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuK1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuK1xuK1x0LyogaWRyX2dldF9uZXh0KCkgaXMgUkNVLXNhZmU7IHNlZSB0aGUgZm9yX2VhY2hfcG9vbCgpIGxvY2sgbGVnZW5kLiAqL1xuK1x0cG9vbCA9IGlkcl9nZXRfbmV4dChcdTAwMjZ3b3JrZXJfcG9vbF9pZHIsIFx1MDAyNmtpdC1cdTAwM2VpZCk7XG4rXHRpZiAocG9vbClcbitcdFx0a2l0LVx1MDAzZWlkKys7XHQvKiBhZHZhbmNlIHBhc3QgdGhpcyBwb29sIGZvciB0aGUgbmV4dCBjYWxsICovXG4rXHRyZXR1cm4gcG9vbDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSgpIC0gRGVzdHJveSBhIHdvcmtlcl9wb29sIGl0ZXJhdG9yXG4rICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gZGVzdHJveVxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KVxuK3tcbitcdC8qIE5vdGhpbmcgdG8gYmUgZG9uZTsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi9cbit9XG4rXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbitcbitCVEZfS0ZVTkNTX1NUQVJUKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcylcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKVxuK0JURl9LRlVOQ1NfRU5EKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgd29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0ID0ge1xuK1x0Lm93bmVyXHQ9IFRISVNfTU9EVUxFLFxuK1x0LnNldFx0PSBcdTAwMjZ3b3JrcXVldWVfaXRlcl9rZnVuY19pZHMsXG4rfTtcbitcbisvKlxuKyAqIHNlcV9maWxlIGZvcm0gb2YgdGhlIHdvcmtxdWV1ZSBpdGVyYXRvci4gSXQgcmV1c2VzIHRoZSBvcGVuLWNvZGVkXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoKS5cbisgKlxuKyAqIFNpbmNlIHRoZSBvcGVuLWNvZGVkIG5leHQoKSBpcyBLRl9SQ1VfUFJPVEVDVEVELCB0aGUgc2VxIHBhdGggc3VwcGxpZXNcbisgKiB0aGUgUkNVIHNlY3Rpb24gaXRzZWxmLlxuKyAqIHNlcV9zdGFydCgpIHRha2VzIHJjdV9yZWFkX2xvY2soKSBhbmQgaG9sZHMgaXQgYWNyb3NzIHRoZSB3aG9sZSByZWFkIGNodW5rXG4rICogKHN0YXJ0Li5zdG9wKS4gUG9zaXRpb24gaXMgcmUtZGVyaXZlZCBmcm9tICpwb3Mgb24gZWFjaCBzdGFydCwgc28gbm90aGluZ1xuKyAqIGlzIGRlcmVmZXJlbmNlZCBhY3Jvc3MgdGhlIHJjdSBnYXAgYmV0d2VlbiBjaHVua3MuIFRoZSBhdHRhY2hlZCBCUEYgcHJvZ3JhbVxuKyAqIG11c3QgYmUgbm9uLXNsZWVwYWJsZS5cbisgKi9cbit1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2IHtcbitcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgaXQ7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4ga2l0O1xuK307XG4rXG4rc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUge1xuK1x0X19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpO1xuK1x0X19icGZfbWRfcHRyKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICosIHdxKTtcbit9O1xuK1xuK3N0YXRpYyB2b2lkICp3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxuK3tcbitcdHVuaW9uIHdvcmtxdWV1ZV9pdGVyX3ByaXYgKnAgPSBzZXEtXHUwMDNlcHJpdmF0ZTtcbitcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcbitcdGxvZmZfdCBjbnQgPSAwO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1x0LyogaGVsZCB1bnRpbCBzZXFfc3RvcCgpICovXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh3cSwgXHUwMDI2d29ya3F1ZXVlcywgbGlzdCkge1xuK1x0XHRpZiAoY250ID09ICpwb3MpIHtcbitcdFx0XHRwLVx1MDAzZWtpdC5wb3MgPSB3cTtcbitcdFx0XHRyZXR1cm4gd3E7XG4rXHRcdH1cbitcdFx0Y250Kys7XG4rXHR9XG4rXHRwLVx1MDAzZWtpdC5wb3MgPSBOVUxMO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICp3b3JrcXVldWVfaXRlcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXG4re1xuK1x0dW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiAqcCA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuK1xuK1x0KysqcG9zO1xuK1x0cmV0dXJuIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KFx1MDAyNnAtXHUwMDNlaXQpO1xuK31cbitcbitzdGF0aWMgaW50IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlIGN0eDtcbitcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4rXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4rXG4rXHRtZXRhLnNlcSA9IHNlcTtcbitcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcdTAwMjZtZXRhLCBmYWxzZSk7XG4rXHRpZiAoIXByb2cpXG4rXHRcdHJldHVybiAwO1xuK1x0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuK1x0Y3R4LndxID0gdjtcbitcdHJldHVybiBicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcdTAwMjZjdHgpO1xuK31cbitcbitzdGF0aWMgdm9pZCB3b3JrcXVldWVfaXRlcl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbit7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSBjdHg7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhO1xuK1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuK1xuK1x0aWYgKCF2KSB7XG4rXHRcdG1ldGEuc2VxID0gc2VxO1xuK1x0XHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgdHJ1ZSk7XG4rXHRcdGlmIChwcm9nKSB7XG4rXHRcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuK1x0XHRcdGN0eC53cSA9IE5VTEw7XG4rXHRcdFx0YnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXHUwMDI2Y3R4KTtcbitcdFx0fVxuK1x0fVxuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XHQvKiBwYWlyZWQgd2l0aCBzZXFfc3RhcnQoKSAqL1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdvcmtxdWV1ZV9pdGVyX3NlcV9vcHMgPSB7XG4rXHQuc3RhcnRcdD0gd29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0LFxuK1x0Lm5leHRcdD0gd29ya3F1ZXVlX2l0ZXJfc2VxX25leHQsXG4rXHQuc3RvcFx0PSB3b3JrcXVldWVfaXRlcl9zZXFfc3RvcCxcbitcdC5zaG93XHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93LFxuK307XG4rXG4rREVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcbitcdFx0ICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpXG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3b3JrcXVldWVfaXRlcl9zZXFfaW5mbyA9IHtcbitcdC5zZXFfb3BzXHQ9IFx1MDAyNndvcmtxdWV1ZV9pdGVyX3NlcV9vcHMsXG4rXHQuc2VxX3ByaXZfc2l6ZVx0PSBzaXplb2YodW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiksXG4rfTtcbitcbitCVEZfSURfTElTVF9TSU5HTEUod29ya3F1ZXVlX2J0Zl9pZCwgc3RydWN0LCB3b3JrcXVldWVfc3RydWN0KVxuK1xuK3N0YXRpYyBzdHJ1Y3QgYnBmX2l0ZXJfcmVnIHdvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvID0ge1xuK1x0LnRhcmdldFx0XHRcdD0gXCJ3b3JrcXVldWVcIixcbitcdC5jdHhfYXJnX2luZm9fc2l6ZVx0PSAxLFxuK1x0LmN0eF9hcmdfaW5mb1x0XHQ9IHtcbitcdFx0eyBvZmZzZXRvZihzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSwgd3EpLFxuK1x0XHQgIFBUUl9UT19CVEZfSURfT1JfTlVMTCB8IFBUUl9UUlVTVEVEIH0sXG4rXHR9LFxuK1x0LnNlcV9pbmZvXHRcdD0gXHUwMDI2d29ya3F1ZXVlX2l0ZXJfc2VxX2luZm8sXG4rfTtcbitcbisvKlxuKyAqIHNlcV9maWxlIGZvcm0gb2YgdGhlIHdvcmtlcl9wb29sIGl0ZXJhdG9yOyBzYW1lIFJDVS1wZXItY2h1bmsgc2NoZW1lIGFzIHRoZVxuKyAqIHdvcmtxdWV1ZSBvbmUsIHJldXNpbmcgdGhlIG9wZW4tY29kZWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCgpLlxuKyAqL1xuK3VuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiB7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgaXQ7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiBraXQ7XG4rfTtcbitcbitzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIHtcbitcdF9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTtcbitcdF9fYnBmX21kX3B0cihzdHJ1Y3Qgd29ya2VyX3Bvb2wgKiwgcG9vbCk7XG4rfTtcbitcbitzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxuK3tcbitcdHVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiAqcCA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuK1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuK1x0bG9mZl90IGNudCA9IDA7XG4rXHRpbnQgaWQgPSAwO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0d2hpbGUgKChwb29sID0gaWRyX2dldF9uZXh0KFx1MDAyNndvcmtlcl9wb29sX2lkciwgXHUwMDI2aWQpKSkge1xuK1x0XHRpZiAoY250ID09ICpwb3MpIHtcbitcdFx0XHRwLVx1MDAzZWtpdC5pZCA9IGlkICsgMTtcbitcdFx0XHRyZXR1cm4gcG9vbDtcbitcdFx0fVxuK1x0XHRjbnQrKztcbitcdFx0aWQrKztcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXG4re1xuK1x0dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2ICpwID0gc2VxLVx1MDAzZXByaXZhdGU7XG4rXG4rXHQrKypwb3M7XG4rXHRyZXR1cm4gYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChcdTAwMjZwLVx1MDAzZWl0KTtcbit9XG4rXG4rc3RhdGljIGludCB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9fd29ya2VyX3Bvb2wgY3R4O1xuK1x0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcbitcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcbitcbitcdG1ldGEuc2VxID0gc2VxO1xuK1x0cHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKFx1MDAyNm1ldGEsIGZhbHNlKTtcbitcdGlmICghcHJvZylcbitcdFx0cmV0dXJuIDA7XG4rXHRjdHgubWV0YSA9IFx1MDAyNm1ldGE7XG4rXHRjdHgucG9vbCA9IHY7XG4rXHRyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXHUwMDI2Y3R4KTtcbit9XG4rXG4rc3RhdGljIHZvaWQgd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbit7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIGN0eDtcbitcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4rXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4rXG4rXHRpZiAoIXYpIHtcbitcdFx0bWV0YS5zZXEgPSBzZXE7XG4rXHRcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcdTAwMjZtZXRhLCB0cnVlKTtcbitcdFx0aWYgKHByb2cpIHtcbitcdFx0XHRjdHgubWV0YSA9IFx1MDAyNm1ldGE7XG4rXHRcdFx0Y3R4LnBvb2wgPSBOVUxMO1xuK1x0XHRcdGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4rXHRcdH1cbitcdH1cbitcdHJjdV9yZWFkX3VubG9jaygpO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdvcmtlcl9wb29sX2l0ZXJfc2VxX29wcyA9IHtcbitcdC5zdGFydFx0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydCxcbitcdC5uZXh0XHQ9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQsXG4rXHQuc3RvcFx0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wLFxuK1x0LnNob3dcdD0gd29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvdyxcbit9O1xuK1xuK0RFRklORV9CUEZfSVRFUl9GVU5DKHdvcmtlcl9wb29sLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcbitcdFx0ICAgICBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wpXG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3b3JrZXJfcG9vbF9pdGVyX3NlcV9pbmZvID0ge1xuK1x0LnNlcV9vcHNcdD0gXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9zZXFfb3BzLFxuK1x0LnNlcV9wcml2X3NpemVcdD0gc2l6ZW9mKHVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiksXG4rfTtcbitcbitCVEZfSURfTElTVF9TSU5HTEUod29ya2VyX3Bvb2xfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtlcl9wb29sKVxuK1xuK3N0YXRpYyBzdHJ1Y3QgYnBmX2l0ZXJfcmVnIHdvcmtlcl9wb29sX2l0ZXJfcmVnX2luZm8gPSB7XG4rXHQudGFyZ2V0XHRcdFx0PSBcIndvcmtlcl9wb29sXCIsXG4rXHQuY3R4X2FyZ19pbmZvX3NpemVcdD0gMSxcbitcdC5jdHhfYXJnX2luZm9cdFx0PSB7XG4rXHRcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCwgcG9vbCksXG4rXHRcdCAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSxcbitcdH0sXG4rXHQuc2VxX2luZm9cdFx0PSBcdTAwMjZ3b3JrZXJfcG9vbF9pdGVyX3NlcV9pbmZvLFxuK307XG4rXG4rLypcbisgKiBzZXEtZmlsZSBCUEYgaXRlcmF0b3Igb3ZlciB0aGUgcGVuZGluZyB3b3JrIGl0ZW1zIG9mIGV2ZXJ5IHdvcmtlcl9wb29sLlxuKyAqXG4rICogcG9vbC1cdTAwM2V3b3JrbGlzdCBpcyBwcm90ZWN0ZWQgYnkgcG9vbC1cdTAwM2Vsb2NrIGFuZCB3b3JrX3N0cnVjdCBoYXMgbmVpdGhlciBhXG4rICogcmVmY291bnQgbm9yIFJDVS1mcmVlaW5nLCBzbyBhIHBlbmRpbmcgd29yayBjYW5ub3QgYmUgaGFuZGVkIHRvIGEgc3VzcGVuZGVkXG4rICogKG9wZW4tY29kZWQpIGl0ZXJhdG9yIHNhZmVseS5cbisgKiBJbnN0ZWFkLCBmb3IgZWFjaCBwb29sIGEgYm91bmRlZCBzbmFwc2hvdCBvZiBpdHMgcGVuZGluZyB3b3JrcyBpcyBjb3BpZWQgb3V0XG4rICogd2hpbGUgcG9vbC1cdTAwM2Vsb2NrIGlzIGhlbGQsIG1pcnJvcmluZyB0aGUgcHJpbnRrX2RlZmVycmVkIHNlY3Rpb24gb2ZcbisgKiBzaG93X29uZV93b3JrZXJfcG9vbCgpIGFuZCB0aGVuIHRoZSBsb2NrIGlzIGRyb3BwZWQuXG4rICogVGhlIEJQRiBwcm9ncmFtIHRoZW4gcnVucyBvdmVyIHRoZSBzdGFibGUgc25hcHNob3Qgd2l0aCBubyBsb2NrIGhlbGQuXG4rICpcbisgKiBQb29scyBhcmUgdmlzaXRlZCBpbiB3b3JrZXJfcG9vbF9pZHIgb3JkZXIgKGEgc3RhYmxlIHJlc3VtZSBrZXkpOyBlYWNoIHBvb2wnc1xuKyAqIHNuYXBzaG90IGxpdmVzIGluIHRoZSBwZXJzaXN0ZW50IHNlcV9wcml2YXRlLCBzbyB0aGUgd2FsayByZXN1bWVzIGNvcnJlY3RseVxuKyAqIGFjcm9zcyByZWFkKCkgY2h1bmtzLiBBIHBvb2wgd2l0aCBtb3JlIHRoYW4gV1FfUEVORElOR19TTkFQX01BWCBwZW5kaW5nIHdvcmtzXG4rICogaXMgdHJ1bmNhdGVkIChiZXN0LWVmZm9ydCwgbGlrZSB0aGUga2VybmVsJ3Mgb3duIHdvcmtsaXN0IGR1bXApLlxuKyAqL1xuKyNkZWZpbmUgV1FfUEVORElOR19TTkFQX01BWCAxMjhcbitcbisvKlxuKyAqIE9uZSBwcm9qZWN0ZWQgcGVuZGluZyB3b3JrIGl0ZW0sIGFzIHNlZW4gYnkgdGhlIEJQRiBwcm9ncmFtLiBBZGRyZXNzZXMgb25seVxuKyAqIC0tIHRoZSBsaXZlIHdvcmtfc3RydWN0IGlzIG5vdCBleHBvc2VkIChpdCBtYXkgYmUgZnJlZWQgYWZ0ZXIgdGhlIGxvY2spLlxuKyAqL1xuK3N0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyB7XG4rXHRfX3U2NCBwb29sX2lkO1xuK1x0X191NjQgd29yaztcbitcdF9fdTY0IGZ1bmM7XG4rfTtcbitcbitzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYge1xuK1x0aW50ICAgICAgICAgIG5leHRfcG9vbDtcdC8qIHdvcmtlcl9wb29sX2lkciBjdXJzb3IgZm9yIHRoZSBuZXh0IGZpbGwgKi9cbitcdHVuc2lnbmVkIGludCBpZHg7XHQvKiBwb3NpdGlvbiB3aXRoaW4gc25hcFtdICAgICAgICAgICAgICAgICAgICovXG4rXHR1bnNpZ25lZCBpbnQgY291bnQ7XHQvKiB2YWxpZCBlbnRyaWVzIGluIHNuYXBbXSAgICAgICAgICAgICAgICAgICovXG4rXHRzdHJ1Y3Qgd3FfcGVuZGluZ193b3JrX2luZm8gc25hcFtXUV9QRU5ESU5HX1NOQVBfTUFYXTtcbit9O1xuK1xuK3N0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayB7XG4rXHRfX2JwZl9tZF9wdHIoc3RydWN0IGJwZl9pdGVyX21ldGEgKiwgbWV0YSk7XG4rXHRfX2JwZl9tZF9wdHIoc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICosIGluZm8pO1xuK307XG4rXG4rLypcbisgKiBTbmFwc2hvdCB0aGUgbmV4dCBub24tZW1wdHkgcG9vbCdzIHBlbmRpbmcgd29ya3MgaW50byBwcml2LVx1MDAzZXNuYXBbXSwgYWR2YW5jaW5nXG4rICogcHJpdi1cdTAwM2VuZXh0X3Bvb2wgcGFzdCBpdC4gUmV0dXJucyB0cnVlIGlmIGEgcG9vbCB3YXMgY2FwdHVyZWQsIGZhbHNlIGF0IGVuZC5cbisgKiBwb29sLVx1MDAzZWxvY2sgaXMgaGVsZCBvbmx5IGZvciB0aGUgZmllbGQgY29weTsgUkNVIGtlZXBzIGVhY2ggcG9vbCBhbGl2ZS5cbisgKi9cbitzdGF0aWMgYm9vbCB3cV9wZW5kaW5nX2ZpbGwoc3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2KVxuK3tcbitcdHN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbDtcbitcdHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaztcbitcdGludCBpZDtcbitcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdGZvciAoaWQgPSBwcml2LVx1MDAzZW5leHRfcG9vbDsgKHBvb2wgPSBpZHJfZ2V0X25leHQoXHUwMDI2d29ya2VyX3Bvb2xfaWRyLCBcdTAwMjZpZCkpOyBpZCsrKSB7XG4rXHRcdHVuc2lnbmVkIGludCBuID0gMDtcbitcbitcdFx0cmF3X3NwaW5fbG9ja19pcnEoXHUwMDI2cG9vbC1cdTAwM2Vsb2NrKTtcbitcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeSh3b3JrLCBcdTAwMjZwb29sLVx1MDAzZXdvcmtsaXN0LCBlbnRyeSkge1xuK1x0XHRcdGlmIChuIFx1MDAzZT0gV1FfUEVORElOR19TTkFQX01BWClcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdHByaXYtXHUwMDNlc25hcFtuXS5wb29sX2lkID0gcG9vbC1cdTAwM2VpZDtcbitcdFx0XHRwcml2LVx1MDAzZXNuYXBbbl0ud29yayA9IChfX3U2NCkodW5zaWduZWQgbG9uZyl3b3JrO1xuK1x0XHRcdHByaXYtXHUwMDNlc25hcFtuXS5mdW5jID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXdvcmstXHUwMDNlZnVuYztcbitcdFx0XHRuKys7XG4rXHRcdH1cbitcdFx0cmF3X3NwaW5fdW5sb2NrX2lycShcdTAwMjZwb29sLVx1MDAzZWxvY2spO1xuK1xuK1x0XHRpZiAobikge1xuK1x0XHRcdHByaXYtXHUwMDNlY291bnQgPSBuO1xuK1x0XHRcdHByaXYtXHUwMDNlaWR4ID0gMDtcbitcdFx0XHRwcml2LVx1MDAzZW5leHRfcG9vbCA9IGlkICsgMTtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0fVxuK1x0fVxuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICp3cV9wZW5kaW5nX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpXG4re1xuK1x0c3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2ID0gc2VxLVx1MDAzZXByaXZhdGU7XG4rXG4rXHRpZiAoKnBvcyA9PSAwKSB7XG4rXHRcdHByaXYtXHUwMDNlbmV4dF9wb29sID0gMDtcbitcdFx0cHJpdi1cdTAwM2VpZHggPSAwO1xuK1x0XHRwcml2LVx1MDAzZWNvdW50ID0gMDtcbitcdH1cbitcdHdoaWxlIChwcml2LVx1MDAzZWlkeCBcdTAwM2U9IHByaXYtXHUwMDNlY291bnQpIHtcbitcdFx0aWYgKCF3cV9wZW5kaW5nX2ZpbGwocHJpdikpXG4rXHRcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXHRyZXR1cm4gXHUwMDI2cHJpdi1cdTAwM2VzbmFwW3ByaXYtXHUwMDNlaWR4XTtcbit9XG4rXG4rc3RhdGljIHZvaWQgKndxX3BlbmRpbmdfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuK3tcbitcdHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiAqcHJpdiA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuK1xuK1x0KysqcG9zO1xuK1x0cHJpdi1cdTAwM2VpZHgrKztcbitcdHdoaWxlIChwcml2LVx1MDAzZWlkeCBcdTAwM2U9IHByaXYtXHUwMDNlY291bnQpIHtcbitcdFx0aWYgKCF3cV9wZW5kaW5nX2ZpbGwocHJpdikpXG4rXHRcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXHRyZXR1cm4gXHUwMDI2cHJpdi1cdTAwM2VzbmFwW3ByaXYtXHUwMDNlaWR4XTtcbit9XG4rXG4rc3RhdGljIGludCB3cV9wZW5kaW5nX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayBjdHg7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhO1xuK1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuK1xuK1x0bWV0YS5zZXEgPSBzZXE7XG4rXHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgZmFsc2UpO1xuK1x0aWYgKCFwcm9nKVxuK1x0XHRyZXR1cm4gMDtcbitcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbitcdGN0eC5pbmZvID0gdjtcbitcdHJldHVybiBicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcdTAwMjZjdHgpO1xuK31cbitcbitzdGF0aWMgdm9pZCB3cV9wZW5kaW5nX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayBjdHg7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhO1xuK1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuK1xuK1x0aWYgKHYpXG4rXHRcdHJldHVybjtcbitcdG1ldGEuc2VxID0gc2VxO1xuK1x0cHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKFx1MDAyNm1ldGEsIHRydWUpO1xuK1x0aWYgKHByb2cpIHtcbitcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuK1x0XHRjdHguaW5mbyA9IE5VTEw7XG4rXHRcdGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd3FfcGVuZGluZ19zZXFfb3BzID0ge1xuK1x0LnN0YXJ0XHQ9IHdxX3BlbmRpbmdfc2VxX3N0YXJ0LFxuK1x0Lm5leHRcdD0gd3FfcGVuZGluZ19zZXFfbmV4dCxcbitcdC5zdG9wXHQ9IHdxX3BlbmRpbmdfc2VxX3N0b3AsXG4rXHQuc2hvd1x0PSB3cV9wZW5kaW5nX3NlcV9zaG93LFxuK307XG4rXG4rREVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlX3BlbmRpbmdfd29yaywgc3RydWN0IGJwZl9pdGVyX21ldGEgKm1ldGEsXG4rXHRcdCAgICAgc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvKVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2luZm8gd3FfcGVuZGluZ19zZXFfaW5mbyA9IHtcbitcdC5zZXFfb3BzXHQ9IFx1MDAyNndxX3BlbmRpbmdfc2VxX29wcyxcbitcdC5zZXFfcHJpdl9zaXplXHQ9IHNpemVvZihzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYpLFxuK307XG4rXG4rQlRGX0lEX0xJU1RfU0lOR0xFKHdxX3BlbmRpbmdfd29ya19pbmZvX2J0Zl9pZCwgc3RydWN0LCB3cV9wZW5kaW5nX3dvcmtfaW5mbylcbitcbitzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3cV9wZW5kaW5nX3JlZ19pbmZvID0ge1xuK1x0LnRhcmdldFx0XHRcdD0gXCJ3b3JrcXVldWVfcGVuZGluZ193b3JrXCIsXG4rXHQuZmVhdHVyZVx0XHQ9IEJQRl9JVEVSX1JFU0NIRUQsXG4rXHQuY3R4X2FyZ19pbmZvX3NpemVcdD0gMSxcbitcdC5jdHhfYXJnX2luZm9cdFx0PSB7XG4rXHRcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrLCBpbmZvKSxcbitcdFx0ICBQVFJfVE9fQlRGX0lEX09SX05VTEwgfSxcbitcdH0sXG4rXHQuc2VxX2luZm9cdFx0PSBcdTAwMjZ3cV9wZW5kaW5nX3NlcV9pbmZvLFxuK307XG4rXG4rc3RhdGljIGludCBfX2luaXQgYnBmX3dvcmtxdWV1ZV9pdGVyX2luaXQodm9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsXG4rXHRcdFx0XHRcdFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1x0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXG4rXHRcdFx0XHRcdFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0d29ya3F1ZXVlX2l0ZXJfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdvcmtxdWV1ZV9idGZfaWRbMF07XG4rXHRyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KFx1MDAyNndvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHR3b3JrZXJfcG9vbF9pdGVyX3JlZ19pbmZvLmN0eF9hcmdfaW5mb1swXS5idGZfaWQgPSB3b3JrZXJfcG9vbF9idGZfaWRbMF07XG4rXHRyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KFx1MDAyNndvcmtlcl9wb29sX2l0ZXJfcmVnX2luZm8pO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHdxX3BlbmRpbmdfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdxX3BlbmRpbmdfd29ya19pbmZvX2J0Zl9pZFswXTtcbitcdHJldHVybiBicGZfaXRlcl9yZWdfdGFyZ2V0KFx1MDAyNndxX3BlbmRpbmdfcmVnX2luZm8pO1xuK31cbitsYXRlX2luaXRjYWxsKGJwZl93b3JrcXVldWVfaXRlcl9pbml0KTtcbitcbisjZW5kaWYgLyogQ09ORklHX0JQRl9TWVNDQUxMICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbmluZGV4IDY3ZmY3ODgyMjk5ZWMuLjZkYTkzYzQ4NjY1MDkgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXG5AQCAtMzYxLDYgKzM2MSwxNiBAQCBleHRlcm4gaW50IGJwZl9pdGVyX2RtYWJ1Zl9uZXcoc3RydWN0IGJwZl9pdGVyX2RtYWJ1ZiAqaXQpIF9fd2VhayBfX2tzeW07XG4gZXh0ZXJuIHN0cnVjdCBkbWFfYnVmICpicGZfaXRlcl9kbWFidWZfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcbiBleHRlcm4gdm9pZCBicGZfaXRlcl9kbWFidWZfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcbiBcbitzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlO1xuK2V4dGVybiBpbnQgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTtcbitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KSBfX3dlYWsgX19rc3ltO1xuK2V4dGVybiB2b2lkIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KSBfX3dlYWsgX19rc3ltO1xuK1xuK3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbDtcbitleHRlcm4gaW50IGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KSBfX3dlYWsgX19rc3ltO1xuK2V4dGVybiBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKmJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkgX193ZWFrIF9fa3N5bTtcbitleHRlcm4gdm9pZCBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpIF9fd2VhayBfX2tzeW07XG4rXG4gZXh0ZXJuIGludCBicGZfY2dyb3VwX3JlYWRfeGF0dHIoc3RydWN0IGNncm91cCAqY2dyb3VwLCBjb25zdCBjaGFyICpuYW1lX19zdHIsXG4gXHRcdFx0XHQgc3RydWN0IGJwZl9keW5wdHIgKnZhbHVlX3ApIF9fd2VhayBfX2tzeW07XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvd3FfaXRlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvd3FfaXRlci5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzMzODNjMjYzYmVlOFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvd3FfaXRlci5jXG5AQCAtMCwwICsxLDgwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcIndxX2l0ZXIuc2tlbC5oXCJcbisjaW5jbHVkZSBcIndxX2l0ZXJfZmFpbC5za2VsLmhcIlxuK1xuK3N0YXRpYyB2b2lkIHN1YnRlc3Rfb3Blbl9jb2RlZChzdHJ1Y3Qgd3FfaXRlciAqc2tlbClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5jb3VudF93b3JrcXVldWVzKSxcbitcdFx0XHRcdCAgICAgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuIGNvdW50X3dvcmtxdWV1ZXNcIikpXG4rXHRcdHJldHVybjtcbitcdC8qIFRoZXJlIGFyZSBhbHdheXMgc2V2ZXJhbCBzeXN0ZW0gd29ya3F1ZXVlcyAoZXZlbnRzLCAuLi4pLiAqL1xuK1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3dvcmtxdWV1ZXMsIDAsIFwibnJfd29ya3F1ZXVlc1wiKTtcbitcbitcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MuY291bnRfd29ya2VyX3Bvb2xzKSxcbitcdFx0XHRcdCAgICAgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuIGNvdW50X3dvcmtlcl9wb29sc1wiKSlcbitcdFx0cmV0dXJuO1xuK1x0LyogQXQgbGVhc3QgdGhlIHBlci1DUFUgbm9ybWFsL2hpZ2hwcmkgcG9vbHMgZXhpc3QuICovXG4rXHRBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlbnJfd29ya2VyX3Bvb2xzLCAwLCBcIm5yX3dvcmtlcl9wb29sc1wiKTtcbitcdEFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2Vucl9wZXJjcHVfcG9vbHMsIDAsIFwibnJfcGVyY3B1X3Bvb2xzXCIpO1xuK31cbitcbitzdGF0aWMgdm9pZCBkcmFpbl9pdGVyKHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZywgY29uc3QgY2hhciAqbmFtZSlcbit7XG4rXHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbms7XG4rXHRjaGFyIGJ1Zls1MTJdO1xuK1x0aW50IGl0ZXJfZmQ7XG4rXHRzc2l6ZV90IG47XG4rXG4rXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHByb2csIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIG5hbWUpKVxuK1x0XHRyZXR1cm47XG4rXHRpdGVyX2ZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7XG4rXHRpZiAoIUFTU0VSVF9HRShpdGVyX2ZkLCAwLCBcIml0ZXJfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdHdoaWxlICgobiA9IHJlYWQoaXRlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSkpIFx1MDAzZSAwKVxuK1x0XHQ7XG4rXHRBU1NFUlRfR0UobiwgMCwgXCJyZWFkIGl0ZXJcIik7XG4rXHRjbG9zZShpdGVyX2ZkKTtcbitvdXQ6XG4rXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgc3VidGVzdF9zZXEoc3RydWN0IHdxX2l0ZXIgKnNrZWwpXG4re1xuK1x0Lyogc2VxIGZvcm1zIGFyZSBiYWNrZWQgYnkgdGhlIHNhbWUgb3Blbi1jb2RlZCBuZXh0KCkuICovXG4rXHRkcmFpbl9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuZHVtcF93b3JrcXVldWVzLCBcImF0dGFjaCB3b3JrcXVldWUgaXRlclwiKTtcbitcdEFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2Vucl93cV9zZXEsIDAsIFwibnJfd3Ffc2VxXCIpO1xuK1xuK1x0ZHJhaW5faXRlcihza2VsLVx1MDAzZXByb2dzLmR1bXBfd29ya2VyX3Bvb2xzLCBcImF0dGFjaCB3b3JrZXJfcG9vbCBpdGVyXCIpO1xuK1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3Bvb2xfc2VxLCAwLCBcIm5yX3Bvb2xfc2VxXCIpO1xuK1xuK1x0LypcbitcdCAqIHdvcmtsaXN0cyBhcmUgdXN1YWxseSBlbXB0eSBvbiBhbiBpZGxlIHN5c3RlbTsgdGhpcyBkcml2ZXMgdGhlIHdob2xlXG4rXHQgKiBwZXItcG9vbCBzbmFwc2hvdCBwYXRoIGFuZCB2ZXJpZmllcyBpdCBkcmFpbnMgY2xlYW5seS5cbitcdCAqL1xuK1x0ZHJhaW5faXRlcihza2VsLVx1MDAzZXByb2dzLmR1bXBfcGVuZGluZywgXCJhdHRhY2ggcGVuZGluZ193b3JrIGl0ZXJcIik7XG4rfVxuK1xuK3ZvaWQgdGVzdF93cV9pdGVyKHZvaWQpXG4re1xuK1x0c3RydWN0IHdxX2l0ZXIgKnNrZWw7XG4rXG4rXHRza2VsID0gd3FfaXRlcl9fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwid3FfaXRlcl9fb3Blbl9hbmRfbG9hZFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJvcGVuX2NvZGVkXCIpKVxuK1x0XHRzdWJ0ZXN0X29wZW5fY29kZWQoc2tlbCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNlcVwiKSlcbitcdFx0c3VidGVzdF9zZXEoc2tlbCk7XG4rXG4rXHR3cV9pdGVyX19kZXN0cm95KHNrZWwpO1xuK1xuK1x0UlVOX1RFU1RTKHdxX2l0ZXJfZmFpbCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy93cV9pdGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlci5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTVmMDgxYmM2MzRiNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXIuY1xuQEAgLTAsMCArMSw5NSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuK1xuK3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltO1xuK3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07XG4rXG4rLyogUmVzdWx0cywgY2hlY2tlZCBieSB1c2Vyc3BhY2UuICovXG4raW50IG5yX3dvcmtxdWV1ZXM7XG4raW50IG5yX3dvcmtlcl9wb29scztcbitpbnQgbnJfcGVyY3B1X3Bvb2xzO1xuK2ludCBucl93cV9zZXE7XG4raW50IG5yX3Bvb2xfc2VxO1xuK2ludCBucl9wZW5kaW5nO1xuK1xuKy8qIC0tLSBvcGVuLWNvZGVkIGl0ZXJhdG9ycyAoS0ZfUkNVX1BST1RFQ1RFRCkgLS0tICovXG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBjb3VudF93b3JrcXVldWVzKGNvbnN0IHZvaWQgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7XG4rXHRpbnQgbiA9IDA7XG4rXG4rXHRicGZfcmN1X3JlYWRfbG9jaygpO1xuK1x0YnBmX2Zvcl9lYWNoKHdvcmtxdWV1ZSwgd3EpXG4rXHRcdG4rKztcbitcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcbitcbitcdG5yX3dvcmtxdWV1ZXMgPSBuO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInN5c2NhbGxcIilcbitpbnQgY291bnRfd29ya2VyX3Bvb2xzKGNvbnN0IHZvaWQgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XG4rXHRpbnQgbiA9IDAsIHBlcmNwdSA9IDA7XG4rXG4rXHRicGZfcmN1X3JlYWRfbG9jaygpO1xuK1x0YnBmX2Zvcl9lYWNoKHdvcmtlcl9wb29sLCBwb29sKSB7XG4rXHRcdG4rKztcbitcdFx0aWYgKHBvb2wtXHUwMDNlY3B1IFx1MDAzZT0gMClcdFx0LyogcGVyLUNQVSBwb29sICovXG4rXHRcdFx0cGVyY3B1Kys7XG4rXHR9XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rXG4rXHRucl93b3JrZXJfcG9vbHMgPSBuO1xuK1x0bnJfcGVyY3B1X3Bvb2xzID0gcGVyY3B1O1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIC0tLSBzZXFfZmlsZSBpdGVyYXRvcnMgLS0tICovXG4rXG4rU0VDKFwiaXRlci93b3JrcXVldWVcIilcbitpbnQgZHVtcF93b3JrcXVldWVzKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlICpjdHgpXG4re1xuK1x0c3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtXHUwMDNlbWV0YS1cdTAwM2VzZXE7XG4rXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBjdHgtXHUwMDNld3E7XG4rXG4rXHRpZiAoIXdxKVxuK1x0XHRyZXR1cm4gMDtcbitcdG5yX3dxX3NlcSsrO1xuK1x0QlBGX1NFUV9QUklOVEYoc2VxLCBcIiVzXFxuXCIsIHdxLVx1MDAzZW5hbWUpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcIml0ZXIvd29ya2VyX3Bvb2xcIilcbitpbnQgZHVtcF93b3JrZXJfcG9vbHMoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCAqY3R4KVxuK3tcbitcdHN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbCA9IGN0eC1cdTAwM2Vwb29sO1xuK1xuK1x0aWYgKCFwb29sKVxuK1x0XHRyZXR1cm4gMDtcbitcdG5yX3Bvb2xfc2VxKys7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwiaXRlci93b3JrcXVldWVfcGVuZGluZ193b3JrXCIpXG4raW50IGR1bXBfcGVuZGluZyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGN0eC1cdTAwM2VtZXRhLVx1MDAzZXNlcTtcbitcdHN0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyAqaW5mbyA9IGN0eC1cdTAwM2VpbmZvO1xuK1xuK1x0aWYgKCFpbmZvKVx0XHRcdC8qIGZpbmFsIGNhbGwgKi9cbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRucl9wZW5kaW5nKys7XG4rXHRCUEZfU0VRX1BSSU5URihzZXEsIFwicG9vbCAlbGx1IHdvcmsgMHglbGx4IGZ1bmMgMHglbGx4XFxuXCIsXG4rXHRcdCAgICAgICBpbmZvLVx1MDAzZXBvb2xfaWQsIGluZm8tXHUwMDNld29yaywgaW5mby1cdTAwM2VmdW5jKTtcbitcdHJldHVybiAwO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mYjJkY2Y5ODQ3ZTJiXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcbkBAIC0wLDAgKzEsMzcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfbWlzYy5oXCJcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuK1xuKy8qXG4rICogVGhlIHdvcmtxdWV1ZSBhbmQgd29ya2VyX3Bvb2wgb3Blbi1jb2RlZCBpdGVyYXRvcnMgYXJlIEtGX1JDVV9QUk9URUNURUQ6XG4rICogdXNpbmcgdGhlbSBvdXRzaWRlIGEgYnBmX3JjdV9yZWFkX2xvY2soKSByZWdpb24gbXVzdCBiZSByZWplY3RlZC5cbisgKi9cbitcbitTRUMoXCI/c3lzY2FsbFwiKVxuK19fZmFpbHVyZSBfX21zZyhcImtlcm5lbCBmdW5jIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblwiKVxuK2ludCB3b3JrcXVldWVfaXRlcl9ub19yY3UoY29uc3Qgdm9pZCAqY3R4KVxuK3tcbitcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcbitcdGludCBuID0gMDtcbitcbitcdGJwZl9mb3JfZWFjaCh3b3JrcXVldWUsIHdxKVxuK1x0XHRuKys7XG4rXHRyZXR1cm4gbjtcbit9XG4rXG4rU0VDKFwiP3N5c2NhbGxcIilcbitfX2ZhaWx1cmUgX19tc2coXCJrZXJuZWwgZnVuYyBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblwiKVxuK2ludCB3b3JrZXJfcG9vbF9pdGVyX25vX3JjdShjb25zdCB2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuK1x0aW50IG4gPSAwO1xuK1xuK1x0YnBmX2Zvcl9lYWNoKHdvcmtlcl9wb29sLCBwb29sKVxuK1x0XHRuKys7XG4rXHRyZXR1cm4gbjtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTozNS43MzU4MzA5OTZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NzIzMzM1NDMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkJQRiBJdGVyYXRvcnMgZm9yIFdvcmtxdWV1ZXM6IEluaXRpYWwgQXNzZXNzbWVudCBhbmQgRnV6emluZyBTdHJhdGVneSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIEJQRiBpdGVyYXRvcnMgZm9yIHdvcmtxdWV1ZXMgYW5kIHdvcmtlciBwb29scy4gSXQgc2VlbXMgbGlrZSBpdCdzIGFkZGluZyBhIG5ldyBzZXQgb2Yga2Z1bmNzIGFuZCBpdGVyYXRvcnMgd2l0aGluIGBrZXJuZWwvd29ya3F1ZXVlLmNgLiBTcGVjaWZpY2FsbHksIEkgc2VlIGZ1bmN0aW9ucyBsaWtlIGBicGZfaXRlcl93b3JrcXVldWVfbmV3YCwgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0YCwgYGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95YCBmb3Igd29ya3F1ZXVlcywgYW5kIHNpbWlsYXIgb25lcyBmb3Igd29ya2VyIHBvb2xzLCBhcyB3ZWxsIGFzIGFuIGBicGZfaXRlcl9yZWdgIGNhbGwgZm9yIHZhcmlvdXMgc3RydWN0dXJlcyByZWxhdGVkIHRvIHdvcmtxdWV1ZXMuXG5cbk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIklzIHRoaXMgYWN0dWFsbHkgKnJlYWNoYWJsZSogYW5kIGZ1bmN0aW9uYWw/XCIgVGhlIGFuc3dlciBhcHBlYXJzIHRvIGJlIHllczsgdGhlc2UgYXJlIG5ldyBCUEYga2Z1bmNzLCBzbyB0aGV5IGFyZSwgaW4gZmFjdCwgY2FsbGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoYXQgaW1tZWRpYXRlbHkgbWFrZXMgdGhpcyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gV2UgbmVlZCB0byByZWFsbHkgcHV0IHRoZXNlIG5ldyBhZGRpdGlvbnMgdGhyb3VnaCB0aGVpciBwYWNlcy5cblxuVGhlcmVmb3JlLCB0aGUgZm9jdXMgbmVlZHMgdG8gYmUgb24gdGhlc2UgY29yZSBzeW1ib2xzOiBgYnBmX2l0ZXJfd29ya3F1ZXVlX25ld2AsIGBicGZfaXRlcl93b3JrcXVldWVfbmV4dGAsIGBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveWAsIGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXdgLCBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dGAsIGBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95YC4gSSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgdGhlIHN1cHBvcnRpbmcgc2VxIGZpbGUgaXRlcmF0b3IgZnVuY3Rpb25zOiBgd29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0YCwgYHdvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0YCwgYHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93YCwgYHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wYCBhbmQgc2ltaWxhciBvbmVzIGZvciB0aGUgYHdvcmtlcl9wb29sYCBhbmQgdGhlIGB3cV9wZW5kaW5nYCByZWxhdGVkIHN0cnVjdHVyZXMuXG5cbk5vdywgYSBzbWFsbCBoaWNjdXAuIEkndmUganVzdCBub3RpY2VkIGB3cV9wZW5kaW5nX2ZpbGxgIHdoaWNoIGlzIGEgc3RhdGljIGZ1bmN0aW9uLCBidXQgaXQgYXBwZWFycyB0byBiZSBub24tdHJpdmlhbC4gVGhhdCdzIHdvcnRoIGEgc2Vjb25kIGxvb2ssIHNvIEkgbmVlZCB0byBjaGVjayB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGUgYmxvY2suIEkgYmVsaWV2ZSBpdCdzIHdyYXBwZWQgaW4gYW4gYCNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExgIGRpcmVjdGl2ZS4gTGV0IG1lIHF1aWNrbHkgdmVyaWZ5IHRoaXMuXG5cbkknbGwgdXNlIGBncmVwcGVyYCB0byBzZWFyY2ggZm9yIGBDT05GSUdfQlBGX1NZU0NBTExgIHdpdGhpbiBga2VybmVsL3dvcmtxdWV1ZS5jYCB0byBjb25maXJtIG15IHN1c3BpY2lvbiBhbmQgY2xhcmlmeSBpdHMgZGVwZW5kZW5jeS4gVGhpcyBpcyBhbGwgYWJvdXQgZW5zdXJpbmcgdGhlIGNvZGUgaXMgY29tcGlsZWQgY29ycmVjdGx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTQ5NCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUxMSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA0OjAxOjQzLjQ1OTE3MDg4OFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NzQ0NDQzOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfQlBGX1NZU0NBTExcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL3dvcmtxdWV1ZS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC93b3JrcXVldWUuYz04NDc3PV9fc2V0dXAoXFxcIndvcmtxdWV1ZS51bmJvdW5kX2NwdXM9XFxcIiwgd29ya3F1ZXVlX3VuYm91bmRfY3B1c19zZXR1cCk7XFxua2VybmVsL3dvcmtxdWV1ZS5jLTg0NzgtXFxua2VybmVsL3dvcmtxdWV1ZS5jOjg0Nzk6I2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxcbmtlcm5lbC93b3JrcXVldWUuYy04NDgwLVxcbi0tXFxua2VybmVsL3dvcmtxdWV1ZS5jPTkwMjk9bGF0ZV9pbml0Y2FsbChicGZfd29ya3F1ZXVlX2l0ZXJfaW5pdCk7XFxua2VybmVsL3dvcmtxdWV1ZS5jLTkwMzAtXFxua2VybmVsL3dvcmtxdWV1ZS5jOjkwMzE6I2VuZGlmIC8qIENPTkZJR19CUEZfU1lTQ0FMTCAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTo0My41MzY2MjIwNzdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NDI1MDA4NDE5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQlBGIEl0ZXJhdG9yIFBhdGNoKipcblxuT2theSwgc28gdGhlIGNvZGUgaXMgZGVmaW5pdGVseSBndWFyZGVkIGJ5IGAjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMYCwgdGhhdCdzIHRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZW4ndCBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgbHVya2luZyBhYm91dCwgYnV0IGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBpdCdzIGp1c3QgdGhlIGBDT05GSUdfQlBGX1NZU0NBTExgIGZsYWcuIFxuXG5Ob3csIGxldCdzIGRpZyBpbnRvIHRoZSBtZWF0IG9mIHRoZSBwYXRjaCBhbmQgc2VlIHdoYXQncyBiZWluZyBpbnRyb2R1Y2VkLiBSaWdodCwgaXQgbG9va3MgbGlrZSB0aGlzIHBhdGNoIGlzIGFkZGluZyBuZXcgQlBGIGl0ZXJhdG9ycy4gSSBzZWUgZnVuY3Rpb25zIGxpa2UgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX25leHRgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3lgLi4uIGFuZCBzaW1pbGFybHkgZm9yIHdvcmtlciBwb29sczogYGJwZl9pdGVyX3dvcmtlcl9wb29sX25ld2AsIGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0YCwgYGJwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3lgLiBQbHVzLCB0aGVyZSBhcmUgc29tZSBoZWxwZXIgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhlc2UgaXRlcmF0b3JzLCBsaWtlIHRoZSBgc2VxX2AgZnVuY3Rpb25zLCBhbmQgYSBmZXcgb3RoZXJzLiBTcGVjaWZpY2FsbHksIHRoZSBwYXRjaCBhZGRzOlxuXG4qICAgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdgXG4qICAgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0YFxuKiAgIGBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveWBcbiogICBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3YFxuKiAgIGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0YFxuKiAgIGBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95YFxuKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnRgXG4qICAgYHdvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0YFxuKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfc2hvd2BcbiogICBgd29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3BgXG4qICAgYHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0YFxuKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0YFxuKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93YFxuKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wYFxuKiAgIGB3cV9wZW5kaW5nX2ZpbGxgXG4qICAgYHdxX3BlbmRpbmdfc2VxX3N0YXJ0YFxuKiAgIGB3cV9wZW5kaW5nX3NlcV9uZXh0YFxuKiAgIGB3cV9wZW5kaW5nX3NlcV9zaG93YFxuKiAgIGB3cV9wZW5kaW5nX3NlcV9zdG9wYFxuXG5CYXNlZCBvbiB3aGF0IEknbSBzZWVpbmcsIHRoaXMgaXMgZXhhY3RseSB3aGF0IEkgbmVlZCB0byBhZGQgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gU2luY2UgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIHRoZXNlIG5ldyBCUEYgaXRlcmF0b3JzIGZvciB3b3JrcXVldWVzIGFuZCB3b3JrZXIgcG9vbHMsIGFuZCBzaW5jZSB0aGVzZSBhcmUgYWNjZXNzaWJsZSBmcm9tIEJQRiBwcm9ncmFtcywgdGhleSBhcmUgZGVmaW5pdGVseSBjYW5kaWRhdGVzIGZvciBmdXp6aW5nLiBJIGNhbiBnZXQgdG8gdGhlc2UgZnJvbSBCUEYgcHJvZ3JhbXMsIGFuZCB0aGF0J3MgYSB2ZWN0b3IgZm9yIGV4cGxvaXQuXG5cbkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgKm9ubHkqIHJlcXVpcmVkIGNvbmZpZy4gWXVwLCB0aGF0J3MgdGhlIG1haW4gb25lLlxuXG5Pa2F5LCB0aGF0J3MgZW5vdWdoIGluZm9ybWF0aW9uLCBsZXQncyBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNzAwLCJPdXRwdXRUb2tlbnMiOjI4MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTo1MS45NjE2MzMyMTZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNTc3NzU1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfbmV3XCIsXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfbmV4dFwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3lcIixcbiAgICBcImJwZl9pdGVyX3dvcmtlcl9wb29sX25ld1wiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dFwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveVwiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfbmV4dFwiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3Nob3dcIixcbiAgICBcIndvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wXCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydFwiLFxuICAgIFwid29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dFwiLFxuICAgIFwid29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvd1wiLFxuICAgIFwid29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcFwiLFxuICAgIFwid3FfcGVuZGluZ19maWxsXCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zdGFydFwiLFxuICAgIFwid3FfcGVuZGluZ19zZXFfbmV4dFwiLFxuICAgIFwid3FfcGVuZGluZ19zZXFfc2hvd1wiLFxuICAgIFwid3FfcGVuZGluZ19zZXFfc3RvcFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgbmV3IEJQRiBpdGVyYXRvcnMgZm9yIHdvcmtxdWV1ZXMgYW5kIHdvcmtlciBwb29scywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgY2FuIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdcIixcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveVwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnRcIixcbiAgICBcIndvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc2hvd1wiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3BcIixcbiAgICBcIndvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wXCIsXG4gICAgXCJ3cV9wZW5kaW5nX2ZpbGxcIixcbiAgICBcIndxX3BlbmRpbmdfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9uZXh0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zaG93XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zdG9wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowg5xlr[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-29 03:56:46 +0000 UTC FinishedAt: 2026-07-29 04:01:53 +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": "87267b89459813cb50ab5377e076b639c07b4491", "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": "87267b89459813cb50ab5377e076b639c07b4491", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL" ], "series_id": "29c71d21-3b1c-4a5e-85f7-0b9b4d647850" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "bpf_iter_workqueue_new", "bpf_iter_workqueue_next", "bpf_iter_workqueue_destroy", "bpf_iter_worker_pool_new", "bpf_iter_worker_pool_next", "bpf_iter_worker_pool_destroy", "workqueue_iter_seq_start", "workqueue_iter_seq_next", "workqueue_iter_seq_show", "workqueue_iter_seq_stop", "worker_pool_iter_seq_start", "worker_pool_iter_seq_next", "worker_pool_iter_seq_show", "worker_pool_iter_seq_stop", "wq_pending_fill", "wq_pending_seq_start", "wq_pending_seq_next", "wq_pending_seq_show", "wq_pending_seq_stop" ], "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+CgkJCTx0ZD4yMDI2LzA3LzI5IDA0OjAxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2l0ZXJfd29ya3F1ZXVlX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfbmV4dCYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfZGVzdHJveSYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc2hvdyYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc3RvcCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0JiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3cmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX2ZpbGwmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfc3RhcnQmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9zaG93JiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX3N0b3AmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA0OjAxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZTY5MzM2ZDY5YTllYzMwMTMzNzljMjMwZjJmODRhMGJkMDgwYzZjZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBXZWQgSnVsIDI5IDA0OjAxOjM0IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuY1xuaW5kZXggNzgwNjhhZThmMjhhNi4uNmU4Nzk0OTBjODExYSAxMDA2NDRcbi0tLSBhL2tlcm5lbC93b3JrcXVldWUuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3dvcmtxdWV1ZS5jXG5AQCAtNTYsNiAmIzQzOzU2LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fcGFyYS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZGVsYXkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycV93b3JrLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnRmX2lkcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gI2luY2x1ZGUgXCYjMzQ7d29ya3F1ZXVlX2ludGVybmFsLmhcJiMzNDtcbiBcbkBAIC04NDczLDMgJiM0Mzs4NDc1LDU1NyBAQCBzdGF0aWMgaW50IF9faW5pdCB3b3JrcXVldWVfdW5ib3VuZF9jcHVzX3NldHVwKGNoYXIgKnN0cilcbiBcdHJldHVybiAxO1xuIH1cbiBfX3NldHVwKFwmIzM0O3dvcmtxdWV1ZS51bmJvdW5kX2NwdXM9XCYjMzQ7LCB3b3JrcXVldWVfdW5ib3VuZF9jcHVzX3NldHVwKTtcbiYjNDM7XG4mIzQzOyNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIEJQRiBvcGVuLWNvZGVkIGl0ZXJhdG9yIG92ZXIgYWxsIHdvcmtxdWV1ZXMuXG4mIzQzOyAqXG4mIzQzOyAqIFdhbGtzIHRoZSBnbG9iYWwgQHdvcmtxdWV1ZXMgbGlzdCwgbGV0dGluZyBCUEYgcHJvZ3JhbXMgcmVhZCBsaXZlIHdvcmtxdWV1ZVxuJiM0MzsgKiBzdGF0ZS5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIGNhbGxlciBtdXN0IGhvbGQgYnBmX3JjdV9yZWFkX2xvY2soKSBhY3Jvc3MgbmV3KCktXHUwMDNlbmV4dCgpLVx1MDAzZWRlc3Ryb3koKS5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsvKiBTZW50aW5lbCBmb3IgXCYjMzQ7bmV3KCkgZG9uZSwgbmV4dCgpIG5vdCB5ZXQgY2FsbGVkXCYjMzQ7IHZzIFwmIzM0O2l0ZXJhdGlvbiBlbmRlZFwmIzM0Oy4gKi9cbiYjNDM7I2RlZmluZSBCUEZfV1FfSVRFUl9TVEFSVCAoKHZvaWQgKikxTClcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWUge1xuJiM0MztcdF9fdTY0IF9fb3BhcXVlWzFdO1xuJiM0Mzt9IF9fYWxpZ25lZCg4KTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiB7XG4mIzQzO1x0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBvcztcbiYjNDM7fSBfX2FsaWduZWQoOCk7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wge1xuJiM0MztcdF9fdTY0IF9fb3BhcXVlWzFdO1xuJiM0Mzt9IF9fYWxpZ25lZCg4KTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuIHtcbiYjNDM7XHRpbnQgaWQ7XHRcdC8qIG5leHQgd29ya2VyX3Bvb2xfaWRyIGlkIHRvIHNlYXJjaCBmcm9tICovXG4mIzQzO30gX19hbGlnbmVkKDgpO1xuJiM0MztcbiYjNDM7X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuJiM0MztcbiYjNDM7LyoqXG4mIzQzOyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcoKSAtIEluaXRpYWxpemUgYSB3b3JrcXVldWUgaXRlcmF0b3JcbiYjNDM7ICogQGl0OiBUaGUgbmV3IGJwZl9pdGVyX3dvcmtxdWV1ZSB0byBpbml0aWFsaXplXG4mIzQzOyAqXG4mIzQzOyAqIEl0ZXJhdGVzIGV2ZXJ5IHdvcmtxdWV1ZSBvbiB0aGUgZ2xvYmFsIEB3b3JrcXVldWVzIGxpc3QuIE11c3QgYmUgdXNlZCBpbnNpZGVcbiYjNDM7ICogYSBicGZfcmN1X3JlYWRfbG9jaygpIHJlZ2lvbiAoS0ZfUkNVX1BST1RFQ1RFRCkuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbiYjNDM7XG4mIzQzO1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4pIFx1MDAzZVxuJiM0MztcdFx0ICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSkpO1xuJiM0MztcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4pICE9XG4mIzQzO1x0XHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUpKTtcbiYjNDM7XG4mIzQzO1x0a2l0LVx1MDAzZXBvcyA9IEJQRl9XUV9JVEVSX1NUQVJUO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoKSAtIEdldCB0aGUgbmV4dCB3b3JrcXVldWVcbiYjNDM7ICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya3F1ZXVlXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdCB3b3JrcXVldWVfc3RydWN0LCBvciBOVUxMIHdoZW4gZG9uZS5cbiYjNDM7ICovXG4mIzQzO19fYnBmX2tmdW5jIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpcbiYjNDM7YnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4mIzQzO1xuJiM0MztcdGlmICgha2l0LVx1MDAzZXBvcylcdFx0XHQvKiBhbHJlYWR5IHJlYWNoZWQgdGhlIGVuZCAqL1xuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1xuJiM0MztcdGlmIChraXQtXHUwMDNlcG9zID09IEJQRl9XUV9JVEVSX1NUQVJUKVxuJiM0MztcdFx0a2l0LVx1MDAzZXBvcyA9IGxpc3RfZmlyc3Rfb3JfbnVsbF9yY3UoXHUwMDI2d29ya3F1ZXVlcyxcbiYjNDM7XHRcdFx0XHRcdFx0ICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0a2l0LVx1MDAzZXBvcyA9IGxpc3RfbmV4dF9vcl9udWxsX3JjdShcdTAwMjZ3b3JrcXVldWVzLCBcdTAwMjZraXQtXHUwMDNlcG9zLVx1MDAzZWxpc3QsXG4mIzQzO1x0XHRcdFx0XHRcdCBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XG4mIzQzO1x0cmV0dXJuIGtpdC1cdTAwM2Vwb3M7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveSgpIC0gRGVzdHJveSBhIHdvcmtxdWV1ZSBpdGVyYXRvclxuJiM0MzsgKiBAaXQ6IFRoZSBicGZfaXRlcl93b3JrcXVldWUgdG8gZGVzdHJveVxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdClcbiYjNDM7e1xuJiM0MztcdC8qIE5vIHJlZmVyZW5jZXMgdGFrZW47IFJDVSBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIuICovXG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcoKSAtIEluaXRpYWxpemUgYSB3b3JrZXJfcG9vbCBpdGVyYXRvclxuJiM0MzsgKiBAaXQ6IFRoZSBuZXcgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gaW5pdGlhbGl6ZVxuJiM0MzsgKlxuJiM0MzsgKiBJdGVyYXRlcyBldmVyeSB3b3JrZXJfcG9vbCBpbiB0aGUgc3lzdGVtICh3b3JrZXJfcG9vbF9pZHIpIGluIGFzY2VuZGluZ1xuJiM0MzsgKiBwb29sLWlkIG9yZGVyLlxuJiM0MzsgKiBUaGUgY2FsbGVyIHNob3VsZCBob2xkIFJDVSByZWFkIGxvY2suXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbiYjNDM7XG4mIzQzO1x0QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybikgXHUwMDNlXG4mIzQzO1x0XHQgICAgIHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wpKTtcbiYjNDM7XHRCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4pICE9XG4mIzQzO1x0XHQgICAgIF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCkpO1xuJiM0MztcbiYjNDM7XHRraXQtXHUwMDNlaWQgPSAwO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKipcbiYjNDM7ICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCgpIC0gR2V0IHRoZSBuZXh0IHdvcmtlcl9wb29sXG4mIzQzOyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtlcl9wb29sXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdCB3b3JrZXJfcG9vbCwgb3IgTlVMTCB3aGVuIGRvbmUuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKlxuJiM0MzticGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbiYjNDM7XHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XG4mIzQzO1xuJiM0MztcdC8qIGlkcl9nZXRfbmV4dCgpIGlzIFJDVS1zYWZlOyBzZWUgdGhlIGZvcl9lYWNoX3Bvb2woKSBsb2NrIGxlZ2VuZC4gKi9cbiYjNDM7XHRwb29sID0gaWRyX2dldF9uZXh0KFx1MDAyNndvcmtlcl9wb29sX2lkciwgXHUwMDI2a2l0LVx1MDAzZWlkKTtcbiYjNDM7XHRpZiAocG9vbClcbiYjNDM7XHRcdGtpdC1cdTAwM2VpZCYjNDM7JiM0Mzs7XHQvKiBhZHZhbmNlIHBhc3QgdGhpcyBwb29sIGZvciB0aGUgbmV4dCBjYWxsICovXG4mIzQzO1x0cmV0dXJuIHBvb2w7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KCkgLSBEZXN0cm95IGEgd29ya2VyX3Bvb2wgaXRlcmF0b3JcbiYjNDM7ICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gZGVzdHJveVxuJiM0MzsgKi9cbiYjNDM7X19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXG4mIzQzO3tcbiYjNDM7XHQvKiBOb3RoaW5nIHRvIGJlIGRvbmU7IFJDVSBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIuICovXG4mIzQzO31cbiYjNDM7XG4mIzQzO19fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG4mIzQzO1xuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcylcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcsIEtGX0lURVJfTkVXIHwgS0ZfUkNVX1BST1RFQ1RFRClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcsIEtGX0lURVJfTkVXIHwgS0ZfUkNVX1BST1RFQ1RFRClcbiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQsIEtGX0lURVJfTkVYVCB8IEtGX1JFVF9OVUxMKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKVxuJiM0MztCVEZfS0ZVTkNTX0VORCh3b3JrcXVldWVfaXRlcl9rZnVuY19pZHMpXG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgd29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0ID0ge1xuJiM0MztcdC5vd25lclx0PSBUSElTX01PRFVMRSxcbiYjNDM7XHQuc2V0XHQ9IFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIHNlcV9maWxlIGZvcm0gb2YgdGhlIHdvcmtxdWV1ZSBpdGVyYXRvci4gSXQgcmV1c2VzIHRoZSBvcGVuLWNvZGVkXG4mIzQzOyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KCkuXG4mIzQzOyAqXG4mIzQzOyAqIFNpbmNlIHRoZSBvcGVuLWNvZGVkIG5leHQoKSBpcyBLRl9SQ1VfUFJPVEVDVEVELCB0aGUgc2VxIHBhdGggc3VwcGxpZXNcbiYjNDM7ICogdGhlIFJDVSBzZWN0aW9uIGl0c2VsZi5cbiYjNDM7ICogc2VxX3N0YXJ0KCkgdGFrZXMgcmN1X3JlYWRfbG9jaygpIGFuZCBob2xkcyBpdCBhY3Jvc3MgdGhlIHdob2xlIHJlYWQgY2h1bmtcbiYjNDM7ICogKHN0YXJ0Li5zdG9wKS4gUG9zaXRpb24gaXMgcmUtZGVyaXZlZCBmcm9tICpwb3Mgb24gZWFjaCBzdGFydCwgc28gbm90aGluZ1xuJiM0MzsgKiBpcyBkZXJlZmVyZW5jZWQgYWNyb3NzIHRoZSByY3UgZ2FwIGJldHdlZW4gY2h1bmtzLiBUaGUgYXR0YWNoZWQgQlBGIHByb2dyYW1cbiYjNDM7ICogbXVzdCBiZSBub24tc2xlZXBhYmxlLlxuJiM0MzsgKi9cbiYjNDM7dW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiB7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSBpdDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4ga2l0O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUge1xuJiM0MztcdF9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTtcbiYjNDM7XHRfX2JwZl9tZF9wdHIoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKiwgd3EpO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKndvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpXG4mIzQzO3tcbiYjNDM7XHR1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2ICpwID0gc2VxLVx1MDAzZXByaXZhdGU7XG4mIzQzO1x0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxO1xuJiM0MztcdGxvZmZfdCBjbnQgPSAwO1xuJiM0MztcbiYjNDM7XHRyY3VfcmVhZF9sb2NrKCk7XHQvKiBoZWxkIHVudGlsIHNlcV9zdG9wKCkgKi9cbiYjNDM7XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh3cSwgXHUwMDI2d29ya3F1ZXVlcywgbGlzdCkge1xuJiM0MztcdFx0aWYgKGNudCA9PSAqcG9zKSB7XG4mIzQzO1x0XHRcdHAtXHUwMDNla2l0LnBvcyA9IHdxO1xuJiM0MztcdFx0XHRyZXR1cm4gd3E7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRjbnQmIzQzOyYjNDM7O1xuJiM0MztcdH1cbiYjNDM7XHRwLVx1MDAzZWtpdC5wb3MgPSBOVUxMO1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqd29ya3F1ZXVlX2l0ZXJfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuJiM0Mzt7XG4mIzQzO1x0dW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiAqcCA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuJiM0MztcbiYjNDM7XHQmIzQzOyYjNDM7KnBvcztcbiYjNDM7XHRyZXR1cm4gYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoXHUwMDI2cC1cdTAwM2VpdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd29ya3F1ZXVlX2l0ZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSBjdHg7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4mIzQzO1xuJiM0MztcdG1ldGEuc2VxID0gc2VxO1xuJiM0MztcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcdTAwMjZtZXRhLCBmYWxzZSk7XG4mIzQzO1x0aWYgKCFwcm9nKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuJiM0MztcdGN0eC53cSA9IHY7XG4mIzQzO1x0cmV0dXJuIGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUgY3R4O1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuJiM0MztcbiYjNDM7XHRpZiAoIXYpIHtcbiYjNDM7XHRcdG1ldGEuc2VxID0gc2VxO1xuJiM0MztcdFx0cHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKFx1MDAyNm1ldGEsIHRydWUpO1xuJiM0MztcdFx0aWYgKHByb2cpIHtcbiYjNDM7XHRcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuJiM0MztcdFx0XHRjdHgud3EgPSBOVUxMO1xuJiM0MztcdFx0XHRicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcdTAwMjZjdHgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcdC8qIHBhaXJlZCB3aXRoIHNlcV9zdGFydCgpICovXG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd29ya3F1ZXVlX2l0ZXJfc2VxX29wcyA9IHtcbiYjNDM7XHQuc3RhcnRcdD0gd29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0LFxuJiM0MztcdC5uZXh0XHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0LFxuJiM0MztcdC5zdG9wXHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wLFxuJiM0MztcdC5zaG93XHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93LFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcbiYjNDM7XHRcdCAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3b3JrcXVldWVfaXRlcl9zZXFfaW5mbyA9IHtcbiYjNDM7XHQuc2VxX29wc1x0PSBcdTAwMjZ3b3JrcXVldWVfaXRlcl9zZXFfb3BzLFxuJiM0MztcdC5zZXFfcHJpdl9zaXplXHQ9IHNpemVvZih1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2KSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO0JURl9JRF9MSVNUX1NJTkdMRSh3b3JrcXVldWVfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtxdWV1ZV9zdHJ1Y3QpXG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3b3JrcXVldWVfaXRlcl9yZWdfaW5mbyA9IHtcbiYjNDM7XHQudGFyZ2V0XHRcdFx0PSBcJiMzNDt3b3JrcXVldWVcJiMzNDssXG4mIzQzO1x0LmN0eF9hcmdfaW5mb19zaXplXHQ9IDEsXG4mIzQzO1x0LmN0eF9hcmdfaW5mb1x0XHQ9IHtcbiYjNDM7XHRcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUsIHdxKSxcbiYjNDM7XHRcdCAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSxcbiYjNDM7XHR9LFxuJiM0MztcdC5zZXFfaW5mb1x0XHQ9IFx1MDAyNndvcmtxdWV1ZV9pdGVyX3NlcV9pbmZvLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogc2VxX2ZpbGUgZm9ybSBvZiB0aGUgd29ya2VyX3Bvb2wgaXRlcmF0b3I7IHNhbWUgUkNVLXBlci1jaHVuayBzY2hlbWUgYXMgdGhlXG4mIzQzOyAqIHdvcmtxdWV1ZSBvbmUsIHJldXNpbmcgdGhlIG9wZW4tY29kZWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCgpLlxuJiM0MzsgKi9cbiYjNDM7dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2IHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgaXQ7XG4mIzQzO1x0c3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4ga2l0O1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCB7XG4mIzQzO1x0X19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpO1xuJiM0MztcdF9fYnBmX21kX3B0cihzdHJ1Y3Qgd29ya2VyX3Bvb2wgKiwgcG9vbCk7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxuJiM0Mzt7XG4mIzQzO1x0dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2ICpwID0gc2VxLVx1MDAzZXByaXZhdGU7XG4mIzQzO1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuJiM0MztcdGxvZmZfdCBjbnQgPSAwO1xuJiM0MztcdGludCBpZCA9IDA7XG4mIzQzO1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHR3aGlsZSAoKHBvb2wgPSBpZHJfZ2V0X25leHQoXHUwMDI2d29ya2VyX3Bvb2xfaWRyLCBcdTAwMjZpZCkpKSB7XG4mIzQzO1x0XHRpZiAoY250ID09ICpwb3MpIHtcbiYjNDM7XHRcdFx0cC1cdTAwM2VraXQuaWQgPSBpZCAmIzQzOyAxO1xuJiM0MztcdFx0XHRyZXR1cm4gcG9vbDtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGNudCYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZCYjNDM7JiM0Mzs7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXG4mIzQzO3tcbiYjNDM7XHR1bmlvbiB3b3JrZXJfcG9vbF9pdGVyX3ByaXYgKnAgPSBzZXEtXHUwMDNlcHJpdmF0ZTtcbiYjNDM7XG4mIzQzO1x0JiM0MzsmIzQzOypwb3M7XG4mIzQzO1x0cmV0dXJuIGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoXHUwMDI2cC1cdTAwM2VpdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgd29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9fd29ya2VyX3Bvb2wgY3R4O1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuJiM0MztcbiYjNDM7XHRtZXRhLnNlcSA9IHNlcTtcbiYjNDM7XHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgZmFsc2UpO1xuJiM0MztcdGlmICghcHJvZylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbiYjNDM7XHRjdHgucG9vbCA9IHY7XG4mIzQzO1x0cmV0dXJuIGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIGN0eDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhO1xuJiM0MztcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcbiYjNDM7XG4mIzQzO1x0aWYgKCF2KSB7XG4mIzQzO1x0XHRtZXRhLnNlcSA9IHNlcTtcbiYjNDM7XHRcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcdTAwMjZtZXRhLCB0cnVlKTtcbiYjNDM7XHRcdGlmIChwcm9nKSB7XG4mIzQzO1x0XHRcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbiYjNDM7XHRcdFx0Y3R4LnBvb2wgPSBOVUxMO1xuJiM0MztcdFx0XHRicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcdTAwMjZjdHgpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3b3JrZXJfcG9vbF9pdGVyX3NlcV9vcHMgPSB7XG4mIzQzO1x0LnN0YXJ0XHQ9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0LFxuJiM0MztcdC5uZXh0XHQ9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQsXG4mIzQzO1x0LnN0b3BcdD0gd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcCxcbiYjNDM7XHQuc2hvd1x0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93LFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya2VyX3Bvb2wsIHN0cnVjdCBicGZfaXRlcl9tZXRhICptZXRhLFxuJiM0MztcdFx0ICAgICBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wpXG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIHdvcmtlcl9wb29sX2l0ZXJfc2VxX2luZm8gPSB7XG4mIzQzO1x0LnNlcV9vcHNcdD0gXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9zZXFfb3BzLFxuJiM0MztcdC5zZXFfcHJpdl9zaXplXHQ9IHNpemVvZih1bmlvbiB3b3JrZXJfcG9vbF9pdGVyX3ByaXYpLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7QlRGX0lEX0xJU1RfU0lOR0xFKHdvcmtlcl9wb29sX2J0Zl9pZCwgc3RydWN0LCB3b3JrZXJfcG9vbClcbiYjNDM7XG4mIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2l0ZXJfcmVnIHdvcmtlcl9wb29sX2l0ZXJfcmVnX2luZm8gPSB7XG4mIzQzO1x0LnRhcmdldFx0XHRcdD0gXCYjMzQ7d29ya2VyX3Bvb2xcJiMzNDssXG4mIzQzO1x0LmN0eF9hcmdfaW5mb19zaXplXHQ9IDEsXG4mIzQzO1x0LmN0eF9hcmdfaW5mb1x0XHQ9IHtcbiYjNDM7XHRcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCwgcG9vbCksXG4mIzQzO1x0XHQgIFBUUl9UT19CVEZfSURfT1JfTlVMTCB8IFBUUl9UUlVTVEVEIH0sXG4mIzQzO1x0fSxcbiYjNDM7XHQuc2VxX2luZm9cdFx0PSBcdTAwMjZ3b3JrZXJfcG9vbF9pdGVyX3NlcV9pbmZvLFxuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogc2VxLWZpbGUgQlBGIGl0ZXJhdG9yIG92ZXIgdGhlIHBlbmRpbmcgd29yayBpdGVtcyBvZiBldmVyeSB3b3JrZXJfcG9vbC5cbiYjNDM7ICpcbiYjNDM7ICogcG9vbC1cdTAwM2V3b3JrbGlzdCBpcyBwcm90ZWN0ZWQgYnkgcG9vbC1cdTAwM2Vsb2NrIGFuZCB3b3JrX3N0cnVjdCBoYXMgbmVpdGhlciBhXG4mIzQzOyAqIHJlZmNvdW50IG5vciBSQ1UtZnJlZWluZywgc28gYSBwZW5kaW5nIHdvcmsgY2Fubm90IGJlIGhhbmRlZCB0byBhIHN1c3BlbmRlZFxuJiM0MzsgKiAob3Blbi1jb2RlZCkgaXRlcmF0b3Igc2FmZWx5LlxuJiM0MzsgKiBJbnN0ZWFkLCBmb3IgZWFjaCBwb29sIGEgYm91bmRlZCBzbmFwc2hvdCBvZiBpdHMgcGVuZGluZyB3b3JrcyBpcyBjb3BpZWQgb3V0XG4mIzQzOyAqIHdoaWxlIHBvb2wtXHUwMDNlbG9jayBpcyBoZWxkLCBtaXJyb3JpbmcgdGhlIHByaW50a19kZWZlcnJlZCBzZWN0aW9uIG9mXG4mIzQzOyAqIHNob3dfb25lX3dvcmtlcl9wb29sKCkgYW5kIHRoZW4gdGhlIGxvY2sgaXMgZHJvcHBlZC5cbiYjNDM7ICogVGhlIEJQRiBwcm9ncmFtIHRoZW4gcnVucyBvdmVyIHRoZSBzdGFibGUgc25hcHNob3Qgd2l0aCBubyBsb2NrIGhlbGQuXG4mIzQzOyAqXG4mIzQzOyAqIFBvb2xzIGFyZSB2aXNpdGVkIGluIHdvcmtlcl9wb29sX2lkciBvcmRlciAoYSBzdGFibGUgcmVzdW1lIGtleSk7IGVhY2ggcG9vbCYjMzk7c1xuJiM0MzsgKiBzbmFwc2hvdCBsaXZlcyBpbiB0aGUgcGVyc2lzdGVudCBzZXFfcHJpdmF0ZSwgc28gdGhlIHdhbGsgcmVzdW1lcyBjb3JyZWN0bHlcbiYjNDM7ICogYWNyb3NzIHJlYWQoKSBjaHVua3MuIEEgcG9vbCB3aXRoIG1vcmUgdGhhbiBXUV9QRU5ESU5HX1NOQVBfTUFYIHBlbmRpbmcgd29ya3NcbiYjNDM7ICogaXMgdHJ1bmNhdGVkIChiZXN0LWVmZm9ydCwgbGlrZSB0aGUga2VybmVsJiMzOTtzIG93biB3b3JrbGlzdCBkdW1wKS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgV1FfUEVORElOR19TTkFQX01BWCAxMjhcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE9uZSBwcm9qZWN0ZWQgcGVuZGluZyB3b3JrIGl0ZW0sIGFzIHNlZW4gYnkgdGhlIEJQRiBwcm9ncmFtLiBBZGRyZXNzZXMgb25seVxuJiM0MzsgKiAtLSB0aGUgbGl2ZSB3b3JrX3N0cnVjdCBpcyBub3QgZXhwb3NlZCAoaXQgbWF5IGJlIGZyZWVkIGFmdGVyIHRoZSBsb2NrKS5cbiYjNDM7ICovXG4mIzQzO3N0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyB7XG4mIzQzO1x0X191NjQgcG9vbF9pZDtcbiYjNDM7XHRfX3U2NCB3b3JrO1xuJiM0MztcdF9fdTY0IGZ1bmM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYge1xuJiM0MztcdGludCAgICAgICAgICBuZXh0X3Bvb2w7XHQvKiB3b3JrZXJfcG9vbF9pZHIgY3Vyc29yIGZvciB0aGUgbmV4dCBmaWxsICovXG4mIzQzO1x0dW5zaWduZWQgaW50IGlkeDtcdC8qIHBvc2l0aW9uIHdpdGhpbiBzbmFwW10gICAgICAgICAgICAgICAgICAgKi9cbiYjNDM7XHR1bnNpZ25lZCBpbnQgY291bnQ7XHQvKiB2YWxpZCBlbnRyaWVzIGluIHNuYXBbXSAgICAgICAgICAgICAgICAgICovXG4mIzQzO1x0c3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvIHNuYXBbV1FfUEVORElOR19TTkFQX01BWF07XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsge1xuJiM0MztcdF9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTtcbiYjNDM7XHRfX2JwZl9tZF9wdHIoc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICosIGluZm8pO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU25hcHNob3QgdGhlIG5leHQgbm9uLWVtcHR5IHBvb2wmIzM5O3MgcGVuZGluZyB3b3JrcyBpbnRvIHByaXYtXHUwMDNlc25hcFtdLCBhZHZhbmNpbmdcbiYjNDM7ICogcHJpdi1cdTAwM2VuZXh0X3Bvb2wgcGFzdCBpdC4gUmV0dXJucyB0cnVlIGlmIGEgcG9vbCB3YXMgY2FwdHVyZWQsIGZhbHNlIGF0IGVuZC5cbiYjNDM7ICogcG9vbC1cdTAwM2Vsb2NrIGlzIGhlbGQgb25seSBmb3IgdGhlIGZpZWxkIGNvcHk7IFJDVSBrZWVwcyBlYWNoIHBvb2wgYWxpdmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCB3cV9wZW5kaW5nX2ZpbGwoc3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuJiM0MztcdHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaztcbiYjNDM7XHRpbnQgaWQ7XG4mIzQzO1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRmb3IgKGlkID0gcHJpdi1cdTAwM2VuZXh0X3Bvb2w7IChwb29sID0gaWRyX2dldF9uZXh0KFx1MDAyNndvcmtlcl9wb29sX2lkciwgXHUwMDI2aWQpKTsgaWQmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgbiA9IDA7XG4mIzQzO1xuJiM0MztcdFx0cmF3X3NwaW5fbG9ja19pcnEoXHUwMDI2cG9vbC1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRcdGxpc3RfZm9yX2VhY2hfZW50cnkod29yaywgXHUwMDI2cG9vbC1cdTAwM2V3b3JrbGlzdCwgZW50cnkpIHtcbiYjNDM7XHRcdFx0aWYgKG4gXHUwMDNlPSBXUV9QRU5ESU5HX1NOQVBfTUFYKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcdFx0XHRwcml2LVx1MDAzZXNuYXBbbl0ucG9vbF9pZCA9IHBvb2wtXHUwMDNlaWQ7XG4mIzQzO1x0XHRcdHByaXYtXHUwMDNlc25hcFtuXS53b3JrID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXdvcms7XG4mIzQzO1x0XHRcdHByaXYtXHUwMDNlc25hcFtuXS5mdW5jID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXdvcmstXHUwMDNlZnVuYztcbiYjNDM7XHRcdFx0biYjNDM7JiM0Mzs7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRyYXdfc3Bpbl91bmxvY2tfaXJxKFx1MDAyNnBvb2wtXHUwMDNlbG9jayk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKG4pIHtcbiYjNDM7XHRcdFx0cHJpdi1cdTAwM2Vjb3VudCA9IG47XG4mIzQzO1x0XHRcdHByaXYtXHUwMDNlaWR4ID0gMDtcbiYjNDM7XHRcdFx0cHJpdi1cdTAwM2VuZXh0X3Bvb2wgPSBpZCAmIzQzOyAxO1xuJiM0MztcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbiYjNDM7XHRcdFx0cmV0dXJuIHRydWU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKndxX3BlbmRpbmdfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcylcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiAqcHJpdiA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuJiM0MztcbiYjNDM7XHRpZiAoKnBvcyA9PSAwKSB7XG4mIzQzO1x0XHRwcml2LVx1MDAzZW5leHRfcG9vbCA9IDA7XG4mIzQzO1x0XHRwcml2LVx1MDAzZWlkeCA9IDA7XG4mIzQzO1x0XHRwcml2LVx1MDAzZWNvdW50ID0gMDtcbiYjNDM7XHR9XG4mIzQzO1x0d2hpbGUgKHByaXYtXHUwMDNlaWR4IFx1MDAzZT0gcHJpdi1cdTAwM2Vjb3VudCkge1xuJiM0MztcdFx0aWYgKCF3cV9wZW5kaW5nX2ZpbGwocHJpdikpXG4mIzQzO1x0XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gXHUwMDI2cHJpdi1cdTAwM2VzbmFwW3ByaXYtXHUwMDNlaWR4XTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKndxX3BlbmRpbmdfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2ID0gc2VxLVx1MDAzZXByaXZhdGU7XG4mIzQzO1xuJiM0MztcdCYjNDM7JiM0MzsqcG9zO1xuJiM0MztcdHByaXYtXHUwMDNlaWR4JiM0MzsmIzQzOztcbiYjNDM7XHR3aGlsZSAocHJpdi1cdTAwM2VpZHggXHUwMDNlPSBwcml2LVx1MDAzZWNvdW50KSB7XG4mIzQzO1x0XHRpZiAoIXdxX3BlbmRpbmdfZmlsbChwcml2KSlcbiYjNDM7XHRcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiBcdTAwMjZwcml2LVx1MDAzZXNuYXBbcHJpdi1cdTAwM2VpZHhdO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdxX3BlbmRpbmdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsgY3R4O1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuJiM0MztcbiYjNDM7XHRtZXRhLnNlcSA9IHNlcTtcbiYjNDM7XHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgZmFsc2UpO1xuJiM0MztcdGlmICghcHJvZylcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbiYjNDM7XHRjdHguaW5mbyA9IHY7XG4mIzQzO1x0cmV0dXJuIGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHdxX3BlbmRpbmdfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsgY3R4O1xuJiM0MztcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4mIzQzO1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuJiM0MztcbiYjNDM7XHRpZiAodilcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHRtZXRhLnNlcSA9IHNlcTtcbiYjNDM7XHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgdHJ1ZSk7XG4mIzQzO1x0aWYgKHByb2cpIHtcbiYjNDM7XHRcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbiYjNDM7XHRcdGN0eC5pbmZvID0gTlVMTDtcbiYjNDM7XHRcdGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdxX3BlbmRpbmdfc2VxX29wcyA9IHtcbiYjNDM7XHQuc3RhcnRcdD0gd3FfcGVuZGluZ19zZXFfc3RhcnQsXG4mIzQzO1x0Lm5leHRcdD0gd3FfcGVuZGluZ19zZXFfbmV4dCxcbiYjNDM7XHQuc3RvcFx0PSB3cV9wZW5kaW5nX3NlcV9zdG9wLFxuJiM0MztcdC5zaG93XHQ9IHdxX3BlbmRpbmdfc2VxX3Nob3csXG4mIzQzO307XG4mIzQzO1xuJiM0MztERUZJTkVfQlBGX0lURVJfRlVOQyh3b3JrcXVldWVfcGVuZGluZ193b3JrLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcbiYjNDM7XHRcdCAgICAgc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvKVxuJiM0MztcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3cV9wZW5kaW5nX3NlcV9pbmZvID0ge1xuJiM0MztcdC5zZXFfb3BzXHQ9IFx1MDAyNndxX3BlbmRpbmdfc2VxX29wcyxcbiYjNDM7XHQuc2VxX3ByaXZfc2l6ZVx0PSBzaXplb2Yoc3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2KSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO0JURl9JRF9MSVNUX1NJTkdMRSh3cV9wZW5kaW5nX3dvcmtfaW5mb19idGZfaWQsIHN0cnVjdCwgd3FfcGVuZGluZ193b3JrX2luZm8pXG4mIzQzO1xuJiM0MztzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3cV9wZW5kaW5nX3JlZ19pbmZvID0ge1xuJiM0MztcdC50YXJnZXRcdFx0XHQ9IFwmIzM0O3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmtcJiMzNDssXG4mIzQzO1x0LmZlYXR1cmVcdFx0PSBCUEZfSVRFUl9SRVNDSEVELFxuJiM0MztcdC5jdHhfYXJnX2luZm9fc2l6ZVx0PSAxLFxuJiM0MztcdC5jdHhfYXJnX2luZm9cdFx0PSB7XG4mIzQzO1x0XHR7IG9mZnNldG9mKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yaywgaW5mbyksXG4mIzQzO1x0XHQgIFBUUl9UT19CVEZfSURfT1JfTlVMTCB9LFxuJiM0MztcdH0sXG4mIzQzO1x0LnNlcV9pbmZvXHRcdD0gXHUwMDI2d3FfcGVuZGluZ19zZXFfaW5mbyxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl93b3JrcXVldWVfaXRlcl9pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORyxcbiYjNDM7XHRcdFx0XHRcdFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZ3b3JrcXVldWVfaXRlcl9rZnVuY19zZXQpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHR3b3JrcXVldWVfaXRlcl9yZWdfaW5mby5jdHhfYXJnX2luZm9bMF0uYnRmX2lkID0gd29ya3F1ZXVlX2J0Zl9pZFswXTtcbiYjNDM7XHRyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KFx1MDAyNndvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0d29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mby5jdHhfYXJnX2luZm9bMF0uYnRmX2lkID0gd29ya2VyX3Bvb2xfYnRmX2lkWzBdO1xuJiM0MztcdHJldCA9IGJwZl9pdGVyX3JlZ190YXJnZXQoXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mbyk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHdxX3BlbmRpbmdfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdxX3BlbmRpbmdfd29ya19pbmZvX2J0Zl9pZFswXTtcbiYjNDM7XHRyZXR1cm4gYnBmX2l0ZXJfcmVnX3RhcmdldChcdTAwMjZ3cV9wZW5kaW5nX3JlZ19pbmZvKTtcbiYjNDM7fVxuJiM0MztsYXRlX2luaXRjYWxsKGJwZl93b3JrcXVldWVfaXRlcl9pbml0KTtcbiYjNDM7XG4mIzQzOyNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaFxuaW5kZXggNjdmZjc4ODIyOTllYy4uNmRhOTNjNDg2NjUwOSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbkBAIC0zNjEsNiAmIzQzOzM2MSwxNiBAQCBleHRlcm4gaW50IGJwZl9pdGVyX2RtYWJ1Zl9uZXcoc3RydWN0IGJwZl9pdGVyX2RtYWJ1ZiAqaXQpIF9fd2VhayBfX2tzeW07XG4gZXh0ZXJuIHN0cnVjdCBkbWFfYnVmICpicGZfaXRlcl9kbWFidWZfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcbiBleHRlcm4gdm9pZCBicGZfaXRlcl9kbWFidWZfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcbiBcbiYjNDM7c3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZTtcbiYjNDM7ZXh0ZXJuIGludCBicGZfaXRlcl93b3JrcXVldWVfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KSBfX3dlYWsgX19rc3ltO1xuJiM0MztleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KSBfX3dlYWsgX19rc3ltO1xuJiM0MztleHRlcm4gdm9pZCBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbDtcbiYjNDM7ZXh0ZXJuIGludCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkgX193ZWFrIF9fa3N5bTtcbiYjNDM7ZXh0ZXJuIHN0cnVjdCB3b3JrZXJfcG9vbCAqYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KSBfX3dlYWsgX19rc3ltO1xuJiM0MztleHRlcm4gdm9pZCBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpIF9fd2VhayBfX2tzeW07XG4mIzQzO1xuIGV4dGVybiBpbnQgYnBmX2Nncm91cF9yZWFkX3hhdHRyKHN0cnVjdCBjZ3JvdXAgKmNncm91cCwgY29uc3QgY2hhciAqbmFtZV9fc3RyLFxuIFx0XHRcdFx0IHN0cnVjdCBicGZfZHlucHRyICp2YWx1ZV9wKSBfX3dlYWsgX19rc3ltO1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjczMzgzYzI2M2JlZThcbi0tLSAvZGV2L251bGxcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuY1xuQEAgLTAsMCAmIzQzOzEsODAgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGVzdF9wcm9ncy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFwmIzM0O3dxX2l0ZXIuc2tlbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3dxX2l0ZXJfZmFpbC5za2VsLmhcJiMzNDtcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHN1YnRlc3Rfb3Blbl9jb2RlZChzdHJ1Y3Qgd3FfaXRlciAqc2tlbClcbiYjNDM7e1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzKTtcbiYjNDM7XHRpbnQgZXJyO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLmNvdW50X3dvcmtxdWV1ZXMpLFxuJiM0MztcdFx0XHRcdCAgICAgXHUwMDI2b3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtydW4gY291bnRfd29ya3F1ZXVlc1wmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0LyogVGhlcmUgYXJlIGFsd2F5cyBzZXZlcmFsIHN5c3RlbSB3b3JrcXVldWVzIChldmVudHMsIC4uLikuICovXG4mIzQzO1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3dvcmtxdWV1ZXMsIDAsIFwmIzM0O25yX3dvcmtxdWV1ZXNcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLmNvdW50X3dvcmtlcl9wb29scyksXG4mIzQzO1x0XHRcdFx0ICAgICBcdTAwMjZvcHRzKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3J1biBjb3VudF93b3JrZXJfcG9vbHNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdC8qIEF0IGxlYXN0IHRoZSBwZXItQ1BVIG5vcm1hbC9oaWdocHJpIHBvb2xzIGV4aXN0LiAqL1xuJiM0MztcdEFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2Vucl93b3JrZXJfcG9vbHMsIDAsIFwmIzM0O25yX3dvcmtlcl9wb29sc1wmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3BlcmNwdV9wb29scywgMCwgXCYjMzQ7bnJfcGVyY3B1X3Bvb2xzXCYjMzQ7KTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgZHJhaW5faXRlcihzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2csIGNvbnN0IGNoYXIgKm5hbWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbms7XG4mIzQzO1x0Y2hhciBidWZbNTEyXTtcbiYjNDM7XHRpbnQgaXRlcl9mZDtcbiYjNDM7XHRzc2l6ZV90IG47XG4mIzQzO1xuJiM0MztcdGxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIocHJvZywgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIG5hbWUpKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGl0ZXJfZmQgPSBicGZfaXRlcl9jcmVhdGUoYnBmX2xpbmtfX2ZkKGxpbmspKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShpdGVyX2ZkLCAwLCBcJiMzNDtpdGVyX2NyZWF0ZVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHR3aGlsZSAoKG4gPSByZWFkKGl0ZXJfZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSBcdTAwM2UgMClcbiYjNDM7XHRcdDtcbiYjNDM7XHRBU1NFUlRfR0UobiwgMCwgXCYjMzQ7cmVhZCBpdGVyXCYjMzQ7KTtcbiYjNDM7XHRjbG9zZShpdGVyX2ZkKTtcbiYjNDM7b3V0OlxuJiM0MztcdGJwZl9saW5rX19kZXN0cm95KGxpbmspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCBzdWJ0ZXN0X3NlcShzdHJ1Y3Qgd3FfaXRlciAqc2tlbClcbiYjNDM7e1xuJiM0MztcdC8qIHNlcSBmb3JtcyBhcmUgYmFja2VkIGJ5IHRoZSBzYW1lIG9wZW4tY29kZWQgbmV4dCgpLiAqL1xuJiM0MztcdGRyYWluX2l0ZXIoc2tlbC1cdTAwM2Vwcm9ncy5kdW1wX3dvcmtxdWV1ZXMsIFwmIzM0O2F0dGFjaCB3b3JrcXVldWUgaXRlclwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3dxX3NlcSwgMCwgXCYjMzQ7bnJfd3Ffc2VxXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZHJhaW5faXRlcihza2VsLVx1MDAzZXByb2dzLmR1bXBfd29ya2VyX3Bvb2xzLCBcJiMzNDthdHRhY2ggd29ya2VyX3Bvb2wgaXRlclwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3Bvb2xfc2VxLCAwLCBcJiMzNDtucl9wb29sX3NlcVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogd29ya2xpc3RzIGFyZSB1c3VhbGx5IGVtcHR5IG9uIGFuIGlkbGUgc3lzdGVtOyB0aGlzIGRyaXZlcyB0aGUgd2hvbGVcbiYjNDM7XHQgKiBwZXItcG9vbCBzbmFwc2hvdCBwYXRoIGFuZCB2ZXJpZmllcyBpdCBkcmFpbnMgY2xlYW5seS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRkcmFpbl9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuZHVtcF9wZW5kaW5nLCBcJiMzNDthdHRhY2ggcGVuZGluZ193b3JrIGl0ZXJcJiMzNDspO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3Rfd3FfaXRlcih2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2l0ZXIgKnNrZWw7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSB3cV9pdGVyX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O3dxX2l0ZXJfX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtvcGVuX2NvZGVkXCYjMzQ7KSlcbiYjNDM7XHRcdHN1YnRlc3Rfb3Blbl9jb2RlZChza2VsKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzZXFcJiMzNDspKVxuJiM0MztcdFx0c3VidGVzdF9zZXEoc2tlbCk7XG4mIzQzO1xuJiM0MztcdHdxX2l0ZXJfX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1xuJiM0MztcdFJVTl9URVNUUyh3cV9pdGVyX2ZhaWwpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy93cV9pdGVyLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi4xNWYwODFiYzYzNGI2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlci5jXG5AQCAtMCwwICYjNDM7MSw5NSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bWxpbnV4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiM0MztcbiYjNDM7dm9pZCBicGZfcmN1X3JlYWRfbG9jayh2b2lkKSBfX2tzeW07XG4mIzQzO3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07XG4mIzQzO1xuJiM0MzsvKiBSZXN1bHRzLCBjaGVja2VkIGJ5IHVzZXJzcGFjZS4gKi9cbiYjNDM7aW50IG5yX3dvcmtxdWV1ZXM7XG4mIzQzO2ludCBucl93b3JrZXJfcG9vbHM7XG4mIzQzO2ludCBucl9wZXJjcHVfcG9vbHM7XG4mIzQzO2ludCBucl93cV9zZXE7XG4mIzQzO2ludCBucl9wb29sX3NlcTtcbiYjNDM7aW50IG5yX3BlbmRpbmc7XG4mIzQzO1xuJiM0MzsvKiAtLS0gb3Blbi1jb2RlZCBpdGVyYXRvcnMgKEtGX1JDVV9QUk9URUNURUQpIC0tLSAqL1xuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCBjb3VudF93b3JrcXVldWVzKGNvbnN0IHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcbiYjNDM7XHRpbnQgbiA9IDA7XG4mIzQzO1xuJiM0MztcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XG4mIzQzO1x0YnBmX2Zvcl9lYWNoKHdvcmtxdWV1ZSwgd3EpXG4mIzQzO1x0XHRuJiM0MzsmIzQzOztcbiYjNDM7XHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1xuJiM0MztcdG5yX3dvcmtxdWV1ZXMgPSBuO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7c3lzY2FsbFwmIzM0OylcbiYjNDM7aW50IGNvdW50X3dvcmtlcl9wb29scyhjb25zdCB2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XG4mIzQzO1x0aW50IG4gPSAwLCBwZXJjcHUgPSAwO1xuJiM0MztcbiYjNDM7XHRicGZfcmN1X3JlYWRfbG9jaygpO1xuJiM0MztcdGJwZl9mb3JfZWFjaCh3b3JrZXJfcG9vbCwgcG9vbCkge1xuJiM0MztcdFx0biYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRpZiAocG9vbC1cdTAwM2VjcHUgXHUwMDNlPSAwKVx0XHQvKiBwZXItQ1BVIHBvb2wgKi9cbiYjNDM7XHRcdFx0cGVyY3B1JiM0MzsmIzQzOztcbiYjNDM7XHR9XG4mIzQzO1x0YnBmX3JjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcbiYjNDM7XHRucl93b3JrZXJfcG9vbHMgPSBuO1xuJiM0MztcdG5yX3BlcmNwdV9wb29scyA9IHBlcmNwdTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogLS0tIHNlcV9maWxlIGl0ZXJhdG9ycyAtLS0gKi9cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtpdGVyL3dvcmtxdWV1ZVwmIzM0OylcbiYjNDM7aW50IGR1bXBfd29ya3F1ZXVlcyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtXHUwMDNlbWV0YS1cdTAwM2VzZXE7XG4mIzQzO1x0c3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxID0gY3R4LVx1MDAzZXdxO1xuJiM0MztcbiYjNDM7XHRpZiAoIXdxKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0bnJfd3Ffc2VxJiM0MzsmIzQzOztcbiYjNDM7XHRCUEZfU0VRX1BSSU5URihzZXEsIFwmIzM0OyVzXFxuXCYjMzQ7LCB3cS1cdTAwM2VuYW1lKTtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O2l0ZXIvd29ya2VyX3Bvb2xcJiMzNDspXG4mIzQzO2ludCBkdW1wX3dvcmtlcl9wb29scyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wgPSBjdHgtXHUwMDNlcG9vbDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFwb29sKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0bnJfcG9vbF9zZXEmIzQzOyYjNDM7O1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7aXRlci93b3JrcXVldWVfcGVuZGluZ193b3JrXCYjMzQ7KVxuJiM0MztpbnQgZHVtcF9wZW5kaW5nKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtXHUwMDNlbWV0YS1cdTAwM2VzZXE7XG4mIzQzO1x0c3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvID0gY3R4LVx1MDAzZWluZm87XG4mIzQzO1xuJiM0MztcdGlmICghaW5mbylcdFx0XHQvKiBmaW5hbCBjYWxsICovXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0bnJfcGVuZGluZyYjNDM7JiM0Mzs7XG4mIzQzO1x0QlBGX1NFUV9QUklOVEYoc2VxLCBcJiMzNDtwb29sICVsbHUgd29yayAweCVsbHggZnVuYyAweCVsbHhcXG5cJiMzNDssXG4mIzQzO1x0XHQgICAgICAgaW5mby1cdTAwM2Vwb29sX2lkLCBpbmZvLVx1MDAzZXdvcmssIGluZm8tXHUwMDNlZnVuYyk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mYjJkY2Y5ODQ3ZTJiXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcbkBAIC0wLDAgJiM0MzsxLDM3IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfbWlzYy5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O2JwZl9leHBlcmltZW50YWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQyhcJiMzNDtsaWNlbnNlXCYjMzQ7KSA9IFwmIzM0O0dQTFwmIzM0OztcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRoZSB3b3JrcXVldWUgYW5kIHdvcmtlcl9wb29sIG9wZW4tY29kZWQgaXRlcmF0b3JzIGFyZSBLRl9SQ1VfUFJPVEVDVEVEOlxuJiM0MzsgKiB1c2luZyB0aGVtIG91dHNpZGUgYSBicGZfcmN1X3JlYWRfbG9jaygpIHJlZ2lvbiBtdXN0IGJlIHJlamVjdGVkLlxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDs/c3lzY2FsbFwmIzM0OylcbiYjNDM7X19mYWlsdXJlIF9fbXNnKFwmIzM0O2tlcm5lbCBmdW5jIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblwmIzM0OylcbiYjNDM7aW50IHdvcmtxdWV1ZV9pdGVyX25vX3JjdShjb25zdCB2b2lkICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7XG4mIzQzO1x0aW50IG4gPSAwO1xuJiM0MztcbiYjNDM7XHRicGZfZm9yX2VhY2god29ya3F1ZXVlLCB3cSlcbiYjNDM7XHRcdG4mIzQzOyYjNDM7O1xuJiM0MztcdHJldHVybiBuO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztTRUMoXCYjMzQ7P3N5c2NhbGxcJiMzNDspXG4mIzQzO19fZmFpbHVyZSBfX21zZyhcJiMzNDtrZXJuZWwgZnVuYyBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblwmIzM0OylcbiYjNDM7aW50IHdvcmtlcl9wb29sX2l0ZXJfbm9fcmN1KGNvbnN0IHZvaWQgKmN0eClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbDtcbiYjNDM7XHRpbnQgbiA9IDA7XG4mIzQzO1xuJiM0MztcdGJwZl9mb3JfZWFjaCh3b3JrZXJfcG9vbCwgcG9vbClcbiYjNDM7XHRcdG4mIzQzOyYjNDM7O1xuJiM0MztcdHJldHVybiBuO1xuJiM0Mzt9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDQ6MDE8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+YmVzdC1leHBlbnNpdmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2l0ZXJfd29ya3F1ZXVlX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfbmV4dCYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfZGVzdHJveSYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc2hvdyYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc3RvcCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0JiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3cmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX2ZpbGwmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfc3RhcnQmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9zaG93JiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX3N0b3AmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgotIENvZGUgaW4gdmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoLCBTbWFydE5JQywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpCiAgdGhhdCBhcmUgZXhlY3V0ZWQgb25seSBkdXJpbmcgUENJIGhvdC11bnBsdWcgb3Igc3lzZnMgZHJpdmVyIHVuYmluZCBvcGVyYXRpb25zLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zCiAgICh3aGljaCBhcmUgaW5saW5lZCBieSB0aGUgY29tcGlsZXIgYW5kIGRvIG5vdCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMpLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBBbHNvIGNoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncwogICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3MKICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTY5MzM2ZDY5YTllYzMwMTMzNzljMjMwZjJmODRhMGJkMDgwYzZjZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBXZWQgSnVsIDI5IDA0OjAxOjM0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IDc4MDY4YWU4ZjI4YTYuLjZlODc5NDkwYzgxMWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTU2LDYgJiM0Mzs1Niw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgva3ZtX3BhcmEuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9kZWxheS5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2lycV93b3JrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J0Zl9pZHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKICNpbmNsdWRlICYjMzQ7d29ya3F1ZXVlX2ludGVybmFsLmgmIzM0OwogCkBAIC04NDczLDMgJiM0Mzs4NDc1LDU1NyBAQCBzdGF0aWMgaW50IF9faW5pdCB3b3JrcXVldWVfdW5ib3VuZF9jcHVzX3NldHVwKGNoYXIgKnN0cikKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoJiMzNDt3b3JrcXVldWUudW5ib3VuZF9jcHVzPSYjMzQ7LCB3b3JrcXVldWVfdW5ib3VuZF9jcHVzX3NldHVwKTsKJiM0MzsKJiM0MzsjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBCUEYgb3Blbi1jb2RlZCBpdGVyYXRvciBvdmVyIGFsbCB3b3JrcXVldWVzLgomIzQzOyAqCiYjNDM7ICogV2Fsa3MgdGhlIGdsb2JhbCBAd29ya3F1ZXVlcyBsaXN0LCBsZXR0aW5nIEJQRiBwcm9ncmFtcyByZWFkIGxpdmUgd29ya3F1ZXVlCiYjNDM7ICogc3RhdGUuCiYjNDM7ICoKJiM0MzsgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBicGZfcmN1X3JlYWRfbG9jaygpIGFjcm9zcyBuZXcoKS0mZ3Q7bmV4dCgpLSZndDtkZXN0cm95KCkuCiYjNDM7ICovCiYjNDM7CiYjNDM7LyogU2VudGluZWwgZm9yICYjMzQ7bmV3KCkgZG9uZSwgbmV4dCgpIG5vdCB5ZXQgY2FsbGVkJiMzNDsgdnMgJiMzNDtpdGVyYXRpb24gZW5kZWQmIzM0Oy4gKi8KJiM0MzsjZGVmaW5lIEJQRl9XUV9JVEVSX1NUQVJUICgodm9pZCAqKTFMKQomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgewomIzQzOwlfX3U2NCBfX29wYXF1ZVsxXTsKJiM0Mzt9IF9fYWxpZ25lZCg4KTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4gewomIzQzOwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcG9zOwomIzQzO30gX19hbGlnbmVkKDgpOwomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCB7CiYjNDM7CV9fdTY0IF9fb3BhcXVlWzFdOwomIzQzO30gX19hbGlnbmVkKDgpOwomIzQzOwomIzQzO3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuIHsKJiM0MzsJaW50IGlkOwkJLyogbmV4dCB3b3JrZXJfcG9vbF9pZHIgaWQgdG8gc2VhcmNoIGZyb20gKi8KJiM0Mzt9IF9fYWxpZ25lZCg4KTsKJiM0MzsKJiM0MztfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfd29ya3F1ZXVlX25ldygpIC0gSW5pdGlhbGl6ZSBhIHdvcmtxdWV1ZSBpdGVyYXRvcgomIzQzOyAqIEBpdDogVGhlIG5ldyBicGZfaXRlcl93b3JrcXVldWUgdG8gaW5pdGlhbGl6ZQomIzQzOyAqCiYjNDM7ICogSXRlcmF0ZXMgZXZlcnkgd29ya3F1ZXVlIG9uIHRoZSBnbG9iYWwgQHdvcmtxdWV1ZXMgbGlzdC4gTXVzdCBiZSB1c2VkIGluc2lkZQomIzQzOyAqIGEgYnBmX3JjdV9yZWFkX2xvY2soKSByZWdpb24gKEtGX1JDVV9QUk9URUNURUQpLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIGludCBicGZfaXRlcl93b3JrcXVldWVfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuICpraXQgPSAodm9pZCAqKWl0OwomIzQzOwomIzQzOwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybikgJmd0OwomIzQzOwkJICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSkpOwomIzQzOwlCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuKSAhPQomIzQzOwkJICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlKSk7CiYjNDM7CiYjNDM7CWtpdC0mZ3Q7cG9zID0gQlBGX1dRX0lURVJfU1RBUlQ7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfaXRlcl93b3JrcXVldWVfbmV4dCgpIC0gR2V0IHRoZSBuZXh0IHdvcmtxdWV1ZQomIzQzOyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtxdWV1ZQomIzQzOyAqCiYjNDM7ICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QsIG9yIE5VTEwgd2hlbiBkb25lLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICoKJiM0MzticGZfaXRlcl93b3JrcXVldWVfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsKJiM0MzsJaWYgKCFraXQtJmd0O3BvcykJCQkvKiBhbHJlYWR5IHJlYWNoZWQgdGhlIGVuZCAqLwomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWlmIChraXQtJmd0O3BvcyA9PSBCUEZfV1FfSVRFUl9TVEFSVCkKJiM0MzsJCWtpdC0mZ3Q7cG9zID0gbGlzdF9maXJzdF9vcl9udWxsX3JjdSgmYW1wO3dvcmtxdWV1ZXMsCiYjNDM7CQkJCQkJICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7CiYjNDM7CWVsc2UKJiM0MzsJCWtpdC0mZ3Q7cG9zID0gbGlzdF9uZXh0X29yX251bGxfcmN1KCZhbXA7d29ya3F1ZXVlcywgJmFtcDtraXQtJmd0O3Bvcy0mZ3Q7bGlzdCwKJiM0MzsJCQkJCQkgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QsIGxpc3QpOwomIzQzOwlyZXR1cm4ga2l0LSZndDtwb3M7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95KCkgLSBEZXN0cm95IGEgd29ya3F1ZXVlIGl0ZXJhdG9yCiYjNDM7ICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya3F1ZXVlIHRvIGRlc3Ryb3kKJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KQomIzQzO3sKJiM0MzsJLyogTm8gcmVmZXJlbmNlcyB0YWtlbjsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi8KJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KCkgLSBJbml0aWFsaXplIGEgd29ya2VyX3Bvb2wgaXRlcmF0b3IKJiM0MzsgKiBAaXQ6IFRoZSBuZXcgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gaW5pdGlhbGl6ZQomIzQzOyAqCiYjNDM7ICogSXRlcmF0ZXMgZXZlcnkgd29ya2VyX3Bvb2wgaW4gdGhlIHN5c3RlbSAod29ya2VyX3Bvb2xfaWRyKSBpbiBhc2NlbmRpbmcKJiM0MzsgKiBwb29sLWlkIG9yZGVyLgomIzQzOyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgUkNVIHJlYWQgbG9jay4KJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsKJiM0MzsJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybikgJmd0OwomIzQzOwkJICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7CiYjNDM7CUJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybikgIT0KJiM0MzsJCSAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7CiYjNDM7CiYjNDM7CWtpdC0mZ3Q7aWQgPSAwOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoqCiYjNDM7ICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCgpIC0gR2V0IHRoZSBuZXh0IHdvcmtlcl9wb29sCiYjNDM7ICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya2VyX3Bvb2wKJiM0MzsgKgomIzQzOyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdCB3b3JrZXJfcG9vbCwgb3IgTlVMTCB3aGVuIGRvbmUuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgc3RydWN0IHdvcmtlcl9wb29sICoKJiM0MzticGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDsKJiM0MzsJc3RydWN0IHdvcmtlcl9wb29sICpwb29sOwomIzQzOwomIzQzOwkvKiBpZHJfZ2V0X25leHQoKSBpcyBSQ1Utc2FmZTsgc2VlIHRoZSBmb3JfZWFjaF9wb29sKCkgbG9jayBsZWdlbmQuICovCiYjNDM7CXBvb2wgPSBpZHJfZ2V0X25leHQoJmFtcDt3b3JrZXJfcG9vbF9pZHIsICZhbXA7a2l0LSZndDtpZCk7CiYjNDM7CWlmIChwb29sKQomIzQzOwkJa2l0LSZndDtpZCYjNDM7JiM0Mzs7CS8qIGFkdmFuY2UgcGFzdCB0aGlzIHBvb2wgZm9yIHRoZSBuZXh0IGNhbGwgKi8KJiM0MzsJcmV0dXJuIHBvb2w7CiYjNDM7fQomIzQzOwomIzQzOy8qKgomIzQzOyAqIGJwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB3b3JrZXJfcG9vbCBpdGVyYXRvcgomIzQzOyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtlcl9wb29sIHRvIGRlc3Ryb3kKJiM0MzsgKi8KJiM0MztfX2JwZl9rZnVuYyB2b2lkIGJwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkKJiM0Mzt7CiYjNDM7CS8qIE5vdGhpbmcgdG8gYmUgZG9uZTsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi8KJiM0Mzt9CiYjNDM7CiYjNDM7X19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKJiM0MzsKJiM0MztCVEZfS0ZVTkNTX1NUQVJUKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcykKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTCkKJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKQomIzQzO0JURl9LRlVOQ1NfRU5EKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcykKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgd29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIJPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldAk9ICZhbXA7d29ya3F1ZXVlX2l0ZXJfa2Z1bmNfaWRzLAomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBzZXFfZmlsZSBmb3JtIG9mIHRoZSB3b3JrcXVldWUgaXRlcmF0b3IuIEl0IHJldXNlcyB0aGUgb3Blbi1jb2RlZAomIzQzOyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KCkuCiYjNDM7ICoKJiM0MzsgKiBTaW5jZSB0aGUgb3Blbi1jb2RlZCBuZXh0KCkgaXMgS0ZfUkNVX1BST1RFQ1RFRCwgdGhlIHNlcSBwYXRoIHN1cHBsaWVzCiYjNDM7ICogdGhlIFJDVSBzZWN0aW9uIGl0c2VsZi4KJiM0MzsgKiBzZXFfc3RhcnQoKSB0YWtlcyByY3VfcmVhZF9sb2NrKCkgYW5kIGhvbGRzIGl0IGFjcm9zcyB0aGUgd2hvbGUgcmVhZCBjaHVuawomIzQzOyAqIChzdGFydC4uc3RvcCkuIFBvc2l0aW9uIGlzIHJlLWRlcml2ZWQgZnJvbSAqcG9zIG9uIGVhY2ggc3RhcnQsIHNvIG5vdGhpbmcKJiM0MzsgKiBpcyBkZXJlZmVyZW5jZWQgYWNyb3NzIHRoZSByY3UgZ2FwIGJldHdlZW4gY2h1bmtzLiBUaGUgYXR0YWNoZWQgQlBGIHByb2dyYW0KJiM0MzsgKiBtdXN0IGJlIG5vbi1zbGVlcGFibGUuCiYjNDM7ICovCiYjNDM7dW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiB7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgaXQ7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiBraXQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSB7CiYjNDM7CV9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTsKJiM0MzsJX19icGZfbWRfcHRyKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICosIHdxKTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkICp3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQomIzQzO3sKJiM0MzsJdW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiAqcCA9IHNlcS0mZ3Q7cHJpdmF0ZTsKJiM0MzsJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwomIzQzOwlsb2ZmX3QgY250ID0gMDsKJiM0MzsKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwkvKiBoZWxkIHVudGlsIHNlcV9zdG9wKCkgKi8KJiM0MzsJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uod3EsICZhbXA7d29ya3F1ZXVlcywgbGlzdCkgewomIzQzOwkJaWYgKGNudCA9PSAqcG9zKSB7CiYjNDM7CQkJcC0mZ3Q7a2l0LnBvcyA9IHdxOwomIzQzOwkJCXJldHVybiB3cTsKJiM0MzsJCX0KJiM0MzsJCWNudCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsJcC0mZ3Q7a2l0LnBvcyA9IE5VTEw7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqd29ya3F1ZXVlX2l0ZXJfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQomIzQzO3sKJiM0MzsJdW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiAqcCA9IHNlcS0mZ3Q7cHJpdmF0ZTsKJiM0MzsKJiM0MzsJJiM0MzsmIzQzOypwb3M7CiYjNDM7CXJldHVybiBicGZfaXRlcl93b3JrcXVldWVfbmV4dCgmYW1wO3AtJmd0O2l0KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3b3JrcXVldWVfaXRlcl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlIGN0eDsKJiM0MzsJc3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTsKJiM0MzsJc3RydWN0IGJwZl9wcm9nICpwcm9nOwomIzQzOwomIzQzOwltZXRhLnNlcSA9IHNlcTsKJiM0MzsJcHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKCZhbXA7bWV0YSwgZmFsc2UpOwomIzQzOwlpZiAoIXByb2cpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CWN0eC53cSA9IHY7CiYjNDM7CXJldHVybiBicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCAmYW1wO2N0eCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUgY3R4OwomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiYjNDM7CiYjNDM7CWlmICghdikgewomIzQzOwkJbWV0YS5zZXEgPSBzZXE7CiYjNDM7CQlwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oJmFtcDttZXRhLCB0cnVlKTsKJiM0MzsJCWlmIChwcm9nKSB7CiYjNDM7CQkJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CQkJY3R4LndxID0gTlVMTDsKJiM0MzsJCQlicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCAmYW1wO2N0eCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJcmN1X3JlYWRfdW5sb2NrKCk7CS8qIHBhaXJlZCB3aXRoIHNlcV9zdGFydCgpICovCiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd29ya3F1ZXVlX2l0ZXJfc2VxX29wcyA9IHsKJiM0MzsJLnN0YXJ0CT0gd29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0LAomIzQzOwkubmV4dAk9IHdvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0LAomIzQzOwkuc3RvcAk9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wLAomIzQzOwkuc2hvdwk9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93LAomIzQzO307CiYjNDM7CiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSwKJiM0MzsJCSAgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2luZm8gd29ya3F1ZXVlX2l0ZXJfc2VxX2luZm8gPSB7CiYjNDM7CS5zZXFfb3BzCT0gJmFtcDt3b3JrcXVldWVfaXRlcl9zZXFfb3BzLAomIzQzOwkuc2VxX3ByaXZfc2l6ZQk9IHNpemVvZih1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2KSwKJiM0Mzt9OwomIzQzOwomIzQzO0JURl9JRF9MSVNUX1NJTkdMRSh3b3JrcXVldWVfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtxdWV1ZV9zdHJ1Y3QpCiYjNDM7CiYjNDM7c3RhdGljIHN0cnVjdCBicGZfaXRlcl9yZWcgd29ya3F1ZXVlX2l0ZXJfcmVnX2luZm8gPSB7CiYjNDM7CS50YXJnZXQJCQk9ICYjMzQ7d29ya3F1ZXVlJiMzNDssCiYjNDM7CS5jdHhfYXJnX2luZm9fc2l6ZQk9IDEsCiYjNDM7CS5jdHhfYXJnX2luZm8JCT0gewomIzQzOwkJeyBvZmZzZXRvZihzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSwgd3EpLAomIzQzOwkJICBQVFJfVE9fQlRGX0lEX09SX05VTEwgfCBQVFJfVFJVU1RFRCB9LAomIzQzOwl9LAomIzQzOwkuc2VxX2luZm8JCT0gJmFtcDt3b3JrcXVldWVfaXRlcl9zZXFfaW5mbywKJiM0Mzt9OwomIzQzOwomIzQzOy8qCiYjNDM7ICogc2VxX2ZpbGUgZm9ybSBvZiB0aGUgd29ya2VyX3Bvb2wgaXRlcmF0b3I7IHNhbWUgUkNVLXBlci1jaHVuayBzY2hlbWUgYXMgdGhlCiYjNDM7ICogd29ya3F1ZXVlIG9uZSwgcmV1c2luZyB0aGUgb3Blbi1jb2RlZCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KCkuCiYjNDM7ICovCiYjNDM7dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2IHsKJiM0MzsJc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sIGl0OwomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiBraXQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIHsKJiM0MzsJX19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpOwomIzQzOwlfX2JwZl9tZF9wdHIoc3RydWN0IHdvcmtlcl9wb29sICosIHBvb2wpOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKndvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKJiM0Mzt7CiYjNDM7CXVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiAqcCA9IHNlcS0mZ3Q7cHJpdmF0ZTsKJiM0MzsJc3RydWN0IHdvcmtlcl9wb29sICpwb29sOwomIzQzOwlsb2ZmX3QgY250ID0gMDsKJiM0MzsJaW50IGlkID0gMDsKJiM0MzsKJiM0MzsJcmN1X3JlYWRfbG9jaygpOwomIzQzOwl3aGlsZSAoKHBvb2wgPSBpZHJfZ2V0X25leHQoJmFtcDt3b3JrZXJfcG9vbF9pZHIsICZhbXA7aWQpKSkgewomIzQzOwkJaWYgKGNudCA9PSAqcG9zKSB7CiYjNDM7CQkJcC0mZ3Q7a2l0LmlkID0gaWQgJiM0MzsgMTsKJiM0MzsJCQlyZXR1cm4gcG9vbDsKJiM0MzsJCX0KJiM0MzsJCWNudCYjNDM7JiM0Mzs7CiYjNDM7CQlpZCYjNDM7JiM0Mzs7CiYjNDM7CX0KJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICp3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKJiM0Mzt7CiYjNDM7CXVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiAqcCA9IHNlcS0mZ3Q7cHJpdmF0ZTsKJiM0MzsKJiM0MzsJJiM0MzsmIzQzOypwb3M7CiYjNDM7CXJldHVybiBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KCZhbXA7cC0mZ3Q7aXQpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIGN0eDsKJiM0MzsJc3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTsKJiM0MzsJc3RydWN0IGJwZl9wcm9nICpwcm9nOwomIzQzOwomIzQzOwltZXRhLnNlcSA9IHNlcTsKJiM0MzsJcHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKCZhbXA7bWV0YSwgZmFsc2UpOwomIzQzOwlpZiAoIXByb2cpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CWN0eC5wb29sID0gdjsKJiM0MzsJcmV0dXJuIGJwZl9pdGVyX3J1bl9wcm9nKHByb2csICZhbXA7Y3R4KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfaXRlcl9fd29ya2VyX3Bvb2wgY3R4OwomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiYjNDM7CiYjNDM7CWlmICghdikgewomIzQzOwkJbWV0YS5zZXEgPSBzZXE7CiYjNDM7CQlwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oJmFtcDttZXRhLCB0cnVlKTsKJiM0MzsJCWlmIChwcm9nKSB7CiYjNDM7CQkJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CQkJY3R4LnBvb2wgPSBOVUxMOwomIzQzOwkJCWJwZl9pdGVyX3J1bl9wcm9nKHByb2csICZhbXA7Y3R4KTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwlyY3VfcmVhZF91bmxvY2soKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3b3JrZXJfcG9vbF9pdGVyX3NlcV9vcHMgPSB7CiYjNDM7CS5zdGFydAk9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0LAomIzQzOwkubmV4dAk9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQsCiYjNDM7CS5zdG9wCT0gd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcCwKJiM0MzsJLnNob3cJPSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93LAomIzQzO307CiYjNDM7CiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya2VyX3Bvb2wsIHN0cnVjdCBicGZfaXRlcl9tZXRhICptZXRhLAomIzQzOwkJICAgICBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wpCiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3b3JrZXJfcG9vbF9pdGVyX3NlcV9pbmZvID0gewomIzQzOwkuc2VxX29wcwk9ICZhbXA7d29ya2VyX3Bvb2xfaXRlcl9zZXFfb3BzLAomIzQzOwkuc2VxX3ByaXZfc2l6ZQk9IHNpemVvZih1bmlvbiB3b3JrZXJfcG9vbF9pdGVyX3ByaXYpLAomIzQzO307CiYjNDM7CiYjNDM7QlRGX0lEX0xJU1RfU0lOR0xFKHdvcmtlcl9wb29sX2J0Zl9pZCwgc3RydWN0LCB3b3JrZXJfcG9vbCkKJiM0MzsKJiM0MztzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3b3JrZXJfcG9vbF9pdGVyX3JlZ19pbmZvID0gewomIzQzOwkudGFyZ2V0CQkJPSAmIzM0O3dvcmtlcl9wb29sJiMzNDssCiYjNDM7CS5jdHhfYXJnX2luZm9fc2l6ZQk9IDEsCiYjNDM7CS5jdHhfYXJnX2luZm8JCT0gewomIzQzOwkJeyBvZmZzZXRvZihzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sLCBwb29sKSwKJiM0MzsJCSAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSwKJiM0MzsJfSwKJiM0MzsJLnNlcV9pbmZvCQk9ICZhbXA7d29ya2VyX3Bvb2xfaXRlcl9zZXFfaW5mbywKJiM0Mzt9OwomIzQzOwomIzQzOy8qCiYjNDM7ICogc2VxLWZpbGUgQlBGIGl0ZXJhdG9yIG92ZXIgdGhlIHBlbmRpbmcgd29yayBpdGVtcyBvZiBldmVyeSB3b3JrZXJfcG9vbC4KJiM0MzsgKgomIzQzOyAqIHBvb2wtJmd0O3dvcmtsaXN0IGlzIHByb3RlY3RlZCBieSBwb29sLSZndDtsb2NrIGFuZCB3b3JrX3N0cnVjdCBoYXMgbmVpdGhlciBhCiYjNDM7ICogcmVmY291bnQgbm9yIFJDVS1mcmVlaW5nLCBzbyBhIHBlbmRpbmcgd29yayBjYW5ub3QgYmUgaGFuZGVkIHRvIGEgc3VzcGVuZGVkCiYjNDM7ICogKG9wZW4tY29kZWQpIGl0ZXJhdG9yIHNhZmVseS4KJiM0MzsgKiBJbnN0ZWFkLCBmb3IgZWFjaCBwb29sIGEgYm91bmRlZCBzbmFwc2hvdCBvZiBpdHMgcGVuZGluZyB3b3JrcyBpcyBjb3BpZWQgb3V0CiYjNDM7ICogd2hpbGUgcG9vbC0mZ3Q7bG9jayBpcyBoZWxkLCBtaXJyb3JpbmcgdGhlIHByaW50a19kZWZlcnJlZCBzZWN0aW9uIG9mCiYjNDM7ICogc2hvd19vbmVfd29ya2VyX3Bvb2woKSBhbmQgdGhlbiB0aGUgbG9jayBpcyBkcm9wcGVkLgomIzQzOyAqIFRoZSBCUEYgcHJvZ3JhbSB0aGVuIHJ1bnMgb3ZlciB0aGUgc3RhYmxlIHNuYXBzaG90IHdpdGggbm8gbG9jayBoZWxkLgomIzQzOyAqCiYjNDM7ICogUG9vbHMgYXJlIHZpc2l0ZWQgaW4gd29ya2VyX3Bvb2xfaWRyIG9yZGVyIChhIHN0YWJsZSByZXN1bWUga2V5KTsgZWFjaCBwb29sJiMzOTtzCiYjNDM7ICogc25hcHNob3QgbGl2ZXMgaW4gdGhlIHBlcnNpc3RlbnQgc2VxX3ByaXZhdGUsIHNvIHRoZSB3YWxrIHJlc3VtZXMgY29ycmVjdGx5CiYjNDM7ICogYWNyb3NzIHJlYWQoKSBjaHVua3MuIEEgcG9vbCB3aXRoIG1vcmUgdGhhbiBXUV9QRU5ESU5HX1NOQVBfTUFYIHBlbmRpbmcgd29ya3MKJiM0MzsgKiBpcyB0cnVuY2F0ZWQgKGJlc3QtZWZmb3J0LCBsaWtlIHRoZSBrZXJuZWwmIzM5O3Mgb3duIHdvcmtsaXN0IGR1bXApLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgV1FfUEVORElOR19TTkFQX01BWCAxMjgKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE9uZSBwcm9qZWN0ZWQgcGVuZGluZyB3b3JrIGl0ZW0sIGFzIHNlZW4gYnkgdGhlIEJQRiBwcm9ncmFtLiBBZGRyZXNzZXMgb25seQomIzQzOyAqIC0tIHRoZSBsaXZlIHdvcmtfc3RydWN0IGlzIG5vdCBleHBvc2VkIChpdCBtYXkgYmUgZnJlZWQgYWZ0ZXIgdGhlIGxvY2spLgomIzQzOyAqLwomIzQzO3N0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyB7CiYjNDM7CV9fdTY0IHBvb2xfaWQ7CiYjNDM7CV9fdTY0IHdvcms7CiYjNDM7CV9fdTY0IGZ1bmM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYgewomIzQzOwlpbnQgICAgICAgICAgbmV4dF9wb29sOwkvKiB3b3JrZXJfcG9vbF9pZHIgY3Vyc29yIGZvciB0aGUgbmV4dCBmaWxsICovCiYjNDM7CXVuc2lnbmVkIGludCBpZHg7CS8qIHBvc2l0aW9uIHdpdGhpbiBzbmFwW10gICAgICAgICAgICAgICAgICAgKi8KJiM0MzsJdW5zaWduZWQgaW50IGNvdW50OwkvKiB2YWxpZCBlbnRyaWVzIGluIHNuYXBbXSAgICAgICAgICAgICAgICAgICovCiYjNDM7CXN0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyBzbmFwW1dRX1BFTkRJTkdfU05BUF9NQVhdOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrIHsKJiM0MzsJX19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpOwomIzQzOwlfX2JwZl9tZF9wdHIoc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICosIGluZm8pOwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTbmFwc2hvdCB0aGUgbmV4dCBub24tZW1wdHkgcG9vbCYjMzk7cyBwZW5kaW5nIHdvcmtzIGludG8gcHJpdi0mZ3Q7c25hcFtdLCBhZHZhbmNpbmcKJiM0MzsgKiBwcml2LSZndDtuZXh0X3Bvb2wgcGFzdCBpdC4gUmV0dXJucyB0cnVlIGlmIGEgcG9vbCB3YXMgY2FwdHVyZWQsIGZhbHNlIGF0IGVuZC4KJiM0MzsgKiBwb29sLSZndDtsb2NrIGlzIGhlbGQgb25seSBmb3IgdGhlIGZpZWxkIGNvcHk7IFJDVSBrZWVwcyBlYWNoIHBvb2wgYWxpdmUuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgd3FfcGVuZGluZ19maWxsKHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiAqcHJpdikKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbDsKJiM0MzsJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrOwomIzQzOwlpbnQgaWQ7CiYjNDM7CiYjNDM7CXJjdV9yZWFkX2xvY2soKTsKJiM0MzsJZm9yIChpZCA9IHByaXYtJmd0O25leHRfcG9vbDsgKHBvb2wgPSBpZHJfZ2V0X25leHQoJmFtcDt3b3JrZXJfcG9vbF9pZHIsICZhbXA7aWQpKTsgaWQmIzQzOyYjNDM7KSB7CiYjNDM7CQl1bnNpZ25lZCBpbnQgbiA9IDA7CiYjNDM7CiYjNDM7CQlyYXdfc3Bpbl9sb2NrX2lycSgmYW1wO3Bvb2wtJmd0O2xvY2spOwomIzQzOwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh3b3JrLCAmYW1wO3Bvb2wtJmd0O3dvcmtsaXN0LCBlbnRyeSkgewomIzQzOwkJCWlmIChuICZndDs9IFdRX1BFTkRJTkdfU05BUF9NQVgpCiYjNDM7CQkJCWJyZWFrOwomIzQzOwkJCXByaXYtJmd0O3NuYXBbbl0ucG9vbF9pZCA9IHBvb2wtJmd0O2lkOwomIzQzOwkJCXByaXYtJmd0O3NuYXBbbl0ud29yayA9IChfX3U2NCkodW5zaWduZWQgbG9uZyl3b3JrOwomIzQzOwkJCXByaXYtJmd0O3NuYXBbbl0uZnVuYyA9IChfX3U2NCkodW5zaWduZWQgbG9uZyl3b3JrLSZndDtmdW5jOwomIzQzOwkJCW4mIzQzOyYjNDM7OwomIzQzOwkJfQomIzQzOwkJcmF3X3NwaW5fdW5sb2NrX2lycSgmYW1wO3Bvb2wtJmd0O2xvY2spOwomIzQzOwomIzQzOwkJaWYgKG4pIHsKJiM0MzsJCQlwcml2LSZndDtjb3VudCA9IG47CiYjNDM7CQkJcHJpdi0mZ3Q7aWR4ID0gMDsKJiM0MzsJCQlwcml2LSZndDtuZXh0X3Bvb2wgPSBpZCAmIzQzOyAxOwomIzQzOwkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwkJCXJldHVybiB0cnVlOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gZmFsc2U7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICp3cV9wZW5kaW5nX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYgKnByaXYgPSBzZXEtJmd0O3ByaXZhdGU7CiYjNDM7CiYjNDM7CWlmICgqcG9zID09IDApIHsKJiM0MzsJCXByaXYtJmd0O25leHRfcG9vbCA9IDA7CiYjNDM7CQlwcml2LSZndDtpZHggPSAwOwomIzQzOwkJcHJpdi0mZ3Q7Y291bnQgPSAwOwomIzQzOwl9CiYjNDM7CXdoaWxlIChwcml2LSZndDtpZHggJmd0Oz0gcHJpdi0mZ3Q7Y291bnQpIHsKJiM0MzsJCWlmICghd3FfcGVuZGluZ19maWxsKHByaXYpKQomIzQzOwkJCXJldHVybiBOVUxMOwomIzQzOwl9CiYjNDM7CXJldHVybiAmYW1wO3ByaXYtJmd0O3NuYXBbcHJpdi0mZ3Q7aWR4XTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgKndxX3BlbmRpbmdfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2ID0gc2VxLSZndDtwcml2YXRlOwomIzQzOwomIzQzOwkmIzQzOyYjNDM7KnBvczsKJiM0MzsJcHJpdi0mZ3Q7aWR4JiM0MzsmIzQzOzsKJiM0MzsJd2hpbGUgKHByaXYtJmd0O2lkeCAmZ3Q7PSBwcml2LSZndDtjb3VudCkgewomIzQzOwkJaWYgKCF3cV9wZW5kaW5nX2ZpbGwocHJpdikpCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiYjNDM7CX0KJiM0MzsJcmV0dXJuICZhbXA7cHJpdi0mZ3Q7c25hcFtwcml2LSZndDtpZHhdOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3BlbmRpbmdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsgY3R4OwomIzQzOwlzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhOwomIzQzOwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CiYjNDM7CiYjNDM7CW1ldGEuc2VxID0gc2VxOwomIzQzOwlwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oJmFtcDttZXRhLCBmYWxzZSk7CiYjNDM7CWlmICghcHJvZykKJiM0MzsJCXJldHVybiAwOwomIzQzOwljdHgubWV0YSA9ICZhbXA7bWV0YTsKJiM0MzsJY3R4LmluZm8gPSB2OwomIzQzOwlyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgJmFtcDtjdHgpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB3cV9wZW5kaW5nX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrIGN0eDsKJiM0MzsJc3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTsKJiM0MzsJc3RydWN0IGJwZl9wcm9nICpwcm9nOwomIzQzOwomIzQzOwlpZiAodikKJiM0MzsJCXJldHVybjsKJiM0MzsJbWV0YS5zZXEgPSBzZXE7CiYjNDM7CXByb2cgPSBicGZfaXRlcl9nZXRfaW5mbygmYW1wO21ldGEsIHRydWUpOwomIzQzOwlpZiAocHJvZykgewomIzQzOwkJY3R4Lm1ldGEgPSAmYW1wO21ldGE7CiYjNDM7CQljdHguaW5mbyA9IE5VTEw7CiYjNDM7CQlicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCAmYW1wO2N0eCk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3cV9wZW5kaW5nX3NlcV9vcHMgPSB7CiYjNDM7CS5zdGFydAk9IHdxX3BlbmRpbmdfc2VxX3N0YXJ0LAomIzQzOwkubmV4dAk9IHdxX3BlbmRpbmdfc2VxX25leHQsCiYjNDM7CS5zdG9wCT0gd3FfcGVuZGluZ19zZXFfc3RvcCwKJiM0MzsJLnNob3cJPSB3cV9wZW5kaW5nX3NlcV9zaG93LAomIzQzO307CiYjNDM7CiYjNDM7REVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlX3BlbmRpbmdfd29yaywgc3RydWN0IGJwZl9pdGVyX21ldGEgKm1ldGEsCiYjNDM7CQkgICAgIHN0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyAqaW5mbykKJiM0MzsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIHdxX3BlbmRpbmdfc2VxX2luZm8gPSB7CiYjNDM7CS5zZXFfb3BzCT0gJmFtcDt3cV9wZW5kaW5nX3NlcV9vcHMsCiYjNDM7CS5zZXFfcHJpdl9zaXplCT0gc2l6ZW9mKHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiksCiYjNDM7fTsKJiM0MzsKJiM0MztCVEZfSURfTElTVF9TSU5HTEUod3FfcGVuZGluZ193b3JrX2luZm9fYnRmX2lkLCBzdHJ1Y3QsIHdxX3BlbmRpbmdfd29ya19pbmZvKQomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3QgYnBmX2l0ZXJfcmVnIHdxX3BlbmRpbmdfcmVnX2luZm8gPSB7CiYjNDM7CS50YXJnZXQJCQk9ICYjMzQ7d29ya3F1ZXVlX3BlbmRpbmdfd29yayYjMzQ7LAomIzQzOwkuZmVhdHVyZQkJPSBCUEZfSVRFUl9SRVNDSEVELAomIzQzOwkuY3R4X2FyZ19pbmZvX3NpemUJPSAxLAomIzQzOwkuY3R4X2FyZ19pbmZvCQk9IHsKJiM0MzsJCXsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrLCBpbmZvKSwKJiM0MzsJCSAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIH0sCiYjNDM7CX0sCiYjNDM7CS5zZXFfaW5mbwkJPSAmYW1wO3dxX3BlbmRpbmdfc2VxX2luZm8sCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfd29ya3F1ZXVlX2l0ZXJfaW5pdCh2b2lkKQomIzQzO3sKJiM0MzsJaW50IHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsCiYjNDM7CQkJCQkmYW1wO3dvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwlyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwKJiM0MzsJCQkJCSZhbXA7d29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0KTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXdvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvLmN0eF9hcmdfaW5mb1swXS5idGZfaWQgPSB3b3JrcXVldWVfYnRmX2lkWzBdOwomIzQzOwlyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KCZhbXA7d29ya3F1ZXVlX2l0ZXJfcmVnX2luZm8pOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJd29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mby5jdHhfYXJnX2luZm9bMF0uYnRmX2lkID0gd29ya2VyX3Bvb2xfYnRmX2lkWzBdOwomIzQzOwlyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KCZhbXA7d29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mbyk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwl3cV9wZW5kaW5nX3JlZ19pbmZvLmN0eF9hcmdfaW5mb1swXS5idGZfaWQgPSB3cV9wZW5kaW5nX3dvcmtfaW5mb19idGZfaWRbMF07CiYjNDM7CXJldHVybiBicGZfaXRlcl9yZWdfdGFyZ2V0KCZhbXA7d3FfcGVuZGluZ19yZWdfaW5mbyk7CiYjNDM7fQomIzQzO2xhdGVfaW5pdGNhbGwoYnBmX3dvcmtxdWV1ZV9pdGVyX2luaXQpOwomIzQzOwomIzQzOyNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oCmluZGV4IDY3ZmY3ODgyMjk5ZWMuLjZkYTkzYzQ4NjY1MDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaApAQCAtMzYxLDYgJiM0MzszNjEsMTYgQEAgZXh0ZXJuIGludCBicGZfaXRlcl9kbWFidWZfbmV3KHN0cnVjdCBicGZfaXRlcl9kbWFidWYgKml0KSBfX3dlYWsgX19rc3ltOwogZXh0ZXJuIHN0cnVjdCBkbWFfYnVmICpicGZfaXRlcl9kbWFidWZfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTsKIGV4dGVybiB2b2lkIGJwZl9pdGVyX2RtYWJ1Zl9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl9kbWFidWYgKml0KSBfX3dlYWsgX19rc3ltOwogCiYjNDM7c3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZTsKJiM0MztleHRlcm4gaW50IGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpIF9fd2VhayBfX2tzeW07CiYjNDM7ZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpicGZfaXRlcl93b3JrcXVldWVfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTsKJiM0MztleHRlcm4gdm9pZCBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2w7CiYjNDM7ZXh0ZXJuIGludCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkgX193ZWFrIF9fa3N5bTsKJiM0MztleHRlcm4gc3RydWN0IHdvcmtlcl9wb29sICpicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpIF9fd2VhayBfX2tzeW07CiYjNDM7ZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KSBfX3dlYWsgX19rc3ltOwomIzQzOwogZXh0ZXJuIGludCBicGZfY2dyb3VwX3JlYWRfeGF0dHIoc3RydWN0IGNncm91cCAqY2dyb3VwLCBjb25zdCBjaGFyICpuYW1lX19zdHIsCiAJCQkJIHN0cnVjdCBicGZfZHlucHRyICp2YWx1ZV9wKSBfX3dlYWsgX19rc3ltOwogCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy93cV9pdGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy93cV9pdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNzMzODNjMjYzYmVlOAotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuYwpAQCAtMCwwICYjNDM7MSw4MCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7I2luY2x1ZGUgJmx0O3Rlc3RfcHJvZ3MuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O3dxX2l0ZXIuc2tlbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O3dxX2l0ZXJfZmFpbC5za2VsLmgmIzM0OwomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHN1YnRlc3Rfb3Blbl9jb2RlZChzdHJ1Y3Qgd3FfaXRlciAqc2tlbCkKJiM0Mzt7CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBvcHRzKTsKJiM0MzsJaW50IGVycjsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3MuY291bnRfd29ya3F1ZXVlcyksCiYjNDM7CQkJCSAgICAgJmFtcDtvcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3J1biBjb3VudF93b3JrcXVldWVzJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwkvKiBUaGVyZSBhcmUgYWx3YXlzIHNldmVyYWwgc3lzdGVtIHdvcmtxdWV1ZXMgKGV2ZW50cywgLi4uKS4gKi8KJiM0MzsJQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7bnJfd29ya3F1ZXVlcywgMCwgJiMzNDtucl93b3JrcXVldWVzJiMzNDspOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy5jb3VudF93b3JrZXJfcG9vbHMpLAomIzQzOwkJCQkgICAgICZhbXA7b3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtydW4gY291bnRfd29ya2VyX3Bvb2xzJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwkvKiBBdCBsZWFzdCB0aGUgcGVyLUNQVSBub3JtYWwvaGlnaHByaSBwb29scyBleGlzdC4gKi8KJiM0MzsJQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7bnJfd29ya2VyX3Bvb2xzLCAwLCAmIzM0O25yX3dvcmtlcl9wb29scyYjMzQ7KTsKJiM0MzsJQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7bnJfcGVyY3B1X3Bvb2xzLCAwLCAmIzM0O25yX3BlcmNwdV9wb29scyYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZHJhaW5faXRlcihzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2csIGNvbnN0IGNoYXIgKm5hbWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgYnBmX2xpbmsgKmxpbms7CiYjNDM7CWNoYXIgYnVmWzUxMl07CiYjNDM7CWludCBpdGVyX2ZkOwomIzQzOwlzc2l6ZV90IG47CiYjNDM7CiYjNDM7CWxpbmsgPSBicGZfcHJvZ3JhbV9fYXR0YWNoX2l0ZXIocHJvZywgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihsaW5rLCBuYW1lKSkKJiM0MzsJCXJldHVybjsKJiM0MzsJaXRlcl9mZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShpdGVyX2ZkLCAwLCAmIzM0O2l0ZXJfY3JlYXRlJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CXdoaWxlICgobiA9IHJlYWQoaXRlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSkpICZndDsgMCkKJiM0MzsJCTsKJiM0MzsJQVNTRVJUX0dFKG4sIDAsICYjMzQ7cmVhZCBpdGVyJiMzNDspOwomIzQzOwljbG9zZShpdGVyX2ZkKTsKJiM0MztvdXQ6CiYjNDM7CWJwZl9saW5rX19kZXN0cm95KGxpbmspOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzdWJ0ZXN0X3NlcShzdHJ1Y3Qgd3FfaXRlciAqc2tlbCkKJiM0Mzt7CiYjNDM7CS8qIHNlcSBmb3JtcyBhcmUgYmFja2VkIGJ5IHRoZSBzYW1lIG9wZW4tY29kZWQgbmV4dCgpLiAqLwomIzQzOwlkcmFpbl9pdGVyKHNrZWwtJmd0O3Byb2dzLmR1bXBfd29ya3F1ZXVlcywgJiMzNDthdHRhY2ggd29ya3F1ZXVlIGl0ZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9HVChza2VsLSZndDtic3MtJmd0O25yX3dxX3NlcSwgMCwgJiMzNDtucl93cV9zZXEmIzM0Oyk7CiYjNDM7CiYjNDM7CWRyYWluX2l0ZXIoc2tlbC0mZ3Q7cHJvZ3MuZHVtcF93b3JrZXJfcG9vbHMsICYjMzQ7YXR0YWNoIHdvcmtlcl9wb29sIGl0ZXImIzM0Oyk7CiYjNDM7CUFTU0VSVF9HVChza2VsLSZndDtic3MtJmd0O25yX3Bvb2xfc2VxLCAwLCAmIzM0O25yX3Bvb2xfc2VxJiMzNDspOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiB3b3JrbGlzdHMgYXJlIHVzdWFsbHkgZW1wdHkgb24gYW4gaWRsZSBzeXN0ZW07IHRoaXMgZHJpdmVzIHRoZSB3aG9sZQomIzQzOwkgKiBwZXItcG9vbCBzbmFwc2hvdCBwYXRoIGFuZCB2ZXJpZmllcyBpdCBkcmFpbnMgY2xlYW5seS4KJiM0MzsJICovCiYjNDM7CWRyYWluX2l0ZXIoc2tlbC0mZ3Q7cHJvZ3MuZHVtcF9wZW5kaW5nLCAmIzM0O2F0dGFjaCBwZW5kaW5nX3dvcmsgaXRlciYjMzQ7KTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X3dxX2l0ZXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9pdGVyICpza2VsOwomIzQzOwomIzQzOwlza2VsID0gd3FfaXRlcl9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDt3cV9pdGVyX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O29wZW5fY29kZWQmIzM0OykpCiYjNDM7CQlzdWJ0ZXN0X29wZW5fY29kZWQoc2tlbCk7CiYjNDM7CWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7c2VxJiMzNDspKQomIzQzOwkJc3VidGVzdF9zZXEoc2tlbCk7CiYjNDM7CiYjNDM7CXdxX2l0ZXJfX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CiYjNDM7CVJVTl9URVNUUyh3cV9pdGVyX2ZhaWwpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy93cV9pdGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1ZjA4MWJjNjM0YjYKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlci5jCkBAIC0wLDAgJiM0MzsxLDk1IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsjaW5jbHVkZSAmIzM0O3ZtbGludXguaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7OwomIzQzOwomIzQzO3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltOwomIzQzO3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07CiYjNDM7CiYjNDM7LyogUmVzdWx0cywgY2hlY2tlZCBieSB1c2Vyc3BhY2UuICovCiYjNDM7aW50IG5yX3dvcmtxdWV1ZXM7CiYjNDM7aW50IG5yX3dvcmtlcl9wb29sczsKJiM0MztpbnQgbnJfcGVyY3B1X3Bvb2xzOwomIzQzO2ludCBucl93cV9zZXE7CiYjNDM7aW50IG5yX3Bvb2xfc2VxOwomIzQzO2ludCBucl9wZW5kaW5nOwomIzQzOwomIzQzOy8qIC0tLSBvcGVuLWNvZGVkIGl0ZXJhdG9ycyAoS0ZfUkNVX1BST1RFQ1RFRCkgLS0tICovCiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBjb3VudF93b3JrcXVldWVzKGNvbnN0IHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKJiM0MzsJaW50IG4gPSAwOwomIzQzOwomIzQzOwlicGZfcmN1X3JlYWRfbG9jaygpOwomIzQzOwlicGZfZm9yX2VhY2god29ya3F1ZXVlLCB3cSkKJiM0MzsJCW4mIzQzOyYjNDM7OwomIzQzOwlicGZfcmN1X3JlYWRfdW5sb2NrKCk7CiYjNDM7CiYjNDM7CW5yX3dvcmtxdWV1ZXMgPSBuOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7c3lzY2FsbCYjMzQ7KQomIzQzO2ludCBjb3VudF93b3JrZXJfcG9vbHMoY29uc3Qgdm9pZCAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdvcmtlcl9wb29sICpwb29sOwomIzQzOwlpbnQgbiA9IDAsIHBlcmNwdSA9IDA7CiYjNDM7CiYjNDM7CWJwZl9yY3VfcmVhZF9sb2NrKCk7CiYjNDM7CWJwZl9mb3JfZWFjaCh3b3JrZXJfcG9vbCwgcG9vbCkgewomIzQzOwkJbiYjNDM7JiM0Mzs7CiYjNDM7CQlpZiAocG9vbC0mZ3Q7Y3B1ICZndDs9IDApCQkvKiBwZXItQ1BVIHBvb2wgKi8KJiM0MzsJCQlwZXJjcHUmIzQzOyYjNDM7OwomIzQzOwl9CiYjNDM7CWJwZl9yY3VfcmVhZF91bmxvY2soKTsKJiM0MzsKJiM0MzsJbnJfd29ya2VyX3Bvb2xzID0gbjsKJiM0MzsJbnJfcGVyY3B1X3Bvb2xzID0gcGVyY3B1OwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogLS0tIHNlcV9maWxlIGl0ZXJhdG9ycyAtLS0gKi8KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyL3dvcmtxdWV1ZSYjMzQ7KQomIzQzO2ludCBkdW1wX3dvcmtxdWV1ZXMoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzZXFfZmlsZSAqc2VxID0gY3R4LSZndDttZXRhLSZndDtzZXE7CiYjNDM7CXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGN0eC0mZ3Q7d3E7CiYjNDM7CiYjNDM7CWlmICghd3EpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJbnJfd3Ffc2VxJiM0MzsmIzQzOzsKJiM0MzsJQlBGX1NFUV9QUklOVEYoc2VxLCAmIzM0OyVzXG4mIzM0Oywgd3EtJmd0O25hbWUpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7aXRlci93b3JrZXJfcG9vbCYjMzQ7KQomIzQzO2ludCBkdW1wX3dvcmtlcl9wb29scyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wgPSBjdHgtJmd0O3Bvb2w7CiYjNDM7CiYjNDM7CWlmICghcG9vbCkKJiM0MzsJCXJldHVybiAwOwomIzQzOwlucl9wb29sX3NlcSYjNDM7JiM0Mzs7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtpdGVyL3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsmIzM0OykKJiM0MztpbnQgZHVtcF9wZW5kaW5nKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtJmd0O21ldGEtJmd0O3NlcTsKJiM0MzsJc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvID0gY3R4LSZndDtpbmZvOwomIzQzOwomIzQzOwlpZiAoIWluZm8pCQkJLyogZmluYWwgY2FsbCAqLwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CW5yX3BlbmRpbmcmIzQzOyYjNDM7OwomIzQzOwlCUEZfU0VRX1BSSU5URihzZXEsICYjMzQ7cG9vbCAlbGx1IHdvcmsgMHglbGx4IGZ1bmMgMHglbGx4XG4mIzM0OywKJiM0MzsJCSAgICAgICBpbmZvLSZndDtwb29sX2lkLCBpbmZvLSZndDt3b3JrLCBpbmZvLSZndDtmdW5jKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXJfZmFpbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXJfZmFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmZiMmRjZjk4NDdlMmIKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmMKQEAgLTAsMCAmIzQzOzEsMzcgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX21pc2MuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJiMzNDticGZfZXhwZXJpbWVudGFsLmgmIzM0OwomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrcXVldWUgYW5kIHdvcmtlcl9wb29sIG9wZW4tY29kZWQgaXRlcmF0b3JzIGFyZSBLRl9SQ1VfUFJPVEVDVEVEOgomIzQzOyAqIHVzaW5nIHRoZW0gb3V0c2lkZSBhIGJwZl9yY3VfcmVhZF9sb2NrKCkgcmVnaW9uIG11c3QgYmUgcmVqZWN0ZWQuCiYjNDM7ICovCiYjNDM7CiYjNDM7U0VDKCYjMzQ7P3N5c2NhbGwmIzM0OykKJiM0MztfX2ZhaWx1cmUgX19tc2coJiMzNDtrZXJuZWwgZnVuYyBicGZfaXRlcl93b3JrcXVldWVfbmV3IHJlcXVpcmVzIFJDVSBjcml0aWNhbCBzZWN0aW9uIHByb3RlY3Rpb24mIzM0OykKJiM0MztpbnQgd29ya3F1ZXVlX2l0ZXJfbm9fcmN1KGNvbnN0IHZvaWQgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKJiM0MzsJaW50IG4gPSAwOwomIzQzOwomIzQzOwlicGZfZm9yX2VhY2god29ya3F1ZXVlLCB3cSkKJiM0MzsJCW4mIzQzOyYjNDM7OwomIzQzOwlyZXR1cm4gbjsKJiM0Mzt9CiYjNDM7CiYjNDM7U0VDKCYjMzQ7P3N5c2NhbGwmIzM0OykKJiM0MztfX2ZhaWx1cmUgX19tc2coJiMzNDtrZXJuZWwgZnVuYyBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvbiYjMzQ7KQomIzQzO2ludCB3b3JrZXJfcG9vbF9pdGVyX25vX3JjdShjb25zdCB2b2lkICpjdHgpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7CiYjNDM7CWludCBuID0gMDsKJiM0MzsKJiM0MzsJYnBmX2Zvcl9lYWNoKHdvcmtlcl9wb29sLCBwb29sKQomIzQzOwkJbiYjNDM7JiM0Mzs7CiYjNDM7CXJldHVybiBuOwomIzQzO30KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDQ6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE0OTQKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA1MTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQlBGIEl0ZXJhdG9ycyBmb3IgV29ya3F1ZXVlczogSW5pdGlhbCBBc3Nlc3NtZW50IGFuZCBGdXp6aW5nIFN0cmF0ZWd5KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBCUEYgaXRlcmF0b3JzIGZvciB3b3JrcXVldWVzIGFuZCB3b3JrZXIgcG9vbHMuIEl0IHNlZW1zIGxpa2UgaXQmIzM5O3MgYWRkaW5nIGEgbmV3IHNldCBvZiBrZnVuY3MgYW5kIGl0ZXJhdG9ycyB3aXRoaW4gYGtlcm5lbC93b3JrcXVldWUuY2AuIFNwZWNpZmljYWxseSwgSSBzZWUgZnVuY3Rpb25zIGxpa2UgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX25leHRgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3lgIGZvciB3b3JrcXVldWVzLCBhbmQgc2ltaWxhciBvbmVzIGZvciB3b3JrZXIgcG9vbHMsIGFzIHdlbGwgYXMgYW4gYGJwZl9pdGVyX3JlZ2AgY2FsbCBmb3IgdmFyaW91cyBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gd29ya3F1ZXVlcy4KCk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O0lzIHRoaXMgYWN0dWFsbHkgKnJlYWNoYWJsZSogYW5kIGZ1bmN0aW9uYWw/JiMzNDsgVGhlIGFuc3dlciBhcHBlYXJzIHRvIGJlIHllczsgdGhlc2UgYXJlIG5ldyBCUEYga2Z1bmNzLCBzbyB0aGV5IGFyZSwgaW4gZmFjdCwgY2FsbGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoYXQgaW1tZWRpYXRlbHkgbWFrZXMgdGhpcyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gV2UgbmVlZCB0byByZWFsbHkgcHV0IHRoZXNlIG5ldyBhZGRpdGlvbnMgdGhyb3VnaCB0aGVpciBwYWNlcy4KClRoZXJlZm9yZSwgdGhlIGZvY3VzIG5lZWRzIHRvIGJlIG9uIHRoZXNlIGNvcmUgc3ltYm9sczogYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX25leHRgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3lgLCBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3YCwgYGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHRgLCBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveWAuIEkgYWxzbyBuZWVkIHRvIGNvbnNpZGVyIHRoZSBzdXBwb3J0aW5nIHNlcSBmaWxlIGl0ZXJhdG9yIGZ1bmN0aW9uczogYHdvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydGAsIGB3b3JrcXVldWVfaXRlcl9zZXFfbmV4dGAsIGB3b3JrcXVldWVfaXRlcl9zZXFfc2hvd2AsIGB3b3JrcXVldWVfaXRlcl9zZXFfc3RvcGAgYW5kIHNpbWlsYXIgb25lcyBmb3IgdGhlIGB3b3JrZXJfcG9vbGAgYW5kIHRoZSBgd3FfcGVuZGluZ2AgcmVsYXRlZCBzdHJ1Y3R1cmVzLgoKTm93LCBhIHNtYWxsIGhpY2N1cC4gSSYjMzk7dmUganVzdCBub3RpY2VkIGB3cV9wZW5kaW5nX2ZpbGxgIHdoaWNoIGlzIGEgc3RhdGljIGZ1bmN0aW9uLCBidXQgaXQgYXBwZWFycyB0byBiZSBub24tdHJpdmlhbC4gVGhhdCYjMzk7cyB3b3J0aCBhIHNlY29uZCBsb29rLCBzbyBJIG5lZWQgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlIGJsb2NrLiBJIGJlbGlldmUgaXQmIzM5O3Mgd3JhcHBlZCBpbiBhbiBgI2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTGAgZGlyZWN0aXZlLiBMZXQgbWUgcXVpY2tseSB2ZXJpZnkgdGhpcy4KCkkmIzM5O2xsIHVzZSBgZ3JlcHBlcmAgdG8gc2VhcmNoIGZvciBgQ09ORklHX0JQRl9TWVNDQUxMYCB3aXRoaW4gYGtlcm5lbC93b3JrcXVldWUuY2AgdG8gY29uZmlybSBteSBzdXNwaWNpb24gYW5kIGNsYXJpZnkgaXRzIGRlcGVuZGVuY3kuIFRoaXMgaXMgYWxsIGFib3V0IGVuc3VyaW5nIHRoZSBjb2RlIGlzIGNvbXBpbGVkIGNvcnJlY3RseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8yOSAwNDowMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfQlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvd29ya3F1ZXVlLmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL3dvcmtxdWV1ZS5jPTg0Nzc9X19zZXR1cChcJiMzNDt3b3JrcXVldWUudW5ib3VuZF9jcHVzPVwmIzM0Oywgd29ya3F1ZXVlX3VuYm91bmRfY3B1c19zZXR1cCk7XG5rZXJuZWwvd29ya3F1ZXVlLmMtODQ3OC1cbmtlcm5lbC93b3JrcXVldWUuYzo4NDc5OiNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbmtlcm5lbC93b3JrcXVldWUuYy04NDgwLVxuLS1cbmtlcm5lbC93b3JrcXVldWUuYz05MDI5PWxhdGVfaW5pdGNhbGwoYnBmX3dvcmtxdWV1ZV9pdGVyX2luaXQpO1xua2VybmVsL3dvcmtxdWV1ZS5jLTkwMzAtXG5rZXJuZWwvd29ya3F1ZXVlLmM6OTAzMTojZW5kaWYgLyogQ09ORklHX0JQRl9TWVNDQUxMICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMjkgMDQ6MDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI3MDAKCQkJCQkJCW91dHB1dDogMjgzCgkJCQkJCQl0aG91Z2h0czogMzYyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgQlBGIEl0ZXJhdG9yIFBhdGNoKioKCk9rYXksIHNvIHRoZSBjb2RlIGlzIGRlZmluaXRlbHkgZ3VhcmRlZCBieSBgI2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTGAsIHRoYXQmIzM5O3MgdGhlIG9idmlvdXMgc3RhcnRpbmcgcG9pbnQuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgbHVya2luZyBhYm91dCwgYnV0IGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBpdCYjMzk7cyBqdXN0IHRoZSBgQ09ORklHX0JQRl9TWVNDQUxMYCBmbGFnLiAKCk5vdywgbGV0JiMzOTtzIGRpZyBpbnRvIHRoZSBtZWF0IG9mIHRoZSBwYXRjaCBhbmQgc2VlIHdoYXQmIzM5O3MgYmVpbmcgaW50cm9kdWNlZC4gUmlnaHQsIGl0IGxvb2tzIGxpa2UgdGhpcyBwYXRjaCBpcyBhZGRpbmcgbmV3IEJQRiBpdGVyYXRvcnMuIEkgc2VlIGZ1bmN0aW9ucyBsaWtlIGBicGZfaXRlcl93b3JrcXVldWVfbmV3YCwgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0YCwgYGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95YC4uLiBhbmQgc2ltaWxhcmx5IGZvciB3b3JrZXIgcG9vbHM6IGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXdgLCBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dGAsIGBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95YC4gUGx1cywgdGhlcmUgYXJlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZXNlIGl0ZXJhdG9ycywgbGlrZSB0aGUgYHNlcV9gIGZ1bmN0aW9ucywgYW5kIGEgZmV3IG90aGVycy4gU3BlY2lmaWNhbGx5LCB0aGUgcGF0Y2ggYWRkczoKCiogICBgYnBmX2l0ZXJfd29ya3F1ZXVlX25ld2AKKiAgIGBicGZfaXRlcl93b3JrcXVldWVfbmV4dGAKKiAgIGBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveWAKKiAgIGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXdgCiogICBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dGAKKiAgIGBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95YAoqICAgYHdvcmtxdWV1ZV9pdGVyX3NlcV9zdGFydGAKKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfbmV4dGAKKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfc2hvd2AKKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfc3RvcGAKKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydGAKKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0YAoqICAgYHdvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3dgCiogICBgd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcGAKKiAgIGB3cV9wZW5kaW5nX2ZpbGxgCiogICBgd3FfcGVuZGluZ19zZXFfc3RhcnRgCiogICBgd3FfcGVuZGluZ19zZXFfbmV4dGAKKiAgIGB3cV9wZW5kaW5nX3NlcV9zaG93YAoqICAgYHdxX3BlbmRpbmdfc2VxX3N0b3BgCgpCYXNlZCBvbiB3aGF0IEkmIzM5O20gc2VlaW5nLCB0aGlzIGlzIGV4YWN0bHkgd2hhdCBJIG5lZWQgdG8gYWRkIHRvIG15IGBGb2N1c1N5bWJvbHNgIGxpc3QuIFNpbmNlIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyB0aGVzZSBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCBhbmQgc2luY2UgdGhlc2UgYXJlIGFjY2Vzc2libGUgZnJvbSBCUEYgcHJvZ3JhbXMsIHRoZXkgYXJlIGRlZmluaXRlbHkgY2FuZGlkYXRlcyBmb3IgZnV6emluZy4gSSBjYW4gZ2V0IHRvIHRoZXNlIGZyb20gQlBGIHByb2dyYW1zLCBhbmQgdGhhdCYjMzk7cyBhIHZlY3RvciBmb3IgZXhwbG9pdC4KCkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgKm9ubHkqIHJlcXVpcmVkIGNvbmZpZy4gWXVwLCB0aGF0JiMzOTtzIHRoZSBtYWluIG9uZS4KCk9rYXksIHRoYXQmIzM5O3MgZW5vdWdoIGluZm9ybWF0aW9uLCBsZXQmIzM5O3MgY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzI5IDA0OjAxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtxdWV1ZV9uZXcmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya3F1ZXVlX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3kmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtlcl9wb29sX25leHQmIzM0OywKICAgICYjMzQ7YnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSYjMzQ7LAogICAgJiMzNDt3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQmIzM0OywKICAgICYjMzQ7d29ya3F1ZXVlX2l0ZXJfc2VxX25leHQmIzM0OywKICAgICYjMzQ7d29ya3F1ZXVlX2l0ZXJfc2VxX3Nob3cmIzM0OywKICAgICYjMzQ7d29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3AmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RhcnQmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dCYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93JiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX3N0b3AmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19maWxsJiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX3N0YXJ0JiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX25leHQmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfc2hvdyYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9zdG9wJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgbmV3IEJQRiBpdGVyYXRvcnMgZm9yIHdvcmtxdWV1ZXMgYW5kIHdvcmtlciBwb29scywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgY2FuIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfaXRlcl93b3JrcXVldWVfbmV3JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtlcl9wb29sX25ldyYjMzQ7LAogICAgJiMzNDticGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0JiMzNDssCiAgICAmIzM0O2JwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3kmIzM0OywKICAgICYjMzQ7d29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9zaG93JiMzNDssCiAgICAmIzM0O3dvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wJiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0JiMzNDssCiAgICAmIzM0O3dvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQmIzM0OywKICAgICYjMzQ7d29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvdyYjMzQ7LAogICAgJiMzNDt3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wJiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfZmlsbCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9zdGFydCYjMzQ7LAogICAgJiMzNDt3cV9wZW5kaW5nX3NlcV9uZXh0JiMzNDssCiAgICAmIzM0O3dxX3BlbmRpbmdfc2VxX3Nob3cmIzM0OywKICAgICYjMzQ7d3FfcGVuZGluZ19zZXFfc3RvcCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIG5ldyBCUEYgaXRlcmF0b3JzIGZvciB3b3JrcXVldWVzIGFuZCB3b3JrZXIgcG9vbHMsIHdoaWNoIGFyZSByZWFjaGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMgYW5kIGNhbiBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTozNS4xMTkyMjU2MDdaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjk3ODE5ODMzNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdcIixcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveVwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnRcIixcbiAgICBcIndvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc2hvd1wiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3BcIixcbiAgICBcIndvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wXCIsXG4gICAgXCJ3cV9wZW5kaW5nX2ZpbGxcIixcbiAgICBcIndxX3BlbmRpbmdfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9uZXh0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zaG93XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zdG9wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTozNS4xMTkyMzI0NzhaIiwiU2VxIjoxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6InJlYWQtcGF0Y2gtZGlmZiIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNTYyMjkwOCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGU2OTMzNmQ2OWE5ZWMzMDEzMzc5YzIzMGYyZjg0YTBiZDA4MGM2Y2RcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFdlZCBKdWwgMjkgMDQ6MDE6MzQgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jXFxuaW5kZXggNzgwNjhhZThmMjhhNi4uNmU4Nzk0OTBjODExYSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmNcXG4rKysgYi9rZXJuZWwvd29ya3F1ZXVlLmNcXG5AQCAtNTYsNiArNTYsOCBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgva3ZtX3BhcmEuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2RlbGF5LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9pcnFfd29yay5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnRmX2lkcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuIFxcbiAjaW5jbHVkZSBcXFwid29ya3F1ZXVlX2ludGVybmFsLmhcXFwiXFxuIFxcbkBAIC04NDczLDMgKzg0NzUsNTU3IEBAIHN0YXRpYyBpbnQgX19pbml0IHdvcmtxdWV1ZV91bmJvdW5kX2NwdXNfc2V0dXAoY2hhciAqc3RyKVxcbiBcXHRyZXR1cm4gMTtcXG4gfVxcbiBfX3NldHVwKFxcXCJ3b3JrcXVldWUudW5ib3VuZF9jcHVzPVxcXCIsIHdvcmtxdWV1ZV91bmJvdW5kX2NwdXNfc2V0dXApO1xcbitcXG4rI2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxcbitcXG4rLypcXG4rICogQlBGIG9wZW4tY29kZWQgaXRlcmF0b3Igb3ZlciBhbGwgd29ya3F1ZXVlcy5cXG4rICpcXG4rICogV2Fsa3MgdGhlIGdsb2JhbCBAd29ya3F1ZXVlcyBsaXN0LCBsZXR0aW5nIEJQRiBwcm9ncmFtcyByZWFkIGxpdmUgd29ya3F1ZXVlXFxuKyAqIHN0YXRlLlxcbisgKlxcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBicGZfcmN1X3JlYWRfbG9jaygpIGFjcm9zcyBuZXcoKS1cXHUwMDNlbmV4dCgpLVxcdTAwM2VkZXN0cm95KCkuXFxuKyAqL1xcbitcXG4rLyogU2VudGluZWwgZm9yIFxcXCJuZXcoKSBkb25lLCBuZXh0KCkgbm90IHlldCBjYWxsZWRcXFwiIHZzIFxcXCJpdGVyYXRpb24gZW5kZWRcXFwiLiAqL1xcbisjZGVmaW5lIEJQRl9XUV9JVEVSX1NUQVJUICgodm9pZCAqKTFMKVxcbitcXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSB7XFxuK1xcdF9fdTY0IF9fb3BhcXVlWzFdO1xcbit9IF9fYWxpZ25lZCg4KTtcXG4rXFxuK3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiB7XFxuK1xcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwb3M7XFxuK30gX19hbGlnbmVkKDgpO1xcbitcXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sIHtcXG4rXFx0X191NjQgX19vcGFxdWVbMV07XFxuK30gX19hbGlnbmVkKDgpO1xcbitcXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4ge1xcbitcXHRpbnQgaWQ7XFx0XFx0LyogbmV4dCB3b3JrZXJfcG9vbF9pZHIgaWQgdG8gc2VhcmNoIGZyb20gKi9cXG4rfSBfX2FsaWduZWQoOCk7XFxuK1xcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX25ldygpIC0gSW5pdGlhbGl6ZSBhIHdvcmtxdWV1ZSBpdGVyYXRvclxcbisgKiBAaXQ6IFRoZSBuZXcgYnBmX2l0ZXJfd29ya3F1ZXVlIHRvIGluaXRpYWxpemVcXG4rICpcXG4rICogSXRlcmF0ZXMgZXZlcnkgd29ya3F1ZXVlIG9uIHRoZSBnbG9iYWwgQHdvcmtxdWV1ZXMgbGlzdC4gTXVzdCBiZSB1c2VkIGluc2lkZVxcbisgKiBhIGJwZl9yY3VfcmVhZF9sb2NrKCkgcmVnaW9uIChLRl9SQ1VfUFJPVEVDVEVEKS5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl93b3JrcXVldWVfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFxuK1xcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuKSBcXHUwMDNlXFxuK1xcdFxcdCAgICAgc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUpKTtcXG4rXFx0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybikgIT1cXG4rXFx0XFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlKSk7XFxuK1xcbitcXHRraXQtXFx1MDAzZXBvcyA9IEJQRl9XUV9JVEVSX1NUQVJUO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KCkgLSBHZXQgdGhlIG5leHQgd29ya3F1ZXVlXFxuKyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtxdWV1ZVxcbisgKlxcbisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgb3IgTlVMTCB3aGVuIGRvbmUuXFxuKyAqL1xcbitfX2JwZl9rZnVuYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqXFxuK2JwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFxuK1xcdGlmICgha2l0LVxcdTAwM2Vwb3MpXFx0XFx0XFx0LyogYWxyZWFkeSByZWFjaGVkIHRoZSBlbmQgKi9cXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcbitcXHRpZiAoa2l0LVxcdTAwM2Vwb3MgPT0gQlBGX1dRX0lURVJfU1RBUlQpXFxuK1xcdFxcdGtpdC1cXHUwMDNlcG9zID0gbGlzdF9maXJzdF9vcl9udWxsX3JjdShcXHUwMDI2d29ya3F1ZXVlcyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0a2l0LVxcdTAwM2Vwb3MgPSBsaXN0X25leHRfb3JfbnVsbF9yY3UoXFx1MDAyNndvcmtxdWV1ZXMsIFxcdTAwMjZraXQtXFx1MDAzZXBvcy1cXHUwMDNlbGlzdCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0IHN0cnVjdCB3b3JrcXVldWVfc3RydWN0LCBsaXN0KTtcXG4rXFx0cmV0dXJuIGtpdC1cXHUwMDNlcG9zO1xcbit9XFxuK1xcbisvKipcXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB3b3JrcXVldWUgaXRlcmF0b3JcXG4rICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya3F1ZXVlIHRvIGRlc3Ryb3lcXG4rICovXFxuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpXFxuK3tcXG4rXFx0LyogTm8gcmVmZXJlbmNlcyB0YWtlbjsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi9cXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldygpIC0gSW5pdGlhbGl6ZSBhIHdvcmtlcl9wb29sIGl0ZXJhdG9yXFxuKyAqIEBpdDogVGhlIG5ldyBicGZfaXRlcl93b3JrZXJfcG9vbCB0byBpbml0aWFsaXplXFxuKyAqXFxuKyAqIEl0ZXJhdGVzIGV2ZXJ5IHdvcmtlcl9wb29sIGluIHRoZSBzeXN0ZW0gKHdvcmtlcl9wb29sX2lkcikgaW4gYXNjZW5kaW5nXFxuKyAqIHBvb2wtaWQgb3JkZXIuXFxuKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgUkNVIHJlYWQgbG9jay5cXG4rICovXFxuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcXG4rXFxuK1xcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4pIFxcdTAwM2VcXG4rXFx0XFx0ICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7XFxuK1xcdEJVSUxEX0JVR19PTihfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybikgIT1cXG4rXFx0XFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wpKTtcXG4rXFxuK1xcdGtpdC1cXHUwMDNlaWQgPSAwO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoKSAtIEdldCB0aGUgbmV4dCB3b3JrZXJfcG9vbFxcbisgKiBAaXQ6IFRoZSBicGZfaXRlcl93b3JrZXJfcG9vbFxcbisgKlxcbisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzdHJ1Y3Qgd29ya2VyX3Bvb2wsIG9yIE5VTEwgd2hlbiBkb25lLlxcbisgKi9cXG4rX19icGZfa2Z1bmMgc3RydWN0IHdvcmtlcl9wb29sICpcXG4rYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuICpraXQgPSAodm9pZCAqKWl0O1xcbitcXHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XFxuK1xcbitcXHQvKiBpZHJfZ2V0X25leHQoKSBpcyBSQ1Utc2FmZTsgc2VlIHRoZSBmb3JfZWFjaF9wb29sKCkgbG9jayBsZWdlbmQuICovXFxuK1xcdHBvb2wgPSBpZHJfZ2V0X25leHQoXFx1MDAyNndvcmtlcl9wb29sX2lkciwgXFx1MDAyNmtpdC1cXHUwMDNlaWQpO1xcbitcXHRpZiAocG9vbClcXG4rXFx0XFx0a2l0LVxcdTAwM2VpZCsrO1xcdC8qIGFkdmFuY2UgcGFzdCB0aGlzIHBvb2wgZm9yIHRoZSBuZXh0IGNhbGwgKi9cXG4rXFx0cmV0dXJuIHBvb2w7XFxuK31cXG4rXFxuKy8qKlxcbisgKiBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KCkgLSBEZXN0cm95IGEgd29ya2VyX3Bvb2wgaXRlcmF0b3JcXG4rICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gZGVzdHJveVxcbisgKi9cXG4rX19icGZfa2Z1bmMgdm9pZCBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXFxuK3tcXG4rXFx0LyogTm90aGluZyB0byBiZSBkb25lOyBSQ1UgaXMgaGVsZCBieSB0aGUgY2FsbGVyLiAqL1xcbit9XFxuK1xcbitfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbitcXG4rQlRGX0tGVU5DU19TVEFSVCh3b3JrcXVldWVfaXRlcl9rZnVuY19pZHMpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfbmV3LCBLRl9JVEVSX05FVyB8IEtGX1JDVV9QUk9URUNURUQpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3LCBLRl9JVEVSX05FVyB8IEtGX1JDVV9QUk9URUNURUQpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTClcXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3ksIEtGX0lURVJfREVTVFJPWSlcXG4rQlRGX0tGVU5DU19FTkQod29ya3F1ZXVlX2l0ZXJfa2Z1bmNfaWRzKVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IHdvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCA9IHtcXG4rXFx0Lm93bmVyXFx0PSBUSElTX01PRFVMRSxcXG4rXFx0LnNldFxcdD0gXFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcyxcXG4rfTtcXG4rXFxuKy8qXFxuKyAqIHNlcV9maWxlIGZvcm0gb2YgdGhlIHdvcmtxdWV1ZSBpdGVyYXRvci4gSXQgcmV1c2VzIHRoZSBvcGVuLWNvZGVkXFxuKyAqIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KCkuXFxuKyAqXFxuKyAqIFNpbmNlIHRoZSBvcGVuLWNvZGVkIG5leHQoKSBpcyBLRl9SQ1VfUFJPVEVDVEVELCB0aGUgc2VxIHBhdGggc3VwcGxpZXNcXG4rICogdGhlIFJDVSBzZWN0aW9uIGl0c2VsZi5cXG4rICogc2VxX3N0YXJ0KCkgdGFrZXMgcmN1X3JlYWRfbG9jaygpIGFuZCBob2xkcyBpdCBhY3Jvc3MgdGhlIHdob2xlIHJlYWQgY2h1bmtcXG4rICogKHN0YXJ0Li5zdG9wKS4gUG9zaXRpb24gaXMgcmUtZGVyaXZlZCBmcm9tICpwb3Mgb24gZWFjaCBzdGFydCwgc28gbm90aGluZ1xcbisgKiBpcyBkZXJlZmVyZW5jZWQgYWNyb3NzIHRoZSByY3UgZ2FwIGJldHdlZW4gY2h1bmtzLiBUaGUgYXR0YWNoZWQgQlBGIHByb2dyYW1cXG4rICogbXVzdCBiZSBub24tc2xlZXBhYmxlLlxcbisgKi9cXG4rdW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiB7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgaXQ7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiBraXQ7XFxuK307XFxuK1xcbitzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSB7XFxuK1xcdF9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTtcXG4rXFx0X19icGZfbWRfcHRyKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICosIHdxKTtcXG4rfTtcXG4rXFxuK3N0YXRpYyB2b2lkICp3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxcbit7XFxuK1xcdHVuaW9uIHdvcmtxdWV1ZV9pdGVyX3ByaXYgKnAgPSBzZXEtXFx1MDAzZXByaXZhdGU7XFxuK1xcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcXG4rXFx0bG9mZl90IGNudCA9IDA7XFxuK1xcbitcXHRyY3VfcmVhZF9sb2NrKCk7XFx0LyogaGVsZCB1bnRpbCBzZXFfc3RvcCgpICovXFxuK1xcdGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHdxLCBcXHUwMDI2d29ya3F1ZXVlcywgbGlzdCkge1xcbitcXHRcXHRpZiAoY250ID09ICpwb3MpIHtcXG4rXFx0XFx0XFx0cC1cXHUwMDNla2l0LnBvcyA9IHdxO1xcbitcXHRcXHRcXHRyZXR1cm4gd3E7XFxuK1xcdFxcdH1cXG4rXFx0XFx0Y250Kys7XFxuK1xcdH1cXG4rXFx0cC1cXHUwMDNla2l0LnBvcyA9IE5VTEw7XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqd29ya3F1ZXVlX2l0ZXJfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxcbit7XFxuK1xcdHVuaW9uIHdvcmtxdWV1ZV9pdGVyX3ByaXYgKnAgPSBzZXEtXFx1MDAzZXByaXZhdGU7XFxuK1xcbitcXHQrKypwb3M7XFxuK1xcdHJldHVybiBicGZfaXRlcl93b3JrcXVldWVfbmV4dChcXHUwMDI2cC1cXHUwMDNlaXQpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlIGN0eDtcXG4rXFx0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcXG4rXFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbitcXG4rXFx0bWV0YS5zZXEgPSBzZXE7XFxuK1xcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcXHUwMDI2bWV0YSwgZmFsc2UpO1xcbitcXHRpZiAoIXByb2cpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHRjdHgubWV0YSA9IFxcdTAwMjZtZXRhO1xcbitcXHRjdHgud3EgPSB2O1xcbitcXHRyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXFx1MDAyNmN0eCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlIGN0eDtcXG4rXFx0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcXG4rXFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbitcXG4rXFx0aWYgKCF2KSB7XFxuK1xcdFxcdG1ldGEuc2VxID0gc2VxO1xcbitcXHRcXHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXFx1MDAyNm1ldGEsIHRydWUpO1xcbitcXHRcXHRpZiAocHJvZykge1xcbitcXHRcXHRcXHRjdHgubWV0YSA9IFxcdTAwMjZtZXRhO1xcbitcXHRcXHRcXHRjdHgud3EgPSBOVUxMO1xcbitcXHRcXHRcXHRicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcdC8qIHBhaXJlZCB3aXRoIHNlcV9zdGFydCgpICovXFxuK31cXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd29ya3F1ZXVlX2l0ZXJfc2VxX29wcyA9IHtcXG4rXFx0LnN0YXJ0XFx0PSB3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQsXFxuK1xcdC5uZXh0XFx0PSB3b3JrcXVldWVfaXRlcl9zZXFfbmV4dCxcXG4rXFx0LnN0b3BcXHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wLFxcbitcXHQuc2hvd1xcdD0gd29ya3F1ZXVlX2l0ZXJfc2VxX3Nob3csXFxuK307XFxuK1xcbitERUZJTkVfQlBGX0lURVJfRlVOQyh3b3JrcXVldWUsIHN0cnVjdCBicGZfaXRlcl9tZXRhICptZXRhLFxcbitcXHRcXHQgICAgIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSlcXG4rXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2luZm8gd29ya3F1ZXVlX2l0ZXJfc2VxX2luZm8gPSB7XFxuK1xcdC5zZXFfb3BzXFx0PSBcXHUwMDI2d29ya3F1ZXVlX2l0ZXJfc2VxX29wcyxcXG4rXFx0LnNlcV9wcml2X3NpemVcXHQ9IHNpemVvZih1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2KSxcXG4rfTtcXG4rXFxuK0JURl9JRF9MSVNUX1NJTkdMRSh3b3JrcXVldWVfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtxdWV1ZV9zdHJ1Y3QpXFxuK1xcbitzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3b3JrcXVldWVfaXRlcl9yZWdfaW5mbyA9IHtcXG4rXFx0LnRhcmdldFxcdFxcdFxcdD0gXFxcIndvcmtxdWV1ZVxcXCIsXFxuK1xcdC5jdHhfYXJnX2luZm9fc2l6ZVxcdD0gMSxcXG4rXFx0LmN0eF9hcmdfaW5mb1xcdFxcdD0ge1xcbitcXHRcXHR7IG9mZnNldG9mKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlLCB3cSksXFxuK1xcdFxcdCAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSxcXG4rXFx0fSxcXG4rXFx0LnNlcV9pbmZvXFx0XFx0PSBcXHUwMDI2d29ya3F1ZXVlX2l0ZXJfc2VxX2luZm8sXFxuK307XFxuK1xcbisvKlxcbisgKiBzZXFfZmlsZSBmb3JtIG9mIHRoZSB3b3JrZXJfcG9vbCBpdGVyYXRvcjsgc2FtZSBSQ1UtcGVyLWNodW5rIHNjaGVtZSBhcyB0aGVcXG4rICogd29ya3F1ZXVlIG9uZSwgcmV1c2luZyB0aGUgb3Blbi1jb2RlZCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0KCkuXFxuKyAqL1xcbit1bmlvbiB3b3JrZXJfcG9vbF9pdGVyX3ByaXYge1xcbitcXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgaXQ7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuIGtpdDtcXG4rfTtcXG4rXFxuK3N0cnVjdCBicGZfaXRlcl9fd29ya2VyX3Bvb2wge1xcbitcXHRfX2JwZl9tZF9wdHIoc3RydWN0IGJwZl9pdGVyX21ldGEgKiwgbWV0YSk7XFxuK1xcdF9fYnBmX21kX3B0cihzdHJ1Y3Qgd29ya2VyX3Bvb2wgKiwgcG9vbCk7XFxuK307XFxuK1xcbitzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxcbit7XFxuK1xcdHVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiAqcCA9IHNlcS1cXHUwMDNlcHJpdmF0ZTtcXG4rXFx0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xcbitcXHRsb2ZmX3QgY250ID0gMDtcXG4rXFx0aW50IGlkID0gMDtcXG4rXFxuK1xcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0d2hpbGUgKChwb29sID0gaWRyX2dldF9uZXh0KFxcdTAwMjZ3b3JrZXJfcG9vbF9pZHIsIFxcdTAwMjZpZCkpKSB7XFxuK1xcdFxcdGlmIChjbnQgPT0gKnBvcykge1xcbitcXHRcXHRcXHRwLVxcdTAwM2VraXQuaWQgPSBpZCArIDE7XFxuK1xcdFxcdFxcdHJldHVybiBwb29sO1xcbitcXHRcXHR9XFxuK1xcdFxcdGNudCsrO1xcbitcXHRcXHRpZCsrO1xcbitcXHR9XFxuK1xcdHJldHVybiBOVUxMO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXFxuK3tcXG4rXFx0dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2ICpwID0gc2VxLVxcdTAwM2Vwcml2YXRlO1xcbitcXG4rXFx0KysqcG9zO1xcbitcXHRyZXR1cm4gYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChcXHUwMDI2cC1cXHUwMDNlaXQpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdvcmtlcl9wb29sX2l0ZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCBjdHg7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XFxuK1xcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcXG4rXFxuK1xcdG1ldGEuc2VxID0gc2VxO1xcbitcXHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXFx1MDAyNm1ldGEsIGZhbHNlKTtcXG4rXFx0aWYgKCFwcm9nKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0Y3R4Lm1ldGEgPSBcXHUwMDI2bWV0YTtcXG4rXFx0Y3R4LnBvb2wgPSB2O1xcbitcXHRyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXFx1MDAyNmN0eCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCBjdHg7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XFxuK1xcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcXG4rXFxuK1xcdGlmICghdikge1xcbitcXHRcXHRtZXRhLnNlcSA9IHNlcTtcXG4rXFx0XFx0cHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKFxcdTAwMjZtZXRhLCB0cnVlKTtcXG4rXFx0XFx0aWYgKHByb2cpIHtcXG4rXFx0XFx0XFx0Y3R4Lm1ldGEgPSBcXHUwMDI2bWV0YTtcXG4rXFx0XFx0XFx0Y3R4LnBvb2wgPSBOVUxMO1xcbitcXHRcXHRcXHRicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcXHUwMDI2Y3R4KTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbit9XFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdvcmtlcl9wb29sX2l0ZXJfc2VxX29wcyA9IHtcXG4rXFx0LnN0YXJ0XFx0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydCxcXG4rXFx0Lm5leHRcXHQ9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQsXFxuK1xcdC5zdG9wXFx0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wLFxcbitcXHQuc2hvd1xcdD0gd29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvdyxcXG4rfTtcXG4rXFxuK0RFRklORV9CUEZfSVRFUl9GVU5DKHdvcmtlcl9wb29sLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcXG4rXFx0XFx0ICAgICBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wpXFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIHdvcmtlcl9wb29sX2l0ZXJfc2VxX2luZm8gPSB7XFxuK1xcdC5zZXFfb3BzXFx0PSBcXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9zZXFfb3BzLFxcbitcXHQuc2VxX3ByaXZfc2l6ZVxcdD0gc2l6ZW9mKHVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiksXFxuK307XFxuK1xcbitCVEZfSURfTElTVF9TSU5HTEUod29ya2VyX3Bvb2xfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtlcl9wb29sKVxcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfaXRlcl9yZWcgd29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mbyA9IHtcXG4rXFx0LnRhcmdldFxcdFxcdFxcdD0gXFxcIndvcmtlcl9wb29sXFxcIixcXG4rXFx0LmN0eF9hcmdfaW5mb19zaXplXFx0PSAxLFxcbitcXHQuY3R4X2FyZ19pbmZvXFx0XFx0PSB7XFxuK1xcdFxcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCwgcG9vbCksXFxuK1xcdFxcdCAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSxcXG4rXFx0fSxcXG4rXFx0LnNlcV9pbmZvXFx0XFx0PSBcXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9zZXFfaW5mbyxcXG4rfTtcXG4rXFxuKy8qXFxuKyAqIHNlcS1maWxlIEJQRiBpdGVyYXRvciBvdmVyIHRoZSBwZW5kaW5nIHdvcmsgaXRlbXMgb2YgZXZlcnkgd29ya2VyX3Bvb2wuXFxuKyAqXFxuKyAqIHBvb2wtXFx1MDAzZXdvcmtsaXN0IGlzIHByb3RlY3RlZCBieSBwb29sLVxcdTAwM2Vsb2NrIGFuZCB3b3JrX3N0cnVjdCBoYXMgbmVpdGhlciBhXFxuKyAqIHJlZmNvdW50IG5vciBSQ1UtZnJlZWluZywgc28gYSBwZW5kaW5nIHdvcmsgY2Fubm90IGJlIGhhbmRlZCB0byBhIHN1c3BlbmRlZFxcbisgKiAob3Blbi1jb2RlZCkgaXRlcmF0b3Igc2FmZWx5LlxcbisgKiBJbnN0ZWFkLCBmb3IgZWFjaCBwb29sIGEgYm91bmRlZCBzbmFwc2hvdCBvZiBpdHMgcGVuZGluZyB3b3JrcyBpcyBjb3BpZWQgb3V0XFxuKyAqIHdoaWxlIHBvb2wtXFx1MDAzZWxvY2sgaXMgaGVsZCwgbWlycm9yaW5nIHRoZSBwcmludGtfZGVmZXJyZWQgc2VjdGlvbiBvZlxcbisgKiBzaG93X29uZV93b3JrZXJfcG9vbCgpIGFuZCB0aGVuIHRoZSBsb2NrIGlzIGRyb3BwZWQuXFxuKyAqIFRoZSBCUEYgcHJvZ3JhbSB0aGVuIHJ1bnMgb3ZlciB0aGUgc3RhYmxlIHNuYXBzaG90IHdpdGggbm8gbG9jayBoZWxkLlxcbisgKlxcbisgKiBQb29scyBhcmUgdmlzaXRlZCBpbiB3b3JrZXJfcG9vbF9pZHIgb3JkZXIgKGEgc3RhYmxlIHJlc3VtZSBrZXkpOyBlYWNoIHBvb2wnc1xcbisgKiBzbmFwc2hvdCBsaXZlcyBpbiB0aGUgcGVyc2lzdGVudCBzZXFfcHJpdmF0ZSwgc28gdGhlIHdhbGsgcmVzdW1lcyBjb3JyZWN0bHlcXG4rICogYWNyb3NzIHJlYWQoKSBjaHVua3MuIEEgcG9vbCB3aXRoIG1vcmUgdGhhbiBXUV9QRU5ESU5HX1NOQVBfTUFYIHBlbmRpbmcgd29ya3NcXG4rICogaXMgdHJ1bmNhdGVkIChiZXN0LWVmZm9ydCwgbGlrZSB0aGUga2VybmVsJ3Mgb3duIHdvcmtsaXN0IGR1bXApLlxcbisgKi9cXG4rI2RlZmluZSBXUV9QRU5ESU5HX1NOQVBfTUFYIDEyOFxcbitcXG4rLypcXG4rICogT25lIHByb2plY3RlZCBwZW5kaW5nIHdvcmsgaXRlbSwgYXMgc2VlbiBieSB0aGUgQlBGIHByb2dyYW0uIEFkZHJlc3NlcyBvbmx5XFxuKyAqIC0tIHRoZSBsaXZlIHdvcmtfc3RydWN0IGlzIG5vdCBleHBvc2VkIChpdCBtYXkgYmUgZnJlZWQgYWZ0ZXIgdGhlIGxvY2spLlxcbisgKi9cXG4rc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvIHtcXG4rXFx0X191NjQgcG9vbF9pZDtcXG4rXFx0X191NjQgd29yaztcXG4rXFx0X191NjQgZnVuYztcXG4rfTtcXG4rXFxuK3N0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiB7XFxuK1xcdGludCAgICAgICAgICBuZXh0X3Bvb2w7XFx0Lyogd29ya2VyX3Bvb2xfaWRyIGN1cnNvciBmb3IgdGhlIG5leHQgZmlsbCAqL1xcbitcXHR1bnNpZ25lZCBpbnQgaWR4O1xcdC8qIHBvc2l0aW9uIHdpdGhpbiBzbmFwW10gICAgICAgICAgICAgICAgICAgKi9cXG4rXFx0dW5zaWduZWQgaW50IGNvdW50O1xcdC8qIHZhbGlkIGVudHJpZXMgaW4gc25hcFtdICAgICAgICAgICAgICAgICAgKi9cXG4rXFx0c3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvIHNuYXBbV1FfUEVORElOR19TTkFQX01BWF07XFxuK307XFxuK1xcbitzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsge1xcbitcXHRfX2JwZl9tZF9wdHIoc3RydWN0IGJwZl9pdGVyX21ldGEgKiwgbWV0YSk7XFxuK1xcdF9fYnBmX21kX3B0cihzdHJ1Y3Qgd3FfcGVuZGluZ193b3JrX2luZm8gKiwgaW5mbyk7XFxuK307XFxuK1xcbisvKlxcbisgKiBTbmFwc2hvdCB0aGUgbmV4dCBub24tZW1wdHkgcG9vbCdzIHBlbmRpbmcgd29ya3MgaW50byBwcml2LVxcdTAwM2VzbmFwW10sIGFkdmFuY2luZ1xcbisgKiBwcml2LVxcdTAwM2VuZXh0X3Bvb2wgcGFzdCBpdC4gUmV0dXJucyB0cnVlIGlmIGEgcG9vbCB3YXMgY2FwdHVyZWQsIGZhbHNlIGF0IGVuZC5cXG4rICogcG9vbC1cXHUwMDNlbG9jayBpcyBoZWxkIG9ubHkgZm9yIHRoZSBmaWVsZCBjb3B5OyBSQ1Uga2VlcHMgZWFjaCBwb29sIGFsaXZlLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgd3FfcGVuZGluZ19maWxsKHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiAqcHJpdilcXG4re1xcbitcXHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XFxuK1xcdHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaztcXG4rXFx0aW50IGlkO1xcbitcXG4rXFx0cmN1X3JlYWRfbG9jaygpO1xcbitcXHRmb3IgKGlkID0gcHJpdi1cXHUwMDNlbmV4dF9wb29sOyAocG9vbCA9IGlkcl9nZXRfbmV4dChcXHUwMDI2d29ya2VyX3Bvb2xfaWRyLCBcXHUwMDI2aWQpKTsgaWQrKykge1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgbiA9IDA7XFxuK1xcbitcXHRcXHRyYXdfc3Bpbl9sb2NrX2lycShcXHUwMDI2cG9vbC1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnkod29yaywgXFx1MDAyNnBvb2wtXFx1MDAzZXdvcmtsaXN0LCBlbnRyeSkge1xcbitcXHRcXHRcXHRpZiAobiBcXHUwMDNlPSBXUV9QRU5ESU5HX1NOQVBfTUFYKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0cHJpdi1cXHUwMDNlc25hcFtuXS5wb29sX2lkID0gcG9vbC1cXHUwMDNlaWQ7XFxuK1xcdFxcdFxcdHByaXYtXFx1MDAzZXNuYXBbbl0ud29yayA9IChfX3U2NCkodW5zaWduZWQgbG9uZyl3b3JrO1xcbitcXHRcXHRcXHRwcml2LVxcdTAwM2VzbmFwW25dLmZ1bmMgPSAoX191NjQpKHVuc2lnbmVkIGxvbmcpd29yay1cXHUwMDNlZnVuYztcXG4rXFx0XFx0XFx0bisrO1xcbitcXHRcXHR9XFxuK1xcdFxcdHJhd19zcGluX3VubG9ja19pcnEoXFx1MDAyNnBvb2wtXFx1MDAzZWxvY2spO1xcbitcXG4rXFx0XFx0aWYgKG4pIHtcXG4rXFx0XFx0XFx0cHJpdi1cXHUwMDNlY291bnQgPSBuO1xcbitcXHRcXHRcXHRwcml2LVxcdTAwM2VpZHggPSAwO1xcbitcXHRcXHRcXHRwcml2LVxcdTAwM2VuZXh0X3Bvb2wgPSBpZCArIDE7XFxuK1xcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICp3cV9wZW5kaW5nX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpXFxuK3tcXG4rXFx0c3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2ID0gc2VxLVxcdTAwM2Vwcml2YXRlO1xcbitcXG4rXFx0aWYgKCpwb3MgPT0gMCkge1xcbitcXHRcXHRwcml2LVxcdTAwM2VuZXh0X3Bvb2wgPSAwO1xcbitcXHRcXHRwcml2LVxcdTAwM2VpZHggPSAwO1xcbitcXHRcXHRwcml2LVxcdTAwM2Vjb3VudCA9IDA7XFxuK1xcdH1cXG4rXFx0d2hpbGUgKHByaXYtXFx1MDAzZWlkeCBcXHUwMDNlPSBwcml2LVxcdTAwM2Vjb3VudCkge1xcbitcXHRcXHRpZiAoIXdxX3BlbmRpbmdfZmlsbChwcml2KSlcXG4rXFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdH1cXG4rXFx0cmV0dXJuIFxcdTAwMjZwcml2LVxcdTAwM2VzbmFwW3ByaXYtXFx1MDAzZWlkeF07XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkICp3cV9wZW5kaW5nX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcylcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYgKnByaXYgPSBzZXEtXFx1MDAzZXByaXZhdGU7XFxuK1xcbitcXHQrKypwb3M7XFxuK1xcdHByaXYtXFx1MDAzZWlkeCsrO1xcbitcXHR3aGlsZSAocHJpdi1cXHUwMDNlaWR4IFxcdTAwM2U9IHByaXYtXFx1MDAzZWNvdW50KSB7XFxuK1xcdFxcdGlmICghd3FfcGVuZGluZ19maWxsKHByaXYpKVxcbitcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHRyZXR1cm4gXFx1MDAyNnByaXYtXFx1MDAzZXNuYXBbcHJpdi1cXHUwMDNlaWR4XTtcXG4rfVxcbitcXG4rc3RhdGljIGludCB3cV9wZW5kaW5nX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbit7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayBjdHg7XFxuK1xcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XFxuK1xcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcXG4rXFxuK1xcdG1ldGEuc2VxID0gc2VxO1xcbitcXHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXFx1MDAyNm1ldGEsIGZhbHNlKTtcXG4rXFx0aWYgKCFwcm9nKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0Y3R4Lm1ldGEgPSBcXHUwMDI2bWV0YTtcXG4rXFx0Y3R4LmluZm8gPSB2O1xcbitcXHRyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXFx1MDAyNmN0eCk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHdxX3BlbmRpbmdfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuK3tcXG4rXFx0c3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrIGN0eDtcXG4rXFx0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcXG4rXFx0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xcbitcXG4rXFx0aWYgKHYpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0bWV0YS5zZXEgPSBzZXE7XFxuK1xcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcXHUwMDI2bWV0YSwgdHJ1ZSk7XFxuK1xcdGlmIChwcm9nKSB7XFxuK1xcdFxcdGN0eC5tZXRhID0gXFx1MDAyNm1ldGE7XFxuK1xcdFxcdGN0eC5pbmZvID0gTlVMTDtcXG4rXFx0XFx0YnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXFx1MDAyNmN0eCk7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB3cV9wZW5kaW5nX3NlcV9vcHMgPSB7XFxuK1xcdC5zdGFydFxcdD0gd3FfcGVuZGluZ19zZXFfc3RhcnQsXFxuK1xcdC5uZXh0XFx0PSB3cV9wZW5kaW5nX3NlcV9uZXh0LFxcbitcXHQuc3RvcFxcdD0gd3FfcGVuZGluZ19zZXFfc3RvcCxcXG4rXFx0LnNob3dcXHQ9IHdxX3BlbmRpbmdfc2VxX3Nob3csXFxuK307XFxuK1xcbitERUZJTkVfQlBGX0lURVJfRlVOQyh3b3JrcXVldWVfcGVuZGluZ193b3JrLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcXG4rXFx0XFx0ICAgICBzdHJ1Y3Qgd3FfcGVuZGluZ193b3JrX2luZm8gKmluZm8pXFxuK1xcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIHdxX3BlbmRpbmdfc2VxX2luZm8gPSB7XFxuK1xcdC5zZXFfb3BzXFx0PSBcXHUwMDI2d3FfcGVuZGluZ19zZXFfb3BzLFxcbitcXHQuc2VxX3ByaXZfc2l6ZVxcdD0gc2l6ZW9mKHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiksXFxuK307XFxuK1xcbitCVEZfSURfTElTVF9TSU5HTEUod3FfcGVuZGluZ193b3JrX2luZm9fYnRmX2lkLCBzdHJ1Y3QsIHdxX3BlbmRpbmdfd29ya19pbmZvKVxcbitcXG4rc3RhdGljIHN0cnVjdCBicGZfaXRlcl9yZWcgd3FfcGVuZGluZ19yZWdfaW5mbyA9IHtcXG4rXFx0LnRhcmdldFxcdFxcdFxcdD0gXFxcIndvcmtxdWV1ZV9wZW5kaW5nX3dvcmtcXFwiLFxcbitcXHQuZmVhdHVyZVxcdFxcdD0gQlBGX0lURVJfUkVTQ0hFRCxcXG4rXFx0LmN0eF9hcmdfaW5mb19zaXplXFx0PSAxLFxcbitcXHQuY3R4X2FyZ19pbmZvXFx0XFx0PSB7XFxuK1xcdFxcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrLCBpbmZvKSxcXG4rXFx0XFx0ICBQVFJfVE9fQlRGX0lEX09SX05VTEwgfSxcXG4rXFx0fSxcXG4rXFx0LnNlcV9pbmZvXFx0XFx0PSBcXHUwMDI2d3FfcGVuZGluZ19zZXFfaW5mbyxcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgX19pbml0IGJwZl93b3JrcXVldWVfaXRlcl9pbml0KHZvaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLFxcbitcXHRcXHRcXHRcXHRcXHRcXHUwMDI2d29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0KTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFx0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdTAwMjZ3b3JrcXVldWVfaXRlcl9rZnVuY19zZXQpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0d29ya3F1ZXVlX2l0ZXJfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdvcmtxdWV1ZV9idGZfaWRbMF07XFxuK1xcdHJldCA9IGJwZl9pdGVyX3JlZ190YXJnZXQoXFx1MDAyNndvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHdvcmtlcl9wb29sX2l0ZXJfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdvcmtlcl9wb29sX2J0Zl9pZFswXTtcXG4rXFx0cmV0ID0gYnBmX2l0ZXJfcmVnX3RhcmdldChcXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9yZWdfaW5mbyk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHR3cV9wZW5kaW5nX3JlZ19pbmZvLmN0eF9hcmdfaW5mb1swXS5idGZfaWQgPSB3cV9wZW5kaW5nX3dvcmtfaW5mb19idGZfaWRbMF07XFxuK1xcdHJldHVybiBicGZfaXRlcl9yZWdfdGFyZ2V0KFxcdTAwMjZ3cV9wZW5kaW5nX3JlZ19pbmZvKTtcXG4rfVxcbitsYXRlX2luaXRjYWxsKGJwZl93b3JrcXVldWVfaXRlcl9pbml0KTtcXG4rXFxuKyNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi9cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcXG5pbmRleCA2N2ZmNzg4MjI5OWVjLi42ZGE5M2M0ODY2NTA5IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXFxuQEAgLTM2MSw2ICszNjEsMTYgQEAgZXh0ZXJuIGludCBicGZfaXRlcl9kbWFidWZfbmV3KHN0cnVjdCBicGZfaXRlcl9kbWFidWYgKml0KSBfX3dlYWsgX19rc3ltO1xcbiBleHRlcm4gc3RydWN0IGRtYV9idWYgKmJwZl9pdGVyX2RtYWJ1Zl9uZXh0KHN0cnVjdCBicGZfaXRlcl9kbWFidWYgKml0KSBfX3dlYWsgX19rc3ltO1xcbiBleHRlcm4gdm9pZCBicGZfaXRlcl9kbWFidWZfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcXG4gXFxuK3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWU7XFxuK2V4dGVybiBpbnQgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTtcXG4rZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpicGZfaXRlcl93b3JrcXVldWVfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTtcXG4rZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpIF9fd2VhayBfX2tzeW07XFxuK1xcbitzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2w7XFxuK2V4dGVybiBpbnQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpIF9fd2VhayBfX2tzeW07XFxuK2V4dGVybiBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKmJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkgX193ZWFrIF9fa3N5bTtcXG4rZXh0ZXJuIHZvaWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KSBfX3dlYWsgX19rc3ltO1xcbitcXG4gZXh0ZXJuIGludCBicGZfY2dyb3VwX3JlYWRfeGF0dHIoc3RydWN0IGNncm91cCAqY2dyb3VwLCBjb25zdCBjaGFyICpuYW1lX19zdHIsXFxuIFxcdFxcdFxcdFxcdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqdmFsdWVfcCkgX193ZWFrIF9fa3N5bTtcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3dxX2l0ZXIuY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzMzODNjMjYzYmVlOFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy93cV9pdGVyLmNcXG5AQCAtMCwwICsxLDgwIEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKyNpbmNsdWRlIFxcdTAwM2N0ZXN0X3Byb2dzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJ3cV9pdGVyLnNrZWwuaFxcXCJcXG4rI2luY2x1ZGUgXFxcIndxX2l0ZXJfZmFpbC5za2VsLmhcXFwiXFxuK1xcbitzdGF0aWMgdm9pZCBzdWJ0ZXN0X29wZW5fY29kZWQoc3RydWN0IHdxX2l0ZXIgKnNrZWwpXFxuK3tcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIG9wdHMpO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MuY291bnRfd29ya3F1ZXVlcyksXFxuK1xcdFxcdFxcdFxcdCAgICAgXFx1MDAyNm9wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJydW4gY291bnRfd29ya3F1ZXVlc1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdC8qIFRoZXJlIGFyZSBhbHdheXMgc2V2ZXJhbCBzeXN0ZW0gd29ya3F1ZXVlcyAoZXZlbnRzLCAuLi4pLiAqL1xcbitcXHRBU1NFUlRfR1Qoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2Vucl93b3JrcXVldWVzLCAwLCBcXFwibnJfd29ya3F1ZXVlc1xcXCIpO1xcbitcXG4rXFx0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3MuY291bnRfd29ya2VyX3Bvb2xzKSxcXG4rXFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2b3B0cyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInJ1biBjb3VudF93b3JrZXJfcG9vbHNcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHQvKiBBdCBsZWFzdCB0aGUgcGVyLUNQVSBub3JtYWwvaGlnaHByaSBwb29scyBleGlzdC4gKi9cXG4rXFx0QVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlbnJfd29ya2VyX3Bvb2xzLCAwLCBcXFwibnJfd29ya2VyX3Bvb2xzXFxcIik7XFxuK1xcdEFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZW5yX3BlcmNwdV9wb29scywgMCwgXFxcIm5yX3BlcmNwdV9wb29sc1xcXCIpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBkcmFpbl9pdGVyKHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZywgY29uc3QgY2hhciAqbmFtZSlcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbms7XFxuK1xcdGNoYXIgYnVmWzUxMl07XFxuK1xcdGludCBpdGVyX2ZkO1xcbitcXHRzc2l6ZV90IG47XFxuK1xcbitcXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHByb2csIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIobGluaywgbmFtZSkpXFxuK1xcdFxcdHJldHVybjtcXG4rXFx0aXRlcl9mZCA9IGJwZl9pdGVyX2NyZWF0ZShicGZfbGlua19fZmQobGluaykpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShpdGVyX2ZkLCAwLCBcXFwiaXRlcl9jcmVhdGVcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdHdoaWxlICgobiA9IHJlYWQoaXRlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSkpIFxcdTAwM2UgMClcXG4rXFx0XFx0O1xcbitcXHRBU1NFUlRfR0UobiwgMCwgXFxcInJlYWQgaXRlclxcXCIpO1xcbitcXHRjbG9zZShpdGVyX2ZkKTtcXG4rb3V0OlxcbitcXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgc3VidGVzdF9zZXEoc3RydWN0IHdxX2l0ZXIgKnNrZWwpXFxuK3tcXG4rXFx0Lyogc2VxIGZvcm1zIGFyZSBiYWNrZWQgYnkgdGhlIHNhbWUgb3Blbi1jb2RlZCBuZXh0KCkuICovXFxuK1xcdGRyYWluX2l0ZXIoc2tlbC1cXHUwMDNlcHJvZ3MuZHVtcF93b3JrcXVldWVzLCBcXFwiYXR0YWNoIHdvcmtxdWV1ZSBpdGVyXFxcIik7XFxuK1xcdEFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZW5yX3dxX3NlcSwgMCwgXFxcIm5yX3dxX3NlcVxcXCIpO1xcbitcXG4rXFx0ZHJhaW5faXRlcihza2VsLVxcdTAwM2Vwcm9ncy5kdW1wX3dvcmtlcl9wb29scywgXFxcImF0dGFjaCB3b3JrZXJfcG9vbCBpdGVyXFxcIik7XFxuK1xcdEFTU0VSVF9HVChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZW5yX3Bvb2xfc2VxLCAwLCBcXFwibnJfcG9vbF9zZXFcXFwiKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIHdvcmtsaXN0cyBhcmUgdXN1YWxseSBlbXB0eSBvbiBhbiBpZGxlIHN5c3RlbTsgdGhpcyBkcml2ZXMgdGhlIHdob2xlXFxuK1xcdCAqIHBlci1wb29sIHNuYXBzaG90IHBhdGggYW5kIHZlcmlmaWVzIGl0IGRyYWlucyBjbGVhbmx5LlxcbitcXHQgKi9cXG4rXFx0ZHJhaW5faXRlcihza2VsLVxcdTAwM2Vwcm9ncy5kdW1wX3BlbmRpbmcsIFxcXCJhdHRhY2ggcGVuZGluZ193b3JrIGl0ZXJcXFwiKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X3dxX2l0ZXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfaXRlciAqc2tlbDtcXG4rXFxuK1xcdHNrZWwgPSB3cV9pdGVyX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwid3FfaXRlcl9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwib3Blbl9jb2RlZFxcXCIpKVxcbitcXHRcXHRzdWJ0ZXN0X29wZW5fY29kZWQoc2tlbCk7XFxuK1xcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJzZXFcXFwiKSlcXG4rXFx0XFx0c3VidGVzdF9zZXEoc2tlbCk7XFxuK1xcbitcXHR3cV9pdGVyX19kZXN0cm95KHNrZWwpO1xcbitcXG4rXFx0UlVOX1RFU1RTKHdxX2l0ZXJfZmFpbCk7XFxuK31cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy93cV9pdGVyLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjE1ZjA4MWJjNjM0YjZcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXIuY1xcbkBAIC0wLDAgKzEsOTUgQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuK1xcbitjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG4rXFxuK3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltO1xcbit2b2lkIGJwZl9yY3VfcmVhZF91bmxvY2sodm9pZCkgX19rc3ltO1xcbitcXG4rLyogUmVzdWx0cywgY2hlY2tlZCBieSB1c2Vyc3BhY2UuICovXFxuK2ludCBucl93b3JrcXVldWVzO1xcbitpbnQgbnJfd29ya2VyX3Bvb2xzO1xcbitpbnQgbnJfcGVyY3B1X3Bvb2xzO1xcbitpbnQgbnJfd3Ffc2VxO1xcbitpbnQgbnJfcG9vbF9zZXE7XFxuK2ludCBucl9wZW5kaW5nO1xcbitcXG4rLyogLS0tIG9wZW4tY29kZWQgaXRlcmF0b3JzIChLRl9SQ1VfUFJPVEVDVEVEKSAtLS0gKi9cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCBjb3VudF93b3JrcXVldWVzKGNvbnN0IHZvaWQgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7XFxuK1xcdGludCBuID0gMDtcXG4rXFxuK1xcdGJwZl9yY3VfcmVhZF9sb2NrKCk7XFxuK1xcdGJwZl9mb3JfZWFjaCh3b3JrcXVldWUsIHdxKVxcbitcXHRcXHRuKys7XFxuK1xcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcXG4rXFxuK1xcdG5yX3dvcmtxdWV1ZXMgPSBuO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJzeXNjYWxsXFxcIilcXG4raW50IGNvdW50X3dvcmtlcl9wb29scyhjb25zdCB2b2lkICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xcbitcXHRpbnQgbiA9IDAsIHBlcmNwdSA9IDA7XFxuK1xcbitcXHRicGZfcmN1X3JlYWRfbG9jaygpO1xcbitcXHRicGZfZm9yX2VhY2god29ya2VyX3Bvb2wsIHBvb2wpIHtcXG4rXFx0XFx0bisrO1xcbitcXHRcXHRpZiAocG9vbC1cXHUwMDNlY3B1IFxcdTAwM2U9IDApXFx0XFx0LyogcGVyLUNQVSBwb29sICovXFxuK1xcdFxcdFxcdHBlcmNwdSsrO1xcbitcXHR9XFxuK1xcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcXG4rXFxuK1xcdG5yX3dvcmtlcl9wb29scyA9IG47XFxuK1xcdG5yX3BlcmNwdV9wb29scyA9IHBlcmNwdTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIC0tLSBzZXFfZmlsZSBpdGVyYXRvcnMgLS0tICovXFxuK1xcbitTRUMoXFxcIml0ZXIvd29ya3F1ZXVlXFxcIilcXG4raW50IGR1bXBfd29ya3F1ZXVlcyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCBzZXFfZmlsZSAqc2VxID0gY3R4LVxcdTAwM2VtZXRhLVxcdTAwM2VzZXE7XFxuK1xcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGN0eC1cXHUwMDNld3E7XFxuK1xcbitcXHRpZiAoIXdxKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0bnJfd3Ffc2VxKys7XFxuK1xcdEJQRl9TRVFfUFJJTlRGKHNlcSwgXFxcIiVzXFxcXG5cXFwiLCB3cS1cXHUwMDNlbmFtZSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIvd29ya2VyX3Bvb2xcXFwiKVxcbitpbnQgZHVtcF93b3JrZXJfcG9vbHMoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbCA9IGN0eC1cXHUwMDNlcG9vbDtcXG4rXFxuK1xcdGlmICghcG9vbClcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdG5yX3Bvb2xfc2VxKys7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitTRUMoXFxcIml0ZXIvd29ya3F1ZXVlX3BlbmRpbmdfd29ya1xcXCIpXFxuK2ludCBkdW1wX3BlbmRpbmcoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtXFx1MDAzZW1ldGEtXFx1MDAzZXNlcTtcXG4rXFx0c3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvID0gY3R4LVxcdTAwM2VpbmZvO1xcbitcXG4rXFx0aWYgKCFpbmZvKVxcdFxcdFxcdC8qIGZpbmFsIGNhbGwgKi9cXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRucl9wZW5kaW5nKys7XFxuK1xcdEJQRl9TRVFfUFJJTlRGKHNlcSwgXFxcInBvb2wgJWxsdSB3b3JrIDB4JWxseCBmdW5jIDB4JWxseFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIGluZm8tXFx1MDAzZXBvb2xfaWQsIGluZm8tXFx1MDAzZXdvcmssIGluZm8tXFx1MDAzZWZ1bmMpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmZiMmRjZjk4NDdlMmJcXG4tLS0gL2Rldi9udWxsXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXJfZmFpbC5jXFxuQEAgLTAsMCArMSwzNyBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisjaW5jbHVkZSBcXFwidm1saW51eC5oXFxcIlxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX3RyYWNpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFxcImJwZl9taXNjLmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuK1xcbitjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrcXVldWUgYW5kIHdvcmtlcl9wb29sIG9wZW4tY29kZWQgaXRlcmF0b3JzIGFyZSBLRl9SQ1VfUFJPVEVDVEVEOlxcbisgKiB1c2luZyB0aGVtIG91dHNpZGUgYSBicGZfcmN1X3JlYWRfbG9jaygpIHJlZ2lvbiBtdXN0IGJlIHJlamVjdGVkLlxcbisgKi9cXG4rXFxuK1NFQyhcXFwiP3N5c2NhbGxcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcImtlcm5lbCBmdW5jIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblxcXCIpXFxuK2ludCB3b3JrcXVldWVfaXRlcl9ub19yY3UoY29uc3Qgdm9pZCAqY3R4KVxcbit7XFxuK1xcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcXG4rXFx0aW50IG4gPSAwO1xcbitcXG4rXFx0YnBmX2Zvcl9lYWNoKHdvcmtxdWV1ZSwgd3EpXFxuK1xcdFxcdG4rKztcXG4rXFx0cmV0dXJuIG47XFxuK31cXG4rXFxuK1NFQyhcXFwiP3N5c2NhbGxcXFwiKVxcbitfX2ZhaWx1cmUgX19tc2coXFxcImtlcm5lbCBmdW5jIGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldyByZXF1aXJlcyBSQ1UgY3JpdGljYWwgc2VjdGlvbiBwcm90ZWN0aW9uXFxcIilcXG4raW50IHdvcmtlcl9wb29sX2l0ZXJfbm9fcmN1KGNvbnN0IHZvaWQgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XFxuK1xcdGludCBuID0gMDtcXG4rXFxuK1xcdGJwZl9mb3JfZWFjaCh3b3JrZXJfcG9vbCwgcG9vbClcXG4rXFx0XFx0bisrO1xcbitcXHRyZXR1cm4gbjtcXG4rfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTozNS43MzU4MjkxOTZaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJiZXN0LWV4cGVuc2l2ZSIsIkR1cmF0aW9uIjoxNjM2MTU4NTYzNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdcIixcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveVwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnRcIixcbiAgICBcIndvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc2hvd1wiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3BcIixcbiAgICBcIndvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wXCIsXG4gICAgXCJ3cV9wZW5kaW5nX2ZpbGxcIixcbiAgICBcIndxX3BlbmRpbmdfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9uZXh0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zaG93XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zdG9wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBlNjkzMzZkNjlhOWVjMzAxMzM3OWMyMzBmMmY4NGEwYmQwODBjNmNkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBKdWwgMjkgMDQ6MDE6MzQgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmNcbmluZGV4IDc4MDY4YWU4ZjI4YTYuLjZlODc5NDkwYzgxMWEgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmNcbisrKyBiL2tlcm5lbC93b3JrcXVldWUuY1xuQEAgLTU2LDYgKzU2LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9rdm1fcGFyYS5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZGVsYXkuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2lycV93b3JrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idGZfaWRzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuICNpbmNsdWRlIFwid29ya3F1ZXVlX2ludGVybmFsLmhcIlxuIFxuQEAgLTg0NzMsMyArODQ3NSw1NTcgQEAgc3RhdGljIGludCBfX2luaXQgd29ya3F1ZXVlX3VuYm91bmRfY3B1c19zZXR1cChjaGFyICpzdHIpXG4gXHRyZXR1cm4gMTtcbiB9XG4gX19zZXR1cChcIndvcmtxdWV1ZS51bmJvdW5kX2NwdXM9XCIsIHdvcmtxdWV1ZV91bmJvdW5kX2NwdXNfc2V0dXApO1xuK1xuKyNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcbitcbisvKlxuKyAqIEJQRiBvcGVuLWNvZGVkIGl0ZXJhdG9yIG92ZXIgYWxsIHdvcmtxdWV1ZXMuXG4rICpcbisgKiBXYWxrcyB0aGUgZ2xvYmFsIEB3b3JrcXVldWVzIGxpc3QsIGxldHRpbmcgQlBGIHByb2dyYW1zIHJlYWQgbGl2ZSB3b3JrcXVldWVcbisgKiBzdGF0ZS5cbisgKlxuKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIGJwZl9yY3VfcmVhZF9sb2NrKCkgYWNyb3NzIG5ldygpLVx1MDAzZW5leHQoKS1cdTAwM2VkZXN0cm95KCkuXG4rICovXG4rXG4rLyogU2VudGluZWwgZm9yIFwibmV3KCkgZG9uZSwgbmV4dCgpIG5vdCB5ZXQgY2FsbGVkXCIgdnMgXCJpdGVyYXRpb24gZW5kZWRcIi4gKi9cbisjZGVmaW5lIEJQRl9XUV9JVEVSX1NUQVJUICgodm9pZCAqKTFMKVxuK1xuK3N0cnVjdCBicGZfaXRlcl93b3JrcXVldWUge1xuK1x0X191NjQgX19vcGFxdWVbMV07XG4rfSBfX2FsaWduZWQoOCk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuIHtcbitcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwb3M7XG4rfSBfX2FsaWduZWQoOCk7XG4rXG4rc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sIHtcbitcdF9fdTY0IF9fb3BhcXVlWzFdO1xuK30gX19hbGlnbmVkKDgpO1xuK1xuK3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuIHtcbitcdGludCBpZDtcdFx0LyogbmV4dCB3b3JrZXJfcG9vbF9pZHIgaWQgdG8gc2VhcmNoIGZyb20gKi9cbit9IF9fYWxpZ25lZCg4KTtcbitcbitfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX25ldygpIC0gSW5pdGlhbGl6ZSBhIHdvcmtxdWV1ZSBpdGVyYXRvclxuKyAqIEBpdDogVGhlIG5ldyBicGZfaXRlcl93b3JrcXVldWUgdG8gaW5pdGlhbGl6ZVxuKyAqXG4rICogSXRlcmF0ZXMgZXZlcnkgd29ya3F1ZXVlIG9uIHRoZSBnbG9iYWwgQHdvcmtxdWV1ZXMgbGlzdC4gTXVzdCBiZSB1c2VkIGluc2lkZVxuKyAqIGEgYnBmX3JjdV9yZWFkX2xvY2soKSByZWdpb24gKEtGX1JDVV9QUk9URUNURUQpLlxuKyAqL1xuK19fYnBmX2tmdW5jIGludCBicGZfaXRlcl93b3JrcXVldWVfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybiAqa2l0ID0gKHZvaWQgKilpdDtcbitcbitcdEJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuKSBcdTAwM2VcbitcdFx0ICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSkpO1xuK1x0QlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWVfa2VybikgIT1cbitcdFx0ICAgICBfX2FsaWdub2ZfXyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlKSk7XG4rXG4rXHRraXQtXHUwMDNlcG9zID0gQlBGX1dRX0lURVJfU1RBUlQ7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoKSAtIEdldCB0aGUgbmV4dCB3b3JrcXVldWVcbisgKiBAaXQ6IFRoZSBicGZfaXRlcl93b3JrcXVldWVcbisgKlxuKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHN0cnVjdCB3b3JrcXVldWVfc3RydWN0LCBvciBOVUxMIHdoZW4gZG9uZS5cbisgKi9cbitfX2JwZl9rZnVuYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqXG4rYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZV9rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuK1xuK1x0aWYgKCFraXQtXHUwMDNlcG9zKVx0XHRcdC8qIGFscmVhZHkgcmVhY2hlZCB0aGUgZW5kICovXG4rXHRcdHJldHVybiBOVUxMO1xuK1xuK1x0aWYgKGtpdC1cdTAwM2Vwb3MgPT0gQlBGX1dRX0lURVJfU1RBUlQpXG4rXHRcdGtpdC1cdTAwM2Vwb3MgPSBsaXN0X2ZpcnN0X29yX251bGxfcmN1KFx1MDAyNndvcmtxdWV1ZXMsXG4rXHRcdFx0XHRcdFx0ICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XG4rXHRlbHNlXG4rXHRcdGtpdC1cdTAwM2Vwb3MgPSBsaXN0X25leHRfb3JfbnVsbF9yY3UoXHUwMDI2d29ya3F1ZXVlcywgXHUwMDI2a2l0LVx1MDAzZXBvcy1cdTAwM2VsaXN0LFxuK1x0XHRcdFx0XHRcdCBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCwgbGlzdCk7XG4rXHRyZXR1cm4ga2l0LVx1MDAzZXBvcztcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSB3b3JrcXVldWUgaXRlcmF0b3JcbisgKiBAaXQ6IFRoZSBicGZfaXRlcl93b3JrcXVldWUgdG8gZGVzdHJveVxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3koc3RydWN0IGJwZl9pdGVyX3dvcmtxdWV1ZSAqaXQpXG4re1xuK1x0LyogTm8gcmVmZXJlbmNlcyB0YWtlbjsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi9cbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KCkgLSBJbml0aWFsaXplIGEgd29ya2VyX3Bvb2wgaXRlcmF0b3JcbisgKiBAaXQ6IFRoZSBuZXcgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gaW5pdGlhbGl6ZVxuKyAqXG4rICogSXRlcmF0ZXMgZXZlcnkgd29ya2VyX3Bvb2wgaW4gdGhlIHN5c3RlbSAod29ya2VyX3Bvb2xfaWRyKSBpbiBhc2NlbmRpbmdcbisgKiBwb29sLWlkIG9yZGVyLlxuKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgUkNVIHJlYWQgbG9jay5cbisgKi9cbitfX2JwZl9rZnVuYyBpbnQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpXG4re1xuK1x0c3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4gKmtpdCA9ICh2b2lkICopaXQ7XG4rXG4rXHRCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuKSBcdTAwM2VcbitcdFx0ICAgICBzaXplb2Yoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7XG4rXHRCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sX2tlcm4pICE9XG4rXHRcdCAgICAgX19hbGlnbm9mX18oc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sKSk7XG4rXG4rXHRraXQtXHUwMDNlaWQgPSAwO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qKlxuKyAqIGJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoKSAtIEdldCB0aGUgbmV4dCB3b3JrZXJfcG9vbFxuKyAqIEBpdDogVGhlIGJwZl9pdGVyX3dvcmtlcl9wb29sXG4rICpcbisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBzdHJ1Y3Qgd29ya2VyX3Bvb2wsIG9yIE5VTEwgd2hlbiBkb25lLlxuKyAqL1xuK19fYnBmX2tmdW5jIHN0cnVjdCB3b3JrZXJfcG9vbCAqXG4rYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbF9rZXJuICpraXQgPSAodm9pZCAqKWl0O1xuK1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuK1xuK1x0LyogaWRyX2dldF9uZXh0KCkgaXMgUkNVLXNhZmU7IHNlZSB0aGUgZm9yX2VhY2hfcG9vbCgpIGxvY2sgbGVnZW5kLiAqL1xuK1x0cG9vbCA9IGlkcl9nZXRfbmV4dChcdTAwMjZ3b3JrZXJfcG9vbF9pZHIsIFx1MDAyNmtpdC1cdTAwM2VpZCk7XG4rXHRpZiAocG9vbClcbitcdFx0a2l0LVx1MDAzZWlkKys7XHQvKiBhZHZhbmNlIHBhc3QgdGhpcyBwb29sIGZvciB0aGUgbmV4dCBjYWxsICovXG4rXHRyZXR1cm4gcG9vbDtcbit9XG4rXG4rLyoqXG4rICogYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSgpIC0gRGVzdHJveSBhIHdvcmtlcl9wb29sIGl0ZXJhdG9yXG4rICogQGl0OiBUaGUgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgdG8gZGVzdHJveVxuKyAqL1xuK19fYnBmX2tmdW5jIHZvaWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KVxuK3tcbitcdC8qIE5vdGhpbmcgdG8gYmUgZG9uZTsgUkNVIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4gKi9cbit9XG4rXG4rX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbitcbitCVEZfS0ZVTkNTX1NUQVJUKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcylcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrcXVldWVfbmV4dCwgS0ZfSVRFUl9ORVhUIHwgS0ZfUkVUX05VTEwpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95LCBLRl9JVEVSX0RFU1RST1kpXG4rQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldywgS0ZfSVRFUl9ORVcgfCBLRl9SQ1VfUFJPVEVDVEVEKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0LCBLRl9JVEVSX05FWFQgfCBLRl9SRVRfTlVMTClcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveSwgS0ZfSVRFUl9ERVNUUk9ZKVxuK0JURl9LRlVOQ1NfRU5EKHdvcmtxdWV1ZV9pdGVyX2tmdW5jX2lkcylcbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgd29ya3F1ZXVlX2l0ZXJfa2Z1bmNfc2V0ID0ge1xuK1x0Lm93bmVyXHQ9IFRISVNfTU9EVUxFLFxuK1x0LnNldFx0PSBcdTAwMjZ3b3JrcXVldWVfaXRlcl9rZnVuY19pZHMsXG4rfTtcbitcbisvKlxuKyAqIHNlcV9maWxlIGZvcm0gb2YgdGhlIHdvcmtxdWV1ZSBpdGVyYXRvci4gSXQgcmV1c2VzIHRoZSBvcGVuLWNvZGVkXG4rICogYnBmX2l0ZXJfd29ya3F1ZXVlX25leHQoKS5cbisgKlxuKyAqIFNpbmNlIHRoZSBvcGVuLWNvZGVkIG5leHQoKSBpcyBLRl9SQ1VfUFJPVEVDVEVELCB0aGUgc2VxIHBhdGggc3VwcGxpZXNcbisgKiB0aGUgUkNVIHNlY3Rpb24gaXRzZWxmLlxuKyAqIHNlcV9zdGFydCgpIHRha2VzIHJjdV9yZWFkX2xvY2soKSBhbmQgaG9sZHMgaXQgYWNyb3NzIHRoZSB3aG9sZSByZWFkIGNodW5rXG4rICogKHN0YXJ0Li5zdG9wKS4gUG9zaXRpb24gaXMgcmUtZGVyaXZlZCBmcm9tICpwb3Mgb24gZWFjaCBzdGFydCwgc28gbm90aGluZ1xuKyAqIGlzIGRlcmVmZXJlbmNlZCBhY3Jvc3MgdGhlIHJjdSBnYXAgYmV0d2VlbiBjaHVua3MuIFRoZSBhdHRhY2hlZCBCUEYgcHJvZ3JhbVxuKyAqIG11c3QgYmUgbm9uLXNsZWVwYWJsZS5cbisgKi9cbit1bmlvbiB3b3JrcXVldWVfaXRlcl9wcml2IHtcbitcdHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgaXQ7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlX2tlcm4ga2l0O1xuK307XG4rXG4rc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWUge1xuK1x0X19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpO1xuK1x0X19icGZfbWRfcHRyKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICosIHdxKTtcbit9O1xuK1xuK3N0YXRpYyB2b2lkICp3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxuK3tcbitcdHVuaW9uIHdvcmtxdWV1ZV9pdGVyX3ByaXYgKnAgPSBzZXEtXHUwMDNlcHJpdmF0ZTtcbitcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcbitcdGxvZmZfdCBjbnQgPSAwO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1x0LyogaGVsZCB1bnRpbCBzZXFfc3RvcCgpICovXG4rXHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh3cSwgXHUwMDI2d29ya3F1ZXVlcywgbGlzdCkge1xuK1x0XHRpZiAoY250ID09ICpwb3MpIHtcbitcdFx0XHRwLVx1MDAzZWtpdC5wb3MgPSB3cTtcbitcdFx0XHRyZXR1cm4gd3E7XG4rXHRcdH1cbitcdFx0Y250Kys7XG4rXHR9XG4rXHRwLVx1MDAzZWtpdC5wb3MgPSBOVUxMO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICp3b3JrcXVldWVfaXRlcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXG4re1xuK1x0dW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiAqcCA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuK1xuK1x0KysqcG9zO1xuK1x0cmV0dXJuIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KFx1MDAyNnAtXHUwMDNlaXQpO1xuK31cbitcbitzdGF0aWMgaW50IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlIGN0eDtcbitcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4rXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4rXG4rXHRtZXRhLnNlcSA9IHNlcTtcbitcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcdTAwMjZtZXRhLCBmYWxzZSk7XG4rXHRpZiAoIXByb2cpXG4rXHRcdHJldHVybiAwO1xuK1x0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuK1x0Y3R4LndxID0gdjtcbitcdHJldHVybiBicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcdTAwMjZjdHgpO1xuK31cbitcbitzdGF0aWMgdm9pZCB3b3JrcXVldWVfaXRlcl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbit7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSBjdHg7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhO1xuK1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuK1xuK1x0aWYgKCF2KSB7XG4rXHRcdG1ldGEuc2VxID0gc2VxO1xuK1x0XHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgdHJ1ZSk7XG4rXHRcdGlmIChwcm9nKSB7XG4rXHRcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuK1x0XHRcdGN0eC53cSA9IE5VTEw7XG4rXHRcdFx0YnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXHUwMDI2Y3R4KTtcbitcdFx0fVxuK1x0fVxuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XHQvKiBwYWlyZWQgd2l0aCBzZXFfc3RhcnQoKSAqL1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdvcmtxdWV1ZV9pdGVyX3NlcV9vcHMgPSB7XG4rXHQuc3RhcnRcdD0gd29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0LFxuK1x0Lm5leHRcdD0gd29ya3F1ZXVlX2l0ZXJfc2VxX25leHQsXG4rXHQuc3RvcFx0PSB3b3JrcXVldWVfaXRlcl9zZXFfc3RvcCxcbitcdC5zaG93XHQ9IHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93LFxuK307XG4rXG4rREVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcbitcdFx0ICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpXG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3b3JrcXVldWVfaXRlcl9zZXFfaW5mbyA9IHtcbitcdC5zZXFfb3BzXHQ9IFx1MDAyNndvcmtxdWV1ZV9pdGVyX3NlcV9vcHMsXG4rXHQuc2VxX3ByaXZfc2l6ZVx0PSBzaXplb2YodW5pb24gd29ya3F1ZXVlX2l0ZXJfcHJpdiksXG4rfTtcbitcbitCVEZfSURfTElTVF9TSU5HTEUod29ya3F1ZXVlX2J0Zl9pZCwgc3RydWN0LCB3b3JrcXVldWVfc3RydWN0KVxuK1xuK3N0YXRpYyBzdHJ1Y3QgYnBmX2l0ZXJfcmVnIHdvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvID0ge1xuK1x0LnRhcmdldFx0XHRcdD0gXCJ3b3JrcXVldWVcIixcbitcdC5jdHhfYXJnX2luZm9fc2l6ZVx0PSAxLFxuK1x0LmN0eF9hcmdfaW5mb1x0XHQ9IHtcbitcdFx0eyBvZmZzZXRvZihzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZSwgd3EpLFxuK1x0XHQgIFBUUl9UT19CVEZfSURfT1JfTlVMTCB8IFBUUl9UUlVTVEVEIH0sXG4rXHR9LFxuK1x0LnNlcV9pbmZvXHRcdD0gXHUwMDI2d29ya3F1ZXVlX2l0ZXJfc2VxX2luZm8sXG4rfTtcbitcbisvKlxuKyAqIHNlcV9maWxlIGZvcm0gb2YgdGhlIHdvcmtlcl9wb29sIGl0ZXJhdG9yOyBzYW1lIFJDVS1wZXItY2h1bmsgc2NoZW1lIGFzIHRoZVxuKyAqIHdvcmtxdWV1ZSBvbmUsIHJldXNpbmcgdGhlIG9wZW4tY29kZWQgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dCgpLlxuKyAqL1xuK3VuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiB7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgaXQ7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfa2VybiBraXQ7XG4rfTtcbitcbitzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIHtcbitcdF9fYnBmX21kX3B0cihzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqLCBtZXRhKTtcbitcdF9fYnBmX21kX3B0cihzdHJ1Y3Qgd29ya2VyX3Bvb2wgKiwgcG9vbCk7XG4rfTtcbitcbitzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKVxuK3tcbitcdHVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiAqcCA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuK1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuK1x0bG9mZl90IGNudCA9IDA7XG4rXHRpbnQgaWQgPSAwO1xuK1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0d2hpbGUgKChwb29sID0gaWRyX2dldF9uZXh0KFx1MDAyNndvcmtlcl9wb29sX2lkciwgXHUwMDI2aWQpKSkge1xuK1x0XHRpZiAoY250ID09ICpwb3MpIHtcbitcdFx0XHRwLVx1MDAzZWtpdC5pZCA9IGlkICsgMTtcbitcdFx0XHRyZXR1cm4gcG9vbDtcbitcdFx0fVxuK1x0XHRjbnQrKztcbitcdFx0aWQrKztcbitcdH1cbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqd29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXG4re1xuK1x0dW5pb24gd29ya2VyX3Bvb2xfaXRlcl9wcml2ICpwID0gc2VxLVx1MDAzZXByaXZhdGU7XG4rXG4rXHQrKypwb3M7XG4rXHRyZXR1cm4gYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dChcdTAwMjZwLVx1MDAzZWl0KTtcbit9XG4rXG4rc3RhdGljIGludCB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9fd29ya2VyX3Bvb2wgY3R4O1xuK1x0c3RydWN0IGJwZl9pdGVyX21ldGEgbWV0YTtcbitcdHN0cnVjdCBicGZfcHJvZyAqcHJvZztcbitcbitcdG1ldGEuc2VxID0gc2VxO1xuK1x0cHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKFx1MDAyNm1ldGEsIGZhbHNlKTtcbitcdGlmICghcHJvZylcbitcdFx0cmV0dXJuIDA7XG4rXHRjdHgubWV0YSA9IFx1MDAyNm1ldGE7XG4rXHRjdHgucG9vbCA9IHY7XG4rXHRyZXR1cm4gYnBmX2l0ZXJfcnVuX3Byb2cocHJvZywgXHUwMDI2Y3R4KTtcbit9XG4rXG4rc3RhdGljIHZvaWQgd29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbit7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtlcl9wb29sIGN0eDtcbitcdHN0cnVjdCBicGZfaXRlcl9tZXRhIG1ldGE7XG4rXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7XG4rXG4rXHRpZiAoIXYpIHtcbitcdFx0bWV0YS5zZXEgPSBzZXE7XG4rXHRcdHByb2cgPSBicGZfaXRlcl9nZXRfaW5mbyhcdTAwMjZtZXRhLCB0cnVlKTtcbitcdFx0aWYgKHByb2cpIHtcbitcdFx0XHRjdHgubWV0YSA9IFx1MDAyNm1ldGE7XG4rXHRcdFx0Y3R4LnBvb2wgPSBOVUxMO1xuK1x0XHRcdGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4rXHRcdH1cbitcdH1cbitcdHJjdV9yZWFkX3VubG9jaygpO1xuK31cbitcbitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHdvcmtlcl9wb29sX2l0ZXJfc2VxX29wcyA9IHtcbitcdC5zdGFydFx0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydCxcbitcdC5uZXh0XHQ9IHdvcmtlcl9wb29sX2l0ZXJfc2VxX25leHQsXG4rXHQuc3RvcFx0PSB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wLFxuK1x0LnNob3dcdD0gd29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvdyxcbit9O1xuK1xuK0RFRklORV9CUEZfSVRFUl9GVU5DKHdvcmtlcl9wb29sLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSxcbitcdFx0ICAgICBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2wpXG4rXG4rc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfaXRlcl9zZXFfaW5mbyB3b3JrZXJfcG9vbF9pdGVyX3NlcV9pbmZvID0ge1xuK1x0LnNlcV9vcHNcdD0gXHUwMDI2d29ya2VyX3Bvb2xfaXRlcl9zZXFfb3BzLFxuK1x0LnNlcV9wcml2X3NpemVcdD0gc2l6ZW9mKHVuaW9uIHdvcmtlcl9wb29sX2l0ZXJfcHJpdiksXG4rfTtcbitcbitCVEZfSURfTElTVF9TSU5HTEUod29ya2VyX3Bvb2xfYnRmX2lkLCBzdHJ1Y3QsIHdvcmtlcl9wb29sKVxuK1xuK3N0YXRpYyBzdHJ1Y3QgYnBmX2l0ZXJfcmVnIHdvcmtlcl9wb29sX2l0ZXJfcmVnX2luZm8gPSB7XG4rXHQudGFyZ2V0XHRcdFx0PSBcIndvcmtlcl9wb29sXCIsXG4rXHQuY3R4X2FyZ19pbmZvX3NpemVcdD0gMSxcbitcdC5jdHhfYXJnX2luZm9cdFx0PSB7XG4rXHRcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCwgcG9vbCksXG4rXHRcdCAgUFRSX1RPX0JURl9JRF9PUl9OVUxMIHwgUFRSX1RSVVNURUQgfSxcbitcdH0sXG4rXHQuc2VxX2luZm9cdFx0PSBcdTAwMjZ3b3JrZXJfcG9vbF9pdGVyX3NlcV9pbmZvLFxuK307XG4rXG4rLypcbisgKiBzZXEtZmlsZSBCUEYgaXRlcmF0b3Igb3ZlciB0aGUgcGVuZGluZyB3b3JrIGl0ZW1zIG9mIGV2ZXJ5IHdvcmtlcl9wb29sLlxuKyAqXG4rICogcG9vbC1cdTAwM2V3b3JrbGlzdCBpcyBwcm90ZWN0ZWQgYnkgcG9vbC1cdTAwM2Vsb2NrIGFuZCB3b3JrX3N0cnVjdCBoYXMgbmVpdGhlciBhXG4rICogcmVmY291bnQgbm9yIFJDVS1mcmVlaW5nLCBzbyBhIHBlbmRpbmcgd29yayBjYW5ub3QgYmUgaGFuZGVkIHRvIGEgc3VzcGVuZGVkXG4rICogKG9wZW4tY29kZWQpIGl0ZXJhdG9yIHNhZmVseS5cbisgKiBJbnN0ZWFkLCBmb3IgZWFjaCBwb29sIGEgYm91bmRlZCBzbmFwc2hvdCBvZiBpdHMgcGVuZGluZyB3b3JrcyBpcyBjb3BpZWQgb3V0XG4rICogd2hpbGUgcG9vbC1cdTAwM2Vsb2NrIGlzIGhlbGQsIG1pcnJvcmluZyB0aGUgcHJpbnRrX2RlZmVycmVkIHNlY3Rpb24gb2ZcbisgKiBzaG93X29uZV93b3JrZXJfcG9vbCgpIGFuZCB0aGVuIHRoZSBsb2NrIGlzIGRyb3BwZWQuXG4rICogVGhlIEJQRiBwcm9ncmFtIHRoZW4gcnVucyBvdmVyIHRoZSBzdGFibGUgc25hcHNob3Qgd2l0aCBubyBsb2NrIGhlbGQuXG4rICpcbisgKiBQb29scyBhcmUgdmlzaXRlZCBpbiB3b3JrZXJfcG9vbF9pZHIgb3JkZXIgKGEgc3RhYmxlIHJlc3VtZSBrZXkpOyBlYWNoIHBvb2wnc1xuKyAqIHNuYXBzaG90IGxpdmVzIGluIHRoZSBwZXJzaXN0ZW50IHNlcV9wcml2YXRlLCBzbyB0aGUgd2FsayByZXN1bWVzIGNvcnJlY3RseVxuKyAqIGFjcm9zcyByZWFkKCkgY2h1bmtzLiBBIHBvb2wgd2l0aCBtb3JlIHRoYW4gV1FfUEVORElOR19TTkFQX01BWCBwZW5kaW5nIHdvcmtzXG4rICogaXMgdHJ1bmNhdGVkIChiZXN0LWVmZm9ydCwgbGlrZSB0aGUga2VybmVsJ3Mgb3duIHdvcmtsaXN0IGR1bXApLlxuKyAqL1xuKyNkZWZpbmUgV1FfUEVORElOR19TTkFQX01BWCAxMjhcbitcbisvKlxuKyAqIE9uZSBwcm9qZWN0ZWQgcGVuZGluZyB3b3JrIGl0ZW0sIGFzIHNlZW4gYnkgdGhlIEJQRiBwcm9ncmFtLiBBZGRyZXNzZXMgb25seVxuKyAqIC0tIHRoZSBsaXZlIHdvcmtfc3RydWN0IGlzIG5vdCBleHBvc2VkIChpdCBtYXkgYmUgZnJlZWQgYWZ0ZXIgdGhlIGxvY2spLlxuKyAqL1xuK3N0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyB7XG4rXHRfX3U2NCBwb29sX2lkO1xuK1x0X191NjQgd29yaztcbitcdF9fdTY0IGZ1bmM7XG4rfTtcbitcbitzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYge1xuK1x0aW50ICAgICAgICAgIG5leHRfcG9vbDtcdC8qIHdvcmtlcl9wb29sX2lkciBjdXJzb3IgZm9yIHRoZSBuZXh0IGZpbGwgKi9cbitcdHVuc2lnbmVkIGludCBpZHg7XHQvKiBwb3NpdGlvbiB3aXRoaW4gc25hcFtdICAgICAgICAgICAgICAgICAgICovXG4rXHR1bnNpZ25lZCBpbnQgY291bnQ7XHQvKiB2YWxpZCBlbnRyaWVzIGluIHNuYXBbXSAgICAgICAgICAgICAgICAgICovXG4rXHRzdHJ1Y3Qgd3FfcGVuZGluZ193b3JrX2luZm8gc25hcFtXUV9QRU5ESU5HX1NOQVBfTUFYXTtcbit9O1xuK1xuK3N0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayB7XG4rXHRfX2JwZl9tZF9wdHIoc3RydWN0IGJwZl9pdGVyX21ldGEgKiwgbWV0YSk7XG4rXHRfX2JwZl9tZF9wdHIoc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICosIGluZm8pO1xuK307XG4rXG4rLypcbisgKiBTbmFwc2hvdCB0aGUgbmV4dCBub24tZW1wdHkgcG9vbCdzIHBlbmRpbmcgd29ya3MgaW50byBwcml2LVx1MDAzZXNuYXBbXSwgYWR2YW5jaW5nXG4rICogcHJpdi1cdTAwM2VuZXh0X3Bvb2wgcGFzdCBpdC4gUmV0dXJucyB0cnVlIGlmIGEgcG9vbCB3YXMgY2FwdHVyZWQsIGZhbHNlIGF0IGVuZC5cbisgKiBwb29sLVx1MDAzZWxvY2sgaXMgaGVsZCBvbmx5IGZvciB0aGUgZmllbGQgY29weTsgUkNVIGtlZXBzIGVhY2ggcG9vbCBhbGl2ZS5cbisgKi9cbitzdGF0aWMgYm9vbCB3cV9wZW5kaW5nX2ZpbGwoc3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2KVxuK3tcbitcdHN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbDtcbitcdHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaztcbitcdGludCBpZDtcbitcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdGZvciAoaWQgPSBwcml2LVx1MDAzZW5leHRfcG9vbDsgKHBvb2wgPSBpZHJfZ2V0X25leHQoXHUwMDI2d29ya2VyX3Bvb2xfaWRyLCBcdTAwMjZpZCkpOyBpZCsrKSB7XG4rXHRcdHVuc2lnbmVkIGludCBuID0gMDtcbitcbitcdFx0cmF3X3NwaW5fbG9ja19pcnEoXHUwMDI2cG9vbC1cdTAwM2Vsb2NrKTtcbitcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeSh3b3JrLCBcdTAwMjZwb29sLVx1MDAzZXdvcmtsaXN0LCBlbnRyeSkge1xuK1x0XHRcdGlmIChuIFx1MDAzZT0gV1FfUEVORElOR19TTkFQX01BWClcbitcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdHByaXYtXHUwMDNlc25hcFtuXS5wb29sX2lkID0gcG9vbC1cdTAwM2VpZDtcbitcdFx0XHRwcml2LVx1MDAzZXNuYXBbbl0ud29yayA9IChfX3U2NCkodW5zaWduZWQgbG9uZyl3b3JrO1xuK1x0XHRcdHByaXYtXHUwMDNlc25hcFtuXS5mdW5jID0gKF9fdTY0KSh1bnNpZ25lZCBsb25nKXdvcmstXHUwMDNlZnVuYztcbitcdFx0XHRuKys7XG4rXHRcdH1cbitcdFx0cmF3X3NwaW5fdW5sb2NrX2lycShcdTAwMjZwb29sLVx1MDAzZWxvY2spO1xuK1xuK1x0XHRpZiAobikge1xuK1x0XHRcdHByaXYtXHUwMDNlY291bnQgPSBuO1xuK1x0XHRcdHByaXYtXHUwMDNlaWR4ID0gMDtcbitcdFx0XHRwcml2LVx1MDAzZW5leHRfcG9vbCA9IGlkICsgMTtcbitcdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdFx0XHRyZXR1cm4gdHJ1ZTtcbitcdFx0fVxuK1x0fVxuK1x0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gZmFsc2U7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICp3cV9wZW5kaW5nX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpXG4re1xuK1x0c3RydWN0IHdxX3BlbmRpbmdfaXRlcl9wcml2ICpwcml2ID0gc2VxLVx1MDAzZXByaXZhdGU7XG4rXG4rXHRpZiAoKnBvcyA9PSAwKSB7XG4rXHRcdHByaXYtXHUwMDNlbmV4dF9wb29sID0gMDtcbitcdFx0cHJpdi1cdTAwM2VpZHggPSAwO1xuK1x0XHRwcml2LVx1MDAzZWNvdW50ID0gMDtcbitcdH1cbitcdHdoaWxlIChwcml2LVx1MDAzZWlkeCBcdTAwM2U9IHByaXYtXHUwMDNlY291bnQpIHtcbitcdFx0aWYgKCF3cV9wZW5kaW5nX2ZpbGwocHJpdikpXG4rXHRcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXHRyZXR1cm4gXHUwMDI2cHJpdi1cdTAwM2VzbmFwW3ByaXYtXHUwMDNlaWR4XTtcbit9XG4rXG4rc3RhdGljIHZvaWQgKndxX3BlbmRpbmdfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKVxuK3tcbitcdHN0cnVjdCB3cV9wZW5kaW5nX2l0ZXJfcHJpdiAqcHJpdiA9IHNlcS1cdTAwM2Vwcml2YXRlO1xuK1xuK1x0KysqcG9zO1xuK1x0cHJpdi1cdTAwM2VpZHgrKztcbitcdHdoaWxlIChwcml2LVx1MDAzZWlkeCBcdTAwM2U9IHByaXYtXHUwMDNlY291bnQpIHtcbitcdFx0aWYgKCF3cV9wZW5kaW5nX2ZpbGwocHJpdikpXG4rXHRcdFx0cmV0dXJuIE5VTEw7XG4rXHR9XG4rXHRyZXR1cm4gXHUwMDI2cHJpdi1cdTAwM2VzbmFwW3ByaXYtXHUwMDNlaWR4XTtcbit9XG4rXG4rc3RhdGljIGludCB3cV9wZW5kaW5nX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayBjdHg7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhO1xuK1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuK1xuK1x0bWV0YS5zZXEgPSBzZXE7XG4rXHRwcm9nID0gYnBmX2l0ZXJfZ2V0X2luZm8oXHUwMDI2bWV0YSwgZmFsc2UpO1xuK1x0aWYgKCFwcm9nKVxuK1x0XHRyZXR1cm4gMDtcbitcdGN0eC5tZXRhID0gXHUwMDI2bWV0YTtcbitcdGN0eC5pbmZvID0gdjtcbitcdHJldHVybiBicGZfaXRlcl9ydW5fcHJvZyhwcm9nLCBcdTAwMjZjdHgpO1xuK31cbitcbitzdGF0aWMgdm9pZCB3cV9wZW5kaW5nX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuK3tcbitcdHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlX3BlbmRpbmdfd29yayBjdHg7XG4rXHRzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSBtZXRhO1xuK1x0c3RydWN0IGJwZl9wcm9nICpwcm9nO1xuK1xuK1x0aWYgKHYpXG4rXHRcdHJldHVybjtcbitcdG1ldGEuc2VxID0gc2VxO1xuK1x0cHJvZyA9IGJwZl9pdGVyX2dldF9pbmZvKFx1MDAyNm1ldGEsIHRydWUpO1xuK1x0aWYgKHByb2cpIHtcbitcdFx0Y3R4Lm1ldGEgPSBcdTAwMjZtZXRhO1xuK1x0XHRjdHguaW5mbyA9IE5VTEw7XG4rXHRcdGJwZl9pdGVyX3J1bl9wcm9nKHByb2csIFx1MDAyNmN0eCk7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgd3FfcGVuZGluZ19zZXFfb3BzID0ge1xuK1x0LnN0YXJ0XHQ9IHdxX3BlbmRpbmdfc2VxX3N0YXJ0LFxuK1x0Lm5leHRcdD0gd3FfcGVuZGluZ19zZXFfbmV4dCxcbitcdC5zdG9wXHQ9IHdxX3BlbmRpbmdfc2VxX3N0b3AsXG4rXHQuc2hvd1x0PSB3cV9wZW5kaW5nX3NlcV9zaG93LFxuK307XG4rXG4rREVGSU5FX0JQRl9JVEVSX0ZVTkMod29ya3F1ZXVlX3BlbmRpbmdfd29yaywgc3RydWN0IGJwZl9pdGVyX21ldGEgKm1ldGEsXG4rXHRcdCAgICAgc3RydWN0IHdxX3BlbmRpbmdfd29ya19pbmZvICppbmZvKVxuK1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2luZm8gd3FfcGVuZGluZ19zZXFfaW5mbyA9IHtcbitcdC5zZXFfb3BzXHQ9IFx1MDAyNndxX3BlbmRpbmdfc2VxX29wcyxcbitcdC5zZXFfcHJpdl9zaXplXHQ9IHNpemVvZihzdHJ1Y3Qgd3FfcGVuZGluZ19pdGVyX3ByaXYpLFxuK307XG4rXG4rQlRGX0lEX0xJU1RfU0lOR0xFKHdxX3BlbmRpbmdfd29ya19pbmZvX2J0Zl9pZCwgc3RydWN0LCB3cV9wZW5kaW5nX3dvcmtfaW5mbylcbitcbitzdGF0aWMgc3RydWN0IGJwZl9pdGVyX3JlZyB3cV9wZW5kaW5nX3JlZ19pbmZvID0ge1xuK1x0LnRhcmdldFx0XHRcdD0gXCJ3b3JrcXVldWVfcGVuZGluZ193b3JrXCIsXG4rXHQuZmVhdHVyZVx0XHQ9IEJQRl9JVEVSX1JFU0NIRUQsXG4rXHQuY3R4X2FyZ19pbmZvX3NpemVcdD0gMSxcbitcdC5jdHhfYXJnX2luZm9cdFx0PSB7XG4rXHRcdHsgb2Zmc2V0b2Yoc3RydWN0IGJwZl9pdGVyX193b3JrcXVldWVfcGVuZGluZ193b3JrLCBpbmZvKSxcbitcdFx0ICBQVFJfVE9fQlRGX0lEX09SX05VTEwgfSxcbitcdH0sXG4rXHQuc2VxX2luZm9cdFx0PSBcdTAwMjZ3cV9wZW5kaW5nX3NlcV9pbmZvLFxuK307XG4rXG4rc3RhdGljIGludCBfX2luaXQgYnBmX3dvcmtxdWV1ZV9pdGVyX2luaXQodm9pZClcbit7XG4rXHRpbnQgcmV0O1xuK1xuK1x0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsXG4rXHRcdFx0XHRcdFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1x0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXG4rXHRcdFx0XHRcdFx1MDAyNndvcmtxdWV1ZV9pdGVyX2tmdW5jX3NldCk7XG4rXHRpZiAocmV0KVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0d29ya3F1ZXVlX2l0ZXJfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdvcmtxdWV1ZV9idGZfaWRbMF07XG4rXHRyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KFx1MDAyNndvcmtxdWV1ZV9pdGVyX3JlZ19pbmZvKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHR3b3JrZXJfcG9vbF9pdGVyX3JlZ19pbmZvLmN0eF9hcmdfaW5mb1swXS5idGZfaWQgPSB3b3JrZXJfcG9vbF9idGZfaWRbMF07XG4rXHRyZXQgPSBicGZfaXRlcl9yZWdfdGFyZ2V0KFx1MDAyNndvcmtlcl9wb29sX2l0ZXJfcmVnX2luZm8pO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHdxX3BlbmRpbmdfcmVnX2luZm8uY3R4X2FyZ19pbmZvWzBdLmJ0Zl9pZCA9IHdxX3BlbmRpbmdfd29ya19pbmZvX2J0Zl9pZFswXTtcbitcdHJldHVybiBicGZfaXRlcl9yZWdfdGFyZ2V0KFx1MDAyNndxX3BlbmRpbmdfcmVnX2luZm8pO1xuK31cbitsYXRlX2luaXRjYWxsKGJwZl93b3JrcXVldWVfaXRlcl9pbml0KTtcbitcbisjZW5kaWYgLyogQ09ORklHX0JQRl9TWVNDQUxMICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2JwZl9leHBlcmltZW50YWwuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9icGZfZXhwZXJpbWVudGFsLmhcbmluZGV4IDY3ZmY3ODgyMjk5ZWMuLjZkYTkzYzQ4NjY1MDkgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvYnBmX2V4cGVyaW1lbnRhbC5oXG5AQCAtMzYxLDYgKzM2MSwxNiBAQCBleHRlcm4gaW50IGJwZl9pdGVyX2RtYWJ1Zl9uZXcoc3RydWN0IGJwZl9pdGVyX2RtYWJ1ZiAqaXQpIF9fd2VhayBfX2tzeW07XG4gZXh0ZXJuIHN0cnVjdCBkbWFfYnVmICpicGZfaXRlcl9kbWFidWZfbmV4dChzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcbiBleHRlcm4gdm9pZCBicGZfaXRlcl9kbWFidWZfZGVzdHJveShzdHJ1Y3QgYnBmX2l0ZXJfZG1hYnVmICppdCkgX193ZWFrIF9fa3N5bTtcbiBcbitzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlO1xuK2V4dGVybiBpbnQgYnBmX2l0ZXJfd29ya3F1ZXVlX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya3F1ZXVlICppdCkgX193ZWFrIF9fa3N5bTtcbitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KSBfX3dlYWsgX19rc3ltO1xuK2V4dGVybiB2b2lkIGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrcXVldWUgKml0KSBfX3dlYWsgX19rc3ltO1xuK1xuK3N0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbDtcbitleHRlcm4gaW50IGJwZl9pdGVyX3dvcmtlcl9wb29sX25ldyhzdHJ1Y3QgYnBmX2l0ZXJfd29ya2VyX3Bvb2wgKml0KSBfX3dlYWsgX19rc3ltO1xuK2V4dGVybiBzdHJ1Y3Qgd29ya2VyX3Bvb2wgKmJwZl9pdGVyX3dvcmtlcl9wb29sX25leHQoc3RydWN0IGJwZl9pdGVyX3dvcmtlcl9wb29sICppdCkgX193ZWFrIF9fa3N5bTtcbitleHRlcm4gdm9pZCBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95KHN0cnVjdCBicGZfaXRlcl93b3JrZXJfcG9vbCAqaXQpIF9fd2VhayBfX2tzeW07XG4rXG4gZXh0ZXJuIGludCBicGZfY2dyb3VwX3JlYWRfeGF0dHIoc3RydWN0IGNncm91cCAqY2dyb3VwLCBjb25zdCBjaGFyICpuYW1lX19zdHIsXG4gXHRcdFx0XHQgc3RydWN0IGJwZl9keW5wdHIgKnZhbHVlX3ApIF9fd2VhayBfX2tzeW07XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvd3FfaXRlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvd3FfaXRlci5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNzMzODNjMjYzYmVlOFxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvd3FfaXRlci5jXG5AQCAtMCwwICsxLDgwIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbisjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbisjaW5jbHVkZSBcIndxX2l0ZXIuc2tlbC5oXCJcbisjaW5jbHVkZSBcIndxX2l0ZXJfZmFpbC5za2VsLmhcIlxuK1xuK3N0YXRpYyB2b2lkIHN1YnRlc3Rfb3Blbl9jb2RlZChzdHJ1Y3Qgd3FfaXRlciAqc2tlbClcbit7XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgb3B0cyk7XG4rXHRpbnQgZXJyO1xuK1xuK1x0ZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy5jb3VudF93b3JrcXVldWVzKSxcbitcdFx0XHRcdCAgICAgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuIGNvdW50X3dvcmtxdWV1ZXNcIikpXG4rXHRcdHJldHVybjtcbitcdC8qIFRoZXJlIGFyZSBhbHdheXMgc2V2ZXJhbCBzeXN0ZW0gd29ya3F1ZXVlcyAoZXZlbnRzLCAuLi4pLiAqL1xuK1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3dvcmtxdWV1ZXMsIDAsIFwibnJfd29ya3F1ZXVlc1wiKTtcbitcbitcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMoYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXHUwMDNlcHJvZ3MuY291bnRfd29ya2VyX3Bvb2xzKSxcbitcdFx0XHRcdCAgICAgXHUwMDI2b3B0cyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuIGNvdW50X3dvcmtlcl9wb29sc1wiKSlcbitcdFx0cmV0dXJuO1xuK1x0LyogQXQgbGVhc3QgdGhlIHBlci1DUFUgbm9ybWFsL2hpZ2hwcmkgcG9vbHMgZXhpc3QuICovXG4rXHRBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlbnJfd29ya2VyX3Bvb2xzLCAwLCBcIm5yX3dvcmtlcl9wb29sc1wiKTtcbitcdEFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2Vucl9wZXJjcHVfcG9vbHMsIDAsIFwibnJfcGVyY3B1X3Bvb2xzXCIpO1xuK31cbitcbitzdGF0aWMgdm9pZCBkcmFpbl9pdGVyKHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZywgY29uc3QgY2hhciAqbmFtZSlcbit7XG4rXHRzdHJ1Y3QgYnBmX2xpbmsgKmxpbms7XG4rXHRjaGFyIGJ1Zls1MTJdO1xuK1x0aW50IGl0ZXJfZmQ7XG4rXHRzc2l6ZV90IG47XG4rXG4rXHRsaW5rID0gYnBmX3Byb2dyYW1fX2F0dGFjaF9pdGVyKHByb2csIE5VTEwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGxpbmssIG5hbWUpKVxuK1x0XHRyZXR1cm47XG4rXHRpdGVyX2ZkID0gYnBmX2l0ZXJfY3JlYXRlKGJwZl9saW5rX19mZChsaW5rKSk7XG4rXHRpZiAoIUFTU0VSVF9HRShpdGVyX2ZkLCAwLCBcIml0ZXJfY3JlYXRlXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdHdoaWxlICgobiA9IHJlYWQoaXRlcl9mZCwgYnVmLCBzaXplb2YoYnVmKSkpIFx1MDAzZSAwKVxuK1x0XHQ7XG4rXHRBU1NFUlRfR0UobiwgMCwgXCJyZWFkIGl0ZXJcIik7XG4rXHRjbG9zZShpdGVyX2ZkKTtcbitvdXQ6XG4rXHRicGZfbGlua19fZGVzdHJveShsaW5rKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgc3VidGVzdF9zZXEoc3RydWN0IHdxX2l0ZXIgKnNrZWwpXG4re1xuK1x0Lyogc2VxIGZvcm1zIGFyZSBiYWNrZWQgYnkgdGhlIHNhbWUgb3Blbi1jb2RlZCBuZXh0KCkuICovXG4rXHRkcmFpbl9pdGVyKHNrZWwtXHUwMDNlcHJvZ3MuZHVtcF93b3JrcXVldWVzLCBcImF0dGFjaCB3b3JrcXVldWUgaXRlclwiKTtcbitcdEFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2Vucl93cV9zZXEsIDAsIFwibnJfd3Ffc2VxXCIpO1xuK1xuK1x0ZHJhaW5faXRlcihza2VsLVx1MDAzZXByb2dzLmR1bXBfd29ya2VyX3Bvb2xzLCBcImF0dGFjaCB3b3JrZXJfcG9vbCBpdGVyXCIpO1xuK1x0QVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZW5yX3Bvb2xfc2VxLCAwLCBcIm5yX3Bvb2xfc2VxXCIpO1xuK1xuK1x0LypcbitcdCAqIHdvcmtsaXN0cyBhcmUgdXN1YWxseSBlbXB0eSBvbiBhbiBpZGxlIHN5c3RlbTsgdGhpcyBkcml2ZXMgdGhlIHdob2xlXG4rXHQgKiBwZXItcG9vbCBzbmFwc2hvdCBwYXRoIGFuZCB2ZXJpZmllcyBpdCBkcmFpbnMgY2xlYW5seS5cbitcdCAqL1xuK1x0ZHJhaW5faXRlcihza2VsLVx1MDAzZXByb2dzLmR1bXBfcGVuZGluZywgXCJhdHRhY2ggcGVuZGluZ193b3JrIGl0ZXJcIik7XG4rfVxuK1xuK3ZvaWQgdGVzdF93cV9pdGVyKHZvaWQpXG4re1xuK1x0c3RydWN0IHdxX2l0ZXIgKnNrZWw7XG4rXG4rXHRza2VsID0gd3FfaXRlcl9fb3Blbl9hbmRfbG9hZCgpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwid3FfaXRlcl9fb3Blbl9hbmRfbG9hZFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJvcGVuX2NvZGVkXCIpKVxuK1x0XHRzdWJ0ZXN0X29wZW5fY29kZWQoc2tlbCk7XG4rXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcInNlcVwiKSlcbitcdFx0c3VidGVzdF9zZXEoc2tlbCk7XG4rXG4rXHR3cV9pdGVyX19kZXN0cm95KHNrZWwpO1xuK1xuK1x0UlVOX1RFU1RTKHdxX2l0ZXJfZmFpbCk7XG4rfVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy93cV9pdGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlci5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uMTVmMDgxYmM2MzRiNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3dxX2l0ZXIuY1xuQEAgLTAsMCArMSw5NSBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rI2luY2x1ZGUgXCJ2bWxpbnV4LmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuK1xuK3ZvaWQgYnBmX3JjdV9yZWFkX2xvY2sodm9pZCkgX19rc3ltO1xuK3ZvaWQgYnBmX3JjdV9yZWFkX3VubG9jayh2b2lkKSBfX2tzeW07XG4rXG4rLyogUmVzdWx0cywgY2hlY2tlZCBieSB1c2Vyc3BhY2UuICovXG4raW50IG5yX3dvcmtxdWV1ZXM7XG4raW50IG5yX3dvcmtlcl9wb29scztcbitpbnQgbnJfcGVyY3B1X3Bvb2xzO1xuK2ludCBucl93cV9zZXE7XG4raW50IG5yX3Bvb2xfc2VxO1xuK2ludCBucl9wZW5kaW5nO1xuK1xuKy8qIC0tLSBvcGVuLWNvZGVkIGl0ZXJhdG9ycyAoS0ZfUkNVX1BST1RFQ1RFRCkgLS0tICovXG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCBjb3VudF93b3JrcXVldWVzKGNvbnN0IHZvaWQgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7XG4rXHRpbnQgbiA9IDA7XG4rXG4rXHRicGZfcmN1X3JlYWRfbG9jaygpO1xuK1x0YnBmX2Zvcl9lYWNoKHdvcmtxdWV1ZSwgd3EpXG4rXHRcdG4rKztcbitcdGJwZl9yY3VfcmVhZF91bmxvY2soKTtcbitcbitcdG5yX3dvcmtxdWV1ZXMgPSBuO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcInN5c2NhbGxcIilcbitpbnQgY291bnRfd29ya2VyX3Bvb2xzKGNvbnN0IHZvaWQgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgd29ya2VyX3Bvb2wgKnBvb2w7XG4rXHRpbnQgbiA9IDAsIHBlcmNwdSA9IDA7XG4rXG4rXHRicGZfcmN1X3JlYWRfbG9jaygpO1xuK1x0YnBmX2Zvcl9lYWNoKHdvcmtlcl9wb29sLCBwb29sKSB7XG4rXHRcdG4rKztcbitcdFx0aWYgKHBvb2wtXHUwMDNlY3B1IFx1MDAzZT0gMClcdFx0LyogcGVyLUNQVSBwb29sICovXG4rXHRcdFx0cGVyY3B1Kys7XG4rXHR9XG4rXHRicGZfcmN1X3JlYWRfdW5sb2NrKCk7XG4rXG4rXHRucl93b3JrZXJfcG9vbHMgPSBuO1xuK1x0bnJfcGVyY3B1X3Bvb2xzID0gcGVyY3B1O1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIC0tLSBzZXFfZmlsZSBpdGVyYXRvcnMgLS0tICovXG4rXG4rU0VDKFwiaXRlci93b3JrcXVldWVcIilcbitpbnQgZHVtcF93b3JrcXVldWVzKHN0cnVjdCBicGZfaXRlcl9fd29ya3F1ZXVlICpjdHgpXG4re1xuK1x0c3RydWN0IHNlcV9maWxlICpzZXEgPSBjdHgtXHUwMDNlbWV0YS1cdTAwM2VzZXE7XG4rXHRzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBjdHgtXHUwMDNld3E7XG4rXG4rXHRpZiAoIXdxKVxuK1x0XHRyZXR1cm4gMDtcbitcdG5yX3dxX3NlcSsrO1xuK1x0QlBGX1NFUV9QUklOVEYoc2VxLCBcIiVzXFxuXCIsIHdxLVx1MDAzZW5hbWUpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK1NFQyhcIml0ZXIvd29ya2VyX3Bvb2xcIilcbitpbnQgZHVtcF93b3JrZXJfcG9vbHMoc3RydWN0IGJwZl9pdGVyX193b3JrZXJfcG9vbCAqY3R4KVxuK3tcbitcdHN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbCA9IGN0eC1cdTAwM2Vwb29sO1xuK1xuK1x0aWYgKCFwb29sKVxuK1x0XHRyZXR1cm4gMDtcbitcdG5yX3Bvb2xfc2VxKys7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwiaXRlci93b3JrcXVldWVfcGVuZGluZ193b3JrXCIpXG4raW50IGR1bXBfcGVuZGluZyhzdHJ1Y3QgYnBmX2l0ZXJfX3dvcmtxdWV1ZV9wZW5kaW5nX3dvcmsgKmN0eClcbit7XG4rXHRzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IGN0eC1cdTAwM2VtZXRhLVx1MDAzZXNlcTtcbitcdHN0cnVjdCB3cV9wZW5kaW5nX3dvcmtfaW5mbyAqaW5mbyA9IGN0eC1cdTAwM2VpbmZvO1xuK1xuK1x0aWYgKCFpbmZvKVx0XHRcdC8qIGZpbmFsIGNhbGwgKi9cbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRucl9wZW5kaW5nKys7XG4rXHRCUEZfU0VRX1BSSU5URihzZXEsIFwicG9vbCAlbGx1IHdvcmsgMHglbGx4IGZ1bmMgMHglbGx4XFxuXCIsXG4rXHRcdCAgICAgICBpbmZvLVx1MDAzZXBvb2xfaWQsIGluZm8tXHUwMDNld29yaywgaW5mby1cdTAwM2VmdW5jKTtcbitcdHJldHVybiAwO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5mYjJkY2Y5ODQ3ZTJiXG4tLS0gL2Rldi9udWxsXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3Mvd3FfaXRlcl9mYWlsLmNcbkBAIC0wLDAgKzEsMzcgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKyNpbmNsdWRlIFwidm1saW51eC5oXCJcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4rI2luY2x1ZGUgXCJicGZfbWlzYy5oXCJcbisjaW5jbHVkZSBcImJwZl9leHBlcmltZW50YWwuaFwiXG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuK1xuKy8qXG4rICogVGhlIHdvcmtxdWV1ZSBhbmQgd29ya2VyX3Bvb2wgb3Blbi1jb2RlZCBpdGVyYXRvcnMgYXJlIEtGX1JDVV9QUk9URUNURUQ6XG4rICogdXNpbmcgdGhlbSBvdXRzaWRlIGEgYnBmX3JjdV9yZWFkX2xvY2soKSByZWdpb24gbXVzdCBiZSByZWplY3RlZC5cbisgKi9cbitcbitTRUMoXCI/c3lzY2FsbFwiKVxuK19fZmFpbHVyZSBfX21zZyhcImtlcm5lbCBmdW5jIGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblwiKVxuK2ludCB3b3JrcXVldWVfaXRlcl9ub19yY3UoY29uc3Qgdm9pZCAqY3R4KVxuK3tcbitcdHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTtcbitcdGludCBuID0gMDtcbitcbitcdGJwZl9mb3JfZWFjaCh3b3JrcXVldWUsIHdxKVxuK1x0XHRuKys7XG4rXHRyZXR1cm4gbjtcbit9XG4rXG4rU0VDKFwiP3N5c2NhbGxcIilcbitfX2ZhaWx1cmUgX19tc2coXCJrZXJuZWwgZnVuYyBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXcgcmVxdWlyZXMgUkNVIGNyaXRpY2FsIHNlY3Rpb24gcHJvdGVjdGlvblwiKVxuK2ludCB3b3JrZXJfcG9vbF9pdGVyX25vX3JjdShjb25zdCB2b2lkICpjdHgpXG4re1xuK1x0c3RydWN0IHdvcmtlcl9wb29sICpwb29sO1xuK1x0aW50IG4gPSAwO1xuK1xuK1x0YnBmX2Zvcl9lYWNoKHdvcmtlcl9wb29sLCBwb29sKVxuK1x0XHRuKys7XG4rXHRyZXR1cm4gbjtcbit9XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTozNS43MzU4MzA5OTZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NzIzMzM1NDMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkJQRiBJdGVyYXRvcnMgZm9yIFdvcmtxdWV1ZXM6IEluaXRpYWwgQXNzZXNzbWVudCBhbmQgRnV6emluZyBTdHJhdGVneSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIEJQRiBpdGVyYXRvcnMgZm9yIHdvcmtxdWV1ZXMgYW5kIHdvcmtlciBwb29scy4gSXQgc2VlbXMgbGlrZSBpdCdzIGFkZGluZyBhIG5ldyBzZXQgb2Yga2Z1bmNzIGFuZCBpdGVyYXRvcnMgd2l0aGluIGBrZXJuZWwvd29ya3F1ZXVlLmNgLiBTcGVjaWZpY2FsbHksIEkgc2VlIGZ1bmN0aW9ucyBsaWtlIGBicGZfaXRlcl93b3JrcXVldWVfbmV3YCwgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0YCwgYGJwZl9pdGVyX3dvcmtxdWV1ZV9kZXN0cm95YCBmb3Igd29ya3F1ZXVlcywgYW5kIHNpbWlsYXIgb25lcyBmb3Igd29ya2VyIHBvb2xzLCBhcyB3ZWxsIGFzIGFuIGBicGZfaXRlcl9yZWdgIGNhbGwgZm9yIHZhcmlvdXMgc3RydWN0dXJlcyByZWxhdGVkIHRvIHdvcmtxdWV1ZXMuXG5cbk15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIklzIHRoaXMgYWN0dWFsbHkgKnJlYWNoYWJsZSogYW5kIGZ1bmN0aW9uYWw/XCIgVGhlIGFuc3dlciBhcHBlYXJzIHRvIGJlIHllczsgdGhlc2UgYXJlIG5ldyBCUEYga2Z1bmNzLCBzbyB0aGV5IGFyZSwgaW4gZmFjdCwgY2FsbGFibGUgZnJvbSBCUEYgcHJvZ3JhbXMuIFRoYXQgaW1tZWRpYXRlbHkgbWFrZXMgdGhpcyBhIHByaW1lIHRhcmdldCBmb3IgZnV6emluZy4gV2UgbmVlZCB0byByZWFsbHkgcHV0IHRoZXNlIG5ldyBhZGRpdGlvbnMgdGhyb3VnaCB0aGVpciBwYWNlcy5cblxuVGhlcmVmb3JlLCB0aGUgZm9jdXMgbmVlZHMgdG8gYmUgb24gdGhlc2UgY29yZSBzeW1ib2xzOiBgYnBmX2l0ZXJfd29ya3F1ZXVlX25ld2AsIGBicGZfaXRlcl93b3JrcXVldWVfbmV4dGAsIGBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveWAsIGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXdgLCBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dGAsIGBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95YC4gSSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgdGhlIHN1cHBvcnRpbmcgc2VxIGZpbGUgaXRlcmF0b3IgZnVuY3Rpb25zOiBgd29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0YCwgYHdvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0YCwgYHdvcmtxdWV1ZV9pdGVyX3NlcV9zaG93YCwgYHdvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wYCBhbmQgc2ltaWxhciBvbmVzIGZvciB0aGUgYHdvcmtlcl9wb29sYCBhbmQgdGhlIGB3cV9wZW5kaW5nYCByZWxhdGVkIHN0cnVjdHVyZXMuXG5cbk5vdywgYSBzbWFsbCBoaWNjdXAuIEkndmUganVzdCBub3RpY2VkIGB3cV9wZW5kaW5nX2ZpbGxgIHdoaWNoIGlzIGEgc3RhdGljIGZ1bmN0aW9uLCBidXQgaXQgYXBwZWFycyB0byBiZSBub24tdHJpdmlhbC4gVGhhdCdzIHdvcnRoIGEgc2Vjb25kIGxvb2ssIHNvIEkgbmVlZCB0byBjaGVjayB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvZGUgYmxvY2suIEkgYmVsaWV2ZSBpdCdzIHdyYXBwZWQgaW4gYW4gYCNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExgIGRpcmVjdGl2ZS4gTGV0IG1lIHF1aWNrbHkgdmVyaWZ5IHRoaXMuXG5cbkknbGwgdXNlIGBncmVwcGVyYCB0byBzZWFyY2ggZm9yIGBDT05GSUdfQlBGX1NZU0NBTExgIHdpdGhpbiBga2VybmVsL3dvcmtxdWV1ZS5jYCB0byBjb25maXJtIG15IHN1c3BpY2lvbiBhbmQgY2xhcmlmeSBpdHMgZGVwZW5kZW5jeS4gVGhpcyBpcyBhbGwgYWJvdXQgZW5zdXJpbmcgdGhlIGNvZGUgaXMgY29tcGlsZWQgY29ycmVjdGx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTQ5NCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUxMSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTI5VDA0OjAxOjQzLjQ1OTE3MDg4OFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NzQ0NDQzOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfQlBGX1NZU0NBTExcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwia2VybmVsL3dvcmtxdWV1ZS5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC93b3JrcXVldWUuYz04NDc3PV9fc2V0dXAoXFxcIndvcmtxdWV1ZS51bmJvdW5kX2NwdXM9XFxcIiwgd29ya3F1ZXVlX3VuYm91bmRfY3B1c19zZXR1cCk7XFxua2VybmVsL3dvcmtxdWV1ZS5jLTg0NzgtXFxua2VybmVsL3dvcmtxdWV1ZS5jOjg0Nzk6I2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxcbmtlcm5lbC93b3JrcXVldWUuYy04NDgwLVxcbi0tXFxua2VybmVsL3dvcmtxdWV1ZS5jPTkwMjk9bGF0ZV9pbml0Y2FsbChicGZfd29ya3F1ZXVlX2l0ZXJfaW5pdCk7XFxua2VybmVsL3dvcmtxdWV1ZS5jLTkwMzAtXFxua2VybmVsL3dvcmtxdWV1ZS5jOjkwMzE6I2VuZGlmIC8qIENPTkZJR19CUEZfU1lTQ0FMTCAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTo0My41MzY2MjIwNzdaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NDI1MDA4NDE5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgQlBGIEl0ZXJhdG9yIFBhdGNoKipcblxuT2theSwgc28gdGhlIGNvZGUgaXMgZGVmaW5pdGVseSBndWFyZGVkIGJ5IGAjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMYCwgdGhhdCdzIHRoZSBvYnZpb3VzIHN0YXJ0aW5nIHBvaW50LiBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZW4ndCBhbnkgb3RoZXIgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgbHVya2luZyBhYm91dCwgYnV0IGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBpdCdzIGp1c3QgdGhlIGBDT05GSUdfQlBGX1NZU0NBTExgIGZsYWcuIFxuXG5Ob3csIGxldCdzIGRpZyBpbnRvIHRoZSBtZWF0IG9mIHRoZSBwYXRjaCBhbmQgc2VlIHdoYXQncyBiZWluZyBpbnRyb2R1Y2VkLiBSaWdodCwgaXQgbG9va3MgbGlrZSB0aGlzIHBhdGNoIGlzIGFkZGluZyBuZXcgQlBGIGl0ZXJhdG9ycy4gSSBzZWUgZnVuY3Rpb25zIGxpa2UgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX25leHRgLCBgYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3lgLi4uIGFuZCBzaW1pbGFybHkgZm9yIHdvcmtlciBwb29sczogYGJwZl9pdGVyX3dvcmtlcl9wb29sX25ld2AsIGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0YCwgYGJwZl9pdGVyX3dvcmtlcl9wb29sX2Rlc3Ryb3lgLiBQbHVzLCB0aGVyZSBhcmUgc29tZSBoZWxwZXIgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhlc2UgaXRlcmF0b3JzLCBsaWtlIHRoZSBgc2VxX2AgZnVuY3Rpb25zLCBhbmQgYSBmZXcgb3RoZXJzLiBTcGVjaWZpY2FsbHksIHRoZSBwYXRjaCBhZGRzOlxuXG4qICAgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdgXG4qICAgYGJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0YFxuKiAgIGBicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveWBcbiogICBgYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3YFxuKiAgIGBicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0YFxuKiAgIGBicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95YFxuKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnRgXG4qICAgYHdvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0YFxuKiAgIGB3b3JrcXVldWVfaXRlcl9zZXFfc2hvd2BcbiogICBgd29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3BgXG4qICAgYHdvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0YFxuKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0YFxuKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93YFxuKiAgIGB3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wYFxuKiAgIGB3cV9wZW5kaW5nX2ZpbGxgXG4qICAgYHdxX3BlbmRpbmdfc2VxX3N0YXJ0YFxuKiAgIGB3cV9wZW5kaW5nX3NlcV9uZXh0YFxuKiAgIGB3cV9wZW5kaW5nX3NlcV9zaG93YFxuKiAgIGB3cV9wZW5kaW5nX3NlcV9zdG9wYFxuXG5CYXNlZCBvbiB3aGF0IEknbSBzZWVpbmcsIHRoaXMgaXMgZXhhY3RseSB3aGF0IEkgbmVlZCB0byBhZGQgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gU2luY2UgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIHRoZXNlIG5ldyBCUEYgaXRlcmF0b3JzIGZvciB3b3JrcXVldWVzIGFuZCB3b3JrZXIgcG9vbHMsIGFuZCBzaW5jZSB0aGVzZSBhcmUgYWNjZXNzaWJsZSBmcm9tIEJQRiBwcm9ncmFtcywgdGhleSBhcmUgZGVmaW5pdGVseSBjYW5kaWRhdGVzIGZvciBmdXp6aW5nLiBJIGNhbiBnZXQgdG8gdGhlc2UgZnJvbSBCUEYgcHJvZ3JhbXMsIGFuZCB0aGF0J3MgYSB2ZWN0b3IgZm9yIGV4cGxvaXQuXG5cbkp1c3QgdG8gYmUgYWJzb2x1dGVseSBzdXJlLCBsZXQgbWUgcXVpY2tseSBkb3VibGUtY2hlY2sgdGhhdCBgQ09ORklHX0JQRl9TWVNDQUxMYCBpcyB0aGUgKm9ubHkqIHJlcXVpcmVkIGNvbmZpZy4gWXVwLCB0aGF0J3MgdGhlIG1haW4gb25lLlxuXG5Pa2F5LCB0aGF0J3MgZW5vdWdoIGluZm9ybWF0aW9uLCBsZXQncyBjYWxsIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNzAwLCJPdXRwdXRUb2tlbnMiOjI4MywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM2MiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0yOVQwNDowMTo1MS45NjE2MzMyMTZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNTc3NzU1NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfbmV3XCIsXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfbmV4dFwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya3F1ZXVlX2Rlc3Ryb3lcIixcbiAgICBcImJwZl9pdGVyX3dvcmtlcl9wb29sX25ld1wiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV4dFwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfZGVzdHJveVwiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfbmV4dFwiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3Nob3dcIixcbiAgICBcIndvcmtxdWV1ZV9pdGVyX3NlcV9zdG9wXCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdGFydFwiLFxuICAgIFwid29ya2VyX3Bvb2xfaXRlcl9zZXFfbmV4dFwiLFxuICAgIFwid29ya2VyX3Bvb2xfaXRlcl9zZXFfc2hvd1wiLFxuICAgIFwid29ya2VyX3Bvb2xfaXRlcl9zZXFfc3RvcFwiLFxuICAgIFwid3FfcGVuZGluZ19maWxsXCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zdGFydFwiLFxuICAgIFwid3FfcGVuZGluZ19zZXFfbmV4dFwiLFxuICAgIFwid3FfcGVuZGluZ19zZXFfc2hvd1wiLFxuICAgIFwid3FfcGVuZGluZ19zZXFfc3RvcFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgbmV3IEJQRiBpdGVyYXRvcnMgZm9yIHdvcmtxdWV1ZXMgYW5kIHdvcmtlciBwb29scywgd2hpY2ggYXJlIHJlYWNoYWJsZSBmcm9tIEJQRiBwcm9ncmFtcyBhbmQgY2FuIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXdcIixcbiAgICBcImJwZl9pdGVyX3dvcmtxdWV1ZV9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrcXVldWVfZGVzdHJveVwiLFxuICAgIFwiYnBmX2l0ZXJfd29ya2VyX3Bvb2xfbmV3XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9uZXh0XCIsXG4gICAgXCJicGZfaXRlcl93b3JrZXJfcG9vbF9kZXN0cm95XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc3RhcnRcIixcbiAgICBcIndvcmtxdWV1ZV9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrcXVldWVfaXRlcl9zZXFfc2hvd1wiLFxuICAgIFwid29ya3F1ZXVlX2l0ZXJfc2VxX3N0b3BcIixcbiAgICBcIndvcmtlcl9wb29sX2l0ZXJfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9uZXh0XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zaG93XCIsXG4gICAgXCJ3b3JrZXJfcG9vbF9pdGVyX3NlcV9zdG9wXCIsXG4gICAgXCJ3cV9wZW5kaW5nX2ZpbGxcIixcbiAgICBcIndxX3BlbmRpbmdfc2VxX3N0YXJ0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9uZXh0XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zaG93XCIsXG4gICAgXCJ3cV9wZW5kaW5nX3NlcV9zdG9wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBuZXcgQlBGIGl0ZXJhdG9ycyBmb3Igd29ya3F1ZXVlcyBhbmQgd29ya2VyIHBvb2xzLCB3aGljaCBhcmUgcmVhY2hhYmxlIGZyb20gQlBGIHByb2dyYW1zIGFuZCBjYW4gYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowg5xlr[1] Phase: Succeeded StartedAt: 2026-07-29 04:02:03 +0000 UTC FinishedAt: 2026-07-29 04:02:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-29 04:02:03 +0000 UTC FinishedAt: 2026-07-29 04:02:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2] Phase: Succeeded StartedAt: 2026-07-29 04:02:03 +0000 UTC FinishedAt: 2026-07-29 07:47:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:02:03 +0000 UTC FinishedAt: 2026-07-29 07:47:52 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:02:03 +0000 UTC FinishedAt: 2026-07-29 04:02:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:02:03 +0000 UTC FinishedAt: 2026-07-29 04:02:09 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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-workflowg5xlr/series-workflowg5xlr-convert-artifact-498279530/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:02:13 +0000 UTC FinishedAt: 2026-07-29 04:21:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:02:13 +0000 UTC FinishedAt: 2026-07-29 04:21:54 +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:*6d59bb93-a069-4851-94d6-c81842a22f2c,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-workflowg5xlr/series-workflowg5xlr-convert-artifact-498279530/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": "081ab1c3-3c77-4d79-8423-7d58ce35264e", "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-workflowg5xlr/series-workflowg5xlr-build-action-3503413976/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:02:13 +0000 UTC FinishedAt: 2026-07-29 04:21:44 +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:*6d59bb93-a069-4851-94d6-c81842a22f2c,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-workflowg5xlr/series-workflowg5xlr-convert-artifact-498279530/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": "081ab1c3-3c77-4d79-8423-7d58ce35264e", "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-workflowg5xlr/series-workflowg5xlr-build-action-3503413976/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:21:54 +0000 UTC FinishedAt: 2026-07-29 04:21:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:21:54 +0000 UTC FinishedAt: 2026-07-29 04:21:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:21:54 +0000 UTC FinishedAt: 2026-07-29 04:22:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:21:54 +0000 UTC FinishedAt: 2026-07-29 04:21:59 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-workflowg5xlr/series-workflowg5xlr-convert-artifact-180354949/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:22:04 +0000 UTC FinishedAt: 2026-07-29 04:24:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:22:04 +0000 UTC FinishedAt: 2026-07-29 04:24:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*081ab1c3-3c77-4d79-8423-7d58ce35264e,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-workflowg5xlr/series-workflowg5xlr-build-action-3503413976/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-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:24:11 +0000 UTC FinishedAt: 2026-07-29 04:24:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:24:11 +0000 UTC FinishedAt: 2026-07-29 04:24:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:24:11 +0000 UTC FinishedAt: 2026-07-29 04:43:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:24:11 +0000 UTC FinishedAt: 2026-07-29 04:43:00 +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:*6d59bb93-a069-4851-94d6-c81842a22f2c,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-workflowg5xlr/series-workflowg5xlr-convert-artifact-180354949/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": "5eee0f43-319f-4836-95d7-263f0c493224", "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-workflowg5xlr/series-workflowg5xlr-build-action-1542234833/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:24:11 +0000 UTC FinishedAt: 2026-07-29 04:42:50 +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:*6d59bb93-a069-4851-94d6-c81842a22f2c,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-workflowg5xlr/series-workflowg5xlr-convert-artifact-180354949/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": "5eee0f43-319f-4836-95d7-263f0c493224", "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-workflowg5xlr/series-workflowg5xlr-build-action-1542234833/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:43:00 +0000 UTC FinishedAt: 2026-07-29 04:43:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:43:00 +0000 UTC FinishedAt: 2026-07-29 04:43:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:43:00 +0000 UTC FinishedAt: 2026-07-29 04:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:43:00 +0000 UTC FinishedAt: 2026-07-29 04:44:54 +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:*5eee0f43-319f-4836-95d7-263f0c493224,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-workflowg5xlr/series-workflowg5xlr-build-action-1542234833/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-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:03 +0000 UTC FinishedAt: 2026-07-29 07:47:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:03 +0000 UTC FinishedAt: 2026-07-29 07:47:52 +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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"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:*081ab1c3-3c77-4d79-8423-7d58ce35264e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*5eee0f43-319f-4836-95d7-263f0c493224,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-workflowg5xlr/series-workflowg5xlr-build-action-3503413976/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-workflowg5xlr/series-workflowg5xlr-build-action-1542234833/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:03 +0000 UTC FinishedAt: 2026-07-29 04:45:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:03 +0000 UTC FinishedAt: 2026-07-29 04:45:08 +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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"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-workflowg5xlr/series-workflowg5xlr-convert-artifact-1394700042/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:03 +0000 UTC FinishedAt: 2026-07-29 04:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:03 +0000 UTC FinishedAt: 2026-07-29 04:45:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:04 +0000 UTC FinishedAt: 2026-07-29 04:45:04 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:14 +0000 UTC FinishedAt: 2026-07-29 07:47:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg5xlr[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","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":["bpf_iter_workqueue_new","bpf_iter_workqueue_next","bpf_iter_workqueue_destroy","bpf_iter_worker_pool_new","bpf_iter_worker_pool_next","bpf_iter_worker_pool_destroy","workqueue_iter_seq_start","workqueue_iter_seq_next","workqueue_iter_seq_show","workqueue_iter_seq_stop","worker_pool_iter_seq_start","worker_pool_iter_seq_next","worker_pool_iter_seq_show","worker_pool_iter_seq_stop","wq_pending_fill","wq_pending_seq_start","wq_pending_seq_next","wq_pending_seq_show","wq_pending_seq_stop"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"87267b89459813cb50ab5377e076b639c07b4491","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL"],"series_id":"29c71d21-3b1c-4a5e-85f7-0b9b4d647850","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-07-29 04:45:14 +0000 UTC FinishedAt: 2026-07-29 07:47:41 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*081ab1c3-3c77-4d79-8423-7d58ce35264e,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*5eee0f43-319f-4836-95d7-263f0c493224,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-workflowg5xlr/series-workflowg5xlr-build-action-3503413976/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-workflowg5xlr/series-workflowg5xlr-build-action-1542234833/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-workflowg5xlr/series-workflowg5xlr-convert-artifact-1394700042/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,}